/* * Copyright (c) 2018 Pantheon Technologies, s.r.o. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.controller.sal.core.compat; import static java.util.Objects.requireNonNull; import com.google.common.base.Optional; import com.google.common.collect.ForwardingObject; import com.google.common.collect.ImmutableMap; import java.util.Map; import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.controller.md.sal.dom.api.DOMActionService; import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker; import org.opendaylight.controller.md.sal.dom.api.DOMMountPoint; import org.opendaylight.controller.md.sal.dom.api.DOMNotificationService; import org.opendaylight.controller.md.sal.dom.api.DOMRpcService; import org.opendaylight.controller.md.sal.dom.api.DOMService; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.model.api.SchemaContext; /** * Adapter providing Controller DOMMountPoint implementation based on an MD-SAL DOMMountPoint delegate. Services are * looked up in the delegate first. If a lookup is unsuccessful, this class attempts to transparently proxy well-known * Controller DOMServices on top of their MD-SAL counterparts available from delegate. */ @Deprecated public class DOMMountPointAdapter extends ForwardingObject implements DOMMountPoint { private abstract static class CompatFactory { private final Class mdsalClass; CompatFactory(final Class mdsalClass) { this.mdsalClass = requireNonNull(mdsalClass); } final @Nullable C createService(final org.opendaylight.mdsal.dom.api.DOMMountPoint mountPoint) { return mountPoint.getService(mdsalClass).map(this::createService).orElse(null); } abstract C createService(M delegate); } private static final Map, CompatFactory> KNOWN_SERVICES = ImmutableMap.of( DOMActionService.class, new CompatFactory( org.opendaylight.mdsal.dom.api.DOMActionService.class) { @Override DOMActionService createService(final org.opendaylight.mdsal.dom.api.DOMActionService delegate) { return new LegacyDOMActionServiceAdapter(delegate); } }, DOMDataBroker.class, new CompatFactory( org.opendaylight.mdsal.dom.api.DOMDataBroker.class) { @Override DOMDataBroker createService(final org.opendaylight.mdsal.dom.api.DOMDataBroker delegate) { return new LegacyDOMDataBrokerAdapter(delegate); } }, DOMNotificationService.class, new CompatFactory(org.opendaylight.mdsal.dom.api.DOMNotificationService.class) { @Override DOMNotificationService createService(final org.opendaylight.mdsal.dom.api.DOMNotificationService delegate) { return new LegacyDOMNotificationServiceAdapter(delegate); } }, DOMRpcService.class, new CompatFactory( org.opendaylight.mdsal.dom.api.DOMRpcService.class) { @Override DOMRpcService createService(final org.opendaylight.mdsal.dom.api.DOMRpcService delegate) { return new LegacyDOMRpcServiceAdapter(delegate); } }); private final org.opendaylight.mdsal.dom.api.DOMMountPoint delegate; public DOMMountPointAdapter(final org.opendaylight.mdsal.dom.api.DOMMountPoint delegate) { this.delegate = requireNonNull(delegate); } @Override public YangInstanceIdentifier getIdentifier() { return delegate().getIdentifier(); } @Override public Optional getService(final Class cls) { final java.util.Optional found = delegate.getService(cls); if (found.isPresent()) { return Optional.of(found.get()); } final CompatFactory compat = KNOWN_SERVICES.get(cls); return Optional.fromNullable(cls.cast(compat == null ? null : compat.createService(delegate))); } @Override public SchemaContext getSchemaContext() { return delegate().getSchemaContext(); } @Override public int hashCode() { return getIdentifier().hashCode(); } @Override public boolean equals(final Object obj) { if (this == obj) { return true; } if (!(obj instanceof DOMMountPoint)) { return false; } DOMMountPoint other = (DOMMountPoint) obj; return getIdentifier().equals(other.getIdentifier()); } @Override protected org.opendaylight.mdsal.dom.api.DOMMountPoint delegate() { return delegate; } }