2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.controller.md.sal.binding.impl;
11 import java.util.WeakHashMap;
13 import javax.annotation.concurrent.GuardedBy;
15 import org.opendaylight.controller.md.sal.binding.api.BindingTransactionChain;
16 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
17 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
18 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
19 import org.opendaylight.controller.md.sal.common.api.data.AsyncTransaction;
20 import org.opendaylight.controller.md.sal.common.api.data.TransactionChain;
21 import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener;
22 import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
23 import org.opendaylight.controller.md.sal.dom.api.DOMDataReadOnlyTransaction;
24 import org.opendaylight.controller.md.sal.dom.api.DOMDataReadWriteTransaction;
25 import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction;
26 import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
27 import org.opendaylight.yangtools.concepts.Delegator;
29 import com.google.common.base.Preconditions;
31 class BindingTranslatedTransactionChain implements BindingTransactionChain, Delegator<DOMTransactionChain> {
33 private final DOMTransactionChain delegate;
36 private final Map<AsyncTransaction<?, ?>, AsyncTransaction<?, ?>> delegateTxToBindingTx = new WeakHashMap<>();
37 private final BindingToNormalizedNodeCodec codec;
39 public BindingTranslatedTransactionChain(final DOMDataBroker chainFactory,
40 final BindingToNormalizedNodeCodec codec, final TransactionChainListener listener) {
41 Preconditions.checkNotNull(chainFactory, "DOM Transaction chain factory must not be null");
42 this.delegate = chainFactory.createTransactionChain(new ListenerInvoker(listener));
47 public DOMTransactionChain getDelegate() {
52 public ReadOnlyTransaction newReadOnlyTransaction() {
53 DOMDataReadOnlyTransaction delegateTx = delegate.newReadOnlyTransaction();
54 ReadOnlyTransaction bindingTx = new BindingDataReadTransactionImpl(delegateTx, codec);
55 putDelegateToBinding(delegateTx, bindingTx);
60 public ReadWriteTransaction newReadWriteTransaction() {
61 DOMDataReadWriteTransaction delegateTx = delegate.newReadWriteTransaction();
62 ReadWriteTransaction bindingTx = new BindingDataReadWriteTransactionImpl(delegateTx, codec);
63 putDelegateToBinding(delegateTx, bindingTx);
68 public WriteTransaction newWriteOnlyTransaction() {
69 DOMDataWriteTransaction delegateTx = delegate.newWriteOnlyTransaction();
70 WriteTransaction bindingTx = new BindingDataWriteTransactionImpl<>(delegateTx, codec);
71 putDelegateToBinding(delegateTx, bindingTx);
80 private synchronized void putDelegateToBinding(final AsyncTransaction<?, ?> domTx,
81 final AsyncTransaction<?, ?> bindingTx) {
82 final Object previous = delegateTxToBindingTx.put(domTx, bindingTx);
83 Preconditions.checkState(previous == null, "DOM Transaction %s has already associated binding transation %s",domTx,previous);
86 private synchronized AsyncTransaction<?, ?> getBindingTransaction(final AsyncTransaction<?, ?> transaction) {
87 return delegateTxToBindingTx.get(transaction);
90 private final class ListenerInvoker implements TransactionChainListener {
92 private final TransactionChainListener listener;
94 public ListenerInvoker(final TransactionChainListener listener) {
95 this.listener = Preconditions.checkNotNull(listener, "Listener must not be null.");
99 public void onTransactionChainFailed(final TransactionChain<?, ?> chain,
100 final AsyncTransaction<?, ?> transaction, final Throwable cause) {
101 Preconditions.checkState(delegate.equals(chain),
102 "Illegal state - listener for %s was invoked for incorrect chain %s.", delegate, chain);
103 AsyncTransaction<?, ?> bindingTx = getBindingTransaction(transaction);
104 listener.onTransactionChainFailed(chain, bindingTx, cause);
108 public void onTransactionChainSuccessful(final TransactionChain<?, ?> chain) {
109 Preconditions.checkState(delegate.equals(chain),
110 "Illegal state - listener for %s was invoked for incorrect chain %s.", delegate, chain);
111 listener.onTransactionChainSuccessful(BindingTranslatedTransactionChain.this);