private static JavaMethod superConstructorOf(JavaMethod constructor, JavaType constructorType) { return new JavaMethodBuilder(constructor) .withReturnType(constructorType) .addToAttributes(BODY, "super(" + StringUtils.join(constructor.getArguments(), new Function<JavaProperty, String>() { @Override public String apply(JavaProperty item) { return item.getName(); } }, ", ") + ");") .build(); }
@Override public JavaClazz apply(JavaClazz item) { JavaClazz builder = BUILDER.apply(item); Set<JavaMethod> methods = new LinkedHashSet<JavaMethod>(); for (JavaMethod m : builder.getMethods()) { if (m.getName().equals("build")) { methods.add(new JavaMethodBuilder() .withReturnType(TypeAs.EDITABLE.apply(m.getReturnType())) .withName("build") .addToAttributes(BODY, toBuild(EDITABLE.apply(item))) .build()); } else { methods.add(m); } } return new JavaClazzBuilder(builder) .withMethods(methods) .build(); } }, EDITABLE {
JavaClazz current = root.getItem(); for (JavaMethod m : current.getMethods()) { methods.add(new JavaMethodBuilder(m).withReturnType(current.getType()).build());
@Override public JavaMethod apply(JavaProperty property) { String methodName = "with" + property.getNameCapitalized(); return new JavaMethodBuilder() .addToModifiers(Modifier.PUBLIC) .withName(methodName) .withReturnType(T) .withArguments(new JavaProperty[]{property}) .addToAttributes(BODY, getBody(property)) .build(); }
@Override public JavaMethod apply(JavaProperty property) { String methodName = "set" + property.getNameCapitalized(); return new JavaMethodBuilder() .addToModifiers(Modifier.PUBLIC) .withName(methodName) .withReturnType(VOID) .withArguments(new JavaProperty[]{property}) .addToAttributes(BODY, "this." + property.getName() + "=" + property.getName() + ";") .build(); } },
JavaClazz inlineableOf(BuilderContext ctx, JavaClazz clazz, Inline inline) { JavaClazz base = ClazzAs.INLINEABLE.apply(clazz); JavaType baseInterface = typeGenericOf(BuilderUtils.getInlineType(ctx, inline), clazz.getType()); JavaMethod method = new JavaMethodBuilder(base.getMethods().iterator().next()).withName(inline.value()).build(); JavaType fluent = TypeAs.SHALLOW_FLUENT.apply(clazz.getType()); JavaType shallowInlineType = new JavaTypeBuilder(base.getType()) .withClassName(inline.prefix() + base.getType().getClassName() + inline.suffix()) .addToInterfaces(baseInterface) .build(); JavaType inlineType = new JavaTypeBuilder(shallowInlineType) .withSuperClass(typeGenericOf(fluent, shallowInlineType)) .build(); Set<JavaMethod> constructors = new LinkedHashSet<JavaMethod>(); for (JavaMethod constructor : base.getConstructors()) { constructors.add(new JavaMethodBuilder(constructor).withReturnType(inlineType).build()); } return new JavaClazzBuilder(base) .withType(inlineType) .withConstructors(constructors) .withMethods(new HashSet<JavaMethod>(Arrays.asList(method))) .build(); } }
@Override public JavaMethod apply(JavaProperty property) { String methodName = "end" + captializeFirst(property.getType().isCollection() ? singularize(property.getName()) : property.getName()); return new JavaMethodBuilder() .addToModifiers(Modifier.PUBLIC) .withReturnType(N) .withName(methodName) .addToAttributes(BODY, "return and();") .build(); } };
@Override public JavaMethod apply(JavaProperty property) { JavaType nestedType = PropertyAs.NESTED_TYPE.apply(property); //We need to repackage because we are nesting under this class. JavaType rewraped = new JavaTypeBuilder(nestedType).withGenericTypes(new JavaType[]{T}).build(); String prefix = "edit"; String methodNameBase = captializeFirst(property.getName()); String methodName = prefix + methodNameBase; return new JavaMethodBuilder() .addToModifiers(Modifier.PUBLIC) .withReturnType(rewraped) .withName(methodName) .addToAttributes(BODY, "return withNew" + methodNameBase + "Like(get" + methodNameBase + "());") .build(); } }, AND {
@Override public JavaMethod apply(JavaProperty property) { String methodName = "with" + property.getNameCapitalized(); JavaType unwraped = combine(UNWRAP_COLLECTION_OF, UNWRAP_ARRAY_OF).apply(property.getType()); String addToMethodName = "addTo" + property.getNameCapitalized(); JavaProperty arrayProperty = new JavaPropertyBuilder(property) .withType(new JavaTypeBuilder(unwraped) .withArray(true) .build()) .withArray(true) .build(); return new JavaMethodBuilder() .addToModifiers(Modifier.PUBLIC) .withName(methodName) .withReturnType(T) .withArguments(new JavaProperty[]{arrayProperty}) .addToAttributes(BODY, "this." + property.getName() + ".clear(); if (" + property.getName() + " != null) {for (" + unwraped.getSimpleName() + " item :" + property.getName() + "){ this." + addToMethodName + "(item);}} return (T) this;") .build(); }
@Override public JavaMethod apply(JavaProperty property) { String builderName = TypeAs.UNWRAP_COLLECTION_OF.apply(property.getType()).getSimpleName("Builder"); String classPrefix = getClassPrefix(property); String prefix = property.getType().isCollection() ? "addTo" : "with"; String withMethodName = prefix + captializeFirst(property.getName()); return new JavaMethodBuilder() .addToModifiers(Modifier.PUBLIC) .withReturnType(N) .withName("and") .addToAttributes(BODY, "return (N) " + classPrefix + withMethodName + "(builder.build());") .build(); }
@Override public JavaMethod apply(JavaProperty property) { String prefix = property.getType().isBoolean() ? "is" : "get"; String methodName = prefix + property.getNameCapitalized(); JavaType type = property.getType(); Boolean isBuildable = isBuildable(type); JavaType targetType = isBuildable ? VISITABLE_BUILDER.apply(type) : TypeAs.UNWRAP_ARRAY_OF.apply(type); String body = String.format(isBuildable ? BUILDABLE_ARRAY_GETTER_TEXT : SIMPLE_ARRAY_GETTER_TEXT,type.getClassName(), targetType.getSimpleName(), property.getName(), type.getClassName()); return new JavaMethodBuilder() .addToModifiers(Modifier.PUBLIC) .withName(methodName) .withReturnType(property.getType()) .withArguments(new JavaProperty[]{}) .addToAttributes(BODY, body) .build(); } },
@Override public JavaMethod apply(JavaProperty property) { JavaType mapType = property.getType(); JavaType keyType = mapType.getGenericTypes()[0]; JavaProperty keyProperty = new JavaPropertyBuilder().withName("key").withType(keyType).build(); String methodName = "removeFrom" + property.getNameCapitalized(); return new JavaMethodBuilder() .addToModifiers(Modifier.PUBLIC) .withName(methodName) .withReturnType(T) .withArguments(new JavaProperty[]{keyProperty}) .addToAttributes(BODY, "if(key != null) {this." + property.getName() + ".remove(key);} return (T)this;") .build(); } }, WITH_NEW_NESTED {
@Override public Set<JavaMethod> apply(JavaProperty property) { Set<JavaMethod> result = new LinkedHashSet<JavaMethod>(); JavaClazz clazz = PropertyAs.CLASS.apply(property); for (JavaMethod constructor : getInlineableConstructors(property)) { String ownPrefix = property.getType().isCollection() ? "addNew" : "withNew"; String ownName = ownPrefix + captializeFirst(property.getType().isCollection() ? singularize(property.getName()) : property.getName()); String delegatePrefix = property.getType().isCollection() ? "addTo" : "with"; String delegateName = delegatePrefix + captializeFirst(property.getName()); String args = StringUtils.join(constructor.getArguments(), new Function<JavaProperty, String>() { @Override public String apply(JavaProperty item) { return item.getName(); } }, ", "); result.add(new JavaMethodBuilder() .addToModifiers(Modifier.PUBLIC) .withReturnType(T) .withArguments(constructor.getArguments()) .withName(ownName) .addToAttributes(BODY, "return " + delegateName + "(new " + clazz.getType().getSimpleName() + "(" + args + "));") .build()); } return result; } };
@Override public JavaMethod apply(JavaProperty property) { //We need to repackage because we are nesting under this class. JavaType nestedType = PropertyAs.NESTED_TYPE.apply(property); JavaType rewraped = new JavaTypeBuilder(nestedType).withGenericTypes(new JavaType[]{T}).build(); String prefix = property.getType().isCollection() ? "addNew" : "withNew"; String methodName = prefix + captializeFirst(property.getType().isCollection() ? singularize(property.getName()) : property.getName()); return new JavaMethodBuilder() .addToModifiers(Modifier.PUBLIC) .withReturnType(rewraped) .withName(methodName) .addToAttributes(BODY, "return new " + rewraped.getSimpleName() + "();") .build(); } }, WITH_NEW_LIKE_NESTED {
@Override public JavaMethod apply(JavaProperty property) { JavaType mapType = property.getType(); JavaType keyType = mapType.getGenericTypes()[0]; JavaType valueType = mapType.getGenericTypes()[1]; JavaProperty keyProperty = new JavaPropertyBuilder().withName("key").withType(keyType).build(); JavaProperty valueProperty = new JavaPropertyBuilder().withName("value").withType(valueType).build(); String methodName = "addTo" + property.getNameCapitalized(); return new JavaMethodBuilder() .addToModifiers(Modifier.PUBLIC) .withName(methodName) .withReturnType(T) .withArguments(new JavaProperty[]{keyProperty, valueProperty}) .addToAttributes(BODY, "if(key != null && value != null) {this." + property.getName() + ".put(key, value);} return (T)this;") .build(); } }, REMOVE_FROM_MAP {
.withArguments(new JavaProperty[]{item}) .addToAttributes(BODY, body) .build();
.withArguments(new JavaProperty[]{item}) .addToAttributes(BODY, body) .build();
.withArguments(new JavaProperty[]{}) .addToAttributes(BODY, body) .build();
.addToModifiers(Modifier.PRIVATE) .addToModifiers(Modifier.FINAL) .build(); .addToAttributes(BODY, item.getType().getSimpleName() + " item = builder.build();visitor.visit(item);return item;") .addToModifiers(Modifier.PUBLIC) .build(); .addToModifiers(Modifier.PUBLIC) .addToAttributes(BODY, "this.builder=new "+builderType.getSimpleName()+"(this, item);this.visitor=visitor;") .build();