samples/livedb/src/org/apidesign/livedb/impl/LiveDBProcessor.java
author Jaroslav Tulach <jtulach@netbeans.org>
Thu, 29 Jul 2010 17:44:59 +0200
changeset 361 6507a9474b6d
parent 358 afdd66815ee3
child 363 cbeeeb6ae9c6
permissions -rw-r--r--
Exposing code snippets, removing useless headers
jtulach@355
     1
package org.apidesign.livedb.impl;
jtulach@355
     2
jtulach@355
     3
import java.io.IOException;
jtulach@355
     4
import java.io.Writer;
jtulach@357
     5
import java.sql.CallableStatement;
jtulach@357
     6
import java.sql.Connection;
jtulach@357
     7
import java.sql.Driver;
jtulach@357
     8
import java.sql.ResultSet;
jtulach@357
     9
import java.sql.ResultSetMetaData;
jtulach@357
    10
import java.sql.SQLException;
jtulach@358
    11
import java.util.Properties;
jtulach@358
    12
import java.util.ServiceLoader;
jtulach@355
    13
import java.util.Set;
jtulach@355
    14
import javax.annotation.processing.AbstractProcessor;
jtulach@355
    15
import javax.annotation.processing.Processor;
jtulach@355
    16
import javax.annotation.processing.RoundEnvironment;
jtulach@355
    17
import javax.annotation.processing.SupportedAnnotationTypes;
jtulach@355
    18
import javax.annotation.processing.SupportedSourceVersion;
jtulach@355
    19
import javax.lang.model.SourceVersion;
jtulach@355
    20
import javax.lang.model.element.Element;
jtulach@355
    21
import javax.lang.model.element.PackageElement;
jtulach@355
    22
import javax.lang.model.element.TypeElement;
jtulach@355
    23
import javax.tools.JavaFileObject;
jtulach@355
    24
import org.apidesign.livedb.LiveDB;
jtulach@355
    25
import org.openide.util.lookup.ServiceProvider;
jtulach@355
    26
jtulach@355
    27
/**
jtulach@355
    28
 *
jtulach@355
    29
 * @author Jaroslav Tulach <jtulach@netbeans.org>
jtulach@355
    30
 */
jtulach@361
    31
// BEGIN: livedb.processor
jtulach@355
    32
@SupportedAnnotationTypes("org.apidesign.livedb.LiveDB")
jtulach@355
    33
@SupportedSourceVersion(SourceVersion.RELEASE_6)
jtulach@355
    34
@ServiceProvider(service=Processor.class)
jtulach@361
    35
