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/12/09 14:58:11 UTC

svn commit: r724703 - /forrest/branches/dispatcher_rewrite/plugins/org.apache.forrest.plugin.internal.dispatcher/src/java/org/apache/forrest/dispatcher/transformation/DispatcherTransformer.java

Author: thorsten
Date: Tue Dec  9 05:58:11 2008
New Revision: 724703

URL: http://svn.apache.org/viewvc?rev=724703&view=rev
Log:
Adding SAX implementation again to the dispatcher. Next step is profiling and further testing.

Modified:
    forrest/branches/dispatcher_rewrite/plugins/org.apache.forrest.plugin.internal.dispatcher/src/java/org/apache/forrest/dispatcher/transformation/DispatcherTransformer.java

Modified: forrest/branches/dispatcher_rewrite/plugins/org.apache.forrest.plugin.internal.dispatcher/src/java/org/apache/forrest/dispatcher/transformation/DispatcherTransformer.java
URL: http://svn.apache.org/viewvc/forrest/branches/dispatcher_rewrite/plugins/org.apache.forrest.plugin.internal.dispatcher/src/java/org/apache/forrest/dispatcher/transformation/DispatcherTransformer.java?rev=724703&r1=724702&r2=724703&view=diff
==============================================================================
--- forrest/branches/dispatcher_rewrite/plugins/org.apache.forrest.plugin.internal.dispatcher/src/java/org/apache/forrest/dispatcher/transformation/DispatcherTransformer.java (original)
+++ forrest/branches/dispatcher_rewrite/plugins/org.apache.forrest.plugin.internal.dispatcher/src/java/org/apache/forrest/dispatcher/transformation/DispatcherTransformer.java Tue Dec  9 05:58:11 2008
@@ -17,7 +17,6 @@
 package org.apache.forrest.dispatcher.transformation;
 
 import java.io.BufferedInputStream;
-import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
@@ -51,29 +50,27 @@
 import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMNode;
 import org.apache.axiom.om.impl.builder.StAXOMBuilder;
-import org.apache.commons.io.output.ByteArrayOutputStream;
 import org.apache.cocoon.ProcessingException;
 import org.apache.cocoon.caching.CacheableProcessingComponent;
 import org.apache.cocoon.environment.SourceResolver;
 import org.apache.cocoon.transformation.AbstractSAXTransformer;
 import org.apache.cocoon.util.TraxErrorHandler;
+import org.apache.cocoon.xml.IncludeXMLConsumer;
+import org.apache.cocoon.xml.RedundantNamespacesFilter;
+import org.apache.cocoon.xml.StringXMLizable;
 import org.apache.cocoon.xml.XMLUtils;
+import org.apache.commons.io.output.ByteArrayOutputStream;
 import org.apache.excalibur.source.Source;
 import org.apache.excalibur.source.SourceException;
 import org.apache.excalibur.source.SourceValidity;
 import org.apache.excalibur.xml.sax.SAXParser;
-import org.apache.excalibur.xml.sax.XMLizable;
 import org.apache.forrest.dispatcher.api.Contract;
 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.config.WritableDispatcherBean;
 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.CocoonResolver;
-import org.apache.forrest.dispatcher.impl.XMLStructurer;
-import org.apache.forrest.dispatcher.impl.XMLStructurerAxiom;
 import org.apache.forrest.dispatcher.impl.helper.AXIOMXPathCreate;
 import org.apache.forrest.dispatcher.impl.helper.Captions;
 import org.apache.forrest.dispatcher.impl.helper.StAX;
@@ -248,6 +245,8 @@
 
   private String prefixString;
 
+  private HashMap storedPrefixMap;
+
   /*
    * @see
    * org.apache.cocoon.transformation.AbstractSAXTransformer#configure(org.apache
@@ -328,6 +327,8 @@
      */
     // setup our super class
     super.setup(resolver, objectModel, src, par);
+    storedPrefixMap = new HashMap();
+
     // get the id of this request
     this.requestId = parameters
         .getParameter(DISPATCHER_REQUEST_ATTRIBUTE, null);
@@ -393,7 +394,6 @@
       throws SAXException {
     // Process start element event
     // Are we inside of properties? If so we need to record the elements.
-    
     if (this.insideProperties && this.includeNodes) {
       // just start the recording
       super.startElement(uri, name, raw, attr);
@@ -418,16 +418,17 @@
             contractProcessingStart(attr);
           } else if (Captions.PROPERTY_ELEMENT.equals(name)) {
             // we are inside a property element
-            this.insideProperties = true;
+            //this.insideProperties = true;
             propertyProcessingStart(uri, name, raw, attr);
-          }
+          } 
         }
       } catch (Exception e) {
         throw new SAXException(e);
       }
     } else {
+      // Do we want to allow to have structurer definitions as nested elements?
       if (!this.insideProperties && this.includeNodes) {
-        super.startElement(uri, name, raw, attr);
+        //super.startElement(uri, name, raw, attr);
       }
     }
 
