tuscany-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From antel...@apache.org
Subject svn commit: r718969 - /tuscany/java/sca/modules/contribution-xml/src/main/java/org/apache/tuscany/sca/contribution/processor/xml/AnyElementProcessor.java
Date Wed, 19 Nov 2008 14:25:39 GMT
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);
+    	}
+    }
+	
 }



Mime
View raw message