diff options
author | lresende <lresende@13f79535-47bb-0310-9956-ffa450edef68> | 2009-01-22 00:02:32 +0000 |
---|---|---|
committer | lresende <lresende@13f79535-47bb-0310-9956-ffa450edef68> | 2009-01-22 00:02:32 +0000 |
commit | 700c96eb31b6a088c0c3fd37b491cc2abea82cd7 (patch) | |
tree | 0bd8b788791d17ef177dd4104a21d3f4264f86c0 /java/sca/modules/contribution-xml/src | |
parent | 0b3eec00056e90bf82fdc6d931c1e3d590bd9d2a (diff) |
TUSCANY-2663 - Merging latest code to support extended elements to 2.x development stream
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@736500 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'java/sca/modules/contribution-xml/src')
3 files changed, 114 insertions, 258 deletions
diff --git a/java/sca/modules/contribution-xml/src/main/java/org/apache/tuscany/sca/contribution/processor/xml/AnyElementProcessor.java b/java/sca/modules/contribution-xml/src/main/java/org/apache/tuscany/sca/contribution/processor/xml/AnyElementProcessor.java index 38da7740cd..68c46a2301 100644 --- a/java/sca/modules/contribution-xml/src/main/java/org/apache/tuscany/sca/contribution/processor/xml/AnyElementProcessor.java +++ b/java/sca/modules/contribution-xml/src/main/java/org/apache/tuscany/sca/contribution/processor/xml/AnyElementProcessor.java @@ -18,50 +18,45 @@ */ package org.apache.tuscany.sca.contribution.processor.xml; +import static javax.xml.stream.XMLStreamConstants.CDATA; +import static javax.xml.stream.XMLStreamConstants.CHARACTERS; import static javax.xml.stream.XMLStreamConstants.END_ELEMENT; import static javax.xml.stream.XMLStreamConstants.START_ELEMENT; import java.util.ArrayList; -import java.util.logging.Level; -import java.util.logging.Logger; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.xml.namespace.NamespaceContext; import javax.xml.namespace.QName; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; +import javax.xml.stream.XMLEventReader; +import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import javax.xml.stream.XMLStreamWriter; +import javax.xml.stream.events.XMLEvent; +import org.apache.tuscany.sca.contribution.Constants; import org.apache.tuscany.sca.contribution.processor.ContributionReadException; import org.apache.tuscany.sca.contribution.processor.ContributionResolveException; import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor; import org.apache.tuscany.sca.contribution.resolver.ModelResolver; import org.apache.tuscany.sca.core.FactoryExtensionPoint; import org.apache.tuscany.sca.monitor.Monitor; -import org.apache.tuscany.sca.monitor.Problem; -import org.apache.tuscany.sca.monitor.Problem.Severity; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; -import org.w3c.dom.traversal.DocumentTraversal; -import org.w3c.dom.traversal.NodeFilter; -import org.w3c.dom.traversal.NodeIterator; -import org.w3c.dom.traversal.TreeWalker; public class AnyElementProcessor implements StAXArtifactProcessor<Object> { - private static final QName ANY_ELEMENT = new QName("http://www.w3.org/2001/XMLSchema", "anyElement"); - - private static final Logger logger = Logger.getLogger(AnyElementProcessor.class.getName()); - private DocumentBuilderFactory documentBuilderFactory; - private Document document; - private Monitor monitor; - - public AnyElementProcessor(FactoryExtensionPoint modelFactories, Monitor monitor) { - documentBuilderFactory = modelFactories.getFactory(DocumentBuilderFactory.class); - this.monitor = monitor; - } - + private static final QName ANY_ELEMENT = new QName(Constants.XMLSCHEMA_NS, "anyElement"); + + private XMLInputFactory xmlInputFactory; + @SuppressWarnings("unused") + private Monitor monitor; + + + public AnyElementProcessor(FactoryExtensionPoint modelFactories, Monitor monitor) { + xmlInputFactory = modelFactories.getFactory(XMLInputFactory.class); + this.monitor = monitor; + } public QName getArtifactType() { return ANY_ELEMENT; @@ -70,240 +65,97 @@ public class AnyElementProcessor implements StAXArtifactProcessor<Object> { public Class<Object> getModelType() { return Object.class; } - - /** - * Reads the contetns of the unknown elements and generates the DOM - * @param reader - * @param name - * @return - * @throws XMLStreamException - */ + + /** + * Reads the contetns of the unknown elements and generates a custom + * implementation of XMLStreamReader i.e. XMLEventsStreamReader + * + * @param reader + * @return + * @throws XMLStreamException + */ + @SuppressWarnings("unchecked") public Object read(XMLStreamReader reader) throws ContributionReadException, XMLStreamException { - - int event = reader.getEventType(); - int level = 0; - ArrayList<String> elementList = new ArrayList<String>(); - document = createDocument(); - - QName name = reader.getName(); - - while(reader.hasNext()){ - switch(event){ - case START_ELEMENT: - elementList.add(reader.getName().getLocalPart()); - if(level == 0){ - generateDOM(reader,null); - level++; - } - else{ - generateDOM(reader,elementList.get(elementList.size()-2).toString()); - } - - break; - case END_ELEMENT: - elementList.remove(reader.getName().getLocalPart()); - } - if(reader.hasNext()){ - event = reader.next(); - } - - if(event == START_ELEMENT || event == END_ELEMENT){ - if(reader.getName().equals(name)){ - break; - } - } - } - return document; - } - /** - * Writes unknown portions back to the writer - * @param model - * @param writer - */ - public void write(Object model, XMLStreamWriter writer) { - - if( ! (model instanceof Document)) { - return; - } - - Document doc = (Document)model; - try{ - DocumentTraversal traversal = (DocumentTraversal)doc; - TreeWalker walker = traversal.createTreeWalker(doc.getDocumentElement(),NodeFilter.SHOW_ALL, null, true); - writeDOM(walker,writer); - } - catch(Exception e){ - if (logger.isLoggable(Level.SEVERE)) { - logger.log(Level.SEVERE, "Document not created "); - } - error("Document not created",document,e); - } - } + // Custom variables + String currentElement = null; + List eventsList = new ArrayList(); - public void resolve(Object arg0, ModelResolver arg1) throws ContributionResolveException { - - } - - /** - * Method to generate the DOM - * @param reader - * @param parent - * @throws Exception - */ - //private void generateDOM(String elementText, String parent) { - private void generateDOM(XMLStreamReader reader, String parent) { - try{ - String elePrefix = reader.getPrefix(); - String eleQName = reader.getLocalName(); - if (elePrefix != null && elePrefix.length() != 0) { - eleQName = elePrefix + ":" + eleQName; - } - - Element element = document.createElementNS(reader.getNamespaceURI(), eleQName); - - int attributeCount = reader.getAttributeCount(); - for(int i = 0;i < attributeCount;i++){ - String ns = reader.getAttributeNamespace(i); - String prefix = reader.getAttributePrefix(i); - String qname = reader.getAttributeLocalName(i); - String value = reader.getAttributeValue(i); - if (prefix != null && prefix.length() != 0) { - qname = prefix + ":" + qname; - } - element.setAttributeNS(ns,qname,value); - } - if(parent == null){ - if(document != null){ - document.appendChild(element); - } - else{ - if (logger.isLoggable(Level.SEVERE)) { - logger.log(Level.SEVERE, "Document not created "); - } - error("Document not created",document,element); - } - } - else{ - Node parentNode = getParentNode(document,parent); - if(parentNode != null){ - parentNode.appendChild(element); - } - else{ - if (logger.isLoggable(Level.SEVERE)) { - logger.log(Level.SEVERE, "Parent node not found"); - } - error("Parent node not found",document,parentNode.getNodeName()); - } - } - } - catch(Exception e){ - e.printStackTrace(); - if (logger.isLoggable(Level.SEVERE)) { - logger.log(Level.SEVERE, "Document not created "); - } - error("Document not created",document,e); - } - } + Map<String, NamespaceContext> eventContext = new HashMap<String, NamespaceContext>(); - /** - * Method to create an empty document - * @return - */ - private Document createDocument() { - try { - document = documentBuilderFactory.newDocumentBuilder().newDocument(); - return document; - } catch (ParserConfigurationException e) { - e.printStackTrace(); - } - return null; - } + try { + // Cast the block of unknown elements into document + XMLDocumentStreamReader docReader = new XMLDocumentStreamReader(reader); - /** - * Method to traverse the DOM structure and write the elements - * @param walker - * @param writer - * @throws XMLStreamException - */ - private void writeDOM(TreeWalker walker,XMLStreamWriter writer) throws XMLStreamException { - - Node parent = walker.getCurrentNode(); - - writer.writeStartElement(parent.getPrefix(), parent.getLocalName(), parent.getNamespaceURI()); - - NamedNodeMap attributes = parent.getAttributes(); - - for(int i = 0;i<attributes.getLength();i++){ - writer.writeAttribute(attributes.item(i).getPrefix(), attributes.item(i).getNamespaceURI(), attributes.item(i).getLocalName(), attributes.item(i).getNodeValue()); - } - - for (Node n = walker.firstChild();n != null;n = walker.nextSibling()) { - writeDOM(walker,writer); - } - writer.writeEndElement(); - - walker.setCurrentNode(parent); - } + XMLEventReader xmlEventReader = xmlInputFactory.createXMLEventReader(docReader); - /** - * Method to get the Parent node out of the DOM structure - * @param doc - * @param parent - * @return - */ - private Node getParentNode(Node doc,String parent) { - Node parentNode = null; - try{ - DocumentTraversal traversal = (DocumentTraversal)doc; - - CharSequence prefixChar = ":"; - NodeIterator iterator = traversal.createNodeIterator(document.getDocumentElement(), NodeFilter.SHOW_ELEMENT, null, true); - for (Node n = iterator.nextNode(); n != null; n = iterator.nextNode()) { - String nodeName = n.getNodeName(); - String[] str = null; - if(n.getNodeName().contains(prefixChar)){ - str = nodeName.split(":"); - nodeName = str[str.length-1]; - } - if(parent.equalsIgnoreCase(nodeName)){ - parentNode = n; - } - } - return parentNode; - } - catch(Exception e){ - e.printStackTrace(); - } - return parentNode; - } - - /** - * Marshals exceptions into the monitor - * - * @param problems - * @param message - * @param model - */ - private void error(String message, Object model, Exception ex) { - if (monitor != null) { - Problem problem = monitor.createProblem(this.getClass().getName(), "contribution-validation-messages", Severity.ERROR, model, message, ex); - monitor.problem(problem); - } + while (xmlEventReader.hasNext()) { + XMLEvent event = xmlEventReader.nextEvent(); + + // Populate the eventContext map with the current element's name + // and corresponding NamesapceContext + if (currentElement != null && !(eventContext.containsKey(currentElement))) { + eventContext.put(currentElement, reader.getNamespaceContext()); + } + + // Populate the list with the XMLEvents + eventsList.add(event); + if (event.isStartElement()) { + currentElement = reader.getName().getLocalPart(); + } + if (event.isEndDocument()) { + return new XMLEventsStreamReader(eventsList, eventContext); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; } - + /** - * Report a error. + * Writes unknown portions back to the writer * - * @param problems - * @param message * @param model + * @param writer */ - private void error(String message, Object model, Object... messageParameters) { - if (monitor != null) { - Problem problem = monitor.createProblem(this.getClass().getName(), "contribution-validation-messages", Severity.ERROR, model, message, (Object[])messageParameters); - monitor.problem(problem); - } + public void write(Object model, XMLStreamWriter writer) throws XMLStreamException { + if (!(model instanceof XMLStreamReader)) { + return; + } + XMLStreamReader reader = (XMLStreamReader)model; + + int event = reader.getEventType(); + while (reader.hasNext()) { + switch (event) { + case START_ELEMENT: + + writer.writeStartElement(reader.getPrefix(), reader.getLocalName(), reader.getNamespaceURI()); + for (int i = 1; i <= reader.getAttributeCount(); i++) { + writer.writeAttribute(reader.getAttributePrefix(i), reader.getAttributeNamespace(i), reader + .getAttributeLocalName(i), reader.getAttributeValue(i)); + } + break; + + case CHARACTERS: + writer.writeCharacters(reader.getText()); + break; + + case CDATA: + writer.writeCData(reader.getText()); + break; + + case END_ELEMENT: + writer.writeEndElement(); + break; + } + if (reader.hasNext()) { + event = reader.next(); + } + } + } + + public void resolve(Object model, ModelResolver resolver) throws ContributionResolveException { + } - } diff --git a/java/sca/modules/contribution-xml/src/main/java/org/apache/tuscany/sca/contribution/processor/xml/XMLDocumentStreamReader.java b/java/sca/modules/contribution-xml/src/main/java/org/apache/tuscany/sca/contribution/processor/xml/XMLDocumentStreamReader.java index 70398deaa9..7e8b3a9d9e 100644 --- a/java/sca/modules/contribution-xml/src/main/java/org/apache/tuscany/sca/contribution/processor/xml/XMLDocumentStreamReader.java +++ b/java/sca/modules/contribution-xml/src/main/java/org/apache/tuscany/sca/contribution/processor/xml/XMLDocumentStreamReader.java @@ -37,16 +37,16 @@ import javax.xml.stream.XMLStreamReader; */ public class XMLDocumentStreamReader implements XMLStreamReader { private static final int STATE_COMPLETE_AT_NEXT = 2; // The wrapper - // will produce - // END_DOCUMENT + // will produce + // END_DOCUMENT - private static final int STATE_COMPLETED = 3; // Done + private static final int STATE_COMPLETED = 3; // Done - private static final int STATE_INIT = 0; // The wrapper will produce - // START_DOCUMENT + private static final int STATE_INIT = 0; // The wrapper will produce + // START_DOCUMENT - private static final int STATE_SWITCHED = 1; // The real reader will - // produce events + private static final int STATE_SWITCHED = 1; // The real reader will + // produce events private XMLStreamReader realReader; private boolean fragment; diff --git a/java/sca/modules/contribution-xml/src/main/java/org/apache/tuscany/sca/contribution/processor/xml/XMLEventsStreamReader.java b/java/sca/modules/contribution-xml/src/main/java/org/apache/tuscany/sca/contribution/processor/xml/XMLEventsStreamReader.java index eecdee5ba6..351929d8a1 100644 --- a/java/sca/modules/contribution-xml/src/main/java/org/apache/tuscany/sca/contribution/processor/xml/XMLEventsStreamReader.java +++ b/java/sca/modules/contribution-xml/src/main/java/org/apache/tuscany/sca/contribution/processor/xml/XMLEventsStreamReader.java @@ -20,9 +20,11 @@ package org.apache.tuscany.sca.contribution.processor.xml; import java.util.ArrayList; import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Stack; + +import java.util.Iterator; import javax.xml.namespace.NamespaceContext; import javax.xml.namespace.QName; @@ -39,12 +41,14 @@ public class XMLEventsStreamReader implements XMLStreamReader { @SuppressWarnings("unused") private ArrayList<XMLEvent> events = null; + @SuppressWarnings("unchecked") private HashMap<String, NamespaceContext> eventContext = null; private int state; private java.util.Iterator<XMLEvent> iterator; private XMLEvent current; + @SuppressWarnings("unchecked") public XMLEventsStreamReader(List<XMLEvent> events,Map<String, NamespaceContext> map) { this.events = (ArrayList<XMLEvent>) events; this.eventContext = (HashMap<String, NamespaceContext>) map; |