1 package org.opendaylight.yangtools.yang.data.impl.codec;
3 import static org.opendaylight.yangtools.yang.model.util.BaseTypes.BINARY_QNAME;
4 import static org.opendaylight.yangtools.yang.model.util.BaseTypes.BITS_QNAME;
5 import static org.opendaylight.yangtools.yang.model.util.BaseTypes.BOOLEAN_QNAME;
6 import static org.opendaylight.yangtools.yang.model.util.BaseTypes.DECIMAL64_QNAME;
7 import static org.opendaylight.yangtools.yang.model.util.BaseTypes.EMPTY_QNAME;
8 import static org.opendaylight.yangtools.yang.model.util.BaseTypes.ENUMERATION_QNAME;
9 import static org.opendaylight.yangtools.yang.model.util.BaseTypes.INT16_QNAME;
10 import static org.opendaylight.yangtools.yang.model.util.BaseTypes.INT32_QNAME;
11 import static org.opendaylight.yangtools.yang.model.util.BaseTypes.INT64_QNAME;
12 import static org.opendaylight.yangtools.yang.model.util.BaseTypes.INT8_QNAME;
13 import static org.opendaylight.yangtools.yang.model.util.BaseTypes.STRING_QNAME;
14 import static org.opendaylight.yangtools.yang.model.util.BaseTypes.UINT16_QNAME;
15 import static org.opendaylight.yangtools.yang.model.util.BaseTypes.UINT32_QNAME;
16 import static org.opendaylight.yangtools.yang.model.util.BaseTypes.UINT64_QNAME;
17 import static org.opendaylight.yangtools.yang.model.util.BaseTypes.UINT8_QNAME;
19 import java.math.BigDecimal;
20 import java.math.BigInteger;
23 import org.opendaylight.yangtools.yang.data.api.codec.BinaryCodec;
24 import org.opendaylight.yangtools.yang.data.api.codec.BitsCodec;
25 import org.opendaylight.yangtools.yang.data.api.codec.BooleanCodec;
26 import org.opendaylight.yangtools.yang.data.api.codec.DecimalCodec;
27 import org.opendaylight.yangtools.yang.data.api.codec.EmptyCodec;
28 import org.opendaylight.yangtools.yang.data.api.codec.EnumCodec;
29 import org.opendaylight.yangtools.yang.data.api.codec.Int16Codec;
30 import org.opendaylight.yangtools.yang.data.api.codec.Int32Codec;
31 import org.opendaylight.yangtools.yang.data.api.codec.Int64Codec;
32 import org.opendaylight.yangtools.yang.data.api.codec.Int8Codec;
33 import org.opendaylight.yangtools.yang.data.api.codec.StringCodec;
34 import org.opendaylight.yangtools.yang.data.api.codec.Uint16Codec;
35 import org.opendaylight.yangtools.yang.data.api.codec.Uint32Codec;
36 import org.opendaylight.yangtools.yang.data.api.codec.Uint64Codec;
37 import org.opendaylight.yangtools.yang.data.api.codec.Uint8Codec;
38 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
40 import com.google.common.base.Joiner;
41 import com.google.common.collect.ImmutableSet;
43 public abstract class TypeDefinitionAwareCodec<T> implements DataStringCodec<T> {
45 private final TypeDefinition<?> typeDefinition;
46 private final Class<T> inputClass;
48 public Class<T> getInputClass() {
52 protected TypeDefinitionAwareCodec(TypeDefinition<?> typeDefinition, Class<T> outputClass) {
53 this.typeDefinition = typeDefinition;
54 this.inputClass = outputClass;
57 public TypeDefinition<?> getTypeDefinition() {
58 return typeDefinition;
61 public static final TypeDefinitionAwareCodec<?> from(TypeDefinition<?> typeDefinition) {
62 while(typeDefinition.getBaseType() != null) {
63 typeDefinition = typeDefinition.getBaseType();
66 if (BINARY_QNAME.equals(typeDefinition.getQName())) {
67 return new BinaryCodecStringImpl(typeDefinition);
69 if (BITS_QNAME.equals(typeDefinition.getQName())) {
70 return new BitsCodecStringImpl(typeDefinition);
72 if (BOOLEAN_QNAME.equals(typeDefinition.getQName())) {
73 return new BooleanCodecStringImpl(typeDefinition);
75 if (DECIMAL64_QNAME.equals(typeDefinition.getQName())) {
76 return new DecimalCodecStringImpl(typeDefinition);
78 if (EMPTY_QNAME.equals(typeDefinition.getQName())) {
79 return new EmptyCodecStringImpl(typeDefinition);
81 if (ENUMERATION_QNAME.equals(typeDefinition.getQName())) {
82 return new EnumCodecStringImpl(typeDefinition);
84 if (INT8_QNAME.equals(typeDefinition.getQName())) {
85 return new Int8CodecStringImpl(typeDefinition);
87 if (INT16_QNAME.equals(typeDefinition.getQName())) {
88 return new Int16CodecStringImpl(typeDefinition);
90 if (INT32_QNAME.equals(typeDefinition.getQName())) {
91 return new Int32CodecStringImpl(typeDefinition);
93 if (INT64_QNAME.equals(typeDefinition.getQName())) {
94 return new Int64CodecStringImpl(typeDefinition);
96 if (STRING_QNAME.equals(typeDefinition.getQName())) {
97 return new StringCodecStringImpl(typeDefinition);
99 if (UINT8_QNAME.equals(typeDefinition.getQName())) {
100 return new Uint8CodecStringImpl(typeDefinition);
102 if (UINT16_QNAME.equals(typeDefinition.getQName())) {
103 return new Uint16CodecStringImpl(typeDefinition);
105 if (UINT32_QNAME.equals(typeDefinition.getQName())) {
106 return new Uint32CodecStringImpl(typeDefinition);
108 if (UINT64_QNAME.equals(typeDefinition.getQName())) {
109 return new Uint64CodecStringImpl(typeDefinition);
114 public static class BooleanCodecStringImpl extends TypeDefinitionAwareCodec<Boolean> implements BooleanCodec<String> {
116 protected BooleanCodecStringImpl(TypeDefinition<?> typeDefinition) {
117 super(typeDefinition, Boolean.class);
121 public String serialize(Boolean data) {
122 return data.toString();
126 public Boolean deserialize(String stringRepresentation) {
127 return Boolean.parseBoolean(stringRepresentation);
131 public static class Uint8CodecStringImpl extends TypeDefinitionAwareCodec<Short> implements Uint8Codec<String> {
133 protected Uint8CodecStringImpl(TypeDefinition<?> typeDefinition) {
134 super(typeDefinition, Short.class);
138 public String serialize(Short data) {
139 return data.toString();
143 public Short deserialize(String stringRepresentation) {
144 return Short.parseShort(stringRepresentation);
148 public static class Uint16CodecStringImpl extends TypeDefinitionAwareCodec<Integer> implements Uint16Codec<String> {
149 protected Uint16CodecStringImpl(TypeDefinition<?> typeDefinition) {
150 super(typeDefinition, Integer.class);
154 public Integer deserialize(String stringRepresentation) {
155 return Integer.parseInt(stringRepresentation);
159 public String serialize(Integer data) {
160 return data.toString();
164 public static class Uint32CodecStringImpl extends TypeDefinitionAwareCodec<Long> implements Uint32Codec<String> {
166 protected Uint32CodecStringImpl(TypeDefinition<?> typeDefinition) {
167 super(typeDefinition, Long.class);
171 public Long deserialize(String stringRepresentation) {
172 return Long.parseLong(stringRepresentation);
176 public String serialize(Long data) {
177 return data.toString();
181 public static class Uint64CodecStringImpl extends TypeDefinitionAwareCodec<BigInteger> implements Uint64Codec<String> {
183 protected Uint64CodecStringImpl(TypeDefinition<?> typeDefinition) {
184 super(typeDefinition, BigInteger.class);
188 public BigInteger deserialize(String stringRepresentation) {
189 // FIXME: Implement codec correctly
190 return BigInteger.valueOf(Long.valueOf(stringRepresentation));
194 public String serialize(BigInteger data) {
195 return data.toString();
199 public static class StringCodecStringImpl extends TypeDefinitionAwareCodec<String> implements StringCodec<String> {
201 protected StringCodecStringImpl(TypeDefinition<?> typeDefinition) {
202 super(typeDefinition, String.class);
206 public String deserialize(String stringRepresentation) {
207 return stringRepresentation;
211 public String serialize(String data) {
212 return data.toString();
216 public static class Int16CodecStringImpl extends TypeDefinitionAwareCodec<Short> implements Int16Codec<String> {
218 protected Int16CodecStringImpl(TypeDefinition<?> typeDefinition) {
219 super(typeDefinition, Short.class);
223 public Short deserialize(String stringRepresentation) {
224 return Short.valueOf(stringRepresentation);
228 public String serialize(Short data) {
229 return data.toString();
233 public static class Int32CodecStringImpl extends TypeDefinitionAwareCodec<Integer> implements Int32Codec<String> {
235 protected Int32CodecStringImpl(TypeDefinition<?> typeDefinition) {
236 super(typeDefinition, Integer.class);
240 public Integer deserialize(String stringRepresentation) {
241 return Integer.valueOf(stringRepresentation);
245 public String serialize(Integer data) {
246 return data.toString();
250 public static class Int64CodecStringImpl extends TypeDefinitionAwareCodec<Long> implements Int64Codec<String> {
252 protected Int64CodecStringImpl(TypeDefinition<?> typeDefinition) {
253 super(typeDefinition, Long.class);
257 public Long deserialize(String stringRepresentation) {
258 return Long.parseLong(stringRepresentation);
262 public String serialize(Long data) {
263 return data.toString();
267 public static class Int8CodecStringImpl extends TypeDefinitionAwareCodec<Byte> implements Int8Codec<String> {
269 protected Int8CodecStringImpl(TypeDefinition<?> typeDefinition) {
270 super(typeDefinition, Byte.class);
274 public Byte deserialize(String stringRepresentation) {
275 return Byte.parseByte(stringRepresentation);
279 public String serialize(Byte data) {
280 return data.toString();
284 public static class EmptyCodecStringImpl extends TypeDefinitionAwareCodec<Void> implements EmptyCodec<String> {
286 protected EmptyCodecStringImpl(TypeDefinition<?> typeDefinition) {
287 super(typeDefinition, Void.class);
291 public String serialize(Void data) {
296 public Void deserialize(String stringRepresentation) {
301 public static final class BinaryCodecStringImpl extends TypeDefinitionAwareCodec<byte[]> implements BinaryCodec<String> {
303 protected BinaryCodecStringImpl(TypeDefinition<?> typeDefinition) {
304 super(typeDefinition, byte[].class);
308 public String serialize(byte[] data) {
309 // FIXME By YANG Spec
314 public byte[] deserialize(String stringRepresentation) {
315 // FIXME By YANG Spec
320 public static final class BitsCodecStringImpl extends TypeDefinitionAwareCodec<Set<String>> implements BitsCodec<String> {
322 @SuppressWarnings("unchecked")
323 protected BitsCodecStringImpl(TypeDefinition<?> typeDefinition) {
324 super(typeDefinition, (Class<Set<String>>) ((Class<?>) Set.class));
328 public String serialize(Set<String> data) {
329 return Joiner.on(" ").join(data).toString();
333 public Set<String> deserialize(String stringRepresentation) {
334 String[] strings = stringRepresentation.split(" ");
335 return ImmutableSet.copyOf(strings);
339 public static class EnumCodecStringImpl extends TypeDefinitionAwareCodec<String> implements EnumCodec<String> {
341 protected EnumCodecStringImpl(TypeDefinition<?> typeDefinition) {
342 super(typeDefinition, String.class);
346 public String deserialize(String stringRepresentation) {
347 return stringRepresentation;
351 public String serialize(String data) {
352 return data.toString();
356 public static class DecimalCodecStringImpl extends TypeDefinitionAwareCodec<BigDecimal> implements DecimalCodec<String> {
358 protected DecimalCodecStringImpl(TypeDefinition<?> typeDefinition) {
359 super(typeDefinition, BigDecimal.class);
363 public String serialize(BigDecimal data) {
364 return data.toString();
368 public BigDecimal deserialize(String stringRepresentation) {
369 return new BigDecimal(stringRepresentation);