@@ -440,18 +441,18 @@
    */
   public void endElement(String uri, String name, String raw)
       throws SAXException {
-    System.out.println();
     getLogger().debug("Ending element: " + raw);
     if (Captions.NS.equals(uri)) {
       // we are in the dispatcher ns
       try {
         if (Captions.STRUCTURE_ELEMENT.equals(name)) {
           // we are in a structurer end element
-          structurerProcessingEnd(raw);
+          if (includeNodes) {
+           includeNodes=false;
+          }
         } else if (Captions.HOOK_ELEMENT.equals(name) && this.includeNodes) {
           // we are inside a hook end element
-          // FIXME Implement
-          System.out.println("FIXME Implement ");
+          pathNode = (OMElement) pathNode.getParent();
         } else if (Captions.CONTRACT_ELEMENT.equals(name) && this.includeNodes) {
           // we are inside a contract end element
           contractProcessingEnd();
@@ -460,27 +461,19 @@
           if (allowXml) {
             String property = null;
             try {
-              property = prefixString+super.endSerializedXMLRecording()+"</forrest:property>";
+              //XMLizable endSAXRecording = super.endSAXRecording();
+              property = prefixString+endSerializedXMLRecording()+"</forrest:property>";
               insideProperties = false;
-              System.out.println("super.endSerializedXMLRecording(): "+property);
-            } catch (ProcessingException e) {
+              getLogger().debug("super.endSerializedXMLRecording(): "+property);
+            } catch (Exception e) {
               throw new SAXException(e);
             }
             if (null != property) {
               localParams.put(currentProperty, property.getBytes());
             }
-          } else {
-            // FIXME Implement
-            System.out.println("FIXME Implement ");
           }
         }
-      } catch (ContractException e) {
-        throw new SAXException(e);
-      } catch (IOException e) {
-        throw new SAXException(e);
-      } catch (JaxenException e) {
-        throw new SAXException(e);
-      } catch (XMLStreamException e) {
+      } catch (Exception e) {
         throw new SAXException(e);
       }
     } else if (this.insideProperties && this.includeNodes) {
@@ -488,6 +481,51 @@
     }
   }
 
+  public void ignorableWhitespace(char c[], int start, int len)
+  throws SAXException {
+ // do nothing here!
+  }
+  
+  
+  public void characters(char c[], int start, int len)
+  throws SAXException {
+    /*
+     * only if we in properties mode we want to record
+     * the characters.
+     */
+    if (includeNodes && insideProperties){
+      super.characters(c, start, len);
+    }
+  }
+  
+  public void startDocument() throws SAXException {
+ // Add the namespace filter to our own output.
+    RedundantNamespacesFilter nsPipe = new RedundantNamespacesFilter();
+    if (this.xmlConsumer != null) {
+        nsPipe.setConsumer(this.xmlConsumer);
+    } else {
+        nsPipe.setContentHandler(this.contentHandler);
+    }
+    setConsumer(nsPipe);
+    super.startDocument();
+  }
+  
+  public void endDocument()
+  throws SAXException {
+    structurerProcessingEnd();
+    super.endDocument();
+  }
+  
+  /*
+   * copy 'n paste
+   */
+  
+  public void startCDATA() throws SAXException {
+  }
+
+  public void endCDATA() throws SAXException {
+  }
+
   /**
    * Will execute the contract and process the result.
    * 
@@ -607,13 +645,24 @@
    * Finish the processing of the structurer
    * 
    * @param raw
+   * @throws SAXException 
    */
