giacomo 01/12/30 13:50:47 Modified: src/org/apache/cocoon Constants.java Notificable.java Notification.java Notifier.java src/org/apache/cocoon/components/language/markup/sitemap/java sitemap.xsl src/org/apache/cocoon/components/pipeline AbstractEventPipeline.java src/org/apache/cocoon/servlet CocoonServlet.java src/org/apache/cocoon/sitemap ErrorNotifier.java sitemap.roles webapp sitemap.xmap webapp/protected sitemap.xmap webapp/stylesheets simple-samples2html.xsl webapp/sub/stylesheets error2html.xsl Added: src/org/apache/cocoon/components/notification DefaultNotifyingBuilder.java Notifier.java Notifying.java NotifyingBuilder.java NotifyingCascadingRuntimeException.java NotifyingObjects.java SimpleNotifyingBean.java Log: added patches from Nicola Ken Barozzi enhancing the Error Notification part of cocoon Revision Changes Path 1.16 +10 -2 xml-cocoon2/src/org/apache/cocoon/Constants.java Index: Constants.java =================================================================== RCS file: /home/cvs/xml-cocoon2/src/org/apache/cocoon/Constants.java,v retrieving revision 1.15 retrieving revision 1.16 diff -u -r1.15 -r1.16 --- Constants.java 17 Dec 2001 20:42:28 -0000 1.15 +++ Constants.java 30 Dec 2001 21:50:46 -0000 1.16 @@ -59,7 +59,8 @@ * The <code>Constants</code> use throughout the core of the Cocoon engine. * * @author <a href="mailto:[EMAIL PROTECTED]">Stefano Mazzocchi</a> - * @version CVS $Revision: 1.15 $ $Date: 2001/12/17 20:42:28 $ + * @author <a href="mailto:[EMAIL PROTECTED]">Peter Royal</a> + * @version CVS $Revision: 1.16 $ $Date: 2001/12/30 21:50:46 $ */ public interface Constants { @@ -260,11 +261,16 @@ * */ String LINK_OBJECT = "link"; + + /** + * The name of a <code>NotifyingObjects</code> object in the so called objectModel <code>Map</code>. + */ + String NOTIFYING_OBJECTS = "notifying-objects"; /** * Describe variable <code>INDEX_URI</code> here. * - * FIXME(GP): It seems to be (CLI) Environment specifix! + * FIXME(GP): It seems to be (CLI) Environment specific! */ String INDEX_URI = "index"; @@ -309,3 +315,5 @@ boolean DESCRIPTOR_RELOADABLE_DEFAULT = true; } + + 1.2 +5 -37 xml-cocoon2/src/org/apache/cocoon/Notificable.java Index: Notificable.java =================================================================== RCS file: /home/cvs/xml-cocoon2/src/org/apache/cocoon/Notificable.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- Notificable.java 9 May 2001 20:49:27 -0000 1.1 +++ Notificable.java 30 Dec 2001 21:50:46 -0000 1.2 @@ -8,49 +8,17 @@ package org.apache.cocoon; -import java.util.HashMap; +import org.apache.cocoon.components.notification.Notifying; /** * Interface for Objects that can notify something. * - * @author <a href="mailto:[EMAIL PROTECTED]">Nicola Ken Barozzi</a> Aisa + * @author <a href="mailto:[EMAIL PROTECTED]">Nicola Ken Barozzi</a> + * @deprecated Now another interface is used + * @see org.apache.components.notification.Notifying * @created 24 August 2000 */ -public interface Notificable { +public interface Notificable extends Notifying{ - /** - * 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(); } 1.8 +10 -261 xml-cocoon2/src/org/apache/cocoon/Notification.java Index: Notification.java =================================================================== RCS file: /home/cvs/xml-cocoon2/src/org/apache/cocoon/Notification.java,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- Notification.java 17 Oct 2001 10:06:24 -0000 1.7 +++ Notification.java 30 Dec 2001 21:50:46 -0000 1.8 @@ -8,282 +8,31 @@ package org.apache.cocoon; +import org.apache.cocoon.components.notification.SimpleNotifyingBean; + import org.apache.avalon.framework.CascadingThrowable; import org.xml.sax.SAXException; import java.io.PrintWriter; import java.io.StringWriter; import java.util.HashMap; +import java.util.Map; /** * 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]">Nicola Ken Barozzi</a> + * @deprecated Now another interface is used + * @see org.apache.components.notification.SimpleNotifyingBean * @created 24 August 2000 */ -public class Notification implements Notificable { - - /** - * The type of the notification. Examples can be "warning" or "error" - */ - private String type = ""; - - /** - * 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 = ""; - - /** - * A more detailed description of the notification. - */ - private String description = ""; - - /** - * A Hashtable containing extra notifications that do - */ - private HashMap extraDescriptions = new HashMap(); - - /** - * Constructor for the Notification object - */ +public class Notification extends SimpleNotifyingBean { + public Notification(Object sender) { - setSender(sender); - } - - /** - * Constructor for the Notification object - * - * @param o Description of Parameter - */ - public Notification(Object sender, Object o) { - this(sender); - setType("object"); - setTitle("Object notification"); - setSource(o.getClass().getName()); - setMessage(o.toString()); - } - - /** - * Constructor for the Notification object - * - * @param t Description of Parameter - */ - public Notification(Object sender, Throwable t) { - this(sender); - setType("error"); - setTitle("Cocoon error"); - if(t != null) - { - setSource(t.getClass().getName()); - setMessage(t.getMessage()); - setDescription(t.toString()); - - extraDescriptions.put("exception", t.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)); - extraDescriptions.put("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) { - extraDescriptions.put("original exception", causes); - } - -/* Now handled by appendCauses() - // if the throwable is a CascadingThrowable the strack trace - // is automatically appended by the CascadingThrowable, so we - // only have to deal with the case if the embedded exception - // of the CascadingThrowable is a SAXException. - if (t instanceof CascadingThrowable) { - Throwable cause = ((CascadingThrowable)t).getCause(); - if(cause != null && cause instanceof SAXException) { - cause = ((SAXException)cause).getException(); - if(cause != null) { - extraDescriptions.put("original exception", cause.toString()); - stackTrace = new StringWriter(); - cause.printStackTrace(new PrintWriter(stackTrace)); - extraDescriptions.put("original exception stacktrace", stackTrace.toString()); - } - } - } -*/ - } - } - - /** - * Print recursively all nested causes of a Throwable in a PrintWriter. - */ - public 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); - } - } - - /** - * 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 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; - } + super(sender); + } - /** - * Gets the ExtraDescriptions attribute of the Notification object - */ - public HashMap getExtraDescriptions() { - return extraDescriptions; - } } 1.7 +7 -118 xml-cocoon2/src/org/apache/cocoon/Notifier.java Index: Notifier.java =================================================================== RCS file: /home/cvs/xml-cocoon2/src/org/apache/cocoon/Notifier.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- Notifier.java 11 Oct 2001 07:28:15 -0000 1.6 +++ Notifier.java 30 Dec 2001 21:50:46 -0000 1.7 @@ -8,132 +8,21 @@ package org.apache.cocoon; -import org.xml.sax.ContentHandler; -import org.xml.sax.SAXException; -import org.xml.sax.helpers.AttributesImpl; +//NKB Import commented to prevent name clashing - using full name instead +//import org.apache.cocoon.components.notification.Notifier; -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]">Nicola Ken Barozzi</a> * @author <a href="mailto:[EMAIL PROTECTED]">Stefano Mazzocchi</a> - * @version CVS $Revision: 1.6 $ $Date: 2001/10/11 07:28:15 $ + *@deprecated Now another class is used + * @see org.apache.components.notification.Notifier + * @version CVS $Revision: 1.7 $ $Date: 2001/12/30 21:50:46 $ */ -public class Notifier { +public class Notifier extends org.apache.cocoon.components.notification.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(); - } } 1.59 +29 -5 xml-cocoon2/src/org/apache/cocoon/components/language/markup/sitemap/java/sitemap.xsl Index: sitemap.xsl =================================================================== RCS file: /home/cvs/xml-cocoon2/src/org/apache/cocoon/components/language/markup/sitemap/java/sitemap.xsl,v retrieving revision 1.58 retrieving revision 1.59 diff -u -r1.58 -r1.59 --- sitemap.xsl 29 Dec 2001 11:49:44 -0000 1.58 +++ sitemap.xsl 30 Dec 2001 21:50:46 -0000 1.59 @@ -114,19 +114,24 @@ import org.apache.cocoon.components.pipeline.StreamPipeline; import org.apache.cocoon.components.pipeline.EventPipeline; import org.apache.cocoon.sitemap.Sitemap; - import org.apache.cocoon.sitemap.ErrorNotifier; + import org.apache.cocoon.sitemap.NotifyingGenerator; import org.apache.cocoon.sitemap.ContentAggregator; import org.apache.cocoon.sitemap.Manager; import org.apache.cocoon.sitemap.SitemapRedirector; import org.apache.cocoon.components.language.markup.xsp.XSPRequestHelper; import org.apache.cocoon.components.language.markup.xsp.XSPResponseHelper; + import org.apache.cocoon.components.notification.NotifyingBuilder; + import org.apache.cocoon.components.notification.Notifying; + import org.apache.cocoon.components.notification.NotifyingObjects; /** * This is the automatically generated class from the sitemap definitions * * @author <a href="mailto:[EMAIL PROTECTED]">Giacomo Pati</a> * @author <a href="mailto:[EMAIL PROTECTED]">Berin Loritsch</a> - * @version CVS $Id: sitemap.xsl,v 1.58 2001/12/29 11:49:44 giacomo Exp $ + * @author <a href="mailto:[EMAIL PROTECTED]">Nicola Ken Barozzi</a> + * @author <a href="mailto:[EMAIL PROTECTED]">Peter Royal</a> + * @version CVS $Id: sitemap.xsl,v 1.59 2001/12/30 21:50:46 giacomo Exp $ */ public class <xsl:value-of select="@file-name"/> extends AbstractSitemap { static final String LOCATION = "<xsl:value-of select="translate(@file-path, '/', '.')"/>.<xsl:value-of select="@file-name"/>"; @@ -286,7 +291,7 @@ try { <!-- configure well known components first --> - load_component (Sitemap.GENERATOR, "!error-notifier!", "org.apache.cocoon.sitemap.ErrorNotifier", new DefaultConfiguration("", LOCATION), null); + load_component (Sitemap.GENERATOR, "!notifying-generator!", "org.apache.cocoon.sitemap.NotifyingGenerator", new DefaultConfiguration("", LOCATION), null); load_component (Sitemap.GENERATOR, "!content-aggregator!", "org.apache.cocoon.sitemap.ContentAggregator", new DefaultConfiguration("", LOCATION), null); load_component (Sitemap.TRANSFORMER, "!link-translator!", "org.apache.cocoon.sitemap.LinkTranslator", new DefaultConfiguration("", LOCATION), null); @@ -630,6 +635,9 @@ XPath kind expressions in values of src attribute used with generate and transform elements */ List listOfMaps = (List) new ArrayList(); + //Adds Constants.NOTIFYING_OBJECTS to ObjectModel + //NKB FIXME add to ObjectModel? + environment.getObjectModel().put(Constants.NOTIFYING_OBJECTS, new NotifyingObjects()); SitemapRedirector redirector = new SitemapRedirector(environment); <!-- process the pipelines --> <!-- for each pipeline element generate a try/catch block --> @@ -734,13 +742,28 @@ eventPipeline = (EventPipeline)this.manager.lookup(EventPipeline.ROLE); pipeline = (StreamPipeline)this.manager.lookup(StreamPipeline.ROLE); pipeline.setEventPipeline(eventPipeline); + pipeline.recompose(this.manager); + eventPipeline.recompose(this.manager); List listOfMaps = (List)(new ArrayList()); Map map; Parameters param; - eventPipeline.setGenerator ("!error-notifier!", e.getMessage(), Parameters.EMPTY_PARAMETERS, e); + + // Create a Notifying out of this exception and stick it in the object model Constants.NOTIFYING_OBJECTS + boolean de = getLogger().isDebugEnabled(); + if(de)getLogger().debug("Starting to build Notifying"); + NotifyingBuilder notifyingBuilder= (NotifyingBuilder)this.manager.lookup(NotifyingBuilder.ROLE); + if(de)getLogger().debug("Got "+notifyingBuilder); + Notifying currentNotifying = notifyingBuilder.build(this, e); + if(de)getLogger().debug("Built "+currentNotifying); + NotifyingObjects notifyingObjects = (NotifyingObjects)objectModel.get(Constants.NOTIFYING_OBJECTS); + if(de)getLogger().debug("Got "+notifyingObjects); + notifyingObjects.addNotifying(currentNotifying); + if(de)getLogger().debug("Added to "+notifyingObjects); + eventPipeline.setGenerator ("!notifying-generator!", e.getMessage(), Parameters.EMPTY_PARAMETERS); + <xsl:apply-templates select="./*"/> } catch (Exception ex) { - if (getLogger().isErrorEnabled()) getLogger().error("error notifier barfs", ex); + if (getLogger().isErrorEnabled()) getLogger().error("NotifyingGenerator was not able to notify the exception.", ex); throw e; } finally { if(eventPipeline != null) @@ -1919,3 +1942,4 @@ <xsl:template match="map:logicsheet|map:dependency|map:handle-errors"/> </xsl:stylesheet> + 1.1 xml-cocoon2/src/org/apache/cocoon/components/notification/DefaultNotifyingBuilder.java Index: DefaultNotifyingBuilder.java =================================================================== /***************************************************************************** * 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.components.notification; import org.apache.avalon.framework.CascadingThrowable; import org.apache.avalon.framework.component.Component; import org.xml.sax.SAXException; import java.io.PrintWriter; import java.io.StringWriter; import java.util.Map; /** * Generates an Notifying representation of widely used objects. * * @author <a href="mailto:[EMAIL PROTECTED]">Nicola Ken Barozzi</a> * @created 24 August 2000 */ public class DefaultNotifyingBuilder implements NotifyingBuilder, Component { /** Builds a Notifying object (SimpleNotifyingBean in this case) * that tries to explain what the Object o can reveal. * @param sender who sent this Object. * @param o the object to use when building the SimpleNotifyingBean * @return the Notifying Object that was build * @see org.apache.cocoon.components.notification.Notifying */ public Notifying build (Object sender, Object o) { if (o instanceof Notifying) { return (Notifying) o; } else if (o instanceof Throwable) { Throwable t = (Throwable) o; SimpleNotifyingBean n = new SimpleNotifyingBean(sender); n.setType("error"); n.setTitle("An error occurred"); 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; } //org.apache.avalon.framework.ExceptionUtil.captureStackTrace(); 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 { SimpleNotifyingBean n = new SimpleNotifyingBean(sender); n.setType("unknown"); n.setTitle("Object notification"); n.setSource(o.getClass().getName()); n.setMessage(o.toString()); n.setDescription("No details available."); return n; } } /** Builds a Notifying object (SimpleNotifyingBean in this case) * that explains a notification. * @param sender who sent this Object. * @param o the object to use when building the SimpleNotifyingBean * @param type see the Notifying apidocs * @param title see the Notifying apidocs * @param source see the Notifying apidocs * @param message see the Notifying apidocs * @param description see the Notifying apidocs * @param extra see the Notifying apidocs * @return the Notifying Object that was build * @see org.apache.cocoon.components.notification.Notifying */ public Notifying build(Object sender, Object o, String type, String title, String source, String message, String description, Map extra) { //NKB Cast here is secure, the method is of this class SimpleNotifyingBean n = (SimpleNotifyingBean) 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); } } } 1.1 xml-cocoon2/src/org/apache/cocoon/components/notification/Notifier.java Index: Notifier.java =================================================================== /***************************************************************************** * 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.components.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.Map; import java.util.Iterator; /** * Generates a representations of the specified Notifying Object. * * @author <a href="mailto:[EMAIL PROTECTED]">Nicola Ken Barozzi</a> Aisa * @author <a href="mailto:[EMAIL PROTECTED]">Stefano Mazzocchi</a> * @version CVS $Revision: 1.1 $ $Date: 2001/12/30 21:50:46 $ */ public class Notifier { /** * Generate notification information as a response. * The notification is directly written to the OutputStream. * @param n The <code>Notifying</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(Notifying 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=\"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>"); Map 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(Notifying 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"); Map 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(); } } 1.1 xml-cocoon2/src/org/apache/cocoon/components/notification/Notifying.java Index: Notifying.java =================================================================== /***************************************************************************** * 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.components.notification; import java.util.Map; /** * Interface for Objects that can notify something. * * @author <a href="mailto:[EMAIL PROTECTED]">Nicola Ken Barozzi</a> * @created 24 August 2000 */ public interface Notifying { /** * 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 of the Notifying object */ String getType(); /** * Gets the Title of the Notifying object */ String getTitle(); /** * Gets the Source of the Notifying object */ String getSource(); /** * Gets the Sender of the Notifying object */ String getSender(); /** * Gets the Message of the Notifying object */ String getMessage(); /** * Gets the Description of the Notifying object */ String getDescription(); /** * Gets the ExtraDescriptions of the Notifying object */ Map getExtraDescriptions(); } 1.1 xml-cocoon2/src/org/apache/cocoon/components/notification/NotifyingBuilder.java Index: NotifyingBuilder.java =================================================================== /***************************************************************************** * 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.components.notification; import java.util.Map; import org.apache.avalon.framework.component.Component; /** * Generates an Notifying representation of widely used objects. * * @author <a href="mailto:[EMAIL PROTECTED]">Nicola Ken Barozzi</a> * @created 24 August 2000 */ public interface NotifyingBuilder extends Component{ /** * The role implemented by a <code>NotifyingBuilder</code>. */ String ROLE = "org.apache.cocoon.components.notification.NotifyingBuilder"; /** Builds a Notifying object (SimpleNotifyingObject in this case) * that tries to explain what the Object o can reveal. * @param sender who sent this Object. * @param o the object to use when building the SimpleNotifyingObject * @return the Notifying Object that was build * @see org.apache.cocoon.components.notification.Notifying */ public Notifying build(Object sender, Object o); /** Builds a Notifying object (SimpleNotifyingObject in this case) * that explains a notification. * @param sender who sent this Object. * @param o the object to use when building the SimpleNotifyingObject * @param type see the Notifying apidocs * @param title see the Notifying apidocs * @param source see the Notifying apidocs * @param message see the Notifying apidocs * @param description see the Notifying apidocs * @param extra see the Notifying apidocs * @return the Notifying Object that was build * @see org.apache.cocoon.components.notification.Notifying */ public Notifying build(Object sender, Object o, String type, String title, String source, String message, String description, Map extra); } 1.1 xml-cocoon2/src/org/apache/cocoon/components/notification/NotifyingCascadingRuntimeException.java Index: NotifyingCascadingRuntimeException.java =================================================================== /***************************************************************************** * 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.components.notification; import org.apache.avalon.framework.CascadingRuntimeException; import java.util.Map; import java.io.PrintStream; import java.io.PrintWriter; /** * A CascadingRuntimeException that is also Notifying. * * @author <a href="mailto:[EMAIL PROTECTED]">Nicola Ken Barozzi</a> * @created 7 December 2001 */ public class NotifyingCascadingRuntimeException extends CascadingRuntimeException implements Notifying{ /** * The Notifying Object used internally to keep Notifying fields */ Notifying n; /** * Construct a new <code>NotifyingCascadingRuntimeException</code> instance. */ public NotifyingCascadingRuntimeException(String message) { super(message, null); n = new DefaultNotifyingBuilder().build(this, message); } /** * Creates a new <code>ProcessingException</code> instance. * * @param ex an <code>Exception</code> value */ public NotifyingCascadingRuntimeException(Exception ex) { super(ex.getMessage(), ex); n = new DefaultNotifyingBuilder().build(this, ex); } /** * Construct a new <code>ProcessingException</code> that references * a parent Exception. */ public NotifyingCascadingRuntimeException(String message, Throwable t) { super(message, t); n = new DefaultNotifyingBuilder().build(this, t); } /** * Gets the Type attribute of the Notifying object */ public String getType() { return n.getType(); } /** * Gets the Title attribute of the Notifying object */ public String getTitle() { return n.getTitle(); } /** * Gets the Source attribute of the Notifying object */ public String getSource() { return n.getSource(); } /** * Gets the Sender attribute of the Notifying object */ public String getSender() { return n.getSender(); } /** * Gets the Message attribute of the Notifying object */ public String getMessage() { return n.getMessage(); } /** * Gets the Description attribute of the Notifying object */ public String getDescription() { return n.getDescription(); } /** * Gets the ExtraDescriptions attribute of the Notifying object */ public Map getExtraDescriptions() { return n.getExtraDescriptions(); } } 1.1 xml-cocoon2/src/org/apache/cocoon/components/notification/NotifyingObjects.java Index: NotifyingObjects.java =================================================================== /***************************************************************************** * 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.components.notification; import java.util.List; import java.util.ArrayList; import java.util.Iterator; /** * Interface for a List of Objects that can notify something. * NKB: FIXME The type checks are not complete. * @author <a href="mailto:[EMAIL PROTECTED]">Nicola Ken Barozzi</a> * @created 18 December 2001 */ public class NotifyingObjects{ private ArrayList notifyingObjects; public NotifyingObjects() { notifyingObjects = new ArrayList(); } public synchronized void addNotifying(Notifying n) { notifyingObjects.add(n); } public synchronized Notifying getNotifying(int i) { //NKB cast is safe here return (Notifying)notifyingObjects.get(i); } public synchronized Notifying getLastNotifying() { //NKB cast is safe here return (Notifying)notifyingObjects.get(notifyingObjects.size()-1); } public Iterator iterator() { return notifyingObjects.iterator(); } public int size() { return notifyingObjects.size(); } } 1.1 xml-cocoon2/src/org/apache/cocoon/components/notification/SimpleNotifyingBean.java Index: SimpleNotifyingBean.java =================================================================== /***************************************************************************** * 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.components.notification; import java.io.PrintWriter; import java.io.StringWriter; import java.util.Map; import java.util.HashMap; /** * A simple bean implementation of Notifying. * * @author <a href="mailto:[EMAIL PROTECTED]">Nicola Ken Barozzi</a> * @created 24 August 2000 */ public class SimpleNotifyingBean implements Notifying { /** * 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 HashMap containing extra notifications */ private HashMap extraDescriptions = new HashMap(); public SimpleNotifyingBean(Object sender) { this.sender = sender.getClass().getName(); setSource(this.getClass().getName()); setTitle("Generic notification"); } /** * Sets the Type of the SimpleNotifyingBean object * *@param type The new Type value */ public void setType(String type) { this.type = type; } /** * Sets the Title of the SimpleNotifyingBean object * *@param title The new Title value */ public void setTitle(String title) { this.title = title; } /** * Sets the Source of the SimpleNotifyingBean object * *@param source The new Source value */ public void setSource(String source) { this.source = source; } /** * Sets the Sender of the SimpleNotifyingBean object * *@param sender The new sender value */ private void setSender(Object sender) { this.sender = sender.getClass().getName(); } /** * Sets the Sender of the SimpleNotifyingBean object * *@param sender The new sender value */ private void setSender(String sender) { this.sender = sender; } /** * Sets the Message of the SimpleNotifyingBean object * *@param message The new Message value */ public void setMessage(String message) { this.message = message; } /** * Sets the Description of the SimpleNotifyingBean object * *@param description The new Description value */ public void setDescription(String description) { this.description = description; } /** * Sets the ExtraDescriptions of the SimpleNotifyingBean object * *@param extraDescriptions The new ExtraDescriptions value */ public void addExtraDescription(String extraDescriptionDescription, String extraDescription) { this.extraDescriptions.put(extraDescriptionDescription, extraDescription); } /** * replaces the ExtraDescriptions of the SimpleNotifyingBean object */ protected void replaceExtraDescriptions(Map extraDescriptions) { this.extraDescriptions = new HashMap(extraDescriptions); } /** * replaces the ExtraDescriptions of the SimpleNotifyingBean object */ protected void replaceExtraDescriptions(HashMap extraDescriptions) { this.extraDescriptions = extraDescriptions; } /** * Gets the Type of the SimpleNotifyingBean object */ public String getType() { return type; } /** * Gets the Title of the SimpleNotifyingBean object */ public String getTitle() { return title; } /** * Gets the Source of the SimpleNotifyingBean object */ public String getSource() { return source; } /** * Gets the Sender of the SimpleNotifyingBean object */ public String getSender() { return sender; } /** * Gets the Message of the SimpleNotifyingBean object */ public String getMessage() { return message; } /** * Gets the Description of the SimpleNotifyingBean object */ public String getDescription() { return description; } /** * Gets the ExtraDescriptions of the SimpleNotifyingBean object */ public Map getExtraDescriptions() { return extraDescriptions; } } 1.19 +11 -9 xml-cocoon2/src/org/apache/cocoon/components/pipeline/AbstractEventPipeline.java Index: AbstractEventPipeline.java =================================================================== RCS file: /home/cvs/xml-cocoon2/src/org/apache/cocoon/components/pipeline/AbstractEventPipeline.java,v retrieving revision 1.18 retrieving revision 1.19 diff -u -r1.18 -r1.19 --- AbstractEventPipeline.java 10 Dec 2001 12:56:22 -0000 1.18 +++ AbstractEventPipeline.java 30 Dec 2001 21:50:46 -0000 1.19 @@ -17,7 +17,6 @@ import org.apache.cocoon.components.saxconnector.SAXConnector; import org.apache.cocoon.environment.Environment; import org.apache.cocoon.generation.Generator; -import org.apache.cocoon.sitemap.ErrorNotifier; import org.apache.cocoon.transformation.Transformer; import org.apache.cocoon.xml.AbstractXMLProducer; import org.apache.cocoon.xml.XMLConsumer; @@ -31,8 +30,10 @@ /** * @author <a href="mailto:[EMAIL PROTECTED]">Giacomo Pati</a> * @author <a href="mailto:cziegeler@Carsten Ziegeler">Carsten Ziegeler</a> - * @author <a href="mailto:[EMAIL PROTECTED]">Sylvain Wallez</a> - * @version CVS $Revision: 1.18 $ $Date: 2001/12/10 12:56:22 $ + * @author <a href="mailto:[EMAIL PROTECTED]">Sylvain Wallez</a + * @author <a href="mailto:[EMAIL PROTECTED]">Nicola Ken Barozzi</a> + * @author <a href="mailto:[EMAIL PROTECTED]">Peter Royal</a> + * @version CVS $Revision: 1.19 $ $Date: 2001/12/30 21:50:46 $ */ public abstract class AbstractEventPipeline extends AbstractXMLProducer @@ -69,14 +70,14 @@ this.newManager = manager; } + /** + * @deprecated The NotifyingGenerator gets the Notificable from the objectModel + */ public void setGenerator (String role, String source, Parameters param, Exception e) throws Exception { this.setGenerator (role, source, param); - // FIXME(CZ) What can be done if this is not an ErrorNotifier? - // (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); + if (this.generator instanceof org.apache.cocoon.sitemap.ErrorNotifier) { + ((org.apache.cocoon.sitemap.ErrorNotifier)this.generator).setThrowable(e); } } @@ -85,7 +86,7 @@ if (this.generator != null) { throw new ProcessingException ("Generator already set. You can only select one Generator (" + role + ")"); } - this.generatorSelector = (ComponentSelector) this.newManager.lookup(Generator.ROLE + "Selector"); + this.generatorSelector = (ComponentSelector) this.newManager.lookup(Generator.ROLE + "Selector"); this.generator = (Generator) this.generatorSelector.select(role); this.generatorSource = source; this.generatorParam = param; @@ -289,3 +290,4 @@ // Nothing here } } + 1.59 +30 -22 xml-cocoon2/src/org/apache/cocoon/servlet/CocoonServlet.java Index: CocoonServlet.java =================================================================== RCS file: /home/cvs/xml-cocoon2/src/org/apache/cocoon/servlet/CocoonServlet.java,v retrieving revision 1.58 retrieving revision 1.59 diff -u -r1.58 -r1.59 --- CocoonServlet.java 28 Dec 2001 17:59:35 -0000 1.58 +++ CocoonServlet.java 30 Dec 2001 21:50:46 -0000 1.59 @@ -16,8 +16,11 @@ 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.components.notification.Notifying; +import org.apache.cocoon.components.notification.SimpleNotifyingBean; +import org.apache.cocoon.components.notification.NotifyingBuilder; +import org.apache.cocoon.components.notification.DefaultNotifyingBuilder; +import org.apache.cocoon.components.notification.Notifier; import org.apache.cocoon.ResourceNotFoundException; import org.apache.cocoon.ConnectionResetException; import org.apache.cocoon.Cocoon; @@ -50,6 +53,7 @@ import java.lang.reflect.Constructor; import java.net.URL; import java.util.Arrays; +import java.util.HashMap; import java.util.StringTokenizer; /** @@ -58,13 +62,12 @@ * @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]">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> - * @version CVS $Revision: 1.58 $ $Date: 2001/12/28 17:59:35 $ + * @version CVS $Revision: 1.59 $ $Date: 2001/12/30 21:50:46 $ */ - public class CocoonServlet extends HttpServlet { protected Logger log; @@ -730,14 +733,14 @@ if (this.cocoon == null) { res.setStatus(res.SC_INTERNAL_SERVER_ERROR); - Notification n = new Notification(this, this.exception); - n.setType("internal-servlet-error"); + SimpleNotifyingBean n= new SimpleNotifyingBean(this); + n.setType("fatal"); n.setTitle("Internal servlet error"); n.setSource("Cocoon servlet"); - n.setMessage("Internal servlet error"); - n.setDescription("Cocoon was not initialized."); + 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()));; + res.setContentType(Notifier.notify(n, res.getOutputStream())); return; } @@ -792,14 +795,15 @@ 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("resource-not-found"); + SimpleNotifyingBean n = new SimpleNotifyingBean(this); + n.setType("error"); n.setTitle("Resource not found"); n.setSource("Cocoon servlet"); - n.setMessage("Resource not found"); + n.setMessage("The requested resource not found."); n.setDescription("The requested URI \"" + request.getRequestURI() + "\" was not found."); @@ -815,7 +819,8 @@ } res.sendError(res.SC_NOT_FOUND); - Notification n = new Notification(this); + + SimpleNotifyingBean n = new SimpleNotifyingBean(this); n.setType("resource-not-found"); n.setTitle("Resource not found"); n.setSource("Cocoon servlet"); @@ -828,13 +833,14 @@ // 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"); + SimpleNotifyingBean n = new SimpleNotifyingBean(this); + n.setType("error"); n.setTitle("Resource not found"); n.setSource("Cocoon servlet"); n.setMessage("Resource not found"); @@ -851,12 +857,14 @@ 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); + + HashMap extraDescriptions = new HashMap(2); + extraDescriptions.put("request-uri", request.getRequestURI()); + extraDescriptions.put("path-info", uri); + + Notifying n=new DefaultNotifyingBuilder().build( + this, e, "fatal","Internal server error","Cocoon servlet",null,null,extraDescriptions); + res.setContentType(contentType = Notifier.notify(n, res.getOutputStream())); } 1.6 +41 -44 xml-cocoon2/src/org/apache/cocoon/sitemap/ErrorNotifier.java Index: ErrorNotifier.java =================================================================== RCS file: /home/cvs/xml-cocoon2/src/org/apache/cocoon/sitemap/ErrorNotifier.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- ErrorNotifier.java 11 Oct 2001 07:28:23 -0000 1.5 +++ ErrorNotifier.java 30 Dec 2001 21:50:46 -0000 1.6 @@ -8,62 +8,59 @@ package org.apache.cocoon.sitemap; +import java.util.Map; +import java.io.IOException; + import org.apache.avalon.excalibur.pool.Recyclable; -import org.apache.cocoon.Notification; -import org.apache.cocoon.Notifier; +import org.apache.avalon.framework.parameters.Parameters; +import org.apache.cocoon.components.notification.Notifying; +import org.apache.cocoon.components.notification.DefaultNotifyingBuilder; import org.apache.cocoon.generation.ComposerGenerator; +import org.apache.cocoon.environment.SourceResolver; +import org.apache.cocoon.ProcessingException; +import org.apache.cocoon.Constants; + import org.xml.sax.SAXException; /** * Generates an XML representation of the current notification. - * - * @author <a href="mailto:[EMAIL PROTECTED]">Nicola Ken Barozzi</a> Aisa + * @deprecated Now using NotifyingGenerator in sitemap + * @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.5 $ $Date: 2001/10/11 07:28:23 $ + * @version CVS $Revision: 1.6 $ $Date: 2001/12/30 21:50:46 $ */ -public class ErrorNotifier extends ComposerGenerator implements Recyclable { - /** - * 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"); - } +public class ErrorNotifier extends NotifyingGenerator { + /** + * The <code>Notification</code> to report. + */ + private Notifying notification = null; - /** - * 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"); + public void setup(SourceResolver resolver, Map objectModel, String src, + Parameters par) throws ProcessingException, SAXException, IOException { + try + { + super.setup(resolver, objectModel, src, par); } - - /** - * Generate the notification information in XML format. - * - * @exception SAXException Description of problem there is creating the output SAX events. - * @throws SAXException when there is a problem creating the - * output SAX events. - */ - public void generate() throws SAXException { - Notifier.notify(notification, this.contentHandler); + catch(ProcessingException pe) + { + //do nothing, thrown by superclass that didn't find the object to notify + //it will be set in setThrowable in this class } + } - /** - * Recycle - */ - public void recycle() { - super.recycle(); - this.notification = null; + /** + * Set the Notification to report. + * @deprecated Now it gets the Exception from the ObjectModel + * @param exception The Exception to report + */ + public void setThrowable(Throwable throwable) { + if (throwable instanceof Notifying) { + this.notification = (Notifying) throwable; + } else { + notification = new DefaultNotifyingBuilder().build("@deprecated method setThrowable() in ErrorNotifier", throwable); } + } + } + 1.7 +10 -2 xml-cocoon2/src/org/apache/cocoon/sitemap/sitemap.roles Index: sitemap.roles =================================================================== RCS file: /home/cvs/xml-cocoon2/src/org/apache/cocoon/sitemap/sitemap.roles,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- sitemap.roles 10 Dec 2001 12:56:23 -0000 1.6 +++ sitemap.roles 30 Dec 2001 21:50:46 -0000 1.7 @@ -28,8 +28,11 @@ <role name="org.apache.cocoon.generation.GeneratorSelector" shorthand="generator" - default-class="org.apache.cocoon.sitemap.SitemapComponentSelector"/> - + default-class="org.apache.cocoon.sitemap.SitemapComponentSelector"> + <!--NKB doesnt load it - should be used instead of old error-notifier + <hint shorthand="!notifying-generator!" class="org.apache.cocoon.sitemap.NotifyingGenerator"/>--> + </role> + <role name="org.apache.cocoon.transformation.TransformerSelector" shorthand="transformer" default-class="org.apache.cocoon.sitemap.SitemapComponentSelector"/> @@ -41,4 +44,9 @@ <role name="org.apache.cocoon.reading.ReaderSelector" shorthand="reader" default-class="org.apache.cocoon.sitemap.SitemapComponentSelector"/> + + <role name="org.apache.cocoon.components.notification.NotifyingBuilder" + shorthand="notifying-builder" + default-class="org.apache.cocoon.components.notification.DefaultNotifyingBuilder"/> + </role-list> 1.73 +1 -1 xml-cocoon2/webapp/sitemap.xmap Index: sitemap.xmap =================================================================== RCS file: /home/cvs/xml-cocoon2/webapp/sitemap.xmap,v retrieving revision 1.72 retrieving revision 1.73 diff -u -r1.72 -r1.73 --- sitemap.xmap 23 Dec 2001 09:48:40 -0000 1.72 +++ sitemap.xmap 30 Dec 2001 21:50:46 -0000 1.73 @@ -1096,7 +1096,7 @@ </map:match> <map:handle-errors> - <map:transform src="stylesheets/system/error2html.xsl"/> + <map:transform src="context://stylesheets/system/error2html.xsl"/> <map:serialize status-code="500"/> </map:handle-errors> 1.8 +4 -2 xml-cocoon2/webapp/protected/sitemap.xmap Index: sitemap.xmap =================================================================== RCS file: /home/cvs/xml-cocoon2/webapp/protected/sitemap.xmap,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- sitemap.xmap 22 Oct 2001 10:17:47 -0000 1.7 +++ sitemap.xmap 30 Dec 2001 21:50:47 -0000 1.8 @@ -94,11 +94,13 @@ </map:act> </map:match> + <!-- Let parent sitemap treat it <map:handle-errors> - <map:transform src="stylesheets/system/error2html.xsl"/> + <map:transform src="context://stylesheets/system/error2html.xsl"/> <map:serialize status-code="500"/> </map:handle-errors> - + --> + </map:pipeline> </map:pipelines> 1.5 +1 -1 xml-cocoon2/webapp/stylesheets/simple-samples2html.xsl Index: simple-samples2html.xsl =================================================================== RCS file: /home/cvs/xml-cocoon2/webapp/stylesheets/simple-samples2html.xsl,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- simple-samples2html.xsl 14 Dec 2001 01:30:36 -0000 1.4 +++ simple-samples2html.xsl 30 Dec 2001 21:50:47 -0000 1.5 @@ -32,7 +32,7 @@ <table width="100%"> <tr> - <td valign="top"> + <td width="50%" valign="top"> <xsl:for-each select="group"> <xsl:variable name="group-position" select="position()"/> <xsl:variable name="current-sample" select="1 + count(../group[position() <= $group-position]/sample)"/> 1.6 +1 -1 xml-cocoon2/webapp/sub/stylesheets/error2html.xsl Index: error2html.xsl =================================================================== RCS file: /home/cvs/xml-cocoon2/webapp/sub/stylesheets/error2html.xsl,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- error2html.xsl 20 Dec 2001 15:14:34 -0000 1.5 +++ error2html.xsl 30 Dec 2001 21:50:47 -0000 1.6 @@ -22,7 +22,7 @@ <xsl:value-of select="translate(error:notify/error:extra[2],' ',' ')"/> </pre> <font face="Verdana" size="-2"> - Brought to you by <a href="http://xml.apache.org/cocoon/">Apache Cocoon</a> in no time! + This special error layout is specified in the sub sitemap. </font> </body> </html>
---------------------------------------------------------------------- In case of troubles, e-mail: [EMAIL PROTECTED] To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]