Author: thorsten
Date: Wed Sep 10 06:11:47 2008
New Revision: 693831

URL: http://svn.apache.org/viewvc?rev=693831&view=rev
Log:
Starting to implement the code to parse the contract

Added:
    
forrest/trunk/whiteboard/dispatcher/java/org/apache/forrest/dispatcher/DispatcherException.java
      - copied unchanged from r693801, 
forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.internal.dispatcher/src/java/org/apache/forrest/dispatcher/DispatcherException.java
Modified:
    
forrest/trunk/whiteboard/dispatcher/java/org/apache/forrest/dispatcher/helper/XSLContractHelper.java
    
forrest/trunk/whiteboard/dispatcher/java/org/apache/forrest/dispatcher/impl/XSLContract.java

Modified: 
forrest/trunk/whiteboard/dispatcher/java/org/apache/forrest/dispatcher/helper/XSLContractHelper.java
URL: 
http://svn.apache.org/viewvc/forrest/trunk/whiteboard/dispatcher/java/org/apache/forrest/dispatcher/helper/XSLContractHelper.java?rev=693831&r1=693830&r2=693831&view=diff
==============================================================================
--- 
forrest/trunk/whiteboard/dispatcher/java/org/apache/forrest/dispatcher/helper/XSLContractHelper.java
 (original)
+++ 
forrest/trunk/whiteboard/dispatcher/java/org/apache/forrest/dispatcher/helper/XSLContractHelper.java
 Wed Sep 10 06:11:47 2008
@@ -21,12 +21,69 @@
 import java.io.ByteArrayOutputStream;
 import java.io.InputStream;
 
+import javax.xml.stream.XMLStreamConstants;
 import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
 import javax.xml.stream.XMLStreamWriter;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Source;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerFactory;
 
 import org.apache.forrest.dispatcher.helper.StAX;
+import org.apache.forrest.dispatcher.impl.XSLContract;
 
 public class XSLContractHelper extends StAX {
+
+  private Transformer transformer = null;
+
+  private boolean allowXmlProperties = false;
+
+  public static final String NS = "http://apache.org/forrest/templates/1.0";;
+
+  public static final String CONTRACT_ELEMENT = "contract";
+
+  public static final String CONTRACT_NAME_ATT = "name";
+
+  public static final String DESCRIPTION_ELEMENT = "description";
+
+  public static final String TEMPLATE_ELEMENT = "template";
+
+  public static final String TEMPLATE_FORMAT_ATT = "inputFormat";
+
+  public static final String USAGE_ELEMENT = "usage";
+
+  public static final String RESULT_XPATH = "xpath";
+
+  /**
+   * This method will prepare the transformation from the data and the xsl
+   * stylesheet from the contract.
+   * 
+   * @param xslSource
+   *          the xsl stylesheet
+   * @param allowXmlProperties
+   *          whether or not we want to allow xml properties
+   * @throws TransformerConfigurationException
+   */
+  public void prepareTransformation(Source xslSource, boolean 
allowXmlProperties)
+      throws TransformerConfigurationException {
+    TransformerFactory transFact = TransformerFactory.newInstance();
+    // prepare transformation
+    transformer = transFact.newTransformer(xslSource);
+    transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
+    transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+    transformer.setOutputProperty(OutputKeys.METHOD, "xml");
+    // do we allow xml properties?
+    this.allowXmlProperties = allowXmlProperties;
+  }
+
+  /**
+   * Will create a dummy xml document with only one element.
+   * 
+   * @return ByteArrayOutputStream of the dummy xml document.
+   * @throws XMLStreamException
+   */
   public ByteArrayOutputStream createEmptyXmlOutput() throws 
XMLStreamException {
     ByteArrayOutputStream out = new ByteArrayOutputStream();
     XMLStreamWriter writer = getStreamWriter(out);
@@ -38,8 +95,63 @@
     return out;
   }
 
+  /**
+   * Will create a dummy xml document with only one element contacting
+   * [EMAIL PROTECTED] #createEmptyXmlOutput()} and then switching the 
outputStream to an
+   * inputStream
+   * 
+   * @return InputStream of the dummy xml document.
+   * @throws XMLStreamException
+   */
   public InputStream createEmptyXml() throws XMLStreamException {
     ByteArrayOutputStream out = createEmptyXmlOutput();
     return new BufferedInputStream(new 
ByteArrayInputStream(out.toByteArray()));
   }
+
+  /**
+   * This method sets the xslSource, name, description and usage information of
+   * the contract.
+   * 
+   * This is been done by parsing the contract and extracting the corresponding
+   * information.
+   * 
+   * @param stream
+   * @param contract
+   * @throws XMLStreamException
+   */
+  public void setTemplate(InputStream stream, XSLContract contract)
+      throws XMLStreamException {
+    XMLStreamReader parser = getParser(stream);
+    ByteArrayOutputStream out = new ByteArrayOutputStream();
+    XMLStreamWriter writer = getStreamWriter(out);
+    boolean process = true;
+    while (process) {
+      int event = parser.next();
+      switch (event) {
+      case XMLStreamConstants.END_DOCUMENT:
+        process = false;
+        break;
+
+      case XMLStreamConstants.START_ELEMENT:
+        String localName = parser.getLocalName();
+        if (localName.equals(CONTRACT_ELEMENT)) {
+          contract.setName(processContract(parser));
+        }
+      }
+    }
+  }
+
+  private String processContract(XMLStreamReader parser) {
+    String contractName = "";
+    for (int i = 0; i < parser.getAttributeCount(); i++) {
+      // Get attribute name
+      String localName = parser.getAttributeLocalName(i);
+      if (localName.equals(CONTRACT_NAME_ATT)) {
+        // Return value
+        contractName = parser.getAttributeValue(i);
+        return contractName;
+      }
+    }
+    return contractName;
+  }
 }

