Add alternative enum assigned name mapping
[mdsal.git] / binding / mdsal-binding-dom-codec / src / main / java / org / opendaylight / yangtools / binding / data / codec / impl / EnumerationCodec.java
index dc13319246023d24a8e91efd9775c1dd76fd341d..e254560df6d7bbcc65546771166840a909f7bc55 100644 (file)
@@ -7,61 +7,59 @@
  */
 package org.opendaylight.yangtools.binding.data.codec.impl;
 
-import com.google.common.base.Preconditions;
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkState;
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.collect.BiMap;
 import com.google.common.collect.ImmutableBiMap;
-import java.util.HashMap;
-import java.util.Map;
+import com.google.common.collect.ImmutableBiMap.Builder;
 import java.util.concurrent.Callable;
+import java.util.stream.Collectors;
 import org.opendaylight.yangtools.binding.data.codec.impl.ValueTypeCodec.SchemaUnawareCodec;
 import org.opendaylight.yangtools.yang.binding.BindingMapping;
 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition.EnumPair;
 
 final class EnumerationCodec extends ReflectionBasedCodec implements SchemaUnawareCodec {
-
     private final ImmutableBiMap<String, Enum<?>> yangValueToBinding;
 
-    public EnumerationCodec(final Class<? extends Enum<?>> enumeration, final Map<String, Enum<?>> schema) {
+    EnumerationCodec(final Class<? extends Enum<?>> enumeration, final ImmutableBiMap<String, Enum<?>> schema) {
         super(enumeration);
-        yangValueToBinding = ImmutableBiMap.copyOf(schema);
+        yangValueToBinding = requireNonNull(schema);
     }
 
-    static Callable<EnumerationCodec> loader(final Class<?> returnType,
-            final EnumTypeDefinition enumSchema) {
-        Preconditions.checkArgument(Enum.class.isAssignableFrom(returnType));
+    static Callable<EnumerationCodec> loader(final Class<?> returnType, final EnumTypeDefinition enumSchema) {
+        checkArgument(Enum.class.isAssignableFrom(returnType));
         @SuppressWarnings({ "rawtypes", "unchecked" })
         final Class<? extends Enum<?>> enumType = (Class) returnType;
-        return new Callable<EnumerationCodec>() {
-            @Override
-            public EnumerationCodec call() throws Exception {
+        return () -> {
+            final BiMap<String, String> identifierToYang = BindingMapping.mapEnumAssignedNames(
+                enumSchema.getValues().stream().map(EnumPair::getName).collect(Collectors.toList())).inverse();
 
-                Map<String, Enum<?>> nameToValue = new HashMap<>();
-                for (Enum<?> enumValue : enumType.getEnumConstants()) {
-                    nameToValue.put(enumValue.toString(), enumValue);
-                }
-                Map<String, Enum<?>> yangNameToBinding = new HashMap<>();
-                for (EnumPair yangValue : enumSchema.getValues()) {
-                    final String bindingName = BindingMapping.getClassName(yangValue.getName());
-                    final Enum<?> bindingVal = nameToValue.get(bindingName);
-                    yangNameToBinding.put(yangValue.getName(), bindingVal);
-                }
-                return new EnumerationCodec(enumType, yangNameToBinding);
+            final Builder<String, Enum<?>> builder = ImmutableBiMap.builder();
+            for (Enum<?> enumValue : enumType.getEnumConstants()) {
+                final String yangName = identifierToYang.get(enumValue.name());
+                checkState(yangName != null, "Failed to find enumeration constant %s in mapping %s", enumValue,
+                        identifierToYang);
+                builder.put(yangName, enumValue);
             }
+
+            return new EnumerationCodec(enumType, builder.build());
         };
     }
 
     @Override
     public Object deserialize(final Object input) {
         Enum<?> value = yangValueToBinding.get(input);
-        Preconditions.checkArgument(value != null, "Invalid enumeration value %s. Valid values are %s", input,
+        checkArgument(value != null, "Invalid enumeration value %s. Valid values are %s", input,
                 yangValueToBinding.keySet());
         return value;
     }
 
     @Override
     public Object serialize(final Object input) {
-        Preconditions.checkArgument(getTypeClass().isInstance(input), "Input must be instance of %s", getTypeClass());
+        checkArgument(getTypeClass().isInstance(input), "Input must be instance of %s", getTypeClass());
         return yangValueToBinding.inverse().get(input);
     }
-
 }
\ No newline at end of file