Author: vgritsenko Date: Tue May 3 12:49:23 2005 New Revision: 167969 URL: http://svn.apache.org/viewcvs?rev=167969&view=rev Log: Cleanup namespace handling in the SQLTransformer (at least a bit). More samples are desperately needed for testing. Fixes bug #25203, #31634.
Modified: cocoon/branches/BRANCH_2_1_X/src/blocks/databases/java/org/apache/cocoon/transformation/SQLTransformer.java cocoon/branches/BRANCH_2_1_X/src/blocks/databases/samples/transform/sql-page.xml cocoon/branches/BRANCH_2_1_X/src/documentation/xdocs/userdocs/transformers/sql-transformer.xml cocoon/branches/BRANCH_2_1_X/status.xml Modified: cocoon/branches/BRANCH_2_1_X/src/blocks/databases/java/org/apache/cocoon/transformation/SQLTransformer.java URL: http://svn.apache.org/viewcvs/cocoon/branches/BRANCH_2_1_X/src/blocks/databases/java/org/apache/cocoon/transformation/SQLTransformer.java?rev=167969&r1=167968&r2=167969&view=diff ============================================================================== --- cocoon/branches/BRANCH_2_1_X/src/blocks/databases/java/org/apache/cocoon/transformation/SQLTransformer.java (original) +++ cocoon/branches/BRANCH_2_1_X/src/blocks/databases/java/org/apache/cocoon/transformation/SQLTransformer.java Tue May 3 12:49:23 2005 @@ -145,30 +145,31 @@ /** Check if nr of rows need to be written out. **/ protected boolean showNrOfRows; - /** Namespace prefix to output */ - protected String outPrefix; - - /** Namespace uri to output */ + /** The namespace uri of the XML output. Defaults to [EMAIL PROTECTED] #namespaceURI}. */ protected String outUri; + /** The namespace prefix of the XML output. Defaults to 'sql'. */ + protected String outPrefix; + /** The database selector */ protected ServiceSelector dbSelector; - protected XMLSerializer compiler; - protected XMLDeserializer interpreter; - protected SAXParser parser; - /** Encoding we use for CLOB field */ protected String clobEncoding; /** The connection used by all top level queries */ protected Connection conn; + // Used to parse XML from database. + protected XMLSerializer compiler; + protected XMLDeserializer interpreter; + protected SAXParser parser; + /** * Constructor */ public SQLTransformer() { - this.defaultNamespaceURI = NAMESPACE; + super.defaultNamespaceURI = NAMESPACE; } /** @@ -250,6 +251,7 @@ this.showNrOfRows = parameters.getParameterAsBoolean(SQLTransformer.MAGIC_NR_OF_ROWS, false); this.clobEncoding = parameters.getParameter(SQLTransformer.CLOB_ENCODING, ""); + if (getLogger().isDebugEnabled()) { if (this.parameters.getParameter(SQLTransformer.MAGIC_CONNECTION, null) != null) { getLogger().debug("CONNECTION: " + this.parameters.getParameter(SQLTransformer.MAGIC_CONNECTION, null)); @@ -259,11 +261,23 @@ } getLogger().debug("DOC-ELEMENT: " + parameters.getParameter(SQLTransformer.MAGIC_DOC_ELEMENT, "rowset")); getLogger().debug("ROW-ELEMENT: " + parameters.getParameter(SQLTransformer.MAGIC_ROW_ELEMENT, "row")); - getLogger().debug("NS-URI: " + parameters.getParameter(SQLTransformer.MAGIC_NS_URI_ELEMENT, NAMESPACE)); - getLogger().debug("NS-PREFIX: " + parameters.getParameter(SQLTransformer.MAGIC_NS_PREFIX_ELEMENT, "")); - getLogger().debug("CLOB_ENCODING: " + clobEncoding); + getLogger().debug("Using CLOB encoding: " + clobEncoding); + } + } + + /** + * Return attribute value. + * First try non-namespaced attribute, then try this transformer namespace. + * @param name local attribute name + */ + private String getAttributeValue(Attributes attr, String name) { + String value = attr.getValue("", name); + if (value == null) { + value = attr.getValue(this.namespaceURI, name); } - } + + return value; + } /** * This will be the meat of SQLTransformer, where the query is run. @@ -274,10 +288,13 @@ getLogger().debug("Executing query nr " + index); } - this.outUri = getCurrentQuery().properties.getParameter(SQLTransformer.MAGIC_NS_URI_ELEMENT, NAMESPACE); - this.outPrefix = getCurrentQuery().properties.getParameter(SQLTransformer.MAGIC_NS_PREFIX_ELEMENT, ""); + this.outUri = getCurrentQuery().properties.getParameter(SQLTransformer.MAGIC_NS_URI_ELEMENT, namespaceURI); + this.outPrefix = getCurrentQuery().properties.getParameter(SQLTransformer.MAGIC_NS_PREFIX_ELEMENT, "sql"); - if (!"".equals(this.outUri)) { + // Start prefix mapping for output namespace + // only if its URI is not empty, and if it is not this transformer namespace. + final boolean startPrefixMapping = !"".equals(this.outUri) && !namespaceURI.equals(this.outUri); + if (startPrefixMapping) { super.startPrefixMapping(this.outPrefix, this.outUri); } @@ -314,13 +331,11 @@ if (!query_failure) { AttributesImpl attr = new AttributesImpl(); if (this.showNrOfRows) { - attr.addAttribute(NAMESPACE, query.nr_of_rows, query.nr_of_rows, "CDATA", - String.valueOf(query.getNrOfRows())); + attr.addAttribute("", query.nr_of_rows, query.nr_of_rows, "CDATA", String.valueOf(query.getNrOfRows())); } String name = query.getName(); if (name != null) { - attr.addAttribute(NAMESPACE, query.name_attribute, query.name_attribute, "CDATA", - name); + attr.addAttribute("", query.name_attribute, query.name_attribute, "CDATA", name); } start(query.rowset_name, attr); @@ -339,7 +354,6 @@ end(query.rowset_name); } - } catch (SQLException e) { getLogger().debug("Exception in executeQuery()", e); throw new SAXException(e); @@ -355,7 +369,7 @@ } } - if (!"".equals(this.outUri)) { + if (startPrefixMapping) { super.endPrefixMapping(this.outPrefix); } } @@ -483,15 +497,13 @@ case SQLTransformer.STATE_INSIDE_QUERY_ELEMENT: int level = 0; try { - level = Integer.parseInt(attributes.getValue(NAMESPACE, - SQLTransformer.MAGIC_ANCESTOR_VALUE_LEVEL_ATTRIBUTE)); + level = Integer.parseInt(getAttributeValue(attributes, SQLTransformer.MAGIC_ANCESTOR_VALUE_LEVEL_ATTRIBUTE)); } catch (Exception e) { getLogger().debug("Exception in startAncestorValueElement", e); throwIllegalStateException("Ancestor value elements must have a " + SQLTransformer.MAGIC_ANCESTOR_VALUE_LEVEL_ATTRIBUTE + " attribute"); } - String name = attributes.getValue(NAMESPACE, - SQLTransformer.MAGIC_ANCESTOR_VALUE_NAME_ATTRIBUTE); + String name = getAttributeValue(attributes, SQLTransformer.MAGIC_ANCESTOR_VALUE_NAME_ATTRIBUTE); if (name == null) { throwIllegalStateException("Ancestor value elements must have a " + SQLTransformer.MAGIC_ANCESTOR_VALUE_NAME_ATTRIBUTE + " attribute"); @@ -526,8 +538,7 @@ throws ProcessingException, SAXException { switch (current_state) { case SQLTransformer.STATE_INSIDE_QUERY_ELEMENT: - String name = attributes.getValue(NAMESPACE, - SQLTransformer.MAGIC_SUBSTITUTE_VALUE_NAME_ATTRIBUTE); + String name = getAttributeValue(attributes, SQLTransformer.MAGIC_SUBSTITUTE_VALUE_NAME_ATTRIBUTE); if (name == null) { throwIllegalStateException("Substitute value elements must have a " + SQLTransformer.MAGIC_SUBSTITUTE_VALUE_NAME_ATTRIBUTE + " attribute"); @@ -607,10 +618,8 @@ protected void startInParameterElement(Attributes attributes) { switch (current_state) { case SQLTransformer.STATE_INSIDE_EXECUTE_QUERY_ELEMENT: - String nr = attributes.getValue(NAMESPACE, - SQLTransformer.MAGIC_IN_PARAMETER_NR_ATTRIBUTE); - String value = attributes.getValue(NAMESPACE, - SQLTransformer.MAGIC_IN_PARAMETER_VALUE_ATTRIBUTE); + String nr = getAttributeValue(attributes, SQLTransformer.MAGIC_IN_PARAMETER_NR_ATTRIBUTE); + String value = getAttributeValue(attributes, SQLTransformer.MAGIC_IN_PARAMETER_VALUE_ATTRIBUTE); if (getLogger().isDebugEnabled()) { getLogger().debug("IN PARAMETER NR " + nr + "; VALUE " + value); } @@ -632,12 +641,9 @@ protected void startOutParameterElement(Attributes attributes) { switch (current_state) { case SQLTransformer.STATE_INSIDE_EXECUTE_QUERY_ELEMENT: - String name = attributes.getValue(NAMESPACE, - SQLTransformer.MAGIC_OUT_PARAMETER_NAME_ATTRIBUTE); - String nr = attributes.getValue(NAMESPACE, - SQLTransformer.MAGIC_OUT_PARAMETER_NR_ATTRIBUTE); - String type = attributes.getValue(NAMESPACE, - SQLTransformer.MAGIC_OUT_PARAMETER_TYPE_ATTRIBUTE); + String name = getAttributeValue(attributes, SQLTransformer.MAGIC_OUT_PARAMETER_NAME_ATTRIBUTE); + String nr = getAttributeValue(attributes, SQLTransformer.MAGIC_OUT_PARAMETER_NR_ATTRIBUTE); + String type = getAttributeValue(attributes, SQLTransformer.MAGIC_OUT_PARAMETER_TYPE_ATTRIBUTE); if (getLogger().isDebugEnabled()) { getLogger().debug("OUT PARAMETER NAME" + name + ";NR " + nr + "; TYPE " + type); } Modified: cocoon/branches/BRANCH_2_1_X/src/blocks/databases/samples/transform/sql-page.xml URL: http://svn.apache.org/viewcvs/cocoon/branches/BRANCH_2_1_X/src/blocks/databases/samples/transform/sql-page.xml?rev=167969&r1=167968&r2=167969&view=diff ============================================================================== --- cocoon/branches/BRANCH_2_1_X/src/blocks/databases/samples/transform/sql-page.xml (original) +++ cocoon/branches/BRANCH_2_1_X/src/blocks/databases/samples/transform/sql-page.xml Tue May 3 12:49:23 2005 @@ -32,7 +32,7 @@ </sql:query> <sql:execute-query> <sql:query> - select id, name from employee where department_id = <sql:ancestor-value sql:name="id" sql:level="1"/> + select id, name from employee where department_id = <sql:ancestor-value name="id" level="1"/> </sql:query> </sql:execute-query> </sql:execute-query> Modified: cocoon/branches/BRANCH_2_1_X/src/documentation/xdocs/userdocs/transformers/sql-transformer.xml URL: http://svn.apache.org/viewcvs/cocoon/branches/BRANCH_2_1_X/src/documentation/xdocs/userdocs/transformers/sql-transformer.xml?rev=167969&r1=167968&r2=167969&view=diff ============================================================================== --- cocoon/branches/BRANCH_2_1_X/src/documentation/xdocs/userdocs/transformers/sql-transformer.xml (original) +++ cocoon/branches/BRANCH_2_1_X/src/documentation/xdocs/userdocs/transformers/sql-transformer.xml Tue May 3 12:49:23 2005 @@ -48,11 +48,11 @@ <source> <![CDATA[ <page> - <execute-query xmlns="http://apache.org/cocoon/SQL/2.0"> - <query> + <sql:execute-query xmlns:sql="http://apache.org/cocoon/SQL/2.0"> + <sql:query> <!-- here comes the SQL statement or stored procedure --> - </query> - </execute-query> + </sql:query> + </sql:execute-query> </page> ]]></source> <p> @@ -72,7 +72,7 @@ query, you can use another transformer to check the name of the rowset and to execute the necessary business logic on it. <br/> - usage: <code><query name="myName"></code> + usage: <code><sql:query name="myName"></code> </li> <li> <strong>isstoredprocedure</strong>: @@ -80,7 +80,7 @@ this attribute to the query element. By default, the transformer assumes that you want to execute a SQL statement. <br/> - usage: <code><query isstoredprocedure="true"></code> + usage: <code><sql:query isstoredprocedure="true"></code> </li> </ol> <p>Here is an example of how the input XML might look like:</p> @@ -90,11 +90,11 @@ <title>Hello</title> <content> <para>This is my first Cocoon page filled with sql data!</para> - <execute-query xmlns="http://apache.org/cocoon/SQL/2.0"> - <query name="department"> - select id,name from department_table - </query> - </execute-query> + <sql:execute-query xmlns:sql="http://apache.org/cocoon/SQL/2.0"> + <sql:query name="department"> + select id,name from department_table + </sql:query> + </sql:execute-query> </content> </page> ]]></source> @@ -136,17 +136,17 @@ <title>Hello</title> <content> <para>This is my first Cocoon page filled with sql data!</para> - <rowset nrofrows="2" name="department" - xmlns="http://apache.org/cocoon/SQL/2.0"> - <row> - <id>1</id> - <name>Programmers</name> - </row> - <row> - <id>2</id> - <name>Loungers</name> - </row> - </rowset> + <sql:rowset nrofrows="2" name="department" + xmlns:sql="http://apache.org/cocoon/SQL/2.0"> + <sql:row> + <sql:id>1</sql:id> + <sql:name>Programmers</sql:name> + </sql:row> + <sql:row> + <sql:id>2</sql:id> + <sql:name>Loungers</sql:name> + </sql:row> + </sql:rowset> </content> </page> ]]></source> @@ -179,13 +179,13 @@ </p> <source> <![CDATA[ - <page xmlns:sql="http://apache.org/cocoon/SQL/2.0"> - <execute-query xmlns="http://apache.org/cocoon/SQL/2.0"> - <query> - select id,name from employee_table where name = - '<sql:substitute-value sql:name="username"/>' - </query> - </execute-query> + <page> + <sql:execute-query xmlns:sql="http://apache.org/cocoon/SQL/2.0"> + <sql:query> + select id,name from employee_table where name = + '<sql:substitute-value name="username"/>' + </sql:query> + </sql:execute-query> </page> ]]></source> <p> @@ -211,13 +211,13 @@ <p>The output XML will be as follow:</p> <source> <![CDATA[ - <page xmlns:sql="http://apache.org/cocoon/SQL/2.0"> - <rowset nrofrows="1" xmlns="http://apache.org/cocoon/SQL/2.0"> - <row> - <id>2</id> - <name>Stefano Mazzocchi</name> - </row> - </rowset> + <page> + <sql:rowset nrofrows="1" xmlns:sql="http://apache.org/cocoon/SQL/2.0"> + <sql:row> + <sql:id>2</sql:id> + <sql:name>Stefano Mazzocchi</sql:name> + </sql:row> + </sql:rowset> </page> ]]></source> <p> @@ -230,18 +230,18 @@ <p>Take following input XML:</p> <source> <![CDATA[ - <page xmlns:sql="http://apache.org/cocoon/SQL/2.0"> - <execute-query xmlns="http://apache.org/cocoon/SQL/2.0"> - <query name="department"> - select id,name from department_table - </query> - <execute-query> - <query name="employee"> - select id,name from employee_table where department_id = - <ancestor-value sql:name="id" sql:level="1"/> - </query> - </execute-query> - </execute-query> + <page> + <sql:execute-query xmlns:sql="http://apache.org/cocoon/SQL/2.0"> + <sql:query name="department"> + select id, name from department_table + </sql:query> + <sql:execute-query> + <sql:query name="employee"> + select id, name from employee_table where department_id = + <sql:ancestor-value name="id" level="1"/> + </sql:query> + </sql:execute-query> + </sql:execute-query> </page> ]]></source> <p> @@ -255,34 +255,34 @@ </p> <source> <![CDATA[ - <page xmlns:sql="http://apache.org/cocoon/SQL/2.0"> - <rowset nrofrows="2" name="department" - xmlns="http://apache.org/cocoon/SQL/2.0"> - <row> - <id>1</id> - <name>Programmers</name> - <rowset nrofrows="2" name="employee"> - <row> - <id>1</id> - <name>Donald Ball</name> - </row> - <row> - <id>2</id> - <name>Stefano Mazzocchi</name> - </row> - </rowset> - </row> - <row> - <id>2</id> - <name>Loungers</name> - <rowset nrofrows="1" name="employee"> - <row> - <id>3</id> - <name>Pierpaolo Fumagalli</name> - </row> - </rowset> - </row> - </rowset> + <page> + <sql:rowset nrofrows="2" name="department" + xmlns:sql="http://apache.org/cocoon/SQL/2.0"> + <sql:row> + <sql:id>1</sql:id> + <sql:name>Programmers</sql:name> + <sql:rowset nrofrows="2" name="employee"> + <sql:row> + <sql:id>1</sql:id> + <sql:name>Donald Ball</sql:name> + </sql:row> + <sql:row> + <sql:id>2</sql:id> + <sql:name>Stefano Mazzocchi</sql:name> + </sql:row> + </sql:rowset> + </sql:row> + <sql:row> + <sql:id>2</sql:id> + <sql:name>Loungers</sql:name> + <sql:rowset nrofrows="1" name="employee"> + <sql:row> + <sql:id>3</sql:id> + <sql:name>Pierpaolo Fumagalli</sql:name> + </sql:row> + </sql:rowset> + </sql:row> + </sql:rowset> </page> ]]></source> </s2> @@ -297,8 +297,9 @@ </p> <source> <![CDATA[ - <out-parameter sql:nr="1" sql:name="code" - sql:type="java.sql.Types.INTEGER"/> + <sql:out-parameter nr="1" + name="code" + type="java.sql.Types.INTEGER"/> ]]></source> <p>where:</p> <ol> @@ -325,19 +326,19 @@ </p> <source> <![CDATA[ - <page xmlns:sql="http://apache.org/cocoon/SQL/2.0"> - <execute-query xmlns="http://apache.org/cocoon/SQL/2.0"> - <query isstoredprocedure="true" name="namesearch"> - begin QUICK_SEARCH.FIND_NAME('<sql:substitute-value - sql:name="username"/>',?,?,?); end; - </query> - <out-parameter sql:nr="1" sql:name="code" - sql:type="java.sql.Types.INTEGER"/> - <out-parameter sql:nr="2" sql:name="nrofrows" - sql:type="java.sql.Types.INTEGER"/> - <out-parameter sql:nr="3" sql:name="resultset" - sql:type="oracle.jdbc.driver.OracleTypes.CURSOR"/> - </execute-query> + <page> + <sql:execute-query xmlns:sql="http://apache.org/cocoon/SQL/2.0"> + <sql:query isstoredprocedure="true" name="namesearch"> + begin QUICK_SEARCH.FIND_NAME('<sql:substitute-value + name="username"/>',?,?,?); end; + </sql:query> + <sql:out-parameter nr="1" name="code" + type="java.sql.Types.INTEGER"/> + <sql:out-parameter nr="2" name="nrofrows" + type="java.sql.Types.INTEGER"/> + <sql:out-parameter nr="3" name="resultset" + type="oracle.jdbc.driver.OracleTypes.CURSOR"/> + </sql:execute-query> </page> ]]></source> <p> @@ -348,7 +349,7 @@ <code>ResultSet</code>, a <code>rowset</code> element will be created, containing all the data of the resultset. It is also possible to use an <em>in-parameter</em> element, e.g. - <code><in-parameter sql:nr="1" sql:value="1"/></code>. This + <code><sql:in-parameter nr="1" value="1"/></code>. This functionality is only provided to be complete, because it is available in Java itself. You can also use the <em>in-parameter</em> in combination with a SQL statement. Used in combination with an @@ -358,7 +359,7 @@ </s2> </s1> <s1 title="Combined with other transformers"> - <s2 title="Filtertransformer"> + <s2 title="FilterTransformer"> <p> When you query a database and it returns too many rows to process at once, you might want to take a block of elements, process this block @@ -376,21 +377,21 @@ <p>Output XML from the SQLTransformer:</p> <source> <![CDATA[ - <rowset nrofrows="56" name="test" - xmlns="http://apache.org/cocoon/SQL/2.0"> - <row> + <sql:rowset nrofrows="56" name="test" + xmlns:sql="http://apache.org/cocoon/SQL/2.0"> + <sql:row> <!-- db record --> - </row> - <row> + </sql:row> + <sql:row> <!-- db record --> - </row> + </sql:row> ... - <row> + <sql:row> <!-- db record --> - </row> - </rowset> + </sql:row> + </sql:rowset> ]]></source> <p> By adding following lines to the sitemap, just under the @@ -408,25 +409,25 @@ <p>output XML:</p> <source> <![CDATA[ - <rowset nrofrows="56" name="test" - xmlns="http://apache.org/cocoon/SQL/2.0"> + <sql:rowset nrofrows="56" name="test" + xmlns:sql="http://apache.org/cocoon/SQL/2.0"> <block id="1"> - <row> + <sql:row> <!-- db record --> - </row> + </sql:row> <!-- total of 10 rows --> - <row> + <sql:row> <!-- db record --> - </row> + </sql:row> </block> <block id="2"/> <block id="3"/> <block id="4"/> <block id="5"/> <block id="6"/> - </rowset> + </sql:rowset> ]]></source> <p> To make it more dynamically, put something like Modified: cocoon/branches/BRANCH_2_1_X/status.xml URL: http://svn.apache.org/viewcvs/cocoon/branches/BRANCH_2_1_X/status.xml?rev=167969&r1=167968&r2=167969&view=diff ============================================================================== --- cocoon/branches/BRANCH_2_1_X/status.xml (original) +++ cocoon/branches/BRANCH_2_1_X/status.xml Tue May 3 12:49:23 2005 @@ -196,6 +196,22 @@ <changes> <release version="@version@" date="@date@"> + <action dev="VG" type="update"> + Databases: Changes in SQLTransformer: + <ul> + <li>By default, output resulting XML using 'sql' namespace prefix.</li> + <li>Accept non-namespaced attributes in the input XML, + and prefer them over attributes in SQLTransformer namespace.</li> + <li>Support configured namespace, instead of hardcoded value.</li> + </ul> + </action> + <action dev="VG" type="fix" fixes-bug="31634" due-to="Martin Holz" due-to-email="[EMAIL PROTECTED]"> + Databases: SQLTransformer: Output attributes on rowset element with + empty namespace. + </action> + <action dev="VG" type="fix" fixes-bug="25203"> + Databases: SQLTransformer: Avoid declaring duplicate namespaces. + </action> <action dev="VG" type="remove"> Databases: Removed xml-encoding parameter from the SQLTransformer configuration. The latest SQLTransformer has no byte to character conversions.