001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package org.apache.geronimo.jaxws;
018
019 import java.lang.reflect.Modifier;
020 import java.util.HashMap;
021 import java.util.Map;
022 import java.util.StringTokenizer;
023
024 import javax.jws.WebService;
025 import javax.xml.namespace.QName;
026 import javax.xml.ws.BindingType;
027 import javax.xml.ws.WebServiceProvider;
028
029 public class JAXWSUtils {
030
031 private static final Map<String, String> BINDING_MAP =
032 new HashMap<String, String>();
033
034 static {
035 BINDING_MAP.put("##SOAP11_HTTP", "http://schemas.xmlsoap.org/wsdl/soap/http");
036 BINDING_MAP.put("##SOAP12_HTTP", "http://www.w3.org/2003/05/soap/bindings/HTTP/");
037 BINDING_MAP.put("##SOAP11_HTTP_MTOM", "http://schemas.xmlsoap.org/wsdl/soap/http?mtom=true");
038 BINDING_MAP.put("##SOAP12_HTTP_MTOM", "http://www.w3.org/2003/05/soap/bindings/HTTP/?mtom=true");
039 BINDING_MAP.put("##XML_HTTP", "http://www.w3.org/2004/08/wsdl/http");
040 }
041
042 private JAXWSUtils() {
043 }
044
045 public static QName getPortType(Class seiClass) {
046 WebService webService = (WebService) seiClass.getAnnotation(WebService.class);
047 if (webService != null) {
048 String localName = webService.name();
049 if (localName == null || localName.length() == 0) {
050 localName = seiClass.getName();
051 }
052 String namespace = webService.targetNamespace();
053 return new QName(getNamespace(seiClass, namespace), localName);
054 }
055 return null;
056 }
057
058 public static String getBindingURI(String token) {
059 if (token == null) {
060 // return the default
061 return BINDING_MAP.get("##SOAP11_HTTP");
062 } else if (token.startsWith("##")) {
063 String uri = BINDING_MAP.get(token);
064 if (uri == null) {
065 throw new IllegalArgumentException("Unsupported binding token: " + token);
066 }
067 return uri;
068 } else {
069 return token;
070 }
071 }
072
073 public static boolean isWebService(Class clazz) {
074 return ((clazz.isAnnotationPresent(WebService.class) ||
075 clazz.isAnnotationPresent(WebServiceProvider.class)) &&
076 isProperWebService(clazz));
077 }
078
079 private static boolean isProperWebService(Class clazz) {
080 int modifiers = clazz.getModifiers();
081 return (Modifier.isPublic(modifiers) &&
082 !Modifier.isFinal(modifiers) &&
083 !Modifier.isAbstract(modifiers));
084 }
085
086 public static String getServiceName(Class clazz) {
087 return getServiceQName(clazz).getLocalPart();
088 }
089
090 private static String getServiceName(Class clazz, String name) {
091 if (name == null || name.trim().length() == 0) {
092 return clazz.getSimpleName() + "Service";
093 } else {
094 return name.trim();
095 }
096 }
097
098 private static String getPortName(Class clazz, String name, String portName) {
099 if (portName == null || portName.trim().length() == 0) {
100 if (name == null || name.trim().length() == 0) {
101 return clazz.getSimpleName() + "Port";
102 } else {
103 return name + "Port";
104 }
105 } else {
106 return portName.trim();
107 }
108 }
109
110 private static String getNamespace(Class clazz, String namespace) {
111 if (namespace == null || namespace.trim().length() == 0) {
112 Package pkg = clazz.getPackage();
113 if (pkg == null) {
114 return null;
115 } else {
116 return getNamespace(pkg.getName());
117 }
118 } else {
119 return namespace.trim();
120 }
121 }
122
123 private static String getNamespace(String packageName) {
124 if (packageName == null || packageName.length() == 0) {
125 return null;
126 }
127 StringTokenizer tokenizer = new StringTokenizer(packageName, ".");
128 String[] tokens;
129 if (tokenizer.countTokens() == 0) {
130 tokens = new String[0];
131 } else {
132 tokens = new String[tokenizer.countTokens()];
133 for (int i = tokenizer.countTokens() - 1; i >= 0; i--) {
134 tokens[i] = tokenizer.nextToken();
135 }
136 }
137 StringBuffer namespace = new StringBuffer("http://");
138 String dot = "";
139 for (int i = 0; i < tokens.length; i++) {
140 if (i == 1) {
141 dot = ".";
142 }
143 namespace.append(dot + tokens[i]);
144 }
145 namespace.append('/');
146 return namespace.toString();
147 }
148
149 private static QName getServiceQName(Class clazz, String namespace, String name) {
150 return new QName(getNamespace(clazz, namespace), getServiceName(clazz, name));
151 }
152
153 public static QName getServiceQName(Class clazz) {
154 WebService webService =
155 (WebService)clazz.getAnnotation(WebService.class);
156 if (webService == null) {
157 WebServiceProvider webServiceProvider =
158 (WebServiceProvider)clazz.getAnnotation(WebServiceProvider.class);
159 if (webServiceProvider == null) {
160 throw new IllegalArgumentException("The " + clazz.getName() + " is not annotated");
161 }
162 return getServiceQName(clazz, webServiceProvider.targetNamespace(), webServiceProvider.serviceName());
163 } else {
164 return getServiceQName(clazz, webService.targetNamespace(), webService.serviceName());
165 }
166 }
167
168 private static QName getPortQName(Class clazz, String namespace, String name, String portName) {
169 return new QName(getNamespace(clazz, namespace), getPortName(clazz, name, portName));
170 }
171
172 public static QName getPortQName(Class clazz) {
173 WebService webService =
174 (WebService)clazz.getAnnotation(WebService.class);
175 if (webService == null) {
176 WebServiceProvider webServiceProvider =
177 (WebServiceProvider)clazz.getAnnotation(WebServiceProvider.class);
178 if (webServiceProvider == null) {
179 throw new IllegalArgumentException("The " + clazz.getName() + " is not annotated");
180 }
181 return getPortQName(clazz, webServiceProvider.targetNamespace(), null, webServiceProvider.portName());
182 } else {
183 return getPortQName(clazz, webService.targetNamespace(), webService.name(), webService.portName());
184 }
185 }
186
187 public static String getName(Class clazz) {
188 WebService webService =
189 (WebService)clazz.getAnnotation(WebService.class);
190 if (webService == null) {
191 WebServiceProvider webServiceProvider =
192 (WebServiceProvider)clazz.getAnnotation(WebServiceProvider.class);
193 if (webServiceProvider == null) {
194 throw new IllegalArgumentException("The " + clazz.getName() + " is not annotated");
195 }
196 return clazz.getSimpleName();
197 } else {
198 String sei = webService.endpointInterface();
199 if (sei == null || sei.trim().length() == 0) {
200 return getName(clazz, webService.name());
201 } else {
202 try {
203 Class seiClass = clazz.getClassLoader().loadClass(sei.trim());
204 return getNameFromSEI(seiClass);
205 } catch (ClassNotFoundException e) {
206 throw new RuntimeException("Unable to load SEI class: " + sei, e);
207 }
208 }
209 }
210 }
211
212 private static String getNameFromSEI(Class seiClass) {
213 WebService webService =
214 (WebService)seiClass.getAnnotation(WebService.class);
215 if (webService == null) {
216 throw new IllegalArgumentException("The " + seiClass.getName() + " is not annotated");
217 }
218 return getName(seiClass, webService.name());
219 }
220
221 private static String getName(Class clazz, String name) {
222 if (name == null || name.trim().length() == 0) {
223 return clazz.getSimpleName();
224 } else {
225 return name.trim();
226 }
227 }
228
229 private static String getWsdlLocation(Class clazz) {
230 WebService webService = (WebService) clazz.getAnnotation(WebService.class);
231 if (webService == null) {
232 WebServiceProvider webServiceProvider =
233 (WebServiceProvider)clazz.getAnnotation(WebServiceProvider.class);
234 if (webServiceProvider == null) { //no WebService or WebServiceProvider annotation
235 return "";
236 } else {
237 return webServiceProvider.wsdlLocation().trim();
238 }
239 } else {
240 return webService.wsdlLocation().trim();
241 }
242 }
243
244 private static String getServiceInterface(Class clazz) {
245 WebService webService = (WebService) clazz.getAnnotation(WebService.class);
246 if (webService == null) {
247 //WebServiceProvider doesn't support endpointInterface property (JAX-WS 2.0 sec 7.7)
248 return "";
249 } else {
250 if (webService.endpointInterface() == null || webService.endpointInterface().trim().equals("")) {
251 return "";
252 } else {
253 return webService.endpointInterface().trim();
254 }
255 }
256 }
257
258 public static String getServiceWsdlLocation(Class clazz, ClassLoader loader) {
259 String wsdlLocation = getWsdlLocation(clazz);
260 if (wsdlLocation != null && !wsdlLocation.equals("")) {
261 return wsdlLocation;
262 } else { //check if the interface contains the wsdlLocation value
263 String serviceInterfaceClassName = getServiceInterface(clazz);
264 if (serviceInterfaceClassName != null && !serviceInterfaceClassName.equals("")) {
265 try {
266 Class serviceInterfaceClass = loader.loadClass(serviceInterfaceClassName);
267 return getWsdlLocation(serviceInterfaceClass);
268 } catch (Exception e) {
269 return "";
270 }
271 }
272 }
273 return "";
274 }
275
276 public static boolean containsWsdlLocation(Class clazz, ClassLoader loader) {
277 String wsdlLocSEIFromAnnotation = getServiceWsdlLocation(clazz, loader);
278 if (wsdlLocSEIFromAnnotation != null && !wsdlLocSEIFromAnnotation.equals("")) {
279 return true;
280 } else {
281 return false;
282 }
283 }
284
285 public static String getBindingURIFromAnnot(Class clazz, ClassLoader loader) {
286 BindingType bindingType = (BindingType) clazz.getAnnotation(BindingType.class);
287 if (bindingType == null) {
288 return "";
289 } else {
290 return bindingType.value();
291 }
292 }
293
294 }