You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by vg...@apache.org on 2003/05/08 02:05:05 UTC

cvs commit: cocoon-2.1/src/webapp/samples/flow sitemap.xmap invalidContinuation.xml

vgritsenko    2003/05/07 17:05:05

  Modified:    .        status.xml
               src/java/org/apache/cocoon/components/flow TODO
               src/java/org/apache/cocoon/components/flow/javascript
                        JSCocoon.java JavaScriptInterpreter.java system.js
               src/webapp sitemap.xmap welcome.xslt
               src/webapp/samples sitemap.xmap
               src/webapp/samples/flow sitemap.xmap
  Added:       src/java/org/apache/cocoon/components/flow
                        InvalidContinuationException.java
  Removed:     src/webapp/samples/flow invalidContinuation.xml
  Log:
  Fix Bug #19526: Throw InvalidContinuationException instead of redirecting.
  Change welcome.xslt - add contextPath parameter to properly render error page (not-found.xml)
  Add InvalidContinuationException handler to the main sitemap.
  
  Revision  Changes    Path
  1.26      +4 -0      cocoon-2.1/status.xml
  
  Index: status.xml
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/status.xml,v
  retrieving revision 1.25
  retrieving revision 1.26
  diff -u -r1.25 -r1.26
  --- status.xml	7 May 2003 21:20:04 -0000	1.25
  +++ status.xml	8 May 2003 00:05:04 -0000	1.26
  @@ -191,6 +191,10 @@
     <changes>
   
    <release version="@version@" date="@date@">
  +  <action dev="VG" type="fix" fixes-bug="19526" due-to="Tony Collen" due-to-email="tc@hist.umn.edu">
  +   Throw InvalidContinuationException when flow continuation is not found or not valid,
  +   instead of forwarding to hard-coded 'invalidContinuation' page.
  +  </action>
     <action dev="CZ" type="fix" fixes-bug="14564">
      Fixing NPE in JspEngineImpl.
     </action>
  
  
  
  1.2       +1 -0      cocoon-2.1/src/java/org/apache/cocoon/components/flow/TODO
  
  Index: TODO
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/java/org/apache/cocoon/components/flow/TODO,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- TODO	9 Mar 2003 00:08:49 -0000	1.1
  +++ TODO	8 May 2003 00:05:04 -0000	1.2
  @@ -16,6 +16,7 @@
   
   - [ADVANCED] implement leaky bucket algorithm or similar to protect
   the server from creating too many continuations.
  +  -- Try o.a.cocoon.util.MRUBucketMap
   
   - [ADVANCED] define a boolean parameter, to be set in either
   cocoon.xconf or web.xml, that specifies that session affinity is to be
  
  
  
  1.1                  cocoon-2.1/src/java/org/apache/cocoon/components/flow/InvalidContinuationException.java
  
  Index: InvalidContinuationException.java
  ===================================================================
  /*
  
   ============================================================================
                     The Apache Software License, Version 1.1
   ============================================================================
  
   Copyright (C) 1999-2003 The Apache Software Foundation. All rights reserved.
  
   Redistribution and use in source and binary forms, with or without modifica-
   tion, are permitted provided that the following conditions are met:
  
   1. Redistributions of  source code must  retain the above copyright  notice,
      this list of conditions and the following disclaimer.
  
   2. Redistributions in binary form must reproduce the above copyright notice,
      this list of conditions and the following disclaimer in the documentation
      and/or other materials provided with the distribution.
  
   3. The end-user documentation included with the redistribution, if any, must
      include  the following  acknowledgment:  "This product includes  software
      developed  by the  Apache Software Foundation  (http://www.apache.org/)."
      Alternately, this  acknowledgment may  appear in the software itself,  if
      and wherever such third-party acknowledgments normally appear.
  
   4. The names "Apache Cocoon" and  "Apache Software Foundation" must  not  be
      used to  endorse or promote  products derived from  this software without
      prior written permission. For written permission, please contact
      apache@apache.org.
  
   5. Products  derived from this software may not  be called "Apache", nor may
      "Apache" appear  in their name,  without prior written permission  of the
      Apache Software Foundation.
  
   THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
   FITNESS  FOR A PARTICULAR  PURPOSE ARE  DISCLAIMED.  IN NO  EVENT SHALL  THE
   APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT,
   INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU-
   DING, BUT NOT LIMITED TO, PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS
   OF USE, DATA, OR  PROFITS; OR BUSINESS  INTERRUPTION)  HOWEVER CAUSED AND ON
   ANY  THEORY OF LIABILITY,  WHETHER  IN CONTRACT,  STRICT LIABILITY,  OR TORT
   (INCLUDING  NEGLIGENCE OR  OTHERWISE) ARISING IN  ANY WAY OUT OF THE  USE OF
   THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  
   This software  consists of voluntary contributions made  by many individuals
   on  behalf of the Apache Software  Foundation and was  originally created by
   Stefano Mazzocchi  <st...@apache.org>. For more  information on the Apache
   Software Foundation, please see <http://www.apache.org/>.
  
  */
  package org.apache.cocoon.components.flow;
  
  import org.apache.cocoon.ProcessingException;
  
  /**
   * This Exception is thrown whenever an invalid continuation is given.
   *
   * @author <a href="mailto:tcollen@neuagency.com">Tony Collen</a>
   * @version CVS $Id: InvalidContinuationException.java,v 1.1 2003/05/08 00:05:04 vgritsenko Exp $
   */
  public class InvalidContinuationException extends ProcessingException {
  
      /**
       * Construct a new <code>InvalidContinuationException</code> instance.
       */
      public InvalidContinuationException(String message) {
          super(message, null);
      }
  
      /**
       * Construct a new <code>InvalidContinuationException</code> that references
       * a parent Exception.
       */
      public InvalidContinuationException(String message, Throwable t) {
          super(message, t);
      }
  }
  
  
  
  1.11      +10 -10    cocoon-2.1/src/java/org/apache/cocoon/components/flow/javascript/JSCocoon.java
  
  Index: JSCocoon.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/java/org/apache/cocoon/components/flow/javascript/JSCocoon.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- JSCocoon.java	7 May 2003 04:36:33 -0000	1.10
  +++ JSCocoon.java	8 May 2003 00:05:04 -0000	1.11
  @@ -269,21 +269,21 @@
       }
   
       /**
  -       Set the Scope object in the session object of the current
  -       user. This effectively means that at the next invocation from the
  -       sitemap of a JavaScript function (using the &lt;map:call
  -       function="..."&gt;), will obtain the same scope as the current
  -       one.
  -    */
  +     * Set the Scope object in the session object of the current
  +     * user. This effectively means that at the next invocation from the
  +     * sitemap of a JavaScript function (using the &lt;map:call
  +     * function="..."&gt;), will obtain the same scope as the current
  +     * one.
  +     */
       public void jsFunction_createSession()
       {
           interpreter.setSessionScope(environment, getParentScope());
       }
   
       /**
  -       Remove the Scope object from the session object of the current
  -       user.
  -    */
  +     * Remove the Scope object from the session object of the current
  +     * user.
  +     */
       public void jsFunction_removeSession()
       {
           interpreter.removeSessionScope(environment);
  
  
  
  1.19      +48 -34    cocoon-2.1/src/java/org/apache/cocoon/components/flow/javascript/JavaScriptInterpreter.java
  
  Index: JavaScriptInterpreter.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/java/org/apache/cocoon/components/flow/javascript/JavaScriptInterpreter.java,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- JavaScriptInterpreter.java	7 May 2003 04:36:33 -0000	1.18
  +++ JavaScriptInterpreter.java	8 May 2003 00:05:04 -0000	1.19
  @@ -59,8 +59,10 @@
   import org.apache.avalon.framework.configuration.Configuration;
   import org.apache.avalon.framework.configuration.ConfigurationException;
   import org.apache.cocoon.ResourceNotFoundException;
  +import org.apache.cocoon.ProcessingException;
   import org.apache.cocoon.components.flow.AbstractInterpreter;
   import org.apache.cocoon.components.flow.Interpreter;
  +import org.apache.cocoon.components.flow.InvalidContinuationException;
   import org.apache.cocoon.components.flow.WebContinuation;
   import org.apache.cocoon.environment.Environment;
   import org.apache.cocoon.environment.ObjectModelHelper;
  @@ -98,7 +100,7 @@
   
       /**
        * LAST_EXEC_TIME
  -     * A long value is stored under this key in each top level JavaScript 
  +     * A long value is stored under this key in each top level JavaScript
        * thread scope object. When you enter a context any scripts whose
        * modification time is later than this value will be recompiled and reexecuted,
        * and this value will be updated to the current time.
  @@ -151,7 +153,7 @@
           }
   
           public Script getScript(Context context, Scriptable scope,
  -                                             boolean refresh) 
  +                                             boolean refresh)
               throws Exception {
               if (refresh) {
                   source.refresh();
  @@ -182,15 +184,15 @@
               final org.mozilla.javascript.tools.debugger.Main db
                   = new org.mozilla.javascript.tools.debugger.Main("Cocoon Flow Debugger");
               db.pack();
  -            java.awt.Dimension size = 
  +            java.awt.Dimension size =
                   java.awt.Toolkit.getDefaultToolkit().getScreenSize();
               size.width *= 0.75;
               size.height *= 0.75;
               db.setSize(size);
  -            db.setExitAction(new Runnable() { 
  -                    public void run() { 
  -                        db.setVisible(false); 
  -                    } 
  +            db.setExitAction(new Runnable() {
  +                    public void run() {
  +                        db.setVisible(false);
  +                    }
                   });
               db.setOptimizationLevel(OPTIMIZATION_LEVEL);
               db.setVisible(true);
  @@ -322,7 +324,7 @@
               userScopes = new HashMap();
               session.setAttribute(USER_GLOBAL_SCOPE, userScopes);
           }
  -        
  +
           String uriPrefix = environment.getURIPrefix();
           userScopes.put(uriPrefix, scope);
       }
  @@ -440,13 +442,13 @@
                   }
                   needResolve.clear();
               }
  -            thrScope.put(LAST_EXEC_TIME, thrScope, 
  +            thrScope.put(LAST_EXEC_TIME, thrScope,
                            new Long(System.currentTimeMillis()));
               // Compile all the scripts first. That way you can set breakpoints
               // in the debugger before they execute.
               for (int i = 0, size = execList.size(); i < size; i++) {
                   String sourceURI = (String)execList.get(i);
  -                ScriptSourceEntry entry = 
  +                ScriptSourceEntry entry =
                       (ScriptSourceEntry)compiledScripts.get(sourceURI);
                   if (entry == null) {
                       Source src = environment.resolveURI(sourceURI);
  @@ -459,13 +461,13 @@
               // Execute the scripts if necessary
               for (int i = 0, size = execList.size(); i < size; i++) {
                   String sourceURI = (String)execList.get(i);
  -                ScriptSourceEntry entry = 
  +                ScriptSourceEntry entry =
                       (ScriptSourceEntry)compiledScripts.get(sourceURI);
                   long lastMod = entry.getSource().getLastModified();
                   Script script = entry.getScript(context, this.scope, false);
                   if (lastExecTime == 0 || lastMod > lastExecTime) {
                       script.exec(context, thrScope);
  -                } 
  +                }
               }
           }
           return thrScope;
  @@ -479,7 +481,7 @@
       protected void exitContext(Scriptable thrScope)
       {
           // thrScope may be null if an exception occurred compiling a script
  -        if (thrScope != null) { 
  +        if (thrScope != null) {
               JSCocoon cocoon = (JSCocoon)thrScope.get("cocoon", thrScope);
               cocoon.invalidateContext();
           }
  @@ -495,21 +497,21 @@
        * @return compiled script
        */
   
  -    public Script compileScript(Context cx, 
  -                                Environment environment, 
  +    public Script compileScript(Context cx,
  +                                Environment environment,
                                   String fileName) throws Exception {
           Source src = environment.resolveURI(fileName);
           if (src == null) {
               throw new ResourceNotFoundException(fileName + ": not found");
           }
           synchronized (compiledScripts) {
  -            ScriptSourceEntry entry = 
  +            ScriptSourceEntry entry =
                   (ScriptSourceEntry)compiledScripts.get(src.getURI());
               Script compiledScript = null;
               if (entry == null) {
                   compiledScripts.put(src.getURI(),
                                       entry = new ScriptSourceEntry(src));
  -            } 
  +            }
               compiledScript = entry.getScript(cx, this.scope, false);
               return compiledScript;
           }
  @@ -523,11 +525,11 @@
           }
           Reader reader = new BufferedReader(new InputStreamReader(is));
           Script compiledScript = cx.compileReader(scope, reader,
  -                                                 src.getURI(), 
  +                                                 src.getURI(),
                                                    1, null);
           return compiledScript;
       }
  -    
  +
       /**
        * Calls a JavaScript function, passing <code>params</code> as its
        * arguments. In addition to this, it makes available the parameters
  @@ -581,13 +583,17 @@
           } catch (JavaScriptException ex) {
               EvaluatorException ee =
                   Context.reportRuntimeError(ToolErrorReporter.getMessage("msg.uncaughtJSException",
  -
                                                                           ex.getMessage()));
  -            throw new CascadingRuntimeException(ee.getMessage(), unwrap(ex));
  +            Throwable unwrapped = unwrap(ex);
  +            if (unwrapped instanceof ProcessingException) {
  +                throw (ProcessingException)unwrapped;
  +            }
  +
  +            throw new CascadingRuntimeException(ee.getMessage(), unwrapped);
           } catch (EcmaError ee) {
               String msg = ToolErrorReporter.getMessage("msg.uncaughtJSException", ee.toString());
               if (ee.getSourceName() != null) {
  -                Context.reportRuntimeError(msg, 
  +                Context.reportRuntimeError(msg,
                                              ee.getSourceName(),
                                              ee.getLineNumber(),
                                              ee.getLineSource(),
  @@ -608,10 +614,12 @@
           WebContinuation wk = continuationsMgr.lookupWebContinuation(id);
   
           if (wk == null) {
  -            List p = new ArrayList();
  -            p.add(new Interpreter.Argument("kontId", id));
  -            callFunction("handleInvalidContinuation", p, environment);
  -            return;
  +
  +            /*
  +             * Throw an InvalidContinuationException to be handled inside the
  +             * <map:handle-errors> sitemap element.
  +             */
  +            throw new InvalidContinuationException("The continuation ID " + id + " is invalid.");
           }
   
           Context context = Context.enter();
  @@ -633,9 +641,10 @@
           // We can now resume the processing from the state saved by the
           // continuation object. Setup the JavaScript Context object.
           Object handleContFunction = kScope.get("handleContinuation", kScope);
  -        if (handleContFunction == Scriptable.NOT_FOUND)
  +        if (handleContFunction == Scriptable.NOT_FOUND) {
               throw new RuntimeException("Cannot find 'handleContinuation' "
                                          + "(system.js not loaded?)");
  +        }
   
           Object args[] = { jswk };
   
  @@ -654,14 +663,19 @@
           try {
               ((Function)handleContFunction).call(context, kScope, kScope, args);
           } catch (JavaScriptException ex) {
  -            EvaluatorException ee = 
  +            EvaluatorException ee =
                   Context.reportRuntimeError(ToolErrorReporter.getMessage("msg.uncaughtJSException",
                                                                           ex.getMessage()));
  -            throw new CascadingRuntimeException(ee.getMessage(), unwrap(ex));
  +            Throwable unwrapped = unwrap(ex);
  +            if (unwrapped instanceof ProcessingException) {
  +                throw (ProcessingException)unwrapped;
  +            }
  +
  +            throw new CascadingRuntimeException(ee.getMessage(), unwrapped);
           } catch (EcmaError ee) {
               String msg = ToolErrorReporter.getMessage("msg.uncaughtJSException", ee.toString());
               if (ee.getSourceName() != null) {
  -                Context.reportRuntimeError(msg, 
  +                Context.reportRuntimeError(msg,
                                              ee.getSourceName(),
                                              ee.getLineNumber(),
                                              ee.getLineSource(),
  @@ -674,7 +688,7 @@
               Context.exit();
           }
       }
  -    
  +
       private Throwable unwrap(JavaScriptException e) {
           Object value = e.getValue();
           while (value instanceof Wrapper) {
  @@ -692,10 +706,10 @@
           throws Exception {
           Map objectModel = environment.getObjectModel();
           // Make the live-connect objects available to the view layer
  -        JavaScriptFlow.setPackages(objectModel, 
  +        JavaScriptFlow.setPackages(objectModel,
                                      (Scriptable)ScriptableObject.getProperty(scope,
                                                                               "Packages"));
  -        JavaScriptFlow.setJavaPackage(objectModel, 
  +        JavaScriptFlow.setJavaPackage(objectModel,
                                         (Scriptable)ScriptableObject.getProperty(scope,
                                                                      "java"));
           super.forwardTo(uri, bizData, continuation, environment);
  
  
  
  1.6       +3 -3      cocoon-2.1/src/java/org/apache/cocoon/components/flow/javascript/system.js
  
  Index: system.js
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/java/org/apache/cocoon/components/flow/javascript/system.js,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- system.js	4 Apr 2003 23:08:13 -0000	1.5
  +++ system.js	8 May 2003 00:05:04 -0000	1.6
  @@ -60,7 +60,8 @@
   // identified by 'id'
   function handleInvalidContinuation(id)
   {
  -  sendPage("invalidContinuation", {"ident" : id});
  +  // Throw an exception which can be handled in sitemap's handle-error section
  +  throw new Packages.org.apache.cocoon.components.flow.InvalidContinuationException("Continuation ID + " + id + " is invalid");
   }
   
   // Redirect Support
  @@ -126,5 +127,4 @@
       cocoon.outputModuleRollback(type);
     }
   }
  -
   
  
  
  
  1.14      +22 -11    cocoon-2.1/src/webapp/sitemap.xmap
  
  Index: sitemap.xmap
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/webapp/sitemap.xmap,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- sitemap.xmap	6 May 2003 07:10:50 -0000	1.13
  +++ sitemap.xmap	8 May 2003 00:05:04 -0000	1.14
  @@ -199,10 +199,11 @@
          +-->
      <map:selector logger="sitemap.selector.exception" name="exception" src="org.apache.cocoon.selection.ExceptionSelector">
        <exception name="not-found" class="org.apache.cocoon.ResourceNotFoundException"/>
  +     <exception name="invalid-continuation" class="org.apache.cocoon.components.flow.InvalidContinuationException"/>
        <!-- The statement below tells the selector to unroll as much exceptions as possible -->
        <exception class="java.lang.Throwable" unroll="true"/>
      </map:selector>
  -  
  +
   
      <map:selector logger="sitemap.selector.request-parameter" name="request-parameter" src="org.apache.cocoon.selection.RequestParameterSelector">
       <!-- Define now which request parameter to use; or do it later,
  @@ -399,7 +400,9 @@
             | and sending the output down the pipeline to be processed by the
             | next stage.
             +-->
  -      <map:transform src="welcome.xslt"/>
  +      <map:transform src="welcome.xslt">
  +        <map:parameter name="contextPath" value="{request:contextPath}"/>
  +      </map:transform>
         
         <!--+
             | The serializer concludes the SAX events journey into the pipeline
  @@ -496,7 +499,7 @@
       <map:match pattern="*/**">
         <map:mount check-reload="yes" src="{1}/" uri-prefix="{1}"/>
       </map:match>
  -    
  +
       <!--+
           | At the very end of a pipeline, you can catch the errors triggered
           | by the pipeline execution. The error handler is an internal sitemap
  @@ -511,25 +514,33 @@
           +-->
       <map:handle-errors>
         <map:select type="exception">
  -      
  +
           <map:when test="not-found">
             <map:generate src="not-found.xml"/>
  -          <map:transform src="welcome.xslt"/>
  +          <map:transform src="welcome.xslt">
  +            <map:parameter name="contextPath" value="{request:contextPath}"/>
  +          </map:transform>
           </map:when>
  -        
  +
  +        <map:when test="invalid-continuation">
  +          <map:generate src="not-found.xml"/>
  +          <map:transform src="welcome.xslt">
  +            <map:parameter name="contextPath" value="{request:contextPath}"/>
  +          </map:transform>
  +        </map:when>
  +
           <map:otherwise>
             <map:generate type="notifying"/>
             <map:transform src="stylesheets/system/error2html.xslt">
               <map:parameter name="contextPath" value="{request:contextPath}"/>
  -	      </map:transform>
  +          </map:transform>
           </map:otherwise>
         </map:select>
  -      
  +
         <map:serialize/>
  -      
       </map:handle-errors>
  -  </map:pipeline>
   
  +  </map:pipeline>
    </map:pipelines>
   
   </map:sitemap>
  
  
  
  1.7       +5 -3      cocoon-2.1/src/webapp/welcome.xslt
  
  Index: welcome.xslt
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/webapp/welcome.xslt,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- welcome.xslt	29 Mar 2003 01:08:38 -0000	1.6
  +++ welcome.xslt	8 May 2003 00:05:04 -0000	1.7
  @@ -4,6 +4,8 @@
   
   <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   
  +  <xsl:param name="contextPath" select="'/cocoon'"/>
  +
     <xsl:template match="welcome">
       <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
         <head>
  @@ -17,7 +19,7 @@
                stream 
            --> 
           <meta http-equiv="Content-Type" content="text/xhtml; charset=UTF-8"/>
  -        <link href="styles/main.css" type="text/css" rel="stylesheet"/>
  +        <link href="{$contextPath}/styles/main.css" type="text/css" rel="stylesheet"/>
           <link href="favicon.ico" rel="SHORTCUT ICON" />
         </head>
         <body>
  @@ -27,7 +29,7 @@
            Copyright � @year@ <a href="http://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.
           </p>
           <p class="block">
  -          <a href="http://cocoon.apache.org/"><img src="images/powered.gif" alt="Powered by Apache Cocoon"/></a>
  +          <a href="http://cocoon.apache.org/"><img src="{$contextPath}/images/powered.gif" alt="Powered by Apache Cocoon"/></a>
           </p>
         </body>
       </html>
  
  
  
  1.12      +4 -8      cocoon-2.1/src/webapp/samples/sitemap.xmap
  
  Index: sitemap.xmap
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/webapp/samples/sitemap.xmap,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- sitemap.xmap	30 Mar 2003 12:48:32 -0000	1.11
  +++ sitemap.xmap	8 May 2003 00:05:05 -0000	1.12
  @@ -26,7 +26,6 @@
   <!-- =========================== Views =================================== -->
   
    <map:views>
  - 
     <map:view name="content" from-label="content">
      <map:serialize type="xml"/>
     </map:view>
  @@ -39,13 +38,11 @@
     <map:view name="links" from-position="last">
      <map:serialize type="links"/>
     </map:view>
  -  
    </map:views>
   
   <!-- =========================== Pipelines ================================= -->
   
    <map:pipelines>
  -
     <map:pipeline>
   
      <map:match pattern="">
  @@ -155,15 +152,14 @@
       <map:generate src="error-giving-page.xml"/>
       <map:serialize/>
      </map:match>
  -  
  +
      <!-- ======================== Automount =============================== -->
  -   
  +
      <map:match pattern="*/**">
        <map:mount uri-prefix="{1}" src="{1}/" check-reload="yes"/>
      </map:match>
  -  
  +
     </map:pipeline>
  -  
    </map:pipelines>
   
   </map:sitemap>
  
  
  
  1.7       +7 -3      cocoon-2.1/src/webapp/samples/flow/sitemap.xmap
  
  Index: sitemap.xmap
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/webapp/samples/flow/sitemap.xmap,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- sitemap.xmap	26 Mar 2003 21:21:43 -0000	1.6
  +++ sitemap.xmap	8 May 2003 00:05:05 -0000	1.7
  @@ -1,9 +1,10 @@
   <?xml version="1.0"?>
   
  +<!-- CVS $Id$ -->
  +
   <map:sitemap xmlns:map="http://apache.org/cocoon/sitemap/1.0">
   
     <map:pipelines>
  -
       <map:pipeline>
   
         <map:match pattern="">
  @@ -14,12 +15,15 @@
           <map:serialize/>
         </map:match>
   
  +      <map:match pattern="*">
  +        <map:redirect-to uri="{1}/"/>
  +      </map:match>
  +
         <map:match pattern="*/**">
           <map:mount uri-prefix="{1}" src="{1}/" check-reload="yes"/>
         </map:match>
  -      
  +
       </map:pipeline>
  -    
     </map:pipelines>
     
   </map:sitemap>