blob: 011d74625d73d77b36beb55c26afeed3f3ceccca [file] [log] [blame]
/*
* 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;
}
private static String getValue(String value, String defaultValue) {
return "".equals(value) ? defaultValue : value;
}
}