summaryrefslogtreecommitdiffstats
path: root/sca-java-2.x/contrib/modules/binding-ws-runtime-jaxws-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/jaxws/axis2/JAXWSServiceBindingProvider.java
diff options
context:
space:
mode:
Diffstat (limited to 'sca-java-2.x/contrib/modules/binding-ws-runtime-jaxws-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/jaxws/axis2/JAXWSServiceBindingProvider.java')
-rw-r--r--sca-java-2.x/contrib/modules/binding-ws-runtime-jaxws-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/jaxws/axis2/JAXWSServiceBindingProvider.java169
1 files changed, 149 insertions, 20 deletions
diff --git a/sca-java-2.x/contrib/modules/binding-ws-runtime-jaxws-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/jaxws/axis2/JAXWSServiceBindingProvider.java b/sca-java-2.x/contrib/modules/binding-ws-runtime-jaxws-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/jaxws/axis2/JAXWSServiceBindingProvider.java
index c32c5964c9..e5f297c9fc 100644
--- a/sca-java-2.x/contrib/modules/binding-ws-runtime-jaxws-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/jaxws/axis2/JAXWSServiceBindingProvider.java
+++ b/sca-java-2.x/contrib/modules/binding-ws-runtime-jaxws-axis2/src/main/java/org/apache/tuscany/sca/binding/ws/jaxws/axis2/JAXWSServiceBindingProvider.java
@@ -18,77 +18,201 @@
*/
package org.apache.tuscany.sca.binding.ws.jaxws.axis2;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
-import java.util.Map;
-import javax.wsdl.factory.WSDLFactory;
-import javax.wsdl.xml.WSDLWriter;
-import javax.xml.namespace.QName;
-import javax.xml.transform.Source;
-import javax.xml.transform.stream.StreamSource;
+import javax.wsdl.Port;
+import javax.xml.ws.Binding;
import javax.xml.ws.Endpoint;
-import javax.xml.ws.ServiceMode;
-import javax.xml.ws.WebServiceProvider;
-import javax.xml.ws.Service.Mode;
-import org.apache.axis2.jaxws.server.endpoint.EndpointImpl;
+import org.apache.axiom.om.OMElement;
+import org.apache.axis2.context.ConfigurationContext;
+import org.apache.axis2.description.AxisService;
+import org.apache.axis2.jaxws.binding.BindingUtils;
+import org.apache.axis2.jaxws.description.DescriptionFactory;
+import org.apache.axis2.jaxws.description.EndpointDescription;
+import org.apache.axis2.jaxws.description.ServiceDescription;
+import org.apache.axis2.jaxws.description.builder.DescriptionBuilderComposite;
+import org.apache.axis2.jaxws.description.builder.WebServiceProviderAnnot;
+import org.apache.axis2.jaxws.description.builder.converter.JavaClassToDBCConverter;
+import org.apache.axis2.jaxws.description.impl.DescriptionFactoryImpl;
import org.apache.tuscany.sca.binding.ws.WebServiceBinding;
import org.apache.tuscany.sca.binding.ws.jaxws.JAXWSBindingProvider;
import org.apache.tuscany.sca.core.ExtensionPointRegistry;
import org.apache.tuscany.sca.core.FactoryExtensionPoint;
import org.apache.tuscany.sca.core.UtilityExtensionPoint;
import org.apache.tuscany.sca.databinding.DataBindingExtensionPoint;
+import org.apache.tuscany.sca.host.http.SecurityContext;
import org.apache.tuscany.sca.host.http.ServletHost;
import org.apache.tuscany.sca.interfacedef.InterfaceContract;
import org.apache.tuscany.sca.invocation.MessageFactory;
import org.apache.tuscany.sca.provider.ServiceBindingProvider;
+import org.apache.tuscany.sca.runtime.RuntimeComponent;
+import org.apache.tuscany.sca.runtime.RuntimeComponentService;
import org.apache.tuscany.sca.runtime.RuntimeEndpoint;
import org.apache.tuscany.sca.runtime.RuntimeProperties;
+import org.oasisopen.sca.ServiceRuntimeException;
public class JAXWSServiceBindingProvider implements ServiceBindingProvider {
+ // Tuscany extensions
+ private ExtensionPointRegistry extensionPoints;
+ private ServletHost servletHost;
+
+ // Tuscany WS service data
+ private RuntimeComponent component;
+ private RuntimeComponentService service;
private RuntimeEndpoint endpoint;
+ private InterfaceContract contract;
private WebServiceBinding wsBinding;
+ private Port wsdlPort;
+ private String endpointURI;
+ private String deployedURI;
+ protected SecurityContext httpSecurityContext;
+ // JAXWS fields
private JAXWSBindingProvider jaxwsBindingProvider;
-
private Endpoint wsEndpoint;
+
+ // Axis2 fields
+ private ConfigurationContext configContext;
public JAXWSServiceBindingProvider(ExtensionPointRegistry extensionPoints,
RuntimeEndpoint endpoint,
ServletHost servletHost) {
+ this.extensionPoints = extensionPoints;
+ this.endpoint = endpoint;
+ this.wsBinding = (WebServiceBinding)endpoint.getBinding();
+ this.component = (RuntimeComponent)endpoint.getComponent();
+ this.contract = wsBinding.getBindingInterfaceContract();
+ this.service = (RuntimeComponentService)endpoint.getService();
+ this.servletHost = servletHost;
+
+ // TODO
+ this.httpSecurityContext = new SecurityContext();
+
+ // Set to use the Axiom data binding
+ contract.getInterface().resetDataBinding(OMElement.class.getName());
+
+ // A WSDL document should always be present in the binding
+ if (wsBinding.getWSDLDocument() == null) {
+ throw new ServiceRuntimeException("No WSDL document for " + component.getName() + "/" + service.getName());
+ }
+
+ // Update port addresses with runtime information
+ // We can safely assume there is only one port here because you configure
+ // a binding in the following ways:
+ // 1/ default - one port generated = host domain : host port / structural path
+ // 2/ uri="absolute addr" - one port generated = host domain : uri port / uri path
+ // 3/ uri="relative addr" - one port generated = host domain : host port / structural path / relative path
+ // 4/ wsdl.binding - one port generated = host domain : host port / structural path
+ // 5/ wsdl.port - one port generated = host domain : port port / port path
+ // 6/ wsa:Address - one port generated = host domain : address port / address path
+ // 7/ 4 + 6 - as 6
+ wsdlPort = (Port)wsBinding.getService().getPorts().values().iterator().next();
+
+ if (wsdlPort == null){
+ throw new ServiceRuntimeException("No WSDL port for ws binding of " + component.getName() + "/" + service.getName());
+ }
+
+ endpointURI = Axis2EngineIntegration.getPortAddress(wsdlPort);
+
+ if (endpointURI.startsWith("jms:")) {
+ deployedURI = endpointURI;
+ //isJMSRequired = true;
+ } else {
+ if (servletHost == null) {
+ throw new ServiceRuntimeException("No Servlet host is avaible for HTTP web services");
+ }
+ deployedURI = servletHost.getURLMapping(endpointURI, httpSecurityContext).toString();
+ }
+
+ wsBinding.setURI(deployedURI);
+
FactoryExtensionPoint modelFactories = extensionPoints.getExtensionPoint(FactoryExtensionPoint.class);
DataBindingExtensionPoint dataBindings = extensionPoints.getExtensionPoint(DataBindingExtensionPoint.class);
+
+ // TODO ===
String defaultPort = "8085";
RuntimeProperties ps = extensionPoints.getExtensionPoint(UtilityExtensionPoint.class).getUtility(RuntimeProperties.class);
String pp = ps.getProperties().getProperty(this.getClass().getName() + ".defaultPort");
if (pp != null) {
defaultPort = ps.getProperties().getProperty(this.getClass().getName() + ".defaultPort");
}
-
- this.endpoint = endpoint;
- this.wsBinding = (WebServiceBinding)endpoint.getBinding();
+ // ========
jaxwsBindingProvider = new JAXWSBindingProvider(endpoint,
servletHost,
modelFactories,
dataBindings,
defaultPort);
+
+ // get the Axis configuration context
+ configContext = Axis2EngineIntegration.getAxisConfigurationContext(extensionPoints.getServiceDiscovery());
+ configContext.setContextRoot(servletHost.getContextPath());
}
+
+ public void start() {
+ // experiment in how to install a JAXWS provider into Axis2 programatically
+ try {
+ // create the service description
+ JavaClassToDBCConverter converter = new JavaClassToDBCConverter(jaxwsBindingProvider.getClass());
+ HashMap<String, DescriptionBuilderComposite> dbcMap = converter.produceDBC();
+ // Set the details of the service we are going to expose through this provider
+ // TODO - There is something odd in the way that service name is calculated in
+ // some circumstances
+ // sometimes getServiceName() returns null
+ // sometimes getService().getQName returns a QName namespace that doesn't match the WSDL
+ // sometimes getNamespace() returns null
+ // So here we delve directly into the WSDL4J model as the Tuscany model isn't up to date
+ String targetNamespace = wsBinding.getWSDLDefinition().getDefinition().getTargetNamespace();
+ WebServiceProviderAnnot webServiceProviderAnnot = WebServiceProviderAnnot.createWebServiceAnnotImpl();
+ webServiceProviderAnnot.setTargetNamespace(targetNamespace);
+ webServiceProviderAnnot.setServiceName(wsBinding.getService().getQName().getLocalPart());
+ webServiceProviderAnnot.setPortName(wsBinding.getPort().getName());
+
+ // adjust the service description to match the service we're actually exposing
+ DescriptionBuilderComposite dbc = dbcMap.values().iterator().next();
+ dbc.setWebServiceProviderAnnot(webServiceProviderAnnot);
+ dbc.setWsdlDefinition(wsBinding.getWSDLDefinition().getDefinition());
+ List<ServiceDescription> serviceDescList = DescriptionFactoryImpl.createServiceDescriptionFromDBCMap(dbcMap, configContext);
+ ServiceDescription sd = null;
+ if (serviceDescList != null && serviceDescList.size() > 0) {
+ sd = serviceDescList.get(0);
+ }
+
+ // get the first endpoint
+ EndpointDescription endpointDesc = sd.getEndpointDescriptions_AsCollection().iterator().next();
+ //Binding binding = BindingUtils.createBinding(endpointDesc);
+
+ // Add the service into the configuration context
+ AxisService axisService = endpointDesc.getAxisService();
+ axisService.setName(endpointURI);
+ axisService.setServiceDescription("Tuscany configured AxisService for service: " + deployedURI);
+ axisService.setClientSide(false);
+ configContext.getAxisConfiguration().addService(axisService);
+
+ // fire up the Axis servlet
+ Axis2ServiceServlet servlet = new Axis2ServiceServlet();
+ servlet.init(configContext);
+ servletHost.addServletMapping(deployedURI, servlet);
+
+ } catch (Exception ex){
+ ex.printStackTrace();
+ }
+ }
+/*
public void start() {
- // experiment in how to install a JAXWS provider into Axis programmitcally starting
+ // experiment in how to install a JAXWS provider into Axis programatically starting
// with just using the JAXWS API. This is unlikely to be sufficient as we have to
// install policy etc but it's a start
// create the JAXWS endpoint based on the provider
//wsEndpoint = Endpoint.create(SOAPBinding.SOAP11HTTP_BINDING, jaxwsBindingProvider);
- wsEndpoint = new EndpointImpl(jaxwsBindingProvider);
+ //wsEndpoint = new EndpointImpl(jaxwsBindingProvider);
+ wsEndpoint = Endpoint.create(jaxwsBindingProvider);
// TODO - There is something odd in the way that service name is calculated in
// some circumstances
@@ -137,9 +261,14 @@ public class JAXWSServiceBindingProvider implements ServiceBindingProvider {
// Start up the endpoint
wsEndpoint.publish(wsBinding.getURI());
+ System.out.println("isPublished: " + wsEndpoint.isPublished());
+ System.out.println("getProperties: " + wsEndpoint.getProperties());
+ System.out.println("getMetadata: " + wsEndpoint.getMetadata());
+ System.out.println("getEndpointReference: " + wsEndpoint.getEndpointReference());
+
jaxwsBindingProvider.start();
-
}
+*/
public void stop() {
jaxwsBindingProvider.stop();