package com.guit.junit.dom; import java.io.File; import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; public class ElementsImplGenerator { public static void main(String[] args) { File f = new File("src/com/guit/client/dom"); String[] files = f.list(); for (String file : files) { if (file.endsWith(".java")) { String className = file.substring(0, file.length() - 5); String canonicalName = "com.guit.client.dom." + className; Class<?> clazz = forName(canonicalName); if (className.equals("Element")) { continue; } StringBuilder sb = new StringBuilder(); sb.append("package com.guit.client.dom.impl;\n"); sb.append("\n"); sb.append("public class " + className + "Impl extends ElementImpl implements " + canonicalName + " {\n"); sb.append(" \n"); sb.append(" public " + className + "Impl() {\n"); sb.append(" super(\"" + className.toLowerCase() + "\");\n"); sb.append(" }\n"); sb.append(" \n"); sb.append(" private com.google.gwt.dom.client." + className + "Element el() {\n"); sb.append(" return e.cast();\n"); sb.append(" }\n"); List<Method> methods = new ArrayList<Method>(); getMethods(clazz, methods); for (Method m : methods) { Class<?>[] parameters = m.getParameterTypes(); StringBuilder params = new StringBuilder(); StringBuilder paramsCall = new StringBuilder(); int n = 0; for (Class<?> p : parameters) { if (paramsCall.length() > 0) { paramsCall.append(", "); params.append(", "); } params.append(p.getName() + " arg" + n); paramsCall.append("arg" + n); n++; } String returnTypeString = print(m); boolean returnsVoid = returnTypeString.equals("void"); String name = m.getName(); String caller = name; if (!returnsVoid && !caller.startsWith("get")) { caller = "get" + caller.substring(0, 1).toUpperCase() + caller.substring(1); } else if (returnsVoid && !caller.startsWith("set")) { caller = "set" + caller.substring(0, 1).toUpperCase() + caller.substring(1); } sb.append(" \n"); sb.append(" @Override\n"); sb.append(" public " + returnTypeString + " " + name + "(" + params + ") {\n"); sb.append(" " + (returnsVoid ? "" : "return ") + "el()." + caller + "(" + paramsCall + ");\n"); sb.append(" }\n"); } sb.append("}\n"); // try { // Files.write(sb.toString().getBytes(), new // File("src/com/guit/client/dom/impl/" // + className + "Impl.java")); // } catch (IOException e) { // throw new RuntimeException(e); // } } } } private static String print(Method m) { StringBuilder sb = new StringBuilder(); Type c = m.getGenericReturnType(); if (c instanceof ParameterizedType) { ParameterizedType pt = (ParameterizedType) c; sb.append(((Class<?>) pt.getRawType()).getCanonicalName()); sb.append("<"); boolean f = true; for (Type t : pt.getActualTypeArguments()) { if (f) { f = false; } else { sb.append(", "); } sb.append(((Class<?>) t).getCanonicalName()); } sb.append(">"); } else { sb.append(m.getReturnType().getCanonicalName()); } return sb.toString(); } private static void getMethods(Class<?> clazz, List<Method> methods) { for (Method method : clazz.getDeclaredMethods()) { methods.add(method); } Class<?>[] interfaces = clazz.getInterfaces(); for (Class<?> c : interfaces) { if (!c.equals(com.guit.client.dom.Element.class)) { getMethods(c, methods); } } } private static Class<?> forName(String className) { try { return Class.forName(className); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } } }