You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by dk...@apache.org on 2009/04/16 23:36:55 UTC

svn commit: r765773 [1/2] - in /cxf/trunk: common/common/src/main/java/org/apache/cxf/staxutils/ rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/ rt/core/src/main/java/org/apache/cxf/attachment/ rt/core/src/main/java/org/apache/cxf/data...

Author: dkulp
Date: Thu Apr 16 21:36:54 2009
New Revision: 765773

URL: http://svn.apache.org/viewvc?rev=765773&view=rev
Log:
[CXF-1907] First part of refactoring the dispatch/provider stuff to use the same runtime parts as the non-dispatch stuff
This gets the dispatch stuff fairly close.  Provider stuff is untouched.   More cruft will be removed when provider is done.

Added:
    cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/OverlayW3CDOMStreamWriter.java   (with props)
    cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/StaxSource.java   (with props)
    cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JaxwsClientCallback.java   (with props)
    cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JaxwsResponseCallback.java   (with props)
Removed:
    cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/BindingProviderImpl.java
Modified:
    cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/AbstractDOMStreamReader.java
    cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/StaxUtils.java
    cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/W3CDOMStreamReader.java
    cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/W3CDOMStreamWriter.java
    cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJOutInterceptor.java
    cxf/trunk/rt/core/src/main/java/org/apache/cxf/attachment/AttachmentSerializer.java
    cxf/trunk/rt/core/src/main/java/org/apache/cxf/databinding/source/XMLStreamDataWriter.java
    cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/DocLiteralInInterceptor.java
    cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBase.java
    cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java
    cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/io/DataReaderImpl.java
    cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/DispatchImpl.java
    cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JaxWsClientProxy.java
    cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/Messages.properties
    cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/ServiceImpl.java
    cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/logical/LogicalHandlerOutInterceptor.java
    cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/handler/logical/LogicalMessageImpl.java
    cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/interceptors/WrapperClassOutInterceptor.java
    cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/support/DummyImpl.java
    cxf/trunk/systests/src/test/java/org/apache/cxf/systest/dispatch/DispatchClientServerTest.java
    cxf/trunk/systests/src/test/java/org/apache/cxf/systest/handlers/DispatchHandlerInvocationTest.java

Modified: cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/AbstractDOMStreamReader.java
URL: http://svn.apache.org/viewvc/cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/AbstractDOMStreamReader.java?rev=765773&r1=765772&r2=765773&view=diff
==============================================================================
--- cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/AbstractDOMStreamReader.java (original)
+++ cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/AbstractDOMStreamReader.java Thu Apr 16 21:36:54 2009
@@ -76,16 +76,18 @@
             this.parent = parent;
             this.currentChild = ch;
         }
-        public ElementFrame(T doc) {
+        public ElementFrame(T doc, boolean s) {
             this.element = doc;
             parent = null;
-            started = true;
+            started = s;
             attributes = Collections.emptyList();
             prefixes = Collections.emptyList();
             uris = Collections.emptyList();
             allAttributes = Collections.emptyList();
         }
-        
+        public ElementFrame(T doc) {
+            this(doc, true);
+        }        
         public T getElement() {
             return element;
         }
@@ -96,7 +98,12 @@
         public void setCurrentChild(I o) {
             currentChild = o;
         }
-
+        public boolean isDocument() {
+            return false;
+        }
+        public boolean isDocumentFragment() {
+            return false;
+        }
     }
 
     /**
@@ -138,7 +145,7 @@
 
         if (!frame.started) {
             frame.started = true;
-            currentEvent = START_ELEMENT;
+            currentEvent = frame.isDocument() ? START_DOCUMENT : START_ELEMENT;
         } else if (frame.currentAttribute < getAttributeCount() - 1) {
             frame.currentAttribute++;
             currentEvent = ATTRIBUTE;
@@ -159,8 +166,12 @@
             }
         } else {
             frame.ended = true;
-            currentEvent = END_ELEMENT;
-            endElement();
+            if (frame.isDocument()) {
+                currentEvent = END_DOCUMENT;                
+            } else {
+                currentEvent = END_ELEMENT;
+                endElement();
+            }
         }
         return currentEvent;
     }
@@ -213,7 +224,8 @@
      * @see javax.xml.stream.XMLStreamReader#hasNext()
      */
     public boolean hasNext() throws XMLStreamException {
-        return !(frames.size() == 0 && frame.ended);
+        
+        return !(frame.ended && (frames.size() == 0 || frame.isDocumentFragment()));
 
     }
 

Added: cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/OverlayW3CDOMStreamWriter.java
URL: http://svn.apache.org/viewvc/cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/OverlayW3CDOMStreamWriter.java?rev=765773&view=auto
==============================================================================
--- cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/OverlayW3CDOMStreamWriter.java (added)
+++ cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/OverlayW3CDOMStreamWriter.java Thu Apr 16 21:36:54 2009
@@ -0,0 +1,112 @@
+/**
+ * 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.cxf.staxutils;
+
+
+import javax.xml.stream.XMLStreamException;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+import org.apache.cxf.common.util.StringUtils;
+
+
+/**
+ * Special StreamWriter that will "overlay" any write events onto the DOM.
+ * If the startElement ends up writing an element that already exists at that
+ * location, it will just walk into it instead of creating a new element
+ */
+public class OverlayW3CDOMStreamWriter extends W3CDOMStreamWriter {
+
+    public OverlayW3CDOMStreamWriter(Document document) {
+        super(document);
+    }
+
+    public OverlayW3CDOMStreamWriter(Element e) {
+        super(e);
+    }
+    
+    public void writeStartElement(String local) throws XMLStreamException {
+        Element nd = getCurrentNode();
+        Node nd2 = null;
+        if (nd == null) {
+            nd2 = getDocument().getDocumentElement();
+        } else {
+            nd2 = nd.getFirstChild();
+        }
+        while (nd2 != null) {
+            if (nd2.getNodeType() == Node.ELEMENT_NODE 
+                && local.equals(nd2.getLocalName())
+                && StringUtils.isEmpty(nd2.getNamespaceURI())) {
+                setChild((Element)nd2, false);
+                return;
+            }
+            nd2 = nd2.getNextSibling();
+        }
+        super.writeStartElement(local);
+    }
+
+    public void writeStartElement(String namespace, String local) throws XMLStreamException {
+        Element nd = getCurrentNode();
+        Node nd2 = null;
+        if (nd == null) {
+            nd2 = getDocument().getDocumentElement();
+        } else {
+            nd2 = nd.getFirstChild();
+        }
+        while (nd2 != null) {
+            if (nd2.getNodeType() == Node.ELEMENT_NODE 
+                && local.equals(nd2.getLocalName())
+                && namespace.equals(nd2.getNamespaceURI())) {
+                setChild((Element)nd2, false);
+                return;
+            }
+            nd2 = nd2.getNextSibling();
+        }
+        super.writeStartElement(namespace, local);
+    }
+
+    public void writeStartElement(String prefix, String local, String namespace) throws XMLStreamException {
+        if (prefix == null || prefix.equals("")) {
+            writeStartElement(namespace, local);
+        } else {
+            Element nd = getCurrentNode();
+            Node nd2 = null;
+            if (nd == null) {
+                nd2 = getDocument().getDocumentElement();
+            } else {
+                nd2 = nd.getFirstChild();
+            }
+            
+            while (nd2 != null) {
+                if (nd2.getNodeType() == Node.ELEMENT_NODE 
+                    && local.equals(nd2.getLocalName())
+                    && namespace.equals(nd2.getNamespaceURI())) {
+                    setChild((Element)nd2, false);
+                    return;
+                }
+                nd2 = nd2.getNextSibling();
+            }
+            super.writeStartElement(prefix, local, namespace);
+        }
+    }
+
+    
+}

