2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
3 * This program and the accompanying materials are made available under the
4 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
5 * and is available at http://www.eclipse.org/legal/epl-v10.html
7 package org.opendaylight.controller.md.sal.dom.broker.impl;
9 import java.util.concurrent.atomic.AtomicLong;
11 import javax.annotation.concurrent.GuardedBy;
13 import org.opendaylight.controller.md.sal.common.api.TransactionStatus;
14 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
15 import org.opendaylight.controller.md.sal.common.api.data.TransactionChain;
16 import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener;
17 import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction;
18 import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
19 import org.opendaylight.controller.sal.core.spi.data.DOMStoreThreePhaseCommitCohort;
20 import org.opendaylight.controller.sal.core.spi.data.DOMStoreTransactionChain;
21 import org.opendaylight.yangtools.yang.common.RpcResult;
22 import org.slf4j.Logger;
23 import org.slf4j.LoggerFactory;
25 import com.google.common.base.Optional;
26 import com.google.common.base.Preconditions;
27 import com.google.common.collect.ImmutableMap;
28 import com.google.common.util.concurrent.ListenableFuture;
31 * NormalizedNode implementation of {@link TransactionChain} which is backed
32 * by several {@link DOMStoreTransactionChain} differentiated by provided
33 * {@link LogicalDatastoreType} type.
36 public class DOMDataBrokerTransactionChainImpl extends AbstractDOMForwardedTransactionFactory<DOMStoreTransactionChain>
37 implements DOMTransactionChain, DOMDataCommitErrorListener {
39 private static final Logger LOG = LoggerFactory.getLogger(DOMDataBrokerTransactionChainImpl.class);
40 private final DOMDataCommitExecutor coordinator;
41 private final TransactionChainListener listener;
42 private final long chainId;
43 private final AtomicLong txNum = new AtomicLong();
45 private boolean failed = false;
50 * ID of transaction chain
52 * Backing {@link DOMStoreTransactionChain}s.
54 * Commit Coordinator which should be used to coordinate commits
56 * produced by this chain.
58 * Listener, which listens on transaction chain events.
59 * @throws NullPointerException
60 * If any of arguments is null.
62 public DOMDataBrokerTransactionChainImpl(final long chainId,
63 final ImmutableMap<LogicalDatastoreType, DOMStoreTransactionChain> chains,
64 final DOMDataCommitExecutor coordinator, final TransactionChainListener listener) {
66 this.chainId = chainId;
67 this.coordinator = Preconditions.checkNotNull(coordinator);
68 this.listener = Preconditions.checkNotNull(listener);
72 protected Object newTransactionIdentifier() {
73 return "DOM-CHAIN-" + chainId + "-" + txNum.getAndIncrement();
77 public synchronized ListenableFuture<RpcResult<TransactionStatus>> commit(
78 final DOMDataWriteTransaction transaction, final Iterable<DOMStoreThreePhaseCommitCohort> cohorts) {
79 return coordinator.submit(transaction, cohorts, Optional.<DOMDataCommitErrorListener> of(this));
83 public synchronized void close() {
85 for (DOMStoreTransactionChain subChain : getTxFactories().values()) {
90 LOG.debug("Transaction chain {} successfully finished.", this);
91 listener.onTransactionChainSuccessful(this);
96 public synchronized void onCommitFailed(final DOMDataWriteTransaction tx, final Throwable cause) {
98 LOG.debug("Transaction chain {} failed.", this, cause);
99 listener.onTransactionChainFailed(this, tx, cause);