Merge "Added API with codecs for yang build-in types"
[yangtools.git] / yang / yang-data-impl / src / main / java / org / opendaylight / yangtools / yang / data / impl / codec / TypeDefinitionAwareCodec.java
1 package org.opendaylight.yangtools.yang.data.impl.codec;
2
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;
18
19 import java.math.BigDecimal;
20 import java.math.BigInteger;
21 import java.util.Set;
22
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;
39
40 import com.google.common.base.Joiner;
41 import com.google.common.collect.ImmutableSet;
42
43 public abstract class TypeDefinitionAwareCodec<T> implements DataStringCodec<T> {
44
45     private final TypeDefinition<?> typeDefinition;
46     private final Class<T> inputClass;
47
48     public Class<T> getInputClass() {
49         return inputClass;
50     }
51
52     protected TypeDefinitionAwareCodec(TypeDefinition<?> typeDefinition, Class<T> outputClass) {
53         this.typeDefinition = typeDefinition;
54         this.inputClass = outputClass;
55     }
56
57     public TypeDefinition<?> getTypeDefinition() {
58         return typeDefinition;
59     }
60
61     public static final TypeDefinitionAwareCodec<?> from(TypeDefinition<?> typeDefinition) {
62         while(typeDefinition.getBaseType() != null) {
63             typeDefinition = typeDefinition.getBaseType();
64         }
65         
66         if (BINARY_QNAME.equals(typeDefinition.getQName())) {
67             return new BinaryCodecStringImpl(typeDefinition);
68         }
69         if (BITS_QNAME.equals(typeDefinition.getQName())) {
70             return new BitsCodecStringImpl(typeDefinition);
71         }
72         if (BOOLEAN_QNAME.equals(typeDefinition.getQName())) {
73             return new BooleanCodecStringImpl(typeDefinition);
74         }
75         if (DECIMAL64_QNAME.equals(typeDefinition.getQName())) {
76             return new DecimalCodecStringImpl(typeDefinition);
77         }
78         if (EMPTY_QNAME.equals(typeDefinition.getQName())) {
79             return new EmptyCodecStringImpl(typeDefinition);
80         }
81         if (ENUMERATION_QNAME.equals(typeDefinition.getQName())) {
82             return new EnumCodecStringImpl(typeDefinition);
83         }
84         if (INT8_QNAME.equals(typeDefinition.getQName())) {
85             return new Int8CodecStringImpl(typeDefinition);
86         }
87         if (INT16_QNAME.equals(typeDefinition.getQName())) {
88             return new Int16CodecStringImpl(typeDefinition);
89         }
90         if (INT32_QNAME.equals(typeDefinition.getQName())) {
91             return new Int32CodecStringImpl(typeDefinition);
92         }
93         if (INT64_QNAME.equals(typeDefinition.getQName())) {
94             return new Int64CodecStringImpl(typeDefinition);
95         }
96         if (STRING_QNAME.equals(typeDefinition.getQName())) {
97             return new StringCodecStringImpl(typeDefinition);
98         }
99         if (UINT8_QNAME.equals(typeDefinition.getQName())) {
100             return new Uint8CodecStringImpl(typeDefinition);
101         }
102         if (UINT16_QNAME.equals(typeDefinition.getQName())) {
103             return new Uint16CodecStringImpl(typeDefinition);
104         }
105         if (UINT32_QNAME.equals(typeDefinition.getQName())) {
106             return new Uint32CodecStringImpl(typeDefinition);
107         }
108         if (UINT64_QNAME.equals(typeDefinition.getQName())) {
109             return new Uint64CodecStringImpl(typeDefinition);
110         }
111         return null;
112     }
113
114     public static class BooleanCodecStringImpl extends TypeDefinitionAwareCodec<Boolean> implements BooleanCodec<String> {
115
116         protected BooleanCodecStringImpl(TypeDefinition<?> typeDefinition) {
117             super(typeDefinition, Boolean.class);
118         }
119
120         @Override
121         public String serialize(Boolean data) {
122             return data.toString();
123         }
124
125         @Override
126         public Boolean deserialize(String stringRepresentation) {
127             return Boolean.parseBoolean(stringRepresentation);
128         }
129     };
130
131     public static class Uint8CodecStringImpl extends TypeDefinitionAwareCodec<Short> implements Uint8Codec<String> {
132
133         protected Uint8CodecStringImpl(TypeDefinition<?> typeDefinition) {
134             super(typeDefinition, Short.class);
135         }
136
137         @Override
138         public String serialize(Short data) {
139             return data.toString();
140         }
141
142         @Override
143         public Short deserialize(String stringRepresentation) {
144             return Short.parseShort(stringRepresentation);
145         }
146     };
147
148     public static class Uint16CodecStringImpl extends TypeDefinitionAwareCodec<Integer> implements Uint16Codec<String> {
149         protected Uint16CodecStringImpl(TypeDefinition<?> typeDefinition) {
150             super(typeDefinition, Integer.class);
151         }
152
153         @Override
154         public Integer deserialize(String stringRepresentation) {
155             return Integer.parseInt(stringRepresentation);
156         }
157
158         @Override
159         public String serialize(Integer data) {
160             return data.toString();
161         }
162     };
163
164     public static class Uint32CodecStringImpl extends TypeDefinitionAwareCodec<Long> implements Uint32Codec<String> {
165
166         protected Uint32CodecStringImpl(TypeDefinition<?> typeDefinition) {
167             super(typeDefinition, Long.class);
168         }
169
170         @Override
171         public Long deserialize(String stringRepresentation) {
172             return Long.parseLong(stringRepresentation);
173         }
174
175         @Override
176         public String serialize(Long data) {
177             return data.toString();
178         }
179     };
180
181     public static class Uint64CodecStringImpl extends TypeDefinitionAwareCodec<BigInteger> implements Uint64Codec<String> {
182
183         protected Uint64CodecStringImpl(TypeDefinition<?> typeDefinition) {
184             super(typeDefinition, BigInteger.class);
185         }
186
187         @Override
188         public BigInteger deserialize(String stringRepresentation) {
189             // FIXME: Implement codec correctly
190             return BigInteger.valueOf(Long.valueOf(stringRepresentation));
191         }
192
193         @Override
194         public String serialize(BigInteger data) {
195             return data.toString();
196         }
197     };
198
199     public static class StringCodecStringImpl extends TypeDefinitionAwareCodec<String> implements StringCodec<String> {
200
201         protected StringCodecStringImpl(TypeDefinition<?> typeDefinition) {
202             super(typeDefinition, String.class);
203         }
204
205         @Override
206         public String deserialize(String stringRepresentation) {
207             return stringRepresentation;
208         }
209
210         @Override
211         public String serialize(String data) {
212             return data.toString();
213         }
214     };
215
216     public static class Int16CodecStringImpl extends TypeDefinitionAwareCodec<Short> implements Int16Codec<String> {
217
218         protected Int16CodecStringImpl(TypeDefinition<?> typeDefinition) {
219             super(typeDefinition, Short.class);
220         }
221
222         @Override
223         public Short deserialize(String stringRepresentation) {
224             return Short.valueOf(stringRepresentation);
225         }
226
227         @Override
228         public String serialize(Short data) {
229             return data.toString();
230         }
231     };
232
233     public static class Int32CodecStringImpl extends TypeDefinitionAwareCodec<Integer> implements Int32Codec<String> {
234
235         protected Int32CodecStringImpl(TypeDefinition<?> typeDefinition) {
236             super(typeDefinition, Integer.class);
237         }
238
239         @Override
240         public Integer deserialize(String stringRepresentation) {
241             return Integer.valueOf(stringRepresentation);
242         }
243
244         @Override
245         public String serialize(Integer data) {
246             return data.toString();
247         }
248     };
249
250     public static class Int64CodecStringImpl extends TypeDefinitionAwareCodec<Long> implements Int64Codec<String> {
251
252         protected Int64CodecStringImpl(TypeDefinition<?> typeDefinition) {
253             super(typeDefinition, Long.class);
254         }
255
256         @Override
257         public Long deserialize(String stringRepresentation) {
258             return Long.parseLong(stringRepresentation);
259         }
260
261         @Override
262         public String serialize(Long data) {
263             return data.toString();
264         }
265     };
266
267     public static class Int8CodecStringImpl extends TypeDefinitionAwareCodec<Byte> implements Int8Codec<String> {
268
269         protected Int8CodecStringImpl(TypeDefinition<?> typeDefinition) {
270             super(typeDefinition, Byte.class);
271         }
272
273         @Override
274         public Byte deserialize(String stringRepresentation) {
275             return Byte.parseByte(stringRepresentation);
276         }
277
278         @Override
279         public String serialize(Byte data) {
280             return data.toString();
281         }
282     };
283
284     public static class EmptyCodecStringImpl extends TypeDefinitionAwareCodec<Void> implements EmptyCodec<String> {
285
286         protected EmptyCodecStringImpl(TypeDefinition<?> typeDefinition) {
287             super(typeDefinition, Void.class);
288         }
289
290         @Override
291         public String serialize(Void data) {
292             return "";
293         }
294
295         @Override
296         public Void deserialize(String stringRepresentation) {
297             return null;
298         }
299     };
300
301     public static final class BinaryCodecStringImpl extends TypeDefinitionAwareCodec<byte[]> implements BinaryCodec<String> {
302
303         protected BinaryCodecStringImpl(TypeDefinition<?> typeDefinition) {
304             super(typeDefinition, byte[].class);
305         }
306
307         @Override
308         public String serialize(byte[] data) {
309             // FIXME By YANG Spec
310             return null;
311         }
312
313         @Override
314         public byte[] deserialize(String stringRepresentation) {
315             // FIXME By YANG Spec
316             return null;
317         }
318     };
319
320     public static final class BitsCodecStringImpl extends TypeDefinitionAwareCodec<Set<String>> implements BitsCodec<String> {
321
322         @SuppressWarnings("unchecked")
323         protected BitsCodecStringImpl(TypeDefinition<?> typeDefinition) {
324             super(typeDefinition, (Class<Set<String>>) ((Class<?>) Set.class));
325         }
326
327         @Override
328         public String serialize(Set<String> data) {
329             return Joiner.on(" ").join(data).toString();
330         }
331
332         @Override
333         public Set<String> deserialize(String stringRepresentation) {
334             String[] strings = stringRepresentation.split(" ");
335             return ImmutableSet.copyOf(strings);
336         }
337     };
338
339     public static class EnumCodecStringImpl extends TypeDefinitionAwareCodec<String> implements EnumCodec<String> {
340
341         protected EnumCodecStringImpl(TypeDefinition<?> typeDefinition) {
342             super(typeDefinition, String.class);
343         }
344
345         @Override
346         public String deserialize(String stringRepresentation) {
347             return stringRepresentation;
348         }
349
350         @Override
351         public String serialize(String data) {
352             return data.toString();
353         }
354     };
355
356     public static class DecimalCodecStringImpl extends TypeDefinitionAwareCodec<BigDecimal> implements DecimalCodec<String> {
357
358         protected DecimalCodecStringImpl(TypeDefinition<?> typeDefinition) {
359             super(typeDefinition, BigDecimal.class);
360         }
361
362         @Override
363         public String serialize(BigDecimal data) {
364             return data.toString();
365         }
366
367         @Override
368         public BigDecimal deserialize(String stringRepresentation) {
369             return new BigDecimal(stringRepresentation);
370         }
371     };
372 }