X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fnetconf%2Fconfig-netconf-connector%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fnetconf%2Fconfignetconfconnector%2Fosgi%2FYangStoreService.java;h=ad771f99d88e2a4f073f0cbec7ef5117ad0f708d;hp=ac3873e6b89be414429773ee54ee53b05bec4f2c;hb=071a641d7c12c0e6112d5ce0afe806b54f116ed2;hpb=92cd266a60a0dd246324654d456b5068207d3037 diff --git a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/osgi/YangStoreService.java b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/osgi/YangStoreService.java index ac3873e6b8..ad771f99d8 100644 --- a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/osgi/YangStoreService.java +++ b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/osgi/YangStoreService.java @@ -33,6 +33,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.not import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.NetconfCapabilityChangeBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.changed.by.parms.ChangedByBuilder; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.changed.by.parms.changed.by.server.or.user.ServerBuilder; +import org.opendaylight.yangtools.sal.binding.generator.util.BindingRuntimeContext; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.ModuleIdentifier; @@ -58,7 +59,7 @@ public class YangStoreService implements YangStoreContext { * * We synchronize with GC as usual, using a SoftReference. * - * The atomic reference is used to synchronize with {@link #refresh()}, e.g. when + * The atomic reference is used to synchronize with {@link #refresh(org.opendaylight.yangtools.sal.binding.generator.util.BindingRuntimeContext)}, e.g. when * refresh happens, it will push a SoftReference(null), e.g. simulate the GC. Now * that may happen while the getter is already busy acting on the old schema context, * so it needs to understand that a refresh has happened and retry. To do that, it @@ -71,6 +72,9 @@ public class YangStoreService implements YangStoreContext { private final AtomicReference> ref = new AtomicReference<>(new SoftReference(null)); + private final AtomicReference> refBindingContext = + new AtomicReference<>(new SoftReference(null)); + private final SchemaContextProvider schemaContextProvider; private final BaseNetconfNotificationListener notificationPublisher; @@ -98,7 +102,7 @@ public class YangStoreService implements YangStoreContext { while (ret == null) { // We need to be compute a new value - ret = new YangStoreSnapshot(schemaContextProvider.getSchemaContext()); + ret = new YangStoreSnapshot(schemaContextProvider.getSchemaContext(), refBindingContext.get().get()); if (!ref.compareAndSet(r, new SoftReference<>(ret))) { LOG.debug("Concurrent refresh detected, recomputing snapshot"); @@ -130,9 +134,15 @@ public class YangStoreService implements YangStoreContext { return getYangStoreSnapshot().getModuleSource(moduleIdentifier); } - public void refresh() { + @Override + public EnumResolver getEnumResolver() { + return getYangStoreSnapshot().getEnumResolver(); + } + + public void refresh(final BindingRuntimeContext runtimeContext) { final YangStoreSnapshot previous = ref.get().get(); ref.set(new SoftReference(null)); + refBindingContext.set(new SoftReference<>(runtimeContext)); notificationExecutor.submit(new CapabilityChangeNotifier(previous)); }