Bug 762: Fixed accidental type change for union. 09/8509/3
authorTony Tkacik <ttkacik@cisco.com>
Tue, 1 Jul 2014 16:51:57 +0000 (18:51 +0200)
committerTony Tkacik <ttkacik@cisco.com>
Tue, 1 Jul 2014 16:58:04 +0000 (18:58 +0200)
Previous patch used Java type derived from
subtypes from typedefinition, but most
of DOM code base were expecting string,
since in some cases it is hard to decide
between two subtypes.

Change-Id: I04355037047e742dc1e2a044dd7a5c48bc0dc0b7
Signed-off-by: Tony Tkacik <ttkacik@cisco.com>
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/TypeDefinitionAwareCodec.java
yang/yang-data-impl/src/test/java/org/opendaylight/yangtools/yang/data/impl/test/codecs/UnionCodecStringTest.java

index ce8c5bbd2b3c15e07bf2210c0c382d3b3649ef0c..914ffa7c68f55ad595404766fea53a1e7d5dbabf 100644 (file)
@@ -162,7 +162,7 @@ public abstract class TypeDefinitionAwareCodec<J, T extends TypeDefinition<T>> i
         return inputClass;
     }
 
-    protected TypeDefinitionAwareCodec(Optional<T> typeDefinition, Class<J> outputClass) {
+    protected TypeDefinitionAwareCodec(final Optional<T> typeDefinition, final Class<J> outputClass) {
         Preconditions.checkArgument(outputClass != null, "Output class must be specified.");
         this.typeDefinition = typeDefinition;
         this.inputClass = outputClass;
@@ -173,12 +173,12 @@ public abstract class TypeDefinitionAwareCodec<J, T extends TypeDefinition<T>> i
     }
 
     @SuppressWarnings({ "rawtypes", "unchecked" })
-    public static final TypeDefinitionAwareCodec<Object, ? extends TypeDefinition<?>> from(TypeDefinition typeDefinition) {
+    public static final TypeDefinitionAwareCodec<Object, ? extends TypeDefinition<?>> from(final TypeDefinition typeDefinition) {
         return fromType(typeDefinition);
     }
 
     @SuppressWarnings("unchecked")
-    public static final <T extends TypeDefinition<T>> TypeDefinitionAwareCodec<?, T> fromType(T typeDefinition) {
+    public static final <T extends TypeDefinition<T>> TypeDefinitionAwareCodec<?, T> fromType(final T typeDefinition) {
         T superType = typeDefinition;
         while (superType.getBaseType() != null) {
             superType = superType.getBaseType();
@@ -234,17 +234,17 @@ public abstract class TypeDefinitionAwareCodec<J, T extends TypeDefinition<T>> i
     public static class BooleanCodecStringImpl extends TypeDefinitionAwareCodec<Boolean, BooleanTypeDefinition>
             implements BooleanCodec<String> {
 
-        protected BooleanCodecStringImpl(Optional<BooleanTypeDefinition> typeDef) {
+        protected BooleanCodecStringImpl(final Optional<BooleanTypeDefinition> typeDef) {
             super(typeDef, Boolean.class);
         }
 
         @Override
-        public String serialize(Boolean data) {
+        public String serialize(final Boolean data) {
             return data == null ? "" : data.toString();
         }
 
         @Override
-        public Boolean deserialize(String stringRepresentation) {
+        public Boolean deserialize(final String stringRepresentation) {
             return Boolean.valueOf(stringRepresentation);
         }
     };
@@ -252,17 +252,17 @@ public abstract class TypeDefinitionAwareCodec<J, T extends TypeDefinition<T>> i
     public static class Uint8CodecStringImpl extends TypeDefinitionAwareCodec<Short, UnsignedIntegerTypeDefinition>
             implements Uint8Codec<String> {
 
-        protected Uint8CodecStringImpl(Optional<UnsignedIntegerTypeDefinition> typeDef) {
+        protected Uint8CodecStringImpl(final Optional<UnsignedIntegerTypeDefinition> typeDef) {
             super(typeDef, Short.class);
         }
 
         @Override
-        public String serialize(Short data) {
+        public String serialize(final Short data) {
             return data == null ? "" : data.toString();
         }
 
         @Override
-        public Short deserialize(String stringRepresentation) {
+        public Short deserialize(final String stringRepresentation) {
             int base = provideBase(stringRepresentation);
             if (base == 16) {
                 return Short.valueOf(normalizeHexadecimal(stringRepresentation), base);
@@ -273,12 +273,12 @@ public abstract class TypeDefinitionAwareCodec<J, T extends TypeDefinition<T>> i
 
     public static class Uint16CodecStringImpl extends TypeDefinitionAwareCodec<Integer, UnsignedIntegerTypeDefinition>
             implements Uint16Codec<String> {
-        protected Uint16CodecStringImpl(Optional<UnsignedIntegerTypeDefinition> typeDef) {
+        protected Uint16CodecStringImpl(final Optional<UnsignedIntegerTypeDefinition> typeDef) {
             super(typeDef, Integer.class);
         }
 
         @Override
-        public Integer deserialize(String stringRepresentation) {
+        public Integer deserialize(final String stringRepresentation) {
             int base = provideBase(stringRepresentation);
             if (base == 16) {
                 return Integer.valueOf(normalizeHexadecimal(stringRepresentation), base);
@@ -287,7 +287,7 @@ public abstract class TypeDefinitionAwareCodec<J, T extends TypeDefinition<T>> i
         }
 
         @Override
-        public String serialize(Integer data) {
+        public String serialize(final Integer data) {
             return data == null ? "" : data.toString();
         }
     };
@@ -295,12 +295,12 @@ public abstract class TypeDefinitionAwareCodec<J, T extends TypeDefinition<T>> i
     public static class Uint32CodecStringImpl extends TypeDefinitionAwareCodec<Long, UnsignedIntegerTypeDefinition>
             implements Uint32Codec<String> {
 
-        protected Uint32CodecStringImpl(Optional<UnsignedIntegerTypeDefinition> typeDef) {
+        protected Uint32CodecStringImpl(final Optional<UnsignedIntegerTypeDefinition> typeDef) {
             super(typeDef, Long.class);
         }
 
         @Override
-        public Long deserialize(String stringRepresentation) {
+        public Long deserialize(final String stringRepresentation) {
             int base = provideBase(stringRepresentation);
             if (base == 16) {
                 return Long.valueOf(normalizeHexadecimal(stringRepresentation), base);
@@ -309,7 +309,7 @@ public abstract class TypeDefinitionAwareCodec<J, T extends TypeDefinition<T>> i
         }
 
         @Override
-        public String serialize(Long data) {
+        public String serialize(final Long data) {
             return data == null ? "" : data.toString();
         }
     };
@@ -317,12 +317,12 @@ public abstract class TypeDefinitionAwareCodec<J, T extends TypeDefinition<T>> i
     public static class Uint64CodecStringImpl extends
             TypeDefinitionAwareCodec<BigInteger, UnsignedIntegerTypeDefinition> implements Uint64Codec<String> {
 
-        protected Uint64CodecStringImpl(Optional<UnsignedIntegerTypeDefinition> typeDef) {
+        protected Uint64CodecStringImpl(final Optional<UnsignedIntegerTypeDefinition> typeDef) {
             super(typeDef, BigInteger.class);
         }
 
         @Override
-        public BigInteger deserialize(String stringRepresentation) {
+        public BigInteger deserialize(final String stringRepresentation) {
             int base = provideBase(stringRepresentation);
             if (base == 16) {
                 return new BigInteger(normalizeHexadecimal(stringRepresentation), base);
@@ -331,7 +331,7 @@ public abstract class TypeDefinitionAwareCodec<J, T extends TypeDefinition<T>> i
         }
 
         @Override
-        public String serialize(BigInteger data) {
+        public String serialize(final BigInteger data) {
             return data == null ? "" : data.toString();
         }
     };
@@ -339,17 +339,17 @@ public abstract class TypeDefinitionAwareCodec<J, T extends TypeDefinition<T>> i
     public static class StringCodecStringImpl extends TypeDefinitionAwareCodec<String, StringTypeDefinition> implements
             StringCodec<String> {
 
-        protected StringCodecStringImpl(Optional<StringTypeDefinition> typeDef) {
+        protected StringCodecStringImpl(final Optional<StringTypeDefinition> typeDef) {
             super(typeDef, String.class);
         }
 
         @Override
-        public String deserialize(String stringRepresentation) {
+        public String deserialize(final String stringRepresentation) {
             return stringRepresentation == null ? "" :stringRepresentation;
         }
 
         @Override
-        public String serialize(String data) {
+        public String serialize(final String data) {
             return data == null ? "" : data.toString();
         }
     };
@@ -357,12 +357,12 @@ public abstract class TypeDefinitionAwareCodec<J, T extends TypeDefinition<T>> i
     public static class Int16CodecStringImpl extends TypeDefinitionAwareCodec<Short, IntegerTypeDefinition> implements
             Int16Codec<String> {
 
-        protected Int16CodecStringImpl(Optional<IntegerTypeDefinition> typeDef) {
+        protected Int16CodecStringImpl(final Optional<IntegerTypeDefinition> typeDef) {
             super(typeDef, Short.class);
         }
 
         @Override
-        public Short deserialize(String stringRepresentation) {
+        public Short deserialize(final String stringRepresentation) {
             int base = provideBase(stringRepresentation);
             if (base == 16) {
                 return Short.valueOf(normalizeHexadecimal(stringRepresentation), base);
@@ -371,7 +371,7 @@ public abstract class TypeDefinitionAwareCodec<J, T extends TypeDefinition<T>> i
         }
 
         @Override
-        public String serialize(Short data) {
+        public String serialize(final Short data) {
             return data == null ? "" : data.toString();
         }
     };
@@ -379,12 +379,12 @@ public abstract class TypeDefinitionAwareCodec<J, T extends TypeDefinition<T>> i
     public static class Int32CodecStringImpl extends TypeDefinitionAwareCodec<Integer, IntegerTypeDefinition> implements
             Int32Codec<String> {
 
-        protected Int32CodecStringImpl(Optional<IntegerTypeDefinition> typeDef) {
+        protected Int32CodecStringImpl(final Optional<IntegerTypeDefinition> typeDef) {
             super(typeDef, Integer.class);
         }
 
         @Override
-        public Integer deserialize(String stringRepresentation) {
+        public Integer deserialize(final String stringRepresentation) {
             int base = provideBase(stringRepresentation);
             if (base == 16) {
                 return Integer.valueOf(normalizeHexadecimal(stringRepresentation), base);
@@ -393,7 +393,7 @@ public abstract class TypeDefinitionAwareCodec<J, T extends TypeDefinition<T>> i
         }
 
         @Override
-        public String serialize(Integer data) {
+        public String serialize(final Integer data) {
             return data == null ? "" : data.toString();
         }
     };
@@ -401,12 +401,12 @@ public abstract class TypeDefinitionAwareCodec<J, T extends TypeDefinition<T>> i
     public static class Int64CodecStringImpl extends TypeDefinitionAwareCodec<Long, IntegerTypeDefinition> implements
             Int64Codec<String> {
 
-        protected Int64CodecStringImpl(Optional<IntegerTypeDefinition> typeDef) {
+        protected Int64CodecStringImpl(final Optional<IntegerTypeDefinition> typeDef) {
             super(typeDef, Long.class);
         }
 
         @Override
-        public Long deserialize(String stringRepresentation) {
+        public Long deserialize(final String stringRepresentation) {
             int base = provideBase(stringRepresentation);
             if (base == 16) {
                 return Long.valueOf(normalizeHexadecimal(stringRepresentation), base);
@@ -415,7 +415,7 @@ public abstract class TypeDefinitionAwareCodec<J, T extends TypeDefinition<T>> i
         }
 
         @Override
-        public String serialize(Long data) {
+        public String serialize(final Long data) {
             return data == null ? "" : data.toString();
         }
     };
@@ -423,12 +423,12 @@ public abstract class TypeDefinitionAwareCodec<J, T extends TypeDefinition<T>> i
     public static class Int8CodecStringImpl extends TypeDefinitionAwareCodec<Byte, IntegerTypeDefinition> implements
             Int8Codec<String> {
 
-        protected Int8CodecStringImpl(Optional<IntegerTypeDefinition> typeDef) {
+        protected Int8CodecStringImpl(final Optional<IntegerTypeDefinition> typeDef) {
             super(typeDef, Byte.class);
         }
 
         @Override
-        public Byte deserialize(String stringRepresentation) {
+        public Byte deserialize(final String stringRepresentation) {
             int base = provideBase(stringRepresentation);
             if (base == 16) {
                 return Byte.valueOf(normalizeHexadecimal(stringRepresentation), base);
@@ -437,7 +437,7 @@ public abstract class TypeDefinitionAwareCodec<J, T extends TypeDefinition<T>> i
         }
 
         @Override
-        public String serialize(Byte data) {
+        public String serialize(final Byte data) {
             return data == null ? "" : data.toString();
         }
     };
@@ -445,17 +445,17 @@ public abstract class TypeDefinitionAwareCodec<J, T extends TypeDefinition<T>> i
     public static class EmptyCodecStringImpl extends TypeDefinitionAwareCodec<Void, EmptyTypeDefinition> implements
             EmptyCodec<String> {
 
-        protected EmptyCodecStringImpl(Optional<EmptyTypeDefinition> typeDef) {
+        protected EmptyCodecStringImpl(final Optional<EmptyTypeDefinition> typeDef) {
             super(typeDef, Void.class);
         }
 
         @Override
-        public String serialize(Void data) {
+        public String serialize(final Void data) {
             return "";
         }
 
         @Override
-        public Void deserialize(String stringRepresentation) {
+        public Void deserialize(final String stringRepresentation) {
             Preconditions.checkArgument( Strings.isNullOrEmpty( stringRepresentation ),
                                          "The value must be empty" );
             return null;
@@ -465,17 +465,17 @@ public abstract class TypeDefinitionAwareCodec<J, T extends TypeDefinition<T>> i
     public static final class BinaryCodecStringImpl extends TypeDefinitionAwareCodec<byte[], BinaryTypeDefinition>
             implements BinaryCodec<String> {
 
-        protected BinaryCodecStringImpl(Optional<BinaryTypeDefinition> typeDef) {
+        protected BinaryCodecStringImpl(final Optional<BinaryTypeDefinition> typeDef) {
             super(typeDef, byte[].class);
         }
 
         @Override
-        public String serialize(byte[] data) {
+        public String serialize(final byte[] data) {
             return data == null ? "" : BaseEncoding.base64().encode(data);
         }
 
         @Override
-        public byte[] deserialize(String stringRepresentation) {
+        public byte[] deserialize(final String stringRepresentation) {
             return stringRepresentation == null ? null :
                                          BaseEncoding.base64().decode(stringRepresentation);
         }
@@ -488,17 +488,17 @@ public abstract class TypeDefinitionAwareCodec<J, T extends TypeDefinition<T>> i
         public static final Splitter SPLITTER = Splitter.on(' ').omitEmptyStrings().trimResults();
 
         @SuppressWarnings("unchecked")
-        protected BitsCodecStringImpl(Optional<BitsTypeDefinition> typeDef) {
+        protected BitsCodecStringImpl(final Optional<BitsTypeDefinition> typeDef) {
             super(typeDef, (Class<Set<String>>) ((Class<?>) Set.class));
         }
 
         @Override
-        public String serialize(Set<String> data) {
+        public String serialize(final Set<String> data) {
             return data == null ? "" : JOINER.join(data);
         }
 
         @Override
-        public Set<String> deserialize(String stringRepresentation) {
+        public Set<String> deserialize(final String stringRepresentation) {
             if (stringRepresentation == null) {
                 return ImmutableSet.of();
             }
@@ -527,12 +527,12 @@ public abstract class TypeDefinitionAwareCodec<J, T extends TypeDefinition<T>> i
     public static class EnumCodecStringImpl extends TypeDefinitionAwareCodec<String, EnumTypeDefinition> implements
             EnumCodec<String> {
 
-        protected EnumCodecStringImpl(Optional<EnumTypeDefinition> typeDef) {
+        protected EnumCodecStringImpl(final Optional<EnumTypeDefinition> typeDef) {
             super(typeDef, String.class);
         }
 
         @Override
-        public String deserialize(String stringRepresentation) {
+        public String deserialize(final String stringRepresentation) {
             if( getTypeDefinition().isPresent() ) {
                 Set<String> allowedNames = Sets.newHashSet();
                 for( EnumPair pair: getTypeDefinition().get().getValues() ) {
@@ -550,7 +550,7 @@ public abstract class TypeDefinitionAwareCodec<J, T extends TypeDefinition<T>> i
         }
 
         @Override
-        public String serialize(String data) {
+        public String serialize(final String data) {
             return data == null ? "" : data;
         }
     };
@@ -558,17 +558,17 @@ public abstract class TypeDefinitionAwareCodec<J, T extends TypeDefinition<T>> i
     public static class DecimalCodecStringImpl extends TypeDefinitionAwareCodec<BigDecimal, DecimalTypeDefinition>
             implements DecimalCodec<String> {
 
-        protected DecimalCodecStringImpl(Optional<DecimalTypeDefinition> typeDef) {
+        protected DecimalCodecStringImpl(final Optional<DecimalTypeDefinition> typeDef) {
             super(typeDef, BigDecimal.class);
         }
 
         @Override
-        public String serialize(BigDecimal data) {
+        public String serialize(final BigDecimal data) {
             return data == null ? "" : data.toString();
         }
 
         @Override
-        public BigDecimal deserialize(String stringRepresentation) {
+        public BigDecimal deserialize(final String stringRepresentation) {
             Preconditions.checkArgument( stringRepresentation != null , "Input cannot be null" );
             return new BigDecimal(stringRepresentation);
         }
@@ -577,18 +577,17 @@ public abstract class TypeDefinitionAwareCodec<J, T extends TypeDefinition<T>> i
     public static class UnionCodecStringImpl extends TypeDefinitionAwareCodec<Object, UnionTypeDefinition> implements
             UnionCodec<String> {
 
-        protected UnionCodecStringImpl(Optional<UnionTypeDefinition> typeDef) {
+        protected UnionCodecStringImpl(final Optional<UnionTypeDefinition> typeDef) {
             super(typeDef, Object.class);
         }
 
         @Override
-        public String serialize(Object data) {
+        public String serialize(final Object data) {
             return data == null ? "" : data.toString();
         }
 
         @Override
-        public Object deserialize(String stringRepresentation) {
-            Object returnValue = stringRepresentation;
+        public Object deserialize(final String stringRepresentation) {
             if( getTypeDefinition().isPresent() ) {
                 boolean valid = false;
                 for( TypeDefinition<?> type: getTypeDefinition().get().getTypes() ) {
@@ -601,7 +600,7 @@ public abstract class TypeDefinitionAwareCodec<J, T extends TypeDefinition<T>> i
                     }
 
                     try {
-                        returnValue = typeAwareCodec.deserialize( stringRepresentation );
+                        typeAwareCodec.deserialize( stringRepresentation );
                         valid = true;
                         break;
                     }
@@ -616,7 +615,7 @@ public abstract class TypeDefinitionAwareCodec<J, T extends TypeDefinition<T>> i
                 }
             }
 
-            return returnValue;
+            return stringRepresentation;
         }
     };
 }
index 6d4bf775b38bba1e2f0a26c1991b85b53fa2e429..1e01e76415796ac374f372da31226e109d206128 100644 (file)
@@ -9,14 +9,12 @@
 package org.opendaylight.yangtools.yang.data.impl.test.codecs;
 
 import static org.junit.Assert.assertEquals;
-
-import org.junit.Test;
-
-import static org.opendaylight.yangtools.yang.data.impl.test.codecs.TypeDefinitionAwareCodecTestHelper.getCodec;
 import static org.opendaylight.yangtools.yang.data.impl.test.codecs.TypeDefinitionAwareCodecTestHelper.deserializeWithExpectedIllegalArgEx;
+import static org.opendaylight.yangtools.yang.data.impl.test.codecs.TypeDefinitionAwareCodecTestHelper.getCodec;
 import static org.opendaylight.yangtools.yang.data.impl.test.codecs.TypeDefinitionAwareCodecTestHelper.toEnumTypeDefinition;
 import static org.opendaylight.yangtools.yang.data.impl.test.codecs.TypeDefinitionAwareCodecTestHelper.toUnionTypeDefinition;
 
+import org.junit.Test;
 import org.opendaylight.yangtools.yang.data.api.codec.UnionCodec;
 import org.opendaylight.yangtools.yang.model.util.EmptyType;
 import org.opendaylight.yangtools.yang.model.util.Int32;
@@ -57,10 +55,10 @@ public class UnionCodecStringTest {
                       UnionCodec.class);
 
         assertEquals( "deserialize", "enum1", codec.deserialize( "enum1" ) );
-        assertEquals( "deserialize", Integer.valueOf( 123 ), codec.deserialize( "123" ) );
-        assertEquals( "deserialize", Integer.valueOf( -123 ), codec.deserialize( "-123" ) );
-        assertEquals( "deserialize", Long.valueOf( 41234567890L ), codec.deserialize( "41234567890" ) );
-        assertEquals( "deserialize", null, codec.deserialize( "" ) );
+        assertEquals( "deserialize", "123", codec.deserialize( "123" ) );
+        assertEquals( "deserialize", "-123", codec.deserialize( "-123" ) );
+        assertEquals( "deserialize", "41234567890", codec.deserialize( "41234567890" ) );
+        assertEquals( "deserialize", "", codec.deserialize( "" ) );
         assertEquals( "deserialize", null, codec.deserialize( null ) );
 
         deserializeWithExpectedIllegalArgEx( codec, "enum3" );