You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by di...@apache.org on 2001/07/10 16:05:55 UTC
cvs commit: xml-cocoon2/xdocs sql-transformer.xml docs-book.xml site-book.xml
dims 01/07/10 07:05:55
Modified: lib Tag: cocoon_20_branch logkit-1.0b2-dev.jar
src/org/apache/cocoon/acting Tag: cocoon_20_branch
AbstractValidatorAction.java
src/org/apache/cocoon/components/pipeline Tag:
cocoon_20_branch CachingEventPipeline.java
src/org/apache/cocoon/transformation Tag: cocoon_20_branch
SQLTransformer.java
webapp Tag: cocoon_20_branch cocoon.xconf
webapp/stylesheets Tag: cocoon_20_branch simple-sql2html.xsl
xdocs Tag: cocoon_20_branch docs-book.xml site-book.xml
Added: src/org/apache/cocoon/caching Tag: cocoon_20_branch
IncludeCacheValidity.java
src/org/apache/cocoon/transformation Tag: cocoon_20_branch
CachingCIncludeTransformer.java
FilterTransformer.java
ReadDOMSessionTransformer.java
WriteDOMSessionTransformer.java
xdocs Tag: cocoon_20_branch sql-transformer.xml
Log:
Sync with stuff from 2.1 (Including the SQLTransformer)
Revision Changes Path
No revision
No revision
1.1.2.2 +2 -2 xml-cocoon2/lib/logkit-1.0b2-dev.jar
<<Binary file>>
No revision
No revision
1.4.2.2 +5 -5 xml-cocoon2/src/org/apache/cocoon/acting/AbstractValidatorAction.java
Index: AbstractValidatorAction.java
===================================================================
RCS file: /home/cvs/xml-cocoon2/src/org/apache/cocoon/acting/AbstractValidatorAction.java,v
retrieving revision 1.4.2.1
retrieving revision 1.4.2.2
diff -u -r1.4.2.1 -r1.4.2.2
--- AbstractValidatorAction.java 2001/06/15 11:27:47 1.4.2.1
+++ AbstractValidatorAction.java 2001/07/10 14:04:13 1.4.2.2
@@ -1,4 +1,4 @@
-// $Id: AbstractValidatorAction.java,v 1.4.2.1 2001/06/15 11:27:47 dims Exp $
+// $Id: AbstractValidatorAction.java,v 1.4.2.2 2001/07/10 14:04:13 dims Exp $
package org.apache.cocoon.acting;
import org.apache.avalon.framework.configuration.Configurable;
@@ -102,7 +102,8 @@
* </tr>
* </table>
* @author Martin Man <Martin.Man@seznam.cz>
- * @version CVS $Revision: 1.4.2.1 $ $Date: 2001/06/15 11:27:47 $
+ * @author <a href="mailto:haul@informatik.tu-darmstadt.de">Christian Haul</a>
+ * @version CVS $Revision: 1.4.2.2 $ $Date: 2001/07/10 14:04:13 $
*/
public abstract class AbstractValidatorAction
extends AbstractComplementaryConfigurableAction
@@ -189,7 +190,6 @@
getLogger().debug ("VALIDATOR: string parameter "
+ name + " is null");
if ( !nullable ){
- ValidatorActionHelper vah = new ValidatorActionHelper ( value, ValidatorActionResult.ISNULL );
return new ValidatorActionHelper ( value, ValidatorActionResult.ISNULL );}
else
value = dflt;
@@ -352,7 +352,7 @@
}
// Validate wheter param is at most max
- if (!"".equals (max)) {
+ if (max != null) {
getLogger().debug ("VALIDATOR: long parameter "
+ name + " should be at most " + max);
if (max.compareTo(value)<0) {
@@ -624,5 +624,5 @@
}
-// $Id: AbstractValidatorAction.java,v 1.4.2.1 2001/06/15 11:27:47 dims Exp $
+// $Id: AbstractValidatorAction.java,v 1.4.2.2 2001/07/10 14:04:13 dims Exp $
// vim: set et ts=4 sw=4:
No revision
No revision
1.1.2.1 +0 -0 xml-cocoon2/src/org/apache/cocoon/caching/IncludeCacheValidity.java
Index: IncludeCacheValidity.java
===================================================================
RCS file: /home/cvs/xml-cocoon2/src/org/apache/cocoon/caching/IncludeCacheValidity.java,v
retrieving revision 1.1
retrieving revision 1.1.2.1
diff -u -r1.1 -r1.1.2.1
No revision
No revision
1.7.2.9 +2 -2 xml-cocoon2/src/org/apache/cocoon/components/pipeline/CachingEventPipeline.java
Index: CachingEventPipeline.java
===================================================================
RCS file: /home/cvs/xml-cocoon2/src/org/apache/cocoon/components/pipeline/CachingEventPipeline.java,v
retrieving revision 1.7.2.8
retrieving revision 1.7.2.9
diff -u -r1.7.2.8 -r1.7.2.9
--- CachingEventPipeline.java 2001/07/09 13:22:22 1.7.2.8
+++ CachingEventPipeline.java 2001/07/10 14:04:35 1.7.2.9
@@ -50,9 +50,9 @@
* does not cache! (If it would cache, the response would be cached twice!)
*
* @author <a href="mailto:cziegeler@apache.org">Carsten Ziegeler</a>
- * @version CVS $Revision: 1.7.2.8 $ $Date: 2001/07/09 13:22:22 $
+ * @version CVS $Revision: 1.7.2.9 $ $Date: 2001/07/10 14:04:35 $
*/
-public final class CachingEventPipeline
+public class CachingEventPipeline
extends AbstractEventPipeline
implements Disposable, CacheableEventPipeline, Recyclable {
No revision
No revision
1.5.2.5 +410 -112 xml-cocoon2/src/org/apache/cocoon/transformation/SQLTransformer.java
Index: SQLTransformer.java
===================================================================
RCS file: /home/cvs/xml-cocoon2/src/org/apache/cocoon/transformation/SQLTransformer.java,v
retrieving revision 1.5.2.4
retrieving revision 1.5.2.5
diff -u -r1.5.2.4 -r1.5.2.5
--- SQLTransformer.java 2001/07/07 19:08:32 1.5.2.4
+++ SQLTransformer.java 2001/07/10 14:05:00 1.5.2.5
@@ -13,13 +13,16 @@
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
-import java.sql.Statement;
+import java.sql.PreparedStatement;
+import java.sql.CallableStatement;
import java.util.Enumeration;
import java.util.Map;
+import java.util.HashMap;
+import java.util.TreeMap;
+import java.util.Iterator;
import java.util.Properties;
import java.util.Vector;
-import org.apache.avalon.excalibur.datasource.DataSourceComponent;
-import org.apache.avalon.excalibur.pool.Recyclable;
+import java.lang.reflect.Field;
import org.apache.avalon.framework.activity.Disposable;
import org.apache.avalon.framework.component.Component;
import org.apache.avalon.framework.component.ComponentException;
@@ -27,11 +30,14 @@
import org.apache.avalon.framework.component.ComponentSelector;
import org.apache.avalon.framework.component.Composable;
import org.apache.avalon.framework.parameters.Parameters;
-import org.apache.cocoon.ProcessingException;
+import org.apache.avalon.excalibur.datasource.DataSourceComponent;
+import org.apache.avalon.excalibur.pool.Recyclable;
import org.apache.cocoon.environment.SourceResolver;
+import org.apache.cocoon.ProcessingException;
import org.apache.cocoon.util.ClassUtils;
import org.apache.cocoon.xml.XMLConsumer;
import org.apache.cocoon.xml.XMLProducer;
+import org.apache.cocoon.util.Tokenizer;
import org.apache.log.Logger;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
@@ -40,16 +46,18 @@
import org.xml.sax.ext.LexicalHandler;
import org.xml.sax.helpers.AttributesImpl;
+import org.apache.cocoon.transformation.AbstractTransformer;
+
/**
*
* @author <a href="mailto:balld@webslingerZ.com">Donald Ball</a>
* @author <a href="mailto:giacomo.pati@pwr.ch">Giacomo Pati</a>
* (PWR Organisation & Entwicklung)
- * @version CVS $Revision: 1.5.2.4 $ $Date: 2001/07/07 19:08:32 $ $Author: giacomo $
+ * @author <a href="mailto:sven.beauprez@the-ecorp.com">Sven Beauprez</a>
+ * @version CVS $Revision: 1.5.2.5 $ $Date: 2001/07/10 14:05:00 $ $Author: dims $
*/
-public class SQLTransformer extends AbstractTransformer
-implements Composable, Recyclable, Disposable {
+public class SQLTransformer extends AbstractTransformer implements Composable, Recyclable, Disposable {
/** The SQL namespace **/
public static final String my_uri = "http://apache.org/cocoon/SQL/2.0";
@@ -61,13 +69,26 @@
public static final String MAGIC_DBURL = "dburl";
public static final String MAGIC_USERNAME = "username";
public static final String MAGIC_PASSWORD = "password";
+ public static final String MAGIC_NR_OF_ROWS = "show-nr-of-rows";
public static final String MAGIC_QUERY = "query";
public static final String MAGIC_VALUE = "value";
public static final String MAGIC_DOC_ELEMENT = "doc-element";
public static final String MAGIC_ROW_ELEMENT = "row-element";
+ public static final String MAGIC_IN_PARAMETER = "in-parameter";
+ public static final String MAGIC_IN_PARAMETER_NR_ATTRIBUTE = "nr";
+ public static final String MAGIC_IN_PARAMETER_VALUE_ATTRIBUTE = "value";
+ public static final String MAGIC_OUT_PARAMETER = "out-parameter";
+ public static final String MAGIC_OUT_PARAMETER_NAME_ATTRIBUTE = "name";
+ public static final String MAGIC_OUT_PARAMETER_NR_ATTRIBUTE = "nr";
+ public static final String MAGIC_OUT_PARAMETER_TYPE_ATTRIBUTE = "type";
+
public static final String MAGIC_ANCESTOR_VALUE = "ancestor-value";
public static final String MAGIC_ANCESTOR_VALUE_LEVEL_ATTRIBUTE = "level";
public static final String MAGIC_ANCESTOR_VALUE_NAME_ATTRIBUTE = "name";
+ public static final String MAGIC_SUBSTITUTE_VALUE = "substitute-value";
+ public static final String MAGIC_SUBSTITUTE_VALUE_NAME_ATTRIBUTE = "name";
+ public static final String MAGIC_NAME_ATTRIBUTE = "name";
+ public static final String MAGIC_STORED_PROCEDURE_ATTRIBUTE = "isstoredprocedure";
public static final String MAGIC_UPDATE_ATTRIBUTE = "isupdate";
/** The states we are allowed to be in **/
@@ -76,6 +97,9 @@
public static final int STATE_INSIDE_VALUE_ELEMENT = 2;
public static final int STATE_INSIDE_QUERY_ELEMENT = 3;
public static final int STATE_INSIDE_ANCESTOR_VALUE_ELEMENT = 4;
+ public static final int STATE_INSIDE_SUBSTITUTE_VALUE_ELEMENT = 5;
+ public static final int STATE_INSIDE_IN_PARAMETER_ELEMENT = 6;
+ public static final int STATE_INSIDE_OUT_PARAMETER_ELEMENT = 7;
/** Default parameters that might apply to all queries **/
protected Properties default_properties;
@@ -85,7 +109,7 @@
/** The offset of the current query in the queries list **/
protected int current_query_index;
-
+
/** The name of the value element we're currently receiving **/
protected String current_name;
@@ -95,12 +119,19 @@
/** The value of the value element we're currently receiving **/
protected StringBuffer current_value;
+ /** Check if nr of rows need to be written out. **/
+ protected String showNrOfRows;
+
protected ComponentSelector dbSelector = null;
protected ComponentManager manager;
+ protected Parameters parameters;
+ protected Map objectModel;
+
public void compose(ComponentManager manager) {
try {
this.manager = manager;
+ //this.dbSelector = (ComponentSelector) manager.lookup(DataSourceComponent.ROLE + "Selector");
this.dbSelector = (ComponentSelector) manager.lookup(org.apache.cocoon.Roles.DB_CONNECTION);
} catch (ComponentException cme) {
getLogger().warn("Could not get the DataSource Selector", cme);
@@ -118,6 +149,13 @@
this.default_properties = null;
}
+ /**
+ * dispose
+ */
+ public void dispose() {
+ if(this.dbSelector != null) this.manager.release((Component) this.dbSelector);
+ }
+
/** BEGIN SitemapComponent methods **/
public void setup(SourceResolver resolver, Map objectModel,
@@ -130,28 +168,28 @@
this.current_query_index = -1;
this.default_properties = new Properties();
this.current_state = SQLTransformer.STATE_OUTSIDE;
+
+ this.parameters = parameters;
+ this.objectModel = objectModel;
+ current_state = SQLTransformer.STATE_OUTSIDE;
+
// Check for connection
String parameter = parameters.getParameter(SQLTransformer.MAGIC_CONNECTION, null);
if (parameter != null) {
getLogger().debug("CONNECTION: "+parameter);
-
default_properties.setProperty(SQLTransformer.MAGIC_CONNECTION, parameter);
} else {
-
// Check the dburl
parameter = parameters.getParameter(SQLTransformer.MAGIC_DBURL,null);
if (parameter != null) {
getLogger().debug("DBURL: "+parameter);
-
default_properties.setProperty(SQLTransformer.MAGIC_DBURL,parameter);
}
-
// Check the username
parameter = parameters.getParameter(SQLTransformer.MAGIC_USERNAME,null);
if (parameter != null) {
getLogger().debug("USERNAME: "+parameter);
-
default_properties.setProperty(SQLTransformer.MAGIC_USERNAME,parameter);
}
@@ -161,6 +199,7 @@
default_properties.setProperty(SQLTransformer.MAGIC_PASSWORD,parameter);
}
}
+ showNrOfRows = parameters.getParameter(SQLTransformer.MAGIC_NR_OF_ROWS,null);
// Check for row-element and doc-element
parameter = parameters.getParameter(SQLTransformer.MAGIC_DOC_ELEMENT, null);
@@ -174,14 +213,7 @@
default_properties.setProperty(SQLTransformer.MAGIC_ROW_ELEMENT, parameter);
}
}
-
- /**
- * dispose
- */
- public void dispose() {
- if(this.dbSelector != null) this.manager.release((Component) this.dbSelector);
- }
-
+
/** END SitemapComponent methods **/
/** BEGIN my very own methods **/
@@ -190,21 +222,35 @@
* This will be the meat of SQLTransformer, where the query is run.
*/
protected void executeQuery(int index) throws SAXException {
- this.contentHandler.startPrefixMapping("",my_uri);
+// this.contentHandler.startPrefixMapping("",my_uri);
+ getLogger().debug("SQLTransformer executing query nr " + index);
AttributesImpl attr = new AttributesImpl();
Query query = (Query) queries.elementAt(index);
try {
query.execute();
+ if (showNrOfRows!=null && showNrOfRows.equalsIgnoreCase("true")) {
+ attr.addAttribute(my_uri,query.nr_of_rows,query.nr_of_rows,"CDATA",
+ String.valueOf(query.getNrOfRows()));
+ }
+ String name = query.getName();
+ if (name !=null) {
+ attr.addAttribute(my_uri,query.name_attribute,query.name_attribute,"CDATA",
+ name);
+ }
this.start(query.rowset_name, attr);
-
- while (query.next()) {
- this.start(query.row_name, attr);
- query.serializeRow();
- if (index + 1 < queries.size()) {
- executeQuery(index + 1);
- }
- this.end(query.row_name);
+ attr=new AttributesImpl();
+ if (!query.isStoredProcedure()) {
+ while (query.next()) {
+ this.start(query.row_name, attr);
+ query.serializeRow();
+ if (index + 1 < queries.size()) {
+ executeQuery(index + 1);
+ }
+ this.end(query.row_name);
+ }
+ } else {
+ query.serializeStoredProcedure();
}
} catch (SQLException e) {
getLogger().debug("SQLTransformer.executeQuery()", e);
@@ -213,11 +259,11 @@
try{
query.close();
}catch(SQLException e){
- getLogger().warn("Could not close JDBC Connection", e);
+ getLogger().warn("SQLTransformer: Could not close JDBC connection", e);
}
}
this.end(query.rowset_name);
- this.contentHandler.endPrefixMapping("");
+// this.contentHandler.endPrefixMapping("");
}
protected static void throwIllegalStateException(String message) {
@@ -255,11 +301,21 @@
switch (current_state) {
case SQLTransformer.STATE_INSIDE_EXECUTE_QUERY_ELEMENT:
current_value.setLength(0);
+ Query q = getCurrentQuery();
current_state = SQLTransformer.STATE_INSIDE_QUERY_ELEMENT;
String isupdate =
- attributes.getValue("", SQLTransformer.MAGIC_UPDATE_ATTRIBUTE);
- if (isupdate != null && !isupdate.equalsIgnoreCase("false"))
- getCurrentQuery().setUpdate(true);
+ attributes.getValue("", SQLTransformer.MAGIC_UPDATE_ATTRIBUTE);
+ if (isupdate != null && !isupdate.equalsIgnoreCase("false"))
+ q.setUpdate(true);
+ String isstoredprocedure =
+ attributes.getValue("", SQLTransformer.MAGIC_STORED_PROCEDURE_ATTRIBUTE);
+ if (isstoredprocedure != null && !isstoredprocedure.equalsIgnoreCase("false"))
+ q.setStoredProcedure(true);
+ String name =
+ attributes.getValue("", SQLTransformer.MAGIC_NAME_ATTRIBUTE);
+ if (name != null) {
+ q.setName(name);
+ }
break;
default:
throwIllegalStateException("Not expecting a start query element");
@@ -274,7 +330,6 @@
current_value.toString());
getLogger().debug("QUERY IS \""+
current_value.toString() + "\"");
-
current_value.setLength(0);
}
current_state = SQLTransformer.STATE_INSIDE_EXECUTE_QUERY_ELEMENT;
@@ -358,6 +413,82 @@
current_state = SQLTransformer.STATE_INSIDE_QUERY_ELEMENT;
}
+ protected void startSubstituteValueElement(Attributes attributes) {
+ switch (current_state) {
+ case SQLTransformer.STATE_INSIDE_QUERY_ELEMENT:
+ String name = attributes.getValue(my_uri,
+ SQLTransformer.MAGIC_SUBSTITUTE_VALUE_NAME_ATTRIBUTE);
+ if (name == null) {
+ throwIllegalStateException("Substitute value elements must have a "+
+ SQLTransformer.MAGIC_SUBSTITUTE_VALUE_NAME_ATTRIBUTE + " attribute");
+ }
+ String substitute = parameters.getParameter(name,null);
+ //escape single quote
+ substitute = replaceCharWithString(substitute,'\'',"''");
+ getLogger().debug("SUBSTITUTE VALUE "+substitute);
+ if (current_value.length() > 0) {
+ getCurrentQuery().addQueryPart(current_value.toString());
+ getLogger().debug("QUERY IS \""+
+ current_value.toString() + "\"");
+
+ current_value.setLength(0);
+ }
+ getCurrentQuery().addQueryPart(substitute);
+ current_state = SQLTransformer.STATE_INSIDE_SUBSTITUTE_VALUE_ELEMENT;
+ break;
+ default:
+ throwIllegalStateException("Not expecting a start substitute value element");
+ }
+ }
+
+ protected void endSubstituteValueElement() {
+ current_state = SQLTransformer.STATE_INSIDE_QUERY_ELEMENT;
+ }
+
+ protected void startInParameterElement(Attributes attributes) {
+ switch (current_state) {
+ case SQLTransformer.STATE_INSIDE_EXECUTE_QUERY_ELEMENT:
+ String nr = attributes.getValue(my_uri,
+ SQLTransformer.MAGIC_IN_PARAMETER_NR_ATTRIBUTE);
+ String value = attributes.getValue(my_uri,
+ SQLTransformer.MAGIC_IN_PARAMETER_VALUE_ATTRIBUTE);
+ getLogger().debug("IN PARAMETER NR " + nr + "; VALUE "+ value);
+ int position = Integer.parseInt(nr);
+ getCurrentQuery().setInParameter(position,value);
+ current_state = SQLTransformer.STATE_INSIDE_IN_PARAMETER_ELEMENT;
+ break;
+ default:
+ throwIllegalStateException("Not expecting an in-parameter element");
+ }
+ }
+
+ protected void endInParameterElement() {
+ current_state = SQLTransformer.STATE_INSIDE_EXECUTE_QUERY_ELEMENT;
+ }
+
+ protected void startOutParameterElement(Attributes attributes) {
+ switch (current_state) {
+ case SQLTransformer.STATE_INSIDE_EXECUTE_QUERY_ELEMENT:
+ String name = attributes.getValue(my_uri,
+ SQLTransformer.MAGIC_OUT_PARAMETER_NAME_ATTRIBUTE);
+ String nr = attributes.getValue(my_uri,
+ SQLTransformer.MAGIC_OUT_PARAMETER_NR_ATTRIBUTE);
+ String type = attributes.getValue(my_uri,
+ SQLTransformer.MAGIC_OUT_PARAMETER_TYPE_ATTRIBUTE);
+ getLogger().debug("OUT PARAMETER NAME" + name +";NR " + nr + "; TYPE "+ type);
+ int position = Integer.parseInt(nr);
+ getCurrentQuery().setOutParameter(position,type,name);
+ current_state = SQLTransformer.STATE_INSIDE_OUT_PARAMETER_ELEMENT;
+ break;
+ default:
+ throwIllegalStateException("Not expecting an out-parameter element");
+ }
+ }
+
+ protected void endOutParameterElement() {
+ current_state = SQLTransformer.STATE_INSIDE_EXECUTE_QUERY_ELEMENT;
+ }
+
protected Query getCurrentQuery() {
return (Query) queries.elementAt(current_query_index);
}
@@ -365,6 +496,25 @@
protected Query getQuery(int i) {
return (Query) queries.elementAt(i);
}
+
+ private String replaceCharWithString(String in, char c, String with) {
+ Tokenizer tok;
+ StringBuffer replaced=null;
+ if (in.indexOf(c)>-1) {
+ tok = new Tokenizer(in,c);
+ replaced=new StringBuffer();
+ while (tok.hasMoreTokens()) {
+ replaced.append(tok.nextToken());
+ if (tok.hasMoreTokens())
+ replaced.append(with);
+ }
+ }
+ if (replaced!=null) {
+ return replaced.toString();
+ } else {
+ return in;
+ }
+ }
/** END my very own methods **/
@@ -391,7 +541,13 @@
startQueryElement(attributes);
} else if (name.equals(SQLTransformer.MAGIC_ANCESTOR_VALUE)) {
startAncestorValueElement(attributes);
- } else {
+ } else if (name.equals(SQLTransformer.MAGIC_SUBSTITUTE_VALUE)) {
+ startSubstituteValueElement(attributes);
+ } else if (name.equals(SQLTransformer.MAGIC_IN_PARAMETER)) {
+ startInParameterElement(attributes);
+ } else if (name.equals(SQLTransformer.MAGIC_OUT_PARAMETER)) {
+ startOutParameterElement(attributes);
+ } else {
startValueElement(name);
}
}
@@ -402,8 +558,7 @@
super.endElement(uri, name, raw);
return;
}
- getLogger().debug("RECEIVED END ELEMENT "+name + "("+uri +
- ")");
+ getLogger().debug("RECEIVED END ELEMENT "+name + "("+uri + ")");
if (name.equals(SQLTransformer.MAGIC_EXECUTE_QUERY)) {
endExecuteQueryElement();
@@ -411,6 +566,12 @@
endQueryElement();
} else if (name.equals(SQLTransformer.MAGIC_ANCESTOR_VALUE)) {
endAncestorValueElement();
+ } else if (name.equals(SQLTransformer.MAGIC_SUBSTITUTE_VALUE)) {
+ endSubstituteValueElement();
+ } else if (name.equals(SQLTransformer.MAGIC_IN_PARAMETER)) {
+ endInParameterElement();
+ } else if (name.equals(SQLTransformer.MAGIC_OUT_PARAMETER)) {
+ endOutParameterElement();
} else if (name.equals(SQLTransformer.MAGIC_VALUE) || current_state == SQLTransformer.STATE_INSIDE_VALUE_ELEMENT) {
endValueElement();
} else {
@@ -426,7 +587,6 @@
}
getLogger().debug("RECEIVED CHARACTERS: "+
new String(ary, start, length));
-
current_value.append(ary, start, length);
}
@@ -445,9 +605,10 @@
}
private void data(String data) throws SAXException {
- if (data != null)
- super.contentHandler.characters(data.toCharArray(), 0,
+ if (data != null) {
+ super.contentHandler.characters(data.toCharArray(), 0,
data.length());
+ }
}
protected static String getStringValue(Object object) {
@@ -480,14 +641,17 @@
protected Properties properties;
/** Dummy static variables for the moment **/
- protected String rowset_name = "ROWSET";
- protected String row_name = "ROW";
+ protected String rowset_name = "rowset";
+ protected String nr_of_rows = "nrofrows";
+ protected String row_name = "row";
+ protected String name_attribute = "name";
/** The connection, once opened **/
protected Connection conn;
- /** And the statement **/
- protected Statement st;
+ /** And the statements **/
+ protected PreparedStatement pst;
+ protected CallableStatement cst;
/** The results, of course **/
protected ResultSet rs = null;
@@ -498,12 +662,26 @@
/** If this query is actually an update (insert, update, delete) **/
protected boolean isupdate = false;
+ /** If this query is actually a stored procedure **/
+ protected boolean isstoredprocedure = false;
+
+ protected String name=null;
+
/** If it is an update/etc, the return value (num rows modified) **/
protected int rv = -1;
/** The parts of the query **/
protected Vector query_parts = new Vector();
+ /** In parameters **/
+ protected HashMap inParameters=null;
+
+ /** Out parameters **/
+ protected HashMap outParameters=null;
+
+ /** Mapping out parameters - objectModel **/
+ protected HashMap outParametersNames=null;
+
protected Query(SQLTransformer transformer, int query_index) {
this.transformer = transformer;
this.query_index = query_index;
@@ -518,6 +696,87 @@
isupdate = flag;
}
+ protected void setStoredProcedure(boolean flag) {
+ isstoredprocedure = flag;
+ }
+
+ protected boolean isStoredProcedure() {
+ return isstoredprocedure;
+ }
+
+ protected void setName(String name) {
+ this.name = name;
+ }
+
+ protected String getName() {
+ return name;
+ }
+
+ protected void setInParameter(int pos, String val) {
+ if (inParameters == null) {
+ inParameters = new HashMap();
+ }
+ inParameters.put(new Integer(pos),val);
+ }
+
+ protected void setOutParameter(int pos, String type, String name) {
+ if (outParameters == null) {
+ outParameters = new HashMap();
+ outParametersNames = new HashMap();
+ }
+ outParameters.put(new Integer(pos),type);
+ outParametersNames.put(new Integer(pos),name);
+ }
+
+ private void registerInParameters(PreparedStatement pst) throws SQLException{
+ if (inParameters==null)
+ return;
+ Iterator itInKeys = inParameters.keySet().iterator();
+ Integer counter;
+ String value;
+ while (itInKeys.hasNext()) {
+ counter = (Integer)itInKeys.next();
+ value = (String)inParameters.get(counter);
+ try {
+ pst.setObject(counter.intValue(),value);
+ }catch (SQLException e) {
+ transformer.getTheLogger().error("Caught a SQLException", e);
+ throw e;
+ }
+ }
+ }
+
+ private void registerOutParameters(CallableStatement cst) throws SQLException {
+ if (outParameters==null)
+ return;
+ Iterator itOutKeys = outParameters.keySet().iterator();
+ Integer counter;
+ int index;
+ String type, className, fieldName;
+ Class clss;
+ Field fld;
+ while (itOutKeys.hasNext()) {
+ counter = (Integer)itOutKeys.next();
+ type = (String)outParameters.get(counter);
+ index = type.lastIndexOf(".");
+ if (index>-1) {
+ className = type.substring(0,index);
+ fieldName = type.substring(index+1,type.length());
+ }else {
+ transformer.getTheLogger().error("Invalid SQLType: " +type, null);
+ throw new SQLException("Wrong SQLType");
+ }
+ try {
+ clss = Class.forName(className);
+ fld = clss.getField(fieldName);
+ cst.registerOutParameter(counter.intValue(),fld.getInt(fieldName));
+ }catch (Exception e) { //lots of different exceptions to catch
+ transformer.getTheLogger().error("Invalid SQLType: " +
+ className +"."+fieldName, e);
+ }
+ }
+ }
+
protected void execute() throws SQLException {
if (null != properties.getProperty(SQLTransformer.MAGIC_DOC_ELEMENT)) {
this.rowset_name = properties.getProperty(SQLTransformer.MAGIC_DOC_ELEMENT);
@@ -529,7 +788,6 @@
String dburl = properties.getProperty(SQLTransformer.MAGIC_DBURL);
String username = properties.getProperty(SQLTransformer.MAGIC_USERNAME);
String password = properties.getProperty(SQLTransformer.MAGIC_PASSWORD);
-
Enumeration enum = query_parts.elements();
StringBuffer sb = new StringBuffer();
while (enum.hasMoreElements()) {
@@ -540,17 +798,11 @@
/** Do a lookup into the ancestors' result's values **/
AncestorValue av = (AncestorValue) object;
Query query = transformer.getQuery(query_index - av.level);
- try {
- sb.append(query.getColumnValue(av.name));
- } catch (SQLException e) {
- transformer.getTheLogger().debug("SQLTransformer", e);
- close();
- throw e;
- }
+ sb.append(query.getColumnValue(av.name));
}
}
-
String query = sb.toString();
+ transformer.getTheLogger().debug("EXECUTING " + query);
DataSourceComponent datasource = null;
try {
if (connection != null) {
@@ -564,12 +816,24 @@
password);
}
}
- st = conn.createStatement();
- if (isupdate) {
- rv = st.executeUpdate(query);
- } else {
- rs = st.executeQuery(query);
+ if (!isstoredprocedure) {
+ pst = conn.prepareStatement(query,
+ ResultSet.TYPE_SCROLL_INSENSITIVE,
+ ResultSet.CONCUR_READ_ONLY );
+ } else {
+ cst = conn.prepareCall(query,
+ ResultSet.TYPE_SCROLL_INSENSITIVE,
+ ResultSet.CONCUR_READ_ONLY );
+ registerOutParameters(cst);
+ pst = cst;
+ }
+ registerInParameters(pst);
+ boolean result = pst.execute();
+ if (result) {
+ rs = pst.getResultSet();
md = rs.getMetaData();
+ } else {
+ rv = pst.getUpdateCount();
}
} catch (SQLException e) {
transformer.getTheLogger().error("Caught a SQLException", e);
@@ -581,55 +845,51 @@
}
}
- protected String getColumnValue(int i) throws SQLException {
- try {
- return transformer.getStringValue(rs.getObject(i));
- } catch (SQLException e) {
- transformer.getTheLogger().debug("SQLTransformer", e);
- close();
- throw e;
+ protected int getNrOfRows() throws SQLException {
+ int nr = 0;
+ if (rs!=null) {
+ rs.last();
+ nr = rs.getRow();
+ rs.beforeFirst();
+ } else {
+ if (outParameters!=null) {
+ nr=outParameters.size();
}
+ }
+ return nr;
+ }
+
+ protected String getColumnValue(int i) throws SQLException {
+ return transformer.getStringValue(rs.getObject(i));
}
protected String getColumnValue(String name) throws SQLException {
- try {
- return transformer.getStringValue(rs.getObject(name));
- } catch (SQLException e) {
- transformer.getTheLogger().debug("SQLTransformer", e);
- close();
- throw e;
- }
+ return transformer.getStringValue(rs.getObject(name));
}
protected boolean next() throws SQLException {
- try {
- // if rv is not -1, then an SQL insert, update, etc, has
- // happened (see JDBC docs - return codes for executeUpdate)
- if (rv != -1)
- return true;
- if (rs == null || !rs.next()) {
- close();
- return false;
- }
- return true;
- } catch (SQLException e) {
- transformer.getTheLogger().debug("SQLTransformer", e);
- close();
- throw e;
- }
+ // if rv is not -1, then an SQL insert, update, etc, has
+ // happened (see JDBC docs - return codes for executeUpdate)
+ if (rv != -1)
+ return true;
+ if (rs == null || !rs.next()) {
+ close();
+ return false;
+ }
+ return true;
}
protected void close() throws SQLException {
try {
if (rs != null)
rs.close();
- rs = null;
- if (st != null)
- st.close();
- st = null;
+ if (pst != null)
+ pst.close();
+ if (cst != null)
+ cst.close();
} finally {
if (conn != null)
- conn.close();
+ conn.close();
conn = null;
}
}
@@ -639,25 +899,63 @@
}
protected void serializeRow() throws SQLException, SAXException {
- AttributesImpl attr = new AttributesImpl();
- if (!isupdate) {
- for (int i = 1; i <= md.getColumnCount(); i++) {
- transformer.start(md.getColumnName(i).toLowerCase(), attr);
- try {
- transformer.data(getColumnValue(i));
- } catch (SQLException e) {
- transformer.getTheLogger().debug("SQLTransformer", e);
- close();
- throw e;
+ AttributesImpl attr = new AttributesImpl();
+ if (!isupdate && !isstoredprocedure) {
+ for (int i = 1; i <= md.getColumnCount(); i++) {
+ transformer.start(md.getColumnName(i).toLowerCase(), attr);
+ transformer.data(getColumnValue(i));
+ transformer.end(md.getColumnName(i).toLowerCase());
+ }
+ } else if (isupdate && !isstoredprocedure){
+ transformer.start("returncode", attr);
+ transformer.data(String.valueOf(rv));
+ transformer.end("returncode");
+ rv = -1; // we only want the return code shown once.
+ }
+ }
+
+ protected void serializeStoredProcedure() throws SQLException, SAXException {
+ if (outParametersNames==null || cst==null)
+ return;
+ //make sure output follows order as parameter order in stored procedure
+ Iterator itOutKeys = (new TreeMap(outParameters)).keySet().iterator();
+ Integer counter;
+ AttributesImpl attr = new AttributesImpl();
+ while (itOutKeys.hasNext()) {
+ counter = (Integer)itOutKeys.next();
+ try {
+ Object obj = cst.getObject(counter.intValue());
+ if (!(obj instanceof ResultSet)) {
+ transformer.start((String)outParametersNames.get(counter), attr);
+ transformer.data(transformer.getStringValue(obj));
+ transformer.end((String)outParametersNames.get(counter));
+ } else {
+ ResultSet rs = (ResultSet)obj;
+ try{
+ transformer.start((String)outParametersNames.get(counter), attr);
+ ResultSetMetaData md = rs.getMetaData();
+ while (rs.next()) {
+ transformer.start(this.row_name, attr);
+ for (int i = 1; i <= md.getColumnCount(); i++) {
+ transformer.start(md.getColumnName(i).toLowerCase(), attr);
+ transformer.data(transformer.getStringValue(rs.getObject(i)));
+ transformer.end(md.getColumnName(i).toLowerCase());
+ }
+ transformer.end(this.row_name);
+ }
+ }finally{
+ rs.close();
}
- transformer.end(md.getColumnName(i).toLowerCase());
- }
- } else {
- transformer.start("returncode", attr);
- transformer.data(String.valueOf(rv));
- transformer.end("returncode");
- rv = -1; // we only want the return code shown once.
- }
+ transformer.end((String)outParametersNames.get(counter));
+ }
+ }catch (SQLException e) {
+ transformer.getTheLogger().error("Caught a SQLException", e);
+ throw e;
+ } finally {
+ close();
+ }
+ }
+
}
}
No revision
No revision
1.2.2.1 +1 -1 xml-cocoon2/src/org/apache/cocoon/transformation/CachingCIncludeTransformer.java
Index: CachingCIncludeTransformer.java
===================================================================
RCS file: /home/cvs/xml-cocoon2/src/org/apache/cocoon/transformation/CachingCIncludeTransformer.java,v
retrieving revision 1.2
retrieving revision 1.2.2.1
diff -u -r1.2 -r1.2.2.1
--- CachingCIncludeTransformer.java 2001/07/09 13:29:08 1.2
+++ CachingCIncludeTransformer.java 2001/07/10 14:04:50 1.2.2.1
@@ -49,7 +49,7 @@
*
* @author <a href="mailto:cziegeler@apache.org">Carsten Ziegeler</a>
* @author <a href="mailto:maciejka@tiger.com.pl">Maciek Kaminski</a>
- * @version CVS $Revision: 1.2 $ $Date: 2001/07/09 13:29:08 $ $Author: cziegeler $
+ * @version CVS $Revision: 1.2.2.1 $ $Date: 2001/07/10 14:04:50 $ $Author: dims $
*/
public class CachingCIncludeTransformer extends AbstractTransformer
implements Recyclable, Composable, Cacheable {
1.1.2.1 +1 -1 xml-cocoon2/src/org/apache/cocoon/transformation/FilterTransformer.java
Index: FilterTransformer.java
===================================================================
RCS file: /home/cvs/xml-cocoon2/src/org/apache/cocoon/transformation/FilterTransformer.java,v
retrieving revision 1.1
retrieving revision 1.1.2.1
diff -u -r1.1 -r1.1.2.1
--- FilterTransformer.java 2001/06/21 11:07:56 1.1
+++ FilterTransformer.java 2001/07/10 14:04:55 1.1.2.1
@@ -25,7 +25,7 @@
* Only the 3th block will be shown, containing only 5 row elements.
*
* @author <a href="mailto:sven.beauprez@the-ecorp.com">Sven Beauprez</a>
- * @version CVS $Revision: 1.1 $ $Date: 2001/06/21 11:07:56 $ $Author: dims $
+ * @version CVS $Revision: 1.1.2.1 $ $Date: 2001/07/10 14:04:55 $ $Author: dims $
*/
public class FilterTransformer extends AbstractTransformer implements Poolable {
1.1.2.1 +1 -1 xml-cocoon2/src/org/apache/cocoon/transformation/ReadDOMSessionTransformer.java
Index: ReadDOMSessionTransformer.java
===================================================================
RCS file: /home/cvs/xml-cocoon2/src/org/apache/cocoon/transformation/ReadDOMSessionTransformer.java,v
retrieving revision 1.1
retrieving revision 1.1.2.1
diff -u -r1.1 -r1.1.2.1
--- ReadDOMSessionTransformer.java 2001/06/21 11:07:56 1.1
+++ ReadDOMSessionTransformer.java 2001/07/10 14:04:58 1.1.2.1
@@ -34,7 +34,7 @@
* the trigger-element
*
* @author <a href="mailto:sven.beauprez@the-ecorp.com">Sven Beauprez</a>
- * @version CVS $Revision: 1.1 $ $Date: 2001/06/21 11:07:56 $ $Author: dims $
+ * @version CVS $Revision: 1.1.2.1 $ $Date: 2001/07/10 14:04:58 $ $Author: dims $
*/
public class ReadDOMSessionTransformer extends AbstractTransformer implements Poolable {
1.2.2.1 +1 -1 xml-cocoon2/src/org/apache/cocoon/transformation/WriteDOMSessionTransformer.java
Index: WriteDOMSessionTransformer.java
===================================================================
RCS file: /home/cvs/xml-cocoon2/src/org/apache/cocoon/transformation/WriteDOMSessionTransformer.java,v
retrieving revision 1.2
retrieving revision 1.2.2.1
diff -u -r1.2 -r1.2.2.1
--- WriteDOMSessionTransformer.java 2001/07/07 11:43:36 1.2
+++ WriteDOMSessionTransformer.java 2001/07/10 14:05:03 1.2.2.1
@@ -43,7 +43,7 @@
* dom-root-element is the trigger that will be the root element of the DOM
*
* @author <a href="mailto:sven.beauprez@the-ecorp.com">Sven Beauprez</a>
- * @version CVS $Revision: 1.2 $ $Date: 2001/07/07 11:43:36 $ $Author: giacomo $
+ * @version CVS $Revision: 1.2.2.1 $ $Date: 2001/07/10 14:05:03 $ $Author: dims $
*/
public class WriteDOMSessionTransformer extends AbstractTransformer implements
No revision
No revision
1.7.2.9 +13 -2 xml-cocoon2/webapp/cocoon.xconf
Index: cocoon.xconf
===================================================================
RCS file: /home/cvs/xml-cocoon2/webapp/cocoon.xconf,v
retrieving revision 1.7.2.8
retrieving revision 1.7.2.9
diff -u -r1.7.2.8 -r1.7.2.9
--- cocoon.xconf 2001/07/07 19:08:37 1.7.2.8
+++ cocoon.xconf 2001/07/10 14:05:23 1.7.2.9
@@ -66,7 +66,14 @@
<programming-languages>
<java-language name="java">
+ <!-- compiler parameter specifies which class to use to compile Java.
+ Possible variants are Javac and Jikes compilers.
+ Javac requires javac.jar (included with Cocoon distribution).
+ Jikes requires IBM jikes compiler installed and rt.jar from
+ JRE in the classpath environment variable. -->
<parameter name="compiler" value="org.apache.cocoon.components.language.programming.java.Javac"/>
+ <!-- Specifies which formatter to use to format source code.
+ This parameter is optional. -->
<parameter name="code-formatter" value="org.apache.cocoon.components.language.programming.java.JstyleFormatter"/>
<parameter name="class-loader" value="org.apache.cocoon.components.classloader.ClassLoaderManagerImpl"/>
</java-language>
@@ -213,7 +220,9 @@
</stream-cache>
<!-- An EventPipeline connects the generator and the various transformers
- and produces a character stream.
+ and produces a character stream. Alternatives to CachingEventPipeline
+ are: NonCachingEventPipeline.
+ <event-pipeline class="org.apache.cocoon.components.pipeline.NonCachingEventPipeline"/>
-->
<event-pipeline class="org.apache.cocoon.components.pipeline.CachingEventPipeline"/>
@@ -244,7 +253,9 @@
</event-cache>
<!-- The SAXConnector connects the various pipeline components.
- Uncomment the following line for using the SAXConnector.
+ LoggingSAXConnector logs SAX events between pipeline components
+ into a cocoon's log file.
+ Uncomment one of the following lines for using the SAXConnector.
<sax-connector class="org.apache.cocoon.components.saxconnector.LoggingSAXConnector"/>
-->
No revision
No revision
1.2.2.1 +3 -3 xml-cocoon2/webapp/stylesheets/simple-sql2html.xsl
Index: simple-sql2html.xsl
===================================================================
RCS file: /home/cvs/xml-cocoon2/webapp/stylesheets/simple-sql2html.xsl,v
retrieving revision 1.2
retrieving revision 1.2.2.1
diff -u -r1.2 -r1.2.2.1
--- simple-sql2html.xsl 2001/05/23 12:32:21 1.2
+++ simple-sql2html.xsl 2001/07/10 14:05:32 1.2.2.1
@@ -6,9 +6,9 @@
<xsl:import href="page/simple-page2html.xsl"/>
- <xsl:template match="sql:ROWSET">
+ <xsl:template match="sql:rowset">
<xsl:choose>
- <xsl:when test="ancestor::sql:ROWSET">
+ <xsl:when test="ancestor::sql:rowset">
<tr>
<td>
<table border="1">
@@ -25,7 +25,7 @@
</xsl:choose>
</xsl:template>
- <xsl:template match="sql:ROW">
+ <xsl:template match="sql:row">
<tr>
<xsl:apply-templates/>
</tr>
No revision
No revision
1.3.2.9 +2 -0 xml-cocoon2/xdocs/docs-book.xml
Index: docs-book.xml
===================================================================
RCS file: /home/cvs/xml-cocoon2/xdocs/docs-book.xml,v
retrieving revision 1.3.2.8
retrieving revision 1.3.2.9
diff -u -r1.3.2.8 -r1.3.2.9
--- docs-book.xml 2001/06/30 01:50:24 1.3.2.8
+++ docs-book.xml 2001/07/10 14:05:41 1.3.2.9
@@ -31,6 +31,8 @@
<page id="logicsheet-esql" label="ESQL Logicsheet" source="esql.xml"/>
<page id="logicsheet-forms" label="Forms" source="logicsheet-forms.xml"/>
<separator/>
+ <page id="sql-transformer" label="SQL Transformer" source="sql-transformer.xml"/>
+<separator/>
<external label="XML Links" href="http://dmoz.org/Computers/Data_Formats/Markup_Languages/XML/"/>
<separator/>
<page id="who" label="Who we are" source="who.xml"/>
1.3.2.11 +2 -0 xml-cocoon2/xdocs/site-book.xml
Index: site-book.xml
===================================================================
RCS file: /home/cvs/xml-cocoon2/xdocs/site-book.xml,v
retrieving revision 1.3.2.10
retrieving revision 1.3.2.11
diff -u -r1.3.2.10 -r1.3.2.11
--- site-book.xml 2001/06/30 01:50:24 1.3.2.10
+++ site-book.xml 2001/07/10 14:05:43 1.3.2.11
@@ -35,6 +35,8 @@
<page id="logicsheet-esql" label="ESQL Logicsheet" source="esql.xml"/>
<page id="logicsheet-forms" label="Forms" source="logicsheet-forms.xml"/>
<separator/>
+ <page id="sql-transformer" label="SQL Transformer" source="sql-transformer.xml"/>
+<separator/>
<external href="apidocs/index.html" label="API (Javadoc)"/>
<separator/>
<external label="XML Links" href="http://dmoz.org/Computers/Data_Formats/Markup_Languages/XML/"/>
No revision
No revision
1.2.2.1 +0 -0 xml-cocoon2/xdocs/sql-transformer.xml
Index: sql-transformer.xml
===================================================================
RCS file: /home/cvs/xml-cocoon2/xdocs/sql-transformer.xml,v
retrieving revision 1.2
retrieving revision 1.2.2.1
diff -u -r1.2 -r1.2.2.1
----------------------------------------------------------------------
In case of troubles, e-mail: webmaster@xml.apache.org
To unsubscribe, e-mail: cocoon-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: cocoon-cvs-help@xml.apache.org