Same patch as in the previous mail but for the 20 branch.
I recommend it if you're having problems in developing because
of difficult error messages.

Nicola Ken Barozzi These are the days of miracle and wonder... 
                               ...so don't cry baby, don't cry 
<[EMAIL PROTECTED]> Paul Simon 
*** src/org/apache/cocoon/notification/DefaultNotificationBuilder.java  Wed Dec 31 
14:00:00 1969
--- src/org/apache/cocoon/notification/DefaultNotificationBuilder.java  Sun Dec  9 
10:43:48 2001
***************
*** 0 ****
--- 1,152 ----
+ /*****************************************************************************
+  * Copyright (C) The Apache Software Foundation. All rights reserved.        *
+  * ------------------------------------------------------------------------- *
+  * This software is published under the terms of the Apache Software License *
+  * version 1.1, a copy of which has been included  with this distribution in *
+  * the LICENSE file.                                                         *
+  **************************************************************************** *
+  */
+ 
+ package  org.apache.cocoon.notification;
+ 
+ import  org.apache.avalon.framework.CascadingThrowable;
+ import  org.xml.sax.SAXException;
+ import  java.io.PrintWriter;
+ import  java.io.StringWriter;
+ import  java.util.HashMap;
+ 
+ 
+ /**
+  *  Generates an Notification representation of widely used objects.
+  *
+  * @author <a href="mailto:[EMAIL PROTECTED]";>Nicola Ken Barozzi</a>
+  * @created 24 August 2000
+  */
+ public class DefaultNotificationBuilder
+     implements NotificableBuilder {
+ 
+   /**
+    * @param sender
+    * @param o
+    * @return
+    */
+   public Notificable build (Object sender, Object o) {
+     if (o instanceof Notificable) {
+       return  (Notificable)o;
+     }
+     else if (o instanceof Throwable) {
+       Throwable t = (Throwable)o;
+       Notification n = new Notification(sender);
+       n.setType("error");
+       n.setTitle("Something went wrong.");
+       if (t != null) {
+         n.setSource(t.getClass().getName());
+         n.setMessage(t.getMessage());
+         n.setDescription(t.toString());
+ 
+         Throwable rootT = getRootCause(t);
+         n.addExtraDescription("original message", rootT.toString());
+ 
+         // get the stacktrace: if the exception is a SAXException,
+         // the stacktrace of the embedded exception is used as the
+         // SAXException does not append it automatically
+         Throwable stackTraceException;
+         if (t instanceof SAXException && ((SAXException)t).getException() !=
+             null) {
+           stackTraceException = ((SAXException)t).getException();
+         }
+         else {
+           stackTraceException = t;
+         }
+         StringWriter sw = new StringWriter();
+         stackTraceException.printStackTrace(new PrintWriter(sw));
+         n.addExtraDescription("stacktrace", sw.toString());
+         // Add nested throwables description
+         sw = new StringWriter();
+         appendCauses(new PrintWriter(sw), stackTraceException);
+         String causes = sw.toString();
+         if (causes != null && causes.length() != 0) {
+           n.addExtraDescription("full exception chain stacktrace", causes);
+         }
+       }
+       return  n;
+     }
+     else {
+       Notification n = new Notification(sender);
+       n.setType("unknown");
+       n.setTitle("Object notification");
+       n.setSource(o.getClass().getName());
+       n.setMessage(o.toString());
+       n.setDescription("No details available.");
+       return  n;
+     }
+   }
+ 
+    public Notificable build(Object sender, Object o, String type, String title, 
+String source, String message, String description, HashMap extra)
+    {
+       //NKB Cast here is secure, the method is of this class
+       Notification n = (Notification)build (sender, o);
+       
+       if(type!=null)
+        n.setType(type);
+       if(title!=null)
+        n.setTitle(title);
+       if(source!=null)
+        n.setSource(source);
+       if(message!=null)
+        n.setMessage(message);
+       if(description!=null)
+        n.setDescription(description);
+       if(extra!=null)
+        n.replaceExtraDescriptions(extra);
+        
+       return  n;
+   }
+       
+       
+   /**
+    * Print recursively all nested causes of a Throwable in a PrintWriter.
+    */
+   private static void appendCauses (PrintWriter out, Throwable t) {
+     Throwable cause = null;
+     if (t instanceof CascadingThrowable) {
+       cause = ((CascadingThrowable)t).getCause();
+     }
+     else if (t instanceof SAXException) {
+       cause = ((SAXException)t).getException();
+     }
+     else if (t instanceof java.sql.SQLException) {
+       cause = ((java.sql.SQLException)t).getNextException();
+     }
+     if (cause != null) {
+       out.print("Original exception : ");
+       cause.printStackTrace(out);
+       out.println();
+       // Recurse
+       appendCauses(out, cause);
+     }
+   }
+ 
+   /**
+    * Get root Exception.
+    */
+   private static Throwable getRootCause (Throwable t) {
+     Throwable cause = null;
+     if (t instanceof CascadingThrowable) {
+       cause = ((CascadingThrowable)t).getCause();
+     }
+     else if (t instanceof SAXException) {
+       cause = ((SAXException)t).getException();
+     }
+     else if (t instanceof java.sql.SQLException) {
+       cause = ((java.sql.SQLException)t).getNextException();
+     }
+     if (cause == null){
+       return t;
+     }
+     else{
+       // Recurse
+       return getRootCause(cause);
+     }
+   }
+ }

*** src/org/apache/cocoon/notification/Notificable.java Wed Dec 31 14:00:00 1969
--- src/org/apache/cocoon/notification/Notificable.java Sun Dec  9 10:43:48 2001
***************
*** 0 ****
--- 1,66 ----
+ /*****************************************************************************
+  * Copyright (C) The Apache Software Foundation. All rights reserved.        *
+  * ------------------------------------------------------------------------- *
+  * This software is published under the terms of the Apache Software License *
+  * version 1.1, a copy of which has been included  with this distribution in *
+  * the LICENSE file.                                                         *
+  *****************************************************************************/
+ 
+ package org.apache.cocoon.notification;
+ 
+ import java.util.HashMap;
+ 
+ /**
+  *  Interface for Objects that can notify something.
+  *
+  * @author <a href="mailto:[EMAIL PROTECTED]";>Nicola Ken Barozzi</a>
+  * @created 24 August 2000
+  */
+ 
+ public interface Notificable {
+ 
+     /**
+      *  Proposed types of notifications
+      */
+      public static final String UNKNOWN_NOTIFICATION = "unknown";
+      public static final String DEBUG_NOTIFICATION   = "debug";
+      public static final String INFO_NOTIFICATION    = "info" ;
+      public static final String WARN_NOTIFICATION    = "warn" ;
+      public static final String ERROR_NOTIFICATION   = "error";
+      public static final String FATAL_NOTIFICATION   = "fatal";
+ 
+     /**
+      *  Gets the Type attribute of the Notificable object
+      */
+     String getType();
+ 
+     /**
+      *  Gets the Title attribute of the Notificable object
+      */
+     String getTitle();
+ 
+     /**
+      *  Gets the Source attribute of the Notificable object
+      */
+     String getSource();
+ 
+     /**
+      *  Gets the Sender attribute of the Notificable object
+      */
+     String getSender();
+ 
+     /**
+      *  Gets the Message attribute of the Notificable object
+      */
+     String getMessage();
+ 
+     /**
+      *  Gets the Description attribute of the Notificable object
+      */
+     String getDescription();
+ 
+     /**
+      *  Gets the ExtraDescriptions attribute of the Notificable object
+      */
+     HashMap getExtraDescriptions();
+ }

