in juneau-all/src/java/main/ConfigurablePropertyCodeGenerator.java [53:205]
public static void main(String[] args) throws Exception {
Set<Class<?>> ignoreClasses = new HashSet<>();
for (Class<?> ic : IGNORE_CLASSES) {
while (ic != null) {
ignoreClasses.add(ic);
ic = ic.getSuperclass();
}
}
Map<Class<?>, Set<Method>> configMethods = new HashMap<>();
Map<Class<?>,File> classMap = map();
for (String sp : SOURCE_PATHS) {
File f = new File("../"+sp+"/src/main/java");
Path p = f.toPath();
try (Stream<Path> walkStream = Files.walk(p)) {
walkStream
.filter(x -> x.toFile().isFile())
.map(x -> x.toFile())
.filter(x -> x.getName().endsWith(".java"))
.filter(x -> hasFluentSetters(x))
.forEach(x -> classMap.put(toClass(x), x));
}
}
System.out.println("Found " + classMap.size() + " classes with fluent setters:");
classMap.keySet().forEach(x -> System.out.println("\t" + x));
for (Class<?> c : classMap.keySet()) {
System.out.println("Seaching " + c.getName());
Set<Method> s = new TreeSet<>(new MethodComparator());
for (Method m : c.getDeclaredMethods()) {
if (m.getAnnotation(FluentSetter.class) != null) {
s.add(m);
System.out.println("\tFound: " + m.getName());
}
}
configMethods.put(c, s);
}
for (Map.Entry<Class<?>,File> e : classMap.entrySet()) {
Class<?> c = e.getKey();
File f = e.getValue();
if (! c.isAnnotationPresent(FluentSetters.class))
System.err.println("@FluentSetters not present on class " + c.getName());
System.out.println("Processing " + f.getName());
String s = read(f);
int i1 = s.indexOf("<FluentSetters>"), i2 = s.indexOf("</FluentSetters>");
String cpSection = null;
if (i1 != -1 && i2 != -1) {
cpSection = s.substring(i1+15, i2);
} else {
System.err.println("...<FluentSetters> not found: " + f.getName());
continue;
}
Map<String,String> docs = Stream.of(cpSection.split("[\n]{2,}"))
.map(x -> x.trim())
.filter(x -> x.startsWith("/*"))
.map(x -> x.split("(?s)\\*\\/.*public"))
.collect(Collectors.toMap(x -> ("\n\tpublic"+x[1].substring(0, x[1].indexOf("\n"))), x -> ("\t"+x[0]+"*/\n")));
StringBuilder sb = new StringBuilder();
ClassInfo ci = ClassInfo.of(c);
String cName = ci.getSimpleName();
Set<String> ignore = set();
FluentSetters fs = ci.getAnnotation(FluentSetters.class);
if (! fs.returns().isEmpty())
cName = fs.returns();
for (String i : fs.ignore())
ignore.add(i);
String indent = c.getDeclaringClass() != null ? "\t\t" : "\t";
Set<String> sigsAdded = new HashSet<>();
List<ClassInfo> l = ClassInfo.of(c).getParents();
for (int i = l.size()-1; i>=0; i--) {
ClassInfo pc = l.get(i);
Class<?> pcc = pc.inner();
if (pcc != c) {
Set<Method> ms = configMethods.get(pcc);
if (ms != null) {
for (Method m : ms) {
// Don't render deprecated methods.
if (m.getAnnotation(Deprecated.class) != null)
continue;
String mSig = new StringBuilder(m.getName()).append("(").append(getArgs(m)).append(")").toString();
// Don't render ignored methods.
if (ignore.contains(m.getName()) || ignore.contains(mSig) || sigsAdded.contains(mSig))
continue;
sigsAdded.add(mSig);
StringBuilder sigLine = new StringBuilder();
sigLine.append("\n").append(indent).append("public ");
if (m.getTypeParameters().length > 0)
sigLine.append("<").append(alist(m.getTypeParameters()).stream().map(x -> x.getName()).collect(Collectors.joining(", "))).append("> ");
sigLine.append(cName).append(" ").append(mSig).append(" ");
if ( m.getExceptionTypes().length > 0)
sigLine.append("throws ").append(alist(m.getExceptionTypes()).stream().map(x -> x.getSimpleName()).collect(Collectors.joining(", ")));
sigLine.append("{");
String sigLine2 = sigLine.toString();
sb.append("\n\n");
// Overridden javadocs
String javadoc = docs.get(sigLine2);
if (javadoc != null) {
sb.append(javadoc);
}
// Line 1
sb.append(indent)
.append(m.getAnnotation(Deprecated.class) == null ? "" : "@Deprecated ")
.append("@Override /* GENERATED - ").append(pcc.getCanonicalName()).append(" */")
;
if (m.isVarArgs()) {
Type t = m.getParameters()[m.getParameterCount()-1].getParameterizedType();
if (t.toString().contains(" extends ")) {
sb.append("\n").append(indent).append("@SuppressWarnings(\"unchecked\")");
}
}
// Line 2
sb.append(sigLine2);
// Body
sb.append("\n").append(indent).append("\tsuper.").append(m.getName()).append("(").append(getArgVals(m)).append(");");
sb.append("\n").append(indent).append("\treturn this;");
sb.append("\n").append(indent).append("}");
}
} else {
if (! ignoreClasses.contains(pc.inner()))
System.err.println("Parent " + pc.inner().getSimpleName() + " not found for class " + c.getName());
}
}
}
s = s.substring(0, i1+15) + sb.toString() + "\n\n"+indent+"// " + s.substring(i2);
pipe(new StringReader(s), f);
}
System.out.println("DONE");
}