# HG changeset patch # User Jaroslav Tulach # Date 1280492005 -7200 # Node ID cbeeeb6ae9c651556679ea2162316b0baa0ce3b5 # Parent de139a9cfb3683865d6282e06bc1beab17c969f7 Shorter lines and less scary code of the processor diff -r de139a9cfb36 -r cbeeeb6ae9c6 samples/livedb/src/org/apidesign/livedb/impl/LiveDBProcessor.java --- a/samples/livedb/src/org/apidesign/livedb/impl/LiveDBProcessor.java Thu Jul 29 17:55:04 2010 +0200 +++ b/samples/livedb/src/org/apidesign/livedb/impl/LiveDBProcessor.java Fri Jul 30 14:13:25 2010 +0200 @@ -12,6 +12,7 @@ import java.util.ServiceLoader; import java.util.Set; import javax.annotation.processing.AbstractProcessor; +import javax.annotation.processing.Filer; import javax.annotation.processing.Processor; import javax.annotation.processing.RoundEnvironment; import javax.annotation.processing.SupportedAnnotationTypes; @@ -34,60 +35,30 @@ @ServiceProvider(service=Processor.class) public final class LiveDBProcessor extends AbstractProcessor { @Override - public boolean process(Set annotations, RoundEnvironment roundEnv) { + public boolean process( + Set annotations, RoundEnvironment roundEnv + ) { + final Filer filer = processingEnv.getFiler(); for (Element e : roundEnv.getElementsAnnotatedWith(LiveDB.class)) { LiveDB db = e.getAnnotation(LiveDB.class); PackageElement pe = (PackageElement)e; - String clsName = pe.getQualifiedName().toString() + "." + db.classname(); + String clsName = pe.getQualifiedName() + "." + db.classname(); try { - JavaFileObject src = processingEnv.getFiler().createSourceFile(clsName, pe); + JavaFileObject src = filer.createSourceFile(clsName, pe); Writer w = src.openWriter(); - Connection c = getConnection(db.url(), db.user(), db.password()); + Connection c = getConnection( + db.url(), db.user(), db.password() + ); CallableStatement s = c.prepareCall(db.query()); ResultSet rs = s.executeQuery(); ResultSetMetaData md = rs.getMetaData(); - w.append("package " + pe.getQualifiedName() + ";\n"); - w.append("import java.util.List;\n"); - w.append("import java.util.ArrayList;\n"); - w.append("import java.sql.*;\n"); + generateClassHeader(w, pe, db); w.append("class " + db.classname() + " {\n"); for (int i = 1; i <= md.getColumnCount(); i++) { - w.append(" public final " + md.getColumnClassName(i) + " " + md.getColumnName(i) + ";\n"); + generateField(w, md, i); } - w.append(" private " + db.classname() + "(\n"); - for (int i = 1; i <= md.getColumnCount(); i++) { - w.append(" " + md.getColumnClassName(i) + " " + md.getColumnName(i)); - if (i < md.getColumnCount()) { - w.append(",\n"); - } else { - w.append("\n"); - } - } - w.append(" ) {\n"); - for (int i = 1; i <= md.getColumnCount(); i++) { - w.append(" this." + md.getColumnName(i) + " = " + md.getColumnName(i) + ";\n"); - } - w.append(" }\n"); - w.append(" public static List<" + db.classname() + "> query() throws SQLException {\n"); - w.append(" Connection c = DriverManager.getConnection(\"" + db.url() + "\", \"" + db.user() + "\", \"" + db.password() +"\");\n"); - w.append(" List<" + db.classname() + "> res = new ArrayList<" + db.classname() + ">();\n"); - w.append(" CallableStatement s = c.prepareCall(\"" + db.query() + "\");\n"); - w.append(" ResultSet rs = s.executeQuery();\n"); - w.append(" ResultSetMetaData md = rs.getMetaData();\n"); - w.append(" while (rs.next()) {\n"); - w.append(" res.add(new " + db.classname() + "(\n"); - for (int i = 1; i <= md.getColumnCount(); i++) { - w.append(" (" + md.getColumnClassName(i) + ")rs.getObject(" + i + ")"); - if (i < md.getColumnCount()) { - w.append(",\n"); - } else { - w.append("\n"); - } - } - w.append(" ));\n"); - w.append(" };\n"); - w.append(" return res;\n"); - w.append(" }"); + generateConstructor(w, db, md); + generateQueryMethod(w, db, md); w.append("}"); w.close(); } catch (IOException ex) { @@ -99,6 +70,75 @@ return true; } // FINISH: livedb.processor + + private void generateQueryMethod(Writer w, LiveDB db, ResultSetMetaData md) throws SQLException, IOException { + w.append(" public static List<" + db.classname() + "> ") + .append("query() throws SQLException {\n"); + w.append(" Connection c = DriverManager.getConnection(\"") + .append(db.url()).append("\", \"") + .append(db.user()).append("\", \"") + .append(db.password()).append("\");\n"); + w.append(" List<").append(db.classname()) + .append("> res = new ArrayList<") + .append(db.classname()).append(">();\n"); + w.append(" CallableStatement s = c.prepareCall(\"") + .append(db.query()).append("\");\n"); + w.append(" ResultSet rs = s.executeQuery();\n"); + w.append(" ResultSetMetaData md = rs.getMetaData();\n"); + w.append(" while (rs.next()) {\n"); + w.append(" res.add(new " + db.classname() + "(\n"); + for (int i = 1; i <= md.getColumnCount(); i++) { + w.append(" (") + .append(md.getColumnClassName(i)) + .append(")rs.getObject(" + i).append(")"); + if (i < md.getColumnCount()) { + w.append(",\n"); + } else { + w.append("\n"); + } + } + w.append(" ));\n"); + w.append(" };\n"); + w.append(" return res;\n"); + w.append(" }"); + } + + private void generateConstructor(Writer w, LiveDB db, ResultSetMetaData md) throws SQLException, IOException { + w.append(" private " + db.classname() + "(\n"); + for (int i = 1; i <= md.getColumnCount(); i++) { + w.append(" ").append(md.getColumnClassName(i)) + .append(" ").append(md.getColumnName(i)); + if (i < md.getColumnCount()) { + w.append(",\n"); + } else { + w.append("\n"); + } + } + w.append(" ) {\n"); + for (int i = 1; i <= md.getColumnCount(); i++) { + w.append(" this.") + .append(md.getColumnName(i)) + .append(" = ") + .append(md.getColumnName(i)) + .append(";\n"); + } + w.append(" }\n"); + } + + private void generateField(Writer w, ResultSetMetaData md, int i) throws IOException, SQLException { + w.append(" public final ") + .append(md.getColumnClassName(i)) + .append(" ") + .append(md.getColumnName(i)) + .append(";\n"); + } + + private void generateClassHeader(Writer w, PackageElement pe, LiveDB db) throws IOException { + w.append("package " + pe.getQualifiedName() + ";\n"); + w.append("import java.util.List;\n"); + w.append("import java.util.ArrayList;\n"); + w.append("import java.sql.*;\n"); + } private static Connection getConnection(String url, String user, String password) throws SQLException { final ClassLoader cl = LiveDBProcessor.class.getClassLoader();