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