Author: thorsten
Date: Thu Sep 11 05:53:05 2008
New Revision: 694232
URL: http://svn.apache.org/viewvc?rev=694232&view=rev
Log:
Finishing the implementation of the xslContract. Adding methods to extract the
bean properties and specially the xsl template source.
Modified:
forrest/trunk/whiteboard/dispatcher/java/org/apache/forrest/dispatcher/helper/StAX.java
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/StAX.java
URL:
http://svn.apache.org/viewvc/forrest/trunk/whiteboard/dispatcher/java/org/apache/forrest/dispatcher/helper/StAX.java?rev=694232&r1=694231&r2=694232&view=diff
==============================================================================
---
forrest/trunk/whiteboard/dispatcher/java/org/apache/forrest/dispatcher/helper/StAX.java
(original)
+++
forrest/trunk/whiteboard/dispatcher/java/org/apache/forrest/dispatcher/helper/StAX.java
Thu Sep 11 05:53:05 2008
@@ -27,6 +27,9 @@
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.XMLStreamWriter;
+import javax.xml.stream.util.XMLEventAllocator;
+
+import com.ctc.wstx.evt.DefaultEventAllocator;
/**
* Helper class that eases the usage of StAX in your plugins.
@@ -47,6 +50,7 @@
*/
public StAX() {
inputFactory = XMLInputFactory.newInstance();
+ inputFactory.setEventAllocator(DefaultEventAllocator.getDefaultInstance());
outputFactory = XMLOutputFactory.newInstance();
eventFactory = XMLEventFactory.newInstance();
}
@@ -107,11 +111,19 @@
}
/**
- * Get the ready to used EventFactory
+ * Get the ready to use EventFactory
*
- * @return ready to used EventFactory
+ * @return ready to use EventFactory
*/
public XMLEventFactory getEventFactory() {
return eventFactory;
}
+
+ /**
+ * Get the ready to use Event Allocator
+ * @return ready to use Event Allocator
+ */
+ public XMLEventAllocator getEventAllocator() {
+ return inputFactory.getEventAllocator();
+ }
}
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=694232&r1=694231&r2=694232&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
Thu Sep 11 05:53:05 2008
@@ -19,27 +19,39 @@
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
+import java.io.IOException;
import java.io.InputStream;
-
+import java.io.StringReader;
+import java.util.HashMap;
+import java.util.Iterator;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.stream.XMLEventWriter;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.XMLStreamWriter;
+import javax.xml.stream.util.XMLEventAllocator;
import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.stream.StreamSource;
import org.apache.forrest.dispatcher.helper.StAX;
import org.apache.forrest.dispatcher.impl.XSLContract;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
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";
@@ -65,9 +77,12 @@
* @param allowXmlProperties
* whether or not we want to allow xml properties
* @throws TransformerConfigurationException
+ * @throws ParserConfigurationException
+ * @throws IOException
+ * @throws SAXException
*/
- public void prepareTransformation(Source xslSource, boolean
allowXmlProperties)
- throws TransformerConfigurationException {
+ public void prepareTransformation(Source xslSource, boolean
allowXmlProperties, HashMap<String, ?> params)
+ throws TransformerConfigurationException, ParserConfigurationException,
SAXException, IOException {
TransformerFactory transFact = TransformerFactory.newInstance();
// prepare transformation
transformer = transFact.newTransformer(xslSource);
@@ -75,7 +90,20 @@
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
// do we allow xml properties?
- this.allowXmlProperties = allowXmlProperties;
+ if(!allowXmlProperties){
+ for (Iterator<String> iter = params.keySet().iterator();
iter.hasNext();) {
+ String key = iter.next();
+ String value = (String) params.get(key);
+ transformer.setParameter(key,value);
+ }
+ }else{
+ DocumentBuilder builder = DocumentBuilderFactory.newInstance()
+ .newDocumentBuilder();
+ for (Iterator<String> iter = params.keySet().iterator();
iter.hasNext();) {
+ String key = iter.next();
+ transformer.setParameter(key, builder.parse((InputSource)
params.get(key)));
+ }
+ }
}
/**
@@ -122,12 +150,11 @@
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;
@@ -137,10 +164,123 @@
if (localName.equals(CONTRACT_ELEMENT)) {
contract.setName(processContract(parser));
}
+ if (localName.equals(DESCRIPTION_ELEMENT)) {
+ contract.setDescription(processDescription(parser));
+ }
+ if (localName.equals(USAGE_ELEMENT)) {
+ contract.setUsage(processUsage(parser));
+ }
+
+ if (localName.equals(TEMPLATE_ELEMENT)) {
+ contract.setXslSource(processTemplate(parser));
+ }
+
+ default:
+ break;
}
}
}
+ private Source processTemplate(XMLStreamReader parser)
+ throws XMLStreamException {
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ XMLEventWriter writer = getWriter(out);
+ XMLEventAllocator allocator = getEventAllocator();
+ String role = "";
+ for (int i = 0; i < parser.getAttributeCount(); i++) {
+ // Get attribute name
+ String localName = parser.getAttributeLocalName(i);
+ if (localName.equals(TEMPLATE_FORMAT_ATT)) {
+ // Return value
+ role = parser.getAttributeValue(i);
+ }
+ }
+ boolean process = true;
+ if (role.equals("xsl")) {
+ while (process) {
+ int event = parser.next();
+ switch (event) {
+
+ case XMLStreamConstants.END_ELEMENT:
+ if (parser.getNamespaceURI() != null) {
+ if (parser.getNamespaceURI().equals(NS)
+ & parser.getLocalName().equals(TEMPLATE_ELEMENT)) {
+ process = false;
+ } else {
+ writer.add(allocator.allocate(parser));
+ }
+ } else {
+ writer.add(allocator.allocate(parser));
+ }
+ break;
+
+ default:
+ writer.add(allocator.allocate(parser));
+ break;
+ }
+ }
+ }
+ writer.flush();
+ //log.debug(out.toString());
+ Source source = new StreamSource(new BufferedInputStream(
+ new ByteArrayInputStream(out.toByteArray())));
+ return source;
+ }
+
+ private String processUsage(XMLStreamReader parser) throws
XMLStreamException {
+ boolean process = true;
+ String usage = "";
+ while (process) {
+ int event = parser.next();
+ switch (event) {
+
+ case XMLStreamConstants.CHARACTERS:
+ if (parser.getText().replace(" ", "").length() > 1) {
+ usage = parser.getText().trim();
+ }
+ break;
+
+ case XMLStreamConstants.END_ELEMENT:
+ if (parser.getLocalName().equals(USAGE_ELEMENT)) {
+ process = false;
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+ return usage;
+ }
+
+ private String processDescription(XMLStreamReader parser)
+ throws XMLStreamException {
+ boolean process = true;
+ String description = "";
+ while (process) {
+ int event = parser.next();
+ switch (event) {
+
+ case XMLStreamConstants.CHARACTERS:
+ if (parser.getText().replace(" ", "").length() > 1) {
+ description = parser.getText().trim();
+ }
+ break;
+
+ case XMLStreamConstants.END_ELEMENT:
+ if (parser.getLocalName().equals(DESCRIPTION_ELEMENT)) {
+ process = false;
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ return description;
+ }
+
private String processContract(XMLStreamReader parser) {
String contractName = "";
for (int i = 0; i < parser.getAttributeCount(); i++) {
@@ -154,4 +294,9 @@
}
return contractName;
}
+
+ public void transform(InputStream dataStream, Result streamResult) throws
TransformerException {
+ Source dataSource = new StreamSource(dataStream);
+ transformer.transform(dataSource, streamResult);
+ }
}
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=694232&r1=694231&r2=694232&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
Thu Sep 11 05:53:05 2008
@@ -16,13 +16,20 @@
*/
package org.apache.forrest.dispatcher.impl;
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
import java.io.InputStream;
-import java.io.OutputStream;
import java.util.HashMap;
+import javax.xml.parsers.ParserConfigurationException;
import javax.xml.stream.XMLStreamException;
+import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.stream.StreamResult;
import org.apache.forrest.dispatcher.DispatcherException;
import org.apache.forrest.dispatcher.api.Contract;
@@ -42,8 +49,8 @@
this.allowXmlProperties = allowXmlProperties;
}
- public OutputStream execute(InputStream dataStream, HashMap properties)
- throws DispatcherException {
+ public BufferedInputStream execute(InputStream dataStream,
+ HashMap<String, ?> properties) throws DispatcherException {
if (xslSource == null || helper == null) {
throw new DispatcherException("Contract \"" + name
+ "\" has produced an exception"
@@ -54,12 +61,17 @@
/*
* prepare the transformation in the helper class
*/
- helper.prepareTransformation(xslSource, allowXmlProperties);
+ helper.prepareTransformation(xslSource, allowXmlProperties, properties);
} 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);
+ + "the contract. We cannot proceed without this.", e);
+ } catch (Exception e) {
+ throw new DispatcherException("Contract \"" + name
+ + "\" has produced an exception"
+ + "Could not setup the DOM Parser 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
@@ -72,11 +84,22 @@
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);
+ + "the contract. We cannot proceed without this.", e);
}
}
-
- return null;
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ // create a StreamResult and use it for the transformation
+ Result streamResult = new StreamResult(new BufferedOutputStream(out));
+ try {
+ helper.transform(dataStream,streamResult);
+ } catch (TransformerException e) {
+ throw new DispatcherException("Contract \"" + name
+ + "\" has produced an exception"
+ + "Could not invoke the transformation for"
+ + "the contract. We cannot proceed without this.", e);
+ }
+ log.debug(out.toString());
+ return new BufferedInputStream(new
ByteArrayInputStream(out.toByteArray()));
}
public void initializeFromStream(InputStream stream)
@@ -126,7 +149,7 @@
public void setAllowXmlProperties(boolean allowXmlProperties) {
this.allowXmlProperties = allowXmlProperties;
}
-
+
public Source getXslSource() {
return xslSource;
}