# HG changeset patch # User Jaroslav Tulach # Date 1279133793 -7200 # Node ID 837370f791ba7bf0c9d56e0b63da59ad7d466341 # Parent 23511f8a9718535925e4b8da53aef224818e5304 Rewritting the processor to really connect to a database and read metadata from a real select statement diff -r 23511f8a9718 -r 837370f791ba samples/livedb/src/org/apidesign/livedb/LiveDB.java --- a/samples/livedb/src/org/apidesign/livedb/LiveDB.java Mon Jun 28 09:29:30 2010 +0200 +++ b/samples/livedb/src/org/apidesign/livedb/LiveDB.java Wed Jul 14 20:56:33 2010 +0200 @@ -12,6 +12,9 @@ @Target(ElementType.PACKAGE) @Retention(RetentionPolicy.SOURCE) public @interface LiveDB { + String url(); + String user(); + String password(); + String query(); String classname(); - String field(); } diff -r 23511f8a9718 -r 837370f791ba samples/livedb/src/org/apidesign/livedb/impl/LiveDBProcessor.java --- a/samples/livedb/src/org/apidesign/livedb/impl/LiveDBProcessor.java Mon Jun 28 09:29:30 2010 +0200 +++ b/samples/livedb/src/org/apidesign/livedb/impl/LiveDBProcessor.java Wed Jul 14 20:56:33 2010 +0200 @@ -7,6 +7,14 @@ import java.io.IOException; import java.io.Writer; +import java.sql.CallableStatement; +import java.sql.Connection; +import java.sql.Driver; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.ResultSetMetaData; +import java.sql.SQLException; +import java.util.Enumeration; import java.util.Set; import javax.annotation.processing.AbstractProcessor; import javax.annotation.processing.Processor; @@ -38,16 +46,69 @@ try { JavaFileObject src = processingEnv.getFiler().createSourceFile(clsName, pe); Writer w = src.openWriter(); + Connection c = DriverManager.getConnection(db.url(), db.user(), db.password()); + CallableStatement s = c.prepareCall(db.query()); + ResultSet rs = s.executeQuery(); + ResultSetMetaData md = rs.getMetaData(); w.append("package " + pe.getQualifiedName() + ";\n"); + w.append("import java.util.List;\n"); + w.append("import java.util.ArrayList;\n"); + w.append("import java.sql.*;\n"); w.append("class " + db.classname() + " {\n"); - w.append(" public String " + db.field() + ";\n"); + for (int i = 1; i <= md.getColumnCount(); i++) { + w.append(" public final " + md.getColumnClassName(i) + " " + md.getColumnName(i) + ";\n"); + } + w.append(" private " + db.classname() + "(\n"); + for (int i = 1; i <= md.getColumnCount(); i++) { + w.append(" " + md.getColumnClassName(i) + " " + md.getColumnName(i)); + if (i < md.getColumnCount()) { + w.append(",\n"); + } else { + w.append("\n"); + } + } + w.append(" ) {\n"); + for (int i = 1; i <= md.getColumnCount(); i++) { + w.append(" this." + md.getColumnName(i) + " = " + md.getColumnName(i) + ";\n"); + } + w.append(" }\n"); + w.append(" public static List<" + db.classname() + "> query() throws SQLException {\n"); + w.append(" Connection c = DriverManager.getConnection(\"" + db.url() + "\", \"" + db.user() + "\", \"" + db.password() +"\");\n"); + w.append(" List<" + db.classname() + "> res = new ArrayList<" + db.classname() + ">();\n"); + w.append(" CallableStatement s = c.prepareCall(\"" + db.query() + "\");\n"); + w.append(" ResultSet rs = s.executeQuery();\n"); + w.append(" ResultSetMetaData md = rs.getMetaData();\n"); + w.append(" while (rs.next()) {\n"); + w.append(" res.add(new " + db.classname() + "(\n"); + for (int i = 1; i <= md.getColumnCount(); i++) { + w.append(" (" + md.getColumnClassName(i) + ")rs.getObject(" + i + ")"); + if (i < md.getColumnCount()) { + w.append(",\n"); + } else { + w.append("\n"); + } + } + w.append(" ));\n"); + w.append(" };\n"); + w.append(" return res;\n"); + w.append(" }"); w.append("}"); w.close(); } catch (IOException ex) { throw new IllegalStateException(ex); + } catch (SQLException ex) { + throw new IllegalStateException(ex); } } return true; } + static { + // init drivers + Enumeration en; + en = DriverManager.getDrivers(); + while (en.hasMoreElements()) { + Driver driver = en.nextElement(); + } + } } diff -r 23511f8a9718 -r 837370f791ba samples/livedb/test/org/apidesign/livedb/example/LiveDBTest.java --- a/samples/livedb/test/org/apidesign/livedb/example/LiveDBTest.java Mon Jun 28 09:29:30 2010 +0200 +++ b/samples/livedb/test/org/apidesign/livedb/example/LiveDBTest.java Wed Jul 14 20:56:33 2010 +0200 @@ -5,6 +5,8 @@ package org.apidesign.livedb.example; +import java.sql.SQLException; +import java.util.List; import junit.framework.TestCase; /** @@ -17,10 +19,11 @@ super(testName); } - public void testSomeMethod() { - DBAccess db = new DBAccess(); - db.jarda = "Ahoj"; - assertEquals("Ahoj", db.jarda); + public void testSomeMethod() throws SQLException { + List ages = Age.query(); + for (Age age : ages) { + System.out.printf("%s is %s years old\n", age.NAME, age.AGE); + } } } diff -r 23511f8a9718 -r 837370f791ba samples/livedb/test/org/apidesign/livedb/example/package-info.java --- a/samples/livedb/test/org/apidesign/livedb/example/package-info.java Mon Jun 28 09:29:30 2010 +0200 +++ b/samples/livedb/test/org/apidesign/livedb/example/package-info.java Wed Jul 14 20:56:33 2010 +0200 @@ -1,6 +1,10 @@ -@LiveDB(classname="DBAccess", field="jarda") +@LiveDB( + classname="Age", password="j1", user="j1", + query="select * from APP.AGE", + url="jdbc:derby://localhost:1527/livedb" +) package org.apidesign.livedb.example; import org.apidesign.livedb.LiveDB;