@Override public JavaProperty apply(VariableElement variableElement) { JavaProperty property = delegate.apply(variableElement); boolean isBuildable = property.getType().getAttributes().containsKey(BUILDABLE) ? (Boolean) property.getType().getAttributes().get(BUILDABLE) : false; Map<String, Object> attributes = new HashMap<String, Object>(property.getAttributes()); attributes.put(BUILDABLE, isBuildable); return new JavaPropertyBuilder(property).withAttributes(attributes).build(); } }
private String getBody(JavaProperty property) { String name = property.getName(); JavaType type = property.getType(); String className = type.getClassName(); StringBuilder sb = new StringBuilder(); if (type.isCollection()) { sb.append("this." + name + ".clear();"); if (className.contains("Map")) { sb.append("if (" + name + " != null) {this." + name + ".putAll(" + name + ");} return (T) this;"); } else if (className.contains("List") || className.contains("Set")) { JavaType unwraped = TypeAs.UNWRAP_COLLECTION_OF.apply(property.getType()); String addToMethodName = "addTo" + property.getNameCapitalized(); sb.append("if (" + name + " != null) {for (" + unwraped.getSimpleName() + " item : " + name + "){this." + addToMethodName + "(item);}} return (T) this;"); } return sb.toString(); } else if (isBuildable(property)) { JavaType builder = combine(UNWRAP_COLLECTION_OF, BUILDER).apply(property.getType()); String propertyName = property.getName(); String builderClass = builder.getSimpleName(); return "if (" + propertyName + "!=null){ this." + propertyName + "= new " + builderClass + "(" + propertyName + "); _visitables.add(this." + propertyName + ");} return (T) this;"; } return "this." + property.getName() + "=" + property.getName() + "; return (T) this;"; }
@Override public String apply(JavaProperty item) { String prefix = item.getType().isBoolean() ? "is" : "get"; return "fluent." + prefix + item.getNameCapitalized() + "()"; } }, ","));
private static String toEquals(JavaType type, Collection<JavaProperty> properties) { String simpleName = type.getClassName(); JavaType superClass = type.getSuperClass(); StringBuilder sb = new StringBuilder(); sb.append("\n"); sb.append("if (this == o) return true;").append("\n"); sb.append("if (o == null || getClass() != o.getClass()) return false;").append("\n"); //If base fluent is the superclass just skip. if (!Constants.BASE_FLUENT.getClassName().equals(superClass.getClassName())) { sb.append("if (!super.equals(o)) return false;").append("\n"); } sb.append(simpleName).append(" that = (").append(simpleName).append(") o;").append("\n"); for (JavaProperty property : properties) { String name = property.getName(); if (BuilderUtils.isPrimitive(property.getType())) { sb.append("if (").append(name).append(" != ").append("that.").append(name).append(") return false;").append("\n"); } else if (BuilderUtils.isDescendant(type, property.getType())) { sb.append("if (").append(name).append(" != null &&").append(name).append(" != this ? !").append(name).append(".equals(that.").append(name).append(") :") .append("that.").append(name).append(" != null &&").append(name).append(" != this ) return false;").append("\n"); } else { sb.append("if (").append(name).append(" != null ? !").append(name).append(".equals(that.").append(name).append(") :") .append("that.").append(name).append(" != null) return false;").append("\n"); } } sb.append("return true;").append("\n"); return sb.toString(); }
if (property.getModifiers().contains(Modifier.STATIC)) { continue; boolean buildable = (Boolean) toAdd.getType().getAttributes().get(BUILDABLE); if (toAdd.isArray()) { JavaProperty asList = arrayAsList(toAdd, buildable); methods.add(ToMethod.WITH_ARRAY.apply(toAdd)); methods.add(ToMethod.REMOVE_FROM_COLLECTION.apply(asList)); toAdd = asList; } else if (isSet(toAdd.getType()) || isList(toAdd.getType())) { methods.add(ToMethod.ADD_TO_COLLECTION.apply(toAdd)); methods.add(ToMethod.REMOVE_FROM_COLLECTION.apply(toAdd)); methods.add(ToMethod.WITH.apply(toAdd)); methods.add(ToMethod.WITH_ARRAY.apply(toAdd)); } else if (isMap(toAdd.getType())) { methods.add(ToMethod.ADD_TO_MAP.apply(toAdd)); methods.add(ToMethod.REMOVE_FROM_MAP.apply(toAdd)); if (isMap(toAdd.getType())) { properties.add(toAdd); } else if (isBuildable(toAdd)) { methods.add(ToMethod.WITH_NEW_NESTED.apply(toAdd)); methods.add(ToMethod.WITH_NEW_LIKE_NESTED.apply(toAdd)); if (!toAdd.getType().isCollection() && !toAdd.isArray()) { methods.add(ToMethod.EDIT_NESTED.apply(toAdd)); JavaType builderType = TypeAs.VISITABLE_BUILDER.apply(toAdd.getType());
@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(); } },
public static boolean isInlineable(JavaMethod method) { if (method.getArguments().length == 0 || method.getArguments().length > 5) { return false; } for (JavaProperty argument : method.getArguments()) { if (StringUtils.isNullOrEmpty(argument.getType().getPackageName())) { continue; } else if (argument.getType().getPackageName().startsWith("java.lang")) { continue; } else { return false; } } return true; }
@Override public String apply(JavaProperty item) { return item.getName(); } }, ", ") + ");")
private static String toInstanceConstructorBody(JavaClazz clazz, String fluent) { JavaMethod constructor = findBuildableConstructor(clazz); StringBuilder sb = new StringBuilder(); sb.append("this.fluent = " + fluent + "; "); for (JavaProperty property : constructor.getArguments()) { JavaMethod getter = findGetter(clazz, property); sb.append(fluent).append(".with").append(property.getNameCapitalized()).append("(instance.").append(getter.getName()).append("()); "); } return sb.toString(); }
private String getClassPrefix(JavaProperty property) { Object memberOf = property.getAttributes().get(MEMBER_OF); if (memberOf instanceof JavaType) { return ((JavaType) memberOf).getClassName() + ".this."; } else return ""; }
@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(); } };
private static boolean isApplicableGetterOf(JavaMethod method, JavaProperty property) { if (!method.getReturnType().isAssignable(property.getType())) { return false; } if (method.getName().endsWith("get" + property.getNameCapitalized())) { return true; } if (method.getName().endsWith("is" + property.getNameCapitalized())) { return true; } return false; }
@Override public JavaClazz apply(JavaProperty item) { BuilderContext context = BuilderContextManager.getContext(); Elements elements = context.getElements(); JavaType type = TypeAs.UNWRAP_COLLECTION_OF.apply(item.getType()); TypeElement typeElement = elements.getTypeElement(type.getFullyQualifiedName()); return BuilderContextManager.getContext().getToClazz().apply(typeElement); } };
public JavaType apply(JavaProperty property) { return new JavaTypeBuilder() .withClassName(captializeFirst(property.getName() + "Nested")) .withGenericTypes(new JavaType[]{N}) .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 prefix = property.getType().isBoolean() ? "is" : "get"; String methodName = prefix + property.getNameCapitalized(); String body = null; if (isMap(property.getType())) { body = "return this." + property.getName() + ";"; } else if (isBuildable(property)) { if (isList(property.getType()) || isSet(property.getType())) { body = "return build(" + property.getName() + ");"; } else { body = "return this." + property.getName() + "!=null?this." + property.getName() + ".build():null;"; if (isList(property.getType()) || isSet(property.getType())) { JavaType type = TypeAs.UNWRAP_COLLECTION_OF.apply(property.getType()); String names = StringUtils.join(descendants, new Function<JavaProperty, String>() { @Override body = "return this." + property.getName() + ";"; body = "return this." + property.getName() + ";"; .addToModifiers(Modifier.PUBLIC) .withName(methodName) .withReturnType(property.getType()) .withArguments(new JavaProperty[]{}) .addToAttributes(BODY, body)
@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(); }
JavaType baseType = property.getType(); for (JavaType descendant : BuilderUtils.getBuildableDescendants(candidate)) { JavaType collectionType = new JavaTypeBuilder(baseType).withGenericTypes(new JavaType[]{descendant}).build(); String propertyName = deCaptializeFirst(descendant.getSimpleName()) + property.getNameCapitalized(); result.add(new JavaPropertyBuilder(property) .withName(propertyName) String propertyName = descendant.getSimpleName() + property.getNameCapitalized(); result.add(new JavaPropertyBuilder(property) .withName(propertyName)
@Override public JavaClazz apply(JavaProperty item) { JavaType baseType = TypeAs.UNWRAP_COLLECTION_OF.apply(item.getType()); JavaType builderType = TypeAs.SHALLOW_BUILDER.apply(baseType); Set<JavaMethod> constructors = new HashSet<JavaMethod>(); JavaType memberOf = (JavaType) item.getAttributes().get(MEMBER_OF); properties.add(new JavaPropertyBuilder() .withName("builder")
private static JavaProperty arrayAsList(JavaProperty property, boolean buildable) { return new JavaPropertyBuilder(property) .withArray(false) .withType(TypeAs.ARRAY_AS_LIST.apply(property.getType())) .addToAttributes(BUILDABLE, buildable) .build(); }