Author: thomas.diesler(a)jboss.com
Date: 2008-02-27 10:09:15 -0500 (Wed, 27 Feb 2008)
New Revision: 5819
Modified:
stack/native/trunk/src/main/java/org/jboss/ws/core/jaxws/spi/ServiceDelegateImpl.java
stack/native/trunk/src/main/java/org/jboss/ws/extensions/addressing/jaxws/WSAddressingClientHandler.java
stack/native/trunk/src/main/java/org/jboss/ws/extensions/addressing/soap/SOAPAddressingPropertiesImpl.java
stack/native/trunk/src/main/resources/standard-config/standard-jaxws-endpoint-config.xml
stack/native/trunk/src/test/java/org/jboss/test/ws/jaxws/epr/EndpointReferenceTestCase.java
stack/native/trunk/src/test/java/org/jboss/test/ws/jaxws/epr/TestEndpointImpl.java
Log:
[JBWS-1844] Implement Provider.createW3CEndpointReference (WIP)
Modified:
stack/native/trunk/src/main/java/org/jboss/ws/core/jaxws/spi/ServiceDelegateImpl.java
===================================================================
---
stack/native/trunk/src/main/java/org/jboss/ws/core/jaxws/spi/ServiceDelegateImpl.java 2008-02-27
11:01:42 UTC (rev 5818)
+++
stack/native/trunk/src/main/java/org/jboss/ws/core/jaxws/spi/ServiceDelegateImpl.java 2008-02-27
15:09:15 UTC (rev 5819)
@@ -26,6 +26,7 @@
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Proxy;
+import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
@@ -45,6 +46,10 @@
import javax.xml.ws.WebServiceException;
import javax.xml.ws.WebServiceFeature;
import javax.xml.ws.Service.Mode;
+import javax.xml.ws.addressing.AddressingBuilder;
+import javax.xml.ws.addressing.AddressingProperties;
+import javax.xml.ws.addressing.JAXWSAConstants;
+import javax.xml.ws.addressing.ReferenceParameters;
import javax.xml.ws.handler.HandlerResolver;
import javax.xml.ws.spi.ServiceDelegate21;
import javax.xml.ws.wsaddressing.W3CEndpointReference;
@@ -75,6 +80,7 @@
import org.jboss.wsf.spi.metadata.j2ee.serviceref.UnifiedServiceRefMetaData;
import org.jboss.wsf.spi.metadata.j2ee.serviceref.UnifiedStubPropertyMetaData;
import org.jboss.wsf.spi.metadata.j2ee.serviceref.UnifiedHandlerMetaData.HandlerType;
+import org.w3c.dom.Element;
/**
* Service delegates are used internally by Service objects to allow pluggability of
JAX-WS implementations.
@@ -457,61 +463,121 @@
@Override
public <T> Dispatch<T> createDispatch(QName portName, Class<T> type,
Mode mode, WebServiceFeature... features)
{
- log.warn("WebServiceFeature not implemented");
- return createDispatch(portName, type, mode);
+ if (features != null)
+ log.warn("WebServiceFeature not implemented");
+
+ Dispatch<T> dispatch = createDispatch(portName, type, mode);
+ return dispatch;
}
@Override
public <T> Dispatch<T> createDispatch(EndpointReference epr,
Class<T> type, Mode mode, WebServiceFeature... features)
{
- log.warn("WebServiceFeature not implemented");
+ if (features != null)
+ log.warn("WebServiceFeature not implemented");
+
QName portName = null;
if (epr instanceof W3CEndpointReference)
{
W3CEndpointReference w3c = (W3CEndpointReference)epr;
portName = w3c.getEndpointName();
}
- return createDispatch(portName, type, mode);
+ Dispatch<T> dispatch = createDispatch(portName, type, mode);
+ return dispatch;
}
@Override
public Dispatch<Object> createDispatch(QName portName, JAXBContext context, Mode
mode, WebServiceFeature... features)
{
- log.warn("WebServiceFeature not implemented");
- return createDispatch(portName, context, mode);
+ if (features != null)
+ log.warn("WebServiceFeature not implemented");
+
+ Dispatch<Object> dispatch = createDispatch(portName, context, mode);
+ return dispatch;
}
@Override
public Dispatch<Object> createDispatch(EndpointReference epr, JAXBContext
context, Mode mode, WebServiceFeature... features)
{
- log.warn("WebServiceFeature not implemented");
+ if (features != null)
+ log.warn("WebServiceFeature not implemented");
+
QName portName = null;
if (epr instanceof W3CEndpointReference)
{
W3CEndpointReference w3c = (W3CEndpointReference)epr;
portName = w3c.getEndpointName();
}
- return createDispatch(portName, context, mode);
+
+ Dispatch<Object> dispatch = createDispatch(portName, context, mode);
+ return dispatch;
}
@Override
public <T> T getPort(QName portName, Class<T> sei, WebServiceFeature...
features)
{
- log.warn("WebServiceFeature not implemented");
- return getPort(portName, sei);
+ if (features != null)
+ log.warn("WebServiceFeature not implemented");
+
+ T port = getPort(portName, sei);
+ return port;
}
@Override
public <T> T getPort(EndpointReference epr, Class<T> sei,
WebServiceFeature... features)
{
- log.warn("WebServiceFeature not implemented");
- return getPort(sei);
+ if (features != null)
+ log.warn("WebServiceFeature not implemented");
+
+ T port = getPort(sei);
+ initAddressingProperties(port, epr);
+ return port;
}
@Override
public <T> T getPort(Class<T> sei, WebServiceFeature... features)
{
- log.warn("WebServiceFeature not implemented");
- return getPort(sei);
+ if (features != null)
+ log.warn("WebServiceFeature not implemented");
+
+ T port = getPort(sei);
+ return port;
}
+
+ // Workaround for [JBWS-2015] Modify addressing handlers to work with the JAXWS-2.1
API
+ private <T> void initAddressingProperties(T port, EndpointReference epr)
+ {
+ Map<String, Object> reqContext =
((BindingProvider)port).getRequestContext();
+ AddressingBuilder builder = AddressingBuilder.getAddressingBuilder();
+ AddressingProperties addrProps = builder.newAddressingProperties();
+ reqContext.put(JAXWSAConstants.CLIENT_ADDRESSING_PROPERTIES_OUTBOUND, addrProps);
+
+ if (epr instanceof W3CEndpointReference)
+ {
+ try
+ {
+ W3CEndpointReference w3cepr = (W3CEndpointReference)epr;
+ if (w3cepr.getAddress() != null)
+ addrProps.setTo(builder.newURI(w3cepr.getAddress()));
+
+ List<Element> w3cRefParams = w3cepr.getReferenceParameters();
+ if (w3cRefParams != null)
+ {
+ ReferenceParameters refParams = addrProps.getReferenceParameters();
+ for (Element w3cRefParam : w3cRefParams)
+ {
+ refParams.addElement(w3cRefParam);
+ }
+ }
+ }
+ catch (URISyntaxException ex)
+ {
+ throw new IllegalArgumentException(ex);
+ }
+ }
+ else
+ {
+ throw new IllegalArgumentException("Unsupported EPR type: " + epr);
+ }
+ }
}
Modified:
stack/native/trunk/src/main/java/org/jboss/ws/extensions/addressing/jaxws/WSAddressingClientHandler.java
===================================================================
---
stack/native/trunk/src/main/java/org/jboss/ws/extensions/addressing/jaxws/WSAddressingClientHandler.java 2008-02-27
11:01:42 UTC (rev 5818)
+++
stack/native/trunk/src/main/java/org/jboss/ws/extensions/addressing/jaxws/WSAddressingClientHandler.java 2008-02-27
15:09:15 UTC (rev 5819)
@@ -24,6 +24,8 @@
import org.jboss.logging.Logger;
import org.jboss.ws.extensions.addressing.AddressingConstantsImpl;
import org.jboss.ws.extensions.addressing.soap.SOAPAddressingPropertiesImpl;
+import org.jboss.ws.metadata.umdm.OperationMetaData;
+import org.jboss.ws.core.CommonMessageContext;
import org.jboss.ws.core.jaxws.handler.GenericSOAPHandler;
import javax.xml.namespace.QName;
@@ -37,6 +39,8 @@
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.MessageContext.Scope;
import javax.xml.ws.handler.soap.SOAPMessageContext;
+
+import java.net.URISyntaxException;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
@@ -84,18 +88,29 @@
}
addrProps =
(SOAPAddressingProperties)msgContext.get(JAXWSAConstants.CLIENT_ADDRESSING_PROPERTIES_OUTBOUND);
- if (addrProps != null)
- {
- SOAPMessage soapMessage = ((SOAPMessageContext)msgContext).getMessage();
- addrProps.writeHeaders(soapMessage);
- }
- else
- {
- // supply default addressing properties
- addrProps = (SOAPAddressingPropertiesImpl)ADDR_BUILDER.newAddressingProperties();
- msgContext.put(JAXWSAConstants.CLIENT_ADDRESSING_PROPERTIES_OUTBOUND, addrProps);
- msgContext.setScope(JAXWSAConstants.CLIENT_ADDRESSING_PROPERTIES_OUTBOUND,
Scope.APPLICATION);
- }
+ if (addrProps == null)
+ {
+ // supply default addressing properties
+ addrProps =
(SOAPAddressingPropertiesImpl)ADDR_BUILDER.newAddressingProperties();
+ msgContext.put(JAXWSAConstants.CLIENT_ADDRESSING_PROPERTIES_OUTBOUND,
addrProps);
+ msgContext.setScope(JAXWSAConstants.CLIENT_ADDRESSING_PROPERTIES_OUTBOUND,
Scope.APPLICATION);
+ }
+
+ if (addrProps.getAction() == null)
+ {
+ try
+ {
+ OperationMetaData opMetaData =
((CommonMessageContext)msgContext).getOperationMetaData();
+ addrProps.setAction(ADDR_BUILDER.newURI(opMetaData.getJavaName()));
+ }
+ catch (URISyntaxException ex)
+ {
+ // ignore
+ }
+ }
+
+ SOAPMessage soapMessage = ((SOAPMessageContext)msgContext).getMessage();
+ addrProps.writeHeaders(soapMessage);
return true;
}
Modified:
stack/native/trunk/src/main/java/org/jboss/ws/extensions/addressing/soap/SOAPAddressingPropertiesImpl.java
===================================================================
---
stack/native/trunk/src/main/java/org/jboss/ws/extensions/addressing/soap/SOAPAddressingPropertiesImpl.java 2008-02-27
11:01:42 UTC (rev 5818)
+++
stack/native/trunk/src/main/java/org/jboss/ws/extensions/addressing/soap/SOAPAddressingPropertiesImpl.java 2008-02-27
15:09:15 UTC (rev 5819)
@@ -23,6 +23,29 @@
//$Id$
+import java.lang.reflect.Array;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.namespace.QName;
+import javax.xml.soap.SOAPElement;
+import javax.xml.soap.SOAPException;
+import javax.xml.soap.SOAPFactory;
+import javax.xml.soap.SOAPHeader;
+import javax.xml.soap.SOAPHeaderElement;
+import javax.xml.soap.SOAPMessage;
+import javax.xml.ws.addressing.AddressingConstants;
+import javax.xml.ws.addressing.AddressingException;
+import javax.xml.ws.addressing.AttributedURI;
+import javax.xml.ws.addressing.ReferenceParameters;
+import javax.xml.ws.addressing.Relationship;
+import javax.xml.ws.addressing.soap.SOAPAddressingBuilder;
+import javax.xml.ws.addressing.soap.SOAPAddressingProperties;
+
import org.jboss.ws.core.soap.NameImpl;
import org.jboss.ws.core.soap.SOAPFactoryImpl;
import org.jboss.ws.extensions.addressing.AddressingConstantsImpl;
@@ -34,19 +57,6 @@
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
-import javax.xml.namespace.QName;
-import javax.xml.soap.*;
-import javax.xml.ws.addressing.*;
-import javax.xml.ws.addressing.soap.SOAPAddressingBuilder;
-import javax.xml.ws.addressing.soap.SOAPAddressingProperties;
-import java.lang.reflect.Array;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
/**
* Subimplementation of <code>AddressingProperties</code> includes methods
that
* read and write the Message Addressing Properties to a
<code>SOAPMessage</code>.
@@ -283,11 +293,14 @@
// Write wsa:ReferenceParameters
ReferenceParameters refParams = getReferenceParameters();
- if (refParams.getElements().size() > 0 || refParams.getAttributes().size() > 0)
+ if (refParams.getElements().size() > 0)
{
- SOAPElement wsaRefParams = soapHeader.addChildElement(new
NameImpl(ADDR.getReferenceParametersQName()));
- appendAttributes(wsaRefParams, refParams.getAttributes());
- appendElements(wsaRefParams, refParams.getElements());
+ for (Object obj : refParams.getElements())
+ {
+ SOAPElement refElement = appendElement(soapHeader, obj);
+ QName refQName = new QName(getNamespaceURI(),
"IsReferenceParameter");
+ refElement.addAttribute(refQName, "true");
+ }
}
appendElements(soapHeader, getElements());
@@ -334,24 +347,9 @@
{
try
{
- SOAPFactoryImpl factory = (SOAPFactoryImpl)SOAPFactory.newInstance();
for (Object obj : elements)
{
- if (obj instanceof Element)
- {
- SOAPElement child = factory.createElement((Element)obj);
- soapElement.addChildElement(child);
- }
- else if (obj instanceof String)
- {
- Element el = DOMUtils.parse((String)obj);
- SOAPElement child = factory.createElement(el);
- soapElement.addChildElement(child);
- }
- else
- {
- throw new AddressingException("Unsupported element: " +
obj.getClass().getName());
- }
+ appendElement(soapElement, obj);
}
}
catch (RuntimeException rte)
@@ -364,6 +362,39 @@
}
}
+ private SOAPElement appendElement(SOAPElement soapElement, Object obj)
+ {
+ SOAPElement child = null;
+ try
+ {
+ SOAPFactoryImpl factory = (SOAPFactoryImpl)SOAPFactory.newInstance();
+ if (obj instanceof Element)
+ {
+ child = factory.createElement((Element)obj);
+ soapElement.addChildElement(child);
+ }
+ else if (obj instanceof String)
+ {
+ Element el = DOMUtils.parse((String)obj);
+ child = factory.createElement(el);
+ soapElement.addChildElement(child);
+ }
+ else
+ {
+ throw new AddressingException("Unsupported element: " +
obj.getClass().getName());
+ }
+ return child;
+ }
+ catch (RuntimeException rte)
+ {
+ throw rte;
+ }
+ catch (Exception ex)
+ {
+ throw new AddressingException("Cannot append elements", ex);
+ }
+ }
+
private String getPrefixedName(QName qname)
{
String prefix = qname.getPrefix();
Modified:
stack/native/trunk/src/main/resources/standard-config/standard-jaxws-endpoint-config.xml
===================================================================
---
stack/native/trunk/src/main/resources/standard-config/standard-jaxws-endpoint-config.xml 2008-02-27
11:01:42 UTC (rev 5818)
+++
stack/native/trunk/src/main/resources/standard-config/standard-jaxws-endpoint-config.xml 2008-02-27
15:09:15 UTC (rev 5819)
@@ -36,6 +36,10 @@
<javaee:handler-name>WSAddressing Handler</javaee:handler-name>
<javaee:handler-class>org.jboss.ws.extensions.addressing.jaxws.WSAddressingServerHandler</javaee:handler-class>
</javaee:handler>
+ <javaee:handler>
+ <javaee:handler-name>Recording Handler</javaee:handler-name>
+
<javaee:handler-class>org.jboss.wsf.framework.invocation.RecordingServerHandler</javaee:handler-class>
+ </javaee:handler>
</javaee:handler-chain>
</post-handler-chains>
</endpoint-config>
@@ -49,6 +53,10 @@
<javaee:handler-name>WSAddressing Handler</javaee:handler-name>
<javaee:handler-class>org.jboss.ws.extensions.addressing.jaxws.WSAddressingServerHandler</javaee:handler-class>
</javaee:handler>
+ <javaee:handler>
+ <javaee:handler-name>Recording Handler</javaee:handler-name>
+
<javaee:handler-class>org.jboss.wsf.framework.invocation.RecordingServerHandler</javaee:handler-class>
+ </javaee:handler>
</javaee:handler-chain>
</post-handler-chains>
</endpoint-config>
@@ -62,6 +70,10 @@
<javaee:handler-name>WSSecurity Handler</javaee:handler-name>
<javaee:handler-class>org.jboss.ws.extensions.security.jaxws.WSSecurityHandlerServer</javaee:handler-class>
</javaee:handler>
+ <javaee:handler>
+ <javaee:handler-name>Recording Handler</javaee:handler-name>
+
<javaee:handler-class>org.jboss.wsf.framework.invocation.RecordingServerHandler</javaee:handler-class>
+ </javaee:handler>
</javaee:handler-chain>
</post-handler-chains>
</endpoint-config>
Modified:
stack/native/trunk/src/test/java/org/jboss/test/ws/jaxws/epr/EndpointReferenceTestCase.java
===================================================================
---
stack/native/trunk/src/test/java/org/jboss/test/ws/jaxws/epr/EndpointReferenceTestCase.java 2008-02-27
11:01:42 UTC (rev 5818)
+++
stack/native/trunk/src/test/java/org/jboss/test/ws/jaxws/epr/EndpointReferenceTestCase.java 2008-02-27
15:09:15 UTC (rev 5819)
@@ -31,6 +31,8 @@
import junit.framework.Test;
+import org.jboss.ws.core.StubExt;
+import org.jboss.wsf.common.DOMUtils;
import org.jboss.wsf.test.JBossWSTest;
import org.jboss.wsf.test.JBossWSTestSetup;
@@ -49,12 +51,13 @@
return new JBossWSTestSetup(EndpointReferenceTestCase.class,
"jaxws-epr.jar");
}
- public void _testSimple() throws Exception
+ public void testSimple() throws Exception
{
URL wsdlURL = new URL("http://" + getServerHost() +
":8080/jaxws-epr/TestEndpointImpl?wsdl");
QName serviceName = new QName("http://org.jboss.ws/epr",
"TestEndpointService");
Service service = Service.create(wsdlURL, serviceName);
TestEndpoint port = service.getPort(TestEndpoint.class);
+ ((StubExt)port).setConfigName("Standard WSAddressing Client");
String retStr = port.echo("hello");
assertEquals("hello", retStr);
}
@@ -62,15 +65,19 @@
public void testEndpointReference() throws Exception
{
String address = "http://" + getServerHost() +
":8080/jaxws-epr/TestEndpointImpl";
+ URL wsdlURL = new URL(address + "?wsdl");
QName serviceName = new QName("http://org.jboss.ws/epr",
"TestEndpointService");
-
+
W3CEndpointReferenceBuilder builder = new W3CEndpointReferenceBuilder();
builder = builder.address(address);
builder = builder.serviceName(serviceName);
+ builder.referenceParameter(DOMUtils.parse("<fabrikam:CustomerKey
xmlns:fabrikam='http://example.com/fabrikam'>123456789</fab...;
+ builder.referenceParameter(DOMUtils.parse("<fabrikam:ShoppingCart
xmlns:fabrikam='http://example.com/fabrikam'>ABCDEFG</fabri...;
W3CEndpointReference epr = builder.build();
-
- Service21 service = Service21.create(serviceName);
+
+ Service21 service = Service21.create(wsdlURL, serviceName);
TestEndpoint port = service.getPort(epr, TestEndpoint.class);
+ ((StubExt)port).setConfigName("Standard WSAddressing Client");
String retStr = port.echo("hello");
assertEquals("hello", retStr);
}
Modified:
stack/native/trunk/src/test/java/org/jboss/test/ws/jaxws/epr/TestEndpointImpl.java
===================================================================
---
stack/native/trunk/src/test/java/org/jboss/test/ws/jaxws/epr/TestEndpointImpl.java 2008-02-27
11:01:42 UTC (rev 5818)
+++
stack/native/trunk/src/test/java/org/jboss/test/ws/jaxws/epr/TestEndpointImpl.java 2008-02-27
15:09:15 UTC (rev 5819)
@@ -23,24 +23,60 @@
// $Id$
+import java.io.ByteArrayOutputStream;
+
+import javax.annotation.Resource;
import javax.ejb.Stateless;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
+import javax.xml.soap.SOAPMessage;
+import javax.xml.ws.WebServiceContext;
+import javax.xml.ws.addressing.JAXWSAConstants;
+import javax.xml.ws.addressing.ReferenceParameters;
+import javax.xml.ws.addressing.soap.SOAPAddressingProperties;
+import javax.xml.ws.handler.soap.SOAPMessageContext;
import org.jboss.logging.Logger;
+import org.jboss.ws.annotation.EndpointConfig;
+import org.w3c.dom.Element;
@WebService(serviceName = "TestEndpointService", name =
"TestEndpoint", targetNamespace = "http://org.jboss.ws/epr")
@SOAPBinding(style = SOAPBinding.Style.RPC)
@Stateless
+@EndpointConfig(configName = "Standard WSAddressing Endpoint")
public class TestEndpointImpl implements TestEndpoint
{
// provide logging
private final static Logger log = Logger.getLogger(TestEndpointImpl.class);
+ @Resource
+ WebServiceContext context;
+
@WebMethod
public String echo(String input)
{
+ try
+ {
+ SOAPMessageContext msgContext =
(SOAPMessageContext)context.getMessageContext();
+
+ // log message
+ SOAPMessage soapMessage = msgContext.getMessage();
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ soapMessage.writeTo(baos);
+ log.info(new String(baos.toByteArray()));
+
+ SOAPAddressingProperties addrProps =
(SOAPAddressingProperties)msgContext.get(JAXWSAConstants.SERVER_ADDRESSING_PROPERTIES_INBOUND);
+ ReferenceParameters refParams = addrProps.getReferenceParameters();
+ for (Object refParam : refParams.getElements())
+ {
+ input += "|" + ((Element)refParam).getNodeValue();
+ }
+ }
+ catch (Exception ex)
+ {
+ throw new RuntimeException(ex);
+ }
return input;
}
}