1 package org.opendaylight.yangtools.binding.generator.util;
\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
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
17 public final class BindingGeneratorUtil {
\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
26 private BindingGeneratorUtil() {
\r
29 public static final Set<String> JAVA_RESERVED_WORDS = new HashSet<String>(Arrays.asList(SET_VALUES));
\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
44 builder.append(".");
\r
46 builder.append(packNameParts[i]);
\r
48 return builder.toString();
\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
60 return parameterName;
\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
67 final String genTOName = BindingGeneratorUtil.parseToClassName(transObjectName);
\r
68 final GeneratedTOBuilder newType = new GeneratedTOBuilderImpl(packageName, genTOName);
\r
76 public static String moduleNamespaceToPackageName(final Module module) {
\r
77 final StringBuilder packageNameBuilder = new StringBuilder();
\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
83 packageNameBuilder.append("org.opendaylight.yang.gen.v");
\r
84 packageNameBuilder.append(module.getYangVersion());
\r
85 packageNameBuilder.append(".");
\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
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
109 return validateJavaPackage(packageNameBuilder.toString());
\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
116 if (schemaPath == null) {
\r
117 throw new IllegalArgumentException("Schema Path cannot be NULL!");
\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
128 nodeLocalName = nodeLocalName.replace(":", ".");
\r
129 nodeLocalName = nodeLocalName.replace("-", ".");
\r
130 builder.append(nodeLocalName);
\r
132 return validateJavaPackage(builder.toString());
\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
140 if (typeDefinition == null) {
\r
141 throw new IllegalArgumentException("Type Definition reference cannot be NULL!");
\r
144 final StringBuilder builder = new StringBuilder();
\r
145 builder.append(basePackageName);
\r
146 return validateJavaPackage(builder.toString());
\r
149 public static String parseToClassName(String token) {
\r
150 token = token.replace(".", "");
\r
151 String correctStr = parseToCamelCase(token);
\r
153 // make first char upper-case
\r
154 char first = Character.toUpperCase(correctStr.charAt(0));
\r
155 if(first >= '0' && first <= '9') {
\r
157 correctStr = "_" + correctStr;
\r
159 correctStr = first + correctStr.substring(1);
\r
164 public static String parseToValidParamName(final String token) {
\r
165 final String validToken = token.replace(".", "");
\r
166 String correctStr = parseToCamelCase(validToken);
\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
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
181 private static String parseToCamelCase(String token) {
\r
182 if (token == null) {
\r
183 throw new NullPointerException("Name can not be null");
\r
186 String correctStr = token.trim();
\r
187 if (correctStr.length() == 0) {
\r
188 throw new IllegalArgumentException("Name can not be emty");
\r
191 correctStr = replaceWithCamelCase(correctStr, ' ');
\r
192 correctStr = replaceWithCamelCase(correctStr, '-');
\r
193 correctStr = replaceWithCamelCase(correctStr, '_');
\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
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
206 if (sb.length() == 0) {
\r
207 throw new IllegalArgumentException("Name can not be '" + toBeRemoved + "'");
\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
213 return sb.toString();
\r