Search in sources :

Example 1 with TransactionProcessor

use of io.nuls.kernel.processor.TransactionProcessor in project nuls by nuls-io.

the class TransactionServiceImpl method rollbackCommit.

@Override
public Result rollbackCommit(Transaction tx, Object secondaryData) {
    if (null == tx) {
        return Result.getSuccess();
    }
    List<TransactionProcessor> processorList = TransactionManager.getProcessorList(tx.getClass());
    List<TransactionProcessor> rollbackedList = new ArrayList<>();
    for (TransactionProcessor processor : processorList) {
        Result result = processor.onRollback(tx, secondaryData);
        if (result.isSuccess()) {
            rollbackedList.add(processor);
        } else {
            for (int i = rollbackedList.size() - 1; i >= 0; i--) {
                TransactionProcessor processor1 = rollbackedList.get(i);
                processor1.onCommit(tx, secondaryData);
            }
            return result;
        }
    }
    return Result.getSuccess();
}
Also used : TransactionProcessor(io.nuls.kernel.processor.TransactionProcessor) ArrayList(java.util.ArrayList) ValidateResult(io.nuls.kernel.validate.ValidateResult) Result(io.nuls.kernel.model.Result)

Example 2 with TransactionProcessor

use of io.nuls.kernel.processor.TransactionProcessor in project nuls by nuls-io.

the class TransactionManager method getProcessorList.

public static List<TransactionProcessor> getProcessorList(Class<? extends Transaction> txClass) {
    List<TransactionProcessor> list = new ArrayList<>();
    Class clazz = txClass;
    while (!clazz.equals(Transaction.class)) {
        TransactionProcessor txService = TransactionManager.getProcessor(clazz);
        if (null != txService) {
            list.add(0, txService);
        }
        clazz = clazz.getSuperclass();
    }
    return list;
}
Also used : Transaction(io.nuls.kernel.model.Transaction) TransactionProcessor(io.nuls.kernel.processor.TransactionProcessor) ArrayList(java.util.ArrayList)

Example 3 with TransactionProcessor

use of io.nuls.kernel.processor.TransactionProcessor in project nuls by nuls-io.

the class TransactionServiceImpl method commitTx.

/**
 * 确认交易时调用的方法,对交易相关的业务进行提交操作
 * Identify the method that is invoked during the transaction and submit the transaction related business.
 *
 * @param tx            操作的交易/The transaction of the operation
 * @param secondaryData 辅助数据(可以为空)/Secondary data (available for null)
 * @return 操作结果/operating results
 */
@Override
public Result commitTx(Transaction tx, Object secondaryData) {
    List<TransactionProcessor> processorList = TransactionManager.getProcessorList(tx.getClass());
    List<TransactionProcessor> commitedProcessorList = new ArrayList<>();
    for (TransactionProcessor processor : processorList) {
        Result result = processor.onCommit(tx, secondaryData);
        if (result.isSuccess()) {
            commitedProcessorList.add(processor);
        } else {
            for (int i = commitedProcessorList.size() - 1; i >= 0; i--) {
                TransactionProcessor processor1 = commitedProcessorList.get(i);
                processor1.onRollback(tx, secondaryData);
            }
            return result;
        }
    }
    return Result.getSuccess();
}
Also used : TransactionProcessor(io.nuls.kernel.processor.TransactionProcessor) ArrayList(java.util.ArrayList) ValidateResult(io.nuls.kernel.validate.ValidateResult) Result(io.nuls.kernel.model.Result)

Example 4 with TransactionProcessor

use of io.nuls.kernel.processor.TransactionProcessor in project nuls by nuls-io.

the class TransactionServiceImpl method rollbackTx.

/**
 * 回滚交易时调用的方法,对交易相关的业务进行回退操作
 * The method invoked when the transaction is rolled back and the transaction related business is returned.
 *
 * @param tx            操作的交易/The transaction of the operation
 * @param secondaryData 辅助数据(可以为空)/Secondary data (available for null)
 * @return 操作结果/operating results
 */
@Override
public Result rollbackTx(Transaction tx, Object secondaryData) {
    if (null == tx) {
        return Result.getSuccess();
    }
    List<TransactionProcessor> processorList = TransactionManager.getProcessorList(tx.getClass());
    List<TransactionProcessor> rollbackedList = new ArrayList<>();
    for (TransactionProcessor processor : processorList) {
        Result result = processor.onRollback(tx, secondaryData);
        if (result.isSuccess()) {
            rollbackedList.add(processor);
        } else {
            for (int i = rollbackedList.size() - 1; i >= 0; i--) {
                TransactionProcessor processor1 = rollbackedList.get(i);
                processor1.onCommit(tx, secondaryData);
            }
            return result;
        }
    }
    try {
        ledgerService.rollbackTx(tx);
    } catch (NulsException e) {
        Log.error(e);
        return Result.getFailed(e.getErrorCode());
    }
    return Result.getSuccess();
}
Also used : TransactionProcessor(io.nuls.kernel.processor.TransactionProcessor) NulsException(io.nuls.kernel.exception.NulsException) ArrayList(java.util.ArrayList) ValidateResult(io.nuls.kernel.validate.ValidateResult) Result(io.nuls.kernel.model.Result)

Example 5 with TransactionProcessor

use of io.nuls.kernel.processor.TransactionProcessor in project nuls by nuls-io.

the class TransactionServiceImpl method conflictDetect.

/**
 * 冲突检测,检测如果传入的交易列表中有相冲突的交易,则返回失败,写明失败原因及所有的应该舍弃的交易列表
 * <p>
 * Conflict detection, which detects conflicting transactions in the incoming transaction list, returns failure,
 * indicating the cause of failure and all the list of trades that should be discarded.
 *
 * @param txList 需要检查的交易列表/A list of transactions to be checked.
 * @return 操作结果:成功则返回successResult,失败时,data中返回丢弃列表,msg中返回冲突原因
 * Operation result: success returns successResult. When failure, data returns the discard list, and MSG returns the cause of conflict.
 */
@Override
public ValidateResult conflictDetect(List<Transaction> txList) {
    if (null == txList || txList.isEmpty()) {
        return ValidateResult.getSuccessResult();
    }
    // ValidateResult result = ledgerService.verifyDoubleSpend(txList);
    // if (result.isFailed()) {
    // return result;
    // }
    List<Transaction> newTxList = new ArrayList<>();
    for (Transaction tx : txList) {
        if (tx.getType() == ProtocolConstant.TX_TYPE_COINBASE || tx.getType() == ProtocolConstant.TX_TYPE_TRANSFER) {
            continue;
        }
        newTxList.add(tx);
    }
    List<TransactionProcessor> processorList = TransactionManager.getAllProcessorList();
    ValidateResult result = ValidateResult.getSuccessResult();
    for (TransactionProcessor processor : processorList) {
        result = processor.conflictDetect(newTxList);
        if (result.isFailed()) {
            break;
        }
    }
    return result;
}
Also used : Transaction(io.nuls.kernel.model.Transaction) TransactionProcessor(io.nuls.kernel.processor.TransactionProcessor) ValidateResult(io.nuls.kernel.validate.ValidateResult) ArrayList(java.util.ArrayList)

Aggregations

TransactionProcessor (io.nuls.kernel.processor.TransactionProcessor)5 ArrayList (java.util.ArrayList)5 ValidateResult (io.nuls.kernel.validate.ValidateResult)4 Result (io.nuls.kernel.model.Result)3 Transaction (io.nuls.kernel.model.Transaction)2 NulsException (io.nuls.kernel.exception.NulsException)1