diff options
author | antelder <antelder@13f79535-47bb-0310-9956-ffa450edef68> | 2008-11-19 14:25:38 +0000 |
---|---|---|
committer | antelder <antelder@13f79535-47bb-0310-9956-ffa450edef68> | 2008-11-19 14:25:38 +0000 |
commit | ae780104796c2adc8b080a022d6ea12139fa381c (patch) | |
tree | 6167942d07602d3e64e83e0149bb71ad69edf287 /java/sca/modules | |
parent | 988c12ac0ebdd0c52daac3d6a17b73b7586d15fa (diff) |
Revert AnyElementProcessor to version from sca-equinox branch. This needs revisiting, the current trunk version doesn't compile but its not clear what the changes btw old trunk and the sca-equinox branch are, for now to get th ebuild working use the sca-equinox version
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@718969 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'java/sca/modules')
-rw-r--r-- | java/sca/modules/contribution-xml/src/main/java/org/apache/tuscany/sca/contribution/processor/xml/AnyElementProcessor.java | 347 |
1 files changed, 241 insertions, 106 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 2b868b9e45..38da7740cd 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 @@ -20,155 +20,290 @@ package org.apache.tuscany.sca.contribution.processor.xml; import static javax.xml.stream.XMLStreamConstants.END_ELEMENT; import static javax.xml.stream.XMLStreamConstants.START_ELEMENT; -import static javax.xml.stream.XMLStreamConstants.CHARACTERS; -import static javax.xml.stream.XMLStreamConstants.COMMENT; -import static javax.xml.stream.XMLStreamConstants.CDATA; 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.logging.Level; +import java.util.logging.Logger; -import javax.xml.namespace.NamespaceContext; import javax.xml.namespace.QName; -import javax.xml.stream.XMLEventReader; -import javax.xml.stream.XMLInputFactory; -import javax.xml.stream.XMLStreamConstants; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import javax.xml.stream.XMLStreamWriter; -import javax.xml.stream.events.Characters; -import javax.xml.stream.events.XMLEvent; -import org.apache.tuscany.sca.contribution.Constants; -import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint; +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.contribution.service.ContributionReadException; -import org.apache.tuscany.sca.contribution.service.ContributionResolveException; +import org.apache.tuscany.sca.core.FactoryExtensionPoint; import org.apache.tuscany.sca.monitor.Monitor; -import org.apache.tuscany.sca.contribution.processor.xml.XMLEventsStreamReader; +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(Constants.XMLSCHEMA_NS, - "anyElement"); - - private XMLInputFactory xmlInputFactory; - @SuppressWarnings("unused") + 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; - //Map<String, NamespaceContext> map = new HashMap<String, NamespaceContext>(); - - public AnyElementProcessor(ModelFactoryExtensionPoint modelFactories, - Monitor monitor) { - xmlInputFactory = modelFactories.getFactory(XMLInputFactory.class); + + public AnyElementProcessor(FactoryExtensionPoint modelFactories, Monitor monitor) { + documentBuilderFactory = modelFactories.getFactory(DocumentBuilderFactory.class); this.monitor = monitor; } + - public QName getArtifactType() { - return ANY_ELEMENT; - } - - public Class<Object> getModelType() { - return Object.class; - } + public QName getArtifactType() { + return ANY_ELEMENT; + } + public Class<Object> getModelType() { + return Object.class; + } + /** - * Reads the contetns of the unknown elements and generates a custom - * implementation of XMLStreamReader i.e. XMLEventsStreamReader - * + * Reads the contetns of the unknown elements and generates the DOM * @param reader + * @param name * @return * @throws XMLStreamException */ - @SuppressWarnings("unchecked") - public Object read(XMLStreamReader reader) throws ContributionReadException, XMLStreamException { + 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; + } - //Custom variables - String currentElement = null; - List eventsList = new ArrayList(); + /** + * Writes unknown portions back to the writer + * @param model + * @param writer + */ + public void write(Object model, XMLStreamWriter writer) { - Map<String, NamespaceContext> eventContext = new HashMap<String, NamespaceContext>(); + if( ! (model instanceof Document)) { + return; + } + Document doc = (Document)model; try{ - //Cast the block of unknown elements into document - XMLDocumentStreamReader docReader = new XMLDocumentStreamReader(reader); - - XMLEventReader xmlEventReader = xmlInputFactory.createXMLEventReader(docReader); + 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); + } + } + + 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; + } - while (xmlEventReader.hasNext()) { - XMLEvent event = xmlEventReader.nextEvent(); + Element element = document.createElementNS(reader.getNamespaceURI(), eleQName); - //Populate the eventContext map with the current element's name and corresponding NamesapceContext - if (currentElement != null && !(eventContext.containsKey(currentElement))) { - eventContext.put(currentElement, reader.getNamespaceContext()); + 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); } - - //Populate the list with the XMLEvents - eventsList.add(event); - if (event.isStartElement()) { - currentElement = reader.getName().getLocalPart(); + else{ + if (logger.isLoggable(Level.SEVERE)) { + logger.log(Level.SEVERE, "Document not created "); + } + error("Document not created",document,element); } - if (event.isEndDocument()) { - return new XMLEventsStreamReader(eventsList, eventContext); + } + 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); } - return null; } /** - * Writes unknown portions back to the writer - * - * @param model - * @param writer + * Method to create an empty document + * @return */ - 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(); - } - } + private Document createDocument() { + try { + document = documentBuilderFactory.newDocumentBuilder().newDocument(); + return document; + } catch (ParserConfigurationException e) { + e.printStackTrace(); + } + return null; } - public void resolve(Object model, ModelResolver resolver) - throws ContributionResolveException { - // TODO Auto-generated method stub - + /** + * 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); } + /** + * 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); + } + } + + /** + * Report a error. + * + * @param problems + * @param message + * @param model + */ + 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); + } + } + } |