Author: veithen
Date: Wed Feb  6 21:27:23 2013
New Revision: 1443225

URL: http://svn.apache.org/viewvc?rev=1443225&view=rev
Log:
Simplified the StAX serialization code such that setPrefix is called together 
with writeNamespace. The original code separated these two calls to work around 
a non conformance in IBM's original StAX implementation (which is now handled 
by the StAX dialect mechanism).

Modified:
    
webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/push/Serializer.java
    
webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/push/sax/SAXSerializer.java
    
webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/push/stax/StAXSerializer.java

Modified: 
webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/push/Serializer.java
URL: 
http://svn.apache.org/viewvc/webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/push/Serializer.java?rev=1443225&r1=1443224&r2=1443225&view=diff
==============================================================================
--- 
webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/push/Serializer.java
 (original)
+++ 
webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/push/Serializer.java
 Wed Feb  6 21:27:23 2013
@@ -18,7 +18,6 @@
  */
 package org.apache.axiom.om.impl.common.serializer.push;
 
-import java.util.ArrayList;
 import java.util.Iterator;
 
 import javax.activation.DataHandler;
@@ -51,9 +50,6 @@ public abstract class Serializer {
     private static final String XSI_LOCAL_NAME = "type";
     
     private final OMElement contextElement;
-    private final ArrayList writePrefixList = new ArrayList();
-    private final ArrayList writeNSList = new ArrayList();
-    
     public Serializer(OMSerializable contextNode) {
         if (contextNode instanceof OMNode) {
             OMContainer parent = ((OMNode)contextNode).getParent();
@@ -76,7 +72,7 @@ public abstract class Serializer {
         }
         for (Iterator it = element.getAllDeclaredNamespaces(); it.hasNext(); ) 
{
             ns = (OMNamespace)it.next();
-            generateSetPrefix(ns.getPrefix(), ns.getNamespaceURI(), false);
+            addNamespaceIfNecessary(ns.getPrefix(), ns.getNamespaceURI(), 
false);
         }
         for (Iterator it = element.getAllAttributes(); it.hasNext(); ) {
             OMAttribute attr = (OMAttribute)it.next();
@@ -87,7 +83,7 @@ public abstract class Serializer {
                 processAttribute(ns.getPrefix(), ns.getNamespaceURI(), 
attr.getLocalName(), attr.getAttributeValue());
             }
         }
-        internalFinishStartElement();
+        finishStartElement();
     }
     
     private void copyEvent(XMLStreamReader reader, DataHandlerReader 
dataHandlerReader) throws OutputException {
@@ -109,7 +105,7 @@ public abstract class Serializer {
                 case XMLStreamReader.START_ELEMENT:
                     internalBeginStartElement(normalize(reader.getPrefix()), 
normalize(reader.getNamespaceURI()), reader.getLocalName());
                     for (int i=0, count=reader.getNamespaceCount(); i<count; 
i++) {
-                        
generateSetPrefix(normalize(reader.getNamespacePrefix(i)), 
normalize(reader.getNamespaceURI(i)), false);
+                        
addNamespaceIfNecessary(normalize(reader.getNamespacePrefix(i)), 
normalize(reader.getNamespaceURI(i)), false);
                     }
                     for (int i=0, count=reader.getAttributeCount(); i<count; 
i++) {
                         processAttribute(
@@ -118,7 +114,7 @@ public abstract class Serializer {
                                 reader.getAttributeLocalName(i),
                                 reader.getAttributeValue(i));
                     }
-                    internalFinishStartElement();
+                    finishStartElement();
                     break;
                 case XMLStreamReader.END_ELEMENT:
                     writeEndElement();
@@ -162,42 +158,32 @@ public abstract class Serializer {
     
     private void internalBeginStartElement(String prefix, String namespaceURI, 
String localName) throws OutputException {
         beginStartElement(prefix, namespaceURI, localName);
-        generateSetPrefix(prefix, namespaceURI, false);
+        addNamespaceIfNecessary(prefix, namespaceURI, false);
     }
     
     private void processAttribute(String prefix, String namespaceURI, String 
localName, String value) throws OutputException {
-        generateSetPrefix(prefix, namespaceURI, true);
+        addNamespaceIfNecessary(prefix, namespaceURI, true);
         if (contextElement != null && namespaceURI.equals(XSI_URI) && 
localName.equals(XSI_LOCAL_NAME)) {
             String trimmedValue = value.trim();
             if (trimmedValue.indexOf(":") > 0) {
                 String refPrefix = trimmedValue.substring(0, 
trimmedValue.indexOf(":"));
                 OMNamespace ns = contextElement.findNamespaceURI(refPrefix);
                 if (ns != null) {
-                    generateSetPrefix(refPrefix, ns.getNamespaceURI(), true);
+                    addNamespaceIfNecessary(refPrefix, ns.getNamespaceURI(), 
true);
                 }
             }
         }
-        writeAttribute(prefix, namespaceURI, localName, value);
-    }
-    
-    private void internalFinishStartElement() throws OutputException {
-        for (int i = 0; i < writePrefixList.size(); i++) {
-            writeNamespace((String)writePrefixList.get(i), 
(String)writeNSList.get(i));
-        }
-        writePrefixList.clear();
-        writeNSList.clear();
-        finishStartElement();
+        addAttribute(prefix, namespaceURI, localName, value);
     }
     
     /**
-     * Generate setPrefix/setDefaultNamespace if the prefix is not associated
+     * Add a namespace declaration if the prefix is not associated.
      *
      * @param prefix the namespace prefix; must not be <code>null</code>
      * @param namespaceURI the namespace URI; must not be <code>null</code>
      * @param attr
-     * @return prefix name if a setPrefix/setDefaultNamespace is performed
      */
-    private void generateSetPrefix(String prefix, String namespaceURI, boolean 
attr) throws OutputException {
+    private void addNamespaceIfNecessary(String prefix, String namespaceURI, 
boolean attr) throws OutputException {
         // If the prefix and namespace are already associated, no generation 
is needed
         if (isAssociated(prefix, namespaceURI)) {
             return;
@@ -209,13 +195,8 @@ public abstract class Serializer {
             return;
         }
         
-        // Generate setPrefix/setDefaultNamespace if the prefix is not 
associated.
-        setPrefix(prefix, namespaceURI);
-        // If this is a new association, remember it so that it can written 
out later
-        if (!writePrefixList.contains(prefix)) {
-            writePrefixList.add(prefix);
-            writeNSList.add(namespaceURI);
-        }
+        // Add the namespace if the prefix is not associated.
+        addNamespace(prefix, namespaceURI);
     }
     
     public final void serializeChildren(IContainer container, OMOutputFormat 
format, boolean cache) throws OutputException {
@@ -324,8 +305,6 @@ public abstract class Serializer {
     
     protected abstract boolean isAssociated(String prefix, String namespace) 
throws OutputException;
     
-    protected abstract void setPrefix(String prefix, String namespaceURI) 
throws OutputException;
-    
     public abstract void writeStartDocument(String version) throws 
OutputException;
     
     public abstract void writeStartDocument(String encoding, String version) 
throws OutputException;
@@ -334,8 +313,8 @@ public abstract class Serializer {
     
     /**
      * Prepare to write an element start tag. A call to this method will be 
followed by zero or more
-     * calls to {@link #writeNamespace(String, String)} and
-     * {@link #writeAttribute(String, String, String, String)} and a single 
call to
+     * calls to {@link #addNamespace(String, String)} and
+     * {@link #addAttribute(String, String, String, String)} and a single call 
to
      * {@link #finishStartElement()}.
      * 
      * @param prefix
@@ -348,9 +327,9 @@ public abstract class Serializer {
      */
     protected abstract void beginStartElement(String prefix, String 
namespaceURI, String localName) throws OutputException;
     
-    protected abstract void writeNamespace(String prefix, String namespaceURI) 
throws OutputException;
+    protected abstract void addNamespace(String prefix, String namespaceURI) 
throws OutputException;
     
-    protected abstract void writeAttribute(String prefix, String namespaceURI, 
String localName, String value) throws OutputException;
+    protected abstract void addAttribute(String prefix, String namespaceURI, 
String localName, String value) throws OutputException;
     
     protected abstract void finishStartElement() throws OutputException;
     

Modified: 
webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/push/sax/SAXSerializer.java
URL: 
http://svn.apache.org/viewvc/webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/push/sax/SAXSerializer.java?rev=1443225&r1=1443224&r2=1443225&view=diff
==============================================================================
--- 
webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/push/sax/SAXSerializer.java
 (original)
+++ 
webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/push/sax/SAXSerializer.java
 Wed Feb  6 21:27:23 2013
@@ -51,11 +51,6 @@ public class SAXSerializer extends Seria
         return nsContext.getNamespaceURI(prefix).equals(namespace);
     }
 
-    protected void setPrefix(String prefix, String namespaceURI) throws 
OutputException {
-        // TODO
-        throw new UnsupportedOperationException();
-    }
-
     public void writeStartDocument(String version) throws OutputException {
         // TODO
         throw new UnsupportedOperationException();
@@ -82,12 +77,12 @@ public class SAXSerializer extends Seria
         }
     }
 
-    protected void writeNamespace(String prefix, String namespaceURI) throws 
OutputException {
+    protected void addNamespace(String prefix, String namespaceURI) throws 
OutputException {
         // TODO
         throw new UnsupportedOperationException();
     }
 
-    protected void writeAttribute(String prefix, String namespaceURI, String 
localName, String value)
+    protected void addAttribute(String prefix, String namespaceURI, String 
localName, String value)
             throws OutputException {
         // TODO
         throw new UnsupportedOperationException();

Modified: 
webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/push/stax/StAXSerializer.java
URL: 
http://svn.apache.org/viewvc/webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/push/stax/StAXSerializer.java?rev=1443225&r1=1443224&r2=1443225&view=diff
==============================================================================
--- 
webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/push/stax/StAXSerializer.java
 (original)
+++ 
webservices/axiom/trunk/modules/axiom-common-impl/src/main/java/org/apache/axiom/om/impl/common/serializer/push/stax/StAXSerializer.java
 Wed Feb  6 21:27:23 2013
@@ -92,19 +92,21 @@ public class StAXSerializer extends Seri
         }
     }
 
-    protected void writeNamespace(String prefix, String namespaceURI) throws 
OutputException {
+    protected void addNamespace(String prefix, String namespaceURI) throws 
OutputException {
         try {
             if (prefix.length() != 0) {
                 writer.writeNamespace(prefix, namespaceURI);
+                writer.setPrefix(prefix, namespaceURI);
             } else {
                 writer.writeDefaultNamespace(namespaceURI);
+                writer.setDefaultNamespace(namespaceURI);
             }
         } catch (XMLStreamException ex) {
             throw new StAXOutputException(ex);
         }
     }
 
-    protected void writeAttribute(String prefix, String namespaceURI, String 
localName, String value) throws OutputException {
+    protected void addAttribute(String prefix, String namespaceURI, String 
localName, String value) throws OutputException {
         try {
             writer.writeAttribute(prefix, namespaceURI, localName, value);
         } catch (XMLStreamException ex) {
@@ -116,18 +118,6 @@ public class StAXSerializer extends Seri
         // Nothing to do here
     }
 
-    protected void setPrefix(String prefix, String namespaceURI) throws 
OutputException {
-        try {
-            if (prefix.length() == 0) {
-                writer.setDefaultNamespace(namespaceURI);
-            } else {
-                writer.setPrefix(prefix, namespaceURI);
-            }
-        } catch (XMLStreamException ex) {
-            throw new StAXOutputException(ex);
-        }
-    }
-
     /**
      * @param prefix 
      * @param namespace


Reply via email to