Merge "Created Yang to Java Builder pattern class generator"
[controller.git] / opendaylight / sal / yang-prototype / code-generator / binding-generator-util / src / main / java / org / opendaylight / controller / binding / generator / util / Types.java
1 /*\r
2  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.\r
3  *\r
4  * This program and the accompanying materials are made available under the\r
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
6  * and is available at http://www.eclipse.org/legal/epl-v10.html\r
7  */\r
8 package org.opendaylight.controller.binding.generator.util;\r
9 \r
10 import java.util.List;\r
11 import java.util.Map;\r
12 import java.util.Set;\r
13 \r
14 import org.opendaylight.controller.binding.generator.util.generated.type.builder.GeneratedTOBuilderImpl;\r
15 import org.opendaylight.controller.sal.binding.model.api.ConcreteType;\r
16 import org.opendaylight.controller.sal.binding.model.api.GeneratedTransferObject;\r
17 import org.opendaylight.controller.sal.binding.model.api.ParameterizedType;\r
18 import org.opendaylight.controller.sal.binding.model.api.Type;\r
19 import org.opendaylight.controller.sal.binding.model.api.WildcardType;\r
20 import org.opendaylight.controller.yang.binding.Augmentable;\r
21 import org.opendaylight.controller.yang.binding.Augmentation;\r
22 import org.opendaylight.controller.yang.binding.BaseIdentity;\r
23 import org.opendaylight.controller.yang.binding.DataObject;\r
24 \r
25 public final class Types {\r
26     private static final Type SET_TYPE = typeForClass(Set.class);\r
27     private static final Type LIST_TYPE = typeForClass(List.class);\r
28     private static final Type MAP_TYPE = typeForClass(Map.class);\r
29     public static final Type DATA_OBJECT = typeForClass(DataObject.class);\r
30 \r
31     public static ConcreteType voidType() {\r
32         return new ConcreteTypeImpl(Void.class.getPackage().getName(),\r
33                 Void.class.getSimpleName());\r
34     }\r
35 \r
36     public static final Type primitiveType(final String primitiveType) {\r
37         return new ConcreteTypeImpl("", primitiveType);\r
38     }\r
39 \r
40 \r
41     /**\r
42      * Returns an instance of {@link ConcreteType} describing the class\r
43      *\r
44      * @param cls\r
45      *            Class to describe\r
46      * @return Description of class\r
47      */\r
48     public static ConcreteType typeForClass(Class<?> cls) {\r
49         return new ConcreteTypeImpl(cls.getPackage().getName(),\r
50                 cls.getSimpleName());\r
51     }\r
52 \r
53     /**\r
54      * Returns an instance of {@link ParameterizedType} describing the typed\r
55      * {@link Map}<K,V>\r
56      *\r
57      * @param keyType\r
58      *            Key Type\r
59      * @param valueType\r
60      *            Value Type\r
61      * @return Description of generic type instance\r
62      */\r
63     public static ParameterizedType mapTypeFor(Type keyType, Type valueType) {\r
64         return parameterizedTypeFor(MAP_TYPE, keyType, valueType);\r
65     }\r
66 \r
67     /**\r
68      * Returns an instance of {@link ParameterizedType} describing the typed\r
69      * {@link Set}<V> with concrete type of value.\r
70      *\r
71      * @param valueType\r
72      *            Value Type\r
73      * @return Description of generic type instance of Set\r
74      */\r
75     public static ParameterizedType setTypeFor(Type valueType) {\r
76         return parameterizedTypeFor(SET_TYPE, valueType);\r
77     }\r
78 \r
79     /**\r
80      * Returns an instance of {@link ParameterizedType} describing the typed\r
81      * {@link List}<V> with concrete type of value.\r
82      *\r
83      * @param valueType\r
84      *            Value Type\r
85      * @return Description of type instance of List\r
86      */\r
87     public static ParameterizedType listTypeFor(Type valueType) {\r
88         return parameterizedTypeFor(LIST_TYPE, valueType);\r
89     }\r
90 \r
91     public static GeneratedTransferObject getBaseIdentityTO() {\r
92         Class<BaseIdentity> cls = BaseIdentity.class;\r
93         GeneratedTOBuilderImpl gto = new GeneratedTOBuilderImpl(cls.getPackage().getName(),\r
94                 cls.getSimpleName());\r
95         return gto.toInstance();\r
96     }\r
97 \r
98     /**\r
99      *\r
100      * @param type\r
101      * @param parameters\r
102      * @return\r
103      */\r
104     public static ParameterizedType parameterizedTypeFor(Type type,\r
105             Type... parameters) {\r
106         return new ParametrizedTypeImpl(type, parameters);\r
107     }\r
108 \r
109     public static WildcardType wildcardTypeFor(String packageName, String typeName) {\r
110         return new WildcardTypeImpl(packageName, typeName);\r
111     }\r
112 \r
113     public static ParameterizedType augmentableTypeFor(Type valueType) {\r
114         final Type augmentable = typeForClass(Augmentable.class);\r
115         return parameterizedTypeFor(augmentable, valueType);\r
116     }\r
117 \r
118     public static ParameterizedType augmentationTypeFor(Type valueType) {\r
119         final Type augmentation = typeForClass(Augmentation.class);\r
120         return parameterizedTypeFor(augmentation, valueType);\r
121     }\r
122 \r
123     private static class ConcreteTypeImpl extends AbstractBaseType implements\r
124             ConcreteType {\r
125         private ConcreteTypeImpl(String pkName, String name) {\r
126             super(pkName, name);\r
127         }\r
128     }\r
129 \r
130     private static class ParametrizedTypeImpl extends AbstractBaseType\r
131             implements ParameterizedType {\r
132         private Type[] actualTypes;\r
133         private Type rawType;\r
134 \r
135         @Override\r
136         public Type[] getActualTypeArguments() {\r
137 \r
138             return actualTypes;\r
139         }\r
140 \r
141         @Override\r
142         public Type getRawType() {\r
143             return rawType;\r
144         }\r
145 \r
146         public ParametrizedTypeImpl(Type rawType, Type[] actTypes) {\r
147             super(rawType.getPackageName(), rawType.getName());\r
148             this.rawType = rawType;\r
149             this.actualTypes = actTypes;\r
150         }\r
151 \r
152     }\r
153 \r
154     private static class WildcardTypeImpl extends AbstractBaseType\r
155             implements WildcardType {\r
156         public WildcardTypeImpl(String packageName, String typeName) {\r
157             super(packageName, typeName);\r
158         }\r
159     }\r
160 \r
161 }\r