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.