-  private void structurerProcessingEnd(String raw) {
-    if (includeNodes) {
-      // FIXME: implement
-      System.out.println("FIXME Implement "); 
+  private void structurerProcessingEnd() throws SAXException {
+    try {
+   // get the result of the structurer as stream
+      ByteArrayOutputStream out = new ByteArrayOutputStream();
+      OMElement firstElement = root.getFirstElement();
+      if (null!=firstElement){
+        firstElement.serialize(out);
+      }else{
+        root.serialize(out);
+      }
+      StringXMLizable xml = new StringXMLizable(out.toString());
+      xml.toSAX(new IncludeXMLConsumer(super.xmlConsumer));
+    } catch (Exception e) {
+      throw new SAXException(e);
     }
-
+    
   }
 
   /**
@@ -641,12 +690,13 @@
         value = localValue;
       }
     }
+    currentProperty = id;
     // if we allow xml properties we will just record them
     if (allowXml) {
    // just start the recording
       prefixString = "<"+raw+attributesString+">";
-      startSerializedXMLRecording(XMLUtils.createPropertiesForXML(true));
-      currentProperty = id;
+      startSerializedXMLRecording((XMLUtils.createPropertiesForXML(true)));
+      insideProperties = true;
     } else {
       // if we do not allow xml we will use a simple key/value approach
       if (id != null && value != null) {
@@ -714,6 +764,7 @@
       element.addAttribute(attribute);
     }
     pathNode.addChild(element);
+    pathNode = element;
   }
 
   /**
@@ -784,9 +835,6 @@
           // release source - you need to ALWAYS do this!
           release(propsSource);
         }
-        // creating in/out stream objects
-        BufferedInputStream stream = null;
-        ByteArrayOutputStream out = new ByteArrayOutputStream();
         /*
          * Preparing the model by creating a root document/element. Afterward we
          * need to strip the root element again.
@@ -817,91 +865,6 @@
 
   }
 
-  /*
-   * Here we pick up the recoreder result and start the processing on it.
-   * 
-   * @see org.apache.cocoon.transformation.AbstractSAXTransformer#endDocument()
-   */
-  public void endDocument() throws SAXException {
-
-    // start structurer routine
-    Structurer structurer = null;
-    // need to get the properties for this uri
-    HashMap<String, Object> map = new HashMap<String, Object>();
-    String propertyURI = "cocoon://" + requestId + ".props";
-    try {
-      // get the source representation of the propertyURI
-      Source propsSource = m_resolver.resolveURI(propertyURI);
-      if (propsSource != null) {
-        // get the stream
-        InputStream stream = new BufferedInputStream(propsSource
-            .getInputStream());
-        /*
-         * we need either just the bytes of the stream (if we allow xml
-         * properties) or we need to process it extracting the properties.
-         */
-        if (config.isAllowXmlProperties()) {
-          // get the bytes from the stream
-          byte[] properties = IOUtils.getStreamAsByteArray(stream);
-          /*
-           * add the bytes to the properties map later on they will be picked up
-           * and parsed to a dom node.
-           */
-          map.put(DEFAULT_VARIABLES, properties);
-        } else {
-          // extract the properties of the in coming stream
-          XMLProperties.parseProperties(stream, map);
-        }
-        // release source - you need to ALWAYS do this!
-        release(propsSource);
-      }
-    } catch (Exception e) {
-      throw new SAXException(e);
-    }
-    // which implementation do we want
-    if (xpathSupport.equals("enhanced")) {
-      /*
-       * The axiom implementation is an object model approach to StAX. It allows
-       * you a dom like navigation (allocate xpath nodes), adding of child
-       * elements in this xpath statement and many more.
-       */
-      structurer = new XMLStructurerAxiom((DispatcherBean) config, map);
-    } else {
-      /*
-       * The stax implementationis 100% StAX even the generation of the
-       * resulting document is done with StAX. However it does not offer real
-       * support of xpath expressions.
-       */
-      structurer = new XMLStructurer((DispatcherBean) config, map);
-    }
-
-    try {
-      // the recorded document we just streamed
-      String document = null;
-      try {
-        // request the information from the recorder
-        document = super.endSerializedXMLRecording();
-      } catch (ProcessingException e) {
-        throw new SAXException(e);
-      }
-      // get the result of the structurer as stream
-      InputStream result = structurer.execute(new BufferedInputStream(
-          new ByteArrayInputStream(document.getBytes())), requestedFormat);
-      // requesting a parser
-      parser = (SAXParser) manager.lookup(SAXParser.ROLE);
-      // adding the result to the consumer
-      parser.parse(new InputSource(result), super.xmlConsumer);
-    } catch (DispatcherException e) {
-      throw new SAXException(e);
-    } catch (Exception e) {
-      throw new SAXException(e);
-    } finally {
-      if (null != parser) {
-        // release parser - you need to ALWAYS do this!
-        manager.release(parser);
-      }
-    }
-  }
 
   /**
    * Generate the unique key. This key must be unique inside the space of this
@@ -971,7 +934,16 @@
    * Recycle the component
    */
   public void recycle() {
+    this.includeNodes = false;
+    this.insideProperties= false;
+    this.requestId= "";
     this.validity = null;
+    this.root=null;
+    this.pathNode=null;
+    this.contract=null;
+    this.map=null;
+    this.localParams=null;
+    this.currentProperty=null;
     super.recycle();
 
   }