From 9d018863477c5d6056d18dbbcc0c4d5d5be9cfd2 Mon Sep 17 00:00:00 2001 From: rfeng Date: Tue, 4 Aug 2009 03:01:18 +0000 Subject: Use the xml string to keep the unknown elements (reduce complexity and memory usage over an in memory stream reader) git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@800664 13f79535-47bb-0310-9956-ffa450edef68 --- .../processor/ExtensibleStAXArtifactProcessor.java | 2 +- .../processor/TuscanyNamespaceContext.java | 114 ----- .../processor/TuscanyXMLStreamReader.java | 110 ----- .../processor/ValidatingXMLStreamReader.java | 12 +- .../processor/xml/AnyAttributeProcessor.java | 2 +- .../processor/xml/AnyElementProcessor.java | 124 ++---- .../processor/xml/XMLDocumentStreamReader.java | 482 --------------------- .../processor/xml/XMLEventsStreamReader.java | 444 ------------------- .../processor/xml/XMLFragmentStreamReader.java | 53 --- .../processor/xml/XMLStreamSerializer.java | 287 ++++++++++++ ...ca.contribution.processor.StAXArtifactProcessor | 2 +- 11 files changed, 329 insertions(+), 1303 deletions(-) delete mode 100644 java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/TuscanyNamespaceContext.java delete mode 100644 java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/TuscanyXMLStreamReader.java delete mode 100644 java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/xml/XMLDocumentStreamReader.java delete mode 100644 java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/xml/XMLEventsStreamReader.java delete mode 100644 java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/xml/XMLFragmentStreamReader.java create mode 100644 java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/xml/XMLStreamSerializer.java diff --git a/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/ExtensibleStAXArtifactProcessor.java b/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/ExtensibleStAXArtifactProcessor.java index 35793899c0..c21c4c6a44 100644 --- a/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/ExtensibleStAXArtifactProcessor.java +++ b/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/ExtensibleStAXArtifactProcessor.java @@ -50,7 +50,7 @@ import org.apache.tuscany.sca.monitor.Problem.Severity; public class ExtensibleStAXArtifactProcessor implements StAXArtifactProcessor { private static final Logger logger = Logger.getLogger(ExtensibleStAXArtifactProcessor.class.getName()); - private static final QName ANY_ELEMENT = new QName(Constants.XMLSCHEMA_NS, "anyElement"); + private static final QName ANY_ELEMENT = new QName(Constants.XMLSCHEMA_NS, "any"); private XMLInputFactory inputFactory; private XMLOutputFactory outputFactory; diff --git a/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/TuscanyNamespaceContext.java b/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/TuscanyNamespaceContext.java deleted file mode 100644 index 2ddba7527e..0000000000 --- a/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/TuscanyNamespaceContext.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.tuscany.sca.contribution.processor; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.Stack; - -import javax.xml.namespace.NamespaceContext; - -/** - * Tuscany specialized class to handle NamespaceContext - * - */ -public class TuscanyNamespaceContext implements NamespaceContext { - - private Stack[]> context = null; - - public TuscanyNamespaceContext(Stack[]> context) { - this.context = context; - } - - public String getNamespaceURI(String prefix) { - if (prefix == null) { - throw new IllegalArgumentException(); - } - return (String)getResult("getNSUri", prefix); - } - - public String getPrefix(String namespaceURI) { - if (namespaceURI == null) { - throw new IllegalArgumentException(); - } - return (String)getResult("getPrefix", namespaceURI); - } - - @SuppressWarnings("unchecked") - public Iterator getPrefixes(String namespaceURI) { - if (namespaceURI == null) { - throw new IllegalArgumentException(); - } - - Iterator iterator = (Iterator)getResult("getPrefixes", namespaceURI); - return iterator; - } - - /* - * Generic method to Iterate through the Stack and return required result(s) - */ - private Object getResult(String operation, String arg) { - - List[] contextList = null; - Iterator prefItr = null; - Iterator uriItr = null; - - List list = new ArrayList(); - - String toCompare = null; - - String tempPrefix = null; - String tempUri = null; - - for (int i = context.size() - 1; i >= 0; i--) { - contextList = context.get(i); - prefItr = contextList[0].iterator(); - uriItr = contextList[1].iterator(); - while (uriItr.hasNext()) { - tempPrefix = prefItr.next(); - tempUri = uriItr.next(); - if (operation.equalsIgnoreCase("getNSUri")) { - toCompare = tempPrefix; - } else if (operation.equalsIgnoreCase("getPrefix")) { - toCompare = tempUri; - } else if (operation.equalsIgnoreCase("getPrefixes")) { - toCompare = tempUri; - } - if (toCompare != null && arg.equalsIgnoreCase(toCompare)) { - if (operation.equalsIgnoreCase("getNSUri")) { - return tempUri; - } else if (operation.equalsIgnoreCase("getPrefix")) { - return tempPrefix; - } else if (operation.equalsIgnoreCase("getPrefixes")) { - list.add(tempPrefix); - } - - } - } - } - - if (operation.equalsIgnoreCase("getPrefixes")) { - return Collections.unmodifiableList(list).iterator(); - } - - return null; - } -} \ No newline at end of file diff --git a/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/TuscanyXMLStreamReader.java b/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/TuscanyXMLStreamReader.java deleted file mode 100644 index 3352e76a0d..0000000000 --- a/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/TuscanyXMLStreamReader.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.tuscany.sca.contribution.processor; - -import java.util.ArrayList; -import java.util.List; -import java.util.Stack; - -import javax.xml.XMLConstants; -import javax.xml.namespace.NamespaceContext; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.XMLStreamReader; -import javax.xml.stream.util.StreamReaderDelegate; - -/* - * Custom implementaion of the XMLStreamReader to keep track of the namespace context for each element - */ -public class TuscanyXMLStreamReader extends StreamReaderDelegate implements XMLStreamReader { - - Stack[]> context = new Stack[]>(); - - List[] contextList; - List prefixList; - List uriList; - - public TuscanyXMLStreamReader(XMLStreamReader reader) { - super(reader); - } - - public void pushContext() throws XMLStreamException { - contextList = new List[2]; - prefixList = new ArrayList(); - uriList = new ArrayList(); - int namespaceCount = this.getNamespaceCount(); - for (int i = 0; i < namespaceCount; i++) { - prefixList.add(checkString(this.getNamespacePrefix(i))); - uriList.add(this.getNamespaceURI(i)); - } - contextList[0] = prefixList; - contextList[1] = uriList; - context.push(contextList); - } - - private String checkString(String namespacePrefix) { - if (namespacePrefix == null) { - return XMLConstants.DEFAULT_NS_PREFIX; - } else { - return namespacePrefix; - } - } - - public void popContext() throws XMLStreamException { - context.pop(); - } - - /* - * Overriding the next() method to perform PUSH and POP operations - * for the NamespaceContext for the current element - */ - - @Override - public int next() throws XMLStreamException { - // POP the context if the element ends - if (this.getEventType() == END_ELEMENT) { - popContext(); - } - - //get the next event - int nextEvent = super.next(); - //PUSH the events info onto the Stack - if (nextEvent == START_ELEMENT) { - pushContext(); - } - return nextEvent; - } - - @Override - public int nextTag() throws XMLStreamException { - int event = super.nextTag(); - if (event == START_ELEMENT) { - pushContext(); - } - if (event == END_ELEMENT) { - popContext(); - } - return event; - } - - @Override - public NamespaceContext getNamespaceContext() { - return new TuscanyNamespaceContext((Stack[]>)context.clone()); - } -} \ No newline at end of file diff --git a/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/ValidatingXMLStreamReader.java b/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/ValidatingXMLStreamReader.java index ac7b644703..7882142eb4 100644 --- a/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/ValidatingXMLStreamReader.java +++ b/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/ValidatingXMLStreamReader.java @@ -27,6 +27,7 @@ import javax.xml.stream.Location; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; +import javax.xml.stream.util.StreamReaderDelegate; import javax.xml.validation.Schema; import javax.xml.validation.ValidatorHandler; @@ -46,11 +47,10 @@ import org.xml.sax.helpers.AttributesImpl; * * @version $Rev$ $Date$ */ -class ValidatingXMLStreamReader extends TuscanyXMLStreamReader implements XMLStreamReader { +class ValidatingXMLStreamReader extends StreamReaderDelegate implements XMLStreamReader { private static final Logger logger = Logger.getLogger(ValidatingXMLStreamReader.class.getName()); - private int level; private ValidatorHandler handler; private final Monitor monitor; @@ -158,11 +158,9 @@ class ValidatingXMLStreamReader extends TuscanyXMLStreamReader implements XMLStr try { switch (event) { case XMLStreamConstants.START_DOCUMENT: - level++; handler.startDocument(); break; case XMLStreamConstants.START_ELEMENT: - level++; handleStartElement(); break; case XMLStreamConstants.PROCESSING_INSTRUCTION: @@ -176,7 +174,6 @@ class ValidatingXMLStreamReader extends TuscanyXMLStreamReader implements XMLStr break; case XMLStreamConstants.END_ELEMENT: handleEndElement(); - level--; break; case XMLStreamConstants.END_DOCUMENT: handler.endDocument(); @@ -201,13 +198,10 @@ class ValidatingXMLStreamReader extends TuscanyXMLStreamReader implements XMLStr try { switch (event) { case XMLStreamConstants.START_DOCUMENT: - level++; handler.startDocument(); break; case XMLStreamConstants.START_ELEMENT: - level++; handleStartElement(); - pushContext(); return event; case XMLStreamConstants.PROCESSING_INSTRUCTION: handler.processingInstruction(super.getPITarget(), super.getPIData()); @@ -220,8 +214,6 @@ class ValidatingXMLStreamReader extends TuscanyXMLStreamReader implements XMLStr break; case XMLStreamConstants.END_ELEMENT: handleEndElement(); - level--; - popContext(); return event; case XMLStreamConstants.END_DOCUMENT: handler.endDocument(); diff --git a/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/xml/AnyAttributeProcessor.java b/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/xml/AnyAttributeProcessor.java index aad7747522..4091323f05 100644 --- a/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/xml/AnyAttributeProcessor.java +++ b/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/xml/AnyAttributeProcessor.java @@ -74,7 +74,7 @@ public class AnyAttributeProcessor extends BaseStAXArtifactProcessor implements // are just the string representation fo the attribute } - public void resolve(Extension arg0, ModelResolver arg1) throws ContributionResolveException { + public void resolve(Extension model, ModelResolver modelResolver) throws ContributionResolveException { } } diff --git a/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/xml/AnyElementProcessor.java b/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/xml/AnyElementProcessor.java index 68c46a2301..02618c489b 100644 --- a/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/xml/AnyElementProcessor.java +++ b/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/xml/AnyElementProcessor.java @@ -18,25 +18,18 @@ */ package org.apache.tuscany.sca.contribution.processor.xml; -import static javax.xml.stream.XMLStreamConstants.CDATA; -import static javax.xml.stream.XMLStreamConstants.CHARACTERS; -import static javax.xml.stream.XMLStreamConstants.END_ELEMENT; -import static javax.xml.stream.XMLStreamConstants.START_ELEMENT; +import java.io.StringReader; +import java.io.StringWriter; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.xml.namespace.NamespaceContext; import javax.xml.namespace.QName; -import javax.xml.stream.XMLEventReader; import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import javax.xml.stream.XMLStreamWriter; -import javax.xml.stream.events.XMLEvent; +import org.apache.tuscany.sca.assembly.AssemblyFactory; +import org.apache.tuscany.sca.assembly.Extension; import org.apache.tuscany.sca.contribution.Constants; import org.apache.tuscany.sca.contribution.processor.ContributionReadException; import org.apache.tuscany.sca.contribution.processor.ContributionResolveException; @@ -45,16 +38,21 @@ import org.apache.tuscany.sca.contribution.resolver.ModelResolver; import org.apache.tuscany.sca.core.FactoryExtensionPoint; import org.apache.tuscany.sca.monitor.Monitor; -public class AnyElementProcessor implements StAXArtifactProcessor { - private static final QName ANY_ELEMENT = new QName(Constants.XMLSCHEMA_NS, "anyElement"); +public class AnyElementProcessor implements StAXArtifactProcessor { + private static final QName ANY_ELEMENT = new QName(Constants.XMLSCHEMA_NS, "any"); + private AssemblyFactory assemblyFactory; private XMLInputFactory xmlInputFactory; + private XMLOutputFactory xmlOutputFactory; + @SuppressWarnings("unused") private Monitor monitor; public AnyElementProcessor(FactoryExtensionPoint modelFactories, Monitor monitor) { + assemblyFactory = modelFactories.getFactory(AssemblyFactory.class); xmlInputFactory = modelFactories.getFactory(XMLInputFactory.class); + xmlOutputFactory = modelFactories.getFactory(XMLOutputFactory.class); this.monitor = monitor; } @@ -62,8 +60,8 @@ public class AnyElementProcessor implements StAXArtifactProcessor { return ANY_ELEMENT; } - public Class getModelType() { - return Object.class; + public Class getModelType() { + return Extension.class; } /** @@ -74,43 +72,19 @@ public class AnyElementProcessor implements StAXArtifactProcessor { * @return * @throws XMLStreamException */ - @SuppressWarnings("unchecked") - public Object read(XMLStreamReader reader) throws ContributionReadException, XMLStreamException { - - // Custom variables - String currentElement = null; - List eventsList = new ArrayList(); - - Map eventContext = new HashMap(); - - try { - // Cast the block of unknown elements into document - XMLDocumentStreamReader docReader = new XMLDocumentStreamReader(reader); - - XMLEventReader xmlEventReader = xmlInputFactory.createXMLEventReader(docReader); - - while (xmlEventReader.hasNext()) { - XMLEvent event = xmlEventReader.nextEvent(); - - // Populate the eventContext map with the current element's name - // and corresponding NamesapceContext - if (currentElement != null && !(eventContext.containsKey(currentElement))) { - eventContext.put(currentElement, reader.getNamespaceContext()); - } - - // Populate the list with the XMLEvents - eventsList.add(event); - if (event.isStartElement()) { - currentElement = reader.getName().getLocalPart(); - } - if (event.isEndDocument()) { - return new XMLEventsStreamReader(eventsList, eventContext); - } - } - } catch (Exception e) { - e.printStackTrace(); - } - return null; + public Extension read(XMLStreamReader reader) throws ContributionReadException, XMLStreamException { + QName name = reader.getName(); + XMLStreamSerializer serializer = new XMLStreamSerializer(); + StringWriter sw = new StringWriter(); + XMLStreamWriter writer = xmlOutputFactory.createXMLStreamWriter(sw); + serializer.serialize(reader, writer); + writer.flush(); + + Extension ext = assemblyFactory.createExtension(); + ext.setQName(name); + ext.setValue(sw.toString()); + + return ext; } /** @@ -119,43 +93,19 @@ public class AnyElementProcessor implements StAXArtifactProcessor { * @param model * @param writer */ - public void write(Object model, XMLStreamWriter writer) throws XMLStreamException { - if (!(model instanceof XMLStreamReader)) { + public void write(Extension model, XMLStreamWriter writer) throws XMLStreamException { + Object value = model.getValue(); + if (!(value instanceof String)) { 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(); - } - } + String xml = (String) value; + XMLStreamReader reader = xmlInputFactory.createXMLStreamReader(new StringReader(xml)); + // Position the reader to the root element + reader.nextTag(); + XMLStreamSerializer serializer = new XMLStreamSerializer(); + serializer.serialize(reader, writer); } - public void resolve(Object model, ModelResolver resolver) throws ContributionResolveException { - + public void resolve(Extension model, ModelResolver resolver) throws ContributionResolveException { } } diff --git a/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/xml/XMLDocumentStreamReader.java b/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/xml/XMLDocumentStreamReader.java deleted file mode 100644 index 634563ebd7..0000000000 --- a/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/xml/XMLDocumentStreamReader.java +++ /dev/null @@ -1,482 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.apache.tuscany.sca.contribution.processor.xml; - -import java.util.NoSuchElementException; - -import javax.xml.namespace.NamespaceContext; -import javax.xml.namespace.QName; -import javax.xml.stream.Location; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.XMLStreamReader; - -/** - * This class is derived from Apache Axis2 class - * org.apache.axis2.util.StreamWrapper. It's used wrap a XMLStreamReader to - * create a XMLStreamReader representing a document and it will produce - * START_DOCUMENT, END_DOCUMENT events. - * - * @version $Rev$ $Date$ - */ -public class XMLDocumentStreamReader implements XMLStreamReader { - private static final int STATE_COMPLETE_AT_NEXT = 2; // The wrapper - // will produce - // END_DOCUMENT - - private static final int STATE_COMPLETED = 3; // Done - - private static final int STATE_INIT = 0; // The wrapper will produce - // START_DOCUMENT - - private static final int STATE_SWITCHED = 1; // The real reader will - // produce events - - private XMLStreamReader realReader; - private boolean fragment; - private int level = 0; - - private int state = STATE_INIT; - - public XMLDocumentStreamReader(XMLStreamReader realReader) { - if (realReader == null) { - throw new UnsupportedOperationException("Reader cannot be null"); - } - - this.realReader = realReader; - - if (realReader instanceof XMLFragmentStreamReader) { - ((XMLFragmentStreamReader)realReader).init(); - } - - // If the real reader is positioned at START_DOCUMENT, always use - // the real reader - if (realReader.getEventType() == START_DOCUMENT) { - fragment = false; - state = STATE_SWITCHED; - } - } - - public void close() throws XMLStreamException { - realReader.close(); - } - - public int getAttributeCount() { - if (isDelegating()) { - return realReader.getAttributeCount(); - } else { - throw new IllegalStateException(); - } - } - - public String getAttributeLocalName(int i) { - if (isDelegating()) { - return realReader.getAttributeLocalName(i); - } else { - throw new IllegalStateException(); - } - } - - public QName getAttributeName(int i) { - if (isDelegating()) { - return realReader.getAttributeName(i); - } else { - throw new IllegalStateException(); - } - } - - public String getAttributeNamespace(int i) { - if (isDelegating()) { - return realReader.getAttributeNamespace(i); - } else { - throw new IllegalStateException(); - } - } - - public String getAttributePrefix(int i) { - if (isDelegating()) { - return realReader.getAttributePrefix(i); - } else { - throw new IllegalStateException(); - } - } - - public String getAttributeType(int i) { - if (isDelegating()) { - return realReader.getAttributeType(i); - } else { - throw new IllegalStateException(); - } - } - - public String getAttributeValue(int i) { - if (isDelegating()) { - return realReader.getAttributeValue(i); - } else { - throw new IllegalStateException(); - } - } - - public String getAttributeValue(String s, String s1) { - if (isDelegating()) { - return realReader.getAttributeValue(s, s1); - } else { - throw new IllegalStateException(); - } - } - - public String getCharacterEncodingScheme() { - return realReader.getCharacterEncodingScheme(); - } - - public String getElementText() throws XMLStreamException { - if (isDelegating()) { - return realReader.getElementText(); - } else { - throw new XMLStreamException(); - } - } - - public String getEncoding() { - return realReader.getEncoding(); - } - - public int getEventType() { - int event = -1; - switch (state) { - case STATE_SWITCHED: - case STATE_COMPLETE_AT_NEXT: - event = realReader.getEventType(); - break; - case STATE_INIT: - event = START_DOCUMENT; - break; - case STATE_COMPLETED: - event = END_DOCUMENT; - break; - } - return event; - } - - public String getLocalName() { - if (isDelegating()) { - return realReader.getLocalName(); - } else { - throw new IllegalStateException(); - } - } - - public Location getLocation() { - if (isDelegating()) { - return realReader.getLocation(); - } else { - return null; - } - } - - public QName getName() { - if (isDelegating()) { - return realReader.getName(); - } else { - throw new IllegalStateException(); - } - } - - public NamespaceContext getNamespaceContext() { - return realReader.getNamespaceContext(); - } - - public int getNamespaceCount() { - if (isDelegating()) { - return realReader.getNamespaceCount(); - } else { - throw new IllegalStateException(); - } - } - - public String getNamespacePrefix(int i) { - if (isDelegating()) { - return realReader.getNamespacePrefix(i); - } else { - throw new IllegalStateException(); - } - } - - public String getNamespaceURI() { - if (isDelegating()) { - return realReader.getNamespaceURI(); - } else { - throw new IllegalStateException(); - } - } - - public String getNamespaceURI(int i) { - if (isDelegating()) { - return realReader.getNamespaceURI(i); - } else { - throw new IllegalStateException(); - } - } - - public String getNamespaceURI(String s) { - if (isDelegating()) { - return realReader.getNamespaceURI(s); - } else { - throw new IllegalStateException(); - } - } - - public String getPIData() { - if (isDelegating()) { - return realReader.getPIData(); - } else { - throw new IllegalStateException(); - } - } - - public String getPITarget() { - if (isDelegating()) { - return realReader.getPITarget(); - } else { - throw new IllegalStateException(); - } - } - - public String getPrefix() { - if (isDelegating()) { - return realReader.getPrefix(); - } else { - throw new IllegalStateException(); - } - } - - public Object getProperty(String s) throws IllegalArgumentException { - if (isDelegating()) { - return realReader.getProperty(s); - } else { - throw new IllegalArgumentException(); - } - } - - public String getText() { - if (isDelegating()) { - return realReader.getText(); - } else { - throw new IllegalStateException(); - } - } - - public char[] getTextCharacters() { - if (isDelegating()) { - return realReader.getTextCharacters(); - } else { - throw new IllegalStateException(); - } - } - - public int getTextCharacters(int i, char[] chars, int i1, int i2) throws XMLStreamException { - if (isDelegating()) { - return realReader.getTextCharacters(i, chars, i1, i2); - } else { - throw new IllegalStateException(); - } - } - - public int getTextLength() { - if (isDelegating()) { - return realReader.getTextLength(); - } else { - throw new IllegalStateException(); - } - } - - public int getTextStart() { - if (isDelegating()) { - return realReader.getTextStart(); - } else { - throw new IllegalStateException(); - } - } - - public String getVersion() { - if (isDelegating()) { - return realReader.getVersion(); - } else { - return null; - } - } - - public boolean hasName() { - if (isDelegating()) { - return realReader.hasName(); - } else { - return false; - } - } - - public boolean hasNext() throws XMLStreamException { - if (state == STATE_COMPLETE_AT_NEXT) { - return true; - } else if (state == STATE_COMPLETED) { - return false; - } else if (state == STATE_SWITCHED) { - return realReader.hasNext(); - } else { - return true; - } - } - - public boolean hasText() { - if (isDelegating()) { - return realReader.hasText(); - } else { - return false; - } - } - - public boolean isAttributeSpecified(int i) { - if (isDelegating()) { - return realReader.isAttributeSpecified(i); - } else { - return false; - } - } - - public boolean isCharacters() { - if (isDelegating()) { - return realReader.isCharacters(); - } else { - return false; - } - } - - private boolean isDelegating() { - return state == STATE_SWITCHED || state == STATE_COMPLETE_AT_NEXT; - } - - public boolean isEndElement() { - if (isDelegating()) { - return realReader.isEndElement(); - } else { - return false; - } - } - - public boolean isStandalone() { - if (isDelegating()) { - return realReader.isStandalone(); - } else { - return false; - } - } - - public boolean isStartElement() { - if (isDelegating()) { - return realReader.isStartElement(); - } else { - return false; - } - } - - public boolean isWhiteSpace() { - if (isDelegating()) { - return realReader.isWhiteSpace(); - } else { - return false; - } - } - - public int next() throws XMLStreamException { - int returnEvent; - - switch (state) { - case STATE_SWITCHED: - returnEvent = realReader.next(); - if (returnEvent == END_DOCUMENT) { - state = STATE_COMPLETED; - } else if (!realReader.hasNext()) { - state = STATE_COMPLETE_AT_NEXT; - } - if (fragment && returnEvent == END_ELEMENT) { - level--; - if (level == -1) { - // We are now at the end of the top-level element in the fragment - state = STATE_COMPLETE_AT_NEXT; - } - } - if (fragment && returnEvent == START_ELEMENT) { - level++; - } - break; - case STATE_INIT: - state = STATE_SWITCHED; - returnEvent = realReader.getEventType(); - if (returnEvent == START_ELEMENT) { - // The real reader is positioned at the top-level element in the fragment - level = 0; - fragment = true; - } - break; - case STATE_COMPLETE_AT_NEXT: - state = STATE_COMPLETED; - returnEvent = END_DOCUMENT; - break; - case STATE_COMPLETED: - // oops - no way we can go beyond this - throw new NoSuchElementException("End of stream has reached."); - default: - throw new UnsupportedOperationException(); - } - - return returnEvent; - } - - public int nextTag() throws XMLStreamException { - if (isDelegating()) { - int returnEvent = realReader.nextTag(); - if (fragment && returnEvent == END_ELEMENT) { - level--; - if (level == 0) { - // We are now at the end of the top-level element in the fragment - state = STATE_COMPLETE_AT_NEXT; - } - } - if (fragment && returnEvent == START_ELEMENT) { - level++; - } - return returnEvent; - } else { - throw new XMLStreamException(); - } - } - - public void require(int i, String s, String s1) throws XMLStreamException { - if (isDelegating()) { - realReader.require(i, s, s1); - } - } - - public boolean standaloneSet() { - if (isDelegating()) { - return realReader.standaloneSet(); - } else { - return false; - } - } -} diff --git a/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/xml/XMLEventsStreamReader.java b/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/xml/XMLEventsStreamReader.java deleted file mode 100644 index eecdee5ba6..0000000000 --- a/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/xml/XMLEventsStreamReader.java +++ /dev/null @@ -1,444 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.tuscany.sca.contribution.processor.xml; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import javax.xml.namespace.NamespaceContext; -import javax.xml.namespace.QName; -import javax.xml.stream.Location; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.XMLStreamReader; -import javax.xml.stream.events.Attribute; -import javax.xml.stream.events.Namespace; -import javax.xml.stream.events.ProcessingInstruction; -import javax.xml.stream.events.XMLEvent; - - -public class XMLEventsStreamReader implements XMLStreamReader { - - @SuppressWarnings("unused") - private ArrayList events = null; - private HashMap eventContext = null; - - private int state; - private java.util.Iterator iterator; - private XMLEvent current; - - public XMLEventsStreamReader(List events,Map map) { - this.events = (ArrayList) events; - this.eventContext = (HashMap) map; - this.iterator = events.iterator(); - this.current = iterator.next(); - this.state = current.getEventType(); - } - - public void close() throws XMLStreamException { - this.events = null; - this.eventContext = null; - this.iterator = null; - this.current = null; - } - - private void checkElementState() { - if (getEventType() != START_ELEMENT && getEventType() != END_ELEMENT) { - throw new IllegalStateException(); - } - } - - @SuppressWarnings("unchecked") - public int getAttributeCount() { - checkElementState(); - int count = 0; - Iterator iterator = current.asStartElement().getAttributes(); - while (iterator.hasNext()) { - count++; - iterator.next(); - } - return count; - } - - /* - * Custom method to get attribute from the specified index - */ - @SuppressWarnings("unchecked") - private Attribute getAttribute(int index) { - checkElementState(); - int count = 0; - Attribute attribute = null; - Iterator iterator = current.asStartElement().getAttributes(); - while (iterator.hasNext()) { - count++; - if (count == index) { - attribute = iterator.next(); - } else { - iterator.next(); - } - } - return attribute; - } - - - public String getAttributeLocalName(int index) { - checkElementState(); - return getAttribute(index).getName().getLocalPart(); - } - - public QName getAttributeName(int index) { - checkElementState(); - return getAttribute(index).getName(); - } - - public String getAttributeNamespace(int index) { - checkElementState(); - return getAttributeName(index).getNamespaceURI(); - } - - public String getAttributePrefix(int index) { - checkElementState(); - return getAttributeName(index).getPrefix(); - } - - public String getAttributeType(int index) { - checkElementState(); - return getAttribute(index).getDTDType(); - } - - public String getAttributeValue(int index) { - checkElementState(); - return getAttribute(index).getValue(); - } - - @SuppressWarnings("unchecked") - public String getAttributeValue(String namespaceURI, String localName) { - checkElementState(); - Iterator iterator = current.asStartElement().getAttributes(); - Attribute attribute; - while (iterator.hasNext()) { - attribute = iterator.next(); - if (attribute.getName().getNamespaceURI().equalsIgnoreCase( - namespaceURI) - && attribute.getName().getLocalPart().equalsIgnoreCase( - localName)) { - return attribute.getValue(); - } - } - return null; - - } - - public String getCharacterEncodingScheme() { - return "UTF-8"; - } - - public String getElementText() throws XMLStreamException { - checkElementState(); - int eventType = getEventType(); - String elementText = null; - - if (eventType == START_ELEMENT) { - elementText = current.asStartElement().getName().getLocalPart(); - } else if (eventType == END_ELEMENT) { - elementText = current.asEndElement().getName().getLocalPart(); - } - return elementText; - } - - public String getEncoding() { - return "UTF-8"; - } - - public int getEventType() { - return state; - } - - public String getLocalName() { - checkElementState(); - switch (current.getEventType()) { - case START_ELEMENT: - return current.asStartElement().getName().getLocalPart(); - case END_ELEMENT: - return current.asEndElement().getName().getLocalPart(); - } - return null; - } - - public Location getLocation() { - return current.getLocation(); - } - - public QName getName() { - checkElementState(); - switch (current.getEventType()) { - case START_ELEMENT: - return current.asStartElement().getName(); - case END_ELEMENT: - return current.asEndElement().getName(); - } - return null; - } - - public NamespaceContext getNamespaceContext() { - checkElementState(); - //return new TuscanyNamespaceContext(eventContext.get(getLocalName())); - return eventContext.get(getLocalName()); - } - - @SuppressWarnings("unchecked") - public int getNamespaceCount() { - int count = 0; - Iterator itr = current.asStartElement().getNamespaces(); - while (itr.hasNext()) { - count++; - itr.next(); - } - return count; - } - - @SuppressWarnings("unchecked") - public String getNamespacePrefix(int index) { - Iterator itr = current.asStartElement().getNamespaces(); - int level = 0; - Namespace ns = null; - while (itr.hasNext()) { - ns = itr.next(); - if (level == index) { - return ns.getPrefix(); - } - level++; - } - return null; - } - - public String getNamespaceURI() { - checkElementState(); - switch (current.getEventType()) { - case START_ELEMENT: - return current.asStartElement().getName().getNamespaceURI(); - case END_ELEMENT: - return current.asEndElement().getName().getNamespaceURI(); - } - return null; - } - - public String getNamespaceURI(String prefix) { - return getNamespaceContext().getNamespaceURI(prefix); - } - - @SuppressWarnings("unchecked") - public String getNamespaceURI(int index) { - Iterator itr = current.asStartElement().getNamespaces(); - int level = 0; - Namespace ns = null; - while (itr.hasNext()) { - ns = itr.next(); - if (level == index) { - return ns.getNamespaceURI(); - } - level++; - } - return null; - } - - public String getPIData() { - if (current.isProcessingInstruction()) { - ProcessingInstruction pi = (ProcessingInstruction) current; - return pi.getData(); - } else { - throw new IllegalStateException(current.toString()); - } - } - - public String getPITarget() { - if (current.isProcessingInstruction()) { - ProcessingInstruction pi = (ProcessingInstruction) current; - return pi.getTarget(); - } else { - throw new IllegalStateException(current.toString()); - } - } - - public String getPrefix() { - checkElementState(); - if (current.isStartElement()) { - return current.asStartElement().getName().getPrefix(); - } - return null; - } - - /* - * FIXME: Implementation pending... - * - * @see (non-Javadoc) - * javax.xml.stream.util.StreamReaderDelegate#getProperty(java.lang.String) - */ - public Object getProperty(String name) throws IllegalArgumentException { - // TODO Auto-generated method stub - - return null; - } - - public String getText() { - if (current.isCharacters()) { - return current.asCharacters().getData(); - } else { - throw new IllegalStateException(current.toString()); - } - } - - public char[] getTextCharacters() { - if (current.isCharacters()) { - return current.asCharacters().getData().toCharArray(); - } else { - throw new IllegalStateException(current.toString()); - } - } - - /* - * FIXME: Implementation pending... (non-Javadoc) - * - * @see javax.xml.stream.util.StreamReaderDelegate#getTextCharacters(int, - * char[], int, int) - */ - public int getTextCharacters(int sourceStart, char[] target, - int targetStart, int length) throws XMLStreamException { - // TODO Auto-generated method stub - return 0; - } - - /* - * FIXME:Implementaion can be improved (non-Javadoc) - * - * @see javax.xml.stream.util.StreamReaderDelegate#getTextLength() - */ - public int getTextLength() { - if (current.isCharacters()) { - return current.asCharacters().getData().length(); - } else { - throw new IllegalStateException(current.toString()); - } - } - - /* - * FIXME: Implementation pending... (non-Javadoc) - * - * @see javax.xml.stream.util.StreamReaderDelegate#getTextStart() - */ - public int getTextStart() { - // TODO Auto-generated method stub - return 0; - } - - /* - * FIXME: Implementation pending... (non-Javadoc) - * - * @see javax.xml.stream.util.StreamReaderDelegate#getTextStart() - */ - public String getVersion() { - // TODO Auto-generated method stub - - return null; - } - - public boolean hasName() { - return false; - } - - public boolean hasNext() throws XMLStreamException { - return iterator.hasNext() || state != END_DOCUMENT; - - } - - public boolean hasText() { - // TODO Auto-generated method stub - return false; - } - - /* - * FIXME: Implementation pending... (non-Javadoc) - * - * @see javax.xml.stream.util.StreamReaderDelegate#getTextStart() - */ - public boolean isAttributeSpecified(int index) { - // TODO Auto-generated method stub - return false; - } - - public boolean isCharacters() { - return current.isCharacters(); - } - - public boolean isEndElement() { - return current.isEndElement(); - } - - public boolean isStandalone() { - // TODO Auto-generated method stub - return false; - } - - public boolean isStartElement() { - return current.isStartElement(); - } - - public boolean isWhiteSpace() { - // TODO Auto-generated method stub - return false; - } - - public int next() throws XMLStreamException { - if (!hasNext()) { - throw new IllegalStateException("No more events"); - } - if (!iterator.hasNext()) { - state = END_DOCUMENT; - current = null; - return state; - } - current = iterator.next(); - state = current.getEventType(); - return state; - } - - public int nextTag() throws XMLStreamException { - return iterator.next().getEventType(); - } - - public void require(int type, String namespaceURI, String localName) - throws XMLStreamException { - boolean require = false; - String uri = getNamespaceURI(); - String name = getLocalName(); - if (state == type && namespaceURI.equals(uri) && localName.equals(name)) { - require = true; - } - if (require != true) { - throw new XMLStreamException(); - } - } - - public boolean standaloneSet() { - return false; - } - -} diff --git a/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/xml/XMLFragmentStreamReader.java b/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/xml/XMLFragmentStreamReader.java deleted file mode 100644 index 66361e1d76..0000000000 --- a/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/xml/XMLFragmentStreamReader.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.tuscany.sca.contribution.processor.xml; - -import javax.xml.namespace.NamespaceContext; -import javax.xml.namespace.QName; -import javax.xml.stream.XMLStreamReader; - -public interface XMLFragmentStreamReader extends XMLStreamReader { - QName NIL_QNAME = new QName("http://www.w3.org/2001/XMLSchema-instance", "nil", "xsi"); - String NIL_VALUE_TRUE = "true"; - - /** - * this will help to handle Text within the current element. user should - * pass the element text to the property list as this ELEMENT_TEXT as the - * key. This key deliberately has a space in it so that it is not a valid - * XML name - */ - String ELEMENT_TEXT = "Element Text"; - - /** - * Extra method to query the state of the pullparser - */ - boolean isDone(); - - /** - * add the parent namespace context to this parser - */ - void setParentNamespaceContext(NamespaceContext nsContext); - - /** - * Initiate the parser - this will do whatever the needed tasks to initiate - * the parser and must be called before attempting any specific parsing - * using this parser - */ - void init(); -} diff --git a/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/xml/XMLStreamSerializer.java b/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/xml/XMLStreamSerializer.java new file mode 100644 index 0000000000..7c8ba4296e --- /dev/null +++ b/java/sca/modules/contribution/src/main/java/org/apache/tuscany/sca/contribution/processor/xml/XMLStreamSerializer.java @@ -0,0 +1,287 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.tuscany.sca.contribution.processor.xml; + +import javax.xml.namespace.NamespaceContext; +import javax.xml.stream.XMLStreamConstants; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; +import javax.xml.stream.XMLStreamWriter; + +/** + * The XMLStreamSerializer pulls events from the XMLStreamReader and dumps into the XMLStreamWriter + * + * @version $Rev$ $Date$ + */ +public class XMLStreamSerializer implements XMLStreamConstants { + public static final String NAMESPACE_PREFIX = "ns"; + private static int namespaceSuffix; + + /* + * The behavior of the Serializer is such that it returns when it encounters the starting element for the second + * time. The depth variable tracks the depth of the Serializer and tells it when to return. Note that it is assumed + * that this Serialization starts on an Element. + */ + + /** + * Field depth + */ + private int depth; + + /** + * Generates a unique namespace prefix that is not in the scope of the NamespaceContext + * + * @param nsCtxt + * @return string + */ + private String generateUniquePrefix(NamespaceContext nsCtxt) { + String prefix = NAMESPACE_PREFIX + namespaceSuffix++; + // null should be returned if the prefix is not bound! + while (nsCtxt.getNamespaceURI(prefix) != null) { + prefix = NAMESPACE_PREFIX + namespaceSuffix++; + } + + return prefix; + } + + /** + * Method serialize. + * + * @param node + * @param writer + * @throws XMLStreamException + */ + public void serialize(XMLStreamReader node, XMLStreamWriter writer) throws XMLStreamException { + serializeNode(node, writer); + } + + /** + * @param reader + * @param writer + * @throws XMLStreamException + */ + protected void serializeAttributes(XMLStreamReader reader, XMLStreamWriter writer) throws XMLStreamException { + int count = reader.getAttributeCount(); + String prefix; + String namespaceName; + String writerPrefix; + for (int i = 0; i < count; i++) { + prefix = reader.getAttributePrefix(i); + namespaceName = reader.getAttributeNamespace(i); + /* + * Due to parser implementations returning null as the namespace URI (for the empty namespace) we need to + * make sure that we deal with a namespace name that is not null. The best way to work around this issue is + * to set the namespace URI to "" if it is null + */ + if (namespaceName == null) { + namespaceName = ""; + } + + writerPrefix = writer.getPrefix(namespaceName); + + if (!"".equals(namespaceName)) { + // prefix has already being declared but this particular + // attrib has a + // no prefix attached. So use the prefix provided by the + // writer + if (writerPrefix != null && (prefix == null || prefix.equals(""))) { + writer.writeAttribute(writerPrefix, namespaceName, reader.getAttributeLocalName(i), reader + .getAttributeValue(i)); + + // writer prefix is available but different from the + // current + // prefix of the attrib. We should be declaring the new + // prefix + // as a namespace declaration + } else if (prefix != null && !"".equals(prefix) && !prefix.equals(writerPrefix)) { + writer.writeNamespace(prefix, namespaceName); + writer.writeAttribute(prefix, namespaceName, reader.getAttributeLocalName(i), reader + .getAttributeValue(i)); + + // prefix is null (or empty), but the namespace name is + // valid! it has not + // being written previously also. So we need to generate + // a prefix + // here + } else if (prefix == null || prefix.equals("")) { + prefix = generateUniquePrefix(writer.getNamespaceContext()); + writer.writeNamespace(prefix, namespaceName); + writer.writeAttribute(prefix, namespaceName, reader.getAttributeLocalName(i), reader + .getAttributeValue(i)); + } else { + writer.writeAttribute(prefix, namespaceName, reader.getAttributeLocalName(i), reader + .getAttributeValue(i)); + } + } else { + // empty namespace is equal to no namespace! + writer.writeAttribute(reader.getAttributeLocalName(i), reader.getAttributeValue(i)); + } + + } + } + + /** + * Method serializeCData. + * + * @param reader + * @param writer + * @throws XMLStreamException + */ + protected void serializeCData(XMLStreamReader reader, XMLStreamWriter writer) throws XMLStreamException { + writer.writeCData(reader.getText()); + } + + /** + * Method serializeComment. + * + * @param reader + * @param writer + * @throws XMLStreamException + */ + protected void serializeComment(XMLStreamReader reader, XMLStreamWriter writer) throws XMLStreamException { + writer.writeComment(reader.getText()); + } + + /** + * @param reader + * @param writer + * @throws XMLStreamException + */ + protected void serializeElement(XMLStreamReader reader, XMLStreamWriter writer) throws XMLStreamException { + String prefix = reader.getPrefix(); + String nameSpaceName = reader.getNamespaceURI(); + if (nameSpaceName != null) { + String writerPrefix = writer.getPrefix(nameSpaceName); + if (writerPrefix != null) { + writer.writeStartElement(nameSpaceName, reader.getLocalName()); + } else { + if (prefix != null) { + writer.writeStartElement(prefix, reader.getLocalName(), nameSpaceName); + writer.writeNamespace(prefix, nameSpaceName); + // writer.setPrefix(prefix, nameSpaceName); + } else { + // [rfeng] We need to set default NS 1st before calling writeStateElement + writer.setDefaultNamespace(nameSpaceName); + writer.writeStartElement(nameSpaceName, reader.getLocalName()); + writer.writeDefaultNamespace(nameSpaceName); + } + } + } else { + writer.writeStartElement(reader.getLocalName()); + } + + // add the namespaces + int count = reader.getNamespaceCount(); + String namespacePrefix; + for (int i = 0; i < count; i++) { + namespacePrefix = reader.getNamespacePrefix(i); + // [rfeng] The following is commented out to allow to default ns + // if (namespacePrefix != null && namespacePrefix.length() == 0) { + // continue; + // } + + serializeNamespace(namespacePrefix, reader.getNamespaceURI(i), writer); + } + + // add attributes + serializeAttributes(reader, writer); + + } + + /** + * Method serializeEndElement. + * + * @param writer + * @throws XMLStreamException + */ + protected void serializeEndElement(XMLStreamWriter writer) throws XMLStreamException { + writer.writeEndElement(); + } + + /** + * Method serializeNamespace. + * + * @param prefix + * @param uri + * @param writer + * @throws XMLStreamException + */ + private void serializeNamespace(String prefix, String uri, XMLStreamWriter writer) throws XMLStreamException { + String prefix1 = writer.getPrefix(uri); + if (prefix1 == null) { + writer.writeNamespace(prefix, uri); + // writer.setPrefix(prefix, uri); + } + } + + /** + * Method serializeNode. + * + * @param reader + * @param writer + * @throws XMLStreamException + */ + protected void serializeNode(XMLStreamReader reader, XMLStreamWriter writer) throws XMLStreamException { + while (true) { + int event = reader.getEventType(); + if (event == START_ELEMENT) { + serializeElement(reader, writer); + depth++; + } else if (event == ATTRIBUTE) { + serializeAttributes(reader, writer); + } else if (event == CHARACTERS) { + serializeText(reader, writer); + } else if (event == COMMENT) { + serializeComment(reader, writer); + } else if (event == CDATA) { + serializeCData(reader, writer); + } else if (event == END_ELEMENT) { + serializeEndElement(writer); + depth--; + } else if (event == START_DOCUMENT) { + depth++; // if a start document is found then increment + writer.writeStartDocument(); + // the depth + } else if (event == END_DOCUMENT) { + if (depth != 0) { + depth--; // for the end document - reduce the depth + } + writer.writeEndDocument(); + } + if (depth == 0) { + break; + } + if (reader.hasNext()) { + reader.next(); + } else { + break; + } + } + } + + /** + * @param reader + * @param writer + * @throws XMLStreamException + */ + protected void serializeText(XMLStreamReader reader, XMLStreamWriter writer) throws XMLStreamException { + writer.writeCharacters(reader.getText()); + } +} diff --git a/java/sca/modules/contribution/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor b/java/sca/modules/contribution/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor index 9fcbca5c59..acebebb4e2 100644 --- a/java/sca/modules/contribution/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor +++ b/java/sca/modules/contribution/src/main/resources/META-INF/services/org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor @@ -17,7 +17,7 @@ # Implementation class for the artifact processor extension org.apache.tuscany.sca.contribution.xml.ContributionMetadataProcessor;qname=http://docs.oasis-open.org/ns/opencsa/sca/200903#contribution,model=org.apache.tuscany.sca.contribution.ContributionMetadata -org.apache.tuscany.sca.contribution.processor.xml.AnyElementProcessor;qname=http://www.w3.org/2001/XMLSchema#anyElement,model=java.lang.Object +org.apache.tuscany.sca.contribution.processor.xml.AnyElementProcessor;qname=http://www.w3.org/2001/XMLSchema#any,model=org.apache.tuscany.sca.assembly.Extension org.apache.tuscany.sca.contribution.namespace.impl.NamespaceImportProcessor;qname=http://docs.oasis-open.org/ns/opencsa/sca/200903#import,model=org.apache.tuscany.sca.contribution.namespace.NamespaceImport org.apache.tuscany.sca.contribution.namespace.impl.NamespaceExportProcessor;qname=http://docs.oasis-open.org/ns/opencsa/sca/200903#export,model=org.apache.tuscany.sca.contribution.namespace.NamespaceExport org.apache.tuscany.sca.contribution.java.impl.JavaImportProcessor;qname=http://docs.oasis-open.org/ns/opencsa/sca/200903#import.java,model=org.apache.tuscany.sca.contribution.java.JavaImport -- cgit v1.2.3