Migrate OSGI compendium reference
[controller.git] / opendaylight / md-sal / sal-dom-compat / src / main / java / org / opendaylight / controller / sal / core / compat / DOMMountPointAdapter.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.base.Optional;
13 import com.google.common.collect.ForwardingObject;
14 import com.google.common.collect.ImmutableMap;
15 import java.util.Map;
16 import org.eclipse.jdt.annotation.Nullable;
17 import org.gaul.modernizer_maven_annotations.SuppressModernizer;
18 import org.opendaylight.controller.md.sal.dom.api.DOMActionService;
19 import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
20 import org.opendaylight.controller.md.sal.dom.api.DOMMountPoint;
21 import org.opendaylight.controller.md.sal.dom.api.DOMNotificationService;
22 import org.opendaylight.controller.md.sal.dom.api.DOMRpcService;
23 import org.opendaylight.controller.md.sal.dom.api.DOMService;
24 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
25 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
26
27 /**
28  * Adapter providing Controller DOMMountPoint implementation based on an MD-SAL DOMMountPoint delegate. Services are
29  * looked up in the delegate first. If a lookup is unsuccessful, this class attempts to transparently proxy well-known
30  * Controller DOMServices on top of their MD-SAL counterparts available from delegate.
31  */
32 @Deprecated(forRemoval = true)
33 public class DOMMountPointAdapter extends ForwardingObject implements DOMMountPoint {
34     private abstract static class CompatFactory<M extends org.opendaylight.mdsal.dom.api.DOMService,
35             C extends DOMService> {
36         private final Class<M> mdsalClass;
37
38         CompatFactory(final Class<M> mdsalClass) {
39             this.mdsalClass = requireNonNull(mdsalClass);
40         }
41
42         final @Nullable C createService(final org.opendaylight.mdsal.dom.api.DOMMountPoint mountPoint) {
43             return mountPoint.getService(mdsalClass).map(this::createService).orElse(null);
44         }
45
46         abstract C createService(M delegate);
47     }
48
49     private static final Map<Class<? extends DOMService>, CompatFactory<?, ?>> KNOWN_SERVICES = ImmutableMap.of(
50         DOMActionService.class, new CompatFactory<org.opendaylight.mdsal.dom.api.DOMActionService, DOMActionService>(
51                 org.opendaylight.mdsal.dom.api.DOMActionService.class) {
52             @Override
53             DOMActionService createService(final org.opendaylight.mdsal.dom.api.DOMActionService delegate) {
54                 return new LegacyDOMActionServiceAdapter(delegate);
55             }
56         },
57         DOMDataBroker.class, new CompatFactory<org.opendaylight.mdsal.dom.api.DOMDataBroker, DOMDataBroker>(
58                 org.opendaylight.mdsal.dom.api.DOMDataBroker.class) {
59             @Override
60             DOMDataBroker createService(final org.opendaylight.mdsal.dom.api.DOMDataBroker delegate) {
61                 return new LegacyDOMDataBrokerAdapter(delegate);
62             }
63         },
64         DOMNotificationService.class, new CompatFactory<org.opendaylight.mdsal.dom.api.DOMNotificationService,
65                 DOMNotificationService>(org.opendaylight.mdsal.dom.api.DOMNotificationService.class) {
66             @Override
67             DOMNotificationService createService(final org.opendaylight.mdsal.dom.api.DOMNotificationService delegate) {
68                 return new LegacyDOMNotificationServiceAdapter(delegate);
69             }
70         },
71         DOMRpcService.class, new CompatFactory<org.opendaylight.mdsal.dom.api.DOMRpcService, DOMRpcService>(
72                 org.opendaylight.mdsal.dom.api.DOMRpcService.class) {
73             @Override
74             DOMRpcService createService(final org.opendaylight.mdsal.dom.api.DOMRpcService delegate) {
75                 return new LegacyDOMRpcServiceAdapter(delegate);
76             }
77         });
78
79     private final org.opendaylight.mdsal.dom.api.DOMMountPoint delegate;
80
81     public DOMMountPointAdapter(final org.opendaylight.mdsal.dom.api.DOMMountPoint delegate) {
82         this.delegate = requireNonNull(delegate);
83     }
84
85     @Override
86     public YangInstanceIdentifier getIdentifier() {
87         return delegate().getIdentifier();
88     }
89
90     @Override
91     @SuppressModernizer
92     public <T extends DOMService> Optional<T> getService(final Class<T> cls) {
93         final java.util.Optional<T> found = delegate.getService(cls);
94         if (found.isPresent()) {
95             return Optional.of(found.get());
96         }
97
98         final CompatFactory<?, ?> compat = KNOWN_SERVICES.get(cls);
99         return Optional.fromNullable(cls.cast(compat == null ? null : compat.createService(delegate)));
100     }
101
102     @Override
103     public SchemaContext getSchemaContext() {
104         return delegate().getSchemaContext();
105     }
106
107     @Override
108     public int hashCode() {
109         return getIdentifier().hashCode();
110     }
111
112     @Override
113     public boolean equals(final Object obj) {
114         if (this == obj) {
115             return true;
116         }
117
118         if (!(obj instanceof DOMMountPoint)) {
119             return false;
120         }
121
122         DOMMountPoint other = (DOMMountPoint) obj;
123         return getIdentifier().equals(other.getIdentifier());
124     }
125
126     @Override
127     protected org.opendaylight.mdsal.dom.api.DOMMountPoint delegate() {
128         return delegate;
129     }
130 }