# HG changeset patch # User Jaroslav Tulach # Date 1279316174 -7200 # Node ID 2b670a8a31aeaefacedf52acc7667acf41674a0e # Parent 23511f8a9718535925e4b8da53aef224818e5304# Parent 9d430d9bc4b163bb291cd7db5faa0477197ca9c4 Merging livedb branch, as it seems to work OK now diff -r 23511f8a9718 -r 2b670a8a31ae samples/libs/build.xml --- a/samples/libs/build.xml Mon Jun 28 09:29:30 2010 +0200 +++ b/samples/libs/build.xml Fri Jul 16 23:36:14 2010 +0200 @@ -5,6 +5,14 @@ + + + + + + + + diff -r 23511f8a9718 -r 2b670a8a31ae samples/livedb/build.xml --- a/samples/livedb/build.xml Mon Jun 28 09:29:30 2010 +0200 +++ b/samples/livedb/build.xml Fri Jul 16 23:36:14 2010 +0200 @@ -71,4 +71,39 @@ nbproject/build-impl.xml file. --> + + + + + + + + + + + + + + + + create table APP.AGE ( + NAME VARCHAR(30), + AGE NUMERIC(3) + ); + insert into APP.AGE values ('apidesign', 3); + + + none + + + diff -r 23511f8a9718 -r 2b670a8a31ae samples/livedb/nbproject/build-impl.xml --- a/samples/livedb/nbproject/build-impl.xml Mon Jun 28 09:29:30 2010 +0200 +++ b/samples/livedb/nbproject/build-impl.xml Fri Jul 16 23:36:14 2010 +0200 @@ -55,7 +55,14 @@ - + + + + + + + + @@ -231,7 +238,7 @@ - + @@ -700,6 +707,14 @@ + + + + + + + + diff -r 23511f8a9718 -r 2b670a8a31ae samples/livedb/nbproject/genfiles.properties --- a/samples/livedb/nbproject/genfiles.properties Mon Jun 28 09:29:30 2010 +0200 +++ b/samples/livedb/nbproject/genfiles.properties Fri Jul 16 23:36:14 2010 +0200 @@ -1,8 +1,8 @@ build.xml.data.CRC32=acb473e7 build.xml.script.CRC32=61ba5a6a -build.xml.stylesheet.CRC32=958a1d3e@1.38.0.45 +build.xml.stylesheet.CRC32=28e38971@1.39.0.45 # This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. # Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. nbproject/build-impl.xml.data.CRC32=acb473e7 -nbproject/build-impl.xml.script.CRC32=c82572ef -nbproject/build-impl.xml.stylesheet.CRC32=c75ce636@1.38.0.45 +nbproject/build-impl.xml.script.CRC32=e442701c +nbproject/build-impl.xml.stylesheet.CRC32=78d75bcc@1.39.0.45 diff -r 23511f8a9718 -r 2b670a8a31ae samples/livedb/nbproject/project.properties --- a/samples/livedb/nbproject/project.properties Mon Jun 28 09:29:30 2010 +0200 +++ b/samples/livedb/nbproject/project.properties Fri Jul 16 23:36:14 2010 +0200 @@ -26,6 +26,7 @@ dist.javadoc.dir=${dist.dir}/javadoc endorsed.classpath= excludes= +file.reference.derby.jar=../libs/dist/derby.jar file.reference.junit-4.4.jar=../libs/dist/junit-4.4.jar file.reference.org-openide-util-lookup.jar=../libs/dist/org-openide-util-lookup.jar includes=** @@ -42,6 +43,7 @@ javac.test.classpath=\ ${javac.classpath}:\ ${build.classes.dir}:\ + ${file.reference.derby.jar}:\ ${file.reference.junit-4.4.jar} javac.test.processorpath=\ ${javac.test.classpath} diff -r 23511f8a9718 -r 2b670a8a31ae 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 Fri Jul 16 23:36:14 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 2b670a8a31ae 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 Fri Jul 16 23:36:14 2010 +0200 @@ -7,7 +7,19 @@ 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.Properties; +import java.util.ServiceLoader; import java.util.Set; +import java.util.logging.Level; +import java.util.logging.Logger; import javax.annotation.processing.AbstractProcessor; import javax.annotation.processing.Processor; import javax.annotation.processing.RoundEnvironment; @@ -38,16 +50,76 @@ try { JavaFileObject src = processingEnv.getFiler().createSourceFile(clsName, pe); Writer w = src.openWriter(); + Connection c = 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; } + private static Connection getConnection(String url, String user, String password) + throws SQLException { + final ClassLoader cl = LiveDBProcessor.class.getClassLoader(); + for (Driver d : ServiceLoader.load(Driver.class, cl)) { +// System.out.println("looked up: " + d); + if (d.acceptsURL(url)) { + //System.out.println("accepts: " + d); + Properties p = new Properties(); + p.put("user", user); + p.put("password", password); + return d.connect(url, p); + } + } + throw new SQLException("No driver found for " + url); + } } diff -r 23511f8a9718 -r 2b670a8a31ae 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 Fri Jul 16 23:36:14 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,12 @@ 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(); + assertEquals("One record", 1, ages.size()); + Age age = ages.get(0); + assertEquals("name is apidesign", "apidesign", age.NAME); + assertEquals("it is three years old", 3, age.AGE.intValue()); } } diff -r 23511f8a9718 -r 2b670a8a31ae 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 Fri Jul 16 23:36:14 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:classpath:db" +) package org.apidesign.livedb.example; import org.apidesign.livedb.LiveDB;