From bad1ca8b7f23a5c4b921d0d5e35a80a662a2a7d7 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Sat, 10 May 2014 23:55:10 +0200 Subject: [PATCH] BUG-981: improve RuntimeGeneratedMappingServiceImpl clarity This clarifies some of the locking interactions and well as it isolates privay value. Change-Id: Ic8961c9f9d32307fdd582191cab55bc633d081c5 Signed-off-by: Robert Varga --- .../RuntimeGeneratedMappingServiceImpl.java | 109 +++++++----------- 1 file changed, 40 insertions(+), 69 deletions(-) diff --git a/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/RuntimeGeneratedMappingServiceImpl.java b/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/RuntimeGeneratedMappingServiceImpl.java index eacbd93eb5..dcf9679321 100644 --- a/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/RuntimeGeneratedMappingServiceImpl.java +++ b/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/RuntimeGeneratedMappingServiceImpl.java @@ -23,7 +23,6 @@ import java.util.concurrent.Future; import javassist.ClassPool; -import org.eclipse.xtext.xbase.lib.Extension; import org.opendaylight.yangtools.binding.generator.util.BindingGeneratorUtil; import org.opendaylight.yangtools.binding.generator.util.ReferencedTypeImpl; import org.opendaylight.yangtools.binding.generator.util.Types; @@ -82,83 +81,67 @@ public class RuntimeGeneratedMappingServiceImpl implements BindingIndependentMap private final HashMultimap> promisedTypes = HashMultimap.create(); private final ClassLoadingStrategy classLoadingStrategy; - // FIXME: how is this thread-safe? + // FIXME: will become final private ClassPool pool; - - // FIXME: how is this thread-safe? - @Extension private TransformerGenerator binding; - - // FIXME: how is this thread-safe? - @Extension private LazyGeneratedCodecRegistry registry; - // FIXME: how is this thread-safe? private SchemaContext schemaContext; + @Deprecated public RuntimeGeneratedMappingServiceImpl() { this(GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy()); } + @Deprecated public RuntimeGeneratedMappingServiceImpl(final ClassLoadingStrategy strat) { classLoadingStrategy = strat; } - public ClassPool getPool() { - return this.pool; - } - - public void setPool(final ClassPool pool) { - this.pool = pool; - } - - @Override - public SchemaContext getSchemaContext() { - return schemaContext; - } - - public void setSchemaContext(final SchemaContext schemaContext) { - this.schemaContext = schemaContext; + public RuntimeGeneratedMappingServiceImpl(final ClassPool pool) { + this(pool, GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy()); } - public TransformerGenerator getBinding() { - return this.binding; - } - - public void setBinding(final TransformerGenerator binding) { - this.binding = binding; - } + public RuntimeGeneratedMappingServiceImpl(final ClassPool pool, final ClassLoadingStrategy strat) { + this.pool = Preconditions.checkNotNull(pool); + this.classLoadingStrategy = Preconditions.checkNotNull(strat); - public LazyGeneratedCodecRegistry getRegistry() { - return registry; + // FIXME: merge into constructor once legacy init() is removed + doInit(); } - public void setRegistry(final LazyGeneratedCodecRegistry registry) { - this.registry = registry; - } + private void doInit() { + binding = new TransformerGenerator(pool); + registry = new LazyGeneratedCodecRegistry(this, classLoadingStrategy); - public ConcurrentMap getTypeToDefinition() { - return typeToDefinition; - } + registry.setGenerator(binding); + // binding.staticFieldsInitializer = registry + binding.setListener(registry); + binding.setTypeToDefinition(typeToDefinition); + binding.setTypeToSchemaNode(typeToSchemaNode); + binding.setTypeDefinitions(typeDefinitions); - public ConcurrentMap getTypeDefinitions() { - return typeDefinitions; + // if (ctx !== null) { + // listenerRegistration = ctx.registerService(SchemaServiceListener, + // this, new Hashtable()); + // } } - public ConcurrentMap getTypeToSchemaNode() { - return typeToSchemaNode; + @Deprecated + public void setPool(final ClassPool pool) { + this.pool = pool; } - public ConcurrentMap> getServiceTypeToRpc() { - return serviceTypeToRpc; + @Override + public synchronized SchemaContext getSchemaContext() { + return schemaContext; } @Override - public void onGlobalContextUpdated(final SchemaContext arg0) { - this.setSchemaContext(arg0); - this.recreateBindingContext(arg0); - LazyGeneratedCodecRegistry _registry = this.getRegistry(); - _registry.onGlobalContextUpdated(arg0); + public synchronized void onGlobalContextUpdated(final SchemaContext context) { + this.schemaContext = context; + this.recreateBindingContext(context); + this.registry.onGlobalContextUpdated(context); } private void recreateBindingContext(final SchemaContext schemaContext) { @@ -292,7 +275,7 @@ public class RuntimeGeneratedMappingServiceImpl implements BindingIndependentMap this.waitForSchema(arg.getType()); } - final InstanceIdentifierCodec c = getRegistry().getInstanceIdentifierCodec(); + final InstanceIdentifierCodec c = registry.getInstanceIdentifierCodec(); Preconditions.checkState(c != null, "InstanceIdentifierCodec not present"); return c.serialize(path); } @@ -310,7 +293,7 @@ public class RuntimeGeneratedMappingServiceImpl implements BindingIndependentMap // FIXME: deprecate use without iid final org.opendaylight.yangtools.yang.binding.InstanceIdentifier wildcardedPath = createWildcarded(path); - final DataContainerCodec transformer = getRegistry().getCodecForDataObject(container); + final DataContainerCodec transformer = registry.getCodecForDataObject(container); Preconditions.checkState(transformer != null, "Failed to find codec for type %s", container); final ValueWithQName deserialize = transformer.deserialize(domData, wildcardedPath); @@ -328,7 +311,7 @@ public class RuntimeGeneratedMappingServiceImpl implements BindingIndependentMap @Override public org.opendaylight.yangtools.yang.binding.InstanceIdentifier fromDataDom(final InstanceIdentifier entry) throws DeserializationException { try { - final InstanceIdentifierCodec c = getRegistry().getInstanceIdentifierCodec(); + final InstanceIdentifierCodec c = registry.getInstanceIdentifierCodec(); Preconditions.checkState(c != null, "InstanceIdentifierCodec not present"); return c.deserialize(entry); } catch (Exception e) { @@ -339,7 +322,7 @@ public class RuntimeGeneratedMappingServiceImpl implements BindingIndependentMap @Override public CodecRegistry getCodecRegistry() { - return this.getRegistry(); + return this.registry; } private void updateBindingFor(final Map map, final SchemaContext module) { @@ -356,21 +339,9 @@ public class RuntimeGeneratedMappingServiceImpl implements BindingIndependentMap } } + @Deprecated public void init() { - binding = new TransformerGenerator(pool); - registry = new LazyGeneratedCodecRegistry(this, classLoadingStrategy); - - registry.setGenerator(binding); - // binding.staticFieldsInitializer = registry - binding.setListener(registry); - binding.setTypeToDefinition(typeToDefinition); - binding.setTypeToSchemaNode(typeToSchemaNode); - binding.setTypeDefinitions(typeDefinitions); - - // if (ctx !== null) { - // listenerRegistration = ctx.registerService(SchemaServiceListener, - // this, new Hashtable()); - // } + doInit(); } @Override @@ -433,7 +404,7 @@ public class RuntimeGeneratedMappingServiceImpl implements BindingIndependentMap } @Override - public Optional> getRpcServiceClassFor(final String namespace, final String revision) { + public synchronized Optional> getRpcServiceClassFor(final String namespace, final String revision) { Module module = null; if (schemaContext != null) { module = schemaContext.findModuleByName(namespace, QName.parseRevision(revision)); -- 2.36.6