You are viewing a plain text version of this content. The canonical link for it is here.
Posted to svn@forrest.apache.org by th...@apache.org on 2008/10/09 13:09:28 UTC

svn commit: r703132 - /forrest/branches/dispatcher_rewrite/plugins/org.apache.forrest.plugin.internal.dispatcher/src/java/org/apache/forrest/dispatcher/impl/XMLStructurer.java

Author: thorsten
Date: Thu Oct  9 04:09:28 2008
New Revision: 703132

URL: http://svn.apache.org/viewvc?rev=703132&view=rev
Log:
FOR-1127
Switching to use contract exception and enhancing the code around the exception handling in general. 

Further adding note about the possibility of enhancing the contract processing. It is possible to allow contracts to fail if they are not critical for the overall result. This is a nice possible future feature. One can imaging to use an @critical='true|false' to indicate whether to fail or not.

e.g.  
<forrest:contract 
    critical="false"
    name="siteinfo-meta-navigation" 
    dataURI="cocoon://#{$getRequest}.navigation.xml"/>

with this tag the dispatcher will not fail if the contact fails.

Fixing problem for non-xml output. Instead of assuming the existence of a root element we now check if there is one and if not we create one.

Modified:
    forrest/branches/dispatcher_rewrite/plugins/org.apache.forrest.plugin.internal.dispatcher/src/java/org/apache/forrest/dispatcher/impl/XMLStructurer.java

Modified: forrest/branches/dispatcher_rewrite/plugins/org.apache.forrest.plugin.internal.dispatcher/src/java/org/apache/forrest/dispatcher/impl/XMLStructurer.java
URL: http://svn.apache.org/viewvc/forrest/branches/dispatcher_rewrite/plugins/org.apache.forrest.plugin.internal.dispatcher/src/java/org/apache/forrest/dispatcher/impl/XMLStructurer.java?rev=703132&r1=703131&r2=703132&view=diff
==============================================================================
--- forrest/branches/dispatcher_rewrite/plugins/org.apache.forrest.plugin.internal.dispatcher/src/java/org/apache/forrest/dispatcher/impl/XMLStructurer.java (original)
+++ forrest/branches/dispatcher_rewrite/plugins/org.apache.forrest.plugin.internal.dispatcher/src/java/org/apache/forrest/dispatcher/impl/XMLStructurer.java Thu Oct  9 04:09:28 2008
@@ -23,6 +23,7 @@
 import org.apache.forrest.dispatcher.api.Resolver;
 import org.apache.forrest.dispatcher.api.Structurer;
 import org.apache.forrest.dispatcher.config.DispatcherBean;
+import org.apache.forrest.dispatcher.exception.ContractException;
 import org.apache.forrest.dispatcher.exception.DispatcherException;
 import org.apache.forrest.dispatcher.factories.ContractFactory;
 import org.apache.forrest.dispatcher.impl.helper.Captions;
@@ -197,6 +198,10 @@
           StartElement start = getEventFactory().createStartElement("", "",
               replaceFirst);
           writer.add((XMLEvent) start);
+        }else if(element.equals("/")){
+          StartElement start = getEventFactory().createStartElement("", "",
+              "result");
+          writer.add((XMLEvent) start);
         }
 
         injectResult(writer, element);
@@ -204,7 +209,11 @@
           EndElement end = getEventFactory().createEndElement("", "",
               replaceFirst);
           writer.add((XMLEvent) end);
-        }
+        }else if(element.equals("/")){
+          EndElement end = getEventFactory().createEndElement("", "",
+              "result");
+          writer.add((XMLEvent) end);
+    }
 
       }
 
@@ -214,7 +223,7 @@
   }
 
   private void processContract(XMLStreamReader reader)
-      throws XMLStreamException, DispatcherException, IOException {
+      throws DispatcherException, XMLStreamException{
     boolean process = true;
     String elementName = null;
     String name = "", data = null;
@@ -241,10 +250,24 @@
       case XMLStreamConstants.END_ELEMENT:
         elementName = reader.getLocalName();
         if (elementName.equals(Captions.CONTRACT_ELEMENT)) {
-          InputStream resultStream = contract.execute(dataStream, localParams);
-          StreamHelper.closeStream(dataStream);
-          processContractResult(resultStream);
-          StreamHelper.closeStream(resultStream);
+          try {
+            InputStream resultStream = contract.execute(dataStream, localParams);
+            StreamHelper.closeStream(dataStream);
+            processContractResult(resultStream);
+            StreamHelper.closeStream(resultStream);
+          } catch (Exception e) {
+            /*
+             *  FOR-1127
+             *  Here we can inject custom handler for allowing that contracts can
+             *  throw exceptions but the overall structurer will not fail at whole.
+             *  
+             *  Imaging contract "xyz" will fail. Now we throw an exception and abort 
+             *  processing. However it may be desirable that the process continues 
+             *  since the contract may not be critical for the overall result.
+             *  
+             */
+            throw new ContractException(name,"\n",e);
+          }
           process = false;
         }
         break;