2c75e5d377db87593c0a55b96b080b81af3ab258
[yangtools.git] / code-generator / binding-generator-util / src / main / java / org / opendaylight / yangtools / binding / generator / util / BindingGeneratorUtil.java
1 package org.opendaylight.yangtools.binding.generator.util;\r
2 \r
3 import java.util.Arrays;\r
4 import java.util.Calendar;\r
5 import java.util.HashSet;\r
6 import java.util.List;\r
7 import java.util.Set;\r
8 \r
9 import org.opendaylight.yangtools.binding.generator.util.generated.type.builder.GeneratedTOBuilderImpl;\r
10 import org.opendaylight.yangtools.sal.binding.model.api.type.builder.GeneratedTOBuilder;\r
11 import org.opendaylight.yangtools.yang.common.QName;\r
12 import org.opendaylight.yangtools.yang.model.api.Module;\r
13 import org.opendaylight.yangtools.yang.model.api.SchemaNode;\r
14 import org.opendaylight.yangtools.yang.model.api.SchemaPath;\r
15 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;\r
16 \r
17 public final class BindingGeneratorUtil {\r
18 \r
19     private static final String[] SET_VALUES = new String[] { "abstract", "assert", "boolean", "break", "byte", "case",\r
20             "catch", "char", "class", "const", "continue", "default", "double", "do", "else", "enum", "extends",\r
21             "false", "final", "finally", "float", "for", "goto", "if", "implements", "import", "instanceof", "int",\r
22             "interface", "long", "native", "new", "null", "package", "private", "protected", "public", "return",\r
23             "short", "static", "strictfp", "super", "switch", "synchronized", "this", "throw", "throws", "transient",\r
24             "true", "try", "void", "volatile", "while" };\r
25 \r
26     private BindingGeneratorUtil() {\r
27     }\r
28 \r
29     public static final Set<String> JAVA_RESERVED_WORDS = new HashSet<String>(Arrays.asList(SET_VALUES));\r
30 \r
31     public static String validateJavaPackage(final String packageName) {\r
32         if (packageName != null) {\r
33             final String[] packNameParts = packageName.split("\\.");\r
34             if (packNameParts != null) {\r
35                 final StringBuilder builder = new StringBuilder();\r
36                 for (int i = 0; i < packNameParts.length; ++i) {\r
37                     final String packNamePart = packNameParts[i];\r
38                     if (Character.isDigit(packNamePart.charAt(0))) {\r
39                         packNameParts[i] = "_" + packNamePart;\r
40                     } else if (JAVA_RESERVED_WORDS.contains(packNamePart)) {\r
41                         packNameParts[i] = "_" + packNamePart;\r
42                     }\r
43                     if (i > 0) {\r
44                         builder.append(".");\r
45                     }\r
46                     builder.append(packNameParts[i]);\r
47                 }\r
48                 return builder.toString();\r
49             }\r
50         }\r
51         return packageName;\r
52     }\r
53 \r
54     public static String validateParameterName(final String parameterName) {\r
55         if (parameterName != null) {\r
56             if (JAVA_RESERVED_WORDS.contains(parameterName)) {\r
57                 return "_" + parameterName;\r
58             }\r
59         }\r
60         return parameterName;\r
61     }\r
62 \r
63     public static GeneratedTOBuilder schemaNodeToTransferObjectBuilder(final String packageName,\r
64             final SchemaNode schemaNode, final String transObjectName) {\r
65         if (packageName != null && schemaNode != null && transObjectName != null) {\r
66 \r
67             final String genTOName = BindingGeneratorUtil.parseToClassName(transObjectName);\r
68             final GeneratedTOBuilder newType = new GeneratedTOBuilderImpl(packageName, genTOName);\r
69 \r
70             return newType;\r
71 \r
72         }\r
73         return null;\r
74     }\r
75 \r
76     public static String moduleNamespaceToPackageName(final Module module) {\r
77         final StringBuilder packageNameBuilder = new StringBuilder();\r
78 \r
79         final Calendar calendar = Calendar.getInstance();\r
80         if (module.getRevision() == null) {\r
81             throw new IllegalArgumentException("Module " + module.getName() + " does not specify revision date!");\r
82         }\r
83         packageNameBuilder.append("org.opendaylight.yang.gen.v");\r
84         packageNameBuilder.append(module.getYangVersion());\r
85         packageNameBuilder.append(".");\r
86 \r
87         String namespace = module.getNamespace().toString();\r
88         namespace = namespace.replace("://", ".");\r
89         namespace = namespace.replace("/", ".");\r
90         namespace = namespace.replace(":", ".");\r
91         namespace = namespace.replace("-", ".");\r
92         namespace = namespace.replace("@", ".");\r
93         namespace = namespace.replace("$", ".");\r
94         namespace = namespace.replace("#", ".");\r
95         namespace = namespace.replace("'", ".");\r
96         namespace = namespace.replace("*", ".");\r
97         namespace = namespace.replace("+", ".");\r
98         namespace = namespace.replace(",", ".");\r
99         namespace = namespace.replace(";", ".");\r
100         namespace = namespace.replace("=", ".");\r
101 \r
102         packageNameBuilder.append(namespace);\r
103         calendar.setTime(module.getRevision());\r
104         packageNameBuilder.append(".rev");\r
105         packageNameBuilder.append(calendar.get(Calendar.YEAR));\r
106         packageNameBuilder.append((calendar.get(Calendar.MONTH) + 1));\r
107         packageNameBuilder.append(calendar.get(Calendar.DAY_OF_MONTH));\r
108 \r
109         return validateJavaPackage(packageNameBuilder.toString());\r
110     }\r
111 \r
112     public static String packageNameForGeneratedType(final String basePackageName, final SchemaPath schemaPath) {\r
113         if (basePackageName == null) {\r
114             throw new IllegalArgumentException("Base Package Name cannot be NULL!");\r
115         }\r
116         if (schemaPath == null) {\r
117             throw new IllegalArgumentException("Schema Path cannot be NULL!");\r
118         }\r
119 \r
120         final StringBuilder builder = new StringBuilder();\r
121         builder.append(basePackageName);\r
122         final List<QName> pathToNode = schemaPath.getPath();\r
123         final int traversalSteps = (pathToNode.size() - 1);\r
124         for (int i = 0; i < traversalSteps; ++i) {\r
125             builder.append(".");\r
126             String nodeLocalName = pathToNode.get(i).getLocalName();\r
127 \r
128             nodeLocalName = nodeLocalName.replace(":", ".");\r
129             nodeLocalName = nodeLocalName.replace("-", ".");\r
130             builder.append(nodeLocalName);\r
131         }\r
132         return validateJavaPackage(builder.toString());\r
133     }\r
134 \r
135     public static String packageNameForTypeDefinition(final String basePackageName,\r
136             final TypeDefinition<?> typeDefinition) {\r
137         if (basePackageName == null) {\r
138             throw new IllegalArgumentException("Base Package Name cannot be NULL!");\r
139         }\r
140         if (typeDefinition == null) {\r
141             throw new IllegalArgumentException("Type Definition reference cannot be NULL!");\r
142         }\r
143 \r
144         final StringBuilder builder = new StringBuilder();\r
145         builder.append(basePackageName);\r
146         return validateJavaPackage(builder.toString());\r
147     }\r
148 \r
149     public static String parseToClassName(String token) {\r
150         token = token.replace(".", "");\r
151         String correctStr = parseToCamelCase(token);\r
152 \r
153         // make first char upper-case\r
154         char first = Character.toUpperCase(correctStr.charAt(0));\r
155         if(first >= '0' && first <= '9') {\r
156             \r
157             correctStr = "_" + correctStr;\r
158         } else {\r
159             correctStr = first + correctStr.substring(1);\r
160         }\r
161         return correctStr;\r
162     }\r
163 \r
164     public static String parseToValidParamName(final String token) {\r
165         final String validToken = token.replace(".", "");\r
166         String correctStr = parseToCamelCase(validToken);\r
167 \r
168         // make first char lower-case\r
169         char first = Character.toLowerCase(correctStr.charAt(0));\r
170         correctStr = first + correctStr.substring(1);\r
171         return validateParameterName(correctStr);\r
172     }\r
173 \r
174     public static String convertToCapitalLetters(final String token) {\r
175         String convertedStr = token.replace(" ", "_");\r
176         convertedStr = convertedStr.replace(".", "_");\r
177         convertedStr = convertedStr.toUpperCase();\r
178         return convertedStr;\r
179     }\r
180 \r
181     private static String parseToCamelCase(String token) {\r
182         if (token == null) {\r
183             throw new NullPointerException("Name can not be null");\r
184         }\r
185 \r
186         String correctStr = token.trim();\r
187         if (correctStr.length() == 0) {\r
188             throw new IllegalArgumentException("Name can not be emty");\r
189         }\r
190 \r
191         correctStr = replaceWithCamelCase(correctStr, ' ');\r
192         correctStr = replaceWithCamelCase(correctStr, '-');\r
193         correctStr = replaceWithCamelCase(correctStr, '_');\r
194         return correctStr;\r
195     }\r
196 \r
197     private static String replaceWithCamelCase(String text, char removalChar) {\r
198         StringBuilder sb = new StringBuilder(text);\r
199         String toBeRemoved = String.valueOf(removalChar);\r
200 \r
201         int toBeRemovedPos = sb.indexOf(toBeRemoved);\r
202         while (toBeRemovedPos != -1) {\r
203             sb.replace(toBeRemovedPos, toBeRemovedPos + 1, "");\r
204             // check if 'toBeRemoved' character is not the only character in\r
205             // 'text'\r
206             if (sb.length() == 0) {\r
207                 throw new IllegalArgumentException("Name can not be '" + toBeRemoved + "'");\r
208             }\r
209             String replacement = String.valueOf(sb.charAt(toBeRemovedPos)).toUpperCase();\r
210             sb.setCharAt(toBeRemovedPos, replacement.charAt(0));\r
211             toBeRemovedPos = sb.indexOf(toBeRemoved);\r
212         }\r
213         return sb.toString();\r
214     }\r
215 }\r