Modified: 
forrest/trunk/whiteboard/dispatcher/java/org/apache/forrest/dispatcher/impl/XSLContract.java
URL: 
http://svn.apache.org/viewvc/forrest/trunk/whiteboard/dispatcher/java/org/apache/forrest/dispatcher/impl/XSLContract.java?rev=693831&r1=693830&r2=693831&view=diff
==============================================================================
--- 
forrest/trunk/whiteboard/dispatcher/java/org/apache/forrest/dispatcher/impl/XSLContract.java
 (original)
+++ 
forrest/trunk/whiteboard/dispatcher/java/org/apache/forrest/dispatcher/impl/XSLContract.java
 Wed Sep 10 06:11:47 2008
@@ -21,8 +21,10 @@
 import java.util.HashMap;
 
 import javax.xml.stream.XMLStreamException;
+import javax.xml.transform.Source;
+import javax.xml.transform.TransformerConfigurationException;
 
-
+import org.apache.forrest.dispatcher.DispatcherException;
 import org.apache.forrest.dispatcher.api.Contract;
 
 import org.apache.forrest.dispatcher.helper.Loggable;
@@ -30,32 +32,66 @@
 
 public class XSLContract extends Loggable implements Contract {
 
-  private String name="", usage="", description="";
-  private XSLContractHelper helper=null;
-
-  public OutputStream execute(InputStream dataStream, HashMap properties) {
-    /* 
-     * get a new instance of the corresponding helper class since the helper
-     * is doing the actual work
-     */
-     helper = new XSLContractHelper();
+  private String name = "", usage = "", description = "";
+  private XSLContractHelper helper = null;
+  private Source xslSource = null;
+
+  private boolean allowXmlProperties = false;
+
+  public XSLContract(boolean allowXmlProperties) throws DispatcherException {
+    this.allowXmlProperties = allowXmlProperties;
+  }
+
+  public OutputStream execute(InputStream dataStream, HashMap properties)
+      throws DispatcherException {
+    if (xslSource == null || helper == null) {
+      throw new DispatcherException("Contract \"" + name
+          + "\" has produced an exception"
+          + "The xsl source have not been initialize from stream"
+          + "the contract. We cannot proceed without this.");
+    }
+    try {
+      /*
+       * prepare the transformation in the helper class
+       */
+      helper.prepareTransformation(xslSource, allowXmlProperties);
+    } catch (TransformerConfigurationException e) {
+      throw new DispatcherException("Contract \"" + name
+          + "\" has produced an exception"
+          + "Could not setup the transformer for"
+          + "the contract. We cannot proceed without this.",e);
+    }
     /*
-     *  If no dataStream is present we need to create an empty xml doc
-     *  to be able to invoke the xsl transformation.
+     * If no dataStream is present we need to create an empty xml doc to be 
able
+     * to invoke the xsl transformation.
      */
     if (null == dataStream) {
       try {
         dataStream = helper.createEmptyXml();
       } catch (XMLStreamException e) {
-        log.fatal(e);
+        throw new DispatcherException("Contract \"" + name
+            + "\" has produced an exception"
+            + "Could not create an empty xml document for"
+            + "the contract. We cannot proceed without this.",e);
       }
     }
 
     return null;
   }
 
-  public void initializeFromStream(InputStream stream) {
-    // TODO Auto-generated method stub
+  public void initializeFromStream(InputStream stream)
+      throws DispatcherException {
+    /*
+     * get a new instance of the corresponding helper class since the helper is
+     * doing the actual work
+     */
+    helper = new XSLContractHelper();
+    // invoke the extraction
+    try {
+      helper.setTemplate(stream, this);
+    } catch (XMLStreamException e) {
+      throw new DispatcherException(e);
+    }
 
   }
 
@@ -82,4 +118,20 @@
   public void setUsage(String usage) {
     this.usage = usage;
   }
+
+  public boolean isAllowXmlProperties() {
+    return allowXmlProperties;
+  }
+
+  public void setAllowXmlProperties(boolean allowXmlProperties) {
+    this.allowXmlProperties = allowXmlProperties;
+  }
+  
+  public Source getXslSource() {
+    return xslSource;
+  }
+
+  public void setXslSource(Source xslSource) {
+    this.xslSource = xslSource;
+  }
 }