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 &lt;Martin.Man@seznam.cz&gt;
  - * @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