Cache YangModuleInfo type name
[mdsal.git] / binding / mdsal-binding-generator-impl / src / main / java / org / opendaylight / mdsal / binding / generator / impl / ModuleContext.java
index c938f5e11a93bde45e3f979042bd443f508de791..9b323e512b619eed454cc7fe0d2be53d728e0908 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.mdsal.binding.generator.impl;
 
+import static com.google.common.base.Preconditions.checkState;
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.collect.BiMap;
@@ -22,15 +23,19 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import javax.annotation.concurrent.NotThreadSafe;
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
+import org.opendaylight.mdsal.binding.model.api.GeneratedType;
 import org.opendaylight.mdsal.binding.model.api.JavaTypeName;
 import org.opendaylight.mdsal.binding.model.api.Type;
 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTOBuilder;
 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilder;
 import org.opendaylight.mdsal.binding.spec.naming.BindingMapping;
+import org.opendaylight.yangtools.concepts.Mutable;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode;
+import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.DocumentedNode.WithStatus;
 import org.opendaylight.yangtools.yang.model.api.GroupingDefinition;
@@ -44,8 +49,10 @@ import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@NotThreadSafe
-public final class ModuleContext {
+/**
+ * Utility class for building up Binding mapping information. This class is NOT thread-safe.
+ */
+public final class ModuleContext implements Mutable {
     private static final Logger LOG = LoggerFactory.getLogger(ModuleContext.class);
 
     private final BiMap<Type, AugmentationSchemaNode> typeToAugmentation = HashBiMap.create();
@@ -57,6 +64,7 @@ public final class ModuleContext {
     private final List<GeneratedTypeBuilder> augmentations = new ArrayList<>();
     private final Multimap<Type, Type> choiceToCases = HashMultimap.create();
     private final Set<GeneratedTypeBuilder> topLevelNodes = new HashSet<>();
+    private final Map<SchemaPath, JavaTypeName> aliases = new HashMap<>();
     private final Map<Type, WithStatus> typeToSchema = new HashMap<>();
     private final List<GeneratedTOBuilder> genTOs = new ArrayList<>();
     private final Map<SchemaPath, Type> innerTypes = new HashMap<>();
@@ -67,6 +75,7 @@ public final class ModuleContext {
     private final Map<JavaTypeName, SchemaNode> nameMapping = new HashMap<>();
 
     private GeneratedTypeBuilder moduleNode;
+    private JavaTypeName moduleInfoType;
     private String modulePackageName;
 
     ModuleContext(final Module module) {
@@ -77,7 +86,7 @@ public final class ModuleContext {
         return module;
     }
 
-    String modulePackageName() {
+    @NonNull String modulePackageName() {
         String ret = modulePackageName;
         if (ret == null) {
             modulePackageName = ret = BindingMapping.getRootPackageName(module.getQNameModule());
@@ -85,6 +94,14 @@ public final class ModuleContext {
         return ret;
     }
 
+    @NonNull JavaTypeName moduleInfoType() {
+        JavaTypeName ret = moduleInfoType;
+        if (ret == null) {
+            moduleInfoType = ret = JavaTypeName.create(modulePackageName(), BindingMapping.MODULE_INFO_CLASS_NAME);
+        }
+        return ret;
+    }
+
     List<Type> getGeneratedTypes() {
         List<Type> result = new ArrayList<>();
 
@@ -149,6 +166,23 @@ public final class ModuleContext {
         genTOs.add(builder);
     }
 
+    @NonNull GeneratedType addAliasType(final ModuleContext sourceContext, final ContainerSchemaNode source,
+            final ContainerSchemaNode alias) {
+        final GeneratedTypeBuilder builder = sourceContext.getChildNode(source.getPath());
+        checkState(builder != null, "Could not find builder for %s", source);
+
+        final JavaTypeName id = builder.getIdentifier();
+        final SchemaPath path = alias.getPath();
+        final JavaTypeName prev = aliases.putIfAbsent(path, id);
+        checkState(prev == null, "Type aliasing conflict on %s: %s vs %s", path, prev, id);
+
+        return builder.build();
+    }
+
+    @Nullable JavaTypeName getAlias(final SchemaPath path) {
+        return aliases.get(path);
+    }
+
     public void addChildNodeType(final SchemaNode def, final GeneratedTypeBuilder builder) {
         checkNamingConflict(def, builder.getIdentifier());
         childNodes.put(def.getPath(), builder);