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; }