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 2010/05/18 22:55:42 UTC

svn commit: r945881 - in /cxf/branches/2.2.x-fixes: ./ api/src/main/java/org/apache/cxf/ws/addressing/ api/src/main/java/org/apache/cxf/wsdl/ rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/ rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/con...

Author: dkulp
Date: Tue May 18 20:55:42 2010
New Revision: 945881

URL: http://svn.apache.org/viewvc?rev=945881&view=rev
Log:
Merged revisions 945124 via svnmerge from 
https://svn.apache.org/repos/asf/cxf/trunk

........
  r945124 | dkulp | 2010-05-17 08:59:49 -0400 (Mon, 17 May 2010) | 1 line
  
  Start implementing some JAX-WS 2.2 things that can be implemented in 2.1
........

Modified:
    cxf/branches/2.2.x-fixes/   (props changed)
    cxf/branches/2.2.x-fixes/api/src/main/java/org/apache/cxf/ws/addressing/JAXWSAConstants.java
    cxf/branches/2.2.x-fixes/api/src/main/java/org/apache/cxf/wsdl/EndpointReferenceUtils.java
    cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/EndpointImpl.java
    cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/EndpointReferenceBuilder.java
    cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/ServiceImpl.java
    cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/context/WebServiceContextImpl.java
    cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/spi/ProviderImpl.java
    cxf/branches/2.2.x-fixes/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/ClientServerMiscTest.java

Propchange: cxf/branches/2.2.x-fixes/
            ('svn:mergeinfo' removed)

Propchange: cxf/branches/2.2.x-fixes/
------------------------------------------------------------------------------
Binary property 'svnmerge-integrated' - no diff available.

