X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=dom%2Fmdsal-dom-broker%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fmdsal%2Fdom%2Fbroker%2FDOMMountPointServiceImpl.java;h=4c5f6152c07493ab31ebe3c4f8175784dc4a708d;hb=c241dcfa5322ac10810a1068ccd2eb57f6f2dbb2;hp=2888a2a07fed02bbc1d41a54de6f6fb6269e5897;hpb=6a192f0eeedc302ae0b506d04f9d79b34406aef5;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..4c5f6152c0 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 @@ -8,25 +8,30 @@ package org.opendaylight.mdsal.dom.broker; -import org.opendaylight.mdsal.dom.spi.SimpleDOMMountPoint; +import static com.google.common.base.Preconditions.checkState; +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.annotations.VisibleForTesting; import com.google.common.collect.MutableClassToInstanceMap; import java.util.HashMap; import java.util.Map; +import java.util.Optional; +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.ListenerRegistration; import org.opendaylight.yangtools.concepts.ObjectRegistration; import org.opendaylight.yangtools.util.ListenerRegistry; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.model.api.SchemaContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class DOMMountPointServiceImpl implements DOMMountPointService { + private static final Logger LOG = LoggerFactory.getLogger(DOMMountPointServiceImpl.class); private final Map mountPoints = new HashMap<>(); @@ -34,99 +39,86 @@ public class DOMMountPointServiceImpl implements DOMMountPointService { @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"); + checkState(!mountPoints.containsKey(path), "Mount point already exists"); 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 ListenerRegistration registerProvisionListener(final DOMMountPointListener listener) { return listeners.register(listener); } public ObjectRegistration registerMountPoint(final DOMMountPoint mountPoint) { + final YangInstanceIdentifier mountPointId = mountPoint.getIdentifier(); synchronized (mountPoints) { - Preconditions.checkState(!mountPoints.containsKey(mountPoint.getIdentifier()), "Mount point already exists"); - mountPoints.put(mountPoint.getIdentifier(), mountPoint); + final DOMMountPoint prev = mountPoints.putIfAbsent(mountPointId, mountPoint); + checkState(prev == null, "Mount point %s already exists as %s", mountPointId, prev); } - notifyMountCreated(mountPoint.getIdentifier()); - - return new MountRegistration(mountPoint); + listeners.forEach(listener -> listener.getInstance().onMountPointCreated(mountPointId)); + + return new AbstractObjectRegistration(mountPoint) { + @Override + protected void removeRegistration() { + unregisterMountPoint(getInstance().getIdentifier()); + } + }; } public 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("Removed non-existend mount point {} at", mountPointId, new Throwable()); + return; + } } - notifyMountRemoved(mountPointId); + + listeners.forEach(listener -> listener.getInstance().onMountPointRemoved(mountPointId)); } - public class DOMMountPointBuilderImpl implements DOMMountPointBuilder { + final class DOMMountPointBuilderImpl implements DOMMountPointBuilder { - ClassToInstanceMap services = MutableClassToInstanceMap.create(); - private SimpleDOMMountPoint mountPoint; + private final MutableClassToInstanceMap services = MutableClassToInstanceMap.create(); private final YangInstanceIdentifier path; private SchemaContext schemaContext; - public DOMMountPointBuilderImpl(final YangInstanceIdentifier path) { - this.path = path; + private SimpleDOMMountPoint mountPoint; + + DOMMountPointBuilderImpl(final YangInstanceIdentifier path) { + this.path = requireNonNull(path); + } + + @VisibleForTesting + SchemaContext getSchemaContext() { + return schemaContext; + } + + @VisibleForTesting + Map, DOMService> getServices() { + return services; } @Override public DOMMountPointBuilder addService(final Class type, final T impl) { - services.putInstance(type, impl); + services.putInstance(requireNonNull(type), requireNonNull(impl)); return this; } @Override public DOMMountPointBuilder addInitialSchemaContext(final SchemaContext ctx) { - schemaContext = ctx; + schemaContext = requireNonNull(ctx); return this; } @Override public ObjectRegistration register() { - Preconditions.checkState(mountPoint == null, "Mount point is already built."); + checkState(mountPoint == null, "Mount point is already built."); mountPoint = SimpleDOMMountPoint.create(path, services,schemaContext); 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()); - } - } }