X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fsal%2Fyang-prototype%2Fcode-generator%2Fbinding-java-api-generator%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fsal%2Fjava%2Fapi%2Fgenerator%2FGeneratorUtil.java;h=ec908560e4108ced2b832b57887b1afce26d91bf;hb=a1124bebabbd033f4f19f991ce8e3b0b45e18d29;hp=673d37e86b532cd6fa2fcf506d00e3b014bd384f;hpb=42210c03b0a4c54706320ba9f55794c0abd4d201;p=controller.git diff --git a/opendaylight/sal/yang-prototype/code-generator/binding-java-api-generator/src/main/java/org/opendaylight/controller/sal/java/api/generator/GeneratorUtil.java b/opendaylight/sal/yang-prototype/code-generator/binding-java-api-generator/src/main/java/org/opendaylight/controller/sal/java/api/generator/GeneratorUtil.java index 673d37e86b..ec908560e4 100644 --- a/opendaylight/sal/yang-prototype/code-generator/binding-java-api-generator/src/main/java/org/opendaylight/controller/sal/java/api/generator/GeneratorUtil.java +++ b/opendaylight/sal/yang-prototype/code-generator/binding-java-api-generator/src/main/java/org/opendaylight/controller/sal/java/api/generator/GeneratorUtil.java @@ -1,286 +1,712 @@ -/* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.sal.java.api.generator; - -import static org.opendaylight.controller.sal.java.api.generator.Constants.*; - -import java.util.List; - -import org.opendaylight.controller.sal.binding.model.api.Constant; -import org.opendaylight.controller.sal.binding.model.api.Enumeration; -import org.opendaylight.controller.sal.binding.model.api.MethodSignature; -import org.opendaylight.controller.sal.binding.model.api.ParameterizedType; -import org.opendaylight.controller.sal.binding.model.api.Type; -import org.opendaylight.controller.sal.binding.model.api.Enumeration.Pair; -import org.opendaylight.controller.sal.binding.model.api.MethodSignature.Parameter; - -public class GeneratorUtil { - - private GeneratorUtil() { - } - - public static String createIfcDeclarationWithPkgName(String packageName, - String name, String indent) { - return createFileDeclarationWithPkgName(IFC, packageName, name, indent); - } - - public static String createClassDeclarationWithPkgName(String packageName, - String name, String indent) { - return createFileDeclarationWithPkgName(CLASS, packageName, name, - indent); - } - - private static String createFileDeclarationWithPkgName(String type, - String packageName, String name, String indent) { - StringBuilder sb = new StringBuilder(); - sb.append(PKG + GAP + packageName + SC); - sb.append(NL); - sb.append(NL); - sb.append(PUBLIC + GAP + type + GAP + name + GAP + LCB); - return sb.toString(); - } - - public static String createConstant(Constant constant, String indent) { - StringBuilder sb = new StringBuilder(); - sb.append(indent + PUBLIC + GAP + STATIC + GAP + FINAL + GAP); - sb.append(getExplicitType(constant.getType()) + GAP - + constant.getName()); - sb.append(GAP + "=" + GAP); - sb.append(constant.getValue() + SC); - return sb.toString(); - } - - public static String createField(Constant field, String indent) { - StringBuilder sb = new StringBuilder(); - sb.append(indent + PRIVATE + GAP); - sb.append(getExplicitType(field.getType()) + GAP + field.getName()); - sb.append(GAP + "=" + GAP); - sb.append(field.getValue() + SC); - return sb.toString(); - } - - /** - * Create method declaration in interface. - * - * @param method - * @param indent - * @return - */ - public static String createMethodDeclaration(MethodSignature method, - String indent) { - String comment = method.getComment(); - Type type = method.getReturnType(); - String name = method.getName(); - List parameters = method.getParameters(); - - StringBuilder sb = new StringBuilder(); - createComment(sb, comment, indent); - - sb.append(indent + getExplicitType(type) + GAP + name); - sb.append(LB); - for (int i = 0; i < parameters.size(); i++) { - Parameter p = parameters.get(i); - String separator = COMMA; - if (i + 1 == parameters.size()) { - separator = ""; - } - sb.append(getExplicitType(p.getType()) + GAP + p.getName() - + separator); - } - sb.append(RB); - sb.append(SC); - - return sb.toString(); - } - - public static String createGetter(Constant field, String indent) { - StringBuilder sb = new StringBuilder(); - - Type type = field.getType(); - String varName = field.getName(); - char first = Character.toUpperCase(varName.charAt(0)); - String methodName = "get" + first + varName.substring(1); - - sb.append(indent + PUBLIC + GAP + getExplicitType(type) + GAP - + methodName); - sb.append(LB + RB + LCB + NL); - - String currentIndent = indent + TAB; - - sb.append(currentIndent + "return " + varName + SC + NL); - - sb.append(indent + RCB); - return sb.toString(); - } - - public static String createHashCode(List fields, String indent) { - StringBuilder sb = new StringBuilder(); - sb.append(indent + "public int hashCode() {" + NL); - sb.append(indent + TAB + "final int prime = 31;" + NL); - sb.append(indent + TAB + "int result = 1;" + NL); - - for (Constant field : fields) { - String fieldName = field.getName(); - sb.append(indent + TAB + "result = prime * result + ((" + fieldName - + " == null) ? 0 : " + fieldName + ".hashCode());" + NL); - } - - sb.append(indent + TAB + "return result;" + NL); - sb.append(indent + RCB + NL); - return sb.toString(); - } - - public static String createEquals(Type type, List fields, - String indent) { - StringBuilder sb = new StringBuilder(); - final String indent1 = indent + TAB; - final String indent2 = indent + TAB + TAB; - final String indent3 = indent + TAB + TAB + TAB; - - sb.append(indent + "public boolean equals(Object obj) {" + NL); - sb.append(indent1 + "if (this == obj) {" + NL); - sb.append(indent2 + "return true;" + NL); - sb.append(indent1 + "}" + NL); - sb.append(indent1 + "if (obj == null) {" + NL); - sb.append(indent2 + "return false;" + NL); - sb.append(indent1 + "}" + NL); - sb.append(indent1 + "if (getClass() != obj.getClass()) {" + NL); - sb.append(indent2 + "return false;" + NL); - sb.append(indent1 + "}" + NL); - - String typeStr = type.getPackageName() + "." + type.getName(); - sb.append(indent1 + typeStr + " other = (" + typeStr + ") obj;" + NL); - - for (Constant field : fields) { - String fieldName = field.getName(); - sb.append(indent1 + "if (" + fieldName + " == null) {" + NL); - sb.append(indent2 + "if (other." + fieldName + " != null) {" + NL); - sb.append(indent3 + "return false;" + NL); - sb.append(indent2 + "}" + NL); - sb.append(indent1 + "} else if (!" + fieldName + ".equals(other." - + fieldName + ")) {" + NL); - sb.append(indent2 + "return false;" + NL); - sb.append(indent1 + "}" + NL); - } - - sb.append(indent1 + "return true;" + NL); - - sb.append(indent + RCB + NL); - return sb.toString(); - } - - public static String createToString(Type type, List fields, - String indent) { - StringBuilder sb = new StringBuilder(); - String typeStr = type.getPackageName() + "." + type.getName(); - - sb.append(indent + "public String toString() {" + NL); - sb.append(indent + TAB + "return \"" + typeStr + "["); - - boolean first = true; - for (Constant field : fields) { - String fieldName = field.getName(); - String fieldType = field.getType().getPackageName() + "." - + field.getType().getName(); - if (first) { - if (fieldType.equals("java.lang.String")) { - sb.append(fieldName + "=\\\"" - + parseStringValue((String) field.getValue()) - + "\\\""); - } else { - sb.append(fieldName + "=" + field.getValue() + ""); - } - } else { - if (fieldType.equals("java.lang.String")) { - sb.append(", " + fieldName + "=\\\"" - + parseStringValue((String) field.getValue()) - + "\\\""); - } else { - sb.append(", " + fieldName + "=" + field.getValue() + ""); - } - - } - first = false; - } - sb.append("]\"" + SC + NL); - - sb.append(indent + RCB + NL); - return sb.toString(); - } - - /** - * Remove starting and ending quote sign - * - * @param o - * @return - */ - private static String parseStringValue(String str) { - return str.substring(1, str.length() - 1); - } - - public static String createEnum(Enumeration e, String indent) { - StringBuilder sb = new StringBuilder(indent + ENUM + GAP + e.getName() - + GAP + LCB + NL); - - String separator = COMMA; - List values = e.getValues(); - sb.append(indent + TAB); - for (int i = 0; i < values.size(); i++) { - if (i + 1 == values.size()) { - separator = SC; - } - sb.append(values.get(i).getName() + separator); - } - sb.append(NL); - sb.append(indent + RCB); - return sb.toString(); - } - - private static String getExplicitType(Type type) { - String packageName = type.getPackageName(); - if (packageName.endsWith(".")) { - packageName = packageName.substring(0, packageName.length() - 1); - } - StringBuilder sb = new StringBuilder(packageName + "." + type.getName()); - if (type instanceof ParameterizedType) { - ParameterizedType pType = (ParameterizedType) type; - Type[] pTypes = pType.getActualTypeArguments(); - sb.append("<"); - sb.append(getParameters(pTypes)); - sb.append(">"); - } - if (sb.toString().equals("java.lang.Void")) { - return "void"; - } - return sb.toString(); - } - - private static String getParameters(Type[] pTypes) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < pTypes.length; i++) { - Type t = pTypes[i]; - - String separator = COMMA; - if (i + 1 == pTypes.length) { - separator = ""; - } - sb.append(getExplicitType(t) + separator); - } - return sb.toString(); - } - - private static void createComment(StringBuilder sb, String comment, - String indent) { - if (comment != null && comment.length() > 0) { - sb.append(indent + "/*" + NL); - sb.append(indent + comment + NL); - sb.append(indent + "*/" + NL); - } - } - -} +/* + * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.controller.sal.java.api.generator; + +import static org.opendaylight.controller.sal.java.api.generator.Constants.*; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import org.opendaylight.controller.binding.generator.util.TypeConstants; +import org.opendaylight.controller.sal.binding.model.api.*; +import org.opendaylight.controller.binding.generator.util.Types; +import org.opendaylight.controller.sal.binding.model.api.Enumeration.Pair; +import org.opendaylight.controller.sal.binding.model.api.MethodSignature.Parameter; + +public final class GeneratorUtil { + + private GeneratorUtil() { + } + + public static String createIfcDeclaration(final GeneratedType genType, final String indent, + final Map availableImports) { + return createFileDeclaration(IFC, genType, indent, availableImports, false); + } + + public static String createClassDeclaration(final GeneratedTransferObject genTransferObject, final String indent, + final Map availableImports, boolean isIdentity) { + return createFileDeclaration(CLASS, genTransferObject, indent, availableImports, isIdentity); + } + + public static String createPackageDeclaration(final String packageName) { + return PKG + GAP + packageName + SC; + } + + private static String createFileDeclaration(final String type, final GeneratedType genType, final String indent, + final Map availableImports, boolean isIdentity) { + final StringBuilder builder = new StringBuilder(); + final String currentPkg = genType.getPackageName(); + + createComment(builder, genType.getComment(), indent); + + if (!genType.getAnnotations().isEmpty()) { + final List annotations = genType.getAnnotations(); + appendAnnotations(builder, annotations); + builder.append(NL); + } + + if (isIdentity) { + if (!(CLASS.equals(type))) { + throw new IllegalArgumentException("'identity' has to be generated as a class"); + } + builder.append(PUBLIC + GAP + ABSTRACT + GAP + type + GAP + genType.getName() + GAP); + } else { + builder.append(PUBLIC + GAP + type + GAP + genType.getName() + GAP); + } + + if (genType instanceof GeneratedTransferObject) { + GeneratedTransferObject genTO = (GeneratedTransferObject) genType; + + if (genTO.getExtends() != null) { + builder.append(EXTENDS + GAP); + String gtoString = getExplicitType(genTO.getExtends(), availableImports, currentPkg); + builder.append(gtoString + GAP); + } + } + + final List genImplements = genType.getImplements(); + if (!genImplements.isEmpty()) { + if (genType instanceof GeneratedTransferObject) { + builder.append(IMPLEMENTS + GAP); + } else { + builder.append(EXTENDS + GAP); + } + builder.append(getExplicitType(genImplements.get(0), availableImports, currentPkg)); + + for (int i = 1; i < genImplements.size(); ++i) { + builder.append(", "); + builder.append(getExplicitType(genImplements.get(i), availableImports, currentPkg)); + } + } + builder.append(GAP + LCB); + return builder.toString(); + } + + private static StringBuilder appendAnnotations(final StringBuilder builder, final List annotations) { + if ((builder != null) && (annotations != null)) { + for (final AnnotationType annotation : annotations) { + builder.append("@"); + builder.append(annotation.getPackageName()); + builder.append("."); + builder.append(annotation.getName()); + + if (annotation.containsParameters()) { + builder.append("("); + final List parameters = annotation.getParameters(); + appendAnnotationParams(builder, parameters); + builder.append(")"); + } + } + } + return builder; + } + + private static StringBuilder appendAnnotationParams(final StringBuilder builder, + final List parameters) { + if (parameters != null) { + int i = 0; + for (final AnnotationType.Parameter param : parameters) { + if (param == null) { + continue; + } + if (i > 0) { + builder.append(", "); + } + final String paramName = param.getName(); + if (param.getValue() != null) { + builder.append(paramName); + builder.append(" = "); + builder.append(param.getValue()); + } else { + builder.append(paramName); + builder.append(" = {"); + final List values = param.getValues(); + builder.append(values.get(0)); + for (int j = 1; j < values.size(); ++j) { + builder.append(", "); + builder.append(values.get(j)); + } + builder.append("}"); + } + i++; + } + } + return builder; + } + + public static String createConstant(final Constant constant, final String indent, + final Map availableImports, final String currentPkg) { + final StringBuilder builder = new StringBuilder(); + if (constant == null) + throw new IllegalArgumentException(); + builder.append(indent + PUBLIC + GAP + STATIC + GAP + FINAL + GAP); + builder.append(getExplicitType(constant.getType(), availableImports, currentPkg) + GAP + constant.getName()); + builder.append(GAP + "=" + GAP); + final Object constValue = constant.getValue(); + + if (constant.getName().equals(TypeConstants.PATTERN_CONSTANT_NAME)) { + if (constant.getName() == null || constant.getType() == null || constant.getValue() == null) + throw new IllegalArgumentException(); + if (constValue instanceof List) { + builder.append("Arrays.asList" + LB); + final List constantValues = (List) constValue; + int stringsCount = 0; + for (Object value : constantValues) { + if (value instanceof String) { + if (stringsCount > 0) { + builder.append(COMMA); + } + stringsCount++; + builder.append(DOUBLE_QUOTE + (String) value + DOUBLE_QUOTE); + } + } + builder.append(RB); + } + } else { + builder.append(constant.getValue()); + } + builder.append(SC); + + return builder.toString(); + } + + public static String createField(final GeneratedProperty property, final String indent, + final Map availableImports, final String currentPkg) { + final StringBuilder builder = new StringBuilder(); + if (!property.getAnnotations().isEmpty()) { + final List annotations = property.getAnnotations(); + appendAnnotations(builder, annotations); + builder.append(NL); + } + builder.append(indent + PRIVATE + GAP); + builder.append(getExplicitType(property.getReturnType(), availableImports, currentPkg) + GAP + + property.getName()); + builder.append(SC); + return builder.toString(); + } + + /** + * Create method declaration in interface. + * + * @param method + * @param indent + * @return + */ + public static String createMethodDeclaration(final MethodSignature method, final String indent, + Map availableImports, final String currentPkg) { + final StringBuilder builder = new StringBuilder(); + + if (method == null) { + throw new IllegalArgumentException("Method Signature parameter MUST be specified and cannot be NULL!"); + } + + final String comment = method.getComment(); + final String name = method.getName(); + if (name == null) { + throw new IllegalStateException("Method Name cannot be NULL!"); + } + + final Type type = method.getReturnType(); + if (type == null) { + throw new IllegalStateException("Method Return type cannot be NULL!"); + } + + final List parameters = method.getParameters(); + + createComment(builder, comment, indent); + builder.append(NL); + builder.append(indent); + + if (!method.getAnnotations().isEmpty()) { + final List annotations = method.getAnnotations(); + appendAnnotations(builder, annotations); + builder.append(NL); + } + + builder.append(indent + getExplicitType(type, availableImports, currentPkg) + GAP + name); + builder.append(LB); + for (int i = 0; i < parameters.size(); i++) { + Parameter p = parameters.get(i); + String separator = COMMA; + if (i + 1 == parameters.size()) { + separator = ""; + } + builder.append(getExplicitType(p.getType(), availableImports, currentPkg) + GAP + p.getName() + separator); + } + builder.append(RB); + builder.append(SC); + + return builder.toString(); + } + + public static String createConstructor(GeneratedTransferObject genTransferObject, final String indent, + final Map availableImports, boolean isIdentity) { + final StringBuilder builder = new StringBuilder(); + + final String currentPkg = genTransferObject.getPackageName(); + final List properties = genTransferObject.getProperties(); + final List ctorParams = new ArrayList(); + if (properties != null) { + for (final GeneratedProperty property : properties) { + if (property.isReadOnly()) { + ctorParams.add(property); + } + } + } + + builder.append(indent); + builder.append(isIdentity ? PROTECTED : PUBLIC); + builder.append(GAP); + builder.append(genTransferObject.getName()); + builder.append(LB); + + if (!ctorParams.isEmpty()) { + builder.append(getExplicitType(ctorParams.get(0).getReturnType(), availableImports, currentPkg)); + builder.append(" "); + builder.append(ctorParams.get(0).getName()); + for (int i = 1; i < ctorParams.size(); ++i) { + final GeneratedProperty param = ctorParams.get(i); + builder.append(", "); + builder.append(getExplicitType(param.getReturnType(), availableImports, currentPkg)); + builder.append(GAP); + builder.append(param.getName()); + } + } + builder.append(RB + GAP + LCB + NL + indent + TAB + "super();" + NL); + if (!ctorParams.isEmpty()) { + for (final GeneratedProperty property : ctorParams) { + builder.append(indent); + builder.append(TAB); + builder.append("this."); + builder.append(property.getName()); + builder.append(" = "); + builder.append(property.getName()); + builder.append(SC); + builder.append(NL); + } + } + List consts = genTransferObject.getConstantDefinitions(); + for (Constant con : consts) { + if (con.getName() == null || con.getType() == null || con.getValue() == null) + continue; + if (con.getName().equals(TypeConstants.PATTERN_CONSTANT_NAME)) { + Object values = con.getValue(); + if (values instanceof List) { + for (Object regEx : (List) values) { + if (regEx instanceof String) { + builder.append(indent + TAB + "for (String regEx : " + TypeConstants.PATTERN_CONSTANT_NAME + + ") {" + NL); + builder.append(indent + TAB + TAB + "this." + MEMBER_PATTERN_LIST + + ".add(Pattern.compile(regEx))" + SC + NL); + builder.append(indent + TAB + RCB + NL); + + break; + } + } + + } + } + + } + + builder.append(indent); + builder.append(RCB); + return builder.toString(); + } + + public static String createGetter(final GeneratedProperty property, final String indent, + final Map availableImports, final String currentPkg) { + final StringBuilder builder = new StringBuilder(); + + final Type type = property.getReturnType(); + final String varName = property.getName(); + final char first = Character.toUpperCase(varName.charAt(0)); + final String methodName = "get" + first + varName.substring(1); + + builder.append(indent + PUBLIC + GAP + getExplicitType(type, availableImports, currentPkg) + GAP + methodName); + builder.append(LB + RB + LCB + NL); + + String currentIndent = indent + TAB; + + builder.append(currentIndent + "return " + varName + SC + NL); + + builder.append(indent + RCB); + return builder.toString(); + } + + public static String createSetter(final GeneratedProperty property, final String indent, + final Map availableImports, final String currentPkg) { + final StringBuilder builder = new StringBuilder(); + + final Type type = property.getReturnType(); + final String varName = property.getName(); + final char first = Character.toUpperCase(varName.charAt(0)); + final String methodName = "set" + first + varName.substring(1); + + builder.append(indent + PUBLIC + GAP + "void" + GAP + methodName); + builder.append(LB + getExplicitType(type, availableImports, currentPkg) + GAP + varName + RB + LCB + NL); + String currentIndent = indent + TAB; + builder.append(currentIndent + "this." + varName + " = " + varName + SC + NL); + builder.append(indent + RCB); + return builder.toString(); + } + + public static String createHashCode(final List properties, final String indent) { + StringBuilder builder = new StringBuilder(); + builder.append(indent + "public int hashCode() {" + NL); + builder.append(indent + TAB + "final int prime = 31;" + NL); + builder.append(indent + TAB + "int result = 1;" + NL); + + for (GeneratedProperty property : properties) { + String fieldName = property.getName(); + builder.append(indent + TAB + "result = prime * result + ((" + fieldName + " == null) ? 0 : " + fieldName + + ".hashCode());" + NL); + } + + builder.append(indent + TAB + "return result;" + NL); + builder.append(indent + RCB + NL); + return builder.toString(); + } + + public static String createEquals(final GeneratedTransferObject type, final List properties, + final String indent) { + final StringBuilder builder = new StringBuilder(); + final String indent1 = indent + TAB; + final String indent2 = indent1 + TAB; + final String indent3 = indent2 + TAB; + + builder.append(indent + "public boolean equals(Object obj) {" + NL); + builder.append(indent1 + "if (this == obj) {" + NL); + builder.append(indent2 + "return true;" + NL); + builder.append(indent1 + "}" + NL); + builder.append(indent1 + "if (obj == null) {" + NL); + builder.append(indent2 + "return false;" + NL); + builder.append(indent1 + "}" + NL); + builder.append(indent1 + "if (getClass() != obj.getClass()) {" + NL); + builder.append(indent2 + "return false;" + NL); + builder.append(indent1 + "}" + NL); + + String typeStr = type.getName(); + builder.append(indent1 + typeStr + " other = (" + typeStr + ") obj;" + NL); + + for (final GeneratedProperty property : properties) { + String fieldName = property.getName(); + builder.append(indent1 + "if (" + fieldName + " == null) {" + NL); + builder.append(indent2 + "if (other." + fieldName + " != null) {" + NL); + builder.append(indent3 + "return false;" + NL); + builder.append(indent2 + "}" + NL); + builder.append(indent1 + "} else if (!" + fieldName + ".equals(other." + fieldName + ")) {" + NL); + builder.append(indent2 + "return false;" + NL); + builder.append(indent1 + "}" + NL); + } + + builder.append(indent1 + "return true;" + NL); + builder.append(indent + RCB + NL); + return builder.toString(); + } + + public static String createToString(final GeneratedTransferObject type, final List properties, + final String indent) { + StringBuilder builder = new StringBuilder(); + builder.append(indent); + builder.append("public String toString() {"); + builder.append(NL); + builder.append(indent); + builder.append(TAB); + builder.append("StringBuilder builder = new StringBuilder();"); + builder.append(NL); + builder.append(indent); + builder.append(TAB); + builder.append("builder.append(\""); + builder.append(type.getName()); + builder.append(" ["); + + boolean first = true; + for (final GeneratedProperty property : properties) { + if (first) { + builder.append(property.getName()); + builder.append("=\");"); + builder.append(NL); + builder.append(indent); + builder.append(TAB); + builder.append("builder.append("); + builder.append(property.getName()); + builder.append(");"); + first = false; + } else { + builder.append(NL); + builder.append(indent); + builder.append(TAB); + builder.append("builder.append(\", "); + builder.append(property.getName()); + builder.append("=\");"); + builder.append(NL); + builder.append(indent); + builder.append(TAB); + builder.append("builder.append("); + builder.append(property.getName()); + builder.append(");"); + } + } + builder.append(NL); + builder.append(indent); + builder.append(TAB); + builder.append("builder.append(\"]\");"); + builder.append(NL); + builder.append(indent); + builder.append(TAB); + builder.append("return builder.toString();"); + + builder.append(NL); + builder.append(indent); + builder.append(RCB); + builder.append(NL); + return builder.toString(); + } + + public static String createEnum(final Enumeration enumeration, final String indent) { + if (enumeration == null || indent == null) + throw new IllegalArgumentException(); + final StringBuilder builder = new StringBuilder(indent + PUBLIC + GAP + ENUM + GAP + enumeration.getName() + + GAP + LCB + NL); + + String separator = COMMA + NL; + final List values = enumeration.getValues(); + + for (int i = 0; i < values.size(); i++) { + if (i + 1 == values.size()) { + separator = SC; + } + builder.append(indent + TAB + values.get(i).getName() + LB + values.get(i).getValue() + RB + separator); + } + builder.append(NL); + builder.append(NL); + final String ENUMERATION_NAME = "value"; + final String ENUMERATION_TYPE = "int"; + builder.append(indent + TAB + ENUMERATION_TYPE + GAP + ENUMERATION_NAME + SC); + builder.append(NL); + builder.append(indent + TAB + PRIVATE + GAP + enumeration.getName() + LB + ENUMERATION_TYPE + GAP + + ENUMERATION_NAME + RB + GAP + LCB + NL); + builder.append(indent + TAB + TAB + "this." + ENUMERATION_NAME + GAP + "=" + GAP + ENUMERATION_NAME + SC + NL); + builder.append(indent + TAB + RCB + NL); + + builder.append(indent + RCB); + builder.append(NL); + return builder.toString(); + } + + private static String getExplicitType(final Type type, final Map imports, final String currentPkg) { + if (type == null) { + throw new IllegalArgumentException("Type parameter MUST be specified and cannot be NULL!"); + } + if (type.getName() == null) { + throw new IllegalArgumentException("Type name cannot be NULL!"); + } + if (type.getPackageName() == null) { + throw new IllegalArgumentException("Type cannot have Package Name referenced as NULL!"); + } + if (imports == null) { + throw new IllegalArgumentException("Imports Map cannot be NULL!"); + } + + final String typePackageName = type.getPackageName(); + final String typeName = type.getName(); + final String importedPackageName = imports.get(typeName); + if (typePackageName.equals(importedPackageName) || typePackageName.equals(currentPkg)) { + final StringBuilder builder = new StringBuilder(type.getName()); + if (type instanceof ParameterizedType) { + final ParameterizedType pType = (ParameterizedType) type; + final Type[] pTypes = pType.getActualTypeArguments(); + builder.append("<"); + builder.append(getParameters(pTypes, imports, currentPkg)); + builder.append(">"); + } + if (builder.toString().equals("Void")) { + return "void"; + } + return builder.toString(); + } else { + final StringBuilder builder = new StringBuilder(); + if (typePackageName.startsWith("java.lang")) { + builder.append(type.getName()); + } else { + if (!typePackageName.isEmpty()) { + builder.append(typePackageName + "." + type.getName()); + } else { + builder.append(type.getName()); + } + } + if (type instanceof ParameterizedType) { + final ParameterizedType pType = (ParameterizedType) type; + final Type[] pTypes = pType.getActualTypeArguments(); + builder.append("<"); + builder.append(getParameters(pTypes, imports, currentPkg)); + builder.append(">"); + } + if (builder.toString().equals("Void")) { + return "void"; + } + return builder.toString(); + } + } + + private static String getParameters(final Type[] pTypes, Map availableImports, String currentPkg) { + final StringBuilder builder = new StringBuilder(); + for (int i = 0; i < pTypes.length; i++) { + final Type t = pTypes[i]; + + String separator = COMMA; + if (i == (pTypes.length - 1)) { + separator = ""; + } + + String wildcardParam = ""; + if (t instanceof WildcardType) { + wildcardParam = "? extends "; + } + builder.append(wildcardParam + getExplicitType(t, availableImports, currentPkg) + separator); + } + return builder.toString(); + } + + private static void createComment(final StringBuilder builder, final String comment, final String indent) { + if (comment != null && comment.length() > 0) { + builder.append(indent + "/*" + NL); + builder.append(indent + comment + NL); + builder.append(indent + "*/" + NL); + } + } + + public static Map createImports(final GeneratedType genType) { + if (genType == null) { + throw new IllegalArgumentException("Generated Type cannot be NULL!"); + } + + final Map imports = new LinkedHashMap<>(); + final List constants = genType.getConstantDefinitions(); + final List methods = genType.getMethodDefinitions(); + final List impl = genType.getImplements(); + + // IMPLEMENTATIONS + if (impl != null) { + for (final Type type : impl) { + putTypeIntoImports(genType, type, imports); + } + } + + // CONSTANTS + if (constants != null) { + for (final Constant constant : constants) { + final Type constantType = constant.getType(); + putTypeIntoImports(genType, constantType, imports); + } + } + + // REGULAR EXPRESSION + if (genType instanceof GeneratedTransferObject) { + if (isConstantInTO(TypeConstants.PATTERN_CONSTANT_NAME, (GeneratedTransferObject) genType)) { + putTypeIntoImports(genType, Types.typeForClass(java.util.regex.Pattern.class), imports); + putTypeIntoImports(genType, Types.typeForClass(java.util.Arrays.class), imports); + putTypeIntoImports(genType, Types.typeForClass(java.util.ArrayList.class), imports); + } + } + + // METHODS + if (methods != null) { + for (final MethodSignature method : methods) { + final Type methodReturnType = method.getReturnType(); + putTypeIntoImports(genType, methodReturnType, imports); + for (final MethodSignature.Parameter methodParam : method.getParameters()) { + putTypeIntoImports(genType, methodParam.getType(), imports); + } + } + } + + // PROPERTIES + if (genType instanceof GeneratedTransferObject) { + final GeneratedTransferObject genTO = (GeneratedTransferObject) genType; + final List properties = genTO.getProperties(); + if (properties != null) { + for (GeneratedProperty property : properties) { + final Type propertyType = property.getReturnType(); + putTypeIntoImports(genType, propertyType, imports); + } + } + } + + return imports; + } + + private static void putTypeIntoImports(final GeneratedType parentGenType, final Type type, + final Map imports) { + if (parentGenType == null) { + throw new IllegalArgumentException("Parent Generated Type parameter MUST be specified and cannot be " + + "NULL!"); + } + if (parentGenType.getName() == null) { + throw new IllegalArgumentException("Parent Generated Type name cannot be NULL!"); + } + if (parentGenType.getPackageName() == null) { + throw new IllegalArgumentException("Parent Generated Type cannot have Package Name referenced as NULL!"); + } + if (type == null) { + throw new IllegalArgumentException("Type parameter MUST be specified and cannot be NULL!"); + } + if (type.getName() == null) { + throw new IllegalArgumentException("Type name cannot be NULL!"); + } + if (type.getPackageName() == null) { + throw new IllegalArgumentException("Type cannot have Package Name referenced as NULL!"); + } + + final String typeName = type.getName(); + final String typePackageName = type.getPackageName(); + final String parentTypeName = parentGenType.getName(); + final String parentTypePackageName = parentGenType.getPackageName(); + if (typeName.equals(parentTypeName) || typePackageName.startsWith("java.lang") + || typePackageName.equals(parentTypePackageName) || typePackageName.isEmpty()) { + return; + } + if (!imports.containsKey(typeName)) { + imports.put(typeName, typePackageName); + } + if (type instanceof ParameterizedType) { + final ParameterizedType paramType = (ParameterizedType) type; + final Type[] params = paramType.getActualTypeArguments(); + for (Type param : params) { + putTypeIntoImports(parentGenType, param, imports); + } + } + } + + public static List createImportLines(final Map imports) { + final List importLines = new ArrayList<>(); + + for (Map.Entry entry : imports.entrySet()) { + final String typeName = entry.getKey(); + final String packageName = entry.getValue(); + importLines.add("import " + packageName + "." + typeName + SC); + } + return importLines; + } + + public static boolean isConstantInTO(String constName, GeneratedTransferObject genTO) { + if (constName == null || genTO == null) + throw new IllegalArgumentException(); + List consts = genTO.getConstantDefinitions(); + for (Constant cons : consts) { + if (cons.getName().equals(constName)) { + return true; + } + + } + return false; + } +}