Modified: cxf/branches/2.2.x-fixes/api/src/main/java/org/apache/cxf/ws/addressing/JAXWSAConstants.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/api/src/main/java/org/apache/cxf/ws/addressing/JAXWSAConstants.java?rev=945881&r1=945880&r2=945881&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/api/src/main/java/org/apache/cxf/ws/addressing/JAXWSAConstants.java (original)
+++ cxf/branches/2.2.x-fixes/api/src/main/java/org/apache/cxf/ws/addressing/JAXWSAConstants.java Tue May 18 20:55:42 2010
@@ -30,6 +30,8 @@ public final class JAXWSAConstants {
     
     public static final String WSAW_PREFIX = "wsaw";
     public static final String NS_WSAW = "http://www.w3.org/2006/05/addressing/wsdl";
+    public static final String WSAM_PREFIX = "wsam";
+    public static final String NS_WSAM = "http://www.w3.org/2007/05/addressing/metadata";
 
     public static final QName WSAW_ACTION_QNAME = new QName(NS_WSAW,  "Action");
     
@@ -38,18 +40,19 @@ public final class JAXWSAConstants {
     public static final String NS_WSA = "http://www.w3.org/2005/08/addressing";
     public static final String WSA_PREFIX = "wsa";
     public static final String WSA_XSD = "http://www.w3.org/2006/03/addressing/ws-addr.xsd";
-    
     public static final String WSA_ERF_NAME = "EndpointReference";
     public static final String WSA_REFERENCEPARAMETERS_NAME = "ReferenceParameters";
     public static final String WSA_METADATA_NAME = "Metadata";
     public static final String WSA_ADDRESS_NAME = "Address";
         
-    public static final String WSAW_SERVICENAME_NAME = "ServiceName";
-    public static final String WSAW_INTERFACE_NAME = "InterfaceName";
-    public static final String WSAW_ENDPOINT_NAME = "EndpointName";    
+    public static final String WSAM_SERVICENAME_NAME = "ServiceName";
+    public static final String WSAM_INTERFACE_NAME = "InterfaceName";
+    public static final String WSAM_ENDPOINT_NAME = "EndpointName";    
 
 
-    
+    public static final String WSDLI_PFX = "wsdli";
+    public static final String WSDLI_WSDLLOCATION = "wsdlLocation";
+    public static final String NS_WSDLI = "http://www.w3.org/ns/wsdl-instance";
 
     /**
      * Well-known Property names for AddressingProperties in BindingProvider

Modified: cxf/branches/2.2.x-fixes/api/src/main/java/org/apache/cxf/wsdl/EndpointReferenceUtils.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/api/src/main/java/org/apache/cxf/wsdl/EndpointReferenceUtils.java?rev=945881&r1=945880&r2=945881&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/api/src/main/java/org/apache/cxf/wsdl/EndpointReferenceUtils.java (original)
+++ cxf/branches/2.2.x-fixes/api/src/main/java/org/apache/cxf/wsdl/EndpointReferenceUtils.java Tue May 18 20:55:42 2010
@@ -327,7 +327,8 @@ public final class EndpointReferenceUtil
             if (obj instanceof Element) {
                 Node node = (Element)obj;
                 if ((node.getNamespaceURI().equals(JAXWSAConstants.NS_WSAW)
-                    || node.getNamespaceURI().equals(NS_WSAW_2005))
+                    || node.getNamespaceURI().equals(NS_WSAW_2005)
+                    || node.getNamespaceURI().equals(JAXWSAConstants.NS_WSAM))
                     && node.getLocalName().equals("ServiceName")) {
                     String content = node.getTextContent();
                     String namespaceURI = node.getFirstChild().getNamespaceURI();
@@ -369,7 +370,8 @@ public final class EndpointReferenceUtil
                 if (obj instanceof Element) {
                     Node node = (Element)obj;
                     if ((node.getNamespaceURI().equals(JAXWSAConstants.NS_WSAW)
-                        || node.getNamespaceURI().equals(NS_WSAW_2005))
+                        || node.getNamespaceURI().equals(NS_WSAW_2005)
+                        || node.getNamespaceURI().equals(JAXWSAConstants.NS_WSAM))
                         && node.getNodeName().contains("ServiceName")) {
                         Node item = node.getAttributes().getNamedItem("EndpointName");
                         return item != null ? item.getTextContent() : null;
@@ -400,8 +402,9 @@ public final class EndpointReferenceUtil
                     Element node = (Element)obj;
                     if (node.getNodeName().contains("ServiceName")
                         && (node.getNamespaceURI().equals(JAXWSAConstants.NS_WSAW)
-                        || node.getNamespaceURI().equals(NS_WSAW_2005))) {
-                        node.setAttribute(JAXWSAConstants.WSAW_ENDPOINT_NAME, portName);
+                        || node.getNamespaceURI().equals(NS_WSAW_2005)
+                        || node.getNamespaceURI().equals(JAXWSAConstants.NS_WSAM))) {
+                        node.setAttribute(JAXWSAConstants.WSAM_ENDPOINT_NAME, portName);
                     }
                 } else if (obj instanceof JAXBElement) {
                     Object val = ((JAXBElement)obj).getValue();
@@ -447,7 +450,8 @@ public final class EndpointReferenceUtil
         for (Object obj : metadata.getAny()) {
             if (obj instanceof Element) {
                 Node node = (Element)obj;
-                if (node.getNamespaceURI().equals(JAXWSAConstants.NS_WSAW)
+                if ((node.getNamespaceURI().equals(JAXWSAConstants.NS_WSAW)
+                    || node.getNamespaceURI().equals(JAXWSAConstants.NS_WSAM))
                     && node.getNodeName().contains("InterfaceName")) {
                     
                     String content = node.getTextContent();

Modified: cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/EndpointImpl.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/EndpointImpl.java?rev=945881&r1=945880&r2=945881&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/EndpointImpl.java (original)
+++ cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/EndpointImpl.java Tue May 18 20:55:42 2010
@@ -20,6 +20,7 @@ package org.apache.cxf.jaxws;
 
 import java.security.AccessController;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -34,6 +35,7 @@ import javax.xml.transform.Source;
 import javax.xml.ws.Binding;
 import javax.xml.ws.EndpointReference;
 import javax.xml.ws.WebServiceException;
+import javax.xml.ws.WebServiceFeature;
 import javax.xml.ws.WebServicePermission;
 import javax.xml.ws.handler.Handler;
 import javax.xml.ws.http.HTTPBinding;
@@ -131,16 +133,25 @@ public class EndpointImpl extends javax.
      * WebService annotation. Optional.
      */
     public EndpointImpl(Bus b, Object i, String bindingUri, String wsdl) {
+        this(b, i, bindingUri, wsdl, null);
+    }
+    public EndpointImpl(Bus b, Object i, String bindingUri, String wsdl, WebServiceFeature f[]) {
         bus = b;
         implementor = i;
         this.bindingUri = bindingUri;
         wsdlLocation = wsdl == null ? null : new String(wsdl);
         serverFactory = new JaxWsServerFactoryBean();
+        if (f != null) {
+            ((JaxWsServiceFactoryBean)serverFactory.getServiceFactory()).setWsFeatures(Arrays.asList(f));
+        }
     }
         
     public EndpointImpl(Bus b, Object i, String bindingUri) {
         this(b, i, bindingUri, (String)null);
     }
+    public EndpointImpl(Bus b, Object i, String bindingUri, WebServiceFeature features[]) {
+        this(b, i, bindingUri, (String)null, features);
+    }
    
     public EndpointImpl(Bus bus, Object implementor) {
         this(bus, implementor, (String) null);
@@ -746,4 +757,11 @@ public class EndpointImpl extends javax.
                 .getName()).toString());
         }
     }
