X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fconfig%2Fconfig-manager%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fconfig%2Fmanager%2Fimpl%2Fosgi%2Fmapping%2FRefreshingSCPModuleInfoRegistry.java;h=d59232cf08de0904b55f75009756124d2117d5c0;hp=e51cf8d4c5edb8b98e3a032a5db950277f1cecb2;hb=20a32e6459fd1e27e7669bf1ebc7742b96787b94;hpb=89bbb529da1ea9e338b2b03192bd912003f7f00e diff --git a/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/osgi/mapping/RefreshingSCPModuleInfoRegistry.java b/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/osgi/mapping/RefreshingSCPModuleInfoRegistry.java index e51cf8d4c5..d59232cf08 100644 --- a/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/osgi/mapping/RefreshingSCPModuleInfoRegistry.java +++ b/opendaylight/config/config-manager/src/main/java/org/opendaylight/controller/config/manager/impl/osgi/mapping/RefreshingSCPModuleInfoRegistry.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. + * Copyright (c) 2013, 2017 Cisco Systems, Inc. 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, @@ -8,69 +8,96 @@ package org.opendaylight.controller.config.manager.impl.osgi.mapping; +import java.util.Dictionary; +import java.util.Hashtable; +import org.opendaylight.mdsal.binding.generator.api.ClassLoadingStrategy; +import org.opendaylight.mdsal.binding.generator.api.ModuleInfoRegistry; +import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext; import org.opendaylight.yangtools.concepts.ObjectRegistration; -import org.opendaylight.yangtools.sal.binding.generator.api.ModuleInfoRegistry; import org.opendaylight.yangtools.yang.binding.YangModuleInfo; import org.opendaylight.yangtools.yang.model.api.SchemaContextProvider; +import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource; +import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceProvider; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceRegistration; -import java.util.Hashtable; - /** - * Update SchemaContext service in Service Registry each time new YangModuleInfo is added or removed. + * Update SchemaContext service in Service Registry each time new YangModuleInfo + * is added or removed. */ public class RefreshingSCPModuleInfoRegistry implements ModuleInfoRegistry, AutoCloseable { - private final ModuleInfoRegistry moduleInfoRegistry; - private final ServiceRegistration osgiReg; + private final SchemaContextProvider schemaContextProvider; + private final SchemaSourceProvider sourceProvider; + private final BindingContextProvider bindingContextProvider; + private final ClassLoadingStrategy classLoadingStrat; + + private volatile ServiceRegistration osgiReg; + + public RefreshingSCPModuleInfoRegistry(final ModuleInfoRegistry moduleInfoRegistry, + final SchemaContextProvider schemaContextProvider, final ClassLoadingStrategy classLoadingStrat, + final SchemaSourceProvider sourceProvider, + final BindingContextProvider bindingContextProvider, final BundleContext bundleContext) { - public RefreshingSCPModuleInfoRegistry(ModuleInfoRegistry moduleInfoRegistry, - SchemaContextProvider schemaContextProvider, BundleContext bundleContext) { this.moduleInfoRegistry = moduleInfoRegistry; - osgiReg = bundleContext.registerService(SchemaContextProvider.class, schemaContextProvider, new Hashtable()); + this.schemaContextProvider = schemaContextProvider; + this.classLoadingStrat = classLoadingStrat; + this.sourceProvider = sourceProvider; + this.bindingContextProvider = bindingContextProvider; + this.osgiReg = bundleContext.registerService(SchemaContextProvider.class, schemaContextProvider, + new Hashtable()); } - private void updateService() { - osgiReg.setProperties(null); // send modifiedService event + public synchronized void updateService() { + if (this.osgiReg != null) { + this.bindingContextProvider.update(this.classLoadingStrat, this.schemaContextProvider); + + final Dictionary props = new Hashtable<>(); + props.put(BindingRuntimeContext.class.getName(), this.bindingContextProvider.getBindingContext()); + props.put(SchemaSourceProvider.class.getName(), this.sourceProvider); + // send modifiedService event + this.osgiReg.setProperties(props); + } } @Override - public ObjectRegistration registerModuleInfo(YangModuleInfo yangModuleInfo) { - ObjectRegistration yangModuleInfoObjectRegistration = moduleInfoRegistry.registerModuleInfo(yangModuleInfo); - ObjectRegistrationWrapper wrapper = new ObjectRegistrationWrapper(yangModuleInfoObjectRegistration); - updateService(); - return wrapper; + public ObjectRegistration registerModuleInfo(final YangModuleInfo yangModuleInfo) { + final ObjectRegistration yangModuleInfoObjectRegistration = this.moduleInfoRegistry + .registerModuleInfo(yangModuleInfo); + return new ObjectRegistrationWrapper(yangModuleInfoObjectRegistration); } - @Override - public void close() { - osgiReg.unregister(); + public synchronized void close() throws Exception { + if (this.osgiReg != null) { + this.osgiReg.unregister(); + } + + this.osgiReg = null; } private class ObjectRegistrationWrapper implements ObjectRegistration { private final ObjectRegistration inner; - private ObjectRegistrationWrapper(ObjectRegistration inner) { + ObjectRegistrationWrapper(final ObjectRegistration inner) { this.inner = inner; } @Override public YangModuleInfo getInstance() { - return inner.getInstance(); + return this.inner.getInstance(); } @Override - public void close() throws Exception { - inner.close(); - updateService();// send modify event when a bundle disappears + public void close() { + this.inner.close(); + // send modify event when a bundle disappears + updateService(); } - @Override public String toString() { - return inner.toString(); + return this.inner.toString(); } } }