X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;ds=sidebyside;f=dom%2Fmdsal-dom-broker%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fmdsal%2Fdom%2Fbroker%2FDOMMountPointServiceImpl.java;h=91e3d23202d13ca21c1e46e63f4dd726abce1e8f;hb=90b0687e0640ee23369d2ad9978628e3ff957a26;hp=2888a2a07fed02bbc1d41a54de6f6fb6269e5897;hpb=43e28da95d3511cf73882c16368c88295df7d35d;p=mdsal.git diff --git a/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/DOMMountPointServiceImpl.java b/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/DOMMountPointServiceImpl.java index 2888a2a07f..91e3d23202 100644 --- a/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/DOMMountPointServiceImpl.java +++ b/dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/DOMMountPointServiceImpl.java @@ -5,128 +5,134 @@ * 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.mdsal.dom.broker; -import org.opendaylight.mdsal.dom.spi.SimpleDOMMountPoint; +import static java.util.Objects.requireNonNull; -import org.opendaylight.mdsal.dom.api.DOMMountPointListener; -import org.opendaylight.mdsal.dom.api.DOMMountPoint; -import org.opendaylight.mdsal.dom.api.DOMMountPointService; -import org.opendaylight.mdsal.dom.api.DOMService; -import com.google.common.base.Optional; -import com.google.common.base.Preconditions; -import com.google.common.collect.ClassToInstanceMap; import com.google.common.collect.MutableClassToInstanceMap; import java.util.HashMap; import java.util.Map; -import org.opendaylight.yangtools.concepts.ListenerRegistration; +import java.util.Optional; +import javax.inject.Inject; +import javax.inject.Singleton; +import org.kohsuke.MetaInfServices; +import org.opendaylight.mdsal.dom.api.DOMMountPoint; +import org.opendaylight.mdsal.dom.api.DOMMountPointListener; +import org.opendaylight.mdsal.dom.api.DOMMountPointService; +import org.opendaylight.mdsal.dom.api.DOMService; +import org.opendaylight.mdsal.dom.spi.SimpleDOMMountPoint; +import org.opendaylight.yangtools.concepts.AbstractObjectRegistration; import org.opendaylight.yangtools.concepts.ObjectRegistration; -import org.opendaylight.yangtools.util.ListenerRegistry; +import org.opendaylight.yangtools.concepts.Registration; +import org.opendaylight.yangtools.util.ObjectRegistry; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -public class DOMMountPointServiceImpl implements DOMMountPointService { +@Component +@MetaInfServices +@Singleton +public final class DOMMountPointServiceImpl implements DOMMountPointService { + private static final Logger LOG = LoggerFactory.getLogger(DOMMountPointServiceImpl.class); private final Map mountPoints = new HashMap<>(); + private final ObjectRegistry listeners = + ObjectRegistry.createConcurrent("mount point listeners"); - private final ListenerRegistry listeners = ListenerRegistry.create(); + @Inject + @Activate + public DOMMountPointServiceImpl() { + // Exposed only for DI + } @Override public Optional getMountPoint(final YangInstanceIdentifier path) { - return Optional.fromNullable(mountPoints.get(path)); + return Optional.ofNullable(mountPoints.get(path)); } @Override - public DOMMountPointBuilder createMountPoint(final YangInstanceIdentifier path) { - Preconditions.checkState(!mountPoints.containsKey(path), "Mount point already exists"); + public synchronized DOMMountPointBuilder createMountPoint(final YangInstanceIdentifier path) { + checkNotExists(path, mountPoints.get(requireNonNull(path))); return new DOMMountPointBuilderImpl(path); } - public void notifyMountCreated(final YangInstanceIdentifier identifier) { - for (final ListenerRegistration listener : listeners - .getListeners()) { - listener.getInstance().onMountPointCreated(identifier); - } - } - - public void notifyMountRemoved(final YangInstanceIdentifier identifier) { - for (final ListenerRegistration listener : listeners - .getListeners()) { - listener.getInstance().onMountPointRemoved(identifier); - } - } - @Override - public ListenerRegistration registerProvisionListener( - final DOMMountPointListener listener) { + public Registration registerProvisionListener(final DOMMountPointListener listener) { return listeners.register(listener); } - public ObjectRegistration registerMountPoint(final DOMMountPoint mountPoint) { + @SuppressWarnings("checkstyle:IllegalCatch") + private ObjectRegistration registerMountPoint(final SimpleDOMMountPoint mountPoint) { + final YangInstanceIdentifier mountPointId = mountPoint.getIdentifier(); synchronized (mountPoints) { - Preconditions.checkState(!mountPoints.containsKey(mountPoint.getIdentifier()), "Mount point already exists"); - mountPoints.put(mountPoint.getIdentifier(), mountPoint); + checkNotExists(mountPointId, mountPoints.putIfAbsent(mountPointId, mountPoint)); } - notifyMountCreated(mountPoint.getIdentifier()); - - return new MountRegistration(mountPoint); + listeners.streamObjects().forEach(listener -> { + try { + listener.onMountPointCreated(mountPointId); + } catch (final Exception ex) { + LOG.error("Listener {} failed on mount point {} created event", listener, mountPoint, ex); + } + }); + + return new AbstractObjectRegistration<>(mountPoint) { + @Override + protected void removeRegistration() { + unregisterMountPoint(getInstance().getIdentifier()); + } + }; } - public void unregisterMountPoint(final YangInstanceIdentifier mountPointId) { + @SuppressWarnings("checkstyle:IllegalCatch") + private void unregisterMountPoint(final YangInstanceIdentifier mountPointId) { synchronized (mountPoints) { - Preconditions.checkState(mountPoints.containsKey(mountPointId), "Mount point does not exist"); - mountPoints.remove(mountPointId); + if (mountPoints.remove(mountPointId) == null) { + LOG.warn("Removing non-existent mount point {} at", mountPointId, new Throwable()); + return; + } } - notifyMountRemoved(mountPointId); + + listeners.streamObjects().forEach(listener -> { + try { + listener.onMountPointRemoved(mountPointId); + } catch (final Exception ex) { + LOG.error("Listener {} failed on mount point {} removed event", listener, mountPointId, ex); + } + }); } - public class DOMMountPointBuilderImpl implements DOMMountPointBuilder { + private static void checkNotExists(final YangInstanceIdentifier id, final DOMMountPoint mountPoint) { + if (mountPoint != null) { + throw new IllegalStateException("Mount point " + id + " already exists as " + mountPoint); + } + } - ClassToInstanceMap services = MutableClassToInstanceMap.create(); - private SimpleDOMMountPoint mountPoint; + private final class DOMMountPointBuilderImpl implements DOMMountPointBuilder { + private final MutableClassToInstanceMap> services = MutableClassToInstanceMap.create(); private final YangInstanceIdentifier path; - private SchemaContext schemaContext; - public DOMMountPointBuilderImpl(final YangInstanceIdentifier path) { - this.path = path; - } + private SimpleDOMMountPoint mountPoint; - @Override - public DOMMountPointBuilder addService(final Class type, final T impl) { - services.putInstance(type, impl); - return this; + DOMMountPointBuilderImpl(final YangInstanceIdentifier path) { + this.path = requireNonNull(path); } @Override - public DOMMountPointBuilder addInitialSchemaContext(final SchemaContext ctx) { - schemaContext = ctx; + public , E extends DOMService.Extension> DOMMountPointBuilder addService( + final Class type, final T impl) { + services.putInstance(type, requireNonNull(impl)); return this; } @Override public ObjectRegistration register() { - Preconditions.checkState(mountPoint == null, "Mount point is already built."); - mountPoint = SimpleDOMMountPoint.create(path, services,schemaContext); + if (mountPoint != null) { + throw new IllegalStateException("Mount point is already built"); + } + mountPoint = SimpleDOMMountPoint.create(path, services); return registerMountPoint(mountPoint); } } - - private final class MountRegistration implements ObjectRegistration { - private final DOMMountPoint mountPoint; - - public MountRegistration(final DOMMountPoint mountPoint) { - this.mountPoint = mountPoint; - } - - @Override - public DOMMountPoint getInstance() { - return mountPoint; - } - - @Override - public void close() throws Exception { - unregisterMountPoint(mountPoint.getIdentifier()); - } - } }