+    
+    /*
+    //new in 2.2, but introduces a new class not found in 2.1
+    public void setEndpointContext(EndpointContext ctxt) {
+        //TODO - JAXWS 2.2
+    }
+    */
 }

Modified: cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/EndpointReferenceBuilder.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/EndpointReferenceBuilder.java?rev=945881&r1=945880&r2=945881&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/EndpointReferenceBuilder.java (original)
+++ cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/EndpointReferenceBuilder.java Tue May 18 20:55:42 2010
@@ -50,10 +50,11 @@ public class EndpointReferenceBuilder {
         builder.address(this.endpoint.getEndpointInfo().getAddress());
         builder.serviceName(this.endpoint.getService().getName());
         builder.endpointName(this.endpoint.getEndpointInfo().getName());
-        
-        //TODO: get wsdlDocumentLocation
-        //builder.wsdlDocumentLocation(endpoint.getService().getServiceInfos().toString());        
-        
+        if (this.endpoint.getEndpointInfo().getService()
+                .getDescription() != null) {
+            builder.wsdlDocumentLocation(this.endpoint.getEndpointInfo().getService()
+                                         .getDescription().getBaseURI());
+        }
         return builder.build();
     }
 

Modified: cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/ServiceImpl.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/ServiceImpl.java?rev=945881&r1=945880&r2=945881&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/ServiceImpl.java (original)
+++ cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/ServiceImpl.java Tue May 18 20:55:42 2010
@@ -22,6 +22,7 @@ package org.apache.cxf.jaxws;
 import java.net.MalformedURLException;
 import java.net.URI;
 import java.net.URL;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
@@ -116,12 +117,13 @@ public class ServiceImpl extends Service
 
     private final Collection<QName> ports = new HashSet<QName>();
     private Map<QName, PortInfoImpl> portInfos = new HashMap<QName, PortInfoImpl>();
+    private WebServiceFeature serviceFeatures[];
 
