Author: thorsten Date: Fri Sep 12 15:33:14 2008 New Revision: 694827 URL: http://svn.apache.org/viewvc?rev=694827&view=rev Log: starting with the structurer implementation. I will later extract an interface if I have identified the common ground for other formats.
Added: forrest/trunk/whiteboard/dispatcher/java/org/apache/forrest/dispatcher/impl/XMLStructurer.java (with props) Added: forrest/trunk/whiteboard/dispatcher/java/org/apache/forrest/dispatcher/impl/XMLStructurer.java URL: http://svn.apache.org/viewvc/forrest/trunk/whiteboard/dispatcher/java/org/apache/forrest/dispatcher/impl/XMLStructurer.java?rev=694827&view=auto ============================================================================== --- forrest/trunk/whiteboard/dispatcher/java/org/apache/forrest/dispatcher/impl/XMLStructurer.java (added) +++ forrest/trunk/whiteboard/dispatcher/java/org/apache/forrest/dispatcher/impl/XMLStructurer.java Fri Sep 12 15:33:14 2008 @@ -0,0 +1,240 @@ +package org.apache.forrest.dispatcher.impl; + +import java.io.BufferedInputStream; +import java.io.InputStream; +import java.util.HashMap; + +import javax.xml.stream.XMLStreamConstants; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +import org.apache.forrest.dispatcher.DispatcherException; +import org.apache.forrest.dispatcher.api.Contract; +import org.apache.forrest.dispatcher.helper.StAX; + +public class XMLStructurer extends StAX { + + public static final String NS = "http://apache.org/forrest/templates/2.0"; + + public static final String STRUCTURER_ELEMENT = "structurer"; + + public static final String STRUCTURE_ELEMENT = "structure"; + + public static final String TYPE_ATT = "type"; + + public static final String HOOKS_ATT = "hooksXpath"; + + public static final String CONTRACT_ELEMENT = "contract"; + + public static final String NAME_ATT = "name"; + + public static final String DATA_ATT = "dataURI"; + + public static final String PROPERTY_ELEMENT = "property"; + + public static final String HOOK_ELEMENT = "hook"; + + private static final Object VALUE_ATT = "value"; + + private String format = ""; + private InputStream dataStream = null; + + private String currentPath = ""; + + private boolean allowXmlProperties = false; + + public boolean isAllowXmlProperties() { + return allowXmlProperties; + } + + public void setAllowXmlProperties(boolean allowXmlProperties) { + this.allowXmlProperties = allowXmlProperties; + } + + private String contractUriPrefix = ""; + private String contractUriSufix = ".contract.xml"; + + public String getContractUriPrefix() { + return contractUriPrefix; + } + + public void setContractUriPrefix(String contractUriPrefix) { + this.contractUriPrefix = contractUriPrefix; + } + + public String getContractUriSufix() { + return contractUriSufix; + } + + public void setContractUriSufix(String contractUriSufix) { + this.contractUriSufix = contractUriSufix; + } + + public XMLStructurer(InputStream dataStream, String format) { + this.format = format; + this.dataStream = dataStream; + } + + public BufferedInputStream execute() throws DispatcherException { + try { + XMLStreamReader reader = getReader(dataStream); + boolean process = true; + while (process) { + int event = reader.next(); + switch (event) { + case XMLStreamConstants.END_DOCUMENT: + process = false; + break; + + case XMLStreamConstants.START_ELEMENT: + String elementName = reader.getLocalName(); + if (elementName.equals(STRUCTURE_ELEMENT)) { + String m_type = "", path = ""; + // Get attribute names + for (int i = 0; i < reader.getAttributeCount(); i++) { + String localName = reader.getAttributeLocalName(i); + if (localName.equals(TYPE_ATT)) { + // Return value + m_type = reader.getAttributeValue(i); + } else if (localName.equals(HOOKS_ATT)) { + path = reader.getAttributeValue(i); + } + } + if (m_type.equals(format)) { + log.debug("matched - need to process"); + // adding the default path + if (!"/".equals(String.valueOf(path.charAt(0)))) { + path = "/" + path; + } + currentPath = path; + processStructure(reader); + } else { + log.debug("no-matched"); + } + } + break; + + default: + break; + } + } + } catch (XMLStreamException e) { + throw new DispatcherException(e); + } + return null; + } + + private void processStructure(XMLStreamReader reader) + throws XMLStreamException, DispatcherException { + boolean process = true; + String elementName = null; + while (process) { + int event = reader.next(); + switch (event) { + case XMLStreamConstants.END_ELEMENT: + elementName = reader.getLocalName(); + if (elementName.equals(STRUCTURE_ELEMENT)) { + // TODO: add logic here to produce the response + process = false; + } + break; + + case XMLStreamConstants.START_ELEMENT: + elementName = reader.getLocalName(); + if (elementName.equals(CONTRACT_ELEMENT)) { + log.debug("Path " + currentPath); + processContract(reader); + } else if (elementName.equals(HOOK_ELEMENT)) { + log.debug("HOOKS " + elementName); + log.info("HOOKS transformation NOT YET IMPLEMENTED"); + } + break; + + default: + break; + + } + } + + } + + private void processContract(XMLStreamReader reader) + throws XMLStreamException, DispatcherException { + boolean process = true; + String elementName = null; + String name = "", data = ""; + // Get attribute names + for (int i = 0; i < reader.getAttributeCount(); i++) { + String localName = reader.getAttributeLocalName(i); + if (localName.equals(NAME_ATT)) { + // Return value + name = reader.getAttributeValue(i); + } else if (localName.equals(DATA_ATT)) { + data = reader.getAttributeValue(i); + } + } + /* + * FIXME: TEMPORAL HACK ONLY Use source resolver/contract factory when + * fixing this. + * + * Ignoring dataStream completely for now + * + * THIS ONLY WORKS FOR JUNIT ATM!!! + */ + dataStream = null; + Contract contract = new XSLContract(false); + InputStream xslStream = this.getClass().getResourceAsStream( + this.contractUriPrefix + name + this.contractUriSufix); + contract.initializeFromStream(xslStream); + /* + * HACK END + */ + + HashMap<String, ?> param = new HashMap(); + while (process) { + int event = reader.next(); + switch (event) { + case XMLStreamConstants.END_ELEMENT: + elementName = reader.getLocalName(); + if (elementName.equals(CONTRACT_ELEMENT)) { + InputStream resultStream = contract.execute(dataStream, param); + // FIXME: add the stream to the result map with the actual path + process=false; + } + break; + + case XMLStreamConstants.START_ELEMENT: + elementName = reader.getLocalName(); + if (elementName.equals(PROPERTY_ELEMENT)) { + processProperty(reader, param); + } + break; + + default: + break; + + } + } + } + + private void processProperty(XMLStreamReader reader, HashMap param) { + String propertyName = null, propertyValue = null; + // Get attribute names + for (int i = 0; i < reader.getAttributeCount(); i++) { + String localName = reader.getAttributeLocalName(i); + if (localName.equals(NAME_ATT)) { + // Return value + propertyName = reader.getAttributeValue(i); + } else if (localName.equals(VALUE_ATT)) { + propertyValue = reader.getAttributeValue(i); + } + } + if (allowXmlProperties) { + // FIXME: record the events that are coming now + } else if (null != propertyValue && null != propertyName) { + param.put(propertyName, propertyValue); + } + + } + +} Propchange: forrest/trunk/whiteboard/dispatcher/java/org/apache/forrest/dispatcher/impl/XMLStructurer.java ------------------------------------------------------------------------------ svn:eol-style = native