vgritsenko 01/07/23 20:03:22
Modified: src/org/apache/cocoon/components/language/markup/sitemap/java
Tag: cocoon_20_branch sitemap.xsl
Log:
- fix subsitemap invokation so <map:handle-error> works
- allow optional <map:generator> element in <map:handle-error>
- add @type attribute to <map:handle-erorr> with values "500" (default) and "404"
- optimize error logging (reduce log file size)
Revision Changes Path
No revision
No revision
1.11.2.23 +70 -46
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.11.2.22
retrieving revision 1.11.2.23
diff -u -r1.11.2.22 -r1.11.2.23
--- sitemap.xsl 2001/07/20 07:26:34 1.11.2.22
+++ sitemap.xsl 2001/07/24 03:03:21 1.11.2.23
@@ -124,7 +124,7 @@
*
* @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.11.2.22 2001/07/20 07:26:34 cziegeler Exp $
+ * @version CVS $Id: sitemap.xsl,v 1.11.2.23 2001/07/24 03:03:21 vgritsenko 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"/>";
@@ -414,13 +414,17 @@
StreamPipeline pipeline = null;
boolean result = false;
try {
- eventPipeline = (EventPipeline)this.manager.lookup(EventPipeline.ROLE);
- pipeline = (StreamPipeline)this.manager.lookup(StreamPipeline.ROLE);
- pipeline.setEventPipeline(eventPipeline);
+ try {
+ eventPipeline = (EventPipeline)this.manager.lookup(EventPipeline.ROLE);
+ pipeline = (StreamPipeline)this.manager.lookup(StreamPipeline.ROLE);
+ pipeline.setEventPipeline(eventPipeline);
+ } catch (Exception e) {
+ getLogger().error("processing of resource failed", e);
+ throw e;
+ }
+
result = process (environment, pipeline, eventPipeline, false);
- } catch (Exception e) {
- getLogger().error("processing of resource failed", e);
- throw e;
+
} finally {
if(eventPipeline != null)
this.manager.release(eventPipeline);
@@ -472,26 +476,45 @@
environment, pipeline, eventPipeline,
internalRequest,listOfMaps))
return true;
</xsl:for-each>
+
+ <xsl:if test="position() = last()">
+ throw new ResourceNotFoundException("No pipeline matched request");
+ </xsl:if>
} catch (ConnectionResetException cre) {
- getLogger().debug("Connection reset by peer");
+ // Will be reported by CocoonServlet, rethrowing
throw cre;
- } catch (ResourceNotFoundException rse) {
- getLogger().warn("404 Resource Not Found", rse);
- throw rse;
+ } catch (ResourceNotFoundException e) {
+ <xsl:choose>
+ <xsl:when test="(./map:handle-errors[@type='404'])">
+ getLogger().warn("404, try to process the error page", e);
+ try {
+ return error_process_<xsl:value-of
select="$pipeline-position"/>_404 (environment,
+ environment.getObjectModel(), e, internalRequest);
+ } catch (Exception ex) {
+ getLogger().warn("Sitemap Error Process", ex);
+ if (true) return false;
+ }
+ </xsl:when>
+ <xsl:otherwise>
+ // Will be reported by CocoonServlet, rethrowing
+ if (true) throw e;
+ </xsl:otherwise>
+ </xsl:choose>
} catch (Exception e) {
<xsl:choose>
- <xsl:when test="(./map:handle-errors)">
+ <xsl:when test="(./map:handle-errors[not(@type) or (@type='500')])">
getLogger().warn("Error, try to process the error page", e);
try {
- return error_process_<xsl:value-of select="$pipeline-position"/>
(environment,
+ return error_process_<xsl:value-of
select="$pipeline-position"/>_500 (environment,
environment.getObjectModel(), e, internalRequest);
} catch (Exception ex) {
getLogger().warn("Sitemap Error Process", ex);
+ if (true) return false;
}
</xsl:when>
<xsl:otherwise>
getLogger().error("Sitemap", e);
- throw e;
+ if (true) throw e;
</xsl:otherwise>
</xsl:choose>
}
@@ -508,8 +531,20 @@
<xsl:call-template name="line-number"/>
<xsl:variable name="pipeline-position" select="position()"/>
<xsl:apply-templates select="./*"/>
- <xsl:if test="(./map:handle-errors)">
- private boolean error_process_<xsl:value-of select="$pipeline-position"/>
(Environment environment, Map objectModel, Exception e, boolean internalRequest)
+
+ <xsl:for-each select="./map:handle-errors">
+ <!-- Default error handler's type is 500 -->
+ <xsl:variable name="type">
+ <xsl:choose>
+ <xsl:when test="@type">
+ <xsl:text>_</xsl:text><xsl:value-of select="@type"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>_500</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ private boolean error_process_<xsl:value-of
select="concat($pipeline-position,$type)"/> (Environment environment, Map objectModel,
Exception e, boolean internalRequest)
throws Exception {
EventPipeline eventPipeline = null;
StreamPipeline pipeline = null;
@@ -521,8 +556,10 @@
List listOfMaps = (List)(new ArrayList());
Map map;
Parameters param;
- eventPipeline.setGenerator ("!error-notifier!", e.getMessage(),
emptyParam, e);
- <xsl:apply-templates select="./map:handle-errors/*"/>
+ <xsl:if test="not(./map:generate)">
+ eventPipeline.setGenerator ("!error-notifier!", e.getMessage(),
emptyParam, e);
+ </xsl:if>
+ <xsl:apply-templates select="./*"/>
} catch (Exception ex) {
getLogger().error("error notifier barfs", ex);
throw e;
@@ -534,7 +571,7 @@
}
return false;
}
- </xsl:if>
+ </xsl:for-each>
</xsl:for-each>
}
</xsl:template> <!-- match="map:sitemap" -->
@@ -1075,16 +1112,7 @@
<xsl:if test="not(ancestor::map:pipeline[@internal-only='yes' or
@internal-only='true'])">
if (!internalRequest) {
- boolean result = false;
-
- try {
- result = pipeline.process(environment);
- } catch (Exception pipelineException<xsl:value-of
select="generate-id(.)"/>) {
- getLogger().debug("Error processing pipeline",
pipelineException<xsl:value-of select="generate-id(.)"/>);
- throw pipelineException<xsl:value-of select="generate-id(.)"/>;
- }
-
- return result;
+ return pipeline.process(environment);
}
</xsl:if>
<!-- the if(true) prevents "unreachable statement" errors during compile -->
@@ -1102,20 +1130,11 @@
<xsl:if test="not(ancestor::map:pipeline[@internal-only='yes' or
@internal-only='true'])">
if (!internalRequest) {
- boolean result = false;
-
- try {
- result = pipeline.process(environment);
- } catch (Exception RpipelineException<xsl:value-of
select="generate-id(.)"/>) {
- getLogger().debug("Error processing pipeline",
RpipelineException<xsl:value-of select="generate-id(.)"/>);
- throw RpipelineException<xsl:value-of select="generate-id(.)"/>;
- }
-
- return result;
+ return pipeline.process(environment);
}
</xsl:if>
<!-- the if(true) prevents "unreachable statement" errors during compile -->
- if(true)return true;
+ if (true) return true;
</xsl:template> <!-- match="map:read" -->
<!-- generate the code to invoke a sub sitemap -->
@@ -1154,11 +1173,16 @@
</xsl:choose>
</xsl:variable>
- <!-- generate the code to invoke the sitemapManager which handles delegation of
control to sub sitemaps -->
- if (internalRequest)
- return sitemapManager.invoke (this.manager, environment,
substitute(listOfMaps,"<xsl:value-of select="@uri-prefix"/>"),
substitute(listOfMaps,"<xsl:value-of select="@src"/>"), <xsl:value-of
select="$check-reload"/>, <xsl:value-of select="$reload-method"/>, pipeline,
eventPipeline);
- else
- if (true) return sitemapManager.invoke (this.manager, environment,
substitute(listOfMaps,"<xsl:value-of select="@uri-prefix"/>"),
substitute(listOfMaps,"<xsl:value-of select="@src"/>"), <xsl:value-of
select="$check-reload"/>, <xsl:value-of select="$reload-method"/>);
+ environment.pushURI(null, XSPRequestHelper.getSitemapURI(objectModel));
+ try{
+ <!-- generate the code to invoke the sitemapManager which handles delegation
of control to sub sitemaps -->
+ if (internalRequest)
+ return sitemapManager.invoke (this.manager, environment,
substitute(listOfMaps,"<xsl:value-of select="@uri-prefix"/>"),
substitute(listOfMaps,"<xsl:value-of select="@src"/>"), <xsl:value-of
select="$check-reload"/>, <xsl:value-of select="$reload-method"/>, pipeline,
eventPipeline);
+ else
+ if (true) return sitemapManager.invoke (this.manager, environment,
substitute(listOfMaps,"<xsl:value-of select="@uri-prefix"/>"),
substitute(listOfMaps,"<xsl:value-of select="@src"/>"), <xsl:value-of
select="$check-reload"/>, <xsl:value-of select="$reload-method"/>);
+ }finally{
+ environment.popURI();
+ }
</xsl:template> <!-- match="map:mount" -->
<!-- generate the code to redirect a request -->
@@ -1180,7 +1204,7 @@
Class[] argTypes = new Class[] {StreamPipeline.class, EventPipeline.class,
List.class, Environment.class, String.class, Boolean.TYPE};
Object[] argValues = new Object[] {pipeline, eventPipeline, listOfMaps,
environment, cocoon_view, new Boolean(internalRequest)};
String methodName = "resource_" + substitute(listOfMaps, "<xsl:value-of
select="translate(@resource, '- ', '__')"/>");
- if(true)return invokeMethod(methodName, argTypes, argValues);
+ if (true) return invokeMethod(methodName, argTypes, argValues);
</xsl:when>
<!-- redirect to a external resource definition with optional session mode
attribute. Let the environment do the redirect -->
----------------------------------------------------------------------
In case of troubles, e-mail: [EMAIL PROTECTED]
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]