-
-    public ServiceImpl(Bus b, URL url, QName name, Class<?> cls) {
+    public ServiceImpl(Bus b, URL url, QName name, Class<?> cls, WebServiceFeature ... f) {
         bus = b;
         this.serviceName = name;
         clazz = cls;
+        serviceFeatures = f;
         
         handlerResolver = new HandlerResolverImpl(bus, name, clazz);
         
@@ -220,6 +222,17 @@ public class ServiceImpl extends Service
         portInfos.put(portName, portInfo);
     }
 
+    private WebServiceFeature[] getAllFeatures(WebServiceFeature features[]) {
+        if (serviceFeatures == null || serviceFeatures.length == 0) {
+            return features;
+        } else if (features == null || features.length == 0) {
+            return serviceFeatures;
+        }
+        List<WebServiceFeature> f = new ArrayList<WebServiceFeature>(Arrays.asList(features));
+        f.addAll(Arrays.asList(serviceFeatures));
+        return f.toArray(new WebServiceFeature[f.size()]);
+    }
+    
     private JaxWsClientEndpointImpl getJaxwsEndpoint(QName portName, AbstractServiceFactoryBean sf, 
                                       WebServiceFeature...features) {
         Service service = sf.getService();
@@ -246,7 +259,8 @@ public class ServiceImpl extends Service
         }
 
         try {
-            return new JaxWsClientEndpointImpl(bus, service, ei, this, features);
+            return new JaxWsClientEndpointImpl(bus, service, ei, this,
+                                               getAllFeatures(features));
         } catch (EndpointException e) {
             throw new WebServiceException(e);
         }
@@ -392,7 +406,10 @@ public class ServiceImpl extends Service
         JaxWsClientFactoryBean clientFac = (JaxWsClientFactoryBean) proxyFac.getClientFactoryBean();
         JaxWsServiceFactoryBean serviceFactory = (JaxWsServiceFactoryBean) proxyFac.getServiceFactory();
         proxyFac.initFeatures();
-        serviceFactory.setWsFeatures(Arrays.asList(features));
+        WebServiceFeature f[] = getAllFeatures(features);
+        if (f != null) {
+            serviceFactory.setWsFeatures(Arrays.asList(f));
+        }
         
         proxyFac.setBus(bus);
         proxyFac.setServiceClass(serviceEndpointInterface);

Modified: cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/context/WebServiceContextImpl.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/context/WebServiceContextImpl.java?rev=945881&r1=945880&r2=945881&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/context/WebServiceContextImpl.java (original)
+++ cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/context/WebServiceContextImpl.java Tue May 18 20:55:42 2010
@@ -19,6 +19,8 @@
 
 package org.apache.cxf.jaxws.context;
 
+import java.net.URI;
+import java.net.URISyntaxException;
 import java.security.Principal;
 import java.util.logging.Logger;
 
@@ -70,7 +72,6 @@ public class WebServiceContextImpl imple
         return ctx.isUserInRole(role);
     }
     
