cocoon-cvs mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From h...@apache.org
Subject cvs commit: xml-cocoon2/src/scratchpad/src/org/apache/cocoon/acting/modular TestAction.java DatabaseSelectAction.java DatabaseDeleteAction.java DatabaseUpdateAction.java DatabaseAddAction.java DatabaseAction.java
Date Sun, 28 Apr 2002 19:59:53 GMT
haul        02/04/28 12:59:53

  Modified:    src/scratchpad/src/org/apache/cocoon/acting/modular Tag:
                        cocoon_2_0_3_branch TestAction.java
                        DatabaseSelectAction.java DatabaseDeleteAction.java
                        DatabaseUpdateAction.java DatabaseAddAction.java
                        DatabaseAction.java
  Log:
  sync with head
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.1.2.1   +72 -21    xml-cocoon2/src/scratchpad/src/org/apache/cocoon/acting/modular/TestAction.java
  
  Index: TestAction.java
  ===================================================================
  RCS file: /home/cvs/xml-cocoon2/src/scratchpad/src/org/apache/cocoon/acting/modular/TestAction.java,v
  retrieving revision 1.1
  retrieving revision 1.1.2.1
  diff -u -r1.1 -r1.1.2.1
  --- TestAction.java	15 Mar 2002 15:23:43 -0000	1.1
  +++ TestAction.java	28 Apr 2002 19:59:52 -0000	1.1.2.1
  @@ -52,9 +52,9 @@
   package org.apache.cocoon.acting.modular;
   
   import org.apache.avalon.framework.activity.Initializable;
  +import org.apache.avalon.framework.configuration.Configurable;
   import org.apache.avalon.framework.configuration.Configuration;
   import org.apache.avalon.framework.configuration.ConfigurationException;
  -import org.apache.avalon.framework.parameters.Parameterizable;
   import org.apache.avalon.framework.parameters.ParameterException;
   import org.apache.avalon.framework.parameters.Parameters;
   import org.apache.avalon.framework.thread.ThreadSafe;
  @@ -79,29 +79,44 @@
    * they should instead use components to access their inputs and
    * outputs. Available components include request parameters,
    * attributes, headers, and session attributes. Which component to use
  - * can be specified from sitemap via "input" and "output" parameters.
  + * can be specified upon setup via "input-module" and
  + * "output-module" tags through the name attribute.
    *
    * This particular action copies all available parameters obtained
  - * from the input component to the output component.
  - *  */
  + * from the input component to the output component or, if a specific
  + * parameter is specified through parameter-name, just one parameter.
  + */
   public class TestAction extends ComposerAction 
  -    implements Parameterizable, ThreadSafe {
  +    implements Configurable, ThreadSafe {
   
       String INPUT_MODULE_ROLE = InputModule.ROLE;
       String OUTPUT_MODULE_ROLE = OutputModule.ROLE;
       String INPUT_MODULE_SELECTOR = INPUT_MODULE_ROLE+"Selector";
       String OUTPUT_MODULE_SELECTOR = OUTPUT_MODULE_ROLE+"Selector";
   
  +    Configuration inputConf = null;
  +    Configuration outputConf = null;
  +    String inputName = null;
  +    String outputName = null;
  +    String defaultParameterName = null;
  +    boolean useGetValues = false;
  +
       String inputHint = "request"; // default to request parameters
       String outputHint = "attribute"; // default to request attributes
   
  -    public void parameterize(Parameters parameters) throws ParameterException {
  -        if (parameters != null) {
  -            this.inputHint = parameters.getParameter("input", inputHint);
  -            this.outputHint = parameters.getParameter("output", outputHint);
  -        }
  +
  +    public void configure(Configuration config) throws ConfigurationException {
  +
  +        this.inputConf  = config.getChild("input-module");
  +        this.inputName  = this.inputConf.getAttribute("name");
  +        this.outputConf = config.getChild("output-module");
  +        this.outputName = this.outputConf.getAttribute("name");
  +        this.defaultParameterName = config.getChild("parameter-name").getValue(null);
  +        this.useGetValues = config.getChild("use-getValues").getValueAsBoolean(this.useGetValues);
       }
   
  +
  +
       public Map act( Redirector redirector, SourceResolver resolver, Map objectModel, 
                       String source, Parameters param ) throws Exception {
   
  @@ -111,12 +126,12 @@
             getLogger().error("no request object!");
             return(null);
           }
  +        String parameterName = param.getParameter("parameter-name",this.defaultParameterName);
  +        boolean useGetValues = param.getParameterAsBoolean("use-getValues",this.useGetValues);
           InputModule input = null;
           OutputModule output = null;
           ComponentSelector inputSelector = null;
           ComponentSelector outputSelector = null;
  -        String inputName = param.getParameter("input", this.inputHint);
  -        String outputName = param.getParameter("output", this.outputHint);
   
           try {
               if (getLogger().isDebugEnabled()) getLogger().debug("start...");
  @@ -129,20 +144,56 @@
               if (outputName != null && outputSelector != null && outputSelector.hasComponent(outputName)){
                   output = (OutputModule) outputSelector.select(outputName);
               }
  +
  +
               if (input != null  && output != null) {
  -                if (getLogger().isDebugEnabled()) getLogger().debug("got input and output
adaptors");
  +                if (getLogger().isDebugEnabled()) getLogger().debug("got input and output
modules");
                   // do something
  -                // for a test, read all parameters from input and write them to outout
  -                Enumeration enum = input.getAttributeNames(null,request);
  -                while (enum.hasMoreElements()) {
  -                    String parameterName = (String) enum.nextElement();
  -                    Object value = input.getAttribute(parameterName, null, request);
  -                    if (getLogger().isDebugEnabled()) getLogger().debug("["+parameterName+"]
= ["+value+"]");
  -                    output.setAttribute(null, request, parameterName, value);
  +
  +                if (parameterName == null) {
  +                    if (getLogger().isDebugEnabled()) getLogger().debug("reading all parameter
values");
  +                    // for a test, read all parameters from input and write them to outout
  +                    // get names first, then (one) value per name
  +                    Enumeration enum = input.getAttributeNames(this.inputConf,request);
  +                    while (enum.hasMoreElements()) {
  +                        parameterName = (String) enum.nextElement();
  +                        Object value = input.getAttribute(parameterName, this.inputConf,
request);
  +                        output.setAttribute(this.outputConf, request, parameterName, value);
  +                        
  +                        if (getLogger().isDebugEnabled()) 
  +                            getLogger().debug("["+parameterName+"] = ["+value+"]");
  +                    }
  +                        // ------------------------------------------------------------------------
  +                } else {
  +
  +                    if (useGetValues) {
  +                        // get all existing values
  +                        Object[] value = input.getAttributeValues(parameterName, this.inputConf,
request);
  +                        output.setAttribute(this.outputConf, request, parameterName, value);
  +                        
  +                        if (getLogger().isDebugEnabled()) 
  +                            for (int i=0; i<value.length; i++)
  +                                getLogger().debug("["+parameterName+"["+i+"]] = ["+value[i]+"]");
  +                        // ------------------------------------------------------------------------
  +
  +                    } else {
  +                        // get just one parameter value
  +                        if (getLogger().isDebugEnabled()) 
  +                            getLogger().debug("reading parameter values for "+parameterName);
  +                        
  +                        Object value = input.getAttribute(parameterName, this.inputConf,
request);
  +                        output.setAttribute(this.outputConf, request, parameterName, value);
  +                        
  +                        if (getLogger().isDebugEnabled()) getLogger().debug("["+parameterName+"]
= ["+value+"]");
  +                        // ------------------------------------------------------------------------
  +                    }
                   }
  -                output.commit(null,request);
  +                output.commit(this.outputConf,request);
                   if (getLogger().isDebugEnabled()) getLogger().debug("done commit");
  +                // done
               }
  +
  +
           } catch (Exception e) {
               throw e;
           } finally {
  
  
  
  1.1.2.1   +19 -13    xml-cocoon2/src/scratchpad/src/org/apache/cocoon/acting/modular/DatabaseSelectAction.java
  
  Index: DatabaseSelectAction.java
  ===================================================================
  RCS file: /home/cvs/xml-cocoon2/src/scratchpad/src/org/apache/cocoon/acting/modular/DatabaseSelectAction.java,v
  retrieving revision 1.1
  retrieving revision 1.1.2.1
  diff -u -r1.1 -r1.1.2.1
  --- DatabaseSelectAction.java	15 Mar 2002 15:23:43 -0000	1.1
  +++ DatabaseSelectAction.java	28 Apr 2002 19:59:52 -0000	1.1.2.1
  @@ -80,7 +80,7 @@
    * a state of flux.
    *
    * @author <a href="mailto:haul@apache.org">Christian Haul</a>
  - * @version CVS $Id: DatabaseSelectAction.java,v 1.1 2002/03/15 15:23:43 haul Exp $
  + * @version CVS $Id: DatabaseSelectAction.java,v 1.1.2.1 2002/04/28 19:59:52 haul Exp $
    */
   public class DatabaseSelectAction extends DatabaseAction {
   
  @@ -90,7 +90,7 @@
        * highly specific to operation INSERT / UPDATE / DELETE / SELECT
        */
       protected String selectMode ( boolean isAutoIncrement, HashMap modes ) {
  -
  +        
           return (String) modes.get( MODE_OTHERS );
       }
   
  @@ -121,32 +121,36 @@
                   Configuration[] keys = table.getChild("keys").getChildren("key");
                   Configuration[] values = table.getChild("values").getChildren("value");
   
  -                queryData = new CacheHelper( keys.length, keys.length );
  -                fillModes( keys, true, defaultModeNames, modeTypes, queryData );
  +                queryData = new CacheHelper( keys.length, keys.length + values.length );
  +                fillModes( keys  , true , defaultModeNames, modeTypes, queryData );
                   fillModes( values, false, defaultModeNames, modeTypes, queryData );
  -
  +                
                   StringBuffer queryBuffer = new StringBuffer("SELECT ");
   
  -                queryBuffer.append(table.getAttribute("name")).append(" WHERE ");
  +                //queryBuffer.append(table.getAttribute("name")).append(" WHERE ");
  +                int count = 0;
                   for (int i = 0; i < queryData.columns.length; i++) {
                       if ( !queryData.columns[i].isKey ) {
  -                        if ( i > 0 ) {
  +                        if ( count > 0 ) {
                               queryBuffer.append(", ");
                           }
                           queryBuffer
                               .append( queryData.columns[i].columnConf.getAttribute( "name"
) );
  +                        count++;
                       }
                   }
   
                   queryBuffer.append(" FROM ").append(table.getAttribute("name")).append("
WHERE ");
  +                count = 0;
                   for (int i = 0; i < queryData.columns.length; i++) {
                       if ( queryData.columns[i].isKey ) {
  -                        if ( i > 0 ) {
  +                        if ( count > 0 ) {
                               queryBuffer.append(" AND ");
                           }
                           queryBuffer
                               .append( queryData.columns[i].columnConf.getAttribute( "name"
) )
                               .append( "= ?");
  +                        count++;
                       }
                   }
   
  @@ -182,8 +186,8 @@
       /**
        * set all necessary ?s and execute the query
        */
  -    protected void processRow ( Request request, Connection conn, PreparedStatement statement,
Configuration table,
  -                                CacheHelper queryData, Object[][] columnValues, int rowIndex,
Map results )
  +    protected int processRow ( Request request, Connection conn, PreparedStatement statement,
Configuration table,
  +                               CacheHelper queryData, Object[][] columnValues, int rowIndex,
Map results )
           throws SQLException, ConfigurationException, Exception {
   
           int currentIndex = 1;
  @@ -202,19 +206,21 @@
           statement.execute();
           // retrieve values
           ResultSet resultset = statement.getResultSet();
  -        rowIndex = -1;
  +        rowIndex = 0;
           while ( resultset.next() ){
  -            if ( ! ( rowIndex == -1 && resultset.isLast() ) ) {
  +            //if ( ! ( rowIndex == -1 && resultset.isLast() ) ) {
                   rowIndex++;
  -            }
  +            //}
               for (int i = 0; i < queryData.columns.length; i++) {
                   if ( !queryData.columns[i].isKey ) {
                       Object value = this.getColumn( resultset, queryData.columns[i].columnConf
);
                       String param = getOutputName( table, queryData.columns[i].columnConf,
rowIndex );
                       this.setRequestAttribute( request, param, value );
  +                    results.put(param,value);
                   }
               }
           }
  +        return rowIndex;
       }
   
   
  
  
  
  1.1.2.1   +6 -5      xml-cocoon2/src/scratchpad/src/org/apache/cocoon/acting/modular/DatabaseDeleteAction.java
  
  Index: DatabaseDeleteAction.java
  ===================================================================
  RCS file: /home/cvs/xml-cocoon2/src/scratchpad/src/org/apache/cocoon/acting/modular/DatabaseDeleteAction.java,v
  retrieving revision 1.1
  retrieving revision 1.1.2.1
  diff -u -r1.1 -r1.1.2.1
  --- DatabaseDeleteAction.java	15 Mar 2002 15:23:43 -0000	1.1
  +++ DatabaseDeleteAction.java	28 Apr 2002 19:59:52 -0000	1.1.2.1
  @@ -70,7 +70,7 @@
    * flux.
    *
    * @author <a href="mailto:haul@apache.org">Christian Haul</a>
  - * @version CVS $Id: DatabaseDeleteAction.java,v 1.1 2002/03/15 15:23:43 haul Exp $
  + * @version CVS $Id: DatabaseDeleteAction.java,v 1.1.2.1 2002/04/28 19:59:52 haul Exp $
    */
   public class DatabaseDeleteAction extends DatabaseAction {
   
  @@ -158,9 +158,9 @@
       /**
        * set all necessary ?s and execute the query
        */
  -    protected void processRow ( Request request, Connection conn, PreparedStatement statement,
  -                                Configuration table, CacheHelper queryData, Object[][]
columnValues,
  -                                int rowIndex, Map results )
  +    protected int processRow ( Request request, Connection conn, PreparedStatement statement,
  +                               Configuration table, CacheHelper queryData, Object[][] columnValues,
  +                               int rowIndex, Map results )
           throws SQLException, ConfigurationException, Exception {
   
           int currentIndex = 1;
  @@ -176,7 +176,8 @@
                   currentIndex++;
               }
           }
  -        statement.execute();
  +        int rowCount = statement.executeUpdate();
  +        return rowCount;
       }
   
   }
  
  
  
  1.1.2.1   +5 -4      xml-cocoon2/src/scratchpad/src/org/apache/cocoon/acting/modular/DatabaseUpdateAction.java
  
  Index: DatabaseUpdateAction.java
  ===================================================================
  RCS file: /home/cvs/xml-cocoon2/src/scratchpad/src/org/apache/cocoon/acting/modular/DatabaseUpdateAction.java,v
  retrieving revision 1.1
  retrieving revision 1.1.2.1
  diff -u -r1.1 -r1.1.2.1
  --- DatabaseUpdateAction.java	15 Mar 2002 15:23:43 -0000	1.1
  +++ DatabaseUpdateAction.java	28 Apr 2002 19:59:52 -0000	1.1.2.1
  @@ -70,7 +70,7 @@
    * flux.
    *
    * @author <a href="mailto:haul@apache.org">Christian Haul</a>
  - * @version CVS $Id: DatabaseUpdateAction.java,v 1.1 2002/03/15 15:23:43 haul Exp $
  + * @version CVS $Id: DatabaseUpdateAction.java,v 1.1.2.1 2002/04/28 19:59:52 haul Exp $
    */
   public class DatabaseUpdateAction extends DatabaseAction {
   
  @@ -171,8 +171,8 @@
       /**
        * set all necessary ?s and execute the query
        */
  -    protected void processRow ( Request request, Connection conn, PreparedStatement statement,
Configuration table,
  -                                CacheHelper queryData, Object[][] columnValues, int rowIndex,
Map results )
  +    protected int processRow ( Request request, Connection conn, PreparedStatement statement,
Configuration table,
  +							   CacheHelper queryData, Object[][] columnValues, int rowIndex, Map results )
           throws SQLException, ConfigurationException, Exception {
   
   
  @@ -199,7 +199,8 @@
                   currentIndex++;
               }
           }
  -        statement.execute();
  +		int rowCount = statement.executeUpdate();
  +		return rowCount;
       }
   
   }
  
  
  
  1.1.2.1   +6 -5      xml-cocoon2/src/scratchpad/src/org/apache/cocoon/acting/modular/DatabaseAddAction.java
  
  Index: DatabaseAddAction.java
  ===================================================================
  RCS file: /home/cvs/xml-cocoon2/src/scratchpad/src/org/apache/cocoon/acting/modular/DatabaseAddAction.java,v
  retrieving revision 1.1
  retrieving revision 1.1.2.1
  diff -u -r1.1 -r1.1.2.1
  --- DatabaseAddAction.java	15 Mar 2002 15:23:43 -0000	1.1
  +++ DatabaseAddAction.java	28 Apr 2002 19:59:52 -0000	1.1.2.1
  @@ -72,7 +72,7 @@
    * {@see DatabaseAction} for details.
    *
    * @author <a href="mailto:haul@apache.org">Christian Haul</a>
  - * @version CVS $Id: DatabaseAddAction.java,v 1.1 2002/03/15 15:23:43 haul Exp $
  + * @version CVS $Id: DatabaseAddAction.java,v 1.1.2.1 2002/04/28 19:59:52 haul Exp $
    */
   public class DatabaseAddAction extends DatabaseAction {
   
  @@ -80,9 +80,9 @@
       /**
        * set all necessary ?s and execute the query
        */
  -    protected void processRow ( Request request, Connection conn, PreparedStatement statement,
  -                                Configuration table, CacheHelper queryData, Object[][]
columnValues,
  -                                int rowIndex, Map results )
  +    protected int processRow ( Request request, Connection conn, PreparedStatement statement,
  +                               Configuration table, CacheHelper queryData, Object[][] columnValues,
  +                               int rowIndex, Map results )
           throws SQLException, ConfigurationException, Exception {
   
           int currentIndex = 1;
  @@ -99,7 +99,7 @@
                   currentIndex++;
               }
           }
  -        statement.execute();
  +        int rowCount = statement.executeUpdate();
           // get resulting ids for autoincrement columns
           for (int i = 0; i < queryData.columns.length; i++) {
               if ( queryData.columns[i].isAutoIncrement && queryData.columns[i].isKey
) {
  @@ -107,6 +107,7 @@
                                  conn, statement, request, results );
               }
           }
  +        return rowCount;
       }
   
   
  
  
  
  1.1.2.1   +40 -11    xml-cocoon2/src/scratchpad/src/org/apache/cocoon/acting/modular/DatabaseAction.java
  
  Index: DatabaseAction.java
  ===================================================================
  RCS file: /home/cvs/xml-cocoon2/src/scratchpad/src/org/apache/cocoon/acting/modular/DatabaseAction.java,v
  retrieving revision 1.1
  retrieving revision 1.1.2.1
  diff -u -r1.1 -r1.1.2.1
  --- DatabaseAction.java	15 Mar 2002 15:23:43 -0000	1.1
  +++ DatabaseAction.java	28 Apr 2002 19:59:52 -0000	1.1.2.1
  @@ -124,6 +124,9 @@
    * descriptor.xml file are looked up in the component service. Default
    * mode names can only be set during action setup. </p>
    *
  + * <p>The number of affected rows is returned to the sitemap with the
  + * "row-count" parameter if at least one row was affected.</p>
  +
    * <table>
    * <tr><td colspan="2">Configuration options (setup):</td></tr>
    * <tr><td>input            </td><td>default mode name for reading
values</td></tr>
  @@ -139,7 +142,7 @@
    * </table>
    *
    * @author <a href="mailto:haul@apache.org">Christian Haul</a>
  - * @version CVS $Id: DatabaseAction.java,v 1.1 2002/03/15 15:23:43 haul Exp $
  + * @version CVS $Id: DatabaseAction.java,v 1.1.2.1 2002/04/28 19:59:52 haul Exp $
    * @see org.apache.cocoon.modules.input
    * @see org.apache.cocoon.modules.output
    * @see org.apache.cocoon.modules.database
  @@ -345,6 +348,7 @@
           DataSourceComponent datasource = null;
           Connection conn = null;
           Map results = new HashMap();
  +        int rows = 0;
   
           // read global parameter settings
           boolean reloadable = Constants.DESCRIPTOR_RELOADABLE_DEFAULT;
  @@ -424,15 +428,22 @@
                   modeTypes.put( MODE_AUTOINCR, "autoincr" );
                   modeTypes.put( MODE_OTHERS, "others" );
               };
  +
               for (int i=0; i<tables.length; i++) {
  -                if ( set_tables == null ||
  +                if (set_tables == null ||
                        set_tables.containsKey( tables[i].getAttribute( "name" ) ) ||
                        ( tables[i].getAttribute( "alias", null ) != null && set_tables.containsKey(
tables[i].getAttribute( "alias" ) ) )
                        ) {
                       if (tablesetname != null) {
  -                        modeTypes = (HashMap) set_tables.get(tables[i].getAttribute("name"));
  +                        if (tables[i].getAttribute("alias", null) != null && set_tables.containsKey(tables[i].getAttribute("alias"))){
  +                            modeTypes = (HashMap) set_tables.get(tables[i].getAttribute("alias"));
  +                            set_tables.remove(tables[i].getAttribute("alias"));
  +                        } else {
  +                            modeTypes = (HashMap) set_tables.get(tables[i].getAttribute("name"));
  +                            set_tables.remove(tables[i].getAttribute("name"));
  +                        }
                       }
  -                    processTable( tables[i], conn, request, results, modeTypes );
  +                    rows += processTable( tables[i], conn, request, results, modeTypes
);
                   }
               }
   
  @@ -468,6 +479,7 @@
                       if (getLogger().isDebugEnabled())
                           getLogger().debug( "Rolling back transaction. Caused by " + e.getMessage()
);
                       conn.rollback();
  +                    results = null;
   
                       // obtain output mode module and commit output
                       ComponentSelector outputSelector = null;
  @@ -520,9 +532,21 @@
               if (datasource != null)
                   this.dbselector.release(datasource);
           }
  +        if (results != null) {
  +            if (rows>0) {
  +                results.put("row-count",new Integer(rows));
  +            } else {
  +                results = null;
  +            }
  +        } else {
  +            if (rows>0) {
  +                results = new HashMap(1);
  +                results.put("row-count",new Integer(rows));
  +            }
  +        }
   
  -        return Collections.unmodifiableMap(results);
  -    }
  +        return (results == null? results : Collections.unmodifiableMap(results));
  +    } 
   
   
   
  @@ -534,15 +558,18 @@
        * @param conn the database connection
        * @param request the request
        */
  -    protected void processTable( Configuration table, Connection conn, Request request,
  +    protected int processTable( Configuration table, Connection conn, Request request,
                                    Map results, HashMap modeTypes )
           throws SQLException, ConfigurationException, Exception {
   
           PreparedStatement statement = null;
  +        int rows = 0;
           try {
               LookUpKey luk = new LookUpKey(table, modeTypes);
               CacheHelper queryData = null;
               
  +            getLogger().debug("modeTypes : "+ modeTypes);
  +
               // get cached data
               // synchronize complete block since we don't want 100s of threads
               // generating the same cached data set. In the long run all data
  @@ -573,7 +600,7 @@
               for ( int rowIndex = 0; rowIndex < setLength; rowIndex++ ) {
                   if (getLogger().isDebugEnabled())
                       getLogger().debug( "====> row no. " + rowIndex );
  -                processRow( request, conn, statement, table, queryData, columnValues, rowIndex,
results );
  +                rows += processRow( request, conn, statement, table, queryData, columnValues,
rowIndex, results );
               }
   
           } finally {
  @@ -583,6 +610,7 @@
                   }
               } catch (SQLException e) {}
           }
  +        return rows;
       }
   
   
  @@ -844,13 +872,14 @@
   
       /**
        * set all necessary ?s and execute the query
  +     * return number of rows processed
        *
        * This method is intended to be overridden by classes that
        * implement other operations e.g. delete
        */
  -    protected abstract void processRow( Request request, Connection conn, PreparedStatement
statement,
  -                                        Configuration table, CacheHelper queryData, Object[][]
columnValues,
  -                                        int rowIndex, Map results )
  +    protected abstract int processRow( Request request, Connection conn, PreparedStatement
statement,
  +                                       Configuration table, CacheHelper queryData, Object[][]
columnValues,
  +                                       int rowIndex, Map results )
           throws SQLException, ConfigurationException, Exception;
   
       /**
  
  
  

----------------------------------------------------------------------
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


Mime
View raw message