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


Reply via email to