Deprecate old MD-SAL APIs for removal
[controller.git] / opendaylight / md-sal / sal-dom-broker / src / main / java / org / opendaylight / controller / md / sal / dom / broker / impl / mount / DOMMountPointServiceImpl.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.mount;
9
10 import static java.util.Objects.requireNonNull;
11
12 import com.google.common.annotations.VisibleForTesting;
13 import com.google.common.base.Optional;
14 import com.google.common.base.Preconditions;
15 import com.google.common.collect.ClassToInstanceMap;
16 import com.google.common.collect.ImmutableMap;
17 import com.google.common.collect.MutableClassToInstanceMap;
18 import java.util.Map;
19 import java.util.Map.Entry;
20 import org.opendaylight.controller.md.sal.dom.api.DOMActionService;
21 import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
22 import org.opendaylight.controller.md.sal.dom.api.DOMMountPoint;
23 import org.opendaylight.controller.md.sal.dom.api.DOMMountPointService;
24 import org.opendaylight.controller.md.sal.dom.api.DOMNotificationService;
25 import org.opendaylight.controller.md.sal.dom.api.DOMRpcService;
26 import org.opendaylight.controller.md.sal.dom.api.DOMService;
27 import org.opendaylight.controller.md.sal.dom.broker.spi.mount.SimpleDOMMountPoint;
28 import org.opendaylight.controller.sal.core.compat.DOMDataBrokerAdapter;
29 import org.opendaylight.controller.sal.core.compat.DOMMountPointAdapter;
30 import org.opendaylight.controller.sal.core.compat.DOMNotificationServiceAdapter;
31 import org.opendaylight.controller.sal.core.compat.DOMRpcServiceAdapter;
32 import org.opendaylight.mdsal.dom.api.DOMMountPointListener;
33 import org.opendaylight.yangtools.concepts.AbstractObjectRegistration;
34 import org.opendaylight.yangtools.concepts.ListenerRegistration;
35 import org.opendaylight.yangtools.concepts.ObjectRegistration;
36 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
37 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
38
39 @Deprecated(forRemoval = true)
40 public class DOMMountPointServiceImpl implements DOMMountPointService {
41     @Deprecated
42     private abstract static class CompatFactory<M extends org.opendaylight.mdsal.dom.api.DOMService,
43             C extends DOMService> {
44         private final Class<C> controllerClass;
45         private final Class<M> mdsalClass;
46
47         CompatFactory(final Class<C> controllerClass, final Class<M> mdsalClass) {
48             this.controllerClass = requireNonNull(controllerClass);
49             this.mdsalClass = requireNonNull(mdsalClass);
50         }
51
52         final void addService(final org.opendaylight.mdsal.dom.api.DOMMountPointService.DOMMountPointBuilder builder,
53                 final ClassToInstanceMap<DOMService> services) {
54             if (!services.containsKey(mdsalClass)) {
55                 final C controllerService = services.getInstance(controllerClass);
56                 if (controllerService != null) {
57                     final M mdsalService = createService(controllerService);
58                     if (mdsalService != null) {
59                         builder.addService(mdsalClass, mdsalService);
60                     }
61                 }
62             }
63         }
64
65         abstract M createService(C delegate);
66     }
67
68     private static final Map<Class<? extends DOMService>, CompatFactory<?, ?>> KNOWN_SERVICES = ImmutableMap.of(
69         DOMActionService.class, new CompatFactory<org.opendaylight.mdsal.dom.api.DOMActionService, DOMActionService>(
70                 DOMActionService.class, org.opendaylight.mdsal.dom.api.DOMActionService.class) {
71             @Override
72             org.opendaylight.mdsal.dom.api.DOMActionService createService(final DOMActionService delegate) {
73                 return delegate;
74             }
75         },
76         DOMDataBroker.class, new CompatFactory<org.opendaylight.mdsal.dom.api.DOMDataBroker, DOMDataBroker>(
77                 DOMDataBroker.class, org.opendaylight.mdsal.dom.api.DOMDataBroker.class) {
78             @Override
79             org.opendaylight.mdsal.dom.api.DOMDataBroker createService(final DOMDataBroker delegate) {
80                 return new DOMDataBrokerAdapter(delegate);
81             }
82         },
83         DOMNotificationService.class, new CompatFactory<org.opendaylight.mdsal.dom.api.DOMNotificationService,
84                 DOMNotificationService>(DOMNotificationService.class,
85                         org.opendaylight.mdsal.dom.api.DOMNotificationService.class) {
86             @Override
87             org.opendaylight.mdsal.dom.api.DOMNotificationService createService(final DOMNotificationService delegate) {
88                 return new DOMNotificationServiceAdapter(delegate);
89             }
90         },
91         DOMRpcService.class, new CompatFactory<org.opendaylight.mdsal.dom.api.DOMRpcService, DOMRpcService>(
92                 DOMRpcService.class, org.opendaylight.mdsal.dom.api.DOMRpcService.class) {
93             @Override
94             org.opendaylight.mdsal.dom.api.DOMRpcService createService(final DOMRpcService delegate) {
95                 return new DOMRpcServiceAdapter(delegate);
96             }
97         });
98
99     private final org.opendaylight.mdsal.dom.api.DOMMountPointService delegate;
100
101     @VisibleForTesting
102     public DOMMountPointServiceImpl() {
103         this(new org.opendaylight.mdsal.dom.broker.DOMMountPointServiceImpl());
104     }
105
106     public DOMMountPointServiceImpl(final org.opendaylight.mdsal.dom.api.DOMMountPointService delegate) {
107         this.delegate = delegate;
108     }
109
110     @Override
111     public Optional<DOMMountPoint> getMountPoint(final YangInstanceIdentifier path) {
112         return Optional.fromJavaUtil(delegate.getMountPoint(path).map(DOMMountPointAdapter::new));
113     }
114
115     @Override
116     public DOMMountPointBuilder createMountPoint(final YangInstanceIdentifier path) {
117         return new DOMMountPointBuilderImpl(path);
118     }
119
120     @Override
121     public ListenerRegistration<DOMMountPointListener> registerProvisionListener(final DOMMountPointListener listener) {
122         return delegate.registerProvisionListener(listener);
123     }
124
125     @SuppressWarnings("unchecked")
126     ObjectRegistration<DOMMountPoint> registerMountPoint(final SimpleDOMMountPoint mountPoint) {
127         final org.opendaylight.mdsal.dom.api.DOMMountPointService.DOMMountPointBuilder delegateBuilder =
128                 delegate.createMountPoint(mountPoint.getIdentifier());
129
130         if (mountPoint.getSchemaContext() != null) {
131             delegateBuilder.addInitialSchemaContext(mountPoint.getSchemaContext());
132         }
133
134         final ClassToInstanceMap<DOMService> myServices = mountPoint.getServices();
135         for (Entry<Class<? extends DOMService>, DOMService> entry : myServices.entrySet()) {
136             delegateBuilder.addService((Class<DOMService>)entry.getKey(), entry.getValue());
137
138             final CompatFactory<?, ?> compat = KNOWN_SERVICES.get(entry.getKey());
139             if (compat != null) {
140                 compat.addService(delegateBuilder, myServices);
141             }
142         }
143
144         final ObjectRegistration<org.opendaylight.mdsal.dom.api.DOMMountPoint> delegateReg = delegateBuilder.register();
145         return new AbstractObjectRegistration<DOMMountPoint>(mountPoint) {
146             @Override
147             protected void removeRegistration() {
148                 delegateReg.close();
149             }
150         };
151     }
152
153     public class DOMMountPointBuilderImpl implements DOMMountPointBuilder {
154         private final ClassToInstanceMap<DOMService> services = MutableClassToInstanceMap.create();
155         private final YangInstanceIdentifier path;
156         private SimpleDOMMountPoint mountPoint;
157         private SchemaContext schemaContext;
158
159         public DOMMountPointBuilderImpl(final YangInstanceIdentifier path) {
160             this.path = path;
161         }
162
163         @Override
164         public <T extends DOMService> DOMMountPointBuilder addService(final Class<T> type, final T impl) {
165             services.putInstance(type, impl);
166             return this;
167         }
168
169         @Override
170         public DOMMountPointBuilder addInitialSchemaContext(final SchemaContext ctx) {
171             schemaContext = ctx;
172             return this;
173         }
174
175         @Override
176         public ObjectRegistration<DOMMountPoint> register() {
177             Preconditions.checkState(mountPoint == null, "Mount point is already built.");
178             mountPoint = SimpleDOMMountPoint.create(path, services, schemaContext);
179             return registerMountPoint(mountPoint);
180         }
181     }
182 }