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 2013/04/09 18:53:02 UTC
svn commit: r1466120 - in
/cxf/trunk/services/ws-discovery/ws-discovery-api/src:
main/java/org/apache/cxf/ws/discovery/
main/java/org/apache/cxf/ws/discovery/internal/
test/java/org/apache/cxf/ws/discovery/
Author: dkulp
Date: Tue Apr 9 16:53:02 2013
New Revision: 1466120
URL: http://svn.apache.org/r1466120
Log:
Implement the resolve operations.
Modified:
cxf/trunk/services/ws-discovery/ws-discovery-api/src/main/java/org/apache/cxf/ws/discovery/WSDVersion.java
cxf/trunk/services/ws-discovery/ws-discovery-api/src/main/java/org/apache/cxf/ws/discovery/WSDiscoveryClient.java
cxf/trunk/services/ws-discovery/ws-discovery-api/src/main/java/org/apache/cxf/ws/discovery/internal/WSDiscoveryServiceImpl.java
cxf/trunk/services/ws-discovery/ws-discovery-api/src/test/java/org/apache/cxf/ws/discovery/WSDiscoveryClientTest.java
Modified: cxf/trunk/services/ws-discovery/ws-discovery-api/src/main/java/org/apache/cxf/ws/discovery/WSDVersion.java
URL: http://svn.apache.org/viewvc/cxf/trunk/services/ws-discovery/ws-discovery-api/src/main/java/org/apache/cxf/ws/discovery/WSDVersion.java?rev=1466120&r1=1466119&r2=1466120&view=diff
==============================================================================
--- cxf/trunk/services/ws-discovery/ws-discovery-api/src/main/java/org/apache/cxf/ws/discovery/WSDVersion.java (original)
+++ cxf/trunk/services/ws-discovery/ws-discovery-api/src/main/java/org/apache/cxf/ws/discovery/WSDVersion.java Tue Apr 9 16:53:02 2013
@@ -38,9 +38,10 @@ public abstract class WSDVersion {
public static final WSDVersion INSTANCE_1_0 = new WSDVersion10();
public static final WSDVersion INSTANCE_1_1 = new WSDVersion11();
- abstract String getNamespace();
+ public abstract String getNamespace();
+ public abstract String getAddressingNamespace();
+
abstract String getToAddress();
- abstract String getAddressingNamespace();
abstract void addVersionTransformer(Dispatch<Object> dispatch);
abstract QName getServiceName();
abstract String getSoapVersion();
@@ -54,6 +55,9 @@ public abstract class WSDVersion {
public String getProbeAction() {
return getNamespace() + "/Probe";
}
+ public String getResolveAction() {
+ return getNamespace() + "/Resolve";
+ }
static final class WSDVersion10 extends WSDVersion {
Modified: cxf/trunk/services/ws-discovery/ws-discovery-api/src/main/java/org/apache/cxf/ws/discovery/WSDiscoveryClient.java
URL: http://svn.apache.org/viewvc/cxf/trunk/services/ws-discovery/ws-discovery-api/src/main/java/org/apache/cxf/ws/discovery/WSDiscoveryClient.java?rev=1466120&r1=1466119&r2=1466120&view=diff
==============================================================================
--- cxf/trunk/services/ws-discovery/ws-discovery-api/src/main/java/org/apache/cxf/ws/discovery/WSDiscoveryClient.java (original)
+++ cxf/trunk/services/ws-discovery/ws-discovery-api/src/main/java/org/apache/cxf/ws/discovery/WSDiscoveryClient.java Tue Apr 9 16:53:02 2013
@@ -37,6 +37,7 @@ import javax.xml.ws.AsyncHandler;
import javax.xml.ws.BindingProvider;
import javax.xml.ws.Dispatch;
import javax.xml.ws.EndpointReference;
+import javax.xml.ws.Holder;
import javax.xml.ws.Response;
import javax.xml.ws.Service;
import javax.xml.ws.soap.AddressingFeature;
@@ -64,6 +65,9 @@ import org.apache.cxf.ws.discovery.wsdl.
import org.apache.cxf.ws.discovery.wsdl.ProbeMatchType;
import org.apache.cxf.ws.discovery.wsdl.ProbeMatchesType;
import org.apache.cxf.ws.discovery.wsdl.ProbeType;
+import org.apache.cxf.ws.discovery.wsdl.ResolveMatchType;
+import org.apache.cxf.ws.discovery.wsdl.ResolveMatchesType;
+import org.apache.cxf.ws.discovery.wsdl.ResolveType;
import org.apache.cxf.ws.discovery.wsdl.ScopesType;
import org.apache.cxf.wsdl.EndpointReferenceUtils;
@@ -336,6 +340,51 @@ public class WSDiscoveryClient implement
return (ProbeMatchesType)o;
}
+ public ResolveMatchType resolve(W3CEndpointReference ref) {
+ return resolve(ref, defaultProbeTimeout);
+ }
+ public ResolveMatchType resolve(W3CEndpointReference ref, int timeout) {
+ Dispatch<Object> disp = this.getDispatchInternal(false, version.getResolveAction());
+ ResolveType rt = new ResolveType();
+ rt.setEndpointReference(ref);
+ if (adHoc) {
+ disp.getRequestContext().put("udp.multi.response.timeout", timeout);
+ final Holder<ResolveMatchesType> response = new Holder<ResolveMatchesType>();
+ AsyncHandler<Object> handler = new AsyncHandler<Object>() {
+ public void handleResponse(Response<Object> res) {
+ try {
+ Object o = res.get();
+ while (o instanceof JAXBElement) {
+ o = ((JAXBElement)o).getValue();
+ }
+ if (o instanceof ResolveMatchesType) {
+ response.value = (ResolveMatchesType)o;
+ } else if (o instanceof HelloType) {
+ HelloType h = (HelloType)o;
+ QName sn = version.getServiceName();
+ if (h.getTypes().contains(sn)
+ || h.getTypes().contains(new QName("", sn.getLocalPart()))) {
+ // A DiscoveryProxy wants us to flip to managed mode
+ resetDispatch(h.getXAddrs().get(0));
+ }
+ }
+ } catch (InterruptedException e) {
+ // ?
+ } catch (ExecutionException e) {
+ // ?
+ }
+ }
+ };
+ disp.invokeAsync(new ObjectFactory().createResolve(rt), handler);
+ return response.value == null ? null : response.value.getResolveMatch();
+ }
+ Object o = disp.invoke(new ObjectFactory().createResolve(rt));
+ while (o instanceof JAXBElement) {
+ o = ((JAXBElement)o).getValue();
+ }
+ return o == null ? null : ((ResolveMatchesType)o).getResolveMatch();
+ }
+
private W3CEndpointReference generateW3CEndpointReference() {
W3CEndpointReferenceBuilder builder = new W3CEndpointReferenceBuilder();
Modified: cxf/trunk/services/ws-discovery/ws-discovery-api/src/main/java/org/apache/cxf/ws/discovery/internal/WSDiscoveryServiceImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/services/ws-discovery/ws-discovery-api/src/main/java/org/apache/cxf/ws/discovery/internal/WSDiscoveryServiceImpl.java?rev=1466120&r1=1466119&r2=1466120&view=diff
==============================================================================
--- cxf/trunk/services/ws-discovery/ws-discovery-api/src/main/java/org/apache/cxf/ws/discovery/internal/WSDiscoveryServiceImpl.java (original)
+++ cxf/trunk/services/ws-discovery/ws-discovery-api/src/main/java/org/apache/cxf/ws/discovery/internal/WSDiscoveryServiceImpl.java Tue Apr 9 16:53:02 2013
@@ -46,6 +46,7 @@ import javax.xml.ws.EndpointReference;
import javax.xml.ws.Provider;
import javax.xml.ws.WebServiceProvider;
import javax.xml.ws.soap.Addressing;
+import javax.xml.ws.wsaddressing.W3CEndpointReference;
import javax.xml.ws.wsaddressing.W3CEndpointReferenceBuilder;
import org.w3c.dom.Document;
@@ -55,6 +56,7 @@ import org.apache.cxf.BusFactory;
import org.apache.cxf.common.jaxb.JAXBContextCache;
import org.apache.cxf.common.util.StringUtils;
import org.apache.cxf.endpoint.Server;
+import org.apache.cxf.jaxws.spi.ProviderImpl;
import org.apache.cxf.phase.PhaseInterceptorChain;
import org.apache.cxf.service.model.ServiceModelUtil;
import org.apache.cxf.staxutils.StaxUtils;
@@ -62,6 +64,7 @@ import org.apache.cxf.staxutils.transfor
import org.apache.cxf.ws.addressing.AddressingProperties;
import org.apache.cxf.ws.addressing.AttributedURIType;
import org.apache.cxf.ws.addressing.ContextUtils;
+import org.apache.cxf.ws.addressing.EndpointReferenceType;
import org.apache.cxf.ws.addressing.impl.AddressingPropertiesImpl;
import org.apache.cxf.ws.discovery.WSDVersion;
import org.apache.cxf.ws.discovery.WSDiscoveryClient;
@@ -72,7 +75,11 @@ import org.apache.cxf.ws.discovery.wsdl.
import org.apache.cxf.ws.discovery.wsdl.ProbeMatchType;
import org.apache.cxf.ws.discovery.wsdl.ProbeMatchesType;
import org.apache.cxf.ws.discovery.wsdl.ProbeType;
+import org.apache.cxf.ws.discovery.wsdl.ResolveMatchType;
+import org.apache.cxf.ws.discovery.wsdl.ResolveMatchesType;
+import org.apache.cxf.ws.discovery.wsdl.ResolveType;
import org.apache.cxf.ws.discovery.wsdl.ScopesType;
+import org.apache.cxf.wsdl.EndpointReferenceUtils;
public class WSDiscoveryServiceImpl implements WSDiscoveryService {
Bus bus;
@@ -404,8 +411,51 @@ public class WSDiscoveryServiceImpl impl
}
}
+ private Source mapToOld(Document doc, JAXBElement<?> mt) throws JAXBException, XMLStreamException {
+ doc.removeChild(doc.getDocumentElement());
+ DOMResult result = new DOMResult(doc);
+ XMLStreamWriter r = StaxUtils.createXMLStreamWriter(result);
+ context.createMarshaller().marshal(mt, r);
+
+ XMLStreamReader domReader = StaxUtils.createXMLStreamReader(doc);
+ Map<String, String> inMap = new HashMap<String, String>();
+ inMap.put("{" + WSDVersion.INSTANCE_1_1.getNamespace() + "}*",
+ "{" + WSDVersion.INSTANCE_1_0.getNamespace() + "}*");
+ inMap.put("{" + WSDVersion.INSTANCE_1_1.getAddressingNamespace() + "}*",
+ "{" + WSDVersion.INSTANCE_1_0.getAddressingNamespace() + "}*");
+
+ InTransformReader reader = new InTransformReader(domReader, inMap , null, false);
+ doc = StaxUtils.read(reader);
+ return new DOMSource(doc);
+ }
+ private void updateOutputAction(String append) {
+ AddressingProperties p = ContextUtils.retrieveMAPs(PhaseInterceptorChain.getCurrentMessage(),
+ false, false);
+ AddressingProperties pout = new AddressingPropertiesImpl();
+ AttributedURIType action = new AttributedURIType();
+ action.setValue(p.getAction().getValue() + append);
+ pout.exposeAs(p.getNamespaceURI());
+ pout.setAction(action);
+ ContextUtils.storeMAPs(pout, PhaseInterceptorChain.getCurrentMessage(), true);
+
+ }
+
+ private Document mapFromOld(Document doc) throws XMLStreamException {
+ XMLStreamReader domReader = StaxUtils.createXMLStreamReader(doc);
+ Map<String, String> inMap = new HashMap<String, String>();
+ inMap.put("{" + WSDVersion.INSTANCE_1_0.getNamespace() + "}*",
+ "{" + WSDVersion.INSTANCE_1_1.getNamespace() + "}*");
+ inMap.put("{" + WSDVersion.INSTANCE_1_0.getAddressingNamespace() + "}*",
+ "{" + WSDVersion.INSTANCE_1_1.getAddressingNamespace() + "}*");
+ InTransformReader reader = new InTransformReader(domReader, inMap , null, false);
+ doc = StaxUtils.read(reader);
+ //System.out.println(StaxUtils.toString(doc));
+
+ return doc;
+ }
public Source invoke(Source request) {
+ Source ret = null;
try {
//Bug in JAXB - if you pass the StaxSource or SaxSource into unmarshall,
//the namespaces for the QNames for the Types elements are lost.
@@ -416,17 +466,10 @@ public class WSDiscoveryServiceImpl impl
if ("http://schemas.xmlsoap.org/ws/2005/04/discovery"
.equals(doc.getDocumentElement().getNamespaceURI())) {
//old version of ws-discovery, we'll transform this to newer version
-
- XMLStreamReader domReader = StaxUtils.createXMLStreamReader(doc);
- Map<String, String> inMap = new HashMap<String, String>();
- inMap.put("{http://schemas.xmlsoap.org/ws/2005/04/discovery}*",
- "{http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01}*");
- InTransformReader reader = new InTransformReader(domReader, inMap , null, false);
- doc = StaxUtils.read(reader);
+ doc = mapFromOld(doc);
mapToOld = true;
}
-
if (!"http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01"
.equals(doc.getDocumentElement().getNamespaceURI())) {
//not a proper ws-discovery message, ignore it
@@ -442,33 +485,23 @@ public class WSDiscoveryServiceImpl impl
if (pmt == null) {
return null;
}
- AddressingProperties p = ContextUtils.retrieveMAPs(PhaseInterceptorChain.getCurrentMessage(),
- false, false);
- AddressingProperties pout = new AddressingPropertiesImpl();
- AttributedURIType action = new AttributedURIType();
- action.setValue(p.getAction().getValue() + "Matches");
- pout.exposeAs(p.getNamespaceURI());
- pout.setAction(action);
- ContextUtils.storeMAPs(pout, PhaseInterceptorChain.getCurrentMessage(), true);
-
+ updateOutputAction("Matches");
+ if (mapToOld) {
+ ret = mapToOld(doc, factory.createProbeMatches(pmt));
+ } else {
+ ret = new JAXBSource(context, factory.createProbeMatches(pmt));
+ }
+ } else if (obj instanceof ResolveType) {
+ ResolveMatchesType rmt = handleResolve((ResolveType)obj);
+ if (rmt == null) {
+ return null;
+ }
+ updateOutputAction("Matches");
if (mapToOld) {
- doc.removeChild(doc.getDocumentElement());
- DOMResult result = new DOMResult(doc);
- XMLStreamWriter r = StaxUtils.createXMLStreamWriter(result);
- context.createMarshaller().marshal(factory.createProbeMatches(pmt), r);
-
- XMLStreamReader domReader = StaxUtils.createXMLStreamReader(doc);
- Map<String, String> inMap = new HashMap<String, String>();
- inMap.put("{http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01}*",
- "{http://schemas.xmlsoap.org/ws/2005/04/discovery}*");
-
-
-
- InTransformReader reader = new InTransformReader(domReader, inMap , null, false);
- doc = StaxUtils.read(reader);
- return new DOMSource(doc);
+ ret = mapToOld(doc, factory.createResolveMatches(rmt));
+ } else {
+ ret = new JAXBSource(context, factory.createResolveMatches(rmt));
}
- return new JAXBSource(context, factory.createProbeMatches(pmt));
} else if (obj instanceof HelloType) {
//check if it's a DiscoveryProxy
HelloType h = (HelloType)obj;
@@ -504,8 +537,48 @@ public class WSDiscoveryServiceImpl impl
// TODO Auto-generated catch block
e1.printStackTrace();
}
+ return ret;
+ }
+
+ private ResolveMatchesType handleResolve(ResolveType resolve) {
+ ResolveMatchType rmt = new ResolveMatchType();
+ EndpointReference ref = resolve.getEndpointReference();
+ EndpointReferenceType iref = ProviderImpl.convertToInternal(ref);
+ for (HelloType hello : registered) {
+ W3CEndpointReference r = hello.getEndpointReference();
+ if (matches(iref, r)) {
+ rmt.setEndpointReference(r);
+ rmt.setScopes(hello.getScopes());
+ rmt.getTypes().addAll(hello.getTypes());
+ rmt.getXAddrs().addAll(hello.getXAddrs());
+ rmt.getOtherAttributes().putAll(hello.getOtherAttributes());
+ rmt.setMetadataVersion(hello.getMetadataVersion());
+ ResolveMatchesType rmts = new ResolveMatchesType();
+ rmts.setResolveMatch(rmt);
+ return rmts;
+ }
+ }
return null;
}
+
+ private boolean matches(EndpointReferenceType ref, W3CEndpointReference r) {
+ EndpointReferenceType cref = ProviderImpl.convertToInternal(r);
+ QName snr = EndpointReferenceUtils.getServiceName(ref, bus);
+ QName snc = EndpointReferenceUtils.getServiceName(cref, bus);
+ String addr = EndpointReferenceUtils.getAddress(ref);
+ String addc = EndpointReferenceUtils.getAddress(ref);
+
+ if (addr == null) {
+ return false;
+ }
+ if (addr.equals(addc)) {
+ if (snr != null && !snr.equals(snc)) {
+ return false;
+ }
+ return true;
+ }
+ return false;
+ }
}
}
Modified: cxf/trunk/services/ws-discovery/ws-discovery-api/src/test/java/org/apache/cxf/ws/discovery/WSDiscoveryClientTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/services/ws-discovery/ws-discovery-api/src/test/java/org/apache/cxf/ws/discovery/WSDiscoveryClientTest.java?rev=1466120&r1=1466119&r2=1466120&view=diff
==============================================================================
--- cxf/trunk/services/ws-discovery/ws-discovery-api/src/test/java/org/apache/cxf/ws/discovery/WSDiscoveryClientTest.java (original)
+++ cxf/trunk/services/ws-discovery/ws-discovery-api/src/test/java/org/apache/cxf/ws/discovery/WSDiscoveryClientTest.java Tue Apr 9 16:53:02 2013
@@ -22,6 +22,7 @@ package org.apache.cxf.ws.discovery;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
+import javax.xml.ws.wsaddressing.W3CEndpointReference;
import org.apache.cxf.Bus;
import org.apache.cxf.BusFactory;
@@ -31,6 +32,7 @@ import org.apache.cxf.ws.discovery.wsdl.
import org.apache.cxf.ws.discovery.wsdl.ProbeMatchType;
import org.apache.cxf.ws.discovery.wsdl.ProbeMatchesType;
import org.apache.cxf.ws.discovery.wsdl.ProbeType;
+import org.apache.cxf.ws.discovery.wsdl.ResolveMatchType;
import org.apache.cxf.ws.discovery.wsdl.ScopesType;
@@ -75,14 +77,22 @@ public final class WSDiscoveryClientTest
}
pmts = c.probe(pt);
System.out.println("3");
-
+
+ W3CEndpointReference ref = null;
if (pmts != null) {
for (ProbeMatchType pmt : pmts.getProbeMatch()) {
+ ref = pmt.getEndpointReference();
System.out.println("Found " + pmt.getEndpointReference());
System.out.println(pmt.getTypes());
System.out.println(pmt.getXAddrs());
}
}
+
+ ResolveMatchType rmt = c.resolve(ref);
+ System.out.println("Resolved " + rmt.getEndpointReference());
+ System.out.println(rmt.getTypes());
+ System.out.println(rmt.getXAddrs());
+
service.unregister(h);
System.out.println("4");
c.close();