package org.opendaylight.restconf.nb.rfc8040.handlers;
import java.util.Objects;
+import java.util.Queue;
+import java.util.concurrent.ConcurrentLinkedQueue;
import javax.annotation.PreDestroy;
import javax.inject.Inject;
import javax.inject.Singleton;
public void onTransactionChainFailed(final DOMTransactionChain chain, final DOMDataTreeTransaction transaction,
final Throwable cause) {
LOG.warn("TransactionChain({}) {} FAILED!", chain, transaction.getIdentifier(), cause);
- reset();
+ transactionChainList.remove(chain);
throw new RestconfDocumentedException("TransactionChain(" + chain + ") not committed correctly", cause);
}
@Override
public void onTransactionChainSuccessful(final DOMTransactionChain chain) {
LOG.trace("TransactionChain({}) SUCCESSFUL", chain);
+ transactionChainList.remove(chain);
}
};
private final DOMDataBroker dataBroker;
-
- private volatile DOMTransactionChain transactionChain;
+ private final Queue<DOMTransactionChain> transactionChainList;
/**
* Prepare transaction chain service for Restconf services.
@Inject
public TransactionChainHandler(final DOMDataBroker dataBroker) {
this.dataBroker = Objects.requireNonNull(dataBroker);
- transactionChain = Objects.requireNonNull(dataBroker.createTransactionChain(transactionChainListener));
+ this.transactionChainList = new ConcurrentLinkedQueue<>();
}
+ /**
+ * Create and return new instance of object {@link DOMTransactionChain}.
+ * After use, is important to close transactionChain by method {@link DOMTransactionChain#close()}.
+ * @return new instance of object {@link DOMTransactionChain}
+ */
@Override
public DOMTransactionChain get() {
- return this.transactionChain;
- }
-
- public synchronized void reset() {
- LOG.trace("Resetting TransactionChain({})", transactionChain);
- transactionChain.close();
- transactionChain = dataBroker.createTransactionChain(transactionChainListener);
+ final DOMTransactionChain transactionChain = dataBroker.createTransactionChain(transactionChainListener);
+ this.transactionChainList.add(transactionChain);
+ LOG.trace("Started TransactionChain({})", transactionChain);
+ return transactionChain;
}
@Override
@PreDestroy
public synchronized void close() {
- transactionChain.close();
+ for (DOMTransactionChain transactionChain: this.transactionChainList) {
+ transactionChain.close();
+ LOG.trace("Closed TransactionChain({})", transactionChain);
+ }
+ }
+
+ /**
+ * Verify if {@link DOMTransactionChain} exist in {@link TransactionChainHandler} queue.
+ * @param transactionChain object to check.
+ * @return true if object still exist in {@link TransactionChainHandler}.
+ */
+ boolean verifyIfExistTransactionChain(DOMTransactionChain transactionChain) {
+ return this.transactionChainList.contains(transactionChain);
}
}