Hi,
    I'm trying to handle Page Not Found errors in Cocoon. My sitemap.xsl reads:
 
<map:pipeline internal-only="true">
    <map:handle-errors type="404">
      <map:generate type="serverpages" src="xsp/notfound.xsp"/>   
      <map:serialize status-code="404"/>
    </map:handle-errors>
   
    <map:handle-errors type="500">
      <map:generate type="serverpages" src="xsp/notfound.xsp"/>   
      <map:serialize status-code="500"/>
    </map:handle-errors>
   
    <map:match pattern="banner.xml">
      <map:generate type="serverpages" src="xsp/banner.xsp"/>
      <map:serialize type="xml"/>
    </map:match>
 
    <map:match pattern="login.xml">
      <map:generate type="serverpages" src="xsp/login.xsp"/>
      <map:serialize type="xml"/>
    </map:match>
 
    <map:match pattern="*.xml">
      <map:generate type="serverpages" src="xsp/{1}.xsp"/>
      <map:serialize type="xml"/>
    </map:match>
 
    <map:match pattern="*.form">
      <map:generate type="serverpages" src="form/{1}.xsp"/>
      <map:serialize type="xml"/>
    </map:match>
 
    <map:match pattern="*.view">
      <map:generate type="serverpages" src="view/{1}.xsp"/>
      <map:serialize type="xml"/>
    </map:match>
 
  </map:pipeline>
So if somebody requested view_badpage.html, the banner.xml is called followed by badpage.view, which maps to view/badpage.xsp, which doesn't exist. This throws an illegalStateException. The Stack trace reads:
 
java.lang.IllegalStateException: Response has already been committed
	at org.apache.tomcat.facade.HttpServletResponseFacade.sendError(HttpServletResponseFacade.java:204)
	at org.apache.tomcat.facade.HttpServletResponseFacade.sendError(HttpServletResponseFacade.java:196)
	at org.apache.cocoon.servlet.CocoonServlet.service(CocoonServlet.java:672)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
	at org.apache.tomcat.core.ServletWrapper.doService(ServletWrapper.java:404)
	at org.apache.tomcat.core.Handler.service(Handler.java:286)
	at org.apache.tomcat.core.ServletWrapper.service(ServletWrapper.java:372)
	at org.apache.tomcat.core.ContextManager.internalService(ContextManager.java:797)
	at org.apache.tomcat.core.ContextManager.service(ContextManager.java:743)
	at org.apache.tomcat.service.http.HttpConnectionHandler.processConnection(HttpConnectionHandler.java:210)
	at org.apache.tomcat.service.TcpWorkerThread.runIt(PoolTcpEndpoint.java:416)
	at org.apache.tomcat.util.ThreadPool$ControlRunnable.run(ThreadPool.java:498)
	at java.lang.Thread.run(Thread.java:484)
I know that its actually Tomcat that throws the exception, because the Reponse has been commited. Is there a way to prevent this happening?
 
Jonathan Downey.

Reply via email to