You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by gn...@apache.org on 2008/12/12 14:10:28 UTC
svn commit: r725994 - in
/servicemix/components/bindings/servicemix-http/trunk/src:
main/java/org/apache/servicemix/http/endpoints/
test/java/org/apache/servicemix/http/
Author: gnodet
Date: Fri Dec 12 05:10:27 2008
New Revision: 725994
URL: http://svn.apache.org/viewvc?rev=725994&view=rev
Log:
SM-1721: The soap-consumer endpoint should be able to proxy the target endpoint's wsdl if none is provided
Modified:
servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/HttpConsumerEndpoint.java
servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/HttpSoapConsumerEndpoint.java
servicemix/components/bindings/servicemix-http/trunk/src/test/java/org/apache/servicemix/http/ConsumerEndpointTest.java
Modified: servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/HttpConsumerEndpoint.java
URL: http://svn.apache.org/viewvc/servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/HttpConsumerEndpoint.java?rev=725994&r1=725993&r2=725994&view=diff
==============================================================================
--- servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/HttpConsumerEndpoint.java (original)
+++ servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/HttpConsumerEndpoint.java Fri Dec 12 05:10:27 2008
@@ -380,8 +380,7 @@
}
}
- protected void loadStaticResources() {
- // TODO: load wsdl
+ protected void loadStaticResources() throws Exception {
}
/**
Modified: servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/HttpSoapConsumerEndpoint.java
URL: http://svn.apache.org/viewvc/servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/HttpSoapConsumerEndpoint.java?rev=725994&r1=725993&r2=725994&view=diff
==============================================================================
--- servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/HttpSoapConsumerEndpoint.java (original)
+++ servicemix/components/bindings/servicemix-http/trunk/src/main/java/org/apache/servicemix/http/endpoints/HttpSoapConsumerEndpoint.java Fri Dec 12 05:10:27 2008
@@ -16,23 +16,39 @@
*/
package org.apache.servicemix.http.endpoints;
-import java.io.IOException;
import java.io.InputStream;
+import java.io.IOException;
+import java.net.URI;
+import java.util.Map;
+import java.util.Iterator;
+import java.util.List;
+import javax.jbi.JBIException;
+import javax.jbi.component.ComponentContext;
import javax.jbi.management.DeploymentException;
import javax.jbi.servicedesc.ServiceEndpoint;
import javax.wsdl.Definition;
import javax.wsdl.Port;
+import javax.wsdl.PortType;
import javax.wsdl.Service;
import javax.wsdl.WSDLException;
+import javax.wsdl.Import;
+import javax.wsdl.Types;
import javax.wsdl.extensions.soap.SOAPAddress;
import javax.wsdl.extensions.soap12.SOAP12Address;
+import javax.wsdl.extensions.ExtensibilityElement;
+import javax.wsdl.extensions.schema.Schema;
+import javax.wsdl.extensions.schema.SchemaImport;
+import javax.wsdl.extensions.schema.SchemaReference;
import javax.xml.namespace.QName;
+import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.apache.servicemix.common.DefaultComponent;
import org.apache.servicemix.common.ServiceUnit;
+import org.apache.servicemix.common.tools.wsdl.PortTypeDecorator;
+import org.apache.servicemix.http.HttpComponent;
import org.apache.servicemix.soap.api.Policy;
import org.apache.servicemix.soap.util.DomUtil;
import org.apache.servicemix.soap.wsdl.BindingFactory;
@@ -58,6 +74,7 @@
private Resource wsdl;
private boolean useJbiWrapper = true;
private boolean validateWsdl = true;
+ private String soapVersion = "1.1";
private Policy[] policies;
public HttpSoapConsumerEndpoint() {
@@ -115,6 +132,26 @@
this.useJbiWrapper = useJbiWrapper;
}
+ /**
+ * Specifies the SOAP version to use when generating a wsdl binding for the wsdl of the target endpoint.
+ *
+ * @param soapVersion the soapVersion to use
+ * @org.apache.xbean.Property description="Specifies the SOAP version to use when generating a wsdl binding for
+ * the wsdl of the target endpoint. The default value is '1.1'"
+ */
+ public void setSoapVersion(String soapVersion) {
+ this.soapVersion = soapVersion;
+ }
+
+ /**
+ * Get the defined SOAP version to use
+ *
+ * @return the defined SOAP version to use
+ */
+ public String getSoapVersion() {
+ return this.soapVersion;
+ }
+
public Policy[] getPolicies() {
return policies;
}
@@ -129,112 +166,255 @@
this.policies = policies;
}
+ /**
+ * Populate the description with the provided WSDL
+ *
+ * @throws DeploymentException if the provided WSDL can't be read
+ */
+ protected void useProvidedWsdl() throws Exception {
+ description = DomUtil.parse(wsdl.getInputStream());
+ definition = javax.wsdl.factory.WSDLFactory.newInstance().newWSDLReader().readWSDL(null, description);
+ }
+
+ /**
+ * Populate the description with the target endpoint WSDL
+ *
+ * @throws Exception if the proxed WSDL is not found
+ */
+ protected void useProxiedWsdl() throws Exception {
+ // get the component context
+ ComponentContext componentContext = this.serviceUnit.getComponent().getComponentContext();
+ // get the targetService endpoint
+ ServiceEndpoint targetEndpoint = null;
+ // if the user has defined the targetService and targetEndpoint, use it
+ if (getTargetService() != null && getTargetEndpoint() != null) {
+ targetEndpoint = componentContext.getEndpoint(getTargetService(), getTargetEndpoint());
+ }
+ // if the user has defined the targetService, use it
+ if (targetEndpoint == null && getTargetService() != null) {
+ ServiceEndpoint[] endPoints = componentContext.getEndpointsForService(this.getTargetService());
+ if (endPoints != null && endPoints.length > 0) {
+ targetEndpoint = endPoints[0];
+ }
+ }
+ // if the user has defined the targetInterfaceName, use it
+ if (targetEndpoint == null && this.getTargetInterface() != null) {
+ ServiceEndpoint[] endPoints = componentContext.getEndpoints(this.getTargetInterface());
+ if (endPoints != null && endPoints.length > 0) {
+ targetEndpoint = endPoints[0];
+ }
+ }
+ // if the targetEndpoint has not be identified, raise an JBI exception
+ if (targetEndpoint == null) {
+ throw new JBIException("The target endpoint is not found.");
+ }
+ // get the target endpoint descriptor
+ Document targetEndpointDescriptor = componentContext.getEndpointDescriptor(targetEndpoint);
+ // TODO: check for null
+ // get the target endpoint definition (based on the descriptor)
+ Definition targetEndpointDefinition = javax.wsdl.factory.WSDLFactory.newInstance().newWSDLReader().readWSDL(null, targetEndpointDescriptor);
+ // check if the WSDL is the target component as a WSDL definition
+ if (targetEndpointDefinition == null) {
+ throw new JBIException("The target component has no WSDL definition.");
+ }
+ // get the targetService in the endpoint definition
+ Service targetServiceInDefinition = targetEndpointDefinition.getService(this.getTargetService());
+ // get the targetEndpoint port
+ Port targetEndpointPort = (targetServiceInDefinition != null) ? targetServiceInDefinition.getPort(this.getTargetEndpoint()) : null;
+ // get the targetEndpoint port type
+ PortType targetEndpointPortType = (targetEndpointPort != null) ? targetEndpointPort.getBinding().getPortType() : null;
+ // try to get the endpoint port type using the first defined in the definition
+ if (targetEndpointPortType == null) {
+ QName[] portTypes = (QName[]) targetEndpointDefinition.getPortTypes().keySet().toArray(new QName[0]);
+ if(portTypes != null && portTypes.length > 0) {
+ targetEndpointPortType = targetEndpointDefinition.getPortType(portTypes[0]);
+ }
+ }
+ if(targetEndpointPortType == null) {
+ throw new JBIException("The target port type is not defined.");
+ }
+ // if the port type is found, make a cleanup on the definition
+ if (targetEndpointPortType != null) {
+ // cleanup port types
+ QName[] qnames = (QName[]) targetEndpointDefinition.getPortTypes().keySet().toArray(new QName[0]);
+ for(int i = 0; i < qnames.length; i++) {
+ if(!qnames[i].equals(targetEndpointPortType.getQName())) {
+ targetEndpointDefinition.removePortType(qnames[i]);
+ }
+ }
+ // cleanup services
+ qnames = (QName[]) targetEndpointDefinition.getServices().keySet().toArray(new QName[0]);
+ for(int i = 0; i < qnames.length; i++) {
+ targetEndpointDefinition.removeService(qnames[i]);
+ }
+ // cleanup bindings
+ qnames = (QName[]) targetEndpointDefinition.getBindings().keySet().toArray(new QName[0]);
+ for(int i = 0; i < qnames.length; i++) {
+ targetEndpointDefinition.removeBinding(qnames[i]);
+ }
+ // format the location URI
+ String location = this.getLocationURI();
+ if(!location.endsWith("/")) {
+ location += "/";
+ }
+ // construct the location URI using HTTP component configuration
+ HttpComponent httpComponent = (HttpComponent) this.serviceUnit.getComponent();
+ if (httpComponent.getConfiguration().isManaged()) {
+ // save the path
+ String path = new URI(location).getPath();
+ // format the new location
+ location = "http://localhost";
+ // construct the location using the HttpComponent configuration
+ if(httpComponent.getHost() != null) {
+ // prefix with the protocol
+ if(httpComponent.getProtocol() != null) {
+ // the protocol is defined in the component configuration
+ location = httpComponent.getProtocol() + "://";
+ }
+ else {
+ // define HTTP protocol as default
+ location = "http://";
+ }
+ // add the configured host
+ location += httpComponent.getHost();
+ // add the configured port number (if it's not the 80)
+ if(httpComponent.getPort() != 80) {
+ location += ":" + httpComponent.getPort();
+ }
+ // add the path (location URI)
+ if(httpComponent.getPath() != null) {
+ location += httpComponent.getPath();
+ }
+ }
+ // add the component configuration path mapping
+ location += httpComponent.getConfiguration().getMapping() + path;
+ }
+ if (targetEndpointPortType.getQName().getNamespaceURI().equals(this.getService().getNamespaceURI())) {
+ PortTypeDecorator.decorate(targetEndpointDefinition, targetEndpointPortType, location, endpoint + "Binding", service.getLocalPart(), endpoint, soapVersion);
+ definition = targetEndpointDefinition;
+ }
+ else {
+ definition = PortTypeDecorator.createImportDef(targetEndpointDefinition, service.getNamespaceURI(), "porttypedef.wsdl");
+ PortTypeDecorator.decorate(definition, targetEndpointPortType, location, endpoint + "Binding", service.getLocalPart(), endpoint, soapVersion);
+ }
+ description = javax.wsdl.factory.WSDLFactory.newInstance().newWSDLWriter().getDocument(definition);
+ }
+ }
+
+ @Override
+ public void activate() throws Exception {
+ if (wsdl != null) {
+ // the user has provided a WSDL
+ useProvidedWsdl();
+ } else {
+ // the user hasn't provided a WSDL, use the target endpoint one (if exist)
+ useProxiedWsdl();
+ }
+ // validate the WSDL in description
+ // get the document element
+ Element element = description.getDocumentElement();
+ // validate depending of the namespace
+ if (WSDLUtils.WSDL1_NAMESPACE.equals(element.getNamespaceURI())) {
+ validateWsdl1();
+ } else if (WSDLUtils.WSDL2_NAMESPACE.equals(element.getNamespaceURI())) {
+ validateWsdl2();
+ } else {
+ throw new DeploymentException("The WSDL namespace " + element.getNamespaceURI() + " is not supported");
+ }
+ super.activate();
+ }
+
@Override
public void validate() throws DeploymentException {
- if (wsdl == null) {
- throw new DeploymentException("wsdl property must be set");
+ // the validate method is dedicated to the attributes value check
+
+ // 1 - check the target attributes
+ // if the user doesn't define the targetService or targetInterface or targetUri,
+ // define the targetService/targetEndpoint as the current one
+ if (getTargetService() == null && getTargetInterface() == null && getTargetUri() == null) {
+ setTargetService(getService());
+ setTargetEndpoint(getEndpoint());
}
+
+ // 2 - check the marshaler
HttpSoapConsumerMarshaler marshaler;
if (getMarshaler() instanceof HttpSoapConsumerMarshaler) {
- marshaler = (HttpSoapConsumerMarshaler)getMarshaler();
+ marshaler = (HttpSoapConsumerMarshaler) getMarshaler();
} else if (getMarshaler() == null) {
marshaler = new HttpSoapConsumerMarshaler();
+ setMarshaler(marshaler);
} else {
throw new DeploymentException("The configured marshaler must inherit HttpSoapConsumerMarshaler");
}
- try {
- description = DomUtil.parse(wsdl.getInputStream());
- Element elem = description.getDocumentElement();
- if (WSDLUtils.WSDL1_NAMESPACE.equals(elem.getNamespaceURI())) {
- validateWsdl1(marshaler);
- } else if (WSDLUtils.WSDL2_NAMESPACE.equals(elem.getNamespaceURI())) {
- validateWsdl2(marshaler);
- } else {
- throw new DeploymentException("Unrecognized wsdl namespace: " + elem.getNamespaceURI());
- }
- marshaler.setUseJbiWrapper(useJbiWrapper);
- marshaler.setPolicies(policies);
- setMarshaler(marshaler);
- } catch (DeploymentException e) {
- throw e;
- } catch (Exception e) {
- throw new DeploymentException("Unable to read WSDL from: " + wsdl, e);
- }
- if (getTargetService() == null && getTargetInterface() == null && getTargetUri() == null) {
- setTargetService(getService());
- setTargetEndpoint(getEndpoint());
- }
+ // define the marshaler properties
+ marshaler.setUseJbiWrapper(useJbiWrapper);
+ marshaler.setPolicies(policies);
super.validate();
}
- protected void loadStaticResources() {
- addResource(MAIN_WSDL, description);
+ protected void loadStaticResources() throws Exception {
+ mapDefinition(definition);
}
- protected void validateWsdl1(HttpSoapConsumerMarshaler marshaler) throws Exception {
- InputStream is = wsdl.getInputStream();
- try {
- InputSource inputSource = new InputSource(is);
- inputSource.setSystemId(wsdl.getURL().toString());
- Definition def = WSDLUtils.createWSDL11Reader().readWSDL(wsdl.getURL().toString(), inputSource);
- if (validateWsdl) {
- WSIBPValidator validator = new WSIBPValidator(def);
- if (!validator.isValid()) {
- throw new DeploymentException("WSDL is not WS-I BP compliant: " + validator.getErrors());
- }
+ protected void validateWsdl1() throws Exception {
+ // get the WSDL definition from the description
+ if (definition == null) {
+ throw new DeploymentException("The WSDL definition is not found in the description");
+ }
+ if (validateWsdl) {
+ WSIBPValidator validator = new WSIBPValidator(definition);
+ if (!validator.isValid()) {
+ throw new DeploymentException("WSDL is not WS-I BP compliant: " + validator.getErrors());
}
- Service svc;
- if (getService() != null) {
- svc = def.getService(getService());
- if (svc == null) {
- throw new DeploymentException("Could not find service '" + getService() + "' in wsdl");
- }
- } else if (def.getServices().size() == 1) {
- svc = (Service)def.getServices().values().iterator().next();
- setService(svc.getQName());
- } else {
- throw new DeploymentException(
- "If service is not set, the WSDL must contain a single service definition");
+ }
+ Service svc;
+ if (getService() != null) {
+ svc = definition.getService(getService());
+ if (svc == null) {
+ throw new DeploymentException("Could not find service '" + getService() + "' in wsdl");
}
- Port port;
- if (getEndpoint() != null) {
- port = svc.getPort(getEndpoint());
- if (port == null) {
- throw new DeploymentException("Cound not find port '" + getEndpoint()
- + "' in wsdl for service '" + getService() + "'");
- }
- } else if (svc.getPorts().size() == 1) {
- port = (Port)svc.getPorts().values().iterator().next();
- setEndpoint(port.getName());
- } else {
- throw new DeploymentException("If endpoint is not set, the WSDL service '" + getService()
- + "' must contain a single port definition");
+ } else if (definition.getServices().size() == 1) {
+ svc = (Service) definition.getServices().values().iterator().next();
+ setService(svc.getQName());
+ } else {
+ throw new DeploymentException("If service is not set, the WSDL must contain a single service definition");
+ }
+ Port port;
+ if (getEndpoint() != null) {
+ port = svc.getPort(getEndpoint());
+ if (port == null) {
+ throw new DeploymentException("Cound not find port '" + getEndpoint()
+ + "' in wsdl for service '" + getService() + "'");
}
- SOAPAddress soapAddress = WSDLUtils.getExtension(port, SOAPAddress.class);
- if (soapAddress != null) {
- soapAddress.setLocationURI(getLocationURI());
- } else {
- SOAP12Address soap12Address = WSDLUtils.getExtension(port, SOAP12Address.class);
- if (soap12Address != null) {
- soap12Address.setLocationURI(getLocationURI());
- }
+ } else if (svc.getPorts().size() == 1) {
+ port = (Port)svc.getPorts().values().iterator().next();
+ setEndpoint(port.getName());
+ } else {
+ throw new DeploymentException("If endpoint is not set, the WSDL service '" + getService()
+ + "' must contain a single port definition");
+ }
+ SOAPAddress soapAddress = WSDLUtils.getExtension(port, SOAPAddress.class);
+ if (soapAddress != null) {
+ soapAddress.setLocationURI(getLocationURI());
+ } else {
+ SOAP12Address soap12Address = WSDLUtils.getExtension(port, SOAP12Address.class);
+ if (soap12Address != null) {
+ soap12Address.setLocationURI(getLocationURI());
}
- description = WSDLUtils.getWSDL11Factory().newWSDLWriter().getDocument(def);
- marshaler.setBinding(BindingFactory.createBinding(port));
- } finally {
- is.close();
}
+ description = WSDLUtils.getWSDL11Factory().newWSDLWriter().getDocument(definition);
+ ((HttpSoapConsumerMarshaler) getMarshaler()).setBinding(BindingFactory.createBinding(port));
}
- protected void validateWsdl2(HttpSoapConsumerMarshaler marshaler) throws Exception {
- new Wsdl2Validator().validate(marshaler);
+ protected void validateWsdl2() throws Exception {
+ new Wsdl2Validator().validate();
}
/**
* Use an inner class to avoid having a strong dependency on Woden if not needed
*/
protected class Wsdl2Validator {
- public void validate(HttpSoapConsumerMarshaler marshaler) throws Exception {
+ public void validate() throws Exception {
WSDLReader reader = WSDLFactory.newInstance().newWSDLReader();
DescriptionElement descElement = reader.readWSDL(wsdl.getURL().toString());
Description desc = descElement.toComponent();
@@ -248,8 +428,7 @@
svc = desc.getServices()[0];
setService(svc.getName());
} else {
- throw new DeploymentException(
- "If service is not set, the WSDL must contain a single service definition");
+ throw new DeploymentException("If service is not set, the WSDL must contain a single service definition");
}
Endpoint endpoint;
if (getEndpoint() != null) {
@@ -265,8 +444,104 @@
throw new DeploymentException("If endpoint is not set, the WSDL service '" + getService()
+ "' must contain a single port definition");
}
- marshaler.setBinding(BindingFactory.createBinding(endpoint));
+ ((HttpSoapConsumerMarshaler) getMarshaler()).setBinding(BindingFactory.createBinding(endpoint));
+ }
+ }
+
+ protected void mapDefinition(Definition def) throws WSDLException {
+ addResource("main.wsdl", javax.wsdl.factory.WSDLFactory.newInstance().newWSDLWriter().getDocument(def));
+ mapImports(def, "");
+ }
+
+ protected void mapImports(Definition def, String contextPath) throws WSDLException {
+ // Add other imports to mapping
+ Map imports = def.getImports();
+ for (Iterator iter = imports.values().iterator(); iter.hasNext();) {
+ List imps = (List) iter.next();
+ for (Iterator iterator = imps.iterator(); iterator.hasNext();) {
+ Import imp = (Import) iterator.next();
+ Definition impDef = imp.getDefinition();
+ String impLoc = imp.getLocationURI();
+ if (impDef != null && impLoc != null && !URI.create(impLoc).isAbsolute()) {
+ impLoc = resolveRelativeURI(contextPath, impLoc);
+ addResource(impLoc, javax.wsdl.factory.WSDLFactory.newInstance().newWSDLWriter().getDocument(impDef));
+ mapImports(impDef, getURIParent(impLoc));
+ }
+ }
}
+ // Add schemas to mapping
+ Types types = def.getTypes();
+ if (types != null) {
+ for (Iterator it = types.getExtensibilityElements().iterator(); it.hasNext();) {
+ ExtensibilityElement ee = (ExtensibilityElement) it.next();
+ if (ee instanceof Schema) {
+ Schema schema = (Schema) ee;
+ mapSchema(schema, "");
+ }
+ }
+ }
+ }
+
+ private void mapSchema(Schema schema, String contextPath) {
+ Map schemaImports = schema.getImports();
+ for (Iterator iter = schemaImports.values().iterator(); iter.hasNext();) {
+ List imps = (List) iter.next();
+ for (Iterator iterator = imps.iterator(); iterator.hasNext();) {
+ SchemaImport schemaImport = (SchemaImport) iterator.next();
+ Schema schemaImp = schemaImport.getReferencedSchema();
+ String schemaLoc = schemaImport.getSchemaLocationURI();
+ if (schemaLoc != null && schemaImp != null && schemaImp.getElement() != null && !URI.create(schemaLoc).isAbsolute()) {
+ schemaLoc = resolveRelativeURI(contextPath, schemaLoc);
+ addResource(schemaLoc, schemaImp.getElement());
+ // recursively map imported schemas
+ mapSchema(schemaImp, getURIParent(schemaLoc));
+ }
+ }
+ }
+ List schemaIncludes = schema.getIncludes();
+ for (Iterator iter = schemaIncludes.iterator(); iter.hasNext();) {
+ SchemaReference schemaInclude = (SchemaReference) iter.next();
+ Schema schemaImp = schemaInclude.getReferencedSchema();
+ String schemaLoc = schemaInclude.getSchemaLocationURI();
+ if (schemaLoc != null && schemaImp != null && schemaImp.getElement() != null && !URI.create(schemaLoc).isAbsolute()) {
+ schemaLoc = resolveRelativeURI(contextPath, schemaLoc);
+ addResource(schemaLoc, schemaImp.getElement());
+ // recursively map included schemas
+ mapSchema(schemaImp, getURIParent(schemaLoc));
+ }
+ }
+ }
+
+ /**
+ * Combines a relative path with a current directory, normalising any
+ * relative pathnames like "." and "..".
+ * <p>
+ * Example:
+ * <table>
+ * <tr><th>context</th><th>path</th><th>resolveRelativeURI(context, path)</th></tr>
+ * <tr><td>addressModification</td><td>../common/DataType.xsd</td><td>common/DataType.xsd</td></tr>
+ * </table>
+ *
+ * @param context The current directory.
+ * @param path The relative path to resolve against the current directory.
+ * @return the normalised path.
+ */
+ private static String resolveRelativeURI(String context, String path) {
+ if (context.length() > 0) {
+ return URI.create(context + "/" + path).normalize().getPath();
+ } else {
+ return path;
+ }
+ }
+
+ /**
+ * Removes the filename part of a URI path.
+ *
+ * @param path A URI path part.
+ * @return The URI path part with the filename part removed.
+ */
+ private static String getURIParent(String path) {
+ return URI.create(path + "/..").normalize().getPath();
}
}
Modified: servicemix/components/bindings/servicemix-http/trunk/src/test/java/org/apache/servicemix/http/ConsumerEndpointTest.java
URL: http://svn.apache.org/viewvc/servicemix/components/bindings/servicemix-http/trunk/src/test/java/org/apache/servicemix/http/ConsumerEndpointTest.java?rev=725994&r1=725993&r2=725994&view=diff
==============================================================================
--- servicemix/components/bindings/servicemix-http/trunk/src/test/java/org/apache/servicemix/http/ConsumerEndpointTest.java (original)
+++ servicemix/components/bindings/servicemix-http/trunk/src/test/java/org/apache/servicemix/http/ConsumerEndpointTest.java Fri Dec 12 05:10:27 2008
@@ -24,16 +24,26 @@
import java.io.ByteArrayOutputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
+import java.io.StringWriter;
import javax.jbi.messaging.MessageExchange;
import javax.jbi.messaging.MessagingException;
import javax.jbi.messaging.NormalizedMessage;
+import javax.jbi.servicedesc.ServiceEndpoint;
import javax.xml.namespace.QName;
import javax.xml.transform.TransformerException;
import javax.xml.transform.stream.StreamSource;
+import javax.wsdl.factory.WSDLFactory;
+import javax.wsdl.xml.WSDLReader;
+import javax.wsdl.Definition;
+import javax.wsdl.Binding;
+import javax.wsdl.BindingOperation;
+import javax.wsdl.extensions.ExtensibilityElement;
+import javax.wsdl.extensions.soap.SOAPOperation;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
+import org.w3c.dom.Document;
import org.w3c.dom.traversal.NodeIterator;
import junit.framework.TestCase;
@@ -627,4 +637,41 @@
}
}
+ public void testProxyWsl() throws Exception {
+ final Document wsdl = DomUtil.parse(getClass().getResourceAsStream("/org/apache/servicemix/http/Echo.wsdl"));
+ EchoComponent echo = new EchoComponent() {
+ @Override
+ public Document getServiceDescription(ServiceEndpoint endpoint) {
+ return wsdl;
+ }
+ };
+ echo.setService(new QName("http://test", "MyConsumerService"));
+ echo.setEndpoint("myConsumer");
+ container.activateComponent(echo, "echo");
+
+ HttpComponent http = new HttpComponent();
+ HttpSoapConsumerEndpoint ep1 = new HttpSoapConsumerEndpoint();
+ ep1.setService(new QName("uri:HelloWorld", "HelloService"));
+ ep1.setEndpoint("HelloPortSoap11");
+ ep1.setTargetService(new QName("http://test", "MyConsumerService"));
+ ep1.setLocationURI("http://localhost:8192/ep1/");
+ ep1.setValidateWsdl(true);
+ http.setEndpoints(new HttpEndpointType[] {ep1});
+ container.activateComponent(http, "http");
+ container.start();
+
+ WSDLFactory factory = WSDLFactory.newInstance();
+ WSDLReader reader = factory.newWSDLReader();
+ Definition def = reader.readWSDL("http://localhost:8192/ep1/?wsdl");
+ StringWriter writer = new StringWriter();
+ factory.newWSDLWriter().writeWSDL(def, writer);
+ log.info(writer.toString());
+ Binding b = (Binding) def.getBindings().values().iterator().next();
+ BindingOperation bop = (BindingOperation) b.getBindingOperations().iterator().next();
+ assertEquals(1, bop.getExtensibilityElements().size());
+ ExtensibilityElement ee = (ExtensibilityElement) bop.getExtensibilityElements().iterator().next();
+ assertTrue(ee instanceof SOAPOperation);
+ assertEquals("", ((SOAPOperation) ee).getSoapActionURI());
+ }
+
}