import org.osgi.framework.ServiceRegistration
import org.opendaylight.controller.sal.binding.impl.connect.dom.DeserializationException
import java.util.concurrent.Callable
+import org.opendaylight.yangtools.yang.binding.Augmentation
+import org.opendaylight.controller.sal.binding.impl.util.YangSchemaUtils
class RuntimeGeneratedMappingServiceImpl implements BindingIndependentMappingService, SchemaServiceListener, AutoCloseable {
for (entry : newBinding.moduleContexts.entrySet) {
registry.onModuleContextAdded(schemaContext, entry.key, entry.value);
-
+ binding.pathToType.putAll(entry.value.childNodes)
//val module = entry.key;
val context = entry.value;
updateBindingFor(context.childNodes, schemaContext);
updateBindingFor(context.cases, schemaContext);
val typedefs = context.typedefs;
- for (typedef : typedefs.values) {
- binding.typeDefinitions.put(typedef, typedef as GeneratedType);
+ for (typedef : typedefs.entrySet) {
+ val typeRef = new ReferencedTypeImpl(typedef.value.packageName,typedef.value.name)
+ binding.typeDefinitions.put(typeRef, typedef.value as GeneratedType);
+ val schemaNode = YangSchemaUtils.findTypeDefinition(schemaContext,typedef.key);
+ if(schemaNode != null) {
+
+ binding.typeToSchemaNode.put(typeRef,schemaNode);
+ } else {
+ LOG.error("Type definition for {} is not available",typedef.value);
+ }
+
}
val augmentations = context.augmentations;
for (augmentation : augmentations) {
return ret as CompositeNode;
}
- private def waitForSchema(Class<? extends DataContainer> class1) {
+ private def void waitForSchema(Class<? extends DataContainer> class1) {
+ if(Augmentation.isAssignableFrom(class1)) {
+ /* FIXME: We should wait also for augmentations. Currently YANGTools does not provide correct
+ * mapping between java Augmentation classes and augmentations.
+ */
+ return;
+ }
+
val ref = Types.typeForClass(class1);
getSchemaWithRetry(ref);
}
try {
deserializationBlock.call()
} catch (Exception e) {
+
// FIXME: Make this block providing more information.
throw new DeserializationException(e);
}
}
private def void updateBindingFor(Map<SchemaPath, GeneratedTypeBuilder> map, SchemaContext module) {
+
for (entry : map.entrySet) {
val schemaNode = SchemaContextUtil.findDataSchemaNode(module, entry.key);
//LOG.info("{} : {}",entry.key,entry.value.fullyQualifiedName)
+ val typeRef = new ReferencedTypeImpl(entry.value.packageName,entry.value.name)
+ typeToDefinition.put(typeRef, entry.value);
if (schemaNode != null) {
- typeToSchemaNode.put(entry.value, schemaNode);
- typeToDefinition.put(entry.value, entry.value);
- updatePromisedSchemas(entry.value, schemaNode);
+ typeToSchemaNode.put(typeRef, schemaNode);
+ updatePromisedSchemas(typeRef, schemaNode);
}
+
}
}
if (typeDef !== null) {
return typeDef;
}
+ LOG.info("Thread blocked waiting for schema for: {}",type.fullyQualifiedName)
return type.getSchemaInFuture.get();
}