diff options
Diffstat (limited to 'sca-java-1.x/branches/sca-java-1.2/modules/binding-sca-axis2/src/main/java/org/apache')
5 files changed, 813 insertions, 0 deletions
diff --git a/sca-java-1.x/branches/sca-java-1.2/modules/binding-sca-axis2/src/main/java/org/apache/tuscany/sca/binding/sca/axis2/impl/Axis2SCABindingInvoker.java b/sca-java-1.x/branches/sca-java-1.2/modules/binding-sca-axis2/src/main/java/org/apache/tuscany/sca/binding/sca/axis2/impl/Axis2SCABindingInvoker.java new file mode 100644 index 0000000000..b067fae901 --- /dev/null +++ b/sca-java-1.x/branches/sca-java-1.2/modules/binding-sca-axis2/src/main/java/org/apache/tuscany/sca/binding/sca/axis2/impl/Axis2SCABindingInvoker.java @@ -0,0 +1,142 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tuscany.sca.binding.sca.axis2.impl; + +import java.util.logging.Logger; + +import org.apache.tuscany.sca.invocation.Interceptor; +import org.apache.tuscany.sca.invocation.Invoker; +import org.apache.tuscany.sca.invocation.Message; +import org.apache.tuscany.sca.runtime.EndpointReference; +import org.osoa.sca.ServiceUnavailableException; + + +/** + * A wrapper for the Axis2BindingInvoker that ensures that the url of the target + * service is correct by looking it up in the service registry if it is not provided + * + * @version $Rev: 563772 $ $Date: 2007-08-08 07:50:49 +0100 (Wed, 08 Aug 2007) $ + */ +public class Axis2SCABindingInvoker implements Interceptor { + + private final static Logger logger = Logger.getLogger(Axis2SCABindingInvoker.class.getName()); + + private int retryCount = 100; + private int retryInterval = 5000; //ms + private Invoker axis2Invoker; + private Axis2SCAReferenceBindingProvider provider; + + public Axis2SCABindingInvoker(Axis2SCAReferenceBindingProvider provider, Invoker axis2Invoker) { + this.axis2Invoker = axis2Invoker; + this.provider = provider; + } + + public void setNext(Invoker next) { + } + + public Invoker getNext() { + return null; + } + + /** + * Fix up the URL for the message. The "to" EndPoint comes from the wire + * target and needs to b replaced with the endpoint from the registry. + * The default URL for an Endpoint URI where there is no + * target component or service information, as in the case of a + * wire crossing a node boundary, is "/" + */ + public Message invoke(Message msg) { + + // make sure that the epr of the target service is set in the TO + // field of the message + EndpointReference to = msg.getTo(); + + // check to see if we either don't have an endpoint set or if the uri + // is dynamic or the target service is marked as unresolved + if ((to == null) || (to.getURI().equals("/") || (to.getContract() == null) || (to.getContract().isUnresolved()))) { + + EndpointReference eprTo = provider.getServiceEndpoint(); + + if (eprTo == null) { + throw new ServiceUnavailableException("Endpoint for service: " + provider.getSCABinding().getURI() + + " can't be found for component: " + + provider.getComponent().getName() + + " reference: " + + provider.getComponentReference().getName()); + } + msg.setTo(eprTo); + } + + // make sure that the epr of the callback service (if there is one) is set + // in the callbackReference field of the message. + EndpointReference callbackEPR = msg.getFrom().getReferenceParameters().getCallbackReference(); + + if ((callbackEPR == null) || (callbackEPR.getURI().equals("/"))) { + + callbackEPR = provider.getCallbackEndpoint(); + + if (callbackEPR != null) { + msg.getFrom().getReferenceParameters().setCallbackReference(callbackEPR); + } + } + + // do the axis2 stuff + Message returnMessage = null; + + // for (int i =0; i < retryCount; i++){ + + returnMessage = axis2Invoker.invoke(msg); + /* + if ( AxisFault.class.isInstance(returnMessage.getBody())){ + + AxisFault axisFault = returnMessage.getBody(); + + if (axisFault.getCause().getClass() == ConnectException.class) { + logger.log(Level.INFO, "Trying to send message to " + + msg.getTo().getURI()); + + // try and get the service endpoint again just in case + // it's moved + EndpointReference serviceEPR = provider.refreshServiceEndpoint(); + + if (serviceEPR == null) { + throw new ServiceUnavailableException("Endpoint for service: " + provider.getSCABinding().getURI() + + " can't be found for component: " + + provider.getComponent().getName() + + " reference: " + + provider.getComponentReference().getName()); + } + msg.setTo(serviceEPR); + } else { + break; + } + + } else { + break; + } + + try { + Thread.sleep(retryInterval); + } catch(InterruptedException ex) { + } + } + */ + return returnMessage; + } +} diff --git a/sca-java-1.x/branches/sca-java-1.2/modules/binding-sca-axis2/src/main/java/org/apache/tuscany/sca/binding/sca/axis2/impl/Axis2SCABindingProviderFactory.java b/sca-java-1.x/branches/sca-java-1.2/modules/binding-sca-axis2/src/main/java/org/apache/tuscany/sca/binding/sca/axis2/impl/Axis2SCABindingProviderFactory.java new file mode 100644 index 0000000000..6ced6de979 --- /dev/null +++ b/sca-java-1.x/branches/sca-java-1.2/modules/binding-sca-axis2/src/main/java/org/apache/tuscany/sca/binding/sca/axis2/impl/Axis2SCABindingProviderFactory.java @@ -0,0 +1,78 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.tuscany.sca.binding.sca.axis2.impl; + +import java.util.List; +import java.util.Map; + +import org.apache.tuscany.sca.binding.sca.DistributedSCABinding; +import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint; +import org.apache.tuscany.sca.core.ExtensionPointRegistry; +import org.apache.tuscany.sca.host.http.ServletHost; +import org.apache.tuscany.sca.host.http.ServletHostExtensionPoint; +import org.apache.tuscany.sca.invocation.MessageFactory; +import org.apache.tuscany.sca.node.NodeFactory; +import org.apache.tuscany.sca.policy.util.PolicyHandlerDefinitionsLoader; +import org.apache.tuscany.sca.policy.util.PolicyHandlerTuple; +import org.apache.tuscany.sca.provider.BindingProviderFactory; +import org.apache.tuscany.sca.provider.ReferenceBindingProvider; +import org.apache.tuscany.sca.provider.ServiceBindingProvider; +import org.apache.tuscany.sca.runtime.RuntimeComponent; +import org.apache.tuscany.sca.runtime.RuntimeComponentReference; +import org.apache.tuscany.sca.runtime.RuntimeComponentService; + +/** + * The factory for the Axis2 based implementation of the distributed sca binding + * + * @version $Rev: 563772 $ $Date: 2007-08-08 07:50:49 +0100 (Wed, 08 Aug 2007) $ + */ +public class Axis2SCABindingProviderFactory implements BindingProviderFactory<DistributedSCABinding> { + + private MessageFactory messageFactory; + private ServletHost servletHost; + private NodeFactory nodeFactory = null; + private Map<ClassLoader, List<PolicyHandlerTuple>> policyHandlerClassnames = null; + + + public Axis2SCABindingProviderFactory(ExtensionPointRegistry extensionPoints) { + ServletHostExtensionPoint servletHosts = extensionPoints.getExtensionPoint(ServletHostExtensionPoint.class); + this.servletHost = servletHosts.getServletHosts().get(0); + ModelFactoryExtensionPoint modelFactories = extensionPoints.getExtensionPoint(ModelFactoryExtensionPoint.class); + this.messageFactory = modelFactories.getFactory(MessageFactory.class); + nodeFactory = modelFactories.getFactory(NodeFactory.class); + policyHandlerClassnames = PolicyHandlerDefinitionsLoader.loadPolicyHandlerClassnames(); + } + + public ReferenceBindingProvider createReferenceBindingProvider(RuntimeComponent component, + RuntimeComponentReference reference, + DistributedSCABinding binding) { + return new Axis2SCAReferenceBindingProvider(nodeFactory, component, reference, binding, servletHost, messageFactory, policyHandlerClassnames); + } + + public ServiceBindingProvider createServiceBindingProvider(RuntimeComponent component, + RuntimeComponentService service, + DistributedSCABinding binding) { + return new Axis2SCAServiceBindingProvider(nodeFactory, component, service, binding, servletHost, messageFactory, policyHandlerClassnames); + } + + public Class<DistributedSCABinding> getModelType() { + return DistributedSCABinding.class; + } +} diff --git a/sca-java-1.x/branches/sca-java-1.2/modules/binding-sca-axis2/src/main/java/org/apache/tuscany/sca/binding/sca/axis2/impl/Axis2SCAReferenceBindingProvider.java b/sca-java-1.x/branches/sca-java-1.2/modules/binding-sca-axis2/src/main/java/org/apache/tuscany/sca/binding/sca/axis2/impl/Axis2SCAReferenceBindingProvider.java new file mode 100644 index 0000000000..fd9061b852 --- /dev/null +++ b/sca-java-1.x/branches/sca-java-1.2/modules/binding-sca-axis2/src/main/java/org/apache/tuscany/sca/binding/sca/axis2/impl/Axis2SCAReferenceBindingProvider.java @@ -0,0 +1,277 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.tuscany.sca.binding.sca.axis2.impl; + +import java.net.URI; +import java.util.List; +import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; + +import org.apache.axiom.om.OMElement; +import org.apache.tuscany.sca.assembly.Binding; +import org.apache.tuscany.sca.assembly.SCABinding; +import org.apache.tuscany.sca.binding.sca.DistributedSCABinding; +import org.apache.tuscany.sca.binding.ws.DefaultWebServiceBindingFactory; +import org.apache.tuscany.sca.binding.ws.WebServiceBinding; +import org.apache.tuscany.sca.binding.ws.axis2.Axis2ReferenceBindingProvider; +import org.apache.tuscany.sca.core.assembly.EndpointReferenceImpl; +import org.apache.tuscany.sca.domain.SCADomainEventService; +import org.apache.tuscany.sca.host.http.ServletHost; +import org.apache.tuscany.sca.interfacedef.InterfaceContract; +import org.apache.tuscany.sca.interfacedef.Operation; +import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceContract; +import org.apache.tuscany.sca.interfacedef.wsdl.java2wsdl.Java2WSDLHelper; +import org.apache.tuscany.sca.invocation.Invoker; +import org.apache.tuscany.sca.invocation.MessageFactory; +import org.apache.tuscany.sca.node.NodeFactory; +import org.apache.tuscany.sca.policy.util.PolicyHandlerTuple; +import org.apache.tuscany.sca.provider.ReferenceBindingProvider; +import org.apache.tuscany.sca.runtime.EndpointReference; +import org.apache.tuscany.sca.runtime.RuntimeComponent; +import org.apache.tuscany.sca.runtime.RuntimeComponentReference; + +/** + * The reference binding provider for the remote sca binding implementation. Relies on the + * binding-ws-axis implementation for sending messages to remote services to this provider + * just uses the ws-axis provider. + * + * @version $Rev: 563772 $ $Date: 2007-08-08 07:50:49 +0100 (Wed, 08 Aug 2007) $ + */ +public class Axis2SCAReferenceBindingProvider implements ReferenceBindingProvider { + + private final static Logger logger = Logger.getLogger(Axis2SCAReferenceBindingProvider.class.getName()); + + private NodeFactory nodeFactory; + private RuntimeComponent component; + private RuntimeComponentReference reference; + private SCABinding binding; + private Axis2ReferenceBindingProvider axisReferenceBindingProvider; + private WebServiceBinding wsBinding; + + private EndpointReference serviceEPR = null; + private EndpointReference callbackEPR = null; + + public Axis2SCAReferenceBindingProvider(NodeFactory nodeFactory, + RuntimeComponent component, + RuntimeComponentReference reference, + DistributedSCABinding binding, + ServletHost servletHost, + MessageFactory messageFactory, + Map<ClassLoader, List<PolicyHandlerTuple>> policyHandlerClassnames) { + this.nodeFactory = nodeFactory; + this.component = component; + this.reference = reference; + this.binding = binding.getSCABinding(); + wsBinding = (new DefaultWebServiceBindingFactory()).createWebServiceBinding(); + + // Turn the java interface contract into a wsdl interface contract + InterfaceContract contract = reference.getInterfaceContract(); + if ((contract instanceof JavaInterfaceContract)) { + contract = Java2WSDLHelper.createWSDLInterfaceContract((JavaInterfaceContract)contract); + } + + // Set to use the Axiom data binding + contract.getInterface().resetDataBinding(OMElement.class.getName()); + + wsBinding.setBindingInterfaceContract(contract); + wsBinding.setName(this.binding.getName()); + + axisReferenceBindingProvider = new Axis2ReferenceBindingProvider(component, + reference, + wsBinding, + servletHost, + messageFactory, + policyHandlerClassnames); + } + + public InterfaceContract getBindingInterfaceContract() { + return wsBinding.getBindingInterfaceContract(); + } + + public boolean supportsOneWayInvocation() { + return false; + } + + public Invoker createInvoker(Operation operation) { + return new Axis2SCABindingInvoker(this, axisReferenceBindingProvider.createInvoker(operation)); + } + + /** + * Uses the distributed domain service discovery feature to locate remote + * service endpoints + * + * @return An EPR for the target service that this reference refers to + */ + public EndpointReference getServiceEndpoint(){ + + String endpointURL = null; + + if (binding.getURI() != null) { + // check if the binding URI is already resolved if it is use is if not + try { + URI uri = new URI(binding.getURI()); + if (uri.isAbsolute()) { + endpointURL = binding.getURI(); + } + } catch(Exception ex) { + // do nothing + } + + if ( endpointURL == null) { + SCADomainEventService domainProxy = (SCADomainEventService)nodeFactory.getNode().getDomain(); + + try { + endpointURL = domainProxy.findServiceEndpoint(nodeFactory.getNode().getDomain().getURI(), + binding.getURI(), + binding.getClass().getName()); + } catch (Exception ex) { + logger.log(Level.WARNING, + "Unable to find service service: " + + nodeFactory.getNode().getDomain().getURI() + " " + + nodeFactory.getNode().getURI() + " " + + binding.getURI() + " " + + binding.getClass().getName()); + } + + if (endpointURL.equals(domainProxy.SERVICE_NOT_REGISTERED)){ + throw new IllegalStateException("Can't resolve reference as no SCA binding URI is available while trying to find target service. Component: "+ + component.getName() + + " and reference: " + + reference.getName() ); + } + } + } + + binding.setURI(endpointURL); + + serviceEPR = new EndpointReferenceImpl(binding.getURI()); + + +/* + if ( serviceEPR == null && nodeFactory.getNode() != null ){ + // try to resolve the service endpoint with the registry + SCADomainEventService domainProxy = (SCADomainEventService)nodeFactory.getNode().getDomain(); + + if (domainProxy != null){ + + // The binding URI might be null in the case where this reference is completely + // dynamic, for example, in the case of callbacks + String bindingURIString = binding.getURI(); + if (bindingURIString != null) { + String serviceURL = null; + URI bindingURI = null; + + // first time through here assume that the binding URI is correct + try { + bindingURI = new URI(bindingURIString); + if (bindingURI.isAbsolute()){ + serviceURL = bindingURIString; + } + } catch(Exception ex) { + + } + + if ( serviceURL == null) { + try { + serviceURL = domainProxy.findServiceEndpoint(nodeFactory.getNode().getDomain().getURI(), + bindingURI.getPath(), + binding.getClass().getName()); + } catch (Exception ex) { + logger.log(Level.WARNING, + "Unable to find service service: " + + nodeFactory.getNode().getDomain().getURI() + " " + + nodeFactory.getNode().getURI() + " " + + binding.getURI() + " " + + binding.getClass().getName()); + } + } + + if ( (serviceURL != null ) && + (!serviceURL.equals(""))){ + serviceEPR = new EndpointReferenceImpl(serviceURL); + } + } + } else { + throw new IllegalStateException("No domain service available while trying to find component: "+ + component.getName() + + " and service: " + + reference.getName()); + } + } +*/ + + return serviceEPR; + } + + /** + * Go back to the distributed domain to go and get the service endpoint + * + * @return An EPR for the target service that this reference refers to + */ + public EndpointReference refreshServiceEndpoint(){ + serviceEPR= null; + return getServiceEndpoint(); + } + + /** + * Retrieves the uri of the callback service (that this reference has created) + * returns null if there is no callback service for the sca binding + * + * @return the callback endpoint + */ + public EndpointReference getCallbackEndpoint(){ + if (callbackEPR == null) { + if (reference.getCallbackService() != null) { + for (Binding callbackBinding : reference.getCallbackService().getBindings()) { + if (callbackBinding instanceof SCABinding) { + callbackEPR = new EndpointReferenceImpl(reference.getName() + "/" + callbackBinding.getName()); + continue; + } + } + } + } + return callbackEPR; + } + + + public SCABinding getSCABinding () { + return binding; + } + + public RuntimeComponent getComponent () { + return component; + } + + public RuntimeComponentReference getComponentReference () { + return reference; + } + + public void start() { + // Try and resolve the service endpoint just in case it is available now + // getServiceEndpoint(); + axisReferenceBindingProvider.start(); + } + + public void stop() { + axisReferenceBindingProvider.stop(); + } + +} diff --git a/sca-java-1.x/branches/sca-java-1.2/modules/binding-sca-axis2/src/main/java/org/apache/tuscany/sca/binding/sca/axis2/impl/Axis2SCAServiceBindingProvider.java b/sca-java-1.x/branches/sca-java-1.2/modules/binding-sca-axis2/src/main/java/org/apache/tuscany/sca/binding/sca/axis2/impl/Axis2SCAServiceBindingProvider.java new file mode 100644 index 0000000000..d51f3caaec --- /dev/null +++ b/sca-java-1.x/branches/sca-java-1.2/modules/binding-sca-axis2/src/main/java/org/apache/tuscany/sca/binding/sca/axis2/impl/Axis2SCAServiceBindingProvider.java @@ -0,0 +1,231 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.tuscany.sca.binding.sca.axis2.impl; + +import java.util.List; +import java.util.Map; +import java.util.logging.Logger; + +import org.apache.axiom.om.OMElement; +import org.apache.tuscany.sca.assembly.SCABinding; +import org.apache.tuscany.sca.binding.sca.DistributedSCABinding; +import org.apache.tuscany.sca.binding.ws.DefaultWebServiceBindingFactory; +import org.apache.tuscany.sca.binding.ws.WebServiceBinding; +import org.apache.tuscany.sca.binding.ws.axis2.Axis2ServiceProvider; +import org.apache.tuscany.sca.host.http.ServletHost; +import org.apache.tuscany.sca.interfacedef.InterfaceContract; +import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceContract; +import org.apache.tuscany.sca.interfacedef.wsdl.java2wsdl.Java2WSDLHelper; +import org.apache.tuscany.sca.invocation.MessageFactory; +import org.apache.tuscany.sca.node.NodeFactory; +import org.apache.tuscany.sca.policy.util.PolicyHandlerTuple; +import org.apache.tuscany.sca.provider.ServiceBindingProvider; +import org.apache.tuscany.sca.runtime.RuntimeComponent; +import org.apache.tuscany.sca.runtime.RuntimeComponentService; + +/** + * The service binding provider for the remote sca binding implementation. Relies on the + * binding-ws-axis implementation for providing a remote message endpoint for this service + * + * @version $Rev: 563772 $ $Date: 2007-08-08 07:50:49 +0100 (Wed, 08 Aug 2007) $ + */ +public class Axis2SCAServiceBindingProvider implements ServiceBindingProvider { + + private final static Logger logger = Logger.getLogger(Axis2SCAServiceBindingProvider.class.getName()); + + private NodeFactory nodeFactory; + private SCABinding binding; + private Axis2ServiceProvider axisProvider; + private WebServiceBinding wsBinding; + + private boolean started = false; + + + public Axis2SCAServiceBindingProvider(NodeFactory nodeFactory, + RuntimeComponent component, + RuntimeComponentService service, + DistributedSCABinding binding, + ServletHost servletHost, + MessageFactory messageFactory, + Map<ClassLoader, List<PolicyHandlerTuple>> policyHandlerClassnames) { + this.nodeFactory = nodeFactory; + this.binding = binding.getSCABinding(); + wsBinding = (new DefaultWebServiceBindingFactory()).createWebServiceBinding(); + + // Turn the java interface contract into a wsdl interface contract + InterfaceContract contract = service.getInterfaceContract(); + if ((contract instanceof JavaInterfaceContract)) { + contract = Java2WSDLHelper.createWSDLInterfaceContract((JavaInterfaceContract)contract); + } + + // Set to use the Axiom data binding + contract.getInterface().resetDataBinding(OMElement.class.getName()); + + wsBinding.setBindingInterfaceContract(contract); + wsBinding.setName(this.binding.getName()); + wsBinding.setURI(this.binding.getURI()); + + axisProvider = new Axis2SCAServiceProvider(component, + service, + this.binding, + wsBinding, + servletHost, + messageFactory, + policyHandlerClassnames); + + this.binding.setURI(wsBinding.getURI()); + +/* + if ((nodeFactory != null) && (nodeFactory.getNode() != null)){ + + SCADomainEventService domainProxy = (SCADomainEventService)nodeFactory.getNode().getDomain(); + + if (domainProxy != null) { + + // work out what the component service name is that will be registered + // it should be the path element of the binding uri + String componentServiceName = this.binding.getURI(); + + try { + URI servicePath = new URI(this.binding.getURI()); + componentServiceName = servicePath.getPath(); + + // strip any leading slash + if (componentServiceName.charAt(0) == '/'){ + componentServiceName = componentServiceName.substring(1, componentServiceName.length()); + } + } catch(Exception ex) { + // do nothing, the binding uri string will be used + } + + // work out what the endpoint address is that the component service name will be registered + // against. Be default this is the url calculated by the web services binding but + // we have to adjust that to: + // 1. correct the host and port in the case that this is a web app as the container controls the port + // 2. correct the host name in the case that it's localhost + String componentServiceUrlString = wsBinding.getURI(); + URI componentServiceUrl = URI.create(componentServiceUrlString); + + String newHost = componentServiceUrl.getHost(); + int newPort = componentServiceUrl.getPort(); + + // TODO - could do with a change to the ServletHost API so that we can just ask the servlet + // host if it is controlling the URL + if (servletHost.getClass().getName().equals("WebbAppServletHost")){ + // the service URL will likely be completely different to that + // calculated by the ws binding so replace it with the node url + // The node url will have been set via init parameters in the web app + URL nodeUrl; + try { + URI tmpURI = new URI(nodeFactory.getNode().getURI()); + nodeUrl = tmpURI.toURL(); + } catch (Exception ex) { + throw new IllegalStateException("Node running inside a webapp and node was not created with a valid node url"); + } + + if (nodeUrl != null){ + newHost = nodeUrl.getHost(); + newPort = nodeUrl.getPort(); + } else { + throw new IllegalStateException("Node running inside a webapp and node was not created with a valid node url"); + } + } + + // no good registering localhost as a host name when nodes are spread across + // machines + if ( newHost == null || newHost.equals("localhost")){ + try { + newHost = InetAddress.getLocalHost().getHostName(); + } catch(UnknownHostException ex) { + throw new IllegalStateException("Got unknown host while trying to get the local host name in order to regsiter service with the domain"); + } + } + if (newPort == -1) { + newPort = 8080; + } + + // replace the old with the new + try { + componentServiceUrl = new URI(componentServiceUrl.getScheme() == null? "http" : componentServiceUrl.getScheme(), + componentServiceUrl.getUserInfo(), + newHost, newPort, + componentServiceUrl.getPath(), + componentServiceUrl.getQuery(), + componentServiceUrl.getFragment()); + componentServiceUrlString = componentServiceUrl.toString(); + } catch (URISyntaxException e) { + throw new IllegalStateException(e); + } + + try { + domainProxy.registerServiceEndpoint(nodeFactory.getNode().getDomain().getURI(), + nodeFactory.getNode().getURI(), + componentServiceName, + SCABinding.class.getName(), + componentServiceUrlString); + } catch(Exception ex) { + logger.log(Level.WARNING, + "Unable to register service: " + + nodeFactory.getNode().getDomain().getURI() + " " + + nodeFactory.getNode().getURI() + " " + + componentServiceName + " " + + SCABinding.class.getName() + " " + + componentServiceUrlString); + } + } + } else { + throw new IllegalStateException("No domain available for component: "+ + component.getName() + + " and service: " + + service.getName()); + } +*/ + + } + + public InterfaceContract getBindingInterfaceContract() { + return wsBinding.getBindingInterfaceContract(); + } + + public boolean supportsOneWayInvocation() { + return false; + } + + public void start() { + if (started) { + return; + } else { + started = true; + } + + axisProvider.start(); + } + + public void stop() { + if (!started) { + return; + } else { + started = false; + } + + axisProvider.stop(); + } + +} diff --git a/sca-java-1.x/branches/sca-java-1.2/modules/binding-sca-axis2/src/main/java/org/apache/tuscany/sca/binding/sca/axis2/impl/Axis2SCAServiceProvider.java b/sca-java-1.x/branches/sca-java-1.2/modules/binding-sca-axis2/src/main/java/org/apache/tuscany/sca/binding/sca/axis2/impl/Axis2SCAServiceProvider.java new file mode 100644 index 0000000000..076648c78b --- /dev/null +++ b/sca-java-1.x/branches/sca-java-1.2/modules/binding-sca-axis2/src/main/java/org/apache/tuscany/sca/binding/sca/axis2/impl/Axis2SCAServiceProvider.java @@ -0,0 +1,85 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.tuscany.sca.binding.sca.axis2.impl; + +import java.util.List; +import java.util.Map; + +import org.apache.tuscany.sca.assembly.Binding; +import org.apache.tuscany.sca.assembly.SCABinding; +import org.apache.tuscany.sca.binding.ws.WebServiceBinding; +import org.apache.tuscany.sca.binding.ws.axis2.Axis2ServiceProvider; +import org.apache.tuscany.sca.host.http.ServletHost; +import org.apache.tuscany.sca.invocation.MessageFactory; +import org.apache.tuscany.sca.policy.util.PolicyHandlerTuple; +import org.apache.tuscany.sca.runtime.RuntimeComponent; +import org.apache.tuscany.sca.runtime.RuntimeComponentService; + +/** + * A specialization of the Axis2BindingProvider that just switches in the SCABinding model + * element when it is required. The SCABinding is required as the service binding provider + * finds the service wire based in the binding + * + * @version $Rev: 563772 $ $Date: 2007-08-08 07:50:49 +0100 (Wed, 08 Aug 2007) $ + */ +public class Axis2SCAServiceProvider extends Axis2ServiceProvider { + + private SCABinding binding; + + /** + * Switch in the fake ws binding + * + * @param component + * @param service + * @param binding + * @param wsBinding + * @param servletHost + * @param messageFactory + */ + public Axis2SCAServiceProvider(RuntimeComponent component, + RuntimeComponentService service, + SCABinding binding, + WebServiceBinding wsBinding, + ServletHost servletHost, + MessageFactory messageFactory, + Map<ClassLoader, List<PolicyHandlerTuple>> policyHandlerClassnames) { + + super(component, + service, + wsBinding, + servletHost, + messageFactory, + policyHandlerClassnames); + + this.binding = binding; + } + + /** + * Return the sca binding as wires will be registered against this rather + * than against the wsBinding that the Axis2SCAServiceProvider is + * expecting + * + * @return the binding + */ + @Override + protected Binding getBinding(){ + return binding; + } +} |