BUG 2854 : Do not add empty read write transactions to the replicable journal
[controller.git] / opendaylight / md-sal / sal-dom-broker / src / main / java / org / opendaylight / controller / md / sal / dom / broker / impl / compat / BackwardsCompatibleDataBroker.java
1 /*
2  * Copyright (c) 2014 Cisco Systems, Inc. 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.md.sal.dom.broker.impl.compat;
9
10 import javax.annotation.concurrent.ThreadSafe;
11 import org.opendaylight.controller.md.sal.common.api.RegistrationListener;
12 import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler;
13 import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandlerRegistration;
14 import org.opendaylight.controller.md.sal.common.api.data.DataReader;
15 import org.opendaylight.controller.md.sal.common.impl.util.compat.DataNormalizer;
16 import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
17 import org.opendaylight.controller.sal.common.DataStoreIdentifier;
18 import org.opendaylight.controller.sal.core.api.data.DataChangeListener;
19 import org.opendaylight.controller.sal.core.api.data.DataModificationTransaction;
20 import org.opendaylight.controller.sal.core.api.data.DataProviderService;
21 import org.opendaylight.controller.sal.core.api.data.DataValidator;
22 import org.opendaylight.controller.sal.core.api.model.SchemaService;
23 import org.opendaylight.yangtools.concepts.AbstractObjectRegistration;
24 import org.opendaylight.yangtools.concepts.ListenerRegistration;
25 import org.opendaylight.yangtools.concepts.Registration;
26 import org.opendaylight.yangtools.yang.data.api.CompositeNode;
27 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
28 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
29 import org.opendaylight.yangtools.yang.model.api.SchemaContextListener;
30
31 @Deprecated
32 @ThreadSafe
33 public class BackwardsCompatibleDataBroker implements DataProviderService {
34
35     private final DOMDataBroker backingBroker;
36     private volatile DataNormalizer normalizer;
37     private final ListenerRegistration<SchemaContextListener> schemaReg;
38
39     public BackwardsCompatibleDataBroker(final DOMDataBroker newBiDataImpl, final SchemaService schemaService) {
40         backingBroker = newBiDataImpl;
41         schemaReg = schemaService.registerSchemaContextListener(new SchemaListener());
42     }
43
44     @Override
45     public CompositeNode readConfigurationData(final YangInstanceIdentifier legacyPath) {
46         final BackwardsCompatibleTransaction<?> tx = BackwardsCompatibleTransaction.readOnlyTransaction(backingBroker.newReadOnlyTransaction(),normalizer);
47         try {
48             return tx.readConfigurationData(legacyPath);
49         } finally {
50             tx.commit();
51         }
52     }
53
54     @Override
55     public CompositeNode readOperationalData(final YangInstanceIdentifier legacyPath) {
56         final BackwardsCompatibleTransaction<?> tx = BackwardsCompatibleTransaction.readOnlyTransaction(backingBroker.newReadOnlyTransaction(),normalizer);
57         try {
58             return tx.readOperationalData(legacyPath);
59         } finally {
60             tx.commit();
61         }
62     }
63
64     @Override
65     public DataModificationTransaction beginTransaction() {
66         return BackwardsCompatibleTransaction.readWriteTransaction(backingBroker.newReadWriteTransaction(), normalizer);
67     }
68
69     @Override
70     public ListenerRegistration<DataChangeListener> registerDataChangeListener(final YangInstanceIdentifier legacyPath,
71             final DataChangeListener listener) {
72         final YangInstanceIdentifier normalizedPath = normalizer.toNormalized(legacyPath);
73
74         final TranslatingListenerInvoker translatingCfgListener =
75                 TranslatingListenerInvoker.createConfig(listener, normalizer);
76         translatingCfgListener.register(backingBroker, normalizedPath);
77
78         final TranslatingListenerInvoker translatingOpListener =
79                 TranslatingListenerInvoker.createOperational(listener, normalizer);
80         translatingOpListener.register(backingBroker, normalizedPath);
81
82         return new DelegateListenerRegistration(translatingCfgListener, translatingOpListener, listener);
83     }
84
85     @Override
86     public Registration registerCommitHandler(
87             final YangInstanceIdentifier path, final DataCommitHandler<YangInstanceIdentifier, CompositeNode> commitHandler) {
88         // FIXME Do real forwarding
89         return new AbstractObjectRegistration<DataCommitHandler<YangInstanceIdentifier,CompositeNode>>(commitHandler) {
90             @Override
91             protected void removeRegistration() {
92                 // NOOP
93             }
94         };
95     }
96
97     @Override
98     public ListenerRegistration<RegistrationListener<DataCommitHandlerRegistration<YangInstanceIdentifier, CompositeNode>>> registerCommitHandlerListener(
99             final RegistrationListener<DataCommitHandlerRegistration<YangInstanceIdentifier, CompositeNode>> commitHandlerListener) {
100         return null;
101     }
102
103     // Obsolete functionality
104
105     @Override
106     public void addValidator(final DataStoreIdentifier store, final DataValidator validator) {
107         throw new UnsupportedOperationException();
108     }
109
110     @Override
111     public void removeValidator(final DataStoreIdentifier store, final DataValidator validator) {
112         throw new UnsupportedOperationException();
113     }
114
115     @Override
116     public void addRefresher(final DataStoreIdentifier store, final DataRefresher refresher) {
117         throw new UnsupportedOperationException();
118     }
119
120     @Override
121     public void removeRefresher(final DataStoreIdentifier store, final DataRefresher refresher) {
122         throw new UnsupportedOperationException();
123     }
124
125     @Override
126     public Registration registerConfigurationReader(
127             final YangInstanceIdentifier path, final DataReader<YangInstanceIdentifier, CompositeNode> reader) {
128         throw new UnsupportedOperationException("Data Reader contract is not supported.");
129     }
130
131     @Override
132     public Registration registerOperationalReader(
133             final YangInstanceIdentifier path, final DataReader<YangInstanceIdentifier, CompositeNode> reader) {
134         throw new UnsupportedOperationException("Data Reader contract is not supported.");
135     }
136
137     private static class DelegateListenerRegistration implements ListenerRegistration<DataChangeListener> {
138         private final TranslatingListenerInvoker translatingCfgListener;
139         private final TranslatingListenerInvoker translatingOpListener;
140         private final DataChangeListener listener;
141
142         public DelegateListenerRegistration(final TranslatingListenerInvoker translatingCfgListener, final TranslatingListenerInvoker translatingOpListener, final DataChangeListener listener) {
143             this.translatingCfgListener = translatingCfgListener;
144             this.translatingOpListener = translatingOpListener;
145             this.listener = listener;
146         }
147
148         @Override
149         public void close() {
150             translatingCfgListener.close();
151             translatingOpListener.close();
152         }
153
154         @Override
155         public DataChangeListener getInstance() {
156             return listener;
157         }
158     }
159
160     private class SchemaListener implements SchemaContextListener {
161
162         @Override
163         public void onGlobalContextUpdated(final SchemaContext ctx) {
164             normalizer = new DataNormalizer(ctx);
165         }
166
167     }
168 }