1 package org.opendaylight.yangtools.yang.data.impl.codec;
3 import java.math.BigDecimal;
4 import java.math.BigInteger;
7 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
9 import com.google.common.base.Joiner;
10 import com.google.common.collect.ImmutableSet;
12 import static org.opendaylight.yangtools.yang.model.util.BaseTypes.*;
14 public abstract class TypeDefinitionAwareCodec<T> implements StringCodec<T> {
16 private final TypeDefinition<?> typeDefinition;
17 private final Class<T> inputClass;
19 public Class<T> getInputClass() {
23 protected TypeDefinitionAwareCodec(TypeDefinition<?> typeDefinition, Class<T> outputClass) {
24 this.typeDefinition = typeDefinition;
25 this.inputClass = outputClass;
28 public TypeDefinition<?> getTypeDefinition() {
29 return typeDefinition;
33 public String serialize(T data) {
34 return data.toString();
37 public static final TypeDefinitionAwareCodec<?> from(TypeDefinition<?> typeDefinition) {
38 while(typeDefinition.getBaseType() != null) {
39 typeDefinition = typeDefinition.getBaseType();
42 if (BINARY_QNAME.equals(typeDefinition.getQName())) {
43 return new BinaryCodec(typeDefinition);
45 if (BITS_QNAME.equals(typeDefinition.getQName())) {
46 return new BitsCodec(typeDefinition);
48 if (BOOLEAN_QNAME.equals(typeDefinition.getQName())) {
49 return new BooleanCodec(typeDefinition);
51 if (DECIMAL64_QNAME.equals(typeDefinition.getQName())) {
52 return new DecimalCodec(typeDefinition);
54 if (EMPTY_QNAME.equals(typeDefinition.getQName())) {
55 return new EmptyCodec(typeDefinition);
57 if (ENUMERATION_QNAME.equals(typeDefinition.getQName())) {
58 return new EnumCodec(typeDefinition);
60 if (INT8_QNAME.equals(typeDefinition.getQName())) {
61 return new Int8Codec(typeDefinition);
63 if (INT16_QNAME.equals(typeDefinition.getQName())) {
64 return new Int16Codec(typeDefinition);
66 if (INT32_QNAME.equals(typeDefinition.getQName())) {
67 return new Int32Codec(typeDefinition);
69 if (INT64_QNAME.equals(typeDefinition.getQName())) {
70 return new Int64Codec(typeDefinition);
72 if (STRING_QNAME.equals(typeDefinition.getQName())) {
73 return new StringCodec(typeDefinition);
75 if (UINT8_QNAME.equals(typeDefinition.getQName())) {
76 return new Uint8Codec(typeDefinition);
78 if (UINT16_QNAME.equals(typeDefinition.getQName())) {
79 return new Uint16Codec(typeDefinition);
81 if (UINT32_QNAME.equals(typeDefinition.getQName())) {
82 return new Uint32Codec(typeDefinition);
84 if (UINT64_QNAME.equals(typeDefinition.getQName())) {
85 return new Uint64Codec(typeDefinition);
90 public static class BooleanCodec extends TypeDefinitionAwareCodec<Boolean> {
92 protected BooleanCodec(TypeDefinition<?> typeDefinition) {
93 super(typeDefinition, Boolean.class);
97 public String serialize(Boolean data) {
98 return data.toString();
102 public Boolean deserialize(String stringRepresentation) {
103 return Boolean.parseBoolean(stringRepresentation);
107 public static class Uint8Codec extends TypeDefinitionAwareCodec<Short> {
109 protected Uint8Codec(TypeDefinition<?> typeDefinition) {
110 super(typeDefinition, Short.class);
114 public String serialize(Short data) {
115 return data.toString();
119 public Short deserialize(String stringRepresentation) {
120 return Short.parseShort(stringRepresentation);
124 public static class Uint16Codec extends TypeDefinitionAwareCodec<Integer> {
125 protected Uint16Codec(TypeDefinition<?> typeDefinition) {
126 super(typeDefinition, Integer.class);
130 public Integer deserialize(String stringRepresentation) {
131 return Integer.parseInt(stringRepresentation);
135 public static class Uint32Codec extends TypeDefinitionAwareCodec<Long> {
137 protected Uint32Codec(TypeDefinition<?> typeDefinition) {
138 super(typeDefinition, Long.class);
142 public Long deserialize(String stringRepresentation) {
143 return Long.parseLong(stringRepresentation);
147 public static class Uint64Codec extends TypeDefinitionAwareCodec<BigInteger> {
149 protected Uint64Codec(TypeDefinition<?> typeDefinition) {
150 super(typeDefinition, BigInteger.class);
154 public BigInteger deserialize(String stringRepresentation) {
155 // FIXME: Implement codec correctly
156 return BigInteger.valueOf(Long.valueOf(stringRepresentation));
160 public static class StringCodec extends TypeDefinitionAwareCodec<String> {
162 protected StringCodec(TypeDefinition<?> typeDefinition) {
163 super(typeDefinition, String.class);
167 public String deserialize(String stringRepresentation) {
168 return stringRepresentation;
172 public static class Int16Codec extends TypeDefinitionAwareCodec<Short> {
174 protected Int16Codec(TypeDefinition<?> typeDefinition) {
175 super(typeDefinition, Short.class);
179 public Short deserialize(String stringRepresentation) {
180 return Short.valueOf(stringRepresentation);
184 public static class Int32Codec extends TypeDefinitionAwareCodec<Integer> {
186 protected Int32Codec(TypeDefinition<?> typeDefinition) {
187 super(typeDefinition, Integer.class);
191 public Integer deserialize(String stringRepresentation) {
192 return Integer.valueOf(stringRepresentation);
196 public static class Int64Codec extends TypeDefinitionAwareCodec<Long> {
198 protected Int64Codec(TypeDefinition<?> typeDefinition) {
199 super(typeDefinition, Long.class);
203 public Long deserialize(String stringRepresentation) {
204 return Long.parseLong(stringRepresentation);
208 public static class Int8Codec extends TypeDefinitionAwareCodec<Byte> {
210 protected Int8Codec(TypeDefinition<?> typeDefinition) {
211 super(typeDefinition, Byte.class);
215 public Byte deserialize(String stringRepresentation) {
216 return Byte.parseByte(stringRepresentation);
220 public static class EmptyCodec extends TypeDefinitionAwareCodec<Void> {
222 protected EmptyCodec(TypeDefinition<?> typeDefinition) {
223 super(typeDefinition, Void.class);
227 public String serialize(Void data) {
232 public Void deserialize(String stringRepresentation) {
237 public static final class BinaryCodec extends TypeDefinitionAwareCodec<byte[]> {
239 protected BinaryCodec(TypeDefinition<?> typeDefinition) {
240 super(typeDefinition, byte[].class);
244 public String serialize(byte[] data) {
245 // FIXME By YANG Spec
250 public byte[] deserialize(String stringRepresentation) {
251 // FIXME By YANG Spec
256 public static final class BitsCodec extends TypeDefinitionAwareCodec<Set<String>> {
258 @SuppressWarnings("unchecked")
259 protected BitsCodec(TypeDefinition<?> typeDefinition) {
260 super(typeDefinition, (Class<Set<String>>) ((Class<?>) Set.class));
264 public String serialize(Set<String> data) {
265 return Joiner.on(" ").join(data).toString();
269 public Set<String> deserialize(String stringRepresentation) {
270 String[] strings = stringRepresentation.split(" ");
271 return ImmutableSet.copyOf(strings);
275 public static class EnumCodec extends TypeDefinitionAwareCodec<String> {
277 protected EnumCodec(TypeDefinition<?> typeDefinition) {
278 super(typeDefinition, String.class);
282 public String deserialize(String stringRepresentation) {
283 return stringRepresentation;
287 public static class DecimalCodec extends TypeDefinitionAwareCodec<BigDecimal> {
289 protected DecimalCodec(TypeDefinition<?> typeDefinition) {
290 super(typeDefinition, BigDecimal.class);
294 public String serialize(BigDecimal data) {
295 return data.toString();
299 public BigDecimal deserialize(String stringRepresentation) {
300 return new BigDecimal(stringRepresentation);