BUG-1275: optimize TypeDefinitionAwareCodec.normalizeHexadecimal()
[yangtools.git] / yang / yang-data-impl / src / main / java / org / opendaylight / yangtools / yang / data / impl / codec / TypeDefinitionAwareCodec.java
index ce8c5bbd2b3c15e07bf2210c0c382d3b3649ef0c..571e7e0daf653aa0437b904af35a7e9783693166 100644 (file)
@@ -16,6 +16,16 @@ import static org.opendaylight.yangtools.yang.model.util.BaseTypes.UINT32_QNAME;
 import static org.opendaylight.yangtools.yang.model.util.BaseTypes.UINT64_QNAME;
 import static org.opendaylight.yangtools.yang.model.util.BaseTypes.UINT8_QNAME;
 
+import com.google.common.base.CharMatcher;
+import com.google.common.base.Joiner;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import com.google.common.base.Splitter;
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
+import com.google.common.io.BaseEncoding;
+
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.util.Set;
@@ -51,21 +61,15 @@ import org.opendaylight.yangtools.yang.model.api.type.StringTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.type.UnsignedIntegerTypeDefinition;
 
-import com.google.common.base.Joiner;
-import com.google.common.base.Optional;
-import com.google.common.base.Preconditions;
-import com.google.common.base.Splitter;
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Sets;
-import com.google.common.io.BaseEncoding;
-
 public abstract class TypeDefinitionAwareCodec<J, T extends TypeDefinition<T>> implements DataStringCodec<J> {
 
     private static final Pattern intPattern = Pattern.compile("[+-]?[1-9][0-9]*$");
     private static final Pattern hexPattern = Pattern.compile("[+-]?0[xX][0-9a-fA-F]+");
     private static final Pattern octalPattern = Pattern.compile("[+-]?0[1-7][0-7]*$");
 
+    // For up to two characters, this is very fast
+    private static final CharMatcher X_MATCHER = CharMatcher.anyOf("xX");
+
     private final Optional<T> typeDefinition;
     private final Class<J> inputClass;
 
@@ -107,15 +111,8 @@ public abstract class TypeDefinitionAwareCodec<J, T extends TypeDefinition<T>> i
             throw new IllegalArgumentException(
                     "String representing integer number in Hexadecimal format cannot be NULL!");
         }
-        final String normalizedString;
-        if (hexInt.contains("x")) {
-            normalizedString = hexInt.replace("x", "");
-        } else if (hexInt.contains("X")) {
-            normalizedString = hexInt.replace("X", "");
-        } else {
-            normalizedString = hexInt;
-        }
-        return normalizedString;
+
+        return X_MATCHER.removeFrom(hexInt);
     }
 
     private static final BinaryCodecStringImpl BINARY_DEFAULT_CODEC = new BinaryCodecStringImpl(
@@ -162,7 +159,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 +170,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 +231,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 +249,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 +270,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 +284,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 +292,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 +306,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 +314,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 +328,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 +336,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 +354,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 +368,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 +376,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 +390,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 +398,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 +412,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 +420,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 +434,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 +442,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 +462,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 +485,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 +524,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 +547,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 +555,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 +574,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 +597,7 @@ public abstract class TypeDefinitionAwareCodec<J, T extends TypeDefinition<T>> i
                     }
 
                     try {
-                        returnValue = typeAwareCodec.deserialize( stringRepresentation );
+                        typeAwareCodec.deserialize( stringRepresentation );
                         valid = true;
                         break;
                     }
@@ -616,7 +612,7 @@ public abstract class TypeDefinitionAwareCodec<J, T extends TypeDefinition<T>> i
                 }
             }
 
-            return returnValue;
+            return stringRepresentation;
         }
     };
 }