Proxy MD-SAL interfaces in DOMMountPointServiceImpl
[controller.git] / opendaylight / md-sal / sal-dom-compat / src / main / java / org / opendaylight / controller / sal / core / compat / DOMTransactionChainAdapter.java
1 /*
2  * Copyright (c) 2018 Pantheon Technologies, s.r.o. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.controller.sal.core.compat;
9
10 import static java.util.Objects.requireNonNull;
11
12 import com.google.common.cache.Cache;
13 import com.google.common.cache.CacheBuilder;
14 import com.google.common.collect.ForwardingObject;
15 import java.util.function.Function;
16 import org.opendaylight.controller.md.sal.common.api.data.AsyncTransaction;
17 import org.opendaylight.controller.md.sal.common.api.data.TransactionChain;
18 import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener;
19 import org.opendaylight.controller.md.sal.dom.api.DOMDataReadOnlyTransaction;
20 import org.opendaylight.controller.md.sal.dom.api.DOMDataReadWriteTransaction;
21 import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction;
22 import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain;
23 import org.opendaylight.mdsal.dom.api.DOMDataTreeReadTransaction;
24 import org.opendaylight.mdsal.dom.api.DOMDataTreeReadWriteTransaction;
25 import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction;
26
27 @Deprecated
28 public class DOMTransactionChainAdapter extends ForwardingObject
29         implements org.opendaylight.mdsal.dom.api.DOMTransactionChain, TransactionChainListener {
30     private final Cache<AsyncTransaction<?, ?>, org.opendaylight.mdsal.common.api.AsyncTransaction<?, ?>> transactions =
31             CacheBuilder.newBuilder().weakKeys().weakValues().build();
32
33     private final org.opendaylight.mdsal.common.api.TransactionChainListener listener;
34     private final DOMTransactionChain delegate;
35
36     public DOMTransactionChainAdapter(final org.opendaylight.mdsal.common.api.TransactionChainListener listener,
37             final Function<TransactionChainListener, DOMTransactionChain> function) {
38         this.listener = requireNonNull(listener);
39         this.delegate = function.apply(this);
40     }
41
42     @Override
43     public void close() {
44         delegate().close();
45         transactions.invalidateAll();
46     }
47
48     @Override
49     public DOMDataTreeReadTransaction newReadOnlyTransaction() {
50         final DOMDataReadOnlyTransaction tx = delegate.newReadOnlyTransaction();
51         return track(tx, new DOMDataTreeReadTransactionAdapter(tx) {
52             @Override
53             public void close() {
54                 untrack(delegate());
55                 super.close();
56             }
57         });
58     }
59
60     @Override
61     public DOMDataTreeWriteTransaction newWriteOnlyTransaction() {
62         final DOMDataWriteTransaction tx = delegate.newWriteOnlyTransaction();
63         return track(tx, new DOMDataTreeWriteTransactionAdapter(tx) {
64             @Override
65             public boolean cancel() {
66                 untrack(delegate());
67                 return super.cancel();
68             }
69         });
70     }
71
72     @Override
73     public DOMDataTreeReadWriteTransaction newReadWriteTransaction() {
74         final DOMDataReadWriteTransaction tx = delegate.newReadWriteTransaction();
75         return track(tx, new DOMDataTreeReadWriteTransactionAdapter(tx) {
76             @Override
77             public boolean cancel() {
78                 untrack(delegate());
79                 return super.cancel();
80             }
81
82             @Override
83             public void close() {
84                 untrack(delegate());
85                 super.close();
86             }
87         });
88     }
89
90     @Override
91     public void onTransactionChainFailed(final TransactionChain<?, ?> chain, final AsyncTransaction<?, ?> transaction,
92             final Throwable cause) {
93         listener.onTransactionChainFailed(this, null, cause);
94     }
95
96     @Override
97     public void onTransactionChainSuccessful(final TransactionChain<?, ?> chain) {
98         listener.onTransactionChainSuccessful(this);
99     }
100
101     @Override
102     protected DOMTransactionChain delegate() {
103         return delegate;
104     }
105
106     private <T extends org.opendaylight.mdsal.common.api.AsyncTransaction<?, ?>> T track(
107             final AsyncTransaction<?, ?> controllerTx, final T mdsalTx) {
108         transactions.put(controllerTx, mdsalTx);
109         return mdsalTx;
110     }
111
112     void untrack(final AsyncTransaction<?, ?> controllerTx) {
113         transactions.invalidate(controllerTx);
114     }
115 }