*** src/org/apache/cocoon/notification/NotificableBuilder.java  Wed Dec 31 14:00:00 
1969
--- src/org/apache/cocoon/notification/NotificableBuilder.java  Sun Dec  9 10:25:52 
2001
***************
*** 0 ****
--- 1,25 ----
+ /*****************************************************************************
+  * Copyright (C) The Apache Software Foundation. All rights reserved.        *
+  * ------------------------------------------------------------------------- *
+  * This software is published under the terms of the Apache Software License *
+  * version 1.1, a copy of which has been included  with this distribution in *
+  * the LICENSE file.                                                         *
+  *****************************************************************************/
+ 
+ package org.apache.cocoon.notification;
+ 
+ import java.util.HashMap;
+ 
+ /**
+  *  Generates an Notificable representation of widely used objects.
+  *
+  * @author <a href="mailto:[EMAIL PROTECTED]";>Nicola Ken Barozzi</a> 
+  * @created 24 August 2000
+  */
+ 
+ public interface NotificableBuilder{
+ 
+     public Notificable build(Object sender, Object o);
+     public Notificable build(Object sender, Object o, String type, String title, 
+String source, String message, String description, HashMap extra);
+ }
+ 

*** src/org/apache/cocoon/notification/NotificableBuilderFactory.java   Wed Dec 31 
14:00:00 1969
--- src/org/apache/cocoon/notification/NotificableBuilderFactory.java   Sat Dec  8 
17:28:02 2001
***************
*** 0 ****
--- 1,32 ----
+ /*****************************************************************************
+  * Copyright (C) The Apache Software Foundation. All rights reserved.        *
+  * ------------------------------------------------------------------------- *
+  * This software is published under the terms of the Apache Software License *
+  * version 1.1, a copy of which has been included  with this distribution in *
+  * the LICENSE file.                                                         *
+  *****************************************************************************/
+ 
+ package org.apache.cocoon.notification;
+ 
+ 
+ /**
+  *  Creates NotificableBuilder in response to a hint.
+  *
+  * @author <a href="mailto:[EMAIL PROTECTED]";>Nicola Ken Barozzi</a> Aisa
+  * @created 24 August 2000
+  */
+ 
+ public class NotificableBuilderFactory{
+ 
+     private static NotificableBuilder notificableBuilder
+      = new DefaultNotificationBuilder();
+ 
+     //NKB for now defaults only - the hint is for future extensions,
+     //put now to keep contract stable
+     public static NotificableBuilder builder(Object hint)
+     {
+       return notificableBuilder;
+     }
+ 
+ }
+ 

*** src/org/apache/cocoon/notification/NotificableCascadingRuntimeException.java       
 Wed Dec 31 14:00:00 1969
--- src/org/apache/cocoon/notification/NotificableCascadingRuntimeException.java       
 Sun Dec  9 10:43:48 2001
***************
*** 0 ****
--- 1,106 ----
+ /*****************************************************************************
+  * Copyright (C) The Apache Software Foundation. All rights reserved.        *
+  * ------------------------------------------------------------------------- *
+  * This software is published under the terms of the Apache Software License *
+  * version 1.1, a copy of which has been included  with this distribution in *
+  * the LICENSE file.                                                         *
+  *****************************************************************************/
+ package org.apache.cocoon.notification;
+ 
+ import org.apache.avalon.framework.CascadingRuntimeException;
+ 
+ import java.util.HashMap;
+ 
+ import java.io.PrintStream;
+ import java.io.PrintWriter;
+ 
+ /**
+  * A CascadingRuntimeException that is also Notificable.
+  *
+  * @author <a href="mailto:[EMAIL PROTECTED]";>Nicola Ken Barozzi</a>
+  * @created 7 December 2001
+  */
+ public class NotificableCascadingRuntimeException extends CascadingRuntimeException {
+ 
+     /**
+      * The Notification used internally to keep Notification fields
+      */
+     Notificable n;
+ 
+     /**
+      * Construct a new <code>NotificableCascadingRuntimeException</code> instance.
+      */
+     public NotificableCascadingRuntimeException(String message) {
+         super(message, null);
+         n=NotificableBuilderFactory.builder(this).build(this, message);
+     }
+ 
+     /**
+      * Creates a new <code>ProcessingException</code> instance.
+      *
+      * @param ex an <code>Exception</code> value
+      */
+     public NotificableCascadingRuntimeException(Exception ex) {
+         super(ex.getMessage(), ex);
+         n=NotificableBuilderFactory.builder(this).build(this, ex);
+     }
+ 
+     /**
+      * Construct a new <code>ProcessingException</code> that references
+      * a parent Exception.
+      */
+     public NotificableCascadingRuntimeException(String message, Throwable t) {
+         super(message, t);
+         n=NotificableBuilderFactory.builder(this).build(this, t);
+     }
+ 
+     /**
+      *  Gets the Type attribute of the Notificable object
+      */
+     public String getType(){
+       return n.getType();
+     }
+ 
+     /**
+      *  Gets the Title attribute of the Notificable object
+      */
+     public String getTitle(){
+       return n.getTitle();
+     }
+ 
+     /**
+      *  Gets the Source attribute of the Notificable object
+      */
+     public String getSource(){
+       return n.getSource();
+     }
+ 
+     /**
+      *  Gets the Sender attribute of the Notificable object
+      */
+     public String getSender(){
+       return n.getSender();
+     }
+ 
+     /**
+      *  Gets the Message attribute of the Notificable object
+      */
+     public String getMessage(){
+       return n.getMessage();
+     }
+ 
+     /**
+      *  Gets the Description attribute of the Notificable object
+      */
+     public String getDescription(){
+       return n.getDescription();
+     }
+ 
+     /**
+      *  Gets the ExtraDescriptions attribute of the Notificable object
+      */
+     public HashMap getExtraDescriptions(){
+       return n.getExtraDescriptions();
+     }
+ 
+ }

