1 package org.apidesign.livedb.impl;
3 import java.io.IOException;
5 import java.sql.CallableStatement;
6 import java.sql.Connection;
7 import java.sql.Driver;
8 import java.sql.ResultSet;
9 import java.sql.ResultSetMetaData;
10 import java.sql.SQLException;
11 import java.util.Properties;
12 import java.util.ServiceLoader;
14 import javax.annotation.processing.AbstractProcessor;
15 import javax.annotation.processing.Processor;
16 import javax.annotation.processing.RoundEnvironment;
17 import javax.annotation.processing.SupportedAnnotationTypes;
18 import javax.annotation.processing.SupportedSourceVersion;
19 import javax.lang.model.SourceVersion;
20 import javax.lang.model.element.Element;
21 import javax.lang.model.element.PackageElement;
22 import javax.lang.model.element.TypeElement;
23 import javax.tools.JavaFileObject;
24 import org.apidesign.livedb.LiveDB;
25 import org.openide.util.lookup.ServiceProvider;
29 * @author Jaroslav Tulach <jtulach@netbeans.org>
31 // BEGIN: livedb.processor
32 @SupportedAnnotationTypes("org.apidesign.livedb.LiveDB")
33 @SupportedSourceVersion(SourceVersion.RELEASE_6)
34 @ServiceProvider(service=Processor.class)
35 public final class LiveDBProcessor extends AbstractProcessor {
37 public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
38 for (Element e : roundEnv.getElementsAnnotatedWith(LiveDB.class)) {
39 LiveDB db = e.getAnnotation(LiveDB.class);
40 PackageElement pe = (PackageElement)e;
41 String clsName = pe.getQualifiedName().toString() + "." + db.classname();
43 JavaFileObject src = processingEnv.getFiler().createSourceFile(clsName, pe);
44 Writer w = src.openWriter();
45 Connection c = getConnection(db.url(), db.user(), db.password());
46 CallableStatement s = c.prepareCall(db.query());
47 ResultSet rs = s.executeQuery();
48 ResultSetMetaData md = rs.getMetaData();
49 w.append("package " + pe.getQualifiedName() + ";\n");
50 w.append("import java.util.List;\n");
51 w.append("import java.util.ArrayList;\n");
52 w.append("import java.sql.*;\n");
53 w.append("class " + db.classname() + " {\n");
54 for (int i = 1; i <= md.getColumnCount(); i++) {
55 w.append(" public final " + md.getColumnClassName(i) + " " + md.getColumnName(i) + ";\n");
57 w.append(" private " + db.classname() + "(\n");
58 for (int i = 1; i <= md.getColumnCount(); i++) {
59 w.append(" " + md.getColumnClassName(i) + " " + md.getColumnName(i));
60 if (i < md.getColumnCount()) {
67 for (int i = 1; i <= md.getColumnCount(); i++) {
68 w.append(" this." + md.getColumnName(i) + " = " + md.getColumnName(i) + ";\n");
71 w.append(" public static List<" + db.classname() + "> query() throws SQLException {\n");
72 w.append(" Connection c = DriverManager.getConnection(\"" + db.url() + "\", \"" + db.user() + "\", \"" + db.password() +"\");\n");
73 w.append(" List<" + db.classname() + "> res = new ArrayList<" + db.classname() + ">();\n");
74 w.append(" CallableStatement s = c.prepareCall(\"" + db.query() + "\");\n");
75 w.append(" ResultSet rs = s.executeQuery();\n");
76 w.append(" ResultSetMetaData md = rs.getMetaData();\n");
77 w.append(" while (rs.next()) {\n");
78 w.append(" res.add(new " + db.classname() + "(\n");
79 for (int i = 1; i <= md.getColumnCount(); i++) {
80 w.append(" (" + md.getColumnClassName(i) + ")rs.getObject(" + i + ")");
81 if (i < md.getColumnCount()) {
89 w.append(" return res;\n");
93 } catch (IOException ex) {
94 throw new IllegalStateException(ex);
95 } catch (SQLException ex) {
96 throw new IllegalStateException(ex);
101 // FINISH: livedb.processor
102 private static Connection getConnection(String url, String user, String password)
103 throws SQLException {
104 final ClassLoader cl = LiveDBProcessor.class.getClassLoader();
105 for (Driver d : ServiceLoader.load(Driver.class, cl)) {
106 // System.out.println("looked up: " + d);
107 if (d.acceptsURL(url)) {
108 //System.out.println("accepts: " + d);
109 Properties p = new Properties();
111 p.put("password", password);
112 return d.connect(url, p);
115 throw new SQLException("No driver found for " + url);