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;
18 import java.util.Properties;
19 import java.util.ServiceLoader;
21 import java.util.logging.Level;
22 import java.util.logging.Logger;
23 import javax.annotation.processing.AbstractProcessor;
24 import javax.annotation.processing.Processor;
25 import javax.annotation.processing.RoundEnvironment;
26 import javax.annotation.processing.SupportedAnnotationTypes;
27 import javax.annotation.processing.SupportedSourceVersion;
28 import javax.lang.model.SourceVersion;
29 import javax.lang.model.element.Element;
30 import javax.lang.model.element.PackageElement;
31 import javax.lang.model.element.TypeElement;
32 import javax.tools.JavaFileObject;
33 import org.apidesign.livedb.LiveDB;
34 import org.openide.util.lookup.ServiceProvider;
38 * @author Jaroslav Tulach <jtulach@netbeans.org>
40 @SupportedAnnotationTypes("org.apidesign.livedb.LiveDB")
41 @SupportedSourceVersion(SourceVersion.RELEASE_6)
42 @ServiceProvider(service=Processor.class)
43 public class LiveDBProcessor extends AbstractProcessor {
45 public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
46 for (Element e : roundEnv.getElementsAnnotatedWith(LiveDB.class)) {
47 LiveDB db = e.getAnnotation(LiveDB.class);
48 PackageElement pe = (PackageElement)e;
49 String clsName = pe.getQualifiedName().toString() + "." + db.classname();
51 JavaFileObject src = processingEnv.getFiler().createSourceFile(clsName, pe);
52 Writer w = src.openWriter();
53 Connection c = getConnection(db.url(), db.user(), db.password());
54 CallableStatement s = c.prepareCall(db.query());
55 ResultSet rs = s.executeQuery();
56 ResultSetMetaData md = rs.getMetaData();
57 w.append("package " + pe.getQualifiedName() + ";\n");
58 w.append("import java.util.List;\n");
59 w.append("import java.util.ArrayList;\n");
60 w.append("import java.sql.*;\n");
61 w.append("class " + db.classname() + " {\n");
62 for (int i = 1; i <= md.getColumnCount(); i++) {
63 w.append(" public final " + md.getColumnClassName(i) + " " + md.getColumnName(i) + ";\n");
65 w.append(" private " + db.classname() + "(\n");
66 for (int i = 1; i <= md.getColumnCount(); i++) {
67 w.append(" " + md.getColumnClassName(i) + " " + md.getColumnName(i));
68 if (i < md.getColumnCount()) {
75 for (int i = 1; i <= md.getColumnCount(); i++) {
76 w.append(" this." + md.getColumnName(i) + " = " + md.getColumnName(i) + ";\n");
79 w.append(" public static List<" + db.classname() + "> query() throws SQLException {\n");
80 w.append(" Connection c = DriverManager.getConnection(\"" + db.url() + "\", \"" + db.user() + "\", \"" + db.password() +"\");\n");
81 w.append(" List<" + db.classname() + "> res = new ArrayList<" + db.classname() + ">();\n");
82 w.append(" CallableStatement s = c.prepareCall(\"" + db.query() + "\");\n");
83 w.append(" ResultSet rs = s.executeQuery();\n");
84 w.append(" ResultSetMetaData md = rs.getMetaData();\n");
85 w.append(" while (rs.next()) {\n");
86 w.append(" res.add(new " + db.classname() + "(\n");
87 for (int i = 1; i <= md.getColumnCount(); i++) {
88 w.append(" (" + md.getColumnClassName(i) + ")rs.getObject(" + i + ")");
89 if (i < md.getColumnCount()) {
97 w.append(" return res;\n");
101 } catch (IOException ex) {
102 throw new IllegalStateException(ex);
103 } catch (SQLException ex) {
104 throw new IllegalStateException(ex);
110 private static Connection getConnection(String url, String user, String password)
111 throws SQLException {
112 final ClassLoader cl = LiveDBProcessor.class.getClassLoader();
113 for (Driver d : ServiceLoader.load(Driver.class, cl)) {
114 // System.out.println("looked up: " + d);
115 if (d.acceptsURL(url)) {
116 //System.out.println("accepts: " + d);
117 Properties p = new Properties();
119 p.put("password", password);
120 return d.connect(url, p);
123 throw new SQLException("No driver found for " + url);