1 package org.opendaylight.controller.binding.generator.util;
5 import org.opendaylight.controller.binding.generator.util.generated.type.builder.GeneratedTOBuilderImpl;
6 import org.opendaylight.controller.sal.binding.model.api.type.builder.GeneratedTOBuilder;
7 import org.opendaylight.controller.yang.common.QName;
8 import org.opendaylight.controller.yang.model.api.Module;
9 import org.opendaylight.controller.yang.model.api.SchemaNode;
10 import org.opendaylight.controller.yang.model.api.SchemaPath;
11 import org.opendaylight.controller.yang.model.api.TypeDefinition;
13 public final class BindingGeneratorUtil {
15 private static final String[] SET_VALUES = new String[] { "abstract", "assert", "boolean", "break", "byte", "case",
16 "catch", "char", "class", "const", "continue", "default", "double", "do", "else", "enum", "extends",
17 "false", "final", "finally", "float", "for", "goto", "if", "implements", "import", "instanceof", "int",
18 "interface", "long", "native", "new", "null", "package", "private", "protected", "public", "return",
19 "short", "static", "strictfp", "super", "switch", "synchronized", "this", "throw", "throws", "transient",
20 "true", "try", "void", "volatile", "while" };
22 private BindingGeneratorUtil() {
25 public static final Set<String> JAVA_RESERVED_WORDS = new HashSet<String>(Arrays.asList(SET_VALUES));
27 public static String validateJavaPackage(final String packageName) {
28 if (packageName != null) {
29 final String[] packNameParts = packageName.split("\\.");
30 if (packNameParts != null) {
31 final StringBuilder builder = new StringBuilder();
32 for (int i = 0; i < packNameParts.length; ++i) {
33 if (JAVA_RESERVED_WORDS.contains(packNameParts[i])) {
34 packNameParts[i] = "_" + packNameParts[i];
39 builder.append(packNameParts[i]);
41 return builder.toString();
47 public static String validateParameterName(final String parameterName) {
48 if (parameterName != null) {
49 if (JAVA_RESERVED_WORDS.contains(parameterName)) {
50 return "_" + parameterName;
56 public static GeneratedTOBuilder schemaNodeToTransferObjectBuilder(final String packageName,
57 final SchemaNode schemaNode, final String transObjectName) {
58 if (packageName != null && schemaNode != null && transObjectName != null) {
60 final String genTOName = BindingGeneratorUtil.parseToClassName(transObjectName);
61 final GeneratedTOBuilder newType = new GeneratedTOBuilderImpl(packageName, genTOName);
69 public static String moduleNamespaceToPackageName(final Module module) {
70 final StringBuilder packageNameBuilder = new StringBuilder();
72 final Calendar calendar = Calendar.getInstance();
73 if (module.getRevision() == null) {
74 throw new IllegalArgumentException("Module " + module.getName() + " does not specify revision date!");
76 packageNameBuilder.append("org.opendaylight.yang.gen.v");
77 packageNameBuilder.append(module.getYangVersion());
78 packageNameBuilder.append(".");
80 String namespace = module.getNamespace().toString();
81 namespace = namespace.replace("://", ".");
82 namespace = namespace.replace("/", ".");
83 namespace = namespace.replace(":", ".");
84 namespace = namespace.replace("-", ".");
85 namespace = namespace.replace("@", ".");
86 namespace = namespace.replace("$", ".");
87 namespace = namespace.replace("#", ".");
88 namespace = namespace.replace("'", ".");
89 namespace = namespace.replace("*", ".");
90 namespace = namespace.replace("+", ".");
91 namespace = namespace.replace(",", ".");
92 namespace = namespace.replace(";", ".");
93 namespace = namespace.replace("=", ".");
95 packageNameBuilder.append(namespace);
96 calendar.setTime(module.getRevision());
97 packageNameBuilder.append(".rev");
98 packageNameBuilder.append(calendar.get(Calendar.YEAR));
99 packageNameBuilder.append((calendar.get(Calendar.MONTH) + 1));
100 packageNameBuilder.append(calendar.get(Calendar.DAY_OF_MONTH));
102 return validateJavaPackage(packageNameBuilder.toString());
105 public static String packageNameForGeneratedType(final String basePackageName, final SchemaPath schemaPath) {
106 if (basePackageName == null) {
107 throw new IllegalArgumentException("Base Package Name cannot be NULL!");
109 if (schemaPath == null) {
110 throw new IllegalArgumentException("Schema Path cannot be NULL!");
113 final StringBuilder builder = new StringBuilder();
114 builder.append(basePackageName);
115 final List<QName> pathToNode = schemaPath.getPath();
116 final int traversalSteps = (pathToNode.size() - 1);
117 for (int i = 0; i < traversalSteps; ++i) {
119 String nodeLocalName = pathToNode.get(i).getLocalName();
121 nodeLocalName = nodeLocalName.replace(":", ".");
122 nodeLocalName = nodeLocalName.replace("-", ".");
123 builder.append(nodeLocalName);
125 return validateJavaPackage(builder.toString());
128 public static String packageNameForTypeDefinition(final String basePackageName,
129 final TypeDefinition<?> typeDefinition) {
130 if (basePackageName == null) {
131 throw new IllegalArgumentException("Base Package Name cannot be NULL!");
133 if (typeDefinition == null) {
134 throw new IllegalArgumentException("Type Definition reference cannot be NULL!");
137 final StringBuilder builder = new StringBuilder();
138 builder.append(basePackageName);
139 return validateJavaPackage(builder.toString());
142 public static String parseToClassName(String token) {
143 token = token.replace(".", "");
144 String correctStr = parseToCamelCase(token);
146 // make first char upper-case
147 char first = Character.toUpperCase(correctStr.charAt(0));
148 correctStr = first + correctStr.substring(1);
152 public static String parseToValidParamName(final String token) {
153 final String validToken = token.replace(".", "");
154 String correctStr = parseToCamelCase(validToken);
156 // make first char lower-case
157 char first = Character.toLowerCase(correctStr.charAt(0));
158 correctStr = first + correctStr.substring(1);
159 return validateParameterName(correctStr);
162 public static String convertToCapitalLetters(final String token) {
163 String convertedStr = token.replace(" ", "_");
164 convertedStr = convertedStr.replace(".", "_");
165 convertedStr = convertedStr.toUpperCase();
169 private static String parseToCamelCase(String token) {
171 throw new NullPointerException("Name can not be null");
174 String correctStr = token.trim();
175 if (correctStr.length() == 0) {
176 throw new IllegalArgumentException("Name can not be emty");
179 correctStr = replaceWithCamelCase(correctStr, ' ');
180 correctStr = replaceWithCamelCase(correctStr, '-');
181 correctStr = replaceWithCamelCase(correctStr, '_');
185 private static String replaceWithCamelCase(String text, char removalChar) {
186 StringBuilder sb = new StringBuilder(text);
187 String toBeRemoved = String.valueOf(removalChar);
189 int toBeRemovedPos = sb.indexOf(toBeRemoved);
190 while (toBeRemovedPos != -1) {
191 sb.replace(toBeRemovedPos, toBeRemovedPos + 1, "");
192 // check if 'toBeRemoved' character is not the only character in
194 if (sb.length() == 0) {
195 throw new IllegalArgumentException("Name can not be '" + toBeRemoved + "'");
197 String replacement = String.valueOf(sb.charAt(toBeRemovedPos)).toUpperCase();
198 sb.setCharAt(toBeRemovedPos, replacement.charAt(0));
199 toBeRemovedPos = sb.indexOf(toBeRemoved);
201 return sb.toString();