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=8001169771e6a77a3dc9e2544cab9c91e9fc5cdb;hp=d4add505038eb3cdced6f55c77785ed478c663f3;hb=cd6d62b76aa3de2047457957676905cb59e26315;hpb=919145b1bf7d68e436efa9b22c174965005a174a 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 d4add50503..8001169771 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 @@ -8,59 +8,85 @@ package org.opendaylight.controller.config.manager.impl.osgi.mapping; +import java.util.Dictionary; import java.util.Hashtable; import org.opendaylight.yangtools.concepts.ObjectRegistration; import org.opendaylight.yangtools.sal.binding.generator.api.ClassLoadingStrategy; import org.opendaylight.yangtools.sal.binding.generator.api.ModuleInfoRegistry; +import org.opendaylight.yangtools.sal.binding.generator.util.BindingRuntimeContext; 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 org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Update SchemaContext service in Service Registry each time new YangModuleInfo is added or removed. */ public class RefreshingSCPModuleInfoRegistry implements ModuleInfoRegistry, AutoCloseable { + private static final Logger LOG = LoggerFactory.getLogger(RefreshingSCPModuleInfoRegistry.class); private final ModuleInfoRegistry moduleInfoRegistry; private final SchemaContextProvider schemaContextProvider; + private final SchemaSourceProvider sourceProvider; private final BindingContextProvider bindingContextProvider; private final ClassLoadingStrategy classLoadingStrat; - private final ServiceRegistration osgiReg; + private volatile ServiceRegistration osgiReg; public RefreshingSCPModuleInfoRegistry(final ModuleInfoRegistry moduleInfoRegistry, - final SchemaContextProvider schemaContextProvider, final ClassLoadingStrategy classLoadingStrat, final BindingContextProvider bindingContextProvider, final BundleContext bundleContext) { + final SchemaContextProvider schemaContextProvider, final ClassLoadingStrategy classLoadingStrat, + final SchemaSourceProvider sourceProvider, final BindingContextProvider bindingContextProvider, + final BundleContext bundleContext) { + this.moduleInfoRegistry = moduleInfoRegistry; this.schemaContextProvider = schemaContextProvider; this.classLoadingStrat = classLoadingStrat; + this.sourceProvider = sourceProvider; this.bindingContextProvider = bindingContextProvider; - osgiReg = bundleContext.registerService(SchemaContextProvider.class, schemaContextProvider, new Hashtable()); + osgiReg = bundleContext + .registerService(SchemaContextProvider.class, schemaContextProvider, new Hashtable()); } - private void updateService() { - bindingContextProvider.update(classLoadingStrat, schemaContextProvider); - osgiReg.setProperties(null); // send modifiedService event + public void updateService() { + if(osgiReg != null) { + try { + bindingContextProvider.update(classLoadingStrat, schemaContextProvider); + + final Dictionary props = new Hashtable<>(); + props.put(BindingRuntimeContext.class.getName(), bindingContextProvider.getBindingContext()); + props.put(SchemaSourceProvider.class.getName(), sourceProvider); + osgiReg.setProperties(props); // send modifiedService event + } catch (RuntimeException e) { + // The ModuleInfoBackedContext throws a RuntimeException if it can't create the schema context. + LOG.warn("Error updating the BindingContextProvider", e); + } + } } @Override - public ObjectRegistration registerModuleInfo(YangModuleInfo yangModuleInfo) { + public ObjectRegistration registerModuleInfo(final YangModuleInfo yangModuleInfo) { ObjectRegistration yangModuleInfoObjectRegistration = moduleInfoRegistry.registerModuleInfo(yangModuleInfo); ObjectRegistrationWrapper wrapper = new ObjectRegistrationWrapper(yangModuleInfoObjectRegistration); - updateService(); return wrapper; } @Override public void close() throws Exception { - osgiReg.unregister(); - } + if(osgiReg != null) { + osgiReg.unregister(); + } + osgiReg = null; + } private class ObjectRegistrationWrapper implements ObjectRegistration { private final ObjectRegistration inner; - private ObjectRegistrationWrapper(ObjectRegistration inner) { + private ObjectRegistrationWrapper(final ObjectRegistration inner) { this.inner = inner; } @@ -75,7 +101,6 @@ public class RefreshingSCPModuleInfoRegistry implements ModuleInfoRegistry, Auto updateService();// send modify event when a bundle disappears } - @Override public String toString() { return inner.toString();