+/*
+ * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
package org.opendaylight.yangtools.yang.data.impl.codec;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.util.Set;
-
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.BinaryTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.BooleanTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.DecimalTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.EmptyTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.IntegerTypeDefinition;
+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;
+
+public abstract class TypeDefinitionAwareCodec<J, T extends TypeDefinition<T>> implements DataStringCodec<J> {
+ private final Optional<T> typeDefinition;
+ private final Class<J> inputClass;
-import com.google.common.base.Joiner;
-import com.google.common.collect.ImmutableSet;
-
-import static org.opendaylight.yangtools.yang.model.util.BaseTypes.*;
-
-public abstract class TypeDefinitionAwareCodec<T> implements StringCodec<T> {
-
- private final TypeDefinition<?> typeDefinition;
- private final Class<T> inputClass;
-
- public Class<T> getInputClass() {
+ @Override
+ public Class<J> getInputClass() {
return inputClass;
}
- protected TypeDefinitionAwareCodec(TypeDefinition<?> typeDefinition, Class<T> 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;
}
- public TypeDefinition<?> getTypeDefinition() {
+ public Optional<T> getTypeDefinition() {
return typeDefinition;
}
- @Override
- public String serialize(T data) {
- return data.toString();
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ public static TypeDefinitionAwareCodec<Object, ? extends TypeDefinition<?>> from(final TypeDefinition typeDefinition) {
+ return (TypeDefinitionAwareCodec)fromType(typeDefinition);
}
- public static final TypeDefinitionAwareCodec<?> from(TypeDefinition<?> typeDefinition) {
- while(typeDefinition.getBaseType() != null) {
- typeDefinition = typeDefinition.getBaseType();
- }
-
- if (BINARY_QNAME.equals(typeDefinition.getQName())) {
- return new BinaryCodec(typeDefinition);
- }
- if (BITS_QNAME.equals(typeDefinition.getQName())) {
- return new BitsCodec(typeDefinition);
- }
- if (BOOLEAN_QNAME.equals(typeDefinition.getQName())) {
- return new BooleanCodec(typeDefinition);
- }
- if (DECIMAL64_QNAME.equals(typeDefinition.getQName())) {
- return new DecimalCodec(typeDefinition);
- }
- if (EMPTY_QNAME.equals(typeDefinition.getQName())) {
- return new EmptyCodec(typeDefinition);
- }
- if (ENUMERATION_QNAME.equals(typeDefinition.getQName())) {
- return new EnumCodec(typeDefinition);
- }
- if (INT8_QNAME.equals(typeDefinition.getQName())) {
- return new Int8Codec(typeDefinition);
- }
- if (INT16_QNAME.equals(typeDefinition.getQName())) {
- return new Int16Codec(typeDefinition);
- }
- if (INT32_QNAME.equals(typeDefinition.getQName())) {
- return new Int32Codec(typeDefinition);
- }
- if (INT64_QNAME.equals(typeDefinition.getQName())) {
- return new Int64Codec(typeDefinition);
- }
- if (STRING_QNAME.equals(typeDefinition.getQName())) {
- return new StringCodec(typeDefinition);
- }
- if (UINT8_QNAME.equals(typeDefinition.getQName())) {
- return new Uint8Codec(typeDefinition);
- }
- if (UINT16_QNAME.equals(typeDefinition.getQName())) {
- return new Uint16Codec(typeDefinition);
- }
- if (UINT32_QNAME.equals(typeDefinition.getQName())) {
- return new Uint32Codec(typeDefinition);
- }
- if (UINT64_QNAME.equals(typeDefinition.getQName())) {
- return new Uint64Codec(typeDefinition);
- }
- return null;
+ @SuppressWarnings("unchecked")
+ public static <T extends TypeDefinition<T>> TypeDefinitionAwareCodec<?, T> fromType(final T typeDefinition) {
+ @SuppressWarnings("rawtypes")
+ final TypeDefinitionAwareCodec codec;
+
+ if (typeDefinition instanceof BinaryTypeDefinition) {
+ codec = BinaryStringCodec.from((BinaryTypeDefinition)typeDefinition);
+ } else if (typeDefinition instanceof BitsTypeDefinition) {
+ codec = BitsStringCodec.from((BitsTypeDefinition)typeDefinition);
+ } else if (typeDefinition instanceof BooleanTypeDefinition) {
+ codec = BooleanStringCodec.from((BooleanTypeDefinition)typeDefinition);
+ } else if (typeDefinition instanceof DecimalTypeDefinition) {
+ codec = DecimalStringCodec.from((DecimalTypeDefinition)typeDefinition);
+ } else if (typeDefinition instanceof EmptyTypeDefinition) {
+ codec = EmptyStringCodec.INSTANCE;
+ } else if (typeDefinition instanceof EnumTypeDefinition) {
+ codec = EnumStringCodec.from((EnumTypeDefinition)typeDefinition);
+ } else if (typeDefinition instanceof IntegerTypeDefinition) {
+ codec = AbstractIntegerStringCodec.from((IntegerTypeDefinition) typeDefinition);
+ } else if (typeDefinition instanceof StringTypeDefinition) {
+ codec = StringStringCodec.from((StringTypeDefinition)typeDefinition);
+ } else if (typeDefinition instanceof UnionTypeDefinition) {
+ codec = UnionStringCodec.from((UnionTypeDefinition)typeDefinition);
+ } else if (typeDefinition instanceof UnsignedIntegerTypeDefinition) {
+ codec = AbstractIntegerStringCodec.from((UnsignedIntegerTypeDefinition) typeDefinition);
+ } else {
+ codec = null;
+ }
+ return codec;
}
-
- public static class BooleanCodec extends TypeDefinitionAwareCodec<Boolean> {
-
- protected BooleanCodec(TypeDefinition<?> typeDefinition) {
- super(typeDefinition, Boolean.class);
- }
-
- @Override
- public String serialize(Boolean data) {
- return data.toString();
- }
-
- @Override
- public Boolean deserialize(String stringRepresentation) {
- return Boolean.parseBoolean(stringRepresentation);
- }
- };
-
- public static class Uint8Codec extends TypeDefinitionAwareCodec<Short> {
-
- protected Uint8Codec(TypeDefinition<?> typeDefinition) {
- super(typeDefinition, Short.class);
- }
-
- @Override
- public String serialize(Short data) {
- return data.toString();
- }
-
- @Override
- public Short deserialize(String stringRepresentation) {
- return Short.parseShort(stringRepresentation);
- }
- };
-
- public static class Uint16Codec extends TypeDefinitionAwareCodec<Integer> {
- protected Uint16Codec(TypeDefinition<?> typeDefinition) {
- super(typeDefinition, Integer.class);
- }
-
- @Override
- public Integer deserialize(String stringRepresentation) {
- return Integer.parseInt(stringRepresentation);
- }
- };
-
- public static class Uint32Codec extends TypeDefinitionAwareCodec<Long> {
-
- protected Uint32Codec(TypeDefinition<?> typeDefinition) {
- super(typeDefinition, Long.class);
- }
-
- @Override
- public Long deserialize(String stringRepresentation) {
- return Long.parseLong(stringRepresentation);
- }
- };
-
- public static class Uint64Codec extends TypeDefinitionAwareCodec<BigInteger> {
-
- protected Uint64Codec(TypeDefinition<?> typeDefinition) {
- super(typeDefinition, BigInteger.class);
- }
-
- @Override
- public BigInteger deserialize(String stringRepresentation) {
- // FIXME: Implement codec correctly
- return BigInteger.valueOf(Long.valueOf(stringRepresentation));
- }
- };
-
- public static class StringCodec extends TypeDefinitionAwareCodec<String> {
-
- protected StringCodec(TypeDefinition<?> typeDefinition) {
- super(typeDefinition, String.class);
- }
-
- @Override
- public String deserialize(String stringRepresentation) {
- return stringRepresentation;
- }
- };
-
- public static class Int16Codec extends TypeDefinitionAwareCodec<Short> {
-
- protected Int16Codec(TypeDefinition<?> typeDefinition) {
- super(typeDefinition, Short.class);
- }
-
- @Override
- public Short deserialize(String stringRepresentation) {
- return Short.valueOf(stringRepresentation);
- }
- };
-
- public static class Int32Codec extends TypeDefinitionAwareCodec<Integer> {
-
- protected Int32Codec(TypeDefinition<?> typeDefinition) {
- super(typeDefinition, Integer.class);
- }
-
- @Override
- public Integer deserialize(String stringRepresentation) {
- return Integer.valueOf(stringRepresentation);
- }
- };
-
- public static class Int64Codec extends TypeDefinitionAwareCodec<Long> {
-
- protected Int64Codec(TypeDefinition<?> typeDefinition) {
- super(typeDefinition, Long.class);
- }
-
- @Override
- public Long deserialize(String stringRepresentation) {
- return Long.parseLong(stringRepresentation);
- }
- };
-
- public static class Int8Codec extends TypeDefinitionAwareCodec<Byte> {
-
- protected Int8Codec(TypeDefinition<?> typeDefinition) {
- super(typeDefinition, Byte.class);
- }
-
- @Override
- public Byte deserialize(String stringRepresentation) {
- return Byte.parseByte(stringRepresentation);
- }
- };
-
- public static class EmptyCodec extends TypeDefinitionAwareCodec<Void> {
-
- protected EmptyCodec(TypeDefinition<?> typeDefinition) {
- super(typeDefinition, Void.class);
- }
-
- @Override
- public String serialize(Void data) {
- return "";
- }
-
- @Override
- public Void deserialize(String stringRepresentation) {
- return null;
- }
- };
-
- public static final class BinaryCodec extends TypeDefinitionAwareCodec<byte[]> {
-
- protected BinaryCodec(TypeDefinition<?> typeDefinition) {
- super(typeDefinition, byte[].class);
- }
-
- @Override
- public String serialize(byte[] data) {
- // FIXME By YANG Spec
- return null;
- }
-
- @Override
- public byte[] deserialize(String stringRepresentation) {
- // FIXME By YANG Spec
- return null;
- }
- };
-
- public static final class BitsCodec extends TypeDefinitionAwareCodec<Set<String>> {
-
- @SuppressWarnings("unchecked")
- protected BitsCodec(TypeDefinition<?> typeDefinition) {
- super(typeDefinition, (Class<Set<String>>) ((Class<?>) Set.class));
- }
-
- @Override
- public String serialize(Set<String> data) {
- return Joiner.on(" ").join(data).toString();
- }
-
- @Override
- public Set<String> deserialize(String stringRepresentation) {
- String[] strings = stringRepresentation.split(" ");
- return ImmutableSet.copyOf(strings);
- }
- };
-
- public static class EnumCodec extends TypeDefinitionAwareCodec<String> {
-
- protected EnumCodec(TypeDefinition<?> typeDefinition) {
- super(typeDefinition, String.class);
- }
-
- @Override
- public String deserialize(String stringRepresentation) {
- return stringRepresentation;
- }
- };
-
- public static class DecimalCodec extends TypeDefinitionAwareCodec<BigDecimal> {
-
- protected DecimalCodec(TypeDefinition<?> typeDefinition) {
- super(typeDefinition, BigDecimal.class);
- }
-
- @Override
- public String serialize(BigDecimal data) {
- return data.toString();
- }
-
- @Override
- public BigDecimal deserialize(String stringRepresentation) {
- return new BigDecimal(stringRepresentation);
- }
- };
}