BUG-2453 Add enum yang <-> Java mapping support to BindingRuntimeContext 26/20026/3
authorMaros Marsalek <mmarsale@cisco.com>
Mon, 11 May 2015 14:40:26 +0000 (16:40 +0200)
committerMaros Marsalek <mmarsale@cisco.com>
Thu, 14 May 2015 11:35:29 +0000 (13:35 +0200)
BindingRuntimeContext already posses the information about all generated classes
from yang (also enums). This commit makes it public.

Change-Id: I141d6206de80663a9f4f84e9260e107557f5650e
Signed-off-by: Maros Marsalek <mmarsale@cisco.com>
code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/util/BindingRuntimeContext.java

index e92f1ca0d0562718b78effe222897276b3e2b12f..29294f6f77c10f150f49d0277a52cdc219f776d6 100644 (file)
@@ -39,6 +39,7 @@ import org.opendaylight.yangtools.sal.binding.model.api.ParameterizedType;
 import org.opendaylight.yangtools.sal.binding.model.api.Type;
 import org.opendaylight.yangtools.sal.binding.model.api.type.builder.GeneratedTypeBuilder;
 import org.opendaylight.yangtools.yang.binding.Augmentation;
+import org.opendaylight.yangtools.yang.binding.BindingMapping;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier;
 import org.opendaylight.yangtools.yang.model.api.AugmentationSchema;
@@ -51,7 +52,10 @@ import org.opendaylight.yangtools.yang.model.api.Module;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition;
 import org.opendaylight.yangtools.yang.model.util.EffectiveAugmentationSchema;
+import org.opendaylight.yangtools.yang.model.util.EnumerationType;
+import org.opendaylight.yangtools.yang.model.util.ExtendedType;
 import org.opendaylight.yangtools.yang.model.util.SchemaNodeUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -74,6 +78,7 @@ import org.slf4j.LoggerFactory;
  */
 public class BindingRuntimeContext implements Immutable {
     private static final Logger LOG = LoggerFactory.getLogger(BindingRuntimeContext.class);
+    private static final char DOT = '.';
     private final ClassLoadingStrategy strategy;
     private final SchemaContext schemaContext;
 
@@ -248,6 +253,11 @@ public class BindingRuntimeContext implements Immutable {
         return new ReferencedTypeImpl(type.getPackage().getName(), type.getSimpleName());
     }
 
+    static Type referencedType(final String type) {
+        final int packageClassSeparator = type.lastIndexOf(DOT);
+        return new ReferencedTypeImpl(type.substring(0, packageClassSeparator), type.substring(packageClassSeparator + 1));
+    }
+
     /**
      * Returns schema ({@link DataSchemaNode}, {@link AugmentationSchema} or {@link TypeDefinition})
      * from which supplied class was generated. Returned schema may be augmented with
@@ -260,16 +270,23 @@ public class BindingRuntimeContext implements Immutable {
      *     which was used to generate supplied class.
      */
     public Entry<GeneratedType, Object> getTypeWithSchema(final Class<?> type) {
-        final Object schema = typeToDefiningSchema.get(referencedType(type));
+        return getTypeWithSchema(referencedType(type));
+    }
+
+    public Entry<GeneratedType, Object> getTypeWithSchema(final String type) {
+        return getTypeWithSchema(referencedType(type));
+    }
+
+    private Entry<GeneratedType, Object> getTypeWithSchema(final Type referencedType) {
+        final Object schema = typeToDefiningSchema.get(referencedType);
         final Type definedType = typeToDefiningSchema.inverse().get(schema);
         Preconditions.checkNotNull(schema);
         Preconditions.checkNotNull(definedType);
         if(definedType instanceof GeneratedTypeBuilder) {
             return new SimpleEntry<>(((GeneratedTypeBuilder) definedType).toInstance(), schema);
         }
-        Preconditions.checkArgument(definedType instanceof GeneratedType,"Type {} is not GeneratedType",type);
+        Preconditions.checkArgument(definedType instanceof GeneratedType,"Type {} is not GeneratedType", referencedType);
         return new SimpleEntry<>((GeneratedType) definedType,schema);
-
     }
 
     public ImmutableMap<Type, Entry<Type, Type>> getChoiceCaseChildren(final DataNodeContainer schema) {
@@ -294,6 +311,47 @@ public class BindingRuntimeContext implements Immutable {
         return ImmutableMap.copyOf(childToCase);
     }
 
+    /**
+     * Map enum constants: yang - java
+     *
+     * @param enumClass enum generated class
+     * @return mapped enum constants from yang with their corresponding values in generated binding classes
+     */
+    public BiMap<String, String> getEnumMapping(final Class<?> enumClass) {
+        final Map.Entry<GeneratedType, Object> typeWithSchema = getTypeWithSchema(enumClass);
+        return getEnumMapping(typeWithSchema);
+    }
+
+    /**
+     * See {@link #getEnumMapping(Class)}}
+     */
+    public BiMap<String, String> getEnumMapping(final String enumClass) {
+        final Map.Entry<GeneratedType, Object> typeWithSchema = getTypeWithSchema(enumClass);
+        return getEnumMapping(typeWithSchema);
+    }
+
+    private BiMap<String, String> getEnumMapping(final Entry<GeneratedType, Object> typeWithSchema) {
+        final TypeDefinition<?> typeDef = (TypeDefinition<?>) typeWithSchema.getValue();
+
+        final EnumerationType enumType;
+        if(typeDef instanceof ExtendedType) {
+            enumType = (EnumerationType) ((ExtendedType) typeDef).getBaseType();
+        } else {
+            Preconditions.checkArgument(typeDef instanceof EnumerationType);
+            enumType = (EnumerationType) typeDef;
+        }
+
+        final HashBiMap<String, String> mappedEnums = HashBiMap.create();
+
+        for (final EnumTypeDefinition.EnumPair enumPair : enumType.getValues()) {
+            mappedEnums.put(enumPair.getName(), BindingMapping.getClassName(enumPair.getName()));
+        }
+
+        // TODO cache these maps for future use
+        return mappedEnums;
+    }
+
+
     public Set<Class<?>> getCases(final Class<?> choice) {
         final Collection<Type> cazes = choiceToCases.get(referencedType(choice));
         final Set<Class<?>> ret = new HashSet<>(cazes.size());