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