Rework AugmentRuntimeType and Choice/Case linkage
[mdsal.git] / binding / mdsal-binding-generator / src / main / java / org / opendaylight / mdsal / binding / generator / impl / reactor / KeyGenerator.java
index e0bf2e60df77a2063687730bbd09fc56069f9c28..a45c1dcb35c8d74f920b9135e2af0271a4c02363 100644 (file)
@@ -7,28 +7,29 @@
  */
 package org.opendaylight.mdsal.binding.generator.impl.reactor;
 
+import static com.google.common.base.Verify.verify;
 import static java.util.Objects.requireNonNull;
 
 import java.util.Set;
 import org.opendaylight.mdsal.binding.generator.impl.reactor.CollisionDomain.Member;
+import org.opendaylight.mdsal.binding.generator.impl.rt.DefaultKeyRuntimeType;
+import org.opendaylight.mdsal.binding.model.api.GeneratedTransferObject;
 import org.opendaylight.mdsal.binding.model.api.GeneratedType;
 import org.opendaylight.mdsal.binding.model.api.Type;
 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedPropertyBuilder;
 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTOBuilder;
 import org.opendaylight.mdsal.binding.model.api.type.builder.GeneratedTypeBuilderBase;
 import org.opendaylight.mdsal.binding.model.ri.BindingTypes;
+import org.opendaylight.mdsal.binding.runtime.api.KeyRuntimeType;
 import org.opendaylight.mdsal.binding.spec.naming.BindingMapping;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.stmt.KeyEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
 
-final class KeyGenerator extends AbstractExplicitGenerator<KeyEffectiveStatement> {
-    // FIXME: this should be a well-known constant
-    private static final String SUFFIX = "Key";
-
+final class KeyGenerator extends AbstractExplicitGenerator<KeyEffectiveStatement, KeyRuntimeType> {
     private final ListGenerator listGen;
 
-    KeyGenerator(final KeyEffectiveStatement statement, final AbstractCompositeGenerator<?> parent,
+    KeyGenerator(final KeyEffectiveStatement statement, final AbstractCompositeGenerator<?, ?> parent,
             final ListGenerator listGen) {
         super(statement, parent);
         this.listGen = requireNonNull(listGen);
@@ -41,11 +42,11 @@ final class KeyGenerator extends AbstractExplicitGenerator<KeyEffectiveStatement
 
     @Override
     Member createMember(final CollisionDomain domain) {
-        return domain.addSecondary(this, listGen.getMember(), SUFFIX);
+        return domain.addSecondary(this, listGen.getMember(), BindingMapping.KEY_SUFFIX);
     }
 
     @Override
-    GeneratedType createTypeImpl(final TypeBuilderFactory builderFactory) {
+    GeneratedTransferObject createTypeImpl(final TypeBuilderFactory builderFactory) {
         final GeneratedTOBuilder builder = builderFactory.newGeneratedTOBuilder(typeName());
 
         builder.addImplementsType(BindingTypes.identifier(Type.of(listGen.typeName())));
@@ -76,6 +77,24 @@ final class KeyGenerator extends AbstractExplicitGenerator<KeyEffectiveStatement
         return builder.build();
     }
 
+    @Override
+    GeneratedType runtimeJavaType() {
+        return generatedType().orElse(null);
+    }
+
+    @Override
+    KeyRuntimeType createExternalRuntimeType(final Type type) {
+        verify(type instanceof GeneratedTransferObject, "Unexpected type %s", type);
+        return new DefaultKeyRuntimeType((GeneratedTransferObject) type, statement());
+    }
+
+    @Override
+    KeyRuntimeType createInternalRuntimeType(final ChildLookup lookup,final KeyEffectiveStatement statement,
+            final Type type) {
+        // The only reference to this runtime type is from ListGenerator which is always referencing the external type
+        throw new UnsupportedOperationException("Should never be called");
+    }
+
     @Override
     void addAsGetterMethod(final GeneratedTypeBuilderBase<?> builder, final TypeBuilderFactory builderFactory) {
         // Keys are explicitly handled by their corresponding list