Propchange: cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/OverlayW3CDOMStreamWriter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/OverlayW3CDOMStreamWriter.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/StaxSource.java
URL: http://svn.apache.org/viewvc/cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/StaxSource.java?rev=765773&view=auto
==============================================================================
--- cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/StaxSource.java (added)
+++ cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/StaxSource.java Thu Apr 16 21:36:54 2009
@@ -0,0 +1,281 @@
+/**
+ * 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.cxf.staxutils;
+
+import javax.xml.XMLConstants;
+import javax.xml.stream.XMLStreamConstants;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+import javax.xml.transform.sax.SAXSource;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.DTDHandler;
+import org.xml.sax.EntityResolver;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXNotRecognizedException;
+import org.xml.sax.SAXNotSupportedException;
+import org.xml.sax.SAXParseException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.ext.LexicalHandler;
+import org.xml.sax.helpers.AttributesImpl;
+
+public class StaxSource extends SAXSource implements XMLReader {
+
+    private XMLStreamReader streamReader;
+
+    private ContentHandler contentHandler;
+    
+    private LexicalHandler lexicalHandler;
+
+    public StaxSource(XMLStreamReader streamReader) {
+        this.streamReader = streamReader;
+        setInputSource(new InputSource());
+    }
+
+    public XMLReader getXMLReader() {
+        return this;
+    }
+
+    public XMLStreamReader getXMLStreamReader() {
+        return streamReader;
+    }
+
+    protected void parse() throws SAXException {
+        try {
+            while (true) {
+                switch (streamReader.getEventType()) {
+                // Attributes are handled in START_ELEMENT
+                case XMLStreamConstants.ATTRIBUTE:
+                    break;
+                case XMLStreamConstants.CDATA:
+                {
+                    if (lexicalHandler != null) {
+                        lexicalHandler.startCDATA();
+                    }
+                    int length = streamReader.getTextLength();
+                    int start = streamReader.getTextStart();
+                    char[] chars = streamReader.getTextCharacters();
+                    contentHandler.characters(chars, start, length);
+                    if (lexicalHandler != null) {
+                        lexicalHandler.endCDATA();
+                    }
+                    break;
+                }
+                case XMLStreamConstants.CHARACTERS:
+                {
+                    int length = streamReader.getTextLength();
+                    int start = streamReader.getTextStart();
+                    char[] chars = streamReader.getTextCharacters();
+                    contentHandler.characters(chars, start, length);
+                    break;
+                }
+                case XMLStreamConstants.SPACE:
+                {
+                    int length = streamReader.getTextLength();
+                    int start = streamReader.getTextStart();
+                    char[] chars = streamReader.getTextCharacters();
+                    contentHandler.ignorableWhitespace(chars, start, length);
+                    break;
+                }
+                case XMLStreamConstants.COMMENT:
+                    if (lexicalHandler != null) {
+                        int length = streamReader.getTextLength();
+                        int start = streamReader.getTextStart();
+                        char[] chars = streamReader.getTextCharacters();
+                        lexicalHandler.comment(chars, start, length);
+                    }
+                    break;
+                case XMLStreamConstants.DTD:
+                    break;
+                case XMLStreamConstants.END_DOCUMENT:
+                    contentHandler.endDocument();
+                    return;
+                case XMLStreamConstants.END_ELEMENT: {
+                    String uri = streamReader.getNamespaceURI();
+                    String localName = streamReader.getLocalName();
+                    String prefix = streamReader.getPrefix();
+                    String qname = prefix != null && prefix.length() > 0 
+                        ? prefix + ":" + localName : localName;
+                    contentHandler.endElement(uri, localName, qname);
+                    //for (int i = 0; i < streamReader.getNamespaceCount(); i++) {
+                    //    contentHandler.endPrefixMapping(streamReader.getNamespaceURI(i));
+                    //}
+                    break;
+                }
+                case XMLStreamConstants.ENTITY_DECLARATION:
+                case XMLStreamConstants.ENTITY_REFERENCE:
+                case XMLStreamConstants.NAMESPACE:
+                case XMLStreamConstants.NOTATION_DECLARATION:
+                    break;
+                case XMLStreamConstants.PROCESSING_INSTRUCTION:
+                    break;
+                case XMLStreamConstants.START_DOCUMENT:
+                    contentHandler.startDocument();
+                    break;
+                case XMLStreamConstants.START_ELEMENT: {
+                    //for (int i = 0; i < streamReader.getNamespaceCount(); i++) {
+                    //    contentHandler.startPrefixMapping(streamReader.getNamespacePrefix(i),
+                    //                                      streamReader.getNamespaceURI(i));
+                    //}
+                    String uri = streamReader.getNamespaceURI();
+                    String localName = streamReader.getLocalName();
+                    String prefix = streamReader.getPrefix();
+                    String qname = prefix != null && prefix.length() > 0 
+                        ? prefix + ":" + localName : localName;
+                    contentHandler.startElement(uri == null ? "" : uri, localName, qname, getAttributes());
+                    break;
+                }
+                default:
+                    break;
+                }
+                streamReader.next();
+            }
+        } catch (XMLStreamException e) {
+            SAXParseException spe;
+            if (e.getLocation() != null) {
+                spe = new SAXParseException(e.getMessage(), null, null,
+                                            e.getLocation().getLineNumber(),
+                                            e.getLocation().getColumnNumber(), e);
+            } else {
+                spe = new SAXParseException(e.getMessage(), null, null, -1, -1, e);
+            }
+            spe.initCause(e);
+            throw spe;
+        }
+    }
+
+    protected String getQualifiedName() {
+        String prefix = streamReader.getPrefix();
+        if (prefix != null && prefix.length() > 0) {
+            return prefix + ":" + streamReader.getLocalName();
+        } else {
+            return streamReader.getLocalName();
+        }
+    }
+
+    protected Attributes getAttributes() {
+        AttributesImpl attrs = new AttributesImpl();
+        // Adding namespace declaration as attributes is necessary because
+        // the xalan implementation that ships with SUN JDK 1.4 is bugged
+        // and does not handle the startPrefixMapping method
+        for (int i = 0; i < streamReader.getNamespaceCount(); i++) {
+            String prefix = streamReader.getNamespacePrefix(i);
+            String uri = streamReader.getNamespaceURI(i);
+            if (uri == null) {
+                uri = "";
+            }
+            // Default namespace
+            if (prefix == null || prefix.length() == 0) {
+                attrs.addAttribute(XMLConstants.DEFAULT_NS_PREFIX, 
+                                   null, 
+                                   XMLConstants.XMLNS_ATTRIBUTE, 
+                                   "CDATA", 
+                                   uri);
+            } else {
+                attrs.addAttribute(XMLConstants.XMLNS_ATTRIBUTE_NS_URI, 
+                                   prefix, 
+                                   XMLConstants.XMLNS_ATTRIBUTE + ":" + prefix, 
+                                   "CDATA", 
+                                   uri);
+            }
+        }
+        for (int i = 0; i < streamReader.getAttributeCount(); i++) {
+            String uri = streamReader.getAttributeNamespace(i);
+            String localName = streamReader.getAttributeLocalName(i);
+            String prefix = streamReader.getAttributePrefix(i);
+            String qName;
+            if (prefix != null && prefix.length() > 0) {
+                qName = prefix + ':' + localName;
+            } else {
+                qName = localName;
+            }
+            String type = streamReader.getAttributeType(i);
+            String value = streamReader.getAttributeValue(i);
+            if (value == null) {
+                value = "";
+            }
+
+            attrs.addAttribute(uri == null ? "" : uri, localName, qName, type, value);
+        }
+        return attrs;
+    }
+
+    public boolean getFeature(String name) throws SAXNotRecognizedException, SAXNotSupportedException {
+        return false;
+    }
+
+    public void setFeature(String name, boolean value) 
+        throws SAXNotRecognizedException, SAXNotSupportedException {
+    }
+
+    public Object getProperty(String name) throws SAXNotRecognizedException, SAXNotSupportedException {
+        return null;
+    }
+
+    public void setProperty(String name, Object value) 
+        throws SAXNotRecognizedException, SAXNotSupportedException {
+        if ("http://xml.org/sax/properties/lexical-handler".equals(name)) {
+            lexicalHandler = (LexicalHandler) value;
+        } else {
+            throw new SAXNotRecognizedException(name);
+        }
+    }
+
+    public void setEntityResolver(EntityResolver resolver) {
+    }
+
+    public EntityResolver getEntityResolver() {
+        return null;
+    }
+
+    public void setDTDHandler(DTDHandler handler) {
+    }
+
+    public DTDHandler getDTDHandler() {
+        return null;
+    }
+
+    public void setContentHandler(ContentHandler handler) {
+        this.contentHandler = handler;
+    }
+
+    public ContentHandler getContentHandler() {
+        return this.contentHandler;
+    }
+
+    public void setErrorHandler(ErrorHandler handler) {
+    }
+
+    public ErrorHandler getErrorHandler() {
+        return null;
+    }
+
+    public void parse(InputSource input) throws SAXException {
+        StaxSource.this.parse();
+    }
+
+    public void parse(String systemId) throws SAXException {
+        StaxSource.this.parse();
+    }
+
+}

Propchange: cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/StaxSource.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/StaxSource.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/StaxUtils.java
URL: http://svn.apache.org/viewvc/cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/StaxUtils.java?rev=765773&r1=765772&r2=765773&view=diff
==============================================================================
--- cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/StaxUtils.java (original)
+++ cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/StaxUtils.java Thu Apr 16 21:36:54 2009
@@ -54,6 +54,7 @@
 import org.w3c.dom.CDATASection;
 import org.w3c.dom.Comment;
 import org.w3c.dom.Document;
+import org.w3c.dom.DocumentFragment;
 import org.w3c.dom.Element;
 import org.w3c.dom.EntityReference;
 import org.w3c.dom.NamedNodeMap;
@@ -659,6 +660,15 @@
         case Node.DOCUMENT_NODE:
             writeDocument((Document)n, writer, repairing);
             break;
+        case Node.DOCUMENT_FRAGMENT_NODE: {
+            DocumentFragment frag = (DocumentFragment)n;
+            Node child = frag.getFirstChild();
+            while (child != null) {
+                writeNode(child, writer, repairing);
+                child = child.getNextSibling();
+            }
+            break;
+        }
         default:
             throw new IllegalStateException("Found type: " + n.getClass().getName());
         }        

Modified: cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/W3CDOMStreamReader.java
URL: http://svn.apache.org/viewvc/cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/W3CDOMStreamReader.java?rev=765773&r1=765772&r2=765773&view=diff
==============================================================================
--- cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/W3CDOMStreamReader.java (original)
+++ cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/W3CDOMStreamReader.java Thu Apr 16 21:36:54 2009
@@ -27,6 +27,7 @@
 import org.w3c.dom.Attr;
 
 import org.w3c.dom.Document;
+import org.w3c.dom.DocumentFragment;
 import org.w3c.dom.Element;
 import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
@@ -54,9 +55,21 @@
         this.document = element.getOwnerDocument();
     }
     public W3CDOMStreamReader(Document doc) {
-        super(new ElementFrame<Node, Node>(doc));
+        super(new ElementFrame<Node, Node>(doc, false) {
+            public boolean isDocument() {
+                return true;
+            }
+        });
         this.document = doc;
     }
+    public W3CDOMStreamReader(DocumentFragment docfrag) {
+        super(new ElementFrame<Node, Node>(docfrag, true) {
+            public boolean isDocumentFragment() {
+                return true;
+            }
+        });
+        this.document = docfrag.getOwnerDocument();
+    }
 
     /**
      * Get the document associated with this stream.

Modified: cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/W3CDOMStreamWriter.java
URL: http://svn.apache.org/viewvc/cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/W3CDOMStreamWriter.java?rev=765773&r1=765772&r2=765773&view=diff
==============================================================================
--- cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/W3CDOMStreamWriter.java (original)
+++ cxf/trunk/common/common/src/main/java/org/apache/cxf/staxutils/W3CDOMStreamWriter.java Thu Apr 16 21:36:54 2009
@@ -30,16 +30,18 @@
 
 import org.w3c.dom.Attr;
 import org.w3c.dom.Document;
+import org.w3c.dom.DocumentFragment;
 import org.w3c.dom.Element;
+import org.w3c.dom.Node;
 
 import org.apache.cxf.helpers.MapNamespaceContext;
 import org.apache.cxf.helpers.XMLUtils;
 
 public class W3CDOMStreamWriter implements XMLStreamWriter {
     static final String XML_NS = "http://www.w3.org/2000/xmlns/";
-    private Stack<Element> stack = new Stack<Element>();
+    private Stack<Node> stack = new Stack<Node>();
     private Document document;
-    private Element currentNode;
+    private Node currentNode;
     private NamespaceContext context = new W3CNamespaceContext();
     private boolean nsRepairing;
     private Map properties = Collections.EMPTY_MAP;
@@ -55,6 +57,10 @@
     public W3CDOMStreamWriter(Document document) {
         this.document = document;
     }
+    public W3CDOMStreamWriter(DocumentFragment frag) {
+        this.document = frag.getOwnerDocument();
+        currentNode = frag;
+    }
 
     public W3CDOMStreamWriter(Element e) {
         this.document = e.getOwnerDocument();
@@ -64,7 +70,16 @@
     }
     
     public Element getCurrentNode() {
-        return currentNode;
+        if (currentNode instanceof Element) {
+            return (Element)currentNode;
+        }
+        return null;
+    }
+    public DocumentFragment getCurrentFragment() {
+        if (currentNode instanceof DocumentFragment) {
+            return (DocumentFragment)currentNode;
+        }
+        return null;
     }
     
     public void setNsRepairing(boolean b) {
@@ -85,12 +100,19 @@
         newChild(document.createElement(local));
     }
 
-    private void newChild(Element element) {
+    protected void newChild(Element element) {
+        setChild(element, true);
+    }
+    protected void setChild(Element element, boolean append) {
         if (currentNode != null) {
             stack.push(currentNode);
-            currentNode.appendChild(element);
+            if (append) {
+                currentNode.appendChild(element);
+            }
         } else {
-            document.appendChild(element);
+            if (append) {
+                document.appendChild(element);
+            }
         }
         if (!(context instanceof W3CNamespaceContext)) {
             context = new W3CNamespaceContext();
@@ -117,24 +139,27 @@
 
     public void writeEmptyElement(String namespace, String local) throws XMLStreamException {
         writeStartElement(namespace, local);
+        writeEndElement();
     }
 
     public void writeEmptyElement(String prefix, String namespace, String local) throws XMLStreamException {
         writeStartElement(prefix, namespace, local);
+        writeEndElement();
     }
 
     public void writeEmptyElement(String local) throws XMLStreamException {
         writeStartElement(local);
+        writeEndElement();
     }
 
     public void writeEndElement() throws XMLStreamException {
         if (stack.size() > 0) {
-            currentNode = (Element)stack.pop();
+            currentNode = stack.pop();
         } else {
             currentNode = null;
         }
-        if (context instanceof W3CNamespaceContext) {
-            ((W3CNamespaceContext)context).setElement(currentNode);
+        if (context instanceof W3CNamespaceContext && currentNode instanceof Element) {
+            ((W3CNamespaceContext)context).setElement((Element)currentNode);
         } else if (context instanceof MapNamespaceContext) {
             ((MapNamespaceContext) context).setTargetNode(currentNode);
         }
@@ -146,7 +171,7 @@
     public void writeAttribute(String local, String value) throws XMLStreamException {
         Attr a = document.createAttribute(local);
         a.setValue(value);
-        currentNode.setAttributeNode(a);
+        ((Element)currentNode).setAttributeNode(a);
     }
 
     public void writeAttribute(String prefix, String namespace, String local, String value)
@@ -157,7 +182,7 @@
         
         Attr a = document.createAttributeNS(namespace, local);
         a.setValue(value);
-        currentNode.setAttributeNodeNS(a);
+        ((Element)currentNode).setAttributeNodeNS(a);
         if (nsRepairing
             && !prefix.equals(getNamespaceContext().getPrefix(namespace))) {
             writeNamespace(prefix, namespace);
@@ -167,7 +192,7 @@
     public void writeAttribute(String namespace, String local, String value) throws XMLStreamException {
         Attr a = document.createAttributeNS(namespace, local);
         a.setValue(value);
-        currentNode.setAttributeNodeNS(a);
+        ((Element)currentNode).setAttributeNodeNS(a);
     }
 
     public void writeNamespace(String prefix, String namespace) throws XMLStreamException {
@@ -176,14 +201,14 @@
         } else {
             Attr attr = document.createAttributeNS(XML_NS, "xmlns:" + prefix);
             attr.setValue(namespace);
-            currentNode.setAttributeNodeNS(attr);
+            ((Element)currentNode).setAttributeNodeNS(attr);
         }
     }
 
     public void writeDefaultNamespace(String namespace) throws XMLStreamException {
         Attr attr = document.createAttributeNS(XML_NS, "xmlns");
         attr.setValue(namespace);
-        currentNode.setAttributeNodeNS(attr);
+        ((Element)currentNode).setAttributeNodeNS(attr);
     }
 
     public void writeComment(String value) throws XMLStreamException {

Modified: cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJOutInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJOutInterceptor.java?rev=765773&r1=765772&r2=765773&view=diff
==============================================================================
--- cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJOutInterceptor.java (original)
+++ cxf/trunk/rt/bindings/soap/src/main/java/org/apache/cxf/binding/soap/saaj/SAAJOutInterceptor.java Thu Apr 16 21:36:54 2009
@@ -20,7 +20,8 @@
 package org.apache.cxf.binding.soap.saaj;
 
 
-import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.ResourceBundle;
@@ -61,10 +62,11 @@
  * SOAPMessage.
  */
 public class SAAJOutInterceptor extends AbstractSoapInterceptor {
-
-    private static final ResourceBundle BUNDLE = BundleUtils.getBundle(SAAJOutInterceptor.class);
-    private static final String ORIGINAL_XML_WRITER 
+    public static final String ORIGINAL_XML_WRITER 
         = SAAJOutInterceptor.class.getName() + ".original.xml.writer";
+    
+    private static final ResourceBundle BUNDLE = BundleUtils.getBundle(SAAJOutInterceptor.class);
+    
 
     public SAAJOutInterceptor() {
         super(Phase.PRE_PROTOCOL);
@@ -96,7 +98,7 @@
             } catch (SOAPException e) {
                 throw new SoapFault(new Message("SOAPEXCEPTION", BUNDLE), e, version.getSender());
             }
-        } else {
+        } else if (!message.containsKey(ORIGINAL_XML_WRITER)) {
             //as the SOAPMessage already has everything in place, we do not need XMLStreamWriter to write
             //anything for us, so we just set XMLStreamWriter's output to a dummy output stream.         
             try {
@@ -104,15 +106,20 @@
                 message.put(ORIGINAL_XML_WRITER, origWriter);
                 
                 XMLStreamWriter dummyWriter = StaxUtils.getXMLOutputFactory()
-                    .createXMLStreamWriter(new ByteArrayOutputStream());
+                    .createXMLStreamWriter(new OutputStream() {
+                        public void write(int b) throws IOException {
+                        }
+                        public void write(byte b[], int off, int len) throws IOException {
+                        }                        
+                    });
                 message.setContent(XMLStreamWriter.class, dummyWriter);
             } catch (XMLStreamException e) {
                 // do nothing
-            }
+            }   
         }
         
         // Add a final interceptor to write the message
