Improve BaseYangTypes lookups
[mdsal.git] / binding / mdsal-binding-generator-impl / src / main / java / org / opendaylight / mdsal / binding / yang / types / BaseYangTypes.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.mdsal.binding.yang.types;
9
10 import com.google.common.collect.ImmutableMap;
11 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
12 import java.math.BigDecimal;
13 import java.math.BigInteger;
14 import org.opendaylight.mdsal.binding.generator.spi.TypeProvider;
15 import org.opendaylight.mdsal.binding.model.api.JavaTypeName;
16 import org.opendaylight.mdsal.binding.model.api.Restrictions;
17 import org.opendaylight.mdsal.binding.model.api.Type;
18 import org.opendaylight.mdsal.binding.model.util.Types;
19 import org.opendaylight.mdsal.binding.spec.naming.BindingMapping;
20 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
21 import org.opendaylight.yangtools.yang.common.Empty;
22 import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode;
23 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
24 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
25
26 public final class BaseYangTypes {
27     /**
28      * <code>Type</code> representation of <code>boolean</code> YANG type.
29      */
30     public static final Type BOOLEAN_TYPE = Types.BOOLEAN;
31
32     /**
33      * <code>Type</code> representation of <code>empty</code> YANG type.
34      */
35     public static final Type EMPTY_TYPE = Types.typeForClass(Empty.class);
36
37     public static final Type ENUM_TYPE = Types.typeForClass(Enum.class);
38
39     /**
40      * <code>Type</code> representation of <code>int8</code> YANG type.
41      */
42     public static final Type INT8_TYPE = Types.typeForClass(Byte.class);
43
44     /**
45      * <code>Type</code> representation of <code>int16</code> YANG type.
46      */
47     public static final Type INT16_TYPE = Types.typeForClass(Short.class);
48
49     /**
50      * <code>Type</code> representation of <code>int32</code> YANG type.
51      */
52     public static final Type INT32_TYPE = Types.typeForClass(Integer.class);
53
54     /**
55      * <code>Type</code> representation of <code>int64</code> YANG type.
56      */
57     public static final Type INT64_TYPE = Types.typeForClass(Long.class);
58
59     /**
60      * <code>Type</code> representation of <code>string</code> YANG type.
61      */
62     public static final Type STRING_TYPE = Types.STRING;
63
64     /**
65      * <code>Type</code> representation of <code>decimal64</code> YANG type.
66      */
67     public static final Type DECIMAL64_TYPE = Types.typeForClass(BigDecimal.class);
68
69     /**
70      * <code>Type</code> representation of <code>uint8</code> YANG type.
71      */
72     public static final Type UINT8_TYPE = Types.typeForClass(Short.class, singleRangeRestrictions((short)0,
73         (short)255));
74
75     /**
76      * <code>Type</code> representation of <code>uint16</code> YANG type.
77      */
78     public static final Type UINT16_TYPE = Types.typeForClass(Integer.class, singleRangeRestrictions(0, 65535));
79
80     /**
81      * <code>Type</code> representation of <code>uint32</code> YANG type.
82      */
83     public static final Type UINT32_TYPE = Types.typeForClass(Long.class, singleRangeRestrictions(0L, 4294967295L));
84
85     /**
86      * <code>Type</code> representation of <code>uint64</code> YANG type.
87      */
88     public static final Type UINT64_TYPE = Types.typeForClass(BigInteger.class,
89             singleRangeRestrictions(BigInteger.ZERO, new BigInteger("18446744073709551615")));
90
91     public static final Type UNION_TYPE = new UnionType();
92
93     /**
94      * <code>Type</code> representation of <code>binary</code> YANG type.
95      */
96     public static final Type BINARY_TYPE = Types.typeForClass(byte[].class);
97
98     public static final Type INSTANCE_IDENTIFIER = Types.parameterizedTypeFor(Types
99             .typeForClass(InstanceIdentifier.class));
100
101     /**
102      * mapping of basic built-in YANG types (keys) to JAVA {@link org.opendaylight.mdsal.binding.model.api.Type Type}.
103      * This map is filled with mapping data in static initialization block.
104      */
105     private static final ImmutableMap<String, Type> TYPE_MAP = ImmutableMap.<String, Type>builder()
106             .put("boolean", BOOLEAN_TYPE)
107             .put("empty", EMPTY_TYPE)
108             .put("enumeration", ENUM_TYPE)
109             .put("int8", INT8_TYPE)
110             .put("int16", INT16_TYPE)
111             .put("int32", INT32_TYPE)
112             .put("int64", INT64_TYPE)
113             .put("string", STRING_TYPE)
114             .put("decimal64", DECIMAL64_TYPE)
115             .put("uint8", UINT8_TYPE)
116             .put("uint16", UINT16_TYPE)
117             .put("uint32", UINT32_TYPE)
118             .put("uint64", UINT64_TYPE)
119             .put("union", UNION_TYPE)
120             .put("binary", BINARY_TYPE)
121             .put("instance-identifier", INSTANCE_IDENTIFIER)
122             .build();
123
124     /**
125      * It is undesirable to create instance of this class.
126      */
127     private BaseYangTypes() {
128         throw new UnsupportedOperationException();
129     }
130
131     /**
132      * Searches <code>Type</code> value to which is YANG <code>type</code>
133      * mapped.
134      *
135      * @param type
136      *            string with YANG type name
137      * @return java <code>Type</code> representation of <code>type</code>
138      */
139     public static Type javaTypeForYangType(final String type) {
140         return TYPE_MAP.get(type);
141     }
142
143     public static final TypeProvider BASE_YANG_TYPES_PROVIDER = new TypeProvider() {
144         /**
145          * Searches <code>Type</code> value to which is YANG <code>type</code>
146          * mapped.
147          *
148          * @param type
149          *            type definition representation of YANG type
150          * @return java <code>Type</code> representation of <code>type</code>.
151          *         If <code>type</code> isn't found then <code>null</code> is
152          *         returned.
153          */
154         @Override
155         public Type javaTypeForSchemaDefinitionType(final TypeDefinition<?> type, final SchemaNode parentNode,
156                 final boolean lenientRelativeLeafrefs) {
157             if (type != null) {
158                 return TYPE_MAP.get(type.getQName().getLocalName());
159             }
160
161             return null;
162         }
163
164         @Override
165         public Type javaTypeForSchemaDefinitionType(final TypeDefinition<?> type, final SchemaNode parentNode,
166                 final Restrictions restrictions, final boolean lenientRelativeLeafrefs) {
167             String typeName = type.getQName().getLocalName();
168             switch (typeName) {
169                 case "binary":
170                     return restrictions == null ? Types.BYTE_ARRAY : Types.typeForClass(byte[].class, restrictions);
171                 case "decimal64":
172                     return Types.typeForClass(BigDecimal.class, restrictions);
173                 case "enumeration":
174                     return Types.typeForClass(Enum.class, restrictions);
175                 case "int8":
176                     return Types.typeForClass(Byte.class, restrictions);
177                 case "int16":
178                     return Types.typeForClass(Short.class, restrictions);
179                 case "int32":
180                     return Types.typeForClass(Integer.class, restrictions);
181                 case "int64":
182                     return Types.typeForClass(Long.class, restrictions);
183                 case "string":
184                     return Types.typeForClass(String.class, restrictions);
185                 case "uint8":
186                     return Types.typeForClass(Short.class, restrictions);
187                 case "uint16":
188                     return Types.typeForClass(Integer.class, restrictions);
189                 case "uint32":
190                     return Types.typeForClass(Long.class, restrictions);
191                 case "uint64":
192                     return Types.typeForClass(BigInteger.class, restrictions);
193                 case "union" :
194                     return UNION_TYPE;
195                 default:
196                     return javaTypeForSchemaDefinitionType(type, parentNode, lenientRelativeLeafrefs);
197             }
198         }
199
200         @Override
201         public String getTypeDefaultConstruction(final LeafSchemaNode node) {
202             return null;
203         }
204
205         @Override
206         public String getConstructorPropertyName(final SchemaNode node) {
207             return null;
208         }
209
210         @Override
211         public String getParamNameFromType(final TypeDefinition<?> type) {
212             return "_" + BindingMapping.getPropertyName(type.getQName().getLocalName());
213         }
214     };
215
216     private static <T extends Number & Comparable<T>> Restrictions singleRangeRestrictions(final T min, final T max) {
217         return Types.getDefaultRestrictions(min, max);
218     }
219
220     // FIXME: 5.0.0: remove this class
221     @Deprecated
222     public static final class UnionType implements Type {
223         @Override
224         public String getPackageName() {
225             return null;
226         }
227
228         @Override
229         public String getName() {
230             return "Union";
231         }
232
233         @Override
234         public String getFullyQualifiedName() {
235             return "Union";
236         }
237
238         @Override
239         @SuppressFBWarnings("NP_NONNULL_RETURN_VIOLATION")
240         public JavaTypeName getIdentifier() {
241             return null;
242         }
243     }
244 }