Bug 2362: Added pattern validation for string types.
[yangtools.git] / yang / yang-data-impl / src / main / java / org / opendaylight / yangtools / yang / data / impl / codec / TypeDefinitionAwareCodec.java
1 /*
2  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.yangtools.yang.data.impl.codec;
9
10 import com.google.common.base.Joiner;
11 import com.google.common.base.Optional;
12 import com.google.common.base.Preconditions;
13 import com.google.common.base.Splitter;
14 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
15 import org.opendaylight.yangtools.yang.model.api.type.BinaryTypeDefinition;
16 import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition;
17 import org.opendaylight.yangtools.yang.model.api.type.BooleanTypeDefinition;
18 import org.opendaylight.yangtools.yang.model.api.type.DecimalTypeDefinition;
19 import org.opendaylight.yangtools.yang.model.api.type.EmptyTypeDefinition;
20 import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition;
21 import org.opendaylight.yangtools.yang.model.api.type.IntegerTypeDefinition;
22 import org.opendaylight.yangtools.yang.model.api.type.StringTypeDefinition;
23 import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition;
24 import org.opendaylight.yangtools.yang.model.api.type.UnsignedIntegerTypeDefinition;
25 import org.opendaylight.yangtools.yang.model.util.DerivedType;
26
27 public abstract class TypeDefinitionAwareCodec<J, T extends TypeDefinition<T>> implements DataStringCodec<J> {
28
29     private static final TypeDefinitionAwareCodec<?,?> EMPTY_DEFAULT_CODEC = new EmptyStringCodec(Optional.<EmptyTypeDefinition>absent());
30     private final Optional<T> typeDefinition;
31     private final Class<J> inputClass;
32
33     @Override
34     public Class<J> getInputClass() {
35         return inputClass;
36     }
37
38     protected TypeDefinitionAwareCodec(final Optional<T> typeDefinition, final Class<J> outputClass) {
39         Preconditions.checkArgument(outputClass != null, "Output class must be specified.");
40         this.typeDefinition = typeDefinition;
41         this.inputClass = outputClass;
42     }
43
44     public Optional<T> getTypeDefinition() {
45         return typeDefinition;
46     }
47
48     @SuppressWarnings({ "rawtypes", "unchecked" })
49     public static final TypeDefinitionAwareCodec<Object, ? extends TypeDefinition<?>> from(final TypeDefinition typeDefinition) {
50         return fromType(typeDefinition);
51     }
52
53     @SuppressWarnings("unchecked")
54     public static final <T extends TypeDefinition<T>> TypeDefinitionAwareCodec<?, T> fromType(final T typeDefinition) {
55         final T normalizedType = (T) DerivedType.from(typeDefinition);
56         @SuppressWarnings("rawtypes")
57         TypeDefinitionAwareCodec codec = null;
58
59         if (normalizedType instanceof BinaryTypeDefinition) {
60             codec = BinaryStringCodec.from((BinaryTypeDefinition)normalizedType);
61         } else if (normalizedType instanceof BitsTypeDefinition) {
62             codec = BitsStringCodec.from((BitsTypeDefinition)normalizedType);
63         } else if (normalizedType instanceof BooleanTypeDefinition) {
64             codec = BooleanStringCodec.from((BooleanTypeDefinition)normalizedType);
65         } else if (normalizedType instanceof DecimalTypeDefinition) {
66             codec = DecimalStringCodec.from((DecimalTypeDefinition)normalizedType);
67         } else if (normalizedType instanceof EmptyTypeDefinition) {
68             codec = EMPTY_DEFAULT_CODEC;
69         } else if (normalizedType instanceof EnumTypeDefinition) {
70             codec = EnumStringCodec.from((EnumTypeDefinition)normalizedType);
71         } else if (normalizedType instanceof IntegerTypeDefinition) {
72             codec = AbstractIntegerStringCodec.from((IntegerTypeDefinition) normalizedType);
73         } else if (normalizedType instanceof StringTypeDefinition) {
74             codec = StringStringCodec.from((StringTypeDefinition)normalizedType);
75         } else if (normalizedType instanceof UnionTypeDefinition) {
76             codec = UnionStringCodec.from((UnionTypeDefinition)normalizedType);
77         } else if (normalizedType instanceof UnsignedIntegerTypeDefinition) {
78             codec = AbstractIntegerStringCodec.from((UnsignedIntegerTypeDefinition) normalizedType);
79         }
80         return codec;
81     }
82
83     @Deprecated
84     public static class BooleanCodecStringImpl extends BooleanStringCodec{
85         protected BooleanCodecStringImpl(final Optional<BooleanTypeDefinition> typeDef) {
86             super(typeDef);
87         }
88     }
89
90     @Deprecated
91     public static class Uint8CodecStringImpl extends Uint8StringCodec {
92
93         protected Uint8CodecStringImpl(final Optional<UnsignedIntegerTypeDefinition> typeDef) {
94             super(typeDef);
95         }
96     }
97
98     @Deprecated
99     public static class Uint16CodecStringImpl extends Uint16StringCodec {
100         protected Uint16CodecStringImpl(final Optional<UnsignedIntegerTypeDefinition> typeDef) {
101             super(typeDef);
102         }
103     }
104
105     @Deprecated
106     public static class Uint32CodecStringImpl extends Uint32StringCodec {
107         protected Uint32CodecStringImpl(final Optional<UnsignedIntegerTypeDefinition> typeDef) {
108             super(typeDef);
109         }
110     }
111
112     @Deprecated
113     public static class Uint64CodecStringImpl extends Uint64StringCodec {
114         protected Uint64CodecStringImpl(final Optional<UnsignedIntegerTypeDefinition> typeDef) {
115             super(typeDef);
116         }
117     }
118
119     @Deprecated
120     public static class StringCodecStringImpl extends StringStringCodec {
121         protected StringCodecStringImpl(final Optional<StringTypeDefinition> typeDef) {
122             super(typeDef.get());
123         }
124     }
125
126     @Deprecated
127     public static class Int16CodecStringImpl extends Int16StringCodec {
128         protected Int16CodecStringImpl(final Optional<IntegerTypeDefinition> typeDef) {
129             super(typeDef);
130         }
131     }
132
133     @Deprecated
134     public static class Int32CodecStringImpl extends Int32StringCodec {
135         protected Int32CodecStringImpl(final Optional<IntegerTypeDefinition> typeDef) {
136             super(typeDef);
137         }
138
139     }
140
141     @Deprecated
142     public static class Int64CodecStringImpl extends Int64StringCodec {
143         protected Int64CodecStringImpl(final Optional<IntegerTypeDefinition> typeDef) {
144             super(typeDef);
145         }
146
147     }
148
149     @Deprecated
150     public static class Int8CodecStringImpl extends Int8StringCodec {
151
152         protected Int8CodecStringImpl(final Optional<IntegerTypeDefinition> typeDef) {
153             super(typeDef);
154         }
155
156     }
157
158     @Deprecated
159     public static class EmptyCodecStringImpl extends EmptyStringCodec {
160         protected EmptyCodecStringImpl(final Optional<EmptyTypeDefinition> typeDef) {
161             super(typeDef);
162         }
163     }
164
165     @Deprecated
166     public static final class BinaryCodecStringImpl extends BinaryStringCodec {
167         protected BinaryCodecStringImpl(final Optional<BinaryTypeDefinition> typeDef) {
168             super(typeDef);
169         }
170
171     }
172
173     @Deprecated
174     public static final class BitsCodecStringImpl extends BitsStringCodec {
175
176         public static final Joiner JOINER = Joiner.on(" ").skipNulls();
177         public static final Splitter SPLITTER = Splitter.on(' ').omitEmptyStrings().trimResults();
178
179         protected BitsCodecStringImpl(final Optional<BitsTypeDefinition> typeDef) {
180             super(typeDef);
181         }
182     }
183
184     @Deprecated
185     public static class EnumCodecStringImpl extends EnumStringCodec {
186
187         protected EnumCodecStringImpl(final Optional<EnumTypeDefinition> typeDef) {
188             super(typeDef);
189         }
190
191     }
192
193     @Deprecated
194     public static class DecimalCodecStringImpl extends DecimalStringCodec {
195         protected DecimalCodecStringImpl(final Optional<DecimalTypeDefinition> typeDef) {
196             super(typeDef);
197         }
198     }
199
200     @Deprecated
201     public static class UnionCodecStringImpl extends UnionStringCodec {
202         protected UnionCodecStringImpl(final Optional<UnionTypeDefinition> typeDef) {
203             super(typeDef);
204         }
205     }
206 }