You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ws.apache.org by ve...@apache.org on 2016/02/08 00:39:16 UTC

svn commit: r1729052 - in /webservices/axiom/trunk: aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/ aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/ aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/co...

Author: veithen
Date: Sun Feb  7 23:39:16 2016
New Revision: 1729052

URL: http://svn.apache.org/viewvc?rev=1729052&view=rev
Log:
Redesign the CustomBuilder API so that it better fits into the new builder architecture.

Modified:
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/SAXResultContentHandler.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/BuilderHandler.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/StAXOMBuilder.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/SerializerImpl.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/intf/Serializer.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/mixin/AxiomSourcedElementSupport.aj
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/XmlHandler.java
    webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/XmlHandlerWrapper.java
    webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/om/ds/custombuilder/ByteArrayCustomBuilder.java
    webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/CustomBuilder.java
    webservices/axiom/trunk/src/site/markdown/release-notes/1.3.0.md
    webservices/axiom/trunk/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/builder/JAXBCustomBuilder.java
    webservices/axiom/trunk/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/soap/body/FirstElementNameWithParserTestCase.java
    webservices/axiom/trunk/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/soap/builder/TestRegisterCustomBuilderForPayload.java

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/SAXResultContentHandler.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/SAXResultContentHandler.java?rev=1729052&r1=1729051&r2=1729052&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/SAXResultContentHandler.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/SAXResultContentHandler.java Sun Feb  7 23:39:16 2016
@@ -20,12 +20,14 @@ package org.apache.axiom.om.impl.common;
 
 import org.apache.axiom.om.OMAttribute;
 import org.apache.axiom.om.OMContainer;
+import org.apache.axiom.om.OMDataSource;
 import org.apache.axiom.om.OMDocument;
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMException;
 import org.apache.axiom.om.OMFactory;
 import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMNode;
+import org.apache.axiom.om.impl.stream.StreamException;
 import org.apache.axiom.om.impl.stream.XmlHandler;
 
 public final  class SAXResultContentHandler implements XmlHandler {
@@ -117,4 +119,11 @@ public final  class SAXResultContentHand
             throw new UnsupportedOperationException();
         }
     }
+
+    @Override
+    public void processOMDataSource(String namespaceURI, String localName, OMDataSource dataSource)
+            throws StreamException {
+        // TODO
+        throw new UnsupportedOperationException();
+    }
 }

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/BuilderHandler.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/BuilderHandler.java?rev=1729052&r1=1729051&r2=1729052&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/BuilderHandler.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/BuilderHandler.java Sun Feb  7 23:39:16 2016
@@ -27,6 +27,8 @@ import javax.xml.stream.XMLStreamConstan
 import org.apache.axiom.core.CoreParentNode;
 import org.apache.axiom.core.NodeFactory;
 import org.apache.axiom.om.OMContainer;
+import org.apache.axiom.om.OMDataSource;
+import org.apache.axiom.om.OMException;
 import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.OMSerializable;
 import org.apache.axiom.om.OMXMLParserWrapper;
@@ -45,6 +47,7 @@ import org.apache.axiom.om.impl.intf.Axi
 import org.apache.axiom.om.impl.intf.AxiomNamespaceDeclaration;
 import org.apache.axiom.om.impl.intf.AxiomProcessingInstruction;
 import org.apache.axiom.om.impl.intf.AxiomSourcedElement;
+import org.apache.axiom.om.impl.stream.StreamException;
 import org.apache.axiom.om.impl.stream.XmlHandler;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -248,4 +251,20 @@ public final class BuilderHandler implem
         target = null;
         done = true;
     }