public final class LiveDBProcessor extends AbstractProcessor {
jtulach@355
    36
    @Override
jtulach@355
    37
    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
jtulach@355
    38
        for (Element e : roundEnv.getElementsAnnotatedWith(LiveDB.class)) {
jtulach@355
    39
            LiveDB db = e.getAnnotation(LiveDB.class);
jtulach@355
    40
            PackageElement pe = (PackageElement)e;
jtulach@355
    41
            String clsName = pe.getQualifiedName().toString() + "." + db.classname();
jtulach@355
    42
            try {
jtulach@355
    43
                JavaFileObject src = processingEnv.getFiler().createSourceFile(clsName, pe);
jtulach@355
    44
                Writer w = src.openWriter();
jtulach@358
    45
                Connection c = getConnection(db.url(), db.user(), db.password());
jtulach@357
    46
                CallableStatement s = c.prepareCall(db.query());
jtulach@357
    47
                ResultSet rs = s.executeQuery();
jtulach@357
    48
                ResultSetMetaData md = rs.getMetaData();
jtulach@355
    49
                w.append("package " + pe.getQualifiedName() + ";\n");
jtulach@357
    50
                w.append("import java.util.List;\n");
jtulach@357
    51
                w.append("import java.util.ArrayList;\n");
jtulach@357
    52
                w.append("import java.sql.*;\n");
jtulach@355
    53
                w.append("class " + db.classname() + " {\n");
jtulach@357
    54
                for (int i = 1; i <= md.getColumnCount(); i++) {
jtulach@357
    55
                    w.append("  public final " + md.getColumnClassName(i) + " " + md.getColumnName(i) + ";\n");
jtulach@357
    56
                }
jtulach@357
    57
                w.append("  private " + db.classname() + "(\n");
jtulach@357
    58
                for (int i = 1; i <= md.getColumnCount(); i++) {
jtulach@357
    59
                    w.append("    " + md.getColumnClassName(i) + " " + md.getColumnName(i));
jtulach@357
    60
                    if (i < md.getColumnCount()) {
jtulach@357
    61
                        w.append(",\n");
jtulach@357
    62
                    } else {
jtulach@357
    63
                        w.append("\n");
jtulach@357
    64
                    }
jtulach@357
    65
                }
jtulach@357
    66
                w.append("  ) {\n");
jtulach@357
    67
                for (int i = 1; i <= md.getColumnCount(); i++) {
jtulach@357
    68
                    w.append("    this." + md.getColumnName(i) + " = " + md.getColumnName(i) + ";\n");
jtulach@357
    69
                }
jtulach@357
    70
                w.append("  }\n");
jtulach@357
    71
                w.append("  public static List<" + db.classname() + "> query() throws SQLException {\n");
jtulach@357
    72
                w.append("    Connection c = DriverManager.getConnection(\"" + db.url() + "\", \"" + db.user() + "\", \"" + db.password() +"\");\n");
jtulach@357
    73
                w.append("    List<" + db.classname() + "> res = new ArrayList<" + db.classname() + ">();\n");
jtulach@357
    74
                w.append("    CallableStatement s = c.prepareCall(\"" + db.query() + "\");\n");
jtulach@357
    75
                w.append("    ResultSet rs = s.executeQuery();\n");
jtulach@357
    76
                w.append("    ResultSetMetaData md = rs.getMetaData();\n");
jtulach@357
    77
                w.append("    while (rs.next()) {\n");
jtulach@357
    78
                w.append("      res.add(new " + db.classname() + "(\n");
jtulach@357
    79
                for (int i = 1; i <= md.getColumnCount(); i++) {
jtulach@357
    80
                    w.append("        (" + md.getColumnClassName(i) + ")rs.getObject(" + i + ")");
jtulach@357
    81
                    if (i < md.getColumnCount()) {
jtulach@357
    82
                        w.append(",\n");
jtulach@357
    83
                    } else {
jtulach@357
    84
                        w.append("\n");
jtulach@357
    85
                    }
jtulach@357
    86
                }
jtulach@357
    87
                w.append("      ));\n");
jtulach@357
    88
                w.append("    };\n");
jtulach@357
    89
                w.append("    return res;\n");
jtulach@357
    90
                w.append("  }");
jtulach@355
    91
                w.append("}");
jtulach@355
    92
                w.close();
jtulach@355
    93
            } catch (IOException ex) {
jtulach@355
    94
                throw new IllegalStateException(ex);
jtulach@357
    95
            } catch (SQLException ex) {
jtulach@357
    96
                throw new IllegalStateException(ex);
jtulach@355
    97
            }
jtulach@355
    98
        }
jtulach@355
    99
        return true;
jtulach@355
   100
    }
jtulach@361
   101
// FINISH: livedb.processor
jtulach@358
   102
    private static Connection getConnection(String url, String user, String password) 
jtulach@358
   103
    throws SQLException {
jtulach@358
   104
        final ClassLoader cl = LiveDBProcessor.class.getClassLoader();
jtulach@358
   105
        for (Driver d : ServiceLoader.load(Driver.class, cl)) {
jtulach@358
   106
//            System.out.println("looked up: " + d);
jtulach@358
   107
            if (d.acceptsURL(url)) {
jtulach@358
   108
                //System.out.println("accepts: " + d);
jtulach@358
   109
                Properties p = new Properties();
jtulach@358
   110
                p.put("user", user);
jtulach@358
   111
                p.put("password", password);
jtulach@358
   112
                return d.connect(url, p);
jtulach@358
   113
            }
jtulach@357
   114
        }
jtulach@358
   115
        throw new SQLException("No driver found for " + url);
jtulach@357
   116
    }
jtulach@355
   117
}