Author: mrdon Date: Sat Oct 8 01:44:42 2005 New Revision: 307274 URL: http://svn.apache.org/viewcvs?rev=307274&view=rev Log: == ibatis Integration == * Adding the automatic generation and registration of classes, one for each SqlMap namespace * Adding a unit test to ensure classes discovered and generated correctly * Adding ability to pass parameters to sql map as function parameter object, in addition to implicity through parent properties * Adding Janino as dependency to compile the generated classes
== Misc == * Fixing the flow core to use sugar wrap factory at every Context enter Added: struts/flow/trunk/src/java/org/apache/struts/flow/ibatis/SqlMap.template struts/flow/trunk/src/test/org/apache/struts/flow/ibatis/ struts/flow/trunk/src/test/org/apache/struts/flow/ibatis/Foo.xml struts/flow/trunk/src/test/org/apache/struts/flow/ibatis/System.xml struts/flow/trunk/src/test/org/apache/struts/flow/ibatis/TestSqlMap.java struts/flow/trunk/src/test/org/apache/struts/flow/ibatis/sqlmap.conf Modified: struts/flow/trunk/build.xml struts/flow/trunk/project.xml struts/flow/trunk/src/java/org/apache/struts/flow/FlowPlugIn.java struts/flow/trunk/src/java/org/apache/struts/flow/core/JavaScriptInterpreter.java struts/flow/trunk/src/java/org/apache/struts/flow/ibatis/SqlMap.java Modified: struts/flow/trunk/build.xml URL: http://svn.apache.org/viewcvs/struts/flow/trunk/build.xml?rev=307274&r1=307273&r2=307274&view=diff ============================================================================== --- struts/flow/trunk/build.xml (original) +++ struts/flow/trunk/build.xml Sat Oct 8 01:44:42 2005 @@ -83,15 +83,17 @@ <get dest="${lib.build}/xjavadoc-1.0.3.jar" usetimestamp="true" ignoreerrors="true" src="http://www.ibiblio.org/maven/xdoclet/jars/xjavadoc-1.0.3.jar"/> + <!-- <get dest="${lib.core}/commons-collections-2.1.1.jar" usetimestamp="true" ignoreerrors="true" - src="http://www.ibiblio.org/maven/commons-collections/jars/commons-collections-2.1.1.jar"/> + src="http://www.ibiblio.org/maven/commons-collections/jars/commons-collections-2.1.1.jar"/> + --> <mkdir dir="${lib.core}" /> - <get dest="${lib.core}/struts-1.1.jar" usetimestamp="true" + <get dest="${lib.core}/struts-1.2.7.jar" usetimestamp="true" ignoreerrors="true" - src="http://www.ibiblio.org/maven/struts/jars/struts-1.1.jar"/> + src="http://www.ibiblio.org/maven/struts/jars/struts-1.2.7.jar"/> <get dest="${lib.core}/js-1.6R1.jar" usetimestamp="true" ignoreerrors="true" @@ -118,14 +120,17 @@ src="http://www.ibiblio.org/maven/com.ibatis/jars/ibatis2-common-2.1.5.582.jar"/> <get dest="${lib.core}/ibatis-sqlmap-2.jar" usetimestamp="true" ignoreerrors="true" - src="http://www.ibiblio.org/maven/com.ibatis/jars/ibatis2-sqlmap-2.1.5.582.jar"/> + src="http://www.ibiblio.org/maven/com.ibatis/jars/ibatis2-sqlmap-2.1.5.582.jar"/> + <get dest="${lib.core}/janino.jar" usetimestamp="true" + ignoreerrors="true" + src="http://www.ibiblio.org/maven/janino/jars/janino-2.3.8.jar"/> <get dest="${lib.core}/commons-validator.jar" usetimestamp="true" ignoreerrors="true" src="http://www.ibiblio.org/maven/commons-validator/jars/commons-validator-1.1.3.jar"/> <get dest="${lib.core}/commons-digester.jar" usetimestamp="true" ignoreerrors="true" - src="http://www.ibiblio.org/maven/commons-digester/jars/commons-digester-1.6.jar"/> + src="http://www.ibiblio.org/maven/commons-digester/jars/commons-digester-1.7.jar"/> </target> @@ -238,7 +243,9 @@ destdir="${build.target}" debug="${compile.debug}" deprecation="${compile.deprecation}" - optimize="${compile.optimize}"> + optimize="${compile.optimize}" + source="1.4" + target="1.4"> <classpath refid="base.classpath" /> </javac> <copy todir="${build.target}"> @@ -257,20 +264,24 @@ <classpath refid="base.classpath" /> </javac> - <java classpathref="base.classpath" classname="org.apache.struts.flow.sugar.JavascriptSugarTest"> + <copy todir="${build.test}"> + <fileset dir="${src.test}" excludes="**/*.java" /> + </copy> + + <junit printsummary="on" fork="on"> + <formatter type="xml" /> + <classpath refid="base.classpath" /> + + <batchtest todir="${build.test}"> + <fileset dir="${src.test}"> + <include name="**/Test*.java" /> + </fileset> + </batchtest> + </junit> + + <java classpathref="base.classpath" classname="org.apache.struts.flow.sugar.JavascriptSugarTest"> <arg path="${src.test}" /> </java> - <!-- - <junit printsummary="on" fork="on"> - <formatter type="xml" /> - <classpath refid="base.classpath" /> - - <batchtest todir="${test.results}"> - <fileset dir="${test.src}"> - <include name="**/*Test.java" /> - </fileset> - </batchtest> - </junit> --> </target> <!-- The 'javadoc' target creates the API documentation. Modified: struts/flow/trunk/project.xml URL: http://svn.apache.org/viewcvs/struts/flow/trunk/project.xml?rev=307274&r1=307273&r2=307274&view=diff ============================================================================== --- struts/flow/trunk/project.xml (original) +++ struts/flow/trunk/project.xml Sat Oct 8 01:44:42 2005 @@ -45,7 +45,7 @@ <dependency> <groupId>struts</groupId> <artifactId>struts-core</artifactId> - <version>1.3.0-dev</version> + <version>1.2.7</version> <properties> <war.bundle>true</war.bundle> </properties> @@ -92,7 +92,7 @@ <url>http://ibatis.apache.org/</url> </dependency> - <dependency> + <dependency> <groupId>com.ibatis</groupId> <artifactId>ibatis2-sqlmap</artifactId> <version>2.1.5.582</version> @@ -102,6 +102,17 @@ <url>http://ibatis.apache.org/</url> </dependency> + <dependency> + <groupId>janino</groupId> + <artifactId>janino</artifactId> + <version>2.3.8</version> + <properties> + <war.bundle>true</war.bundle> + </properties> + <url>http://www.janino.net/</url> + </dependency> + + </dependencies> <build> Modified: struts/flow/trunk/src/java/org/apache/struts/flow/FlowPlugIn.java URL: http://svn.apache.org/viewcvs/struts/flow/trunk/src/java/org/apache/struts/flow/FlowPlugIn.java?rev=307274&r1=307273&r2=307274&view=diff ============================================================================== --- struts/flow/trunk/src/java/org/apache/struts/flow/FlowPlugIn.java (original) +++ struts/flow/trunk/src/java/org/apache/struts/flow/FlowPlugIn.java Sat Oct 8 01:44:42 2005 @@ -165,23 +165,13 @@ SqlMap.setSqlMapClient(client); classesToRegister.add(SqlMap.class); - /* - Set namespaces = SqlMap.getNamespaces(); - for (Iterator i = namespaces.iterator(); i.hasNext(); ) { - final String ns = (String)i.next(); - classesToRegister.add( - new SqlMap() { - //public SqlMap() { - // setNamespace(ns); - //} - - public String getClassName() { - return ns; - } - }s - ); + Map classes = SqlMap.buildNamespaceClasses(); + + for (Iterator i = classes.values().iterator(); i.hasNext(); ) { + Class cls = (Class) i.next(); + System.out.println("Registring "+cls.getName()); + classesToRegister.add(cls); } - */ } catch (Exception ex) { ex.printStackTrace(); } Modified: struts/flow/trunk/src/java/org/apache/struts/flow/core/JavaScriptInterpreter.java URL: http://svn.apache.org/viewcvs/struts/flow/trunk/src/java/org/apache/struts/flow/core/JavaScriptInterpreter.java?rev=307274&r1=307273&r2=307274&view=diff ============================================================================== --- struts/flow/trunk/src/java/org/apache/struts/flow/core/JavaScriptInterpreter.java (original) +++ struts/flow/trunk/src/java/org/apache/struts/flow/core/JavaScriptInterpreter.java Sat Oct 8 01:44:42 2005 @@ -500,6 +500,9 @@ context.setOptimizationLevel(OPTIMIZATION_LEVEL); context.setGeneratingDebug(true); context.setCompileFunctionsWithDynamicScope(true); + if (wrapFactory != null) { + context.setWrapFactory(wrapFactory); + } // Obtain the JS continuation object from it, and setup the // JSFlow object associated in the dynamic scope of the saved @@ -580,6 +583,9 @@ context.setGeneratingDebug(true); context.setCompileFunctionsWithDynamicScope(true); context.setErrorReporter(errorReporter); + if (wrapFactory != null) { + context.setWrapFactory(wrapFactory); + } Scriptable thrScope = null; // The Cocoon object exported to JavaScript needs to be setup here Modified: struts/flow/trunk/src/java/org/apache/struts/flow/ibatis/SqlMap.java URL: http://svn.apache.org/viewcvs/struts/flow/trunk/src/java/org/apache/struts/flow/ibatis/SqlMap.java?rev=307274&r1=307273&r2=307274&view=diff ============================================================================== --- struts/flow/trunk/src/java/org/apache/struts/flow/ibatis/SqlMap.java (original) +++ struts/flow/trunk/src/java/org/apache/struts/flow/ibatis/SqlMap.java Sat Oct 8 01:44:42 2005 @@ -27,6 +27,8 @@ import java.io.*; import java.sql.SQLException; +import org.codehaus.janino.SimpleCompiler; + /** * JavaScript interface to the log facility. * @@ -44,6 +46,46 @@ public static void setSqlMapClient(SqlMapClient c) { client = c; } + + public static Map buildNamespaceClasses() { + InputStream in = SqlMap.class.getResourceAsStream("SqlMap.template"); + BufferedReader reader = new BufferedReader(new InputStreamReader(in)); + StringBuffer sb = new StringBuffer(); + String line; + try { + while ((line = reader.readLine()) != null) { + sb.append(line); + } + } catch (IOException ex) { + ex.printStackTrace(); + return null; + } + + String templateText = sb.toString(); + + Map classes = new HashMap(); + Set namespaces = getNamespaces(); + String name, source; + for (Iterator i = namespaces.iterator(); i.hasNext(); ) { + name = (String) i.next(); + source = templateText.replaceAll("%ns", name); + try { + SimpleCompiler compiler = new SimpleCompiler(name+".java", new StringReader(source)); + ClassLoader cl = compiler.getClassLoader(); + + Class cls = cl.loadClass("org.apache.struts.flow.ibatis."+name); + if (cls != null) { + classes.put(name, cls); + } else { + System.err.println("Unable to compile class for namespace "+name); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + return classes; + } public Object jsFunction_setNamespace(String ns) throws JavaScriptException { setNamespace(ns); @@ -67,7 +109,7 @@ } } - public Set getNamespaces() { + public static Set getNamespaces() { Set result = new HashSet(); SqlMapClientImpl cimpl = (SqlMapClientImpl)client; SqlMapExecutorDelegate del = cimpl.getDelegate(); @@ -103,8 +145,13 @@ return new ExtensionFunction() { public Object execute(Context cx, Scriptable scope, Scriptable thisObj, java.lang.Object[] args) throws IOException { - - Map params = JSFlow.jsobjectToMap(thisObj); + + Map params = null; + if (args.length == 1 && args[0] instanceof Scriptable) { + params = JSFlow.jsobjectToMap((Scriptable)args[0]); + } else { + params = JSFlow.jsobjectToMap(thisObj); + } String stmName = namespace+"."+name; Object result = null; StatementType type = ms.getStatementType(); Added: struts/flow/trunk/src/java/org/apache/struts/flow/ibatis/SqlMap.template URL: http://svn.apache.org/viewcvs/struts/flow/trunk/src/java/org/apache/struts/flow/ibatis/SqlMap.template?rev=307274&view=auto ============================================================================== --- struts/flow/trunk/src/java/org/apache/struts/flow/ibatis/SqlMap.template (added) +++ struts/flow/trunk/src/java/org/apache/struts/flow/ibatis/SqlMap.template Sat Oct 8 01:44:42 2005 @@ -0,0 +1,12 @@ +package org.apache.struts.flow.ibatis; + +public class %ns extends SqlMap { + + public %ns() { + setNamespace("%ns"); + } + + public String getClassName() { + return "%ns"; + } +} Added: struts/flow/trunk/src/test/org/apache/struts/flow/ibatis/Foo.xml URL: http://svn.apache.org/viewcvs/struts/flow/trunk/src/test/org/apache/struts/flow/ibatis/Foo.xml?rev=307274&view=auto ============================================================================== --- struts/flow/trunk/src/test/org/apache/struts/flow/ibatis/Foo.xml (added) +++ struts/flow/trunk/src/test/org/apache/struts/flow/ibatis/Foo.xml Sat Oct 8 01:44:42 2005 @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<!DOCTYPE sqlMap + PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" + "http://www.ibatis.com/dtd/sql-map-2.dtd"> +<sqlMap namespace="Foo"> + + <resultMap id="result1" class="java.util.HashMap"> + <result property="id" column="systemid" /> + <result property="name" column="systemname" /> + </resultMap> + + <select id="getAll" parameterClass="java.util.Map" resultMap="result1"> + select systemid, systemname + from + system + </select> +</sqlMap> Added: struts/flow/trunk/src/test/org/apache/struts/flow/ibatis/System.xml URL: http://svn.apache.org/viewcvs/struts/flow/trunk/src/test/org/apache/struts/flow/ibatis/System.xml?rev=307274&view=auto ============================================================================== --- struts/flow/trunk/src/test/org/apache/struts/flow/ibatis/System.xml (added) +++ struts/flow/trunk/src/test/org/apache/struts/flow/ibatis/System.xml Sat Oct 8 01:44:42 2005 @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<!DOCTYPE sqlMap + PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" + "http://www.ibatis.com/dtd/sql-map-2.dtd"> +<sqlMap namespace="System"> + + <resultMap id="result1" class="java.util.HashMap"> + <result property="id" column="systemid" /> + <result property="name" column="systemname" /> + </resultMap> + + <select id="getAll" parameterClass="java.util.Map" resultMap="result1"> + select systemid, systemname + from + system + </select> +</sqlMap> Added: struts/flow/trunk/src/test/org/apache/struts/flow/ibatis/TestSqlMap.java URL: http://svn.apache.org/viewcvs/struts/flow/trunk/src/test/org/apache/struts/flow/ibatis/TestSqlMap.java?rev=307274&view=auto ============================================================================== --- struts/flow/trunk/src/test/org/apache/struts/flow/ibatis/TestSqlMap.java (added) +++ struts/flow/trunk/src/test/org/apache/struts/flow/ibatis/TestSqlMap.java Sat Oct 8 01:44:42 2005 @@ -0,0 +1,45 @@ +package org.apache.struts.flow.ibatis; + +import junit.framework.TestCase; + +import java.io.*; +import java.util.*; +import com.ibatis.sqlmap.engine.mapping.statement.*; +import com.ibatis.sqlmap.engine.impl.*; +import com.ibatis.sqlmap.client.*; +import com.ibatis.common.resources.*; + +/* JUnitTest case for class: org.apache.struts.chain.commands.servlet.SqlMap */ +public class TestSqlMap extends TestCase { + + + public TestSqlMap(String _name) { + super(_name); + } + + + public void testLoadNamespaceClasses() throws Exception { + + Reader reader = Resources.getResourceAsReader("org/apache/struts/flow/ibatis/sqlmap.conf"); + SqlMapClient client = SqlMapClientBuilder.buildSqlMapClient(reader); + + SqlMap.setSqlMapClient(client); + Map classes = SqlMap.buildNamespaceClasses(); + assertNotNull(classes); + assertTrue("Size wrong, "+classes.size(), classes.size() == 2); + + Class cls = (Class) classes.get("System"); + assertNotNull(cls); + + assertTrue("org.apache.struts.flow.ibatis.System".equals(cls.getName())); + + SqlMap map = (SqlMap) cls.newInstance(); + assertTrue("class name wrong ", "System".equals(map.getClassName())); + } + + /* Executes the test case */ + public static void main(String[] argv) { + String[] testCaseList = {TestSqlMap.class.getName()}; + junit.textui.TestRunner.main(testCaseList); + } +} Added: struts/flow/trunk/src/test/org/apache/struts/flow/ibatis/sqlmap.conf URL: http://svn.apache.org/viewcvs/struts/flow/trunk/src/test/org/apache/struts/flow/ibatis/sqlmap.conf?rev=307274&view=auto ============================================================================== --- struts/flow/trunk/src/test/org/apache/struts/flow/ibatis/sqlmap.conf (added) +++ struts/flow/trunk/src/test/org/apache/struts/flow/ibatis/sqlmap.conf Sat Oct 8 01:44:42 2005 @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<!DOCTYPE sqlMapConfig + PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" + "http://www.ibatis.com/dtd/sql-map-config-2.dtd"> + +<!-- Be sure to always use the appropriate header as above! Note the 2.0 DTDs. --> + +<sqlMapConfig> + + <settings useStatementNamespaces="true" /> + + <sqlMap resource="org/apache/struts/flow/ibatis/System.xml" /> + <sqlMap resource="org/apache/struts/flow/ibatis/Foo.xml" /> + + +</sqlMapConfig> + --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]