1 package org.opendaylight.controller.binding.generator.util;
3 import java.util.Arrays;
4 import java.util.Calendar;
5 import java.util.HashSet;
9 import org.opendaylight.controller.binding.generator.util.generated.type.builder.GeneratedTOBuilderImpl;
10 import org.opendaylight.controller.sal.binding.model.api.type.builder.GeneratedTOBuilder;
11 import org.opendaylight.yangtools.yang.common.QName;
12 import org.opendaylight.yangtools.yang.model.api.Module;
13 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
14 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
15 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
17 public final class BindingGeneratorUtil {
19 private static final String[] SET_VALUES = new String[] { "abstract", "assert", "boolean", "break", "byte", "case",
20 "catch", "char", "class", "const", "continue", "default", "double", "do", "else", "enum", "extends",
21 "false", "final", "finally", "float", "for", "goto", "if", "implements", "import", "instanceof", "int",
22 "interface", "long", "native", "new", "null", "package", "private", "protected", "public", "return",
23 "short", "static", "strictfp", "super", "switch", "synchronized", "this", "throw", "throws", "transient",
24 "true", "try", "void", "volatile", "while" };
26 private BindingGeneratorUtil() {
29 public static final Set<String> JAVA_RESERVED_WORDS = new HashSet<String>(Arrays.asList(SET_VALUES));
31 public static String validateJavaPackage(final String packageName) {
32 if (packageName != null) {
33 final String[] packNameParts = packageName.split("\\.");
34 if (packNameParts != null) {
35 final StringBuilder builder = new StringBuilder();
36 for (int i = 0; i < packNameParts.length; ++i) {
37 final String packNamePart = packNameParts[i];
38 if (Character.isDigit(packNamePart.charAt(0))) {
39 packNameParts[i] = "_" + packNamePart;
40 } else if (JAVA_RESERVED_WORDS.contains(packNamePart)) {
41 packNameParts[i] = "_" + packNamePart;
46 builder.append(packNameParts[i]);
48 return builder.toString();
54 public static String validateParameterName(final String parameterName) {
55 if (parameterName != null) {
56 if (JAVA_RESERVED_WORDS.contains(parameterName)) {
57 return "_" + parameterName;
63 public static GeneratedTOBuilder schemaNodeToTransferObjectBuilder(final String packageName,
64 final SchemaNode schemaNode, final String transObjectName) {
65 if (packageName != null && schemaNode != null && transObjectName != null) {
67 final String genTOName = BindingGeneratorUtil.parseToClassName(transObjectName);
68 final GeneratedTOBuilder newType = new GeneratedTOBuilderImpl(packageName, genTOName);
76 public static String moduleNamespaceToPackageName(final Module module) {
77 final StringBuilder packageNameBuilder = new StringBuilder();
79 final Calendar calendar = Calendar.getInstance();
80 if (module.getRevision() == null) {
81 throw new IllegalArgumentException("Module " + module.getName() + " does not specify revision date!");
83 packageNameBuilder.append("org.opendaylight.yang.gen.v");
84 packageNameBuilder.append(module.getYangVersion());
85 packageNameBuilder.append(".");
87 String namespace = module.getNamespace().toString();
88 namespace = namespace.replace("://", ".");
89 namespace = namespace.replace("/", ".");
90 namespace = namespace.replace(":", ".");
91 namespace = namespace.replace("-", ".");
92 namespace = namespace.replace("@", ".");
93 namespace = namespace.replace("$", ".");
94 namespace = namespace.replace("#", ".");
95 namespace = namespace.replace("'", ".");
96 namespace = namespace.replace("*", ".");
97 namespace = namespace.replace("+", ".");
98 namespace = namespace.replace(",", ".");
99 namespace = namespace.replace(";", ".");
100 namespace = namespace.replace("=", ".");
102 packageNameBuilder.append(namespace);
103 calendar.setTime(module.getRevision());
104 packageNameBuilder.append(".rev");
105 packageNameBuilder.append(calendar.get(Calendar.YEAR));
106 packageNameBuilder.append((calendar.get(Calendar.MONTH) + 1));
107 packageNameBuilder.append(calendar.get(Calendar.DAY_OF_MONTH));
109 return validateJavaPackage(packageNameBuilder.toString());
112 public static String packageNameForGeneratedType(final String basePackageName, final SchemaPath schemaPath) {
113 if (basePackageName == null) {
114 throw new IllegalArgumentException("Base Package Name cannot be NULL!");
116 if (schemaPath == null) {
117 throw new IllegalArgumentException("Schema Path cannot be NULL!");
120 final StringBuilder builder = new StringBuilder();
121 builder.append(basePackageName);
122 final List<QName> pathToNode = schemaPath.getPath();
123 final int traversalSteps = (pathToNode.size() - 1);
124 for (int i = 0; i < traversalSteps; ++i) {
126 String nodeLocalName = pathToNode.get(i).getLocalName();
128 nodeLocalName = nodeLocalName.replace(":", ".");
129 nodeLocalName = nodeLocalName.replace("-", ".");
130 builder.append(nodeLocalName);
132 return validateJavaPackage(builder.toString());
135 public static String packageNameForTypeDefinition(final String basePackageName,
136 final TypeDefinition<?> typeDefinition) {
137 if (basePackageName == null) {
138 throw new IllegalArgumentException("Base Package Name cannot be NULL!");
140 if (typeDefinition == null) {
141 throw new IllegalArgumentException("Type Definition reference cannot be NULL!");
144 final StringBuilder builder = new StringBuilder();
145 builder.append(basePackageName);
146 return validateJavaPackage(builder.toString());
149 public static String parseToClassName(String token) {
150 token = token.replace(".", "");
151 String correctStr = parseToCamelCase(token);
153 // make first char upper-case
154 char first = Character.toUpperCase(correctStr.charAt(0));
155 correctStr = first + correctStr.substring(1);
159 public static String parseToValidParamName(final String token) {
160 final String validToken = token.replace(".", "");
161 String correctStr = parseToCamelCase(validToken);
163 // make first char lower-case
164 char first = Character.toLowerCase(correctStr.charAt(0));
165 correctStr = first + correctStr.substring(1);
166 return validateParameterName(correctStr);
169 public static String convertToCapitalLetters(final String token) {
170 String convertedStr = token.replace(" ", "_");
171 convertedStr = convertedStr.replace(".", "_");
172 convertedStr = convertedStr.toUpperCase();
176 private static String parseToCamelCase(String token) {
178 throw new NullPointerException("Name can not be null");
181 String correctStr = token.trim();
182 if (correctStr.length() == 0) {
183 throw new IllegalArgumentException("Name can not be emty");
186 correctStr = replaceWithCamelCase(correctStr, ' ');
187 correctStr = replaceWithCamelCase(correctStr, '-');
188 correctStr = replaceWithCamelCase(correctStr, '_');
192 private static String replaceWithCamelCase(String text, char removalChar) {
193 StringBuilder sb = new StringBuilder(text);
194 String toBeRemoved = String.valueOf(removalChar);
196 int toBeRemovedPos = sb.indexOf(toBeRemoved);
197 while (toBeRemovedPos != -1) {
198 sb.replace(toBeRemovedPos, toBeRemovedPos + 1, "");
199 // check if 'toBeRemoved' character is not the only character in
201 if (sb.length() == 0) {
202 throw new IllegalArgumentException("Name can not be '" + toBeRemoved + "'");
204 String replacement = String.valueOf(sb.charAt(toBeRemovedPos)).toUpperCase();
205 sb.setCharAt(toBeRemovedPos, replacement.charAt(0));
206 toBeRemovedPos = sb.indexOf(toBeRemoved);
208 return sb.toString();