Rewritting the processor to really connect to a database and read metadata from a real select statement
2 * To change this template, choose Tools | Templates
3 * and open the template in the editor.
6 package org.apidesign.livedb.impl;
8 import java.io.IOException;
10 import java.sql.CallableStatement;
11 import java.sql.Connection;
12 import java.sql.Driver;
13 import java.sql.DriverManager;
14 import java.sql.ResultSet;
15 import java.sql.ResultSetMetaData;
16 import java.sql.SQLException;
17 import java.util.Enumeration;
19 import javax.annotation.processing.AbstractProcessor;
20 import javax.annotation.processing.Processor;
21 import javax.annotation.processing.RoundEnvironment;
22 import javax.annotation.processing.SupportedAnnotationTypes;
23 import javax.annotation.processing.SupportedSourceVersion;
24 import javax.lang.model.SourceVersion;
25 import javax.lang.model.element.Element;
26 import javax.lang.model.element.PackageElement;
27 import javax.lang.model.element.TypeElement;
28 import javax.tools.JavaFileObject;
29 import org.apidesign.livedb.LiveDB;
30 import org.openide.util.lookup.ServiceProvider;
34 * @author Jaroslav Tulach <jtulach@netbeans.org>
36 @SupportedAnnotationTypes("org.apidesign.livedb.LiveDB")
37 @SupportedSourceVersion(SourceVersion.RELEASE_6)
38 @ServiceProvider(service=Processor.class)
39 public class LiveDBProcessor extends AbstractProcessor {
41 public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
42 for (Element e : roundEnv.getElementsAnnotatedWith(LiveDB.class)) {
43 LiveDB db = e.getAnnotation(LiveDB.class);
44 PackageElement pe = (PackageElement)e;
45 String clsName = pe.getQualifiedName().toString() + "." + db.classname();
47 JavaFileObject src = processingEnv.getFiler().createSourceFile(clsName, pe);
48 Writer w = src.openWriter();
49 Connection c = DriverManager.getConnection(db.url(), db.user(), db.password());
50 CallableStatement s = c.prepareCall(db.query());
51 ResultSet rs = s.executeQuery();
52 ResultSetMetaData md = rs.getMetaData();
53 w.append("package " + pe.getQualifiedName() + ";\n");
54 w.append("import java.util.List;\n");
55 w.append("import java.util.ArrayList;\n");
56 w.append("import java.sql.*;\n");
57 w.append("class " + db.classname() + " {\n");
58 for (int i = 1; i <= md.getColumnCount(); i++) {
59 w.append(" public final " + md.getColumnClassName(i) + " " + md.getColumnName(i) + ";\n");
61 w.append(" private " + db.classname() + "(\n");
62 for (int i = 1; i <= md.getColumnCount(); i++) {
63 w.append(" " + md.getColumnClassName(i) + " " + md.getColumnName(i));
64 if (i < md.getColumnCount()) {
71 for (int i = 1; i <= md.getColumnCount(); i++) {
72 w.append(" this." + md.getColumnName(i) + " = " + md.getColumnName(i) + ";\n");
75 w.append(" public static List<" + db.classname() + "> query() throws SQLException {\n");
76 w.append(" Connection c = DriverManager.getConnection(\"" + db.url() + "\", \"" + db.user() + "\", \"" + db.password() +"\");\n");
77 w.append(" List<" + db.classname() + "> res = new ArrayList<" + db.classname() + ">();\n");
78 w.append(" CallableStatement s = c.prepareCall(\"" + db.query() + "\");\n");
79 w.append(" ResultSet rs = s.executeQuery();\n");
80 w.append(" ResultSetMetaData md = rs.getMetaData();\n");
81 w.append(" while (rs.next()) {\n");
82 w.append(" res.add(new " + db.classname() + "(\n");
83 for (int i = 1; i <= md.getColumnCount(); i++) {
84 w.append(" (" + md.getColumnClassName(i) + ")rs.getObject(" + i + ")");
85 if (i < md.getColumnCount()) {
93 w.append(" return res;\n");
97 } catch (IOException ex) {
98 throw new IllegalStateException(ex);
99 } catch (SQLException ex) {
100 throw new IllegalStateException(ex);
108 Enumeration<Driver> en;
109 en = DriverManager.getDrivers();
110 while (en.hasMoreElements()) {
111 Driver driver = en.nextElement();