2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.controller.md.sal.dom.broker.impl.mount;
10 import static java.util.Objects.requireNonNull;
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;
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;
40 public class DOMMountPointServiceImpl implements DOMMountPointService {
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;
47 CompatFactory(final Class<C> controllerClass, final Class<M> mdsalClass) {
48 this.controllerClass = requireNonNull(controllerClass);
49 this.mdsalClass = requireNonNull(mdsalClass);
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);
65 abstract M createService(C delegate);
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) {
72 org.opendaylight.mdsal.dom.api.DOMActionService createService(final DOMActionService delegate) {
76 DOMDataBroker.class, new CompatFactory<org.opendaylight.mdsal.dom.api.DOMDataBroker, DOMDataBroker>(
77 DOMDataBroker.class, org.opendaylight.mdsal.dom.api.DOMDataBroker.class) {
79 org.opendaylight.mdsal.dom.api.DOMDataBroker createService(final DOMDataBroker delegate) {
80 return new DOMDataBrokerAdapter(delegate);
83 DOMNotificationService.class, new CompatFactory<org.opendaylight.mdsal.dom.api.DOMNotificationService,
84 DOMNotificationService>(DOMNotificationService.class,
85 org.opendaylight.mdsal.dom.api.DOMNotificationService.class) {
87 org.opendaylight.mdsal.dom.api.DOMNotificationService createService(final DOMNotificationService delegate) {
88 return new DOMNotificationServiceAdapter(delegate);
91 DOMRpcService.class, new CompatFactory<org.opendaylight.mdsal.dom.api.DOMRpcService, DOMRpcService>(
92 DOMRpcService.class, org.opendaylight.mdsal.dom.api.DOMRpcService.class) {
94 org.opendaylight.mdsal.dom.api.DOMRpcService createService(final DOMRpcService delegate) {
95 return new DOMRpcServiceAdapter(delegate);
99 private final org.opendaylight.mdsal.dom.api.DOMMountPointService delegate;
102 public DOMMountPointServiceImpl() {
103 this(new org.opendaylight.mdsal.dom.broker.DOMMountPointServiceImpl());
106 public DOMMountPointServiceImpl(final org.opendaylight.mdsal.dom.api.DOMMountPointService delegate) {
107 this.delegate = delegate;
111 public Optional<DOMMountPoint> getMountPoint(final YangInstanceIdentifier path) {
112 return Optional.fromJavaUtil(delegate.getMountPoint(path).map(DOMMountPointAdapter::new));
116 public DOMMountPointBuilder createMountPoint(final YangInstanceIdentifier path) {
117 return new DOMMountPointBuilderImpl(path);
121 public ListenerRegistration<DOMMountPointListener> registerProvisionListener(final DOMMountPointListener listener) {
122 return delegate.registerProvisionListener(listener);
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());
130 if (mountPoint.getSchemaContext() != null) {
131 delegateBuilder.addInitialSchemaContext(mountPoint.getSchemaContext());
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());
138 final CompatFactory<?, ?> compat = KNOWN_SERVICES.get(entry.getKey());
139 if (compat != null) {
140 compat.addService(delegateBuilder, myServices);
144 final ObjectRegistration<org.opendaylight.mdsal.dom.api.DOMMountPoint> delegateReg = delegateBuilder.register();
145 return new AbstractObjectRegistration<DOMMountPoint>(mountPoint) {
147 protected void removeRegistration() {
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;
159 public DOMMountPointBuilderImpl(final YangInstanceIdentifier path) {
164 public <T extends DOMService> DOMMountPointBuilder addService(final Class<T> type, final T impl) {
165 services.putInstance(type, impl);
170 public DOMMountPointBuilder addInitialSchemaContext(final SchemaContext ctx) {
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);