samples/livedb/src/org/apidesign/livedb/impl/LiveDBProcessor.java
author Jaroslav Tulach <jtulach@netbeans.org>
Thu, 15 Jul 2010 00:40:37 +0200
branchlivedb
changeset 358 afdd66815ee3
parent 357 837370f791ba
child 361 6507a9474b6d
permissions -rw-r--r--
If the JavaDB is on, we can compile and successfully execute the tests
     1 /*
     2  * To change this template, choose Tools | Templates
     3  * and open the template in the editor.
     4  */
     5 
     6 package org.apidesign.livedb.impl;
     7 
     8 import java.io.IOException;
     9 import java.io.Writer;
    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;
    20 import java.util.Set;
    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;
    35 
    36 /**
    37  *
    38  * @author Jaroslav Tulach <jtulach@netbeans.org>
    39  */
    40 @SupportedAnnotationTypes("org.apidesign.livedb.LiveDB")
    41 @SupportedSourceVersion(SourceVersion.RELEASE_6)
    42 @ServiceProvider(service=Processor.class)
    43 public class LiveDBProcessor extends AbstractProcessor {
    44     @Override
    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();
    50             try {
    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");
    64                 }
    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()) {
    69                         w.append(",\n");
    70                     } else {
    71                         w.append("\n");
    72                     }
    73                 }
    74                 w.append("  ) {\n");
    75                 for (int i = 1; i <= md.getColumnCount(); i++) {
    76                     w.append("    this." + md.getColumnName(i) + " = " + md.getColumnName(i) + ";\n");
    77                 }
    78                 w.append("  }\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()) {
    90                         w.append(",\n");
    91                     } else {
    92                         w.append("\n");
    93                     }
    94                 }
    95                 w.append("      ));\n");
    96                 w.append("    };\n");
    97                 w.append("    return res;\n");
    98                 w.append("  }");
    99                 w.append("}");
   100                 w.close();
   101             } catch (IOException ex) {
   102                 throw new IllegalStateException(ex);
   103             } catch (SQLException ex) {
   104                 throw new IllegalStateException(ex);
   105             }
   106         }
   107         return true;
   108     }
   109 
   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();
   118                 p.put("user", user);
   119                 p.put("password", password);
   120                 return d.connect(url, p);
   121             }
   122         }
   123         throw new SQLException("No driver found for " + url);
   124     }
   125 }