+
+    @Override
+    public void processOMDataSource(String namespaceURI, String localName, OMDataSource dataSource) throws StreamException {
+        Class<? extends AxiomElement> elementType = model.determineElementType(target, elementLevel+1, namespaceURI, localName);
+        Class<? extends AxiomSourcedElement> sourcedElementType;
+        if (elementType == AxiomElement.class) {
+            sourcedElementType = AxiomSourcedElement.class;
+        } else if (AxiomSourcedElement.class.isAssignableFrom(elementType)) {
+            sourcedElementType = elementType.asSubclass(AxiomSourcedElement.class);
+        } else {
+            throw new OMException("Cannot build an OMSourcedElement where a " + elementType.getName() + " is expected");
+        }
+        AxiomSourcedElement element = nodeFactory.createNode(sourcedElementType);
+        element.init(localName, new OMNamespaceImpl(namespaceURI, null), dataSource);
+        addChild(element);
+    }
 }

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/StAXOMBuilder.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/StAXOMBuilder.java?rev=1729052&r1=1729051&r2=1729052&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/StAXOMBuilder.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/builder/StAXOMBuilder.java Sun Feb  7 23:39:16 2016
@@ -24,6 +24,7 @@ import org.apache.axiom.ext.stax.DTDRead
 import org.apache.axiom.ext.stax.datahandler.DataHandlerReader;
 import org.apache.axiom.om.DeferredParsingException;
 import org.apache.axiom.om.OMContainer;
+import org.apache.axiom.om.OMDataSource;
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMException;
 import org.apache.axiom.om.OMFactory;
@@ -576,37 +577,35 @@ public class StAXOMBuilder extends Abstr
         String namespaceURI = normalize(parser.getNamespaceURI());
         String localName = parser.getLocalName();
         String prefix = normalize(parser.getPrefix());