-        message.getInterceptorChain().add(new SAAJOutEndingInterceptor());
+        message.getInterceptorChain().add(SAAJOutEndingInterceptor.INSTANCE);
     }
     @Override
     public void handleFault(SoapMessage message) {
@@ -120,11 +127,14 @@
         XMLStreamWriter writer = (XMLStreamWriter)message.get(ORIGINAL_XML_WRITER);
         if (writer != null) {
             message.setContent(XMLStreamWriter.class, writer);
+            message.remove(ORIGINAL_XML_WRITER);
         }
     }
 
     
-    public class SAAJOutEndingInterceptor extends AbstractSoapInterceptor {
+    public static class SAAJOutEndingInterceptor extends AbstractSoapInterceptor {
+        public static final SAAJOutEndingInterceptor INSTANCE = new SAAJOutEndingInterceptor();
+        
         public SAAJOutEndingInterceptor() {
             super(SAAJOutEndingInterceptor.class.getName(), Phase.PRE_PROTOCOL_ENDING);
         }
@@ -157,11 +167,14 @@
                 }
                 
                 XMLStreamWriter writer = (XMLStreamWriter)message.get(ORIGINAL_XML_WRITER);
-                try {
-                    StaxUtils.copy(new W3CDOMStreamReader(soapMessage.getSOAPPart()), writer);
-                    writer.flush();
-                    message.setContent(XMLStreamWriter.class, writer);
+                message.remove(ORIGINAL_XML_WRITER);
 
+                try {
+                    if (writer != null) {
+                        StaxUtils.copy(new W3CDOMStreamReader(soapMessage.getSOAPPart()), writer);
+                        writer.flush();
+                        message.setContent(XMLStreamWriter.class, writer);
+                    }
                 } catch (XMLStreamException e) {
                     throw new SoapFault(new Message("SOAPEXCEPTION", BUNDLE), e, message.getVersion()
                                         .getSender());

Modified: cxf/trunk/rt/core/src/main/java/org/apache/cxf/attachment/AttachmentSerializer.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/core/src/main/java/org/apache/cxf/attachment/AttachmentSerializer.java?rev=765773&r1=765772&r2=765773&view=diff
==============================================================================
--- cxf/trunk/rt/core/src/main/java/org/apache/cxf/attachment/AttachmentSerializer.java (original)
+++ cxf/trunk/rt/core/src/main/java/org/apache/cxf/attachment/AttachmentSerializer.java Thu Apr 16 21:36:54 2009
@@ -125,6 +125,10 @@
         writer.write("Content-Transfer-Encoding: binary\r\n");
 
         writer.write("Content-ID: <");
+        if (attachmentId.charAt(0) == '<'
+            && attachmentId.charAt(attachmentId.length() - 1) == '>') {
+            attachmentId = attachmentId.substring(1, attachmentId.length() - 2);
+        }
         writer.write(URLDecoder.decode(attachmentId, "UTF-8"));
         writer.write(">\r\n\r\n");
     }

Modified: cxf/trunk/rt/core/src/main/java/org/apache/cxf/databinding/source/XMLStreamDataWriter.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/core/src/main/java/org/apache/cxf/databinding/source/XMLStreamDataWriter.java?rev=765773&r1=765772&r2=765773&view=diff
==============================================================================
--- cxf/trunk/rt/core/src/main/java/org/apache/cxf/databinding/source/XMLStreamDataWriter.java (original)
+++ cxf/trunk/rt/core/src/main/java/org/apache/cxf/databinding/source/XMLStreamDataWriter.java Thu Apr 16 21:36:54 2009
@@ -30,6 +30,9 @@
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.validation.Schema;
 
+import org.w3c.dom.DocumentFragment;
+import org.w3c.dom.Node;
+
 import org.apache.cxf.common.i18n.Message;
 import org.apache.cxf.common.logging.LogUtils;
 import org.apache.cxf.databinding.DataWriter;
@@ -37,6 +40,7 @@
 import org.apache.cxf.message.Attachment;
 import org.apache.cxf.service.model.MessagePartInfo;
 import org.apache.cxf.staxutils.StaxUtils;
+import org.apache.cxf.staxutils.W3CDOMStreamWriter;
 
 public class XMLStreamDataWriter implements DataWriter<XMLStreamWriter> {
     private static final Logger LOG = LogUtils.getL7dLogger(XMLStreamDataWriter.class);
@@ -53,6 +57,22 @@
                 reader = StaxUtils.createXMLStreamReader(ds.getInputStream());
                 StaxUtils.copy(reader, writer);
                 reader.close();
+            } else if (obj instanceof Node) {
+                Node nd = (Node)obj;
+                if (writer instanceof W3CDOMStreamWriter
+                    && ((W3CDOMStreamWriter)writer).getCurrentNode() != null) {
+                    W3CDOMStreamWriter dw = (W3CDOMStreamWriter)writer;
+                    
+                    if (nd.getOwnerDocument() == dw.getDocument()) {
+                        dw.getCurrentNode().appendChild(nd);
+                        return;
+                    } else if (nd instanceof DocumentFragment) {
+                        nd = dw.getDocument().importNode(nd, true);
+                        dw.getCurrentNode().appendChild(nd);
+                        return;
+                    }
+                }
+                StaxUtils.writeNode(nd, writer, true);
             } else {
                 Source s = (Source) obj;
                 if (s instanceof DOMSource

Modified: cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/DocLiteralInInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/DocLiteralInInterceptor.java?rev=765773&r1=765772&r2=765773&view=diff
==============================================================================
--- cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/DocLiteralInInterceptor.java (original)
+++ cxf/trunk/rt/core/src/main/java/org/apache/cxf/interceptor/DocLiteralInInterceptor.java Thu Apr 16 21:36:54 2009
@@ -136,6 +136,9 @@
                             exchange.setOneWay(true);
                         }
                     }
+                    if (msgInfo == null) {
+                        return;
+                    }
                     setMessage(message, bop, client, si, msgInfo.getMessageInfo());
                 }
     

Modified: cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBase.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBase.java?rev=765773&r1=765772&r2=765773&view=diff
==============================================================================
--- cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBase.java (original)
+++ cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBase.java Thu Apr 16 21:36:54 2009
@@ -45,7 +45,6 @@
     protected JAXBContext context; 
     protected Schema schema;
     protected Collection<Attachment> attachments;
-    protected boolean unwrapJAXBElement = true;
     protected Integer mtomThreshold; // null if we should default.
     
     protected JAXBDataBase(JAXBContext ctx) {
@@ -84,9 +83,6 @@
     }
     
     public void setProperty(String prop, Object value) {
-        if (prop.equals(JAXBDataBinding.UNWRAP_JAXB_ELEMENT)) {
-            unwrapJAXBElement = Boolean.TRUE.equals(value);
-        }
     }
     
     protected Annotation[] getJAXBAnnotation(MessagePartInfo mpi) {

Modified: cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java?rev=765773&r1=765772&r2=765773&view=diff
==============================================================================
--- cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java (original)
+++ cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/JAXBDataBinding.java Thu Apr 16 21:36:54 2009
@@ -156,6 +156,7 @@
     private Marshaller.Listener marshallerListener;
     private ValidationEventHandler validationEventHandler;
     
+    private boolean unwrapJAXBElement = true;
 
     private boolean qualifiedSchemas;
     private Service service;
@@ -219,11 +220,11 @@
     public <T> DataReader<T> createReader(Class<T> c) {
         DataReader<T> dr = null;
         if (c == XMLStreamReader.class) {
-            dr = (DataReader<T>)new DataReaderImpl<XMLStreamReader>(this);
+            dr = (DataReader<T>)new DataReaderImpl<XMLStreamReader>(this, unwrapJAXBElement);
         } else if (c == XMLEventReader.class) {
-            dr = (DataReader<T>)new DataReaderImpl<XMLEventReader>(this);
+            dr = (DataReader<T>)new DataReaderImpl<XMLEventReader>(this, unwrapJAXBElement);
         } else if (c == Node.class) {
-            dr = (DataReader<T>)new DataReaderImpl<Node>(this);
+            dr = (DataReader<T>)new DataReaderImpl<Node>(this, unwrapJAXBElement);
         }
 
         return dr;
@@ -715,6 +716,14 @@
     }
 
     
+    public boolean isUnwrapJAXBElement() {
+        return unwrapJAXBElement;
+    }
+
+    public void setUnwrapJAXBElement(boolean unwrapJAXBElement) {
+        this.unwrapJAXBElement = unwrapJAXBElement;
+    }
+
     public static void clearCaches() {
         synchronized (JAXBCONTEXT_CACHE) {
             JAXBCONTEXT_CACHE.clear();

Modified: cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/io/DataReaderImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/io/DataReaderImpl.java?rev=765773&r1=765772&r2=765773&view=diff
==============================================================================
--- cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/io/DataReaderImpl.java (original)
+++ cxf/trunk/rt/databinding/jaxb/src/main/java/org/apache/cxf/jaxb/io/DataReaderImpl.java Thu Apr 16 21:36:54 2009
@@ -41,16 +41,22 @@
 public class DataReaderImpl<T> extends JAXBDataBase implements DataReader<T> {
     private static final Logger LOG = LogUtils.getLogger(JAXBDataBinding.class);
     JAXBDataBinding databinding;
+    boolean unwrapJAXBElement = true;
     
-    public DataReaderImpl(JAXBDataBinding binding) {
+    public DataReaderImpl(JAXBDataBinding binding, boolean unwrap) {
         super(binding.getContext());
+        unwrapJAXBElement = unwrap;
         databinding = binding;
     }
 
     public Object read(T input) {
         return read(null, input);
     }
-    
+    public void setProperty(String prop, Object value) {
+        if (prop.equals(JAXBDataBinding.UNWRAP_JAXB_ELEMENT)) {
+            unwrapJAXBElement = Boolean.TRUE.equals(value);
+        }
+    }
     private Unmarshaller createUnmarshaller() {
         try {
             Unmarshaller um = null;

Modified: cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/DispatchImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/DispatchImpl.java?rev=765773&r1=765772&r2=765773&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/DispatchImpl.java (original)
+++ cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/DispatchImpl.java Thu Apr 16 21:36:54 2009
@@ -20,31 +20,31 @@
 package org.apache.cxf.jaxws;
 
 import java.net.HttpURLConnection;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.Executor;
 import java.util.concurrent.Future;
-import java.util.concurrent.FutureTask;
-import java.util.logging.Level;
 import java.util.logging.Logger;
 
 import javax.activation.DataSource;
 import javax.xml.bind.JAXBContext;
 import javax.xml.namespace.QName;
-import javax.xml.soap.Detail;
+import javax.xml.soap.MessageFactory;
+import javax.xml.soap.SOAPConstants;
 import javax.xml.soap.SOAPException;
-import javax.xml.soap.SOAPFactory;
 import javax.xml.soap.SOAPFault;
 import javax.xml.soap.SOAPMessage;
+import javax.xml.soap.SOAPPart;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
 import javax.xml.transform.Source;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.sax.SAXSource;
+import javax.xml.transform.stream.StreamSource;
 import javax.xml.ws.AsyncHandler;
 import javax.xml.ws.Binding;
 import javax.xml.ws.BindingProvider;
 import javax.xml.ws.Dispatch;
+import javax.xml.ws.EndpointReference;
 import javax.xml.ws.Response;
 import javax.xml.ws.Service;
 import javax.xml.ws.WebServiceException;
@@ -54,72 +54,153 @@
 import javax.xml.ws.soap.SOAPBinding;
 import javax.xml.ws.soap.SOAPFaultException;
 
-import org.w3c.dom.Element;
+import org.w3c.dom.DocumentFragment;
 import org.w3c.dom.Node;
 
-import org.apache.cxf.Bus;
-import org.apache.cxf.BusFactory;
-import org.apache.cxf.binding.soap.SoapBinding;
-import org.apache.cxf.binding.soap.interceptor.SoapPreProtocolOutInterceptor;
+import org.apache.cxf.binding.soap.Soap11;
+import org.apache.cxf.binding.soap.SoapFault;
+import org.apache.cxf.binding.soap.SoapMessage;
+import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
+import org.apache.cxf.binding.soap.saaj.SAAJInInterceptor;
+import org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor;
+import org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor.SAAJOutEndingInterceptor;
+import org.apache.cxf.common.i18n.Message;
 import org.apache.cxf.common.logging.LogUtils;
 import org.apache.cxf.endpoint.Client;
-import org.apache.cxf.endpoint.ConduitSelector;
+import org.apache.cxf.endpoint.ClientCallback;
 import org.apache.cxf.endpoint.Endpoint;
-import org.apache.cxf.endpoint.UpfrontConduitSelector;
+import org.apache.cxf.interceptor.AttachmentOutInterceptor;
 import org.apache.cxf.interceptor.Fault;
-import org.apache.cxf.interceptor.Interceptor;
-import org.apache.cxf.interceptor.InterceptorProvider;
-import org.apache.cxf.interceptor.MessageSenderInterceptor;
+import org.apache.cxf.io.CachedOutputStream;
 import org.apache.cxf.jaxws.context.WrappedMessageContext;
-import org.apache.cxf.jaxws.handler.logical.DispatchLogicalHandlerInterceptor;
-import org.apache.cxf.jaxws.handler.soap.DispatchSOAPHandlerInterceptor;
-import org.apache.cxf.jaxws.interceptors.DispatchInDatabindingInterceptor;
-import org.apache.cxf.jaxws.interceptors.DispatchOutDatabindingInterceptor;
 import org.apache.cxf.jaxws.support.JaxWsEndpointImpl;
-import org.apache.cxf.message.Exchange;
-import org.apache.cxf.message.ExchangeImpl;
-import org.apache.cxf.message.Message;
+import org.apache.cxf.message.MessageContentsList;
 import org.apache.cxf.phase.Phase;
-import org.apache.cxf.phase.PhaseInterceptorChain;
-import org.apache.cxf.phase.PhaseManager;
-import org.apache.cxf.service.model.EndpointInfo;
-import org.apache.cxf.transport.MessageObserver;
-import org.apache.cxf.workqueue.WorkQueueManager;
+import org.apache.cxf.service.model.BindingInfo;
+import org.apache.cxf.service.model.BindingOperationInfo;
+import org.apache.cxf.service.model.MessageInfo;
+import org.apache.cxf.service.model.MessageInfo.Type;
+import org.apache.cxf.service.model.MessagePartInfo;
+import org.apache.cxf.service.model.OperationInfo;
+import org.apache.cxf.service.model.ServiceInfo;
+import org.apache.cxf.staxutils.OverlayW3CDOMStreamWriter;
+import org.apache.cxf.staxutils.StaxSource;
+import org.apache.cxf.staxutils.StaxUtils;
+import org.apache.cxf.staxutils.W3CDOMStreamReader;
+import org.apache.cxf.staxutils.W3CDOMStreamWriter;
 
-public class DispatchImpl<T> extends BindingProviderImpl implements Dispatch<T>, MessageObserver {
+public class DispatchImpl<T> implements Dispatch<T>, BindingProvider {
     private static final Logger LOG = LogUtils.getL7dLogger(DispatchImpl.class);
-    private static final String FINISHED = "exchange.finished";
+    
+    private final Binding binding;
+    private final EndpointReferenceBuilder builder;
 
-    private Bus bus;
-    private InterceptorProvider iProvider;
-    private Class<T> cl;
-    private Executor executor;
-    private JAXBContext context;
-    private Service.Mode mode;
+    private final Client client;
+    private final Class<T> cl;
+    private final JAXBContext context;
+    private Message error;
+    
+    DispatchImpl(Client client, Service.Mode m, JAXBContext ctx, Class<T> clazz) {
+        this.binding = ((JaxWsEndpointImpl)client.getEndpoint()).getJaxwsBinding();
+        this.builder = new EndpointReferenceBuilder((JaxWsEndpointImpl)client.getEndpoint());
 
-    private ConduitSelector conduitSelector;
-    
-    DispatchImpl(Bus b, Client client, Service.Mode m, JAXBContext ctx, Class<T> clazz, Executor e) {
-        super((JaxWsEndpointImpl)client.getEndpoint());
-        bus = b;
-        this.iProvider = client;
-        executor = e;
+        this.client = client;
         context = ctx;
         cl = clazz;
-        mode = m;
-        getConduitSelector().setEndpoint(client.getEndpoint());
         setupEndpointAddressContext(client.getEndpoint());
+        addInvokeOperation(false);
+        addInvokeOperation(true);
+        if (m == Service.Mode.MESSAGE && binding instanceof SOAPBinding) {
+            if (DataSource.class.isAssignableFrom(clazz)) {
+                error = new Message("DISPATCH_OBJECT_NOT_SUPPORTED", LOG,
+                                    "DataSource",
+                                    m,
+                                    "SOAP/HTTP");
+            } else if (m == Service.Mode.MESSAGE) {
+                client.getOutInterceptors().add(new SAAJOutInterceptor());
+                client.getOutInterceptors().add(new MessageModeOutInterceptor());
+                client.getInInterceptors().add(new SAAJInInterceptor());
+                client.getInInterceptors().add(new MessageModeInInterceptor(clazz));
+            }
+        } else if (m == Service.Mode.PAYLOAD 
+            && binding instanceof SOAPBinding
+            && SOAPMessage.class.isAssignableFrom(clazz)) {
+            error = new Message("DISPATCH_OBJECT_NOT_SUPPORTED", LOG,
+                                "SOAPMessage",
+                                m,
+                                "SOAP/HTTP");
+        } else if (DataSource.class.isAssignableFrom(clazz)
+            && binding instanceof HTTPBinding) {
+            error = new Message("DISPATCH_OBJECT_NOT_SUPPORTED", LOG,
+                                "DataSource",
+                                m,
+                                "XML/HTTP");            
+        }
+    }
+    
+    DispatchImpl(Client cl, Service.Mode m, Class<T> clazz) {
+        this(cl, m, null, clazz);
+    }
+    
+    private void addInvokeOperation(boolean oneWay) {
+        String name = oneWay ? "InvokeOneWay" : "Invoke";
+            
+        String ns = "http://cxf.apache.org/jaxws/dispatch";
+        ServiceInfo info = client.getEndpoint().getEndpointInfo().getService();
+        OperationInfo opInfo = info.getInterface()
+            .addOperation(new QName(ns, name));
+        MessageInfo mInfo = opInfo.createMessage(new QName(ns, name + "Request"), Type.INPUT);
+        opInfo.setInput(name + "Request", mInfo);
+        MessagePartInfo mpi = mInfo.addMessagePart("parameters");
+        if (context == null) {
+            mpi.setTypeClass(cl);
+        }
+        mpi.setElement(true);
+
+        if (!oneWay) {
+            mInfo = opInfo.createMessage(new QName(ns, name + "Response"), Type.OUTPUT);
+            opInfo.setOutput(name + "Response", mInfo);
+            mpi = mInfo.addMessagePart("parameters");
+            mpi.setElement(true);
+            if (context == null) {
+                mpi.setTypeClass(cl);
+            }
+        }
+        
+        for (BindingInfo bind : client.getEndpoint().getEndpointInfo().getService().getBindings()) {
+            BindingOperationInfo bo = new BindingOperationInfo(bind, opInfo);
+            bind.addOperation(bo);
+        }
     }
     
-    DispatchImpl(Bus b, Client cl, Service.Mode m, Class<T> clazz, Executor e) {
-        this(b, cl, m, null, clazz, e);
+    public Map<String, Object> getRequestContext() {
+        return new WrappedMessageContext(client.getRequestContext(),
+                                         null,
+                                         Scope.APPLICATION);
+    }
+    public Map<String, Object> getResponseContext() {
+        return new WrappedMessageContext(client.getResponseContext(),
+                                         null,
+                                         Scope.APPLICATION);
+    }
+    public Binding getBinding() {
+        return binding;
+    }
+    public EndpointReference getEndpointReference() {            
+        return builder.getEndpointReference();
+    }
+    public <X extends EndpointReference> X getEndpointReference(Class<X> clazz) {
+        return builder.getEndpointReference(clazz);
     }
 
     private void setupEndpointAddressContext(Endpoint endpoint) {
         //NOTE for jms transport the address would be null
         if (null != endpoint
             && null != endpoint.getEndpointInfo().getAddress()) {
-            Map<String, Object> requestContext = this.getRequestContext();
+            Map<String, Object> requestContext
+                = new WrappedMessageContext(client.getRequestContext(),
+                                            null,
+                                            Scope.APPLICATION);
             requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
                            endpoint.getEndpointInfo().getAddress());
         }    
@@ -128,312 +209,210 @@
         return invoke(obj, false);
     }
 
-    public T invoke(T obj, boolean isOneWay) {
-        if (LOG.isLoggable(Level.FINE)) {
-            LOG.fine("Dispatch: invoke called");
-        }
-
-        Bus origBus = BusFactory.getThreadDefaultBus(false);
-        BusFactory.setThreadDefaultBus(bus);
-        try { 
-            Endpoint endpoint = getEndpoint();
-            Message message = endpoint.getBinding().createMessage();
-    
-            if (context != null) {
-                message.setContent(JAXBContext.class, context);
-            }
-            
-            
-            Map<String, Object> reqContext = new HashMap<String, Object>();
-            WrappedMessageContext ctx = new WrappedMessageContext(reqContext,
-                                                                  null,
-                                                                  Scope.APPLICATION);
-            ctx.putAll(this.getRequestContext());
-            Map<String, Object> respContext = this.getResponseContext();
-            // clear the response context's hold information
-            // Not call the clear Context is to avoid the error 
-            // that getResponseContext() would be called by Client code first
-            respContext.clear();
-            
-            message.putAll(reqContext);
-            //need to do context mapping from jax-ws to cxf message
-            
-            Exchange exchange = new ExchangeImpl();
-            exchange.setOneWay(isOneWay);
-    
-            exchange.setOutMessage(message);
-            setExchangeProperties(exchange, endpoint);
-    
-            message.setContent(Object.class, obj);
-            
-            if (obj instanceof SOAPMessage) {
-                message.setContent(SOAPMessage.class, obj);
-            } else if (obj instanceof Source) {
-                message.setContent(Source.class, obj);
-            } else if (obj instanceof DataSource) {
-                message.setContent(DataSource.class, obj);
-            }
-      
-            message.put(Message.REQUESTOR_ROLE, Boolean.TRUE);
-    
-            PhaseInterceptorChain chain = getDispatchOutChain(endpoint);
-            message.setInterceptorChain(chain);
-    
-            // setup conduit selector
-            prepareConduitSelector(message);
-            
-            // execute chain
-            chain.doIntercept(message);
-            
-            Exception exp = message.getContent(Exception.class);
-            if (exp == null && exchange.getInMessage() != null) {
-                exp = exchange.getInMessage().getContent(Exception.class);
-            }
-
-            if (exp != null) {
-                getConduitSelector().complete(exchange);
-                if (getBinding() instanceof SOAPBinding && exp instanceof Fault) {
-                    try {
-                        SOAPFault soapFault = SOAPFactory.newInstance().createFault();
-                        Fault fault = (Fault)exp;
-                        soapFault.setFaultCode(fault.getFaultCode());
-                        soapFault.setFaultString(fault.getMessage());
-                        if (fault.getDetail() != null) {
-                            Detail det = soapFault.addDetail();
-                            Element fd = fault.getDetail();
-                            Node child = fd.getFirstChild();
-                            while (child != null) {
-                                Node next = child.getNextSibling();
-                                det.appendChild(det.getOwnerDocument().importNode(child, true));
-                                child = next;
-                            }
-                        }
-                        SOAPFaultException ex = new SOAPFaultException(soapFault);
-                        ex.initCause(exp);
-                        throw ex;
-                    } catch (SOAPException e) {
-                        throw new WebServiceException(e);
-                    }
-                } else if (getBinding() instanceof HTTPBinding) {
-                    HTTPException exception = new HTTPException(HttpURLConnection.HTTP_INTERNAL_ERROR);
-                    exception.initCause(exp);
-                    throw exception;
-                } else {
-                    throw new WebServiceException(exp);
+    private void checkError() {
+        if (error != null) {
+            if (getBinding() instanceof SOAPBinding) {
+                SOAPFault soapFault = null;
+                try {
+                    soapFault = JaxWsClientProxy.createSoapFault((SOAPBinding)getBinding(),
+                                                                 new Exception(error.toString()));
+                } catch (SOAPException e) {
+                    //ignore
                 }
-            }
-    
-            // correlate response        
-            if (getConduitSelector().selectConduit(message).getBackChannel() != null) {
-                // process partial response and wait for decoupled response
-            } else {
-                // process response: send was synchronous so when we get here we can assume that the 
-                // Exchange's inbound message is set and had been passed through the inbound
-                // interceptor chain.
-            }
-    
-            if (!isOneWay) {
-                synchronized (exchange) {
-                    Message inMsg = waitResponse(exchange);
-                    respContext.putAll(inMsg);
-                    getConduitSelector().complete(exchange);
-                    return cl.cast(inMsg.getContent(Object.class));
+                if (soapFault != null) {
+                    throw new SOAPFaultException(soapFault);
                 }
+            } else if (getBinding() instanceof HTTPBinding) {
+                HTTPException exception = new HTTPException(HttpURLConnection.HTTP_INTERNAL_ERROR);
+                exception.initCause(new Exception(error.toString()));
+                throw exception;
             }
-            return null;
-        } finally {
-            BusFactory.setThreadDefaultBus(origBus);
-        }        
+            throw new WebServiceException(error.toString());
+        }
     }
-
-    private Message waitResponse(Exchange exchange) {
-        while (!Boolean.TRUE.equals(exchange.get(FINISHED))) {
+    private RuntimeException mapException(Exception ex) {
+        if (getBinding() instanceof HTTPBinding) {
+            HTTPException exception = new HTTPException(HttpURLConnection.HTTP_INTERNAL_ERROR);
+            exception.initCause(ex);
+            return exception;
+        } else if (getBinding() instanceof SOAPBinding) {
+            SOAPFault soapFault = null;
             try {
-                exchange.wait();
-            } catch (InterruptedException e) {
-                //TODO - timeout
+                soapFault = JaxWsClientProxy.createSoapFault((SOAPBinding)getBinding(), ex);
+            } catch (SOAPException e) {
+                //ignore
             }
-        }
-        Message inMsg = exchange.getInMessage();
-        if (inMsg == null) {
-            try {
-                exchange.wait();
-            } catch (InterruptedException e) {
-                //TODO - timeout
+            if (soapFault == null) {
+                return new WebServiceException(ex);
             }
-            inMsg = exchange.getInMessage();
-        }
-        if (inMsg.getContent(Exception.class) != null) {
-            //TODO - exceptions 
-            throw new RuntimeException(inMsg.getContent(Exception.class));
+            
+            SOAPFaultException  exception = new SOAPFaultException(soapFault);
+            exception.initCause(ex);
+            return exception;                
         }
-        return inMsg;
+        return new WebServiceException(ex);
     }
-
-    private PhaseInterceptorChain getDispatchOutChain(Endpoint endpoint) {
-        PhaseManager pm = bus.getExtension(PhaseManager.class);
-        PhaseInterceptorChain chain = new PhaseInterceptorChain(pm.getOutPhases());
-
-        List<Interceptor> il = bus.getOutInterceptors();
-        if (LOG.isLoggable(Level.FINE)) {
-            LOG.fine("Interceptors contributed by bus: " + il);
-        }
-        chain.add(il);
-        List<Interceptor> i2 = iProvider.getOutInterceptors();
-        if (LOG.isLoggable(Level.FINE)) {
-            LOG.fine("Interceptors contributed by client: " + i2);
-        }
-        chain.add(i2);
-        
-        if (endpoint instanceof JaxWsEndpointImpl) {
-            Binding jaxwsBinding = ((JaxWsEndpointImpl)endpoint).getJaxwsBinding();
-            if (endpoint.getBinding() instanceof SoapBinding) {
-                chain.add(new DispatchSOAPHandlerInterceptor(jaxwsBinding));
-            } else {
-                // TODO: what for non soap bindings?
-            }       
-            chain.add(new DispatchLogicalHandlerInterceptor(jaxwsBinding));
-        }
-
-        if (getBinding() instanceof SOAPBinding) {
-            chain.add(new SoapPreProtocolOutInterceptor());
-        }
-
-        chain.add(new MessageSenderInterceptor());
-
-        chain.add(new DispatchOutDatabindingInterceptor(mode));
-        return chain;
-    }
-
-    public void onMessage(Message message) {
-        Endpoint endpoint = getEndpoint();
-        message = endpoint.getBinding().createMessage(message);
-
-        message.put(Message.REQUESTOR_ROLE, Boolean.TRUE);
-
-        PhaseManager pm = bus.getExtension(PhaseManager.class);
-        PhaseInterceptorChain chain = new PhaseInterceptorChain(pm.getInPhases());
-        message.setInterceptorChain(chain);
-
-        List<Interceptor> il = bus.getInInterceptors();
-        if (LOG.isLoggable(Level.FINE)) {
-            LOG.fine("Interceptors contributed by bus: " + il);
-        }
-        chain.add(il);
-        List<Interceptor> i2 = iProvider.getInInterceptors();
-        if (LOG.isLoggable(Level.FINE)) {
-            LOG.fine("Interceptors contributed by client: " + i2);
-        }
-        chain.add(i2);
-
-        if (endpoint instanceof JaxWsEndpointImpl) {
-            Binding jaxwsBinding = ((JaxWsEndpointImpl)endpoint).getJaxwsBinding();
-            if (endpoint.getBinding() instanceof SoapBinding) {
-                chain.add(new DispatchSOAPHandlerInterceptor(jaxwsBinding));
-            }      
-            DispatchLogicalHandlerInterceptor slhi 
-                = new DispatchLogicalHandlerInterceptor(jaxwsBinding, Phase.USER_LOGICAL);            
-            chain.add(slhi);
-        }
-
-        List<Interceptor> inInterceptors = new ArrayList<Interceptor>();
-        inInterceptors.add(new DispatchInDatabindingInterceptor(cl, mode));
-        chain.add(inInterceptors);
-
-        // execute chain
-        Bus origBus = BusFactory.getThreadDefaultBus(false);
-        BusFactory.setThreadDefaultBus(bus);
+    
+    @SuppressWarnings("unchecked")
+    public T invoke(T obj, boolean isOneWay) {
+        checkError();
         try {
-            chain.doIntercept(message);
-        } finally {
-            synchronized (message.getExchange()) {
-                message.getExchange().put(FINISHED, Boolean.TRUE);
-                message.getExchange().setInMessage(message);
-                message.getExchange().notifyAll();
+            if (obj instanceof SOAPMessage) {
+                SOAPMessage msg = (SOAPMessage)obj;
+                if (msg.countAttachments() > 0) {
+                    client.getRequestContext().put(AttachmentOutInterceptor.WRITE_ATTACHMENTS, Boolean.TRUE);
+                }
             }
-            BusFactory.setThreadDefaultBus(origBus);
-        }
-    }
-
-    private Executor getExecutor() {
-        if (executor == null) {
-            executor = bus.getExtension(WorkQueueManager.class).getAutomaticWorkQueue();
-        }
-        if (executor == null) {
-            System.err.println("Can't not get executor");
+            Object ret[] = client.invokeWrapped(new QName("http://cxf.apache.org/jaxws/dispatch",
+                                                          "Invoke" + (isOneWay ? "OneWay" : "")),
+                                                obj);
+            if (isOneWay) {
+                return null;
+            }
+            return (T)ret[0];
+        } catch (Exception ex) {
+            throw mapException(ex);
         }
-        return executor;
-    }
-    
-    private Endpoint getEndpoint() {
-        return getConduitSelector().getEndpoint();
     }
 
+  
     public Future<?> invokeAsync(T obj, AsyncHandler<T> asyncHandler) {
-        FutureTask<T> f = new FutureTask<T>(new DispatchAsyncCallable<T>(this, obj, asyncHandler));
-        getExecutor().execute(f);
-        
-        return f;
+        checkError();
+        client.setExecutor(getClient().getEndpoint().getExecutor());
+
+        ClientCallback callback = new JaxwsClientCallback<T>(asyncHandler);
+             
+        Response<T> ret = new JaxwsResponseCallback<T>(callback);
+        try {
+            client.invokeWrapped(callback, 
+                                 new QName("http://cxf.apache.org/jaxws/dispatch",
+                                       "Invoke"),
+                                       obj);
+            
+            return ret;
+        } catch (Exception ex) {
+            throw mapException(ex);
+        }
     }
 
+    @SuppressWarnings("unchecked")
     public Response<T> invokeAsync(T obj) {
-        FutureTask<T> f = new FutureTask<T>(new DispatchAsyncCallable<T>(this, obj, null));
-
-        getExecutor().execute(f);
-        return new AsyncResponse<T>(f, cl);
+        return (Response)invokeAsync(obj, null);
     }
 
     public void invokeOneWay(T obj) {
         invoke(obj, true);
     }
         
-    public synchronized ConduitSelector getConduitSelector() {
-        if (null == conduitSelector) {
-            conduitSelector = new UpfrontConduitSelector();
-        }
-        return conduitSelector;
-    }
-
-    public void setConduitSelector(ConduitSelector selector) {
-        conduitSelector = selector;
+    public Client getClient() {
+        return client;
     }
     
-    protected void prepareConduitSelector(Message message) {
-        message.getExchange().put(ConduitSelector.class, getConduitSelector());
-    }
     
-    protected void setExchangeProperties(Exchange exchange, Endpoint endpoint) {
-        exchange.put(Service.Mode.class, mode);
-        exchange.put(Class.class, cl);
-        exchange.put(org.apache.cxf.service.Service.class, endpoint.getService());
-        exchange.put(Endpoint.class, endpoint);
-        
-        exchange.put(MessageObserver.class, this);
-        exchange.put(Bus.class, bus);
-
-        if (endpoint != null) {
-
-            EndpointInfo endpointInfo = endpoint.getEndpointInfo();
+    static class MessageModeOutInterceptor extends AbstractSoapInterceptor {
+        public MessageModeOutInterceptor() {
+            super(Phase.PRE_PROTOCOL);
+            addBefore(SAAJOutInterceptor.class.getName());
+        }
 
-            QName serviceQName = endpointInfo.getService().getName();
-            exchange.put(Message.WSDL_SERVICE, serviceQName);
+        public void handleMessage(SoapMessage message) throws Fault {
+            MessageContentsList list = (MessageContentsList)message.getContent(List.class);
+            Object o = list.get(0);
+            SOAPMessage soapMessage = null;
+            
+            if (o instanceof SOAPMessage) {
+                soapMessage = (SOAPMessage)o;
+            } else {
+                try {
+                    MessageFactory factory = null;
+                    if (message.getVersion() instanceof Soap11) {
+                        factory = MessageFactory.newInstance();
+                    } else {
+                        factory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
+                    }
+                    
+                    soapMessage = factory.createMessage();
+                    SOAPPart part = soapMessage.getSOAPPart();
+                    if (o instanceof Source) {
+                        StaxUtils.copy((Source)o, new W3CDOMStreamWriter(part));
+                    }
+                } catch (SOAPException e) {
+                    throw new SoapFault("Error creating SOAPMessage", e, 
+                                        message.getVersion().getSender());
+                } catch (XMLStreamException e) {
+                    throw new SoapFault("Error creating SOAPMessage", e, 
+                                        message.getVersion().getSender());
+                }
+            }
+            message.setContent(SOAPMessage.class, soapMessage);
+            
+            if (!message.containsKey(SAAJOutInterceptor.ORIGINAL_XML_WRITER)) {
+                XMLStreamWriter origWriter = message.getContent(XMLStreamWriter.class);
+                message.put(SAAJOutInterceptor.ORIGINAL_XML_WRITER, origWriter);
+            }
+            W3CDOMStreamWriter writer = new OverlayW3CDOMStreamWriter(soapMessage.getSOAPPart());
+            // Replace stax writer with DomStreamWriter
+            message.setContent(XMLStreamWriter.class, writer);
+            message.setContent(SOAPMessage.class, soapMessage);
+            
+            DocumentFragment frag = soapMessage.getSOAPPart().createDocumentFragment();
+            try {
+                Node body = soapMessage.getSOAPBody();
+                Node nd = body.getFirstChild();
+                while (nd != null) {
+                    body.removeChild(nd);
+                    frag.appendChild(nd);
+                    nd = soapMessage.getSOAPBody().getFirstChild();
+                    list.set(0, frag);
+                }
+            } catch (Exception ex) {
+                throw new Fault(ex);
+            }
+            
+            
+            // Add a final interceptor to write the message
+            message.getInterceptorChain().add(SAAJOutEndingInterceptor.INSTANCE);
+        }
+        
+    }
 
-            QName interfaceQName = endpointInfo.getService().getInterface().getName();
-            exchange.put(Message.WSDL_INTERFACE, interfaceQName);
+    static class MessageModeInInterceptor extends AbstractSoapInterceptor {
+        Class<?> type;
+        public MessageModeInInterceptor(Class<?> c) {
+            super(Phase.POST_LOGICAL);
+            type = c;
+        }
 
-            QName portQName = endpointInfo.getName();
-            exchange.put(Message.WSDL_PORT, portQName);
-            URI wsdlDescription = endpointInfo.getProperty("URI", URI.class);
-            if (wsdlDescription == null) {
-                String address = endpointInfo.getAddress();
+        public void handleMessage(SoapMessage message) throws Fault {
+            SOAPMessage m = message.getContent(SOAPMessage.class);
+            MessageContentsList list = (MessageContentsList)message.getContent(List.class); 
+            if (list == null) {
+                list = new MessageContentsList();
+                message.setContent(List.class, list);
+            }
+            Object o = m;
+            
+            if (StreamSource.class.isAssignableFrom(type)) {
                 try {
-                    wsdlDescription = new URI(address + "?wsdl");
-                } catch (URISyntaxException e) {
-                    // do nothing
+                    CachedOutputStream out = new CachedOutputStream();
+                    try {
+                        XMLStreamWriter xsw = StaxUtils.createXMLStreamWriter(out);
+                        StaxUtils.copy(new DOMSource(m.getSOAPPart()), xsw);
+                        xsw.close();
+                        o = new StreamSource(out.getInputStream());
+                    } finally {
+                        out.close();
+                    }
+                } catch (Exception e) {
+                    throw new Fault(e);
                 }
-                endpointInfo.setProperty("URI", wsdlDescription);
+            } else if (SAXSource.class.isAssignableFrom(type)) {
+                o = new StaxSource(new W3CDOMStreamReader(m.getSOAPPart()));
+            } else if (Source.class.isAssignableFrom(type)) {
+                o = new DOMSource(m.getSOAPPart());
             }
-            exchange.put(Message.WSDL_DESCRIPTION, wsdlDescription);
-        }      
+            
+            list.set(0, o);
+        }
     }
 }

Modified: cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JaxWsClientProxy.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JaxWsClientProxy.java?rev=765773&r1=765772&r2=765773&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JaxWsClientProxy.java (original)
+++ cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JaxWsClientProxy.java Thu Apr 16 21:36:54 2009
@@ -25,10 +25,7 @@
 import java.net.HttpURLConnection;
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
 import java.util.logging.Logger;
 
 import javax.xml.soap.SOAPException;
@@ -100,7 +97,6 @@
         if (oi == null) {
             // check for method on BindingProvider and Object
             if (method.getDeclaringClass().equals(BindingProvider.class)
-                || method.getDeclaringClass().equals(BindingProviderImpl.class)
                 || method.getDeclaringClass().equals(Object.class)) {
                 try {
                     return method.invoke(this, params);
@@ -137,7 +133,7 @@
                 exception.initCause(ex);
                 throw exception;
             } else if (getBinding() instanceof SOAPBinding) {
-                SOAPFault soapFault = createSoapFault(ex);
+                SOAPFault soapFault = createSoapFault((SOAPBinding)getBinding(), ex);
                 if (soapFault == null) {
                     throw new WebServiceException(ex);
                 }
@@ -172,15 +168,15 @@
                 || Response.class.equals(m.getReturnType()));
     }
     
-    private SOAPFault createSoapFault(Exception ex) throws SOAPException {
+    static SOAPFault createSoapFault(SOAPBinding binding, Exception ex) throws SOAPException {
         SOAPFault soapFault;
         try {
-            soapFault = ((SOAPBinding)getBinding()).getSOAPFactory().createFault();
+            soapFault = binding.getSOAPFactory().createFault();
         } catch (Throwable t) {
             //probably an old version of saaj or something that is not allowing createFault 
             //method to work.  Try the saaj 1.2 method of doing this.
             try {
-                soapFault = ((SOAPBinding)getBinding()).getMessageFactory().createMessage()
+                soapFault = binding.getMessageFactory().createMessage()
                     .getSOAPBody().addFault();
             } catch (Throwable t2) {
                 //still didn't work, we'll just throw what we have
@@ -231,131 +227,11 @@
         }
         ClientCallback callback = new JaxwsClientCallback(handler);
              
-        Response<Object> ret = new ResponseCallback(callback);
+        Response<Object> ret = new JaxwsResponseCallback(callback);
         client.invoke(callback, oi, params);
         return ret;
     }
 
-    static class JaxwsClientCallback extends ClientCallback {
-        final AsyncHandler<Object> handler;
-        
-        public JaxwsClientCallback(final AsyncHandler<Object> handler) {
-            this.handler = handler;
-        }
-        public void handleResponse(Map<String, Object> ctx, Object[] res) {
-            context = ctx;
-            result = res;
-            if (handler != null) {
-                handler.handleResponse(new Response<Object>() {
-
-                    public Map<String, Object> getContext() {
-                        return context;
-                    }
-
-                    public boolean cancel(boolean mayInterruptIfRunning) {
-                        cancelled = true;
-                        return true;
-                    }
-
-                    public Object get() throws InterruptedException, ExecutionException {
-                        return result[0];
-                    }
-
-                    public Object get(long timeout, TimeUnit unit) throws InterruptedException,
-                        ExecutionException, TimeoutException {
-                        return result[0];
-                    }
-
-                    public boolean isCancelled() {
-                        return cancelled;
-                    }
-
-                    public boolean isDone() {
-                        return true;
-                    }
-                    
-                });
-            }
-            done = true;
-            synchronized (this) {
-                notifyAll();
-            }
-        }
-
-        @Override
-        public void handleException(Map<String, Object> ctx, final Throwable ex) {
-            context = ctx;
-            exception = ex;
-            if (handler != null) {
-                handler.handleResponse(new Response<Object>() {
-
-                    public Map<String, Object> getContext() {
-                        return context;
-                    }
-
-                    public boolean cancel(boolean mayInterruptIfRunning) {
-                        cancelled = true;
-                        return true;
-                    }
-
-                    public Object get() throws InterruptedException, ExecutionException {
-                        throw new ExecutionException(ex);
-                    }
-
-                    public Object get(long timeout, TimeUnit unit) 
-                        throws InterruptedException, ExecutionException, TimeoutException {
-                        
-                        throw new ExecutionException(ex);
-                    }
-
-                    public boolean isCancelled() {
-                        return cancelled;
-                    }
-
-                    public boolean isDone() {
-                        return true;
-                    }
-
-                });
-            }
-            done = true;
-            synchronized (this) {
-                notifyAll();
-            }
-        }
-    }
-    static class ResponseCallback implements Response<Object> {
-        ClientCallback callback;
-        public ResponseCallback(ClientCallback cb) {
-            callback = cb;
-        }
-        
-        public Map<String, Object> getContext() {
-            try {
-                return callback.getResponseContext();
-            } catch (Exception ex) {
-                return null;
-            }
-        }
-        public boolean cancel(boolean mayInterruptIfRunning) {
-            return callback.cancel(mayInterruptIfRunning);
-        }
-        public Object get() throws InterruptedException, ExecutionException {
-            return callback.get()[0];
-        }
-        public Object get(long timeout, TimeUnit unit) throws InterruptedException,
-            ExecutionException, TimeoutException {
-            return callback.get(timeout, unit)[0];
-        }
-        public boolean isCancelled() {
-            return callback.isCancelled();
-        }
-        public boolean isDone() {
-            return callback.isDone();
-        }
-    };
-
-    
     public Map<String, Object> getRequestContext() {
         return new WrappedMessageContext(this.getClient().getRequestContext(),
                                          null,

Added: cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JaxwsClientCallback.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JaxwsClientCallback.java?rev=765773&view=auto
==============================================================================
--- cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JaxwsClientCallback.java (added)
+++ cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JaxwsClientCallback.java Thu Apr 16 21:36:54 2009
@@ -0,0 +1,121 @@
+/**
+ * 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.cxf.jaxws;
+
+import java.util.Map;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+import javax.xml.ws.AsyncHandler;
+import javax.xml.ws.Response;
+
+import org.apache.cxf.endpoint.ClientCallback;
+
+class JaxwsClientCallback<T> extends ClientCallback {
+    final AsyncHandler<T> handler;
+    
+    public JaxwsClientCallback(final AsyncHandler<T> handler) {
+        this.handler = handler;
+    }
+    public void handleResponse(Map<String, Object> ctx, Object[] res) {
+        context = ctx;
+        result = res;
+        if (handler != null) {
+            handler.handleResponse(new Response<T>() {
+
+                public Map<String, Object> getContext() {
+                    return context;
+                }
+
+                public boolean cancel(boolean mayInterruptIfRunning) {
+                    cancelled = true;
+                    return true;
+                }
+
+                @SuppressWarnings("unchecked")
+                public T get() throws InterruptedException, ExecutionException {
+                    return (T)result[0];
+                }
+
+                @SuppressWarnings("unchecked")
+                public T get(long timeout, TimeUnit unit) throws InterruptedException,
+                    ExecutionException, TimeoutException {
+                    return (T)result[0];
+                }
+
+                public boolean isCancelled() {
+                    return cancelled;
+                }
+
+                public boolean isDone() {
+                    return true;
+                }
+                
+            });
+        }
+        done = true;
+        synchronized (this) {
+            notifyAll();
+        }
+    }
+
+    @Override
+    public void handleException(Map<String, Object> ctx, final Throwable ex) {
+        context = ctx;
+        exception = ex;
+        if (handler != null) {
+            handler.handleResponse(new Response<T>() {
+
+                public Map<String, Object> getContext() {
+                    return context;
+                }
+
+                public boolean cancel(boolean mayInterruptIfRunning) {
+                    cancelled = true;
+                    return true;
+                }
+
+                public T get() throws InterruptedException, ExecutionException {
+                    throw new ExecutionException(ex);
+                }
+
+                public T get(long timeout, TimeUnit unit) 
+                    throws InterruptedException, ExecutionException, TimeoutException {
+                    
+                    throw new ExecutionException(ex);
+                }
+
+                public boolean isCancelled() {
+                    return cancelled;
+                }
+
+                public boolean isDone() {
+                    return true;
+                }
+
+            });
+        }
+        done = true;
+        synchronized (this) {
+            notifyAll();
+        }
+    }
+}
\ No newline at end of file

Propchange: cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JaxwsClientCallback.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cxf/trunk/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/JaxwsClientCallback.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date