-    //  TODO JAX-WS 2.1
     public EndpointReference getEndpointReference(Element... referenceParameters) {
         WrappedMessageContext ctx = (WrappedMessageContext)getMessageContext();
         org.apache.cxf.message.Message msg = ctx.getWrappedMessage();
@@ -80,8 +81,24 @@ public class WebServiceContextImpl imple
         builder.address(ep.getEndpointInfo().getAddress());
         builder.serviceName(ep.getService().getName());
         builder.endpointName(ep.getEndpointInfo().getName());
-
-//        builder.wsdlDocumentLocation(wsdlLocation);        
+        URI wsdlDescription = ep.getEndpointInfo().getProperty("URI", URI.class);
+        if (wsdlDescription == null) {
+            String address = ep.getEndpointInfo().getAddress();
+            try {
+                wsdlDescription = new URI(address + "?wsdl");
+            } catch (URISyntaxException e) {
+                // do nothing
+            }
+            ep.getEndpointInfo().setProperty("URI", wsdlDescription);
+        }
+        builder.wsdlDocumentLocation(wsdlDescription.toString());
+        
+        /*
+        if (ep.getEndpointInfo().getService().getDescription() != null) {
+            builder.wsdlDocumentLocation(ep.getEndpointInfo().getService()
+                                     .getDescription().getBaseURI());
+        }
+        */
         if (referenceParameters != null) {
             for (Element referenceParameter : referenceParameters) {
                 builder.referenceParameter(referenceParameter);

Modified: cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/spi/ProviderImpl.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/spi/ProviderImpl.java?rev=945881&r1=945880&r2=945881&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/spi/ProviderImpl.java (original)
+++ cxf/branches/2.2.x-fixes/rt/frontend/jaxws/src/main/java/org/apache/cxf/jaxws/spi/ProviderImpl.java Tue May 18 20:55:42 2010
@@ -19,9 +19,9 @@
 
 package org.apache.cxf.jaxws.spi;
 
-import java.io.IOException;
 import java.net.URL;
 import java.util.List;
+import java.util.Map;
 import java.util.logging.Logger;
 
 import javax.wsdl.Definition;
@@ -29,8 +29,6 @@ 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.XMLStreamWriter;
 import javax.xml.transform.Source;
 import javax.xml.ws.Endpoint;
 import javax.xml.ws.EndpointReference;
@@ -46,11 +44,11 @@ import org.apache.cxf.BusFactory;
 import org.apache.cxf.common.WSDLConstants;
 import org.apache.cxf.common.i18n.Message;
 import org.apache.cxf.common.logging.LogUtils;
-import org.apache.cxf.io.CachedOutputStream;
 import org.apache.cxf.jaxws.EndpointImpl;
 import org.apache.cxf.jaxws.EndpointUtils;
 import org.apache.cxf.jaxws.ServiceImpl;
 import org.apache.cxf.staxutils.StaxUtils;
+import org.apache.cxf.staxutils.W3CDOMStreamWriter;
 import org.apache.cxf.ws.addressing.JAXWSAConstants;
 import org.apache.cxf.wsdl.WSDLManager;
 
@@ -64,6 +62,16 @@ public class ProviderImpl extends javax.
         Bus bus = BusFactory.getThreadDefaultBus();
         return new ServiceImpl(bus, url, qname, cls);
     }
+    //new in 2.2
+    public ServiceDelegate createServiceDelegate(URL wsdlDocumentLocation,
+                                                 QName serviceName,
+                                                 Class serviceClass,
+                                                 WebServiceFeature ... features) {
+        Bus bus = BusFactory.getThreadDefaultBus();
+        return new ServiceImpl(bus, wsdlDocumentLocation,
+                               serviceName, serviceClass, features);
+        
+    }
 
     @Override
     public Endpoint createEndpoint(String bindingId, Object implementor) {
@@ -77,6 +85,19 @@ public class ProviderImpl extends javax.
             throw new WebServiceException(new Message("INVALID_IMPLEMENTOR_EXC", LOG).toString());
         }
     }
+    //new in 2.2
+    public Endpoint createEndpoint(String bindingId,
+                                   Object implementor,
+                                   WebServiceFeature ... features) {
+        EndpointImpl ep = null;
+        if (EndpointUtils.isValidImplementor(implementor)) {
+            Bus bus = BusFactory.getThreadDefaultBus();
+            ep = new EndpointImpl(bus, implementor, bindingId, features);
+            return ep;
+        } else {
+            throw new WebServiceException(new Message("INVALID_IMPLEMENTOR_EXC", LOG).toString());
+        }
+    }
 
     @Override
     public Endpoint createAndPublishEndpoint(String url, Object implementor) {
@@ -84,31 +105,53 @@ public class ProviderImpl extends javax.
         ep.publish(url);
         return ep;
     }
+    //new in 2.2
+    public Endpoint createAndPublishEndpoint(String address,
+                                             Object implementor, WebServiceFeature ... features) {
+        Endpoint ep = createEndpoint(null, implementor, features);
+        ep.publish(address);
+        return ep;
+    }
 
-    public W3CEndpointReference createW3CEndpointReference(String address, QName serviceName, QName portName,
+    public W3CEndpointReference createW3CEndpointReference(String address, 
+                                                           QName serviceName, 
+                                                           QName portName,
                                                            List<Element> metadata,
                                                            String wsdlDocumentLocation,
                                                            List<Element> referenceParameters) {
-        QName portType = null;
-        if (serviceName != null && portName != null && wsdlDocumentLocation != null) {
+        return createW3CEndpointReference(address, null, serviceName, portName,
+                                          metadata, wsdlDocumentLocation, referenceParameters,
+                                          null, null);
+    }
+    //CHECKSTYLE:OFF - spec requires a bunch of params
+    public W3CEndpointReference createW3CEndpointReference(String address,
+                                                           QName interfaceName, 
+                                                           QName serviceName, 
+                                                           QName portName,
+                                                           List<Element> metadata,
+                                                           String wsdlDocumentLocation,
+                                                           List<Element> referenceParameters,
+                                                           List<Element> elements,
+                                                           Map<QName, String> attributes) {
+        //CHECKSTYLE:ON
+        if (serviceName != null && portName != null 
+            && wsdlDocumentLocation != null && interfaceName == null) {
             Bus bus = BusFactory.getThreadDefaultBus();
             WSDLManager wsdlManager = bus.getExtension(WSDLManager.class);          
             try {
                 Definition def = wsdlManager.getDefinition(wsdlDocumentLocation);
-                portType = def.getService(serviceName).getPort(portName.getLocalPart()).getBinding()
+                interfaceName = def.getService(serviceName).getPort(portName.getLocalPart()).getBinding()
                     .getPortType().getQName();
             } catch (Exception e) {
                 // do nothing
             }
         }
-        CachedOutputStream cos = new CachedOutputStream();
-        XMLStreamWriter writer = StaxUtils.createXMLStreamWriter(cos);
+        if (serviceName == null && portName == null && address == null) {
+            throw new IllegalStateException("Address in an EPR cannot be null, "
+                                            + " when serviceName or portName is null");
+        }
         try {
-            // TODO: when serviceName/portName is null
-            if (serviceName == null && portName == null && address == null) {
-                throw new IllegalStateException("Address in an EPR cannot be null, "
-                                                + " when serviceName or portName is null");
-            }
+            W3CDOMStreamWriter writer = new W3CDOMStreamWriter();
             writer.setPrefix(JAXWSAConstants.WSA_PREFIX, JAXWSAConstants.NS_WSA);
             writer.writeStartElement(JAXWSAConstants.WSA_PREFIX, JAXWSAConstants.WSA_ERF_NAME,
                                      JAXWSAConstants.NS_WSA);
@@ -133,16 +176,25 @@ public class ProviderImpl extends javax.
             writer.writeStartElement(JAXWSAConstants.WSA_PREFIX, JAXWSAConstants.WSA_METADATA_NAME,
                                      JAXWSAConstants.NS_WSA);
             writer.writeNamespace(JAXWSAConstants.WSAW_PREFIX, JAXWSAConstants.NS_WSAW);
-
-            if (portType != null) {
-                writer.writeStartElement(JAXWSAConstants.WSAW_PREFIX, JAXWSAConstants.WSAW_INTERFACE_NAME,
-                                         JAXWSAConstants.NS_WSAW);
-                String portTypePrefix = portType.getPrefix();
+            writer.writeNamespace(JAXWSAConstants.WSAM_PREFIX, JAXWSAConstants.NS_WSAM);
+            if (wsdlDocumentLocation != null) {
+                writer.writeNamespace(JAXWSAConstants.WSDLI_PFX,
+                                      JAXWSAConstants.NS_WSDLI);
+                writer.writeAttribute(JAXWSAConstants.WSDLI_PFX,
+                                      JAXWSAConstants.NS_WSDLI,
+                                      JAXWSAConstants.WSDLI_WSDLLOCATION,
+                                      wsdlDocumentLocation);
+            }
+            if (interfaceName != null) {
+                writer.writeStartElement(JAXWSAConstants.WSAM_PREFIX,
+                                         JAXWSAConstants.WSAM_INTERFACE_NAME,
+                                         JAXWSAConstants.NS_WSAM);
+                String portTypePrefix = interfaceName.getPrefix();
                 if (portTypePrefix == null || portTypePrefix.equals("")) {
                     portTypePrefix = "ns1";
                 }
-                writer.writeNamespace(portTypePrefix, portType.getNamespaceURI());
-                writer.writeCharacters(portTypePrefix + ":" + portType.getLocalPart());
+                writer.writeNamespace(portTypePrefix, interfaceName.getNamespaceURI());
+                writer.writeCharacters(portTypePrefix + ":" + interfaceName.getLocalPart());
                 writer.writeEndElement();
             }
 
@@ -153,11 +205,12 @@ public class ProviderImpl extends javax.
                 serviceNamePrefix = (serviceName.getPrefix() == null || serviceName.getPrefix().length() == 0)
                     ? "ns2" : serviceName.getPrefix();
 
-                writer.writeStartElement(JAXWSAConstants.WSAW_PREFIX, JAXWSAConstants.WSAW_SERVICENAME_NAME,
-                                         JAXWSAConstants.NS_WSAW);
+                writer.writeStartElement(JAXWSAConstants.WSAM_PREFIX,
+                                         JAXWSAConstants.WSAM_SERVICENAME_NAME,
+                                         JAXWSAConstants.NS_WSAM);
 
                 if (portName != null) {
-                    writer.writeAttribute(JAXWSAConstants.WSAW_ENDPOINT_NAME, portName.getLocalPart());
+                    writer.writeAttribute(JAXWSAConstants.WSAM_ENDPOINT_NAME, portName.getLocalPart());
                 }
                 writer.writeNamespace(serviceNamePrefix, serviceName.getNamespaceURI());
                 writer.writeCharacters(serviceNamePrefix + ":" + serviceName.getLocalPart());
@@ -188,21 +241,18 @@ public class ProviderImpl extends javax.
             }
 
             writer.writeEndElement();
+            
+            if (elements != null) {
+                for (Element e : elements) {
+                    StaxUtils.writeElement(e, writer, true);
+                }
+            }
             writer.writeEndElement();
             writer.flush();
-        } catch (XMLStreamException e) {
-            throw new WebServiceException(new Message("ERROR_UNMARSHAL_ENDPOINTREFERENCE", LOG).toString(),
-                                          e);
-        }
 
-        try {
             Unmarshaller unmarshaller = getJAXBContext().createUnmarshaller();
-            return (W3CEndpointReference)unmarshaller.unmarshal(cos.getInputStream());
-
-        } catch (JAXBException e) {
-            throw new WebServiceException(new Message("ERROR_UNMARSHAL_ENDPOINTREFERENCE", LOG).toString(),
-                                          e);
-        } catch (IOException e) {
+            return (W3CEndpointReference)unmarshaller.unmarshal(writer.getDocument());
+        } catch (Exception e) {
             throw new WebServiceException(new Message("ERROR_UNMARSHAL_ENDPOINTREFERENCE", LOG).toString(),
                                           e);
         }
@@ -235,5 +285,11 @@ public class ProviderImpl extends javax.
         }
         return jaxbContext;
     }
-
+    /*
+    //new in 2.2, but introduces a new class not found in 2.1
+    public Endpoint createEndpoint(String bindingId, Class<?> implementorClass,
+                                   Invoker invoker, WebServiceFeature ... features) {
+        //TODO - JAXWS 2.2
+    }
+    */
 }

Modified: cxf/branches/2.2.x-fixes/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/ClientServerMiscTest.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/ClientServerMiscTest.java?rev=945881&r1=945880&r2=945881&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/ClientServerMiscTest.java (original)
+++ cxf/branches/2.2.x-fixes/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/ClientServerMiscTest.java Tue May 18 20:55:42 2010
@@ -33,6 +33,7 @@ import java.util.Map;
 import java.util.Set;
 
 import javax.xml.namespace.QName;
+import javax.xml.ws.BindingProvider;
 import javax.xml.ws.Holder;
 import javax.xml.ws.Service;
 import javax.xml.ws.soap.SOAPBinding;
@@ -236,6 +237,7 @@ public class ClientServerMiscTest extend
         DocLitWrappedCodeFirstServiceMissingOps port = service.getPort(portName,
                                   DocLitWrappedCodeFirstServiceMissingOps.class);
 
+        ((BindingProvider)port).getEndpointReference();
         int[] ret = port.echoIntArray(new int[] {1, 2});
         assertNotNull(ret);
         ret = port.echoIntArray(new int[] {1, 2});