-        OMElement newElement = null;
-        if (customBuilderForPayload != null && payloadSelector.isPayload(builderHandler.elementLevel+1, builderHandler.target)) {
-            newElement = createWithCustomBuilder(customBuilderForPayload);
+        if (customBuilderForPayload != null && payloadSelector.isPayload(builderHandler.elementLevel+1, builderHandler.target)
+                && createWithCustomBuilder(customBuilderForPayload)) {
+            return;
         }
-        if (newElement == null && customBuilders != null && builderHandler.elementLevel < this.maxDepthForCustomBuilders) {
+        if (customBuilders != null && builderHandler.elementLevel < this.maxDepthForCustomBuilders) {
             CustomBuilder customBuilder = customBuilders.get(namespaceURI, localName);
-            if (customBuilder != null) {
-                newElement = createWithCustomBuilder(customBuilder);
+            if (customBuilder != null && createWithCustomBuilder(customBuilder)) {
+                return;
             }
         }
-        if (newElement == null) {
-            handler.startElement(namespaceURI, localName, prefix);
-            for (int i = 0, count = parser.getNamespaceCount(); i < count; i++) {
-                handler.processNamespaceDeclaration(
-                        normalize(parser.getNamespacePrefix(i)),
-                        normalize(parser.getNamespaceURI(i)));
-            }
-            for (int i = 0, count = parser.getAttributeCount(); i < count; i++) {
-                handler.processAttribute(
-                        normalize(parser.getAttributeNamespace(i)),
-                        parser.getAttributeLocalName(i),
-                        normalize(parser.getAttributePrefix(i)),
-                        parser.getAttributeValue(i),
-                        parser.getAttributeType(i),
-                        parser.isAttributeSpecified(i));
-            }
-            handler.attributesCompleted();
+        handler.startElement(namespaceURI, localName, prefix);
+        for (int i = 0, count = parser.getNamespaceCount(); i < count; i++) {
+            handler.processNamespaceDeclaration(
+                    normalize(parser.getNamespacePrefix(i)),
+                    normalize(parser.getNamespaceURI(i)));
+        }
+        for (int i = 0, count = parser.getAttributeCount(); i < count; i++) {
+            handler.processAttribute(
+                    normalize(parser.getAttributeNamespace(i)),
+                    parser.getAttributeLocalName(i),
+                    normalize(parser.getAttributePrefix(i)),
+                    parser.getAttributeValue(i),
+                    parser.getAttributeType(i),
+                    parser.isAttributeSpecified(i));
         }
+        handler.attributesCompleted();
     }
     
-    private OMElement createWithCustomBuilder(CustomBuilder customBuilder) {
+    private boolean createWithCustomBuilder(CustomBuilder customBuilder) throws StreamException {
         
         String namespace = parser.getNamespaceURI();
         if (namespace == null) {
@@ -619,31 +618,22 @@ public class StAXOMBuilder extends Abstr
                       ", to the OMNode for {" + namespace + "}" + localPart);
         }
         
-        // TODO: dirty hack part 1
-        // The custom builder will use addNode to insert the new node into the tree. However,
-        // addNode is expected to always add the new child at the end and will attempt to
-        // build the parent node. We temporarily set complete to true to avoid this.
-        // There is really an incompatibility between the contract of addNode and the
-        // custom builder API. This should be fixed in Axiom 1.3.
-        builderHandler.target.setComplete(true);
-        
-        // Use target.getOMFactory() because the factory may actually be a SOAPFactory
-        OMElement node = customBuilder.create(namespace, localPart, builderHandler.target, parser, builderHandler.target.getOMFactory());
-        
-        // TODO: dirty hack part 2
-        builderHandler.target.setComplete(false);
-        
-        if (log.isDebugEnabled()) {
-            if (node != null) {
+        OMDataSource ds = customBuilder.create(parser);
+        if (ds == null) {
+            if (log.isDebugEnabled()) {
                 log.debug("The CustomBuilder, " + customBuilder.toString() + 
-                          "successfully constructed the OMNode for {" + namespace + "}" + localPart);
-            } else {
+                        " did not construct an OMDataSource for {" + namespace + "}" + localPart +
+                        ". The OMElement will be constructed using the installed stax om builder");
+            }
+            return false;
+        } else {
+            if (log.isDebugEnabled()) {
                 log.debug("The CustomBuilder, " + customBuilder.toString() + 
-                          " did not construct an OMNode for {" + namespace + "}" + localPart +
-                          ". The OMNode will be constructed using the installed stax om builder");
+                          "successfully constructed the OMDataSource for {" + namespace + "}" + localPart);
             }
+            handler.processOMDataSource(namespace, localPart, ds);
+            return true;
         }
-        return node;
     }
     
     private void createDTD() throws StreamException {

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/SerializerImpl.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/SerializerImpl.java?rev=1729052&r1=1729051&r2=1729052&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/SerializerImpl.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/common/serializer/push/SerializerImpl.java Sun Feb  7 23:39:16 2016
@@ -207,7 +207,7 @@ public abstract class SerializerImpl imp
      * @throws DeferredParsingException
      *             if an error occurs while reading from the data source
      */
-    public final void serialize(OMDataSource dataSource) throws StreamException {
+    public final void processOMDataSource(String namespaceURI, String localName, OMDataSource dataSource) throws StreamException {
         // Note: if we can't determine the type (push/pull) of the OMDataSource, we
         // default to push
         if (OMDataSourceUtil.isPullDataSource(dataSource)) {

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/intf/Serializer.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/intf/Serializer.java?rev=1729052&r1=1729051&r2=1729052&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/intf/Serializer.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/intf/Serializer.java Sun Feb  7 23:39:16 2016
@@ -21,7 +21,6 @@ package org.apache.axiom.om.impl.intf;
 import javax.xml.stream.XMLStreamReader;
 
 import org.apache.axiom.ext.stax.datahandler.DataHandlerReader;
-import org.apache.axiom.om.OMDataSource;
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.impl.stream.StreamException;
 import org.apache.axiom.om.impl.stream.XmlHandler;
@@ -29,5 +28,4 @@ import org.apache.axiom.om.impl.stream.X
 public interface Serializer extends XmlHandler {
     void serializeStartpart(OMElement element) throws StreamException;
     void copyEvent(XMLStreamReader reader, DataHandlerReader dataHandlerReader) throws StreamException;
-    void serialize(OMDataSource dataSource) throws StreamException;
 }

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/mixin/AxiomSourcedElementSupport.aj
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/mixin/AxiomSourcedElementSupport.aj?rev=1729052&r1=1729051&r2=1729052&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/mixin/AxiomSourcedElementSupport.aj (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/mixin/AxiomSourcedElementSupport.aj Sun Feb  7 23:39:16 2016
@@ -409,10 +409,11 @@ public aspect AxiomSourcedElementSupport
                 forceExpand();
                 defaultInternalSerialize(serializer, format, true);
             } else {
-                serializer.serialize(dataSource);
+                // TODO: the serializer ignores namespaceURI and localName
+                serializer.processOMDataSource(null, null, dataSource);
             }
         } else {
-            serializer.serialize(dataSource); 
+            serializer.processOMDataSource(null, null, dataSource); 
         }
     }
 

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/XmlHandler.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/XmlHandler.java?rev=1729052&r1=1729051&r2=1729052&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/XmlHandler.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/XmlHandler.java Sun Feb  7 23:39:16 2016
@@ -18,6 +18,8 @@
  */
 package org.apache.axiom.om.impl.stream;
 
+import org.apache.axiom.om.OMDataSource;
+
 public interface XmlHandler {
     void startDocument(String inputEncoding, String xmlVersion, String xmlEncoding, boolean standalone) throws StreamException;
     
@@ -45,4 +47,6 @@ public interface XmlHandler {
     void processCDATASection(String content) throws StreamException;
     
     void processEntityReference(String name, String replacementText) throws StreamException;
+    
+    void processOMDataSource(String namespaceURI, String localName, OMDataSource dataSource) throws StreamException;
 }

Modified: webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/XmlHandlerWrapper.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/XmlHandlerWrapper.java?rev=1729052&r1=1729051&r2=1729052&view=diff
==============================================================================
--- webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/XmlHandlerWrapper.java (original)
+++ webservices/axiom/trunk/aspects/om-aspects/src/main/java/org/apache/axiom/om/impl/stream/XmlHandlerWrapper.java Sun Feb  7 23:39:16 2016
@@ -18,6 +18,8 @@
  */
 package org.apache.axiom.om.impl.stream;
 
+import org.apache.axiom.om.OMDataSource;
+
 public class XmlHandlerWrapper implements XmlHandler {
     private final XmlHandler parent;
 
@@ -82,4 +84,9 @@ public class XmlHandlerWrapper implement
     public void processEntityReference(String name, String replacementText) throws StreamException {
         parent.processEntityReference(name, replacementText);
     }
+
+    public void processOMDataSource(String namespaceURI, String localName, OMDataSource dataSource)
+            throws StreamException {
+        parent.processOMDataSource(namespaceURI, localName, dataSource);
+    }
 }

Modified: webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/om/ds/custombuilder/ByteArrayCustomBuilder.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/om/ds/custombuilder/ByteArrayCustomBuilder.java?rev=1729052&r1=1729051&r2=1729052&view=diff
==============================================================================
--- webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/om/ds/custombuilder/ByteArrayCustomBuilder.java (original)
+++ webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/om/ds/custombuilder/ByteArrayCustomBuilder.java Sun Feb  7 23:39:16 2016
@@ -19,17 +19,12 @@
 
 package org.apache.axiom.om.ds.custombuilder;
 
-import org.apache.axiom.om.OMContainer;
-import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMDataSource;
 import org.apache.axiom.om.OMException;
-import org.apache.axiom.om.OMFactory;
-import org.apache.axiom.om.OMNamespace;
 import org.apache.axiom.om.ds.ByteArrayDataSource;
 import org.apache.axiom.om.impl.builder.CustomBuilder;
 import org.apache.axiom.om.impl.serialize.StreamingOMSerializer;
 import org.apache.axiom.om.util.StAXUtils;
-import org.apache.axiom.soap.SOAPFactory;
-import org.apache.axiom.soap.SOAPHeader;
 
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
@@ -56,14 +51,7 @@ public class ByteArrayCustomBuilder impl
         this.encoding = (encoding == null) ? "utf-8" :encoding;
     }
 
-    /* 
-     * Create an OMSourcedElement back by a ByteArrayDataSource
-     */
-    public OMElement create(String namespace, 
-                            String localPart, 
-                            OMContainer parent, 
-                            XMLStreamReader reader,
-                            OMFactory factory) throws OMException {
+    public OMDataSource create(XMLStreamReader reader) throws OMException {
         try {
             // Get the prefix of the start tag
             String prefix = reader.getPrefix();
@@ -80,22 +68,7 @@ public class ByteArrayCustomBuilder impl
             
             // Capture the written byte array as a ByteArrayDataSource
             byte[] bytes = baos.toByteArray();
-            String text = new String(bytes, "utf-8");
-            ByteArrayDataSource ds = new ByteArrayDataSource(bytes, encoding);
-            
-            // Create an OMSourcedElement backed by the ByteArrayDataSource
-            OMNamespace ns = factory.createOMNamespace(namespace, prefix);
-            
-            OMElement om = null;
-            if (parent instanceof SOAPHeader && factory instanceof SOAPFactory) {
-                om = ((SOAPFactory)factory).createSOAPHeaderBlock(localPart, ns, ds);
-            } else {
-                om = factory.createOMElement(ds, localPart, ns);
-            }
-            
-            // Add the new OMSourcedElement ot the parent
-            parent.addChild(om);
-            return om;
+            return new ByteArrayDataSource(bytes, encoding);
         } catch (XMLStreamException e) {
             throw new OMException(e);
         } catch (OMException e) {

Modified: webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/CustomBuilder.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/CustomBuilder.java?rev=1729052&r1=1729051&r2=1729052&view=diff
==============================================================================
--- webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/CustomBuilder.java (original)
+++ webservices/axiom/trunk/axiom-api/src/main/java/org/apache/axiom/om/impl/builder/CustomBuilder.java Sun Feb  7 23:39:16 2016
@@ -19,30 +19,25 @@
 
 package org.apache.axiom.om.impl.builder;
 
-import org.apache.axiom.om.OMContainer;
-import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMDataSource;
 import org.apache.axiom.om.OMException;
-import org.apache.axiom.om.OMFactory;
-import javax.xml.stream.XMLStreamReader;
-
+import org.apache.axiom.om.OMXMLParserWrapper;
 
+import javax.xml.stream.XMLStreamReader;
 
 /**
- * A Custom Builder is registered on the StAXBuilder for a particular QName or payload.
- * When the QName or payload is encountered, the CustomBuilder will build the OMElement
- * or OMSourcedElement for the StAXBuilder.  
+ * A Custom Builder is registered on the {@link OMXMLParserWrapper} for a particular QName or payload.
+ * When the QName or payload is encountered, the CustomBuilder will build an {@link OMDataSource}
+ * for the builder.
  *
  * @see CustomBuilderSupport#registerCustomBuilder(javax.xml.namespace.QName, int, CustomBuilder)
  * @see CustomBuilderSupport#registerCustomBuilderForPayload(CustomBuilder)
  */
 public interface CustomBuilder {
     /**
-     * Create an OMElement for this whole subtree.
-     * A null is returned if the default StAXBuilder behavior should be used.
-     * @param namespace
-     *            the namespace URI, or the empty string if the element has no namespace
-     * @param localPart
-     * @param parent
+     * Create an {@link OMDataSource} for this whole subtree.
+     * A null is returned if the default builder behavior should be used.
+     * 
      * @param reader
      *            The stream reader to read the StAX events from. The data read
      *            from this reader always represents plain XML, even if the
@@ -86,12 +81,7 @@ public interface CustomBuilder {
      *            XOP encoded stream and wants to get access to the original reader, it should invoke
      *            {@link org.apache.axiom.util.stax.XMLStreamReaderUtils#getOriginalXMLStreamReader(XMLStreamReader)}
      *            after {@link org.apache.axiom.util.stax.xop.XOPUtils#getXOPEncodedStream(XMLStreamReader)}.
-     * @return null or OMElement
+     * @return null or OMDataSource
      */
-    public OMElement create(String namespace, 
-                            String localPart, 
-                            OMContainer parent, 
-                            XMLStreamReader reader,
-                            OMFactory factory)
-        throws OMException;
+    public OMDataSource create(XMLStreamReader reader) throws OMException;
 }

Modified: webservices/axiom/trunk/src/site/markdown/release-notes/1.3.0.md
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/src/site/markdown/release-notes/1.3.0.md?rev=1729052&r1=1729051&r2=1729052&view=diff
==============================================================================
--- webservices/axiom/trunk/src/site/markdown/release-notes/1.3.0.md (original)
+++ webservices/axiom/trunk/src/site/markdown/release-notes/1.3.0.md Sun Feb  7 23:39:16 2016
@@ -54,3 +54,7 @@ Changes in this release
 
 *   Elements no longer store line number information, and the corresponding
     methods on the `OMElement` interface have been deprecated.
+
+*   The `CustomBuilder` API has changed in an incompatible way. Note that this
+    API was designed to enable some very specific optimizations in Axis2, so
+    that this change should have limited impact.

Modified: webservices/axiom/trunk/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/builder/JAXBCustomBuilder.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/builder/JAXBCustomBuilder.java?rev=1729052&r1=1729051&r2=1729052&view=diff
==============================================================================
--- webservices/axiom/trunk/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/builder/JAXBCustomBuilder.java (original)
+++ webservices/axiom/trunk/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/om/builder/JAXBCustomBuilder.java Sun Feb  7 23:39:16 2016
@@ -24,13 +24,13 @@ import static org.junit.Assert.assertTru
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.JAXBException;
 import javax.xml.bind.Unmarshaller;
-import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
+import javax.xml.stream.XMLStreamWriter;
 
-import org.apache.axiom.om.OMContainer;
-import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMDataSource;
 import org.apache.axiom.om.OMException;
-import org.apache.axiom.om.OMFactory;
+import org.apache.axiom.om.ds.AbstractPushOMDataSource;
 import org.apache.axiom.om.impl.builder.CustomBuilder;
 import org.apache.axiom.util.stax.xop.XOPEncodedStream;
 import org.apache.axiom.util.stax.xop.XOPUtils;
@@ -46,10 +46,11 @@ public class JAXBCustomBuilder implement
         this.expectBareReader = expectBareReader;
     }
 
-    public OMElement create(String namespaceURI, String localPart,
-            OMContainer parent, XMLStreamReader reader, OMFactory factory)
+    public OMDataSource create(XMLStreamReader reader)
             throws OMException {
         try {
+            final String namespaceURI = reader.getNamespaceURI();
+            final String localName = reader.getLocalName();
             XOPEncodedStream xopStream = XOPUtils.getXOPEncodedStream(reader);
             XMLStreamReader encodedReader = xopStream.getReader();
             if (expectBareReader) {
@@ -61,10 +62,20 @@ public class JAXBCustomBuilder implement
             AttachmentUnmarshallerImpl attachmentUnmarshaller = new AttachmentUnmarshallerImpl(xopStream.getMimePartProvider());
             unmarshaller.setAttachmentUnmarshaller(attachmentUnmarshaller);
             // For the purpose of the test we just store the JAXB object and return
-            // a dummy element. Normally, one would create an OMSourcedElement here.
+            // a dummy OMDataSource.
             jaxbObject = unmarshaller.unmarshal(encodedReader);
             attachmentsAccessed = attachmentUnmarshaller.isAccessed();
-            return factory.createOMElement(new QName(namespaceURI, localPart), parent);
+            return new AbstractPushOMDataSource() {
+                @Override
+                public boolean isDestructiveWrite() {
+                    return false;
+                }
+
+                @Override
+                public void serialize(XMLStreamWriter xmlWriter) throws XMLStreamException {
+                    xmlWriter.writeEmptyElement("ns1", localName, namespaceURI);
+                }
+            };
         } catch (JAXBException ex) {
             throw new OMException(ex);
         }

Modified: webservices/axiom/trunk/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/soap/body/FirstElementNameWithParserTestCase.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/soap/body/FirstElementNameWithParserTestCase.java?rev=1729052&r1=1729051&r2=1729052&view=diff
==============================================================================
--- webservices/axiom/trunk/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/soap/body/FirstElementNameWithParserTestCase.java (original)
+++ webservices/axiom/trunk/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/soap/body/FirstElementNameWithParserTestCase.java Sun Feb  7 23:39:16 2016
@@ -25,10 +25,8 @@ import javax.xml.stream.XMLStreamReader;
 
 import junit.framework.AssertionFailedError;
 
-import org.apache.axiom.om.OMContainer;
-import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMDataSource;
 import org.apache.axiom.om.OMException;
-import org.apache.axiom.om.OMFactory;
 import org.apache.axiom.om.OMMetaFactory;
 import org.apache.axiom.om.OMXMLBuilderFactory;
 import org.apache.axiom.om.impl.builder.CustomBuilder;
@@ -63,9 +61,7 @@ public abstract class FirstElementNameWi
             // To detect if the child element is instantiated or not, we register a custom
             // builder that throws an exception.
             ((CustomBuilderSupport)builder).registerCustomBuilderForPayload(new CustomBuilder() {
-                public OMElement create(String namespace, String localPart,
-                        OMContainer parent, XMLStreamReader reader, OMFactory factory)
-                        throws OMException {
+                public OMDataSource create(XMLStreamReader reader) throws OMException {
                     throw new AssertionFailedError("Custom builder called.");
                 }
             });

Modified: webservices/axiom/trunk/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/soap/builder/TestRegisterCustomBuilderForPayload.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/soap/builder/TestRegisterCustomBuilderForPayload.java?rev=1729052&r1=1729051&r2=1729052&view=diff
==============================================================================
--- webservices/axiom/trunk/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/soap/builder/TestRegisterCustomBuilderForPayload.java (original)
+++ webservices/axiom/trunk/testing/axiom-testsuite/src/main/java/org/apache/axiom/ts/soap/builder/TestRegisterCustomBuilderForPayload.java Sun Feb  7 23:39:16 2016
@@ -23,13 +23,18 @@ import static org.apache.axiom.truth.xml
 
 import java.io.ByteArrayInputStream;
 
+import javax.xml.stream.XMLStreamReader;
+
+import org.apache.axiom.om.OMDataSource;
 import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMException;
 import org.apache.axiom.om.OMMetaFactory;
 import org.apache.axiom.om.OMSourcedElement;
 import org.apache.axiom.om.ds.ByteArrayDataSource;
 import org.apache.axiom.om.ds.ByteArrayDataSource.ByteArray;
 import org.apache.axiom.om.ds.custombuilder.ByteArrayCustomBuilder;
 import org.apache.axiom.om.impl.builder.CustomBuilderSupport;
+import org.apache.axiom.soap.SOAPFault;
 import org.apache.axiom.soap.SOAPModelBuilder;
 import org.apache.axiom.ts.AxiomTestCase;
 import org.apache.axiom.ts.soap.SOAPSample;
@@ -48,10 +53,21 @@ public class TestRegisterCustomBuilderFo
     @Override
     protected void runTest() throws Throwable {
         SOAPModelBuilder builder = message.getAdapter(SOAPSampleAdapter.class).getBuilder(metaFactory);
-        ((CustomBuilderSupport)builder).registerCustomBuilderForPayload(new ByteArrayCustomBuilder("utf-8"));
+        ((CustomBuilderSupport)builder).registerCustomBuilderForPayload(new ByteArrayCustomBuilder("utf-8") {
+            @Override
+            public OMDataSource create(XMLStreamReader reader) throws OMException {
+                if (reader.getName().equals(message.getSOAPSpec().getFaultQName())) {
+                    return null;
+                } else {
+                    return super.create(reader);
+                }
+            }
+        });
         OMElement payload = builder.getSOAPEnvelope().getBody().getFirstElement();
         if (message.getPayload() == null) {
             assertNull(payload);
+        } else if (message.getPayload().getLocalName().equals("Fault")) {
+            assertTrue(payload instanceof SOAPFault);
         } else {
             assertTrue(payload instanceof OMSourcedElement);
             ByteArray byteArray = (ByteArray)((OMSourcedElement)payload).getObject(ByteArrayDataSource.class);