cziegeler 02/02/05 03:12:13 Modified: . changes.xml src/java/org/apache/cocoon/transformation SQLTransformer.java Log: Minor rewrite of the SQLTransformer. Removed several parameters tests and the use of Properties objects - instead the Parameters object is used directly. Revision Changes Path 1.100 +6 -1 xml-cocoon2/changes.xml Index: changes.xml =================================================================== RCS file: /home/cvs/xml-cocoon2/changes.xml,v retrieving revision 1.99 retrieving revision 1.100 diff -u -r1.99 -r1.100 --- changes.xml 4 Feb 2002 14:18:35 -0000 1.99 +++ changes.xml 5 Feb 2002 11:12:12 -0000 1.100 @@ -4,7 +4,7 @@ <!-- History of Cocoon changes - $Id: changes.xml,v 1.99 2002/02/04 14:18:35 vgritsenko Exp $ + $Id: changes.xml,v 1.100 2002/02/05 11:12:12 cziegeler Exp $ --> <changes title="History of Changes"> @@ -31,6 +31,11 @@ </devs> <release version="@version@" date="@date@"> + <action dev="CZ" type="update"> + Minor rewrite of the SQLTransformer. Removed several parameters tests + and the use of Properties objects - instead the Parameters object + is used directly. + </action> <action dev="VG" type="update" due-to="Konstantin Piroumian" due-to-email="[EMAIL PROTECTED]"> Action LangSelect has been deprecated in favor of LocaleAction. </action> 1.5 +103 -140 xml-cocoon2/src/java/org/apache/cocoon/transformation/SQLTransformer.java Index: SQLTransformer.java =================================================================== RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/transformation/SQLTransformer.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- SQLTransformer.java 4 Feb 2002 15:29:57 -0000 1.4 +++ SQLTransformer.java 5 Feb 2002 11:12:13 -0000 1.5 @@ -78,18 +78,20 @@ /** * + * @author <a href="mailto:[EMAIL PROTECTED]">Carsten Ziegeler</a> * @author <a href="mailto:[EMAIL PROTECTED]">Donald Ball</a> * @author <a href="mailto:[EMAIL PROTECTED]">Giacomo Pati</a> * (PWR Organisation & Entwicklung) * @author <a href="mailto:[EMAIL PROTECTED]">Sven Beauprez</a> - * @version CVS $Id: SQLTransformer.java,v 1.4 2002/02/04 15:29:57 cziegeler Exp $ + * @version CVS $Id: SQLTransformer.java,v 1.5 2002/02/05 11:12:13 cziegeler Exp $ */ -public class SQLTransformer extends AbstractTransformer implements Composable, Recyclable, Disposable, Configurable { +public class SQLTransformer + extends AbstractTransformer + implements Composable, Recyclable, Disposable, Configurable { /** The SQL namespace **/ - public static final String my_uri = "http://apache.org/cocoon/SQL/2.0"; - public static final String my_name = "SQLTransformer"; + public static final String NAMESPACE = "http://apache.org/cocoon/SQL/2.0"; /** The SQL namespace element names **/ public static final String MAGIC_EXECUTE_QUERY = "execute-query"; @@ -125,18 +127,15 @@ public static final String MAGIC_UPDATE_ATTRIBUTE = "isupdate"; /** The states we are allowed to be in **/ - public static final int STATE_OUTSIDE = 0; - public static final int STATE_INSIDE_EXECUTE_QUERY_ELEMENT = 1; - 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; - public static final int STATE_INSIDE_ESCAPE_STRING = 8; - - /** Default parameters that might apply to all queries **/ - protected Properties default_properties; + protected static final int STATE_OUTSIDE = 0; + protected static final int STATE_INSIDE_EXECUTE_QUERY_ELEMENT = 1; + protected static final int STATE_INSIDE_VALUE_ELEMENT = 2; + protected static final int STATE_INSIDE_QUERY_ELEMENT = 3; + protected static final int STATE_INSIDE_ANCESTOR_VALUE_ELEMENT = 4; + protected static final int STATE_INSIDE_SUBSTITUTE_VALUE_ELEMENT = 5; + protected static final int STATE_INSIDE_IN_PARAMETER_ELEMENT = 6; + protected static final int STATE_INSIDE_OUT_PARAMETER_ELEMENT = 7; + protected static final int STATE_INSIDE_ESCAPE_STRING = 8; /** The list of queries that we're currently working on **/ protected Vector queries; @@ -154,7 +153,7 @@ protected StringBuffer current_value; /** Check if nr of rows need to be written out. **/ - protected String showNrOfRows; + protected boolean showNrOfRows; /** Is the old-driver turned on? (default is off) */ private boolean oldDriver = false; @@ -168,13 +167,21 @@ /** The prefix of our namespace to listen to */ protected String inPrefix; - protected ComponentSelector dbSelector = null; + /** The database selector */ + protected ComponentSelector dbSelector; + /** The component manager */ protected ComponentManager manager; + /** The parameters of the current request */ protected Parameters parameters; + /** The current object model */ protected Map objectModel; + /** + * Composable + */ public void compose( ComponentManager manager ) { + this.queries = new Vector(); try { this.manager = manager; this.dbSelector = (ComponentSelector) manager.lookup( DataSourceComponent.ROLE + "Selector" ); @@ -188,10 +195,14 @@ */ public void recycle() { super.recycle(); - this.queries = null; + this.queries.clear(); this.current_value = null; this.current_name = null; - this.default_properties = null; + this.parameters = null; + this.objectModel = null; + this.outUri = null; + this.inPrefix = null; + this.outPrefix = null; } /** @@ -215,75 +226,31 @@ /** * Setup for the current request */ - public void setup( SourceResolver resolver, Map objectModel, String source, Parameters parameters ) throws ProcessingException, SAXException, IOException { // setup instance variables - this.queries = new Vector(); this.current_value = new StringBuffer(); - this.current_name = null; 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 ); - } - - // Check the password - parameter = parameters.getParameter( SQLTransformer.MAGIC_PASSWORD, null ); - if ( parameter != null ) { - 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 ); - if ( parameter != null ) { - getLogger().debug( "DOC-ELEMENT: " + parameter ); - default_properties.setProperty( SQLTransformer.MAGIC_DOC_ELEMENT, parameter ); - } - parameter = parameters.getParameter( SQLTransformer.MAGIC_ROW_ELEMENT, null ); - if ( parameter != null ) { - getLogger().debug( "ROW-ELEMENT: " + parameter ); - default_properties.setProperty( SQLTransformer.MAGIC_ROW_ELEMENT, parameter ); - } - - // Check namespace-prefix and namespace-uri - parameter = parameters.getParameter( SQLTransformer.MAGIC_NS_URI_ELEMENT, null ); - if ( parameter != null ) { - getLogger().debug( "NS-URI: " + parameter ); - default_properties.setProperty( SQLTransformer.MAGIC_NS_URI_ELEMENT, parameter ); - } - - parameter = parameters.getParameter( SQLTransformer.MAGIC_NS_PREFIX_ELEMENT, null ); - if ( parameter != null ) { - getLogger().debug( "NS-PREFIX: " + parameter ); - default_properties.setProperty( SQLTransformer.MAGIC_NS_PREFIX_ELEMENT, parameter ); + this.showNrOfRows = parameters.getParameterAsBoolean( SQLTransformer.MAGIC_NR_OF_ROWS, false ); + if ( this.getLogger().isDebugEnabled() ) { + if ( this.parameters.getParameter( SQLTransformer.MAGIC_CONNECTION , null ) != null ) { + this.getLogger().debug( "CONNECTION: " + this.parameters.getParameter( SQLTransformer.MAGIC_CONNECTION , null ) ); + } else { + this.getLogger().debug( "DBURL: " + parameters.getParameter( SQLTransformer.MAGIC_DBURL, null ) ); + this.getLogger().debug( "USERNAME: " + parameters.getParameter( SQLTransformer.MAGIC_USERNAME, null ) ); + } + this.getLogger().debug( "DOC-ELEMENT: " + parameters.getParameter( SQLTransformer.MAGIC_DOC_ELEMENT, "rowset" ) ); + this.getLogger().debug( "ROW-ELEMENT: " + parameters.getParameter( SQLTransformer.MAGIC_ROW_ELEMENT, "row" ) ); + this.getLogger().debug( "NS-URI: " + parameters.getParameter( SQLTransformer.MAGIC_NS_URI_ELEMENT, NAMESPACE ) ); + this.getLogger().debug( "NS-PREFIX: " + parameters.getParameter( SQLTransformer.MAGIC_NS_PREFIX_ELEMENT, "" ) ); } - } + } /** * This will be the meat of SQLTransformer, where the query is run. @@ -291,23 +258,16 @@ protected void executeQuery( int index ) throws SAXException { - // First set up the namespace handling - if ( getCurrentQuery().properties.getProperty( SQLTransformer.MAGIC_NS_URI_ELEMENT ) != null ) { - outUri = getCurrentQuery().properties.getProperty( SQLTransformer.MAGIC_NS_URI_ELEMENT ); - } else { - outUri = my_uri; - } + this.outUri = getCurrentQuery().properties.getParameter( SQLTransformer.MAGIC_NS_URI_ELEMENT, NAMESPACE ); + this.outPrefix = getCurrentQuery().properties.getParameter( SQLTransformer.MAGIC_NS_PREFIX_ELEMENT, "" ); - if ( getCurrentQuery().properties.getProperty( SQLTransformer.MAGIC_NS_PREFIX_ELEMENT ) != null ) { - outPrefix = getCurrentQuery().properties.getProperty( SQLTransformer.MAGIC_NS_PREFIX_ELEMENT ); - } else { - outPrefix = ""; - } - if ( !"".equals( outPrefix ) && !"".equals( outUri ) ) { - this.contentHandler.startPrefixMapping( outPrefix, outUri ); + if ( !"".equals( this.outPrefix ) && !"".equals( this.outUri ) ) { + this.contentHandler.startPrefixMapping( this.outPrefix, this.outUri ); } - getLogger().debug( "SQLTransformer executing query nr " + index ); + if ( this.getLogger().isDebugEnabled() ) { + this.getLogger().debug( "SQLTransformer executing query nr " + index ); + } AttributesImpl attr = new AttributesImpl(); Query query = (Query) queries.elementAt( index ); boolean query_failure = false; @@ -326,13 +286,13 @@ } if ( !query_failure ) { - if ( showNrOfRows != null && showNrOfRows.equalsIgnoreCase( "true" ) ) { - attr.addAttribute( my_uri, query.nr_of_rows, query.nr_of_rows, "CDATA", + if ( this.showNrOfRows ) { + attr.addAttribute( NAMESPACE, 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", + attr.addAttribute( NAMESPACE, query.name_attribute, query.name_attribute, "CDATA", name ); } this.start( query.rowset_name, attr ); @@ -361,13 +321,13 @@ getLogger().warn( "SQLTransformer: Could not close JDBC connection", e ); } } - if ( !"".equals( outPrefix ) && !"".equals( outUri ) ) { - this.contentHandler.endPrefixMapping( outPrefix ); + if ( !"".equals( this.outPrefix ) && !"".equals( this.outUri ) ) { + this.contentHandler.endPrefixMapping( this.outPrefix ); } } protected static void throwIllegalStateException( String message ) { - throw new IllegalStateException( my_name + ": " + message ); + throw new IllegalStateException( "SQLTransformer: " + message ); } protected void startExecuteQueryElement() { @@ -477,14 +437,14 @@ case SQLTransformer.STATE_INSIDE_QUERY_ELEMENT: int level = 0; try { - level = Integer.parseInt( attributes.getValue( my_uri, + level = Integer.parseInt( attributes.getValue( NAMESPACE, SQLTransformer.MAGIC_ANCESTOR_VALUE_LEVEL_ATTRIBUTE ) ); } catch ( Exception e ) { getLogger().debug( "SQLTransformer", e ); throwIllegalStateException( "Ancestor value elements must have a " + SQLTransformer.MAGIC_ANCESTOR_VALUE_LEVEL_ATTRIBUTE + " attribute" ); } - String name = attributes.getValue( my_uri, + String name = attributes.getValue( NAMESPACE, SQLTransformer.MAGIC_ANCESTOR_VALUE_NAME_ATTRIBUTE ); if ( name == null ) { throwIllegalStateException( "Ancestor value elements must have a " + @@ -516,7 +476,7 @@ protected void startSubstituteValueElement( Attributes attributes ) { switch ( current_state ) { case SQLTransformer.STATE_INSIDE_QUERY_ELEMENT: - String name = attributes.getValue( my_uri, + String name = attributes.getValue( NAMESPACE, SQLTransformer.MAGIC_SUBSTITUTE_VALUE_NAME_ATTRIBUTE ); if ( name == null ) { throwIllegalStateException( "Substitute value elements must have a " + @@ -584,9 +544,9 @@ protected void startInParameterElement( Attributes attributes ) { switch ( current_state ) { case SQLTransformer.STATE_INSIDE_EXECUTE_QUERY_ELEMENT: - String nr = attributes.getValue( my_uri, + String nr = attributes.getValue( NAMESPACE, SQLTransformer.MAGIC_IN_PARAMETER_NR_ATTRIBUTE ); - String value = attributes.getValue( my_uri, + String value = attributes.getValue( NAMESPACE, SQLTransformer.MAGIC_IN_PARAMETER_VALUE_ATTRIBUTE ); getLogger().debug( "IN PARAMETER NR " + nr + "; VALUE " + value ); int position = Integer.parseInt( nr ); @@ -605,11 +565,11 @@ protected void startOutParameterElement( Attributes attributes ) { switch ( current_state ) { case SQLTransformer.STATE_INSIDE_EXECUTE_QUERY_ELEMENT: - String name = attributes.getValue( my_uri, + String name = attributes.getValue( NAMESPACE, SQLTransformer.MAGIC_OUT_PARAMETER_NAME_ATTRIBUTE ); - String nr = attributes.getValue( my_uri, + String nr = attributes.getValue( NAMESPACE, SQLTransformer.MAGIC_OUT_PARAMETER_NR_ATTRIBUTE ); - String type = attributes.getValue( my_uri, + String type = attributes.getValue( NAMESPACE, SQLTransformer.MAGIC_OUT_PARAMETER_TYPE_ATTRIBUTE ); getLogger().debug( "OUT PARAMETER NAME" + name + ";NR " + nr + "; TYPE " + type ); int position = Integer.parseInt( nr ); @@ -673,7 +633,7 @@ * ContentHandler method */ public void startPrefixMapping( String prefix, String uri ) throws SAXException { - if ( uri.equals( my_uri ) ) { + if ( uri.equals( NAMESPACE ) ) { inPrefix = prefix; } else { super.contentHandler.startPrefixMapping( prefix, uri ); @@ -707,7 +667,7 @@ */ public void startElement( String uri, String name, String raw, Attributes attributes ) throws SAXException { - if ( !uri.equals( my_uri ) ) { + if ( !uri.equals( NAMESPACE ) ) { super.startElement( uri, name, raw, attributes ); return; } @@ -737,7 +697,7 @@ */ public void endElement( String uri, String name, String raw ) throws SAXException { - if ( !uri.equals( my_uri ) ) { + if ( !uri.equals( NAMESPACE ) ) { super.endElement( uri, name, raw ); return; } @@ -836,12 +796,12 @@ protected int query_index; /** SQL configuration information **/ - protected Properties properties; + protected Parameters properties; /** Dummy static variables for the moment **/ - protected String rowset_name = "rowset"; + protected String rowset_name; + protected String row_name; protected String nr_of_rows = "nrofrows"; - protected String row_name = "row"; protected String name_attribute = "name"; /** The connection, once opened **/ @@ -883,11 +843,12 @@ protected Query( SQLTransformer transformer, int query_index ) { this.transformer = transformer; this.query_index = query_index; - this.properties = new Properties( transformer.default_properties ); + this.properties = new Parameters(); + this.properties.merge( transformer.parameters ); } protected void setParameter( String name, String value ) { - properties.setProperty( name, value ); + properties.setParameter( name, value ); } protected void setUpdate( boolean flag ) { @@ -962,7 +923,7 @@ fieldName = type.substring( index + 1, type.length() ); } else { transformer.getTheLogger().error( "Invalid SQLType: " + type, null ); - throw new SQLException( "Wrong SQLType" ); + throw new SQLException( "Invalid SQLType: " + type); } try { clss = Class.forName( className ); @@ -980,28 +941,39 @@ protected Connection getConnection() throws SQLException { Connection result = null; - String connection = properties.getProperty( SQLTransformer.MAGIC_CONNECTION ); - String dburl = properties.getProperty( SQLTransformer.MAGIC_DBURL ); - String username = properties.getProperty( SQLTransformer.MAGIC_USERNAME ); - String password = properties.getProperty( SQLTransformer.MAGIC_PASSWORD ); - - DataSourceComponent datasource = null; try { + final String connection = properties.getParameter( SQLTransformer.MAGIC_CONNECTION, null ); if ( connection != null ) { - datasource = (DataSourceComponent) dbSelector.select( connection ); - while ( result == null ) { + if (this.transformer.dbSelector == null) { + transformer.getTheLogger().error( "No DBSelector found, could not use connection: " + connection); + } else { + DataSourceComponent datasource = null; + try { - result = datasource.getConnection(); - } catch ( Exception e ) { - long waittime = 5000 * (long) Math.random(); - getTheLogger().debug( "SQLTransformer$Query: could not acquire a Connection -- waiting " + waittime + " ms to try again." ); - try { - Thread.sleep( waittime ); - } catch ( InterruptedException ie ) { + datasource = (DataSourceComponent) this.transformer.dbSelector.select( connection ); + while ( result == null ) { + try { + result = datasource.getConnection(); + } catch ( Exception e ) { + long waittime = 5000 * (long) Math.random(); + getTheLogger().debug( "SQLTransformer$Query: could not acquire a Connection -- waiting " + waittime + " ms to try again." ); + try { + Thread.sleep( waittime ); + } catch ( InterruptedException ie ) { + } + } } + } catch ( ComponentException cme ) { + transformer.getTheLogger().error( "Could not use connection: " + connection, cme ); + } finally { + if ( datasource != null ) this.transformer.dbSelector.release( datasource ); } } } else { + final String dburl = properties.getParameter( SQLTransformer.MAGIC_DBURL, null ); + final String username = properties.getParameter( SQLTransformer.MAGIC_USERNAME, null ); + final String password = properties.getParameter( SQLTransformer.MAGIC_PASSWORD, null ); + if ( username == null || password == null ) { result = DriverManager.getConnection( dburl ); } else { @@ -1009,26 +981,17 @@ password ); } } - } catch ( ComponentException cme ) { - transformer.getTheLogger().error( "Could not use connection: " + connection, cme ); } catch ( SQLException e ) { transformer.getTheLogger().error( "Caught a SQLException", e ); throw e; - } finally { - if ( datasource != null ) dbSelector.release( datasource ); } return result; } protected void execute() throws SQLException { - if ( null != properties.getProperty( SQLTransformer.MAGIC_DOC_ELEMENT ) ) { - this.rowset_name = properties.getProperty( SQLTransformer.MAGIC_DOC_ELEMENT ); - } - if ( null != properties.getProperty( SQLTransformer.MAGIC_ROW_ELEMENT ) ) { - this.row_name = properties.getProperty( SQLTransformer.MAGIC_ROW_ELEMENT ); - } - + this.rowset_name = properties.getParameter( SQLTransformer.MAGIC_DOC_ELEMENT, "rowset" ); + this.row_name = properties.getParameter( SQLTransformer.MAGIC_ROW_ELEMENT, "row" ); Enumeration enum = query_parts.elements(); StringBuffer sb = new StringBuffer();
---------------------------------------------------------------------- In case of troubles, e-mail: [EMAIL PROTECTED] To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]