summaryrefslogtreecommitdiffstats
path: root/sandbox/sebastien/java/embed/modules/interface-java-jaxws/src/main/java/org/apache/tuscany/sca/interfacedef/java/jaxws/JAXWSUtils.java
blob: 93e88ed6509fd0da465aac9e92ae0244b7d47662 (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
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
/*
 * 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.interfacedef.java.jaxws;

import javax.jws.WebService;
import javax.xml.namespace.QName;
import javax.xml.ws.WebServiceProvider;

import org.apache.tuscany.sca.interfacedef.InvalidInterfaceException;
import org.apache.tuscany.sca.interfacedef.java.JavaInterface;
import org.apache.tuscany.sca.interfacedef.util.JavaXMLMapper;


/**
 * A set of utility methods for processing JAXWS annotations that are 
 * shared between Java inteface and implementation processing
 */
public class JAXWSUtils {
    
    /**
     * JAXWS annotations may identify a service interface via either
     *   - an interface class name, e.g. @WebService(endpointInterface="my.service.ServiceImpl") 
     *   - a wsdl file name, e.g. @WebService(wsdlLocation="some.wsdl")
     *   - a Java class/interface, e.g. @WebService
     * This operation configures the Java interface based on these separate pieces
     * of information. The resulting interface contract must be subsequently resolved in order that
     * the named endpoint interface class or wsdl file is found
     *   
     * @param javaInterface the Tuscany representation of the Java interface
     * @param clazz the Java class that the interface refers to (may have JAXWS annotations)
     * @return
     */
    public static JavaInterface configureJavaInterface(JavaInterface javaInterface,
                                                       Class<?> clazz){
        
        String servineNamespace = JavaXMLMapper.getNamespace(clazz);
        String serviceName = clazz.getSimpleName();
        QName serviceQName = null;
        String serviceInterfaceClassName = null;
        String wsdlFileName = null;
        
        WebService webServiceAnnotation = clazz.getAnnotation(WebService.class);
        if (webServiceAnnotation != null) {
            servineNamespace = getValue(webServiceAnnotation.targetNamespace(), servineNamespace);
            serviceName = getValue(webServiceAnnotation.name(), serviceName);
            serviceInterfaceClassName = webServiceAnnotation.endpointInterface();
            wsdlFileName = webServiceAnnotation.wsdlLocation();
            javaInterface.setRemotable(true);
        }
        
        WebServiceProvider webServiceProviderAnnotation = clazz.getAnnotation(WebServiceProvider.class);
        if (webServiceProviderAnnotation != null) {
            servineNamespace = getValue(webServiceProviderAnnotation.targetNamespace(), servineNamespace);
            serviceName = getValue(webServiceProviderAnnotation.serviceName(), serviceName);
            wsdlFileName = webServiceProviderAnnotation.wsdlLocation();
            javaInterface.setRemotable(true);
        }  
        
        serviceQName = new QName(servineNamespace, serviceName);
        javaInterface.setQName(serviceQName);
        
        // use the provided Java interface name to overwrite
        // any Java interface created from an implemented interfaces
        if (serviceInterfaceClassName != null &&
                serviceInterfaceClassName.length() > 0){
            javaInterface.setName(serviceInterfaceClassName);
            javaInterface.setJAXWSJavaInterfaceName(serviceInterfaceClassName);
            javaInterface.setUnresolved(true);
        } 
        
        // Store the WSDL location if it's specified in 
        // the @WebService annotation. Later this is resolved and is attached 
        // to the Java interface contract in the normalized space so that effectively the contract
        // has both Java and WSDL interfaces. This allows databinding to 
        // operate correctly as it still expects a Java interface for a Java implementation
        if (wsdlFileName != null &&
            wsdlFileName.length() > 0){         
            javaInterface.setJAXWSWSDLLocation(wsdlFileName);
        }  
        
        return javaInterface;
    }      
    
    /**
     * Given a class that may have @WebService or @WebServiceProvider 
     * annotations this determines what the service QName should be. 
     * 
     * @param clazz
     * @return
     */
/*    
    public static QName calculateServiceQName(JavaInterface javaInterface, Class<?> clazz){
        WebService webServiceAnnotation = clazz.getAnnotation(WebService.class);
        String servineNamespace = JavaXMLMapper.getNamespace(clazz);
        String serviceName = clazz.getSimpleName();
        if (webServiceAnnotation != null) {
            servineNamespace = getValue(webServiceAnnotation.targetNamespace(), servineNamespace);
            serviceName = getValue(webServiceAnnotation.name(), serviceName);
            javaInterface.setRemotable(true);
        }
        
        WebServiceProvider webServiceProviderAnnotation = clazz.getAnnotation(WebServiceProvider.class);
        if (webServiceProviderAnnotation != null) {
            servineNamespace = getValue(webServiceProviderAnnotation.targetNamespace(), servineNamespace);
            serviceName = getValue(webServiceProviderAnnotation.serviceName(), serviceName);
            javaInterface.setRemotable(true);
        }  
        
        QName serviceQName = new QName(servineNamespace, serviceName);
        javaInterface.setQName(serviceQName);
        
        return serviceQName;
    }
*/
    
    /**
     * Given a class that may have @WebService or @WebServiceProvider 
     * annotations this determines what the name of the Java class 
     * that defines the service interface should be 
     * 
     * @param clazz
     * @return
     */
/*    
    public static String calculateServiceInterfaceJavaClassName(JavaInterface javaInterface, Class<?> clazz){
        String serviceInterfaceClassName = null;
        
        WebService webServiceAnnotation = clazz.getAnnotation(WebService.class);        
        if (webServiceAnnotation != null) {
            serviceInterfaceClassName = webServiceAnnotation.endpointInterface();
            javaInterface.setRemotable(true);
        } 
        
        return serviceInterfaceClassName;
    } 
*/ 
    
    /**
     * Given a class that may have @WebService or @WebServiceProvider 
     * annotations this determines what the name of the WSDL file is  
     * that defines the service interface should be 
     * 
     * @param clazz
     * @return
     */
/*    
    public static String calculateServiceInterfaceWSDLLocation(JavaInterface javaInterface, Class<?> clazz){
        WebService webServiceAnnotation = clazz.getAnnotation(WebService.class);
        String wsdlLocation = null;
        
        if (webServiceAnnotation != null) {
            wsdlLocation = webServiceAnnotation.wsdlLocation();
            javaInterface.setRemotable(true);
        } 
        
        WebServiceProvider webServiceProviderAnnotation = clazz.getAnnotation(WebServiceProvider.class);
        
        if (webServiceProviderAnnotation != null) {
            wsdlLocation = webServiceProviderAnnotation.wsdlLocation();
            javaInterface.setRemotable(true);
        } 
        
        return wsdlLocation;
    }     
*/    
    
    /**
     * JAXWS annotations may identify a service interface via either
     *   - an interface class name, e.g. @WebService(endpointInterface="my.service.ServiceImpl") 
     *   - a wsdl file name, e.g. @WebService(wsdlLocation="some.wsdl")
     *   - a Java class/interface, e.g. @WebService
     * This operation configures the Java interface based on these separate pieces
     * of information. The resulting interface contract must be subsequently resolved in order that
     * the named endpoint interface class or wsdl file is found
     *   
     * @param javaInterface
     * @param servicceQName
     * @param javaInterfaceName
     * @param wsdlFileName
     * @return
     */
/*    
    public static JavaInterface configureJavaInterface(JavaInterface javaInterface,
                                                       QName serviceQName,
                                                       String javaInterfaceName, 
                                                       String wsdlFileName)  throws InvalidInterfaceException {
        
        // use the provided Java interface name to overwrite
        // any Java contract created from an implemented interfaces
        if (javaInterfaceName != null &&
            javaInterfaceName.length() > 0){
            javaInterface.setName(javaInterfaceName);
            javaInterface.setJAXWSJavaInterfaceName(javaInterfaceName);
            javaInterface.setQName(serviceQName);
            javaInterface.setUnresolved(true);
        } else {
            // we use the bean class as the service interface if no interface
            // has already been set. This should have already been resolved
            javaInterface.setQName(serviceQName);
        }
        
        // Store the WSDL location if it's specified in 
        // the @WebService annotation. Later this is resolved and is attached 
        // to the Java interface contract in the normalized space so that effectively the contract
        // has both Java and WSDL interfaces. This allows databinding to 
        // operate correctly as it still expects a Java interface for a Java implementation
        if (wsdlFileName != null &&
            wsdlFileName.length() > 0){         
            javaInterface.setJAXWSWSDLLocation(wsdlFileName);
        }  
        
        return javaInterface;
    }  
*/
    
    
    /**
     * JAXWS annotations may identify a service interface via either
     *   - an interface class name, e.g. @WebService(endpointInterface="my.service.ServiceImpl") 
     *   - a wsdl file name, e.g. @WebService(wsdlLocation="some.wsdl")
     *   - a Java class/interface, e.g. @WebService
     * This operation creates the right sort of interface contract based on these separate pieces
     * of information. The resulting interface contract must be subsequently resolved in order that
     * the named endpoint interface class or wsdl file is found
     *   
     * @param javaInterfaceFactory
     * @param wsdlInterfaceFactory
     * @param clazz
     * @param javaInterfaceName
     * @param wsdlFileName
     * @return
     * @throws InvalidInterfaceException
     */
/*    
    public static JavaInterfaceContract configureJavaInterface(JavaInterfaceFactory javaInterfaceFactory, 
                                                               WSDLFactory wsdlFactory,
                                                               JavaInterfaceContract javaInterfaceContract,
                                                               Class<?> clazz, 
                                                               QName serviceQName,
                                                               String javaInterfaceName, 
                                                               String wsdlFileName)  throws InvalidInterfaceException {
        
        // use the provided Java interface name to overwrite
        // any Java contract created from an implemented interfaces
        if (javaInterfaceName != null &&
            javaInterfaceName.length() > 0){
            JavaInterface callInterface = javaInterfaceFactory.createJavaInterface();
            callInterface.setName(javaInterfaceName);
            callInterface.setQName(serviceQName);
            callInterface.setRemotable(true);
            callInterface.setUnresolved(true);
            javaInterfaceContract.setInterface(callInterface);
        } else {
            // we use the bean class as the service interface if no interface
            // has already been set
            if (javaInterfaceContract.getInterface() == null){
                JavaInterface callInterface = javaInterfaceFactory.createJavaInterface(clazz);
                callInterface.setQName(serviceQName);
                callInterface.setRemotable(true);
                callInterface.setUnresolved(false); // this will already be false but this makes it easy to follow the logic
                javaInterfaceContract.setInterface(callInterface);
            } else {
                JavaInterface callInterface = (JavaInterface)javaInterfaceContract.getInterface();
                callInterface.setRemotable(true);
                callInterface.setQName(serviceQName);
            }
        }
        
        // create the logical WSDL interface if it's specified in 
        // the @WebService annotation. This is attached to the Java interface
        // contract in the normalized space so that effectively the contract
        // has both Java and WSDL interfaces. This allows databinding to 
        // operate correctly as it expects a Java interface for a Java implementation
        if (wsdlFileName != null &&
            wsdlFileName.length() > 0){         
            WSDLInterface callInterface = wsdlFactory.createWSDLInterface();
            callInterface.setUnresolved(true);
            callInterface.setRemotable(true);
            
            WSDLInterfaceContract wsdlInterfaceContract = wsdlFactory.createWSDLInterfaceContract();
            wsdlInterfaceContract.setInterface(callInterface);
            wsdlInterfaceContract.setLocation(wsdlFileName);
            javaInterfaceContract.setNormailizedWSDLContract(wsdlInterfaceContract);
        }  
        
        return javaInterfaceContract;
    }
*/
    
    private static String getValue(String value, String defaultValue) {
        return "".equals(value) ? defaultValue : value;
    }    
}