Ant, The old version of the AnyElementProcessor is causing us some issues as pointed by Raymond in [1]. Could you help us by merging back these changes (to the latest version of AnyElementProcessor based in StAX Event Processors and not DOM). I'd also suggest that, during the bring up of the core modules, we move on the direction of fixing the issues we encounter after the merges, rather then reverting these merges.
[1] http://markmail.org/message/b74srppv7mwxoavg On Wed, Nov 19, 2008 at 6:25 AM, <[EMAIL PROTECTED]> wrote: > Author: antelder > Date: Wed Nov 19 06:25:38 2008 > New Revision: 718969 > > URL: http://svn.apache.org/viewvc?rev=718969&view=rev > Log: > 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 > > Modified: > > tuscany/java/sca/modules/contribution-xml/src/main/java/org/apache/tuscany/sca/contribution/processor/xml/AnyElementProcessor.java > > Modified: > tuscany/java/sca/modules/contribution-xml/src/main/java/org/apache/tuscany/sca/contribution/processor/xml/AnyElementProcessor.java > URL: > http://svn.apache.org/viewvc/tuscany/java/sca/modules/contribution-xml/src/main/java/org/apache/tuscany/sca/contribution/processor/xml/AnyElementProcessor.java?rev=718969&r1=718968&r2=718969&view=diff > ============================================================================== > --- > tuscany/java/sca/modules/contribution-xml/src/main/java/org/apache/tuscany/sca/contribution/processor/xml/AnyElementProcessor.java > (original) > +++ > tuscany/java/sca/modules/contribution-xml/src/main/java/org/apache/tuscany/sca/contribution/processor/xml/AnyElementProcessor.java > Wed Nov 19 06:25:38 2008 > @@ -20,155 +20,290 @@ > > 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); > + } > + } > + else{ > + Node parentNode = > getParentNode(document,parent); > + if(parentNode != null){ > + parentNode.appendChild(element); > } > - if (event.isEndDocument()) { > - return new > XMLEventsStreamReader(eventsList, eventContext); > + 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); > + } > + } > + > } > > > -- Luciano Resende Apache Tuscany, Apache PhotArk http://people.apache.org/~lresende http://lresende.blogspot.com/
