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.TransactionChainListener;
16 import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction;
17 import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
18 import org.opendaylight.controller.sal.core.spi.data.DOMStoreThreePhaseCommitCohort;
19 import org.opendaylight.controller.sal.core.spi.data.DOMStoreTransactionChain;
20 import org.opendaylight.yangtools.yang.common.RpcResult;
21 import org.slf4j.Logger;
22 import org.slf4j.LoggerFactory;
24 import com.google.common.base.Optional;
25 import com.google.common.base.Preconditions;
26 import com.google.common.collect.ImmutableMap;
27 import com.google.common.util.concurrent.ListenableFuture;
30 * NormalizedNode implementation of {@link org.opendaylight.controller.md.sal.common.api.data.TransactionChain} which is backed
31 * by several {@link DOMStoreTransactionChain} differentiated by provided
32 * {@link org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType} type.
35 public class DOMDataBrokerTransactionChainImpl extends AbstractDOMForwardedTransactionFactory<DOMStoreTransactionChain>
36 implements DOMTransactionChain, DOMDataCommitErrorListener {
38 private static final Logger LOG = LoggerFactory.getLogger(DOMDataBrokerTransactionChainImpl.class);
39 private final DOMDataCommitExecutor coordinator;
40 private final TransactionChainListener listener;
41 private final long chainId;
42 private final AtomicLong txNum = new AtomicLong();
44 private boolean failed = false;
49 * ID of transaction chain
51 * Backing {@link DOMStoreTransactionChain}s.
53 * Commit Coordinator which should be used to coordinate commits
55 * produced by this chain.
57 * Listener, which listens on transaction chain events.
58 * @throws NullPointerException
59 * If any of arguments is null.
61 public DOMDataBrokerTransactionChainImpl(final long chainId,
62 final ImmutableMap<LogicalDatastoreType, DOMStoreTransactionChain> chains,
63 final DOMDataCommitExecutor coordinator, final TransactionChainListener listener) {
65 this.chainId = chainId;
66 this.coordinator = Preconditions.checkNotNull(coordinator);
67 this.listener = Preconditions.checkNotNull(listener);
71 protected Object newTransactionIdentifier() {
72 return "DOM-CHAIN-" + chainId + "-" + txNum.getAndIncrement();
76 public synchronized ListenableFuture<RpcResult<TransactionStatus>> commit(
77 final DOMDataWriteTransaction transaction, final Iterable<DOMStoreThreePhaseCommitCohort> cohorts) {
78 return coordinator.submit(transaction, cohorts, Optional.<DOMDataCommitErrorListener> of(this));
82 public synchronized void close() {
84 for (DOMStoreTransactionChain subChain : getTxFactories().values()) {
89 LOG.debug("Transaction chain {} successfully finished.", this);
90 listener.onTransactionChainSuccessful(this);
95 public synchronized void onCommitFailed(final DOMDataWriteTransaction tx, final Throwable cause) {
97 LOG.debug("Transaction chain {} failed.", this, cause);
98 listener.onTransactionChainFailed(this, tx, cause);