Bump mdsal to 4.0.0
[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.DOMDataTreeTransaction;
26 import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction;
27 import org.opendaylight.mdsal.dom.api.DOMTransactionChainListener;
28
29 @Deprecated
30 public class DOMTransactionChainAdapter extends ForwardingObject
31         implements org.opendaylight.mdsal.dom.api.DOMTransactionChain, TransactionChainListener {
32     private final Cache<AsyncTransaction<?, ?>, DOMDataTreeTransaction> transactions = CacheBuilder.newBuilder()
33             .weakKeys().weakValues().build();
34
35     private final DOMTransactionChainListener listener;
36     private final DOMTransactionChain delegate;
37
38     public DOMTransactionChainAdapter(final DOMTransactionChainListener listener,
39             final Function<TransactionChainListener, DOMTransactionChain> function) {
40         this.listener = requireNonNull(listener);
41         this.delegate = function.apply(this);
42     }
43
44     @Override
45     public void close() {
46         delegate().close();
47         transactions.invalidateAll();
48     }
49
50     @Override
51     public DOMDataTreeReadTransaction newReadOnlyTransaction() {
52         final DOMDataReadOnlyTransaction tx = delegate.newReadOnlyTransaction();
53         return track(tx, new DOMDataTreeReadTransactionAdapter(tx) {
54             @Override
55             public void close() {
56                 untrack(delegate());
57                 super.close();
58             }
59         });
60     }
61
62     @Override
63     public DOMDataTreeWriteTransaction newWriteOnlyTransaction() {
64         final DOMDataWriteTransaction tx = delegate.newWriteOnlyTransaction();
65         return track(tx, new DOMDataTreeWriteTransactionAdapter(tx) {
66             @Override
67             public boolean cancel() {
68                 untrack(delegate());
69                 return super.cancel();
70             }
71         });
72     }
73
74     @Override
75     public DOMDataTreeReadWriteTransaction newReadWriteTransaction() {
76         final DOMDataReadWriteTransaction tx = delegate.newReadWriteTransaction();
77         return track(tx, new DOMDataTreeReadWriteTransactionAdapter(tx) {
78             @Override
79             public boolean cancel() {
80                 untrack(delegate());
81                 return super.cancel();
82             }
83         });
84     }
85
86     @Override
87     public void onTransactionChainFailed(final TransactionChain<?, ?> chain, final AsyncTransaction<?, ?> transaction,
88             final Throwable cause) {
89         listener.onTransactionChainFailed(this, null, cause);
90     }
91
92     @Override
93     public void onTransactionChainSuccessful(final TransactionChain<?, ?> chain) {
94         listener.onTransactionChainSuccessful(this);
95     }
96
97     @Override
98     protected DOMTransactionChain delegate() {
99         return delegate;
100     }
101
102     private <T extends DOMDataTreeTransaction> T track(final AsyncTransaction<?, ?> controllerTx, final T mdsalTx) {
103         transactions.put(controllerTx, mdsalTx);
104         return mdsalTx;
105     }
106
107     void untrack(final AsyncTransaction<?, ?> controllerTx) {
108         transactions.invalidate(controllerTx);
109     }
110 }