summaryrefslogtreecommitdiffstats
path: root/sandbox/axis2-1.4/modules/binding-sca-axis2/src/main/java/org/apache/tuscany/sca/binding/sca/axis2/impl/Axis2SCAServiceBindingProvider.java
blob: 24063e11311bc70c1a3b0616d57aac3a093f98c4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
/*
 * 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.WebServiceBindingFactory;
import org.apache.tuscany.sca.binding.ws.WebServiceBinding;
import org.apache.tuscany.sca.binding.ws.axis2.Axis2ServiceProvider;
import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint;
import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
import org.apache.tuscany.sca.contribution.resolver.ResolverExtension;
import org.apache.tuscany.sca.databinding.DataBindingExtensionPoint;
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.WSDLFactory;
import org.apache.tuscany.sca.interfacedef.wsdl.java2wsdl.Java2WSDLHelper;
import org.apache.tuscany.sca.invocation.MessageFactory;
import org.apache.tuscany.sca.node.spi.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;
import org.apache.tuscany.sca.xsd.XSDFactory;

/**
 * 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 static final 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(RuntimeComponent component,
                                          RuntimeComponentService service,
                                          DistributedSCABinding binding,
                                          ServletHost servletHost,
                                          ModelFactoryExtensionPoint modelFactories,
                                          Map<ClassLoader, List<PolicyHandlerTuple>> policyHandlerClassnames,
                                          DataBindingExtensionPoint dataBindings) {

        MessageFactory messageFactory = modelFactories.getFactory(MessageFactory.class); 
        WSDLFactory wsdlFactory = modelFactories.getFactory(WSDLFactory.class);
        XSDFactory xsdFactory = modelFactories.getFactory(XSDFactory.class);

        this.nodeFactory = modelFactories.getFactory(NodeFactory.class);
        this.binding = binding.getSCABinding();
        wsBinding = modelFactories.getFactory(WebServiceBindingFactory.class).createWebServiceBinding();
        
        // Turn the java interface contract into a WSDL interface contract
        InterfaceContract contract = service.getInterfaceContract();
        if ((contract instanceof JavaInterfaceContract)) {
            ModelResolver resolver = component instanceof ResolverExtension ?
                                         ((ResolverExtension)component).getModelResolver() : null;
            contract = Java2WSDLHelper.createWSDLInterfaceContract(
                           (JavaInterfaceContract)contract, resolver, dataBindings, wsdlFactory, xsdFactory);
        }
        
        // 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();
    }

}