*** src/org/apache/cocoon/notification/Notification.java        Wed Dec 31 14:00:00 
1969
--- src/org/apache/cocoon/notification/Notification.java        Sun Dec  9 10:42:48 
2001
***************
*** 0 ****
--- 1,199 ----
+ /*****************************************************************************
+  * Copyright (C) The Apache Software Foundation. All rights reserved.        *
+  * ------------------------------------------------------------------------- *
+  * This software is published under the terms of the Apache Software License *
+  * version 1.1, a copy of which has been included  with this distribution in *
+  * the LICENSE file.                                                         *
+  *****************************************************************************/
+ 
+ package org.apache.cocoon.notification;
+ 
+ import org.apache.avalon.framework.CascadingThrowable;
+ import org.xml.sax.SAXException;
+ 
+ import java.io.PrintWriter;
+ import java.io.StringWriter;
+ import java.util.HashMap;
+ 
+ 
+ /**
+  *  Generates an XML representation of the current notification.
+  *
+  * @author <a href="mailto:[EMAIL PROTECTED]";>Nicola Ken Barozzi</a>
+  * @created 24 August 2000
+  */
+ 
+ public class Notification implements Notificable {
+ 
+     /**
+      *  The type of the notification. Examples can be "warning" or "error"
+      */
+     private String type = "unknown";
+ 
+     /**
+      *  The title of the notification.
+      */
+     private String title = "";
+ 
+     /**
+      *  The source that generates the notification.
+      */
+     private String source = "";
+ 
+     /**
+      *  The sender of the notification.
+      */
+     private String sender = "";
+ 
+     /**
+      *  The notification itself.
+      */
+     private String message = "Message not known.";
+ 
+     /**
+      *  A more detailed description of the notification.
+      */
+     private String description = "No details available.";
+ 
+     /**
+      *  A Hashtable containing extra notifications
+      */
+     private HashMap extraDescriptions = new HashMap();
+ 
+     public Notification(Object sender) {
+         this.sender=sender.getClass().getName();
+         setSource(this.getClass().getName());
+         setTitle("Generic notification");
+     }
+ 
+     /**
+      *  Sets the Type attribute of the Notification object
+      *
+      *@param  type  The new Type value
+      */
+     public void setType(String type) {
+         this.type = type;
+     }
+ 
+     /**
+      *  Sets the Title attribute of the Notification object
+      *
+      *@param  title  The new Title value
+      */
+     public void setTitle(String title) {
+         this.title = title;
+     }
+ 
+     /**
+      *  Sets the Source attribute of the Notification object
+      *
+      *@param  source  The new Source value
+      */
+     public void setSource(String source) {
+         this.source = source;
+     }
+ 
+     /**
+      *  Sets the Sender attribute of the Notification object
+      *
+      *@param  sender  The new sender value
+      */
+     private void setSender(Object sender) {
+         this.sender = sender.getClass().getName();
+     }
+ 
+     /**
+      *  Sets the Sender attribute of the Notification object
+      *
+      *@param  sender  The new sender value
+      */
+     private void setSender(String sender) {
+         this.sender = sender;
+     }
+ 
+     /**
+      *  Sets the Message attribute of the Notification object
+      *
+      *@param  message  The new Message value
+      */
+     public void setMessage(String message) {
+         this.message = message;
+     }
+ 
+     /**
+      *  Sets the Description attribute of the Notification object
+      *
+      *@param  description  The new Description value
+      */
+     public void setDescription(String description) {
+         this.description = description;
+     }
+ 
+     /**
+      *  Sets the ExtraDescriptions attribute of the Notification object
+      *
+      *@param  extraDescriptions  The new ExtraDescriptions value
+      */
+     public void addExtraDescription(String extraDescriptionDescription,
+                                     String extraDescription) {
+         this.extraDescriptions.put(extraDescriptionDescription,
+                                    extraDescription);
+     }
+ 
+     /**
+      *  Gets the ExtraDescriptions attribute of the Notification object
+      */
+     protected void replaceExtraDescriptions(HashMap extraDescriptions) {
+         this.extraDescriptions = extraDescriptions;
+     }
+ 
+     /**
+      *  Gets the Type attribute of the Notification object
+      */
+     public String getType() {
+         return type;
+     }
+ 
+     /**
+      *  Gets the Title attribute of the Notification object
+      */
+     public String getTitle() {
+         return title;
+     }
+ 
+     /**
+      *  Gets the Source attribute of the Notification object
+      */
+     public String getSource() {
+         return source;
+     }
+ 
+     /**
+      *  Gets the Sender attribute of the Notification object
+      */
+     public String getSender() {
+         return sender;
+     }
+ 
+     /**
+      *  Gets the Message attribute of the Notification object
+      */
+     public String getMessage() {
+         return message;
+     }
+ 
+     /**
+      *  Gets the Description attribute of the Notification object
+      */
+     public String getDescription() {
+         return description;
+     }
+ 
+     /**
+      *  Gets the ExtraDescriptions attribute of the Notification object
+      */
+     public HashMap getExtraDescriptions() {
+         return extraDescriptions;
+     }
+ }
+ 

*** src/org/apache/cocoon/notification/Notifier.java    Wed Dec 31 14:00:00 1969
--- src/org/apache/cocoon/notification/Notifier.java    Sat Dec  8 17:29:22 2001
***************
*** 0 ****
--- 1,141 ----
+ /*****************************************************************************
+  * Copyright (C) The Apache Software Foundation. All rights reserved.        *
+  * ------------------------------------------------------------------------- *
+  * This software is published under the terms of the Apache Software License *
+  * version 1.1, a copy of which has been included  with this distribution in *
+  * the LICENSE file.                                                         *
+  *****************************************************************************/
+ 
+ package org.apache.cocoon.notification;
+ 
+ import org.apache.cocoon.Constants;
+ 
+ import org.xml.sax.ContentHandler;
+ import org.xml.sax.SAXException;
+ import org.xml.sax.helpers.AttributesImpl;
+ 
+ import java.io.IOException;
+ import java.io.OutputStream;
+ import java.util.HashMap;
+ import java.util.Iterator;
+ 
+ /**
+  * Generates an XML representation of the current notification.
+  *
+  * @author <a href="mailto:[EMAIL PROTECTED]";>Nicola Ken Barozzi</a> Aisa
+  * @author <a href="mailto:[EMAIL PROTECTED]";>Stefano Mazzocchi</a>
+  * @version CVS $Revision: 1.2.2.4 $ $Date: 2001/10/11 08:56:04 $
+  */
+ 
+ public class Notifier {
+ 
+     /**
+      * Generate notification information as a response.
+      * The notification is directly written to the OutputStream.
+      * @param  n The <code>Notificable</code> object
+      * @param outputStream The output stream the notification is written to
+      *        This could be <code>null</code>.
+      * @return The content type for this notification
+      *         (currently always text/html)
+      */
+     public static String notify(Notificable n, OutputStream outputStream)
+     throws IOException {
+ 
+         StringBuffer sb = new StringBuffer();
+ 
+         sb.append("<html><head><title>").append(n.getTitle()).append("</title>");
+         sb.append("<STYLE><!--H1{font-family : sans-serif,Arial,Tahoma;color : 
+white;background-color : #0086b2;} ");
+         sb.append("BODY{font-family : sans-serif,Arial,Tahoma;color : 
+black;background-color : white;} ");
+         sb.append("B{color : white;background-color : #0086b2;} ");
+         sb.append("HR{color : #0086b2;} ");
+         sb.append("--></STYLE> ");
+         sb.append("</head><body>");
+         sb.append("<h1>Cocoon 2 - ").append(n.getTitle()).append("</h1>");
+         sb.append("<HR size=\"1\" noshade>");
+         sb.append("<p><b>type</b> ").append(n.getType()).append("</p>");
+         sb.append("<p><b>message</b> <u>").append(n.getMessage()).append("</u></p>");
+         sb.append("<p><b>description</b> 
+<u>").append(n.getDescription()).append("</u></p>");
+         sb.append("<p><b>sender</b> ").append(n.getSender()).append("</p>");
+         sb.append("<p><b>source</b> ").append(n.getSource()).append("</p>");
+ 
+         HashMap extraDescriptions = n.getExtraDescriptions();
+         Iterator keyIter = extraDescriptions.keySet().iterator();
+ 
+         while (keyIter.hasNext()) {
+             String key = (String) keyIter.next();
+ 
+             
+sb.append("<p><b>").append(key).append("</b><pre>").append(extraDescriptions.get(key)).append("</pre></p>");
+         }
+ 
+         sb.append("<HR size=\"1\" noshade>");
+         sb.append("</body></html>");
+ 
+         if (outputStream != null) outputStream.write(sb.toString().getBytes());
+         // FIXME (SM) how can we send the error with the proper content type?
+ 
+         return "text/html";
+     }
+ 
+     /**
+      * Generate notification information in XML format.
+      */
+     public static void notify(Notificable n, ContentHandler ch) throws SAXException {
+ 
+         final String PREFIX = Constants.ERROR_NAMESPACE_PREFIX;
+         final String URI = Constants.ERROR_NAMESPACE_URI;
+ 
+         // Start the document
+         ch.startDocument();
+         ch.startPrefixMapping(PREFIX, URI);
+ 
+         // Root element.
+         AttributesImpl atts = new AttributesImpl();
+ 
+         atts.addAttribute(URI, "type", PREFIX+":type", "CDATA", n.getType());
+         atts.addAttribute(URI, "sender", PREFIX+":sender", "CDATA", n.getSender());
+         ch.startElement(URI, "notify", PREFIX+":notify", atts);
+         ch.startElement(URI, "title", PREFIX+":title", new AttributesImpl());
+         ch.characters(n.getTitle().toCharArray(), 0, n.getTitle().length());
+         ch.endElement(URI, "title", PREFIX+":title");
+         ch.startElement(URI, "source", PREFIX+":source", new AttributesImpl());
+         ch.characters(n.getSource().toCharArray(), 0, n.getSource().length());
+         ch.endElement(URI, "source", PREFIX+":source");
+         ch.startElement(URI, "message", PREFIX+":message", new AttributesImpl());
+ 
+         if (n.getMessage() != null) {
+             ch.characters(n.getMessage().toCharArray(), 0,
+                           n.getMessage().length());
+         }
+ 
+         ch.endElement(URI, "message", PREFIX+":message");
+         ch.startElement(URI, "description", PREFIX+":description",
+                         new AttributesImpl());
+         ch.characters(n.getDescription().toCharArray(), 0,
+                       n.getDescription().length());
+         ch.endElement(URI, "description", PREFIX+":description");
+ 
+         HashMap  extraDescriptions = n.getExtraDescriptions();
+         Iterator keyIter           = extraDescriptions.keySet().iterator();
+ 
+         while (keyIter.hasNext()) {
+             String key = (String) keyIter.next();
+ 
+             atts = new AttributesImpl();
+ 
+             atts.addAttribute(URI, "description", PREFIX+":description", "CDATA",
+                               key);
+             ch.startElement(URI, "extra", PREFIX+":extra", atts);
+             ch.characters(extraDescriptions.get(key).toString().toCharArray(),
+                           0, (extraDescriptions.get(key).toString())
+                               .length());
+             ch.endElement(URI, "extra", PREFIX+":extra");
+         }
+ 
+         // End root element.
+         ch.endElement(URI, "notify", PREFIX+":notify");
+ 
+         // End the document.
+         ch.endPrefixMapping(PREFIX);
+         ch.endDocument();
+     }
+ }

*** webapp/stylesheets/system/simple-error2html.xsl     Wed Dec 31 14:00:00 1969
--- webapp/stylesheets/system/simple-error2html.xsl     Sun Dec  9 11:30:48 2001
***************
*** 0 ****
--- 1,114 ----
+ <?xml version="1.0"?>
+ 
+ <xsl:stylesheet version="1.0"
+  xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
+  xmlns:error="http://apache.org/cocoon/error/2.0";>
+ 
+ <xsl:template match="error:notify">
+  <html>
+   <head>
+    <title>
+     <xsl:value-of select="@type"/>:<xsl:value-of select="error:title"/>
+    </title>
+   </head>
+   <body bgcolor="#ffffff">
+    <table border="0" bgcolor="#000000" cellpadding="2" cellspacing="2">
+     <tbody>
+      <tr>
+       <td bgcolor="#0086b2" colspan="2">
+        <font color="#ffffff" face="arial,helvetica,sanserif" size="+2">
+         <xsl:value-of select="error:title"/>
+        </font>
+       </td>
+      </tr>
+ 
+      <tr>
+       <td bgcolor="#0086b2" valign="top">
+        <font color="#ffffff" face="arial,helvetica,sanserif" size="+1">
+         <xsl:value-of select="@type"/>
+        </font>
+       </td>
+       <td bgcolor="#ffffff" >
+        <xsl:apply-templates select="error:message"/>
+       </td>
+      </tr>
+ 
+      <tr>
+       <td bgcolor="#0086b2" valign="top" colspan="2">
+        <font color="#ffffff" face="arial,helvetica,sanserif" size="+1">details</font>
+       </td>
+      </tr>
+ 
+      <tr>
+       <td bgcolor="#0086b2" valign="top">
+        <font face="arial,helvetica,sanserif" color="#ffffff">from</font>
+       </td>
+       <td bgcolor="#ffffff">
+        <font face="arial,helvetica,sanserif">
+         <xsl:value-of select="@sender"/>
+        </font>
+       </td>
+      </tr>
+ 
+      <tr>
+       <td bgcolor="#0086b2" valign="top">
+        <font face="arial,helvetica,sanserif" color="#ffffff">source</font>
+       </td>
+       <td bgcolor="#ffffff">
+        <font face="arial,helvetica,sanserif">
+         <xsl:value-of select="error:source"/>
+        </font>
+       </td>
+      </tr>
+ 
+      <xsl:apply-templates select="error:description"/>
+ 
+      <tr>
+       <td bgcolor="#0086b2" valign="top" colspan="2">
+        <font color="#ffffff" face="arial,helvetica,sanserif" size="+1">extra 
+info</font>
+       </td>
+      </tr>
+ 
+      <xsl:apply-templates select="error:extra"/>
+ 
+     </tbody>
+    </table>
+   </body>
+  </html>
+ </xsl:template>
+ 
+  <xsl:template match="error:description">
+   <tr>
+    <td bgcolor="#0086b2" valign="top">
+     <font color="#ffffff" face="arial,helvetica,sanserif">description</font>
+    </td>
+    <td bgcolor="#ffffff">
+     <font face="arial,helvetica,sanserif">
+      <xsl:value-of select="."/>
+     </font>
+    </td>
+   </tr>
+  </xsl:template>
+ 
+  <xsl:template match="error:message">
+   <font face="arial,helvetica,sanserif">
+    <xsl:value-of select="."/>
+   </font>
+  </xsl:template>
+ 
+  <xsl:template match="error:extra">
+   <tr>
+    <td bgcolor="#0086b2" valign="top">
+     <font color="#ffffff" face="arial,helvetica,sanserif">
+      <xsl:value-of select="@description"/>
+     </font>
+    </td>
+    <td bgcolor="#ffffff">
+     <xsl:variable name="x" select="translate(.,'&#13;',' ')"/>
+     <pre>
+      <xsl:value-of select="$x"/>
+     </pre>
+    </td>
+   </tr>
+  </xsl:template>
+ </xsl:stylesheet>

*** src/org/apache/cocoon/components/language/markup/sitemap/java/sitemap.xsl   
2001/12/07 10:18:25     1.11.2.41
--- src/org/apache/cocoon/components/language/markup/sitemap/java/sitemap.xsl   
2001/12/09 11:47:43
***************
*** 743,749 ****
                eventPipeline.setGenerator ("!error-notifier!", e.getMessage(), 
emptyParam, e);
                <xsl:apply-templates select="./*"/>
              } catch (Exception ex) {
!               if (getLogger().isErrorEnabled()) getLogger().error("error notifier 
barfs", ex);
                throw e;
              } finally {
                if(eventPipeline != null)
--- 743,749 ----
                eventPipeline.setGenerator ("!error-notifier!", e.getMessage(), 
emptyParam, e);
                <xsl:apply-templates select="./*"/>
              } catch (Exception ex) {
!               if (getLogger().isErrorEnabled()) getLogger().error("error notifier 
was not able to notify the exception", ex);
                throw e;
              } finally {
                if(eventPipeline != null)


*** src/org/apache/cocoon/components/pipeline/AbstractEventPipeline.java        
2001/11/28 11:18:21     1.5.2.12
--- src/org/apache/cocoon/components/pipeline/AbstractEventPipeline.java        
2001/12/09 11:47:46
***************
*** 68,74 ****
          // (The sitemap uses this setGenerator() method only from inside
          // the error pipeline, when a ErrorNotifier is explicitly generated.)
          if (this.generator instanceof ErrorNotifier) {
!             ((ErrorNotifier)this.generator).setException(e);
          }
      }
  
--- 68,74 ----
          // (The sitemap uses this setGenerator() method only from inside
          // the error pipeline, when a ErrorNotifier is explicitly generated.)
          if (this.generator instanceof ErrorNotifier) {
!             ((ErrorNotifier)this.generator).setThrowable(e);
          }
      }
  


*** src/org/apache/cocoon/servlet/CocoonServlet.java    2001/11/23 14:40:22     
1.13.2.35
--- src/org/apache/cocoon/servlet/CocoonServlet.java    2001/12/09 11:47:51
***************
*** 16,23 ****
  import org.apache.avalon.framework.context.DefaultContext;
  import org.apache.avalon.framework.logger.Loggable;
  import org.apache.cocoon.Constants;
! import org.apache.cocoon.Notification;
! import org.apache.cocoon.Notifier;
  import org.apache.cocoon.ResourceNotFoundException;
  import org.apache.cocoon.ConnectionResetException;
  import org.apache.cocoon.Cocoon;
--- 16,25 ----
  import org.apache.avalon.framework.context.DefaultContext;
  import org.apache.avalon.framework.logger.Loggable;
  import org.apache.cocoon.Constants;
! import org.apache.cocoon.notification.Notificable;
! import org.apache.cocoon.notification.Notification;
! import org.apache.cocoon.notification.NotificableBuilderFactory;
! import org.apache.cocoon.notification.Notifier;
  import org.apache.cocoon.ResourceNotFoundException;
  import org.apache.cocoon.ConnectionResetException;
  import org.apache.cocoon.Cocoon;
***************
*** 50,55 ****
--- 52,58 ----
  import java.lang.reflect.Constructor;
  import java.net.URL;
  import java.util.Arrays;
+ import java.util.HashMap;
  import java.util.StringTokenizer;
  
  /**
***************
*** 58,64 ****
   * @author <a href="mailto:[EMAIL PROTECTED]";>Pierpaolo Fumagalli</a>
   *         (Apache Software Foundation, Exoffice Technologies)
   * @author <a href="mailto:[EMAIL PROTECTED]";>Stefano Mazzocchi</a>
!  * @author <a href="mailto:[EMAIL PROTECTED]";>Nicola Ken Barozzi</a> Aisa
   * @author <a href="mailto:[EMAIL PROTECTED]";>Berin Loritsch</a>
   * @author <a href="mailto:[EMAIL PROTECTED]";>Carsten Ziegeler</a>
   * @author <a href="mailto:[EMAIL PROTECTED]";>Leo Sutic</a>
--- 61,67 ----
   * @author <a href="mailto:[EMAIL PROTECTED]";>Pierpaolo Fumagalli</a>
   *         (Apache Software Foundation, Exoffice Technologies)
   * @author <a href="mailto:[EMAIL PROTECTED]";>Stefano Mazzocchi</a>
!  * @author <a href="mailto:[EMAIL PROTECTED]";>Nicola Ken Barozzi</a>
   * @author <a href="mailto:[EMAIL PROTECTED]";>Berin Loritsch</a>
   * @author <a href="mailto:[EMAIL PROTECTED]";>Carsten Ziegeler</a>
   * @author <a href="mailto:[EMAIL PROTECTED]";>Leo Sutic</a>
***************
*** 585,598 ****
          if (this.cocoon == null) {
              res.setStatus(res.SC_INTERNAL_SERVER_ERROR);
  
!             Notification n = new Notification(this, this.exception);
!             n.setType("internal-servlet-error");
              n.setTitle("Internal servlet error");
              n.setSource("Cocoon servlet");
!             n.setMessage("Internal servlet error");
!             n.setDescription("Cocoon was not initialized.");
              n.addExtraDescription("request-uri", request.getRequestURI());
!             res.setContentType(Notifier.notify(n, res.getOutputStream()));;
  
              return;
          }
--- 588,601 ----
          if (this.cocoon == null) {
              res.setStatus(res.SC_INTERNAL_SERVER_ERROR);
  
!             Notification n= new Notification(this);
!             n.setType("fatal");
              n.setTitle("Internal servlet error");
              n.setSource("Cocoon servlet");
!             n.setMessage("Cocoon was not initialized.");
!             n.setDescription("Cocoon was not initialized. Cannot process request.");
              n.addExtraDescription("request-uri", request.getRequestURI());
!             res.setContentType(Notifier.notify(n, res.getOutputStream()));
  
              return;
          }
***************
*** 647,660 ****
              if (this.cocoon.process(env)) {
                  contentType = env.getContentType();
              } else {
                  // means SC_NOT_FOUND
                  res.sendError(res.SC_NOT_FOUND);
  
!                 Notification n = new Notification(this);
!                 n.setType("resource-not-found");
                  n.setTitle("Resource not found");
                  n.setSource("Cocoon servlet");
!                 n.setMessage("Resource not found");
                  n.setDescription("The requested URI \""
                                   + request.getRequestURI()
                                   + "\" was not found.");
--- 650,664 ----
              if (this.cocoon.process(env)) {
                  contentType = env.getContentType();
              } else {
+                 // Should not get here!
                  // means SC_NOT_FOUND
                  res.sendError(res.SC_NOT_FOUND);
  
!                 Notification n= new Notification(this);
!                 n.setType("error");
                  n.setTitle("Resource not found");
                  n.setSource("Cocoon servlet");
!                 n.setMessage("The requested resource not found.");
                  n.setDescription("The requested URI \""
                                   + request.getRequestURI()
                                   + "\" was not found.");
***************
*** 670,676 ****
              }
  
              res.sendError(res.SC_NOT_FOUND);
!             Notification n = new Notification(this);
              n.setType("resource-not-found");
              n.setTitle("Resource not found");
              n.setSource("Cocoon servlet");
--- 674,681 ----
              }
  
              res.sendError(res.SC_NOT_FOUND);
!             
!             Notification n= new Notification(this);
              n.setType("resource-not-found");
              n.setTitle("Resource not found");
              n.setSource("Cocoon servlet");
***************
*** 683,695 ****
              // send the notification but don't include it in the output stream
              // as the status SC_NOT_FOUND is enough
              res.setContentType(Notifier.notify(n, (OutputStream)null));
          } catch (ConnectionResetException cre) {
              if (log.isWarnEnabled()) {
                  log.warn("The connection was reset", cre);
              }
  
!             Notification n = new Notification(this);
!             n.setType("resource-not-found");
              n.setTitle("Resource not found");
              n.setSource("Cocoon servlet");
              n.setMessage("Resource not found");
--- 688,701 ----
              // send the notification but don't include it in the output stream
              // as the status SC_NOT_FOUND is enough
              res.setContentType(Notifier.notify(n, (OutputStream)null));
+             
          } catch (ConnectionResetException cre) {
              if (log.isWarnEnabled()) {
                  log.warn("The connection was reset", cre);
              }
  
!             Notification n= new Notification(this);
!             n.setType("error");
              n.setTitle("Resource not found");
              n.setSource("Cocoon servlet");
              n.setMessage("Resource not found");
***************
*** 706,717 ****
                  log.error("Problem with servlet", e);
              }
              //res.setStatus(res.SC_INTERNAL_SERVER_ERROR);
!             Notification n = new Notification(this, e);
!             n.setType("internal-server-error");
!             n.setTitle("Internal server error");
!             n.setSource("Cocoon servlet");
!             n.addExtraDescription("request-uri", request.getRequestURI());
!             n.addExtraDescription("path-info", uri);
              res.setContentType(contentType = Notifier.notify(n, 
res.getOutputStream()));
          }
  
--- 712,725 ----
                  log.error("Problem with servlet", e);
              }
              //res.setStatus(res.SC_INTERNAL_SERVER_ERROR);
! 
!             HashMap extraDescriptions = new HashMap(2);
!             extraDescriptions.put("request-uri", request.getRequestURI());
!             extraDescriptions.put("path-info", uri);
!             
!             Notificable n=NotificableBuilderFactory.builder(this).build(
!              this, e, "fatal","Internal server error","Cocoon 
servlet",null,null,extraDescriptions);
! 
              res.setContentType(contentType = Notifier.notify(n, 
res.getOutputStream()));
          }
  


*** src/org/apache/cocoon/sitemap/ErrorNotifier.java    2001/10/11 08:56:15     1.2.2.4
--- src/org/apache/cocoon/sitemap/ErrorNotifier.java    2001/12/09 11:47:55
***************
*** 9,23 ****
  package org.apache.cocoon.sitemap;
  
  import org.apache.avalon.excalibur.pool.Recyclable;
! import org.apache.cocoon.Notification;
! import org.apache.cocoon.Notifier;
  import org.apache.cocoon.generation.ComposerGenerator;
  import org.xml.sax.SAXException;
  
  /**
   * Generates an XML representation of the current notification.
   *
!  * @author <a href="mailto:[EMAIL PROTECTED]";>Nicola Ken Barozzi</a> Aisa
   * @author <a href="mailto:[EMAIL PROTECTED]";>Stefano Mazzocchi</a>
   * @created 31 July 2000
   * @version CVS $Revision: 1.2.2.4 $ $Date: 2001/10/11 08:56:15 $
--- 9,25 ----
  package org.apache.cocoon.sitemap;
  
  import org.apache.avalon.excalibur.pool.Recyclable;
! import org.apache.cocoon.notification.Notification;
! import org.apache.cocoon.notification.NotificableBuilderFactory;
! import org.apache.cocoon.notification.Notificable;
! import org.apache.cocoon.notification.Notifier;
  import org.apache.cocoon.generation.ComposerGenerator;
  import org.xml.sax.SAXException;
  
  /**
   * Generates an XML representation of the current notification.
   *
!  * @author <a href="mailto:[EMAIL PROTECTED]";>Nicola Ken Barozzi</a>
   * @author <a href="mailto:[EMAIL PROTECTED]";>Stefano Mazzocchi</a>
   * @created 31 July 2000
   * @version CVS $Revision: 1.2.2.4 $ $Date: 2001/10/11 08:56:15 $
***************
*** 26,51 ****
      /**
       * The <code>Notification</code> to report.
       */
!     private Notification notification = null;
  
      /**
-      * Set the Exception to report.
-      *
-      * @param exception The Exception to report
-      */
-     public void setException(Throwable throwable) {
-         notification = new Notification(this, throwable);
-         notification.setTitle("Error creating the resource");
-     }
- 
-     /**
       * Set the Notification to report.
       *
       * @param exception The Exception to report
       */
!     public void setNotification(Object o) {
!         notification = new Notification(this, o);
!         notification.setTitle("Error creating the resource");
      }
  
      /**
--- 28,49 ----
      /**
       * The <code>Notification</code> to report.
       */
!     private Notificable notification = null;
  
      /**
       * Set the Notification to report.
       *
       * @param exception The Exception to report
       */
!     public void setThrowable(Throwable throwable) {
!       if(throwable instanceof Notificable)
!       {
!          this.notification = (Notificable)throwable;
!       }
!       else
!       {
!         notification = NotificableBuilderFactory.builder(this).build(this, 
throwable);
!       }
      }
  
      /**


*** src/org/apache/cocoon/transformation/TraxTransformer.java   2001/11/15 11:20:40    
 1.15.2.20
--- src/org/apache/cocoon/transformation/TraxTransformer.java   2001/12/09 11:48:00
***************
*** 20,25 ****
--- 20,26 ----
  import org.apache.avalon.framework.parameters.Parameters;
  import org.apache.cocoon.Constants;
  import org.apache.cocoon.ProcessingException;
+ import org.apache.cocoon.notification.NotificableCascadingRuntimeException;
  import org.apache.cocoon.caching.CacheValidity;
  import org.apache.cocoon.caching.Cacheable;
  import org.apache.cocoon.caching.TimeStampCacheValidity;
***************
*** 165,171 ****
            this.useBrowserCap = child.getValueAsBoolean(false);
            this._useBrowserCap = this.useBrowserCap;
            getLogger().debug("Use browser capabilities is " + this.useBrowserCap + " 
for " + this);
!           
            child = conf.getChild("use-session-info");
            this.useSessionInfo = child.getValueAsBoolean(false);
            this._useSessionInfo = this.useSessionInfo;
--- 166,172 ----
            this.useBrowserCap = child.getValueAsBoolean(false);
            this._useBrowserCap = this.useBrowserCap;
            getLogger().debug("Use browser capabilities is " + this.useBrowserCap + " 
for " + this);
! 
            child = conf.getChild("use-session-info");
            this.useSessionInfo = child.getValueAsBoolean(false);
            this._useSessionInfo = this.useSessionInfo;
***************
*** 175,181 ****
            child = conf.getChild("xslt-processor-role");
            String xsltRole = child.getValue(XSLTProcessor.ROLE);
            getLogger().debug("Use XSLTProcessor of role " + xsltRole);
!           
            try {
              this.xsltProcessor = (XSLTProcessor)this.manager.lookup(xsltRole);
            } catch(Exception e) {
--- 176,182 ----
            child = conf.getChild("xslt-processor-role");
            String xsltRole = child.getValue(XSLTProcessor.ROLE);
            getLogger().debug("Use XSLTProcessor of role " + xsltRole);
! 
            try {
              this.xsltProcessor = (XSLTProcessor)this.manager.lookup(xsltRole);
            } catch(Exception e) {
***************
*** 276,282 ****
                = xsltProcessor.getTransformerHandler(inputSource);
          } catch (Exception e){
              getLogger().error("Problem in getTransformer:", e);
!             throw new RuntimeException("Problem in getTransformer:" + 
e.getMessage());
          }
  
          HashMap map = getLogicSheetParameters();
--- 277,283 ----
                = xsltProcessor.getTransformerHandler(inputSource);
          } catch (Exception e){
              getLogger().error("Problem in getTransformer:", e);
!             throw new NotificableCascadingRuntimeException("I wasn't able to get the 
transformerHandler.", e);
          }
  
          HashMap map = getLogicSheetParameters();


*** webapp/stylesheets/system/error2html.xsl    2001/08/15 03:31:19     1.2.2.1
--- webapp/stylesheets/system/error2html.xsl    2001/12/09 11:48:04
***************
*** 1,4 ****
--- 1,5 ----
  <?xml version="1.0"?>
+ <!-- Author: Nicola Ken Barozzi "[EMAIL PROTECTED]" -->
  
  <xsl:stylesheet version="1.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
***************
*** 8,31 ****
   <html>
    <head>
     <title>
!     <xsl:value-of select="@type"/>:<xsl:value-of select="error:title"/>
     </title>
    </head>
!   <body bgcolor="#ffffff">
!    <table border="0" bgcolor="#000000" cellpadding="2" cellspacing="2">
      <tbody>
       <tr>
        <td bgcolor="#0086b2" colspan="2">
!        <font color="#ffffff" face="arial,helvetica,sanserif" size="+2">
          <xsl:value-of select="error:title"/>
         </font>
        </td>
       </tr>
  
       <tr>
        <td bgcolor="#0086b2" valign="top">
!        <font color="#ffffff" face="arial,helvetica,sanserif" size="+1">
!         <xsl:value-of select="@type"/>
         </font>
        </td>
        <td bgcolor="#ffffff" >
--- 9,81 ----
   <html>
    <head>
     <title>
!     <xsl:value-of select="@error:type"/>:<xsl:value-of select="error:title"/>
     </title>
+    <style><![CDATA[
+    <!--
+       H1{font-family : sans-serif,Arial,Tahoma;color : white;background-color : 
+#0086b2;} 
+       BODY{font-family : sans-serif,Arial,Tahoma;color : black;background-color : 
+white;} 
+       TABLE{font-family : sans-serif,Arial,Tahoma;color : black;background-color : 
+black;} 
+       B{color : white;background-color : #0086b2;}
+       HR{color : #0086b2;} 
+    //-->]]>
+    </style>
+    <script language="JavaScript1.2"><![CDATA[
+     <!--
+       var head="display:''"
+       function expand(whatToExpand)
+       {
+         var head=whatToExpand.style
+         if (head.display=="none"){
+           head.display=""
+         }
+         else{
+           head.display="none"
+         }
+       }
+      //-->]]>
+    </script>
    </head>
!   <body>
!      <table align="center" border="0" bgcolor="#000000" cellpadding="0" 
cellspacing="0">
      <tbody>
       <tr>
+       <td>
+       
+       
+    <table align="center" border="0" bgcolor="#000000" cellpadding="2" 
+cellspacing="2">
+     <tbody>
+      <tr>
        <td bgcolor="#0086b2" colspan="2">
!        <font color="#ffffff" size="+2">
          <xsl:value-of select="error:title"/>
         </font>
        </td>
       </tr>
  
       <tr>
+       <td bgcolor="#ffffff" colspan="2" valign="top">
+        <font color="#000000">
+         The <xsl:value-of select="@error:sender"/> notifies that 
+         <xsl:value-of select="error:source"/> says:<br/><br/>
+         <i><xsl:call-template name="returns2br">
+            <xsl:with-param name="string" select="error:message"/>
+          </xsl:call-template></i><br/><br/>
+         More precisly:<br/><br/>
+         <i><xsl:call-template name="returns2br">
+            <xsl:with-param name="string" select="error:description"/>
+          </xsl:call-template></i><br/>
+         <br/>
+        </font>
+       </td>
+      </tr>
+      
+ <!--     
+      
+      <tr>
        <td bgcolor="#0086b2" valign="top">
!        <font color="#ffffff" size="+1">
!         <xsl:value-of select="@error:type"/>
         </font>
        </td>
        <td bgcolor="#ffffff" >
***************
*** 35,58 ****
  
       <tr>
        <td bgcolor="#0086b2" valign="top" colspan="2">
!        <font color="#ffffff" face="arial,helvetica,sanserif" size="+1">details</font>
        </td>
       </tr>
  
       <tr>
        <td bgcolor="#0086b2" valign="top">
!        <font face="arial,helvetica,sanserif" color="#ffffff">from</font>
        </td>
        <td bgcolor="#ffffff">
         <font face="arial,helvetica,sanserif">
!         <xsl:value-of select="@sender"/>
         </font>
        </td>
       </tr>
  
       <tr>
        <td bgcolor="#0086b2" valign="top">
!        <font face="arial,helvetica,sanserif" color="#ffffff">source</font>
        </td>
        <td bgcolor="#ffffff">
         <font face="arial,helvetica,sanserif">
--- 85,108 ----
  
       <tr>
        <td bgcolor="#0086b2" valign="top" colspan="2">
!        <font color="#ffffff" size="+1">details</font>
        </td>
       </tr>
  
       <tr>
        <td bgcolor="#0086b2" valign="top">
!        <font color="#ffffff">from</font>
        </td>
        <td bgcolor="#ffffff">
         <font face="arial,helvetica,sanserif">
!         <xsl:value-of select="@error:sender"/>
         </font>
        </td>
       </tr>
  
       <tr>
        <td bgcolor="#0086b2" valign="top">
!        <font color="#ffffff">source</font>
        </td>
        <td bgcolor="#ffffff">
         <font face="arial,helvetica,sanserif">
***************
*** 62,78 ****
       </tr>
  
       <xsl:apply-templates select="error:description"/>
! 
       <tr>
        <td bgcolor="#0086b2" valign="top" colspan="2">
!        <font color="#ffffff" face="arial,helvetica,sanserif" size="+1">extra 
info</font>
        </td>
       </tr>
  
       <xsl:apply-templates select="error:extra"/>
! 
      </tbody>
     </table>
    </body>
   </html>
  </xsl:template>
--- 112,170 ----
       </tr>
  
       <xsl:apply-templates select="error:description"/>
! -->
       <tr>
        <td bgcolor="#0086b2" valign="top" colspan="2">
!        <font color="#ffffff" size="+1">extra info</font>
        </td>
       </tr>
  
       <xsl:apply-templates select="error:extra"/>
!      
!      <tr>
!       <td bgcolor="#ffffff" colspan="2" valign="top">
!        <font color="#000000" size="-1">
!        <br/>
!         If you need help and this information is not enough, you
!         are invited to read the <a 
href="http://xml.apache.org/cocoon/faq.html";>cocoon faq</a>.<br/>
!         If you still don't find the answers you need,
!         can send a mail to the 
!         <a>
!         <xsl:attribute 
name="href">mailto:[EMAIL PROTECTED]?subject=[HELP]<xsl:value-of 
select="error:message"/>&amp;body=Description:<xsl:value-of 
select="error:description"/></xsl:attribute>
!         Cocoon users mailing list</a>,
!         remembering to
!         <ul>
!           <li> specify the version of Cocoon you're using, or we suppose that you
!           are talking about the latest version;</li>
!           <li>specify the taglibs and sitemap components that are pertinent;</li>
!           <li>specify the platform-operating system-version-servlet container 
version;</li>
!           <li>send any pertinent error message;</li>
!           <li>send pertinent log snippets;</li>
!           <li>send pertinent sitemap snippets;</li>
!           <li>send pertinent parts of the page that gives you problems.</li>
!         </ul>
!         For more detailed technical information, take a look at the log
!         files in the log directory of cocoon, which is <code>/WEB-INF/logs</code> by 
default.<br/>
!         Logging configuration is by default in 
<code>/WEB-INF/logkit.xconf.</code><br/><br/>
!         If you think you found a bug, please report it al 
!         <a href="http://nagoya.apache.org/bugzilla/";>Apache's Bugzilla</a>;
!         a message will be sent to the developer mailing list.<br/>
!        </font>
!       </td>
!      </tr>
!        
      </tbody>
     </table>
+    
+    
+    
+          </td>
+      </tr>
+        
+     </tbody>
+    </table>
+    
+    
    </body>
   </html>
  </xsl:template>
***************
*** 83,114 ****
      <font color="#ffffff" face="arial,helvetica,sanserif">description</font>
     </td>
     <td bgcolor="#ffffff">
!     <font face="arial,helvetica,sanserif">
!      <xsl:value-of select="."/>
!     </font>
     </td>
    </tr>
   </xsl:template>
  
   <xsl:template match="error:message">
!   <font face="arial,helvetica,sanserif">
!    <xsl:value-of select="."/>
!   </font>
   </xsl:template>
  
   <xsl:template match="error:extra">
    <tr>
     <td bgcolor="#0086b2" valign="top">
!     <font color="#ffffff" face="arial,helvetica,sanserif">
!      <xsl:value-of select="@description"/>
      </font>
!    </td>
     <td bgcolor="#ffffff">
!     <xsl:variable name="x" select="translate(.,'&#13;',' ')"/>
!     <pre>
!      <xsl:value-of select="$x"/>
!     </pre>
     </td>
    </tr>
   </xsl:template>
  </xsl:stylesheet>
--- 175,238 ----
      <font color="#ffffff" face="arial,helvetica,sanserif">description</font>
     </td>
     <td bgcolor="#ffffff">
!          <xsl:call-template name="returns2br">
!            <xsl:with-param name="string" select="."/>
!          </xsl:call-template>
     </td>
    </tr>
   </xsl:template>
  
   <xsl:template match="error:message">
!          <xsl:call-template name="returns2br">
!            <xsl:with-param name="string" select="."/>
!          </xsl:call-template>
   </xsl:template>
  
   <xsl:template match="error:extra">
    <tr>
     <td bgcolor="#0086b2" valign="top">
!     <font color="#ffffff">
!      <xsl:value-of select="@error:description"/>
      </font>
!    </td>   
     <td bgcolor="#ffffff">
!     <font size="-1">
!               <xsl:choose>
!                       <xsl:when test="contains(@error:description,'stacktrace')">
!        <!-- degrade gracefully on Netscape-->
!        <a href="javascript:" 
onclick="expand(document.all[this.sourceIndex+2])"><script>if(document.all){document.write('show');}</script></a>
!        <div style="display:'none';">
!          <xsl:call-template name="returns2br">
!            <xsl:with-param name="string" select="."/>
!          </xsl:call-template>
!        </div>
!                       </xsl:when>
!                       <xsl:otherwise>
!          <xsl:call-template name="returns2br">
!            <xsl:with-param name="string" select="."/>
!          </xsl:call-template>
!                       </xsl:otherwise>
!               </xsl:choose>
!     </font>
     </td>
    </tr>
   </xsl:template>
+  
+   <xsl:template name="returns2br">
+     <xsl:param name="string"/>
+     <xsl:variable name="return" select="'&#xa;'"/>
+     <xsl:choose>
+       <xsl:when test="contains($string,$return)">
+         <xsl:value-of select="substring-before($string,$return)"/>
+         <br/>
+         <xsl:call-template name="returns2br">
+           <xsl:with-param name="string" select="substring-after($string,$return)"/>
+         </xsl:call-template>
+       </xsl:when>
+       <xsl:otherwise>
+         <xsl:value-of select="$string"/>
+       </xsl:otherwise>
+    </xsl:choose>
+   </xsl:template>
+   
  </xsl:stylesheet>



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, email: [EMAIL PROTECTED]

Reply via email to