1 package org.objectweb.celtix.tools.processors.java2.internal; 2 3 import java.lang.annotation.Annotation ; 4 import java.lang.reflect.GenericArrayType ; 5 import java.lang.reflect.Method ; 6 import java.lang.reflect.ParameterizedType ; 7 import java.lang.reflect.Type ; 8 import java.rmi.RemoteException ; 9 import java.util.ArrayList ; 10 import java.util.List ; 11 import java.util.logging.Logger ; 12 13 import javax.jws.WebParam; 14 import javax.jws.WebResult; 15 import javax.jws.soap.SOAPBinding; 16 import javax.xml.namespace.QName ; 17 import javax.xml.ws.Holder; 18 import javax.xml.ws.WebFault; 19 20 import com.sun.xml.bind.api.TypeReference; 21 22 import org.objectweb.celtix.common.i18n.Message; 23 import org.objectweb.celtix.common.logging.LogUtils; 24 import org.objectweb.celtix.tools.common.ToolException; 25 import org.objectweb.celtix.tools.common.model.JavaMethod; 26 import org.objectweb.celtix.tools.common.model.JavaParameter; 27 import org.objectweb.celtix.tools.common.model.JavaType; 28 import org.objectweb.celtix.tools.common.model.WSDLException; 29 import org.objectweb.celtix.tools.common.model.WSDLModel; 30 import org.objectweb.celtix.tools.common.model.WSDLParameter; 31 import org.objectweb.celtix.tools.processors.java2.JavaToWSDLProcessor; 32 import org.objectweb.celtix.tools.utils.AnnotationUtil; 33 public class DocBareMethodProcessor { 34 private static final Logger LOG = LogUtils.getL7dLogger(JavaToWSDLProcessor.class); 35 private WSDLModel model; 36 37 public DocBareMethodProcessor(WSDLModel wmodel) { 38 model = wmodel; 39 } 40 41 public void processDocBare(JavaMethod javaMethod, Method method) { 42 boolean isHolder = false; 43 javaMethod.setSoapStyle(SOAPBinding.Style.DOCUMENT); 44 javaMethod.setWrapperStyle(false); 45 setMethodUse(javaMethod, method); 46 47 String resultName = method.getName() + "Response"; 49 String resultTNS = model.getTargetNameSpace(); 50 String resultPartName = null; 51 52 WebResult webResult = method.getAnnotation(WebResult.class); 53 boolean webResultHeader = false; 54 if (webResult != null) { 55 resultName = webResult.name().length() > 0 ? webResult.name() : resultName; 56 webResultHeader = webResult.header(); 57 resultTNS = webResult.targetNamespace().length() > 0 ? webResult.targetNamespace() : resultTNS; 58 resultPartName = webResult.partName().length() > 0 ? webResult.partName() : resultName; 59 } 60 61 63 WSDLParameter response = new WSDLParameter(); 64 Class returnType = method.getReturnType(); 66 if (returnType != null && !"void".equals(returnType.getName())) { 67 QName resQN = new QName (resultTNS, resultName); 68 TypeReference typeRef = new TypeReference(resQN, returnType, new Annotation [0]); 69 response.setName(method.getName() + "Response"); 70 response.setStyle(JavaType.Style.OUT); 71 response.setTargetNamespace(resultTNS); 72 JavaParameter jp = new JavaParameter(resultName, typeRef, JavaType.Style.OUT); 73 jp.setPartName(resultPartName); 74 jp.setTargetNamespace(resultTNS); 75 jp.setName(resultName); 76 jp.setHeader(webResultHeader); 77 response.addChildren(jp); 78 javaMethod.addResponse(response); 79 } 80 81 WSDLParameter request = new WSDLParameter(); 83 request.setName(method.getName()); 84 request.setStyle(JavaType.Style.IN); 85 javaMethod.addRequest(request); 86 List <JavaParameter> paras = processWebPara(method); 87 for (JavaParameter jp : paras) { 88 if (jp.getStyle() == JavaType.Style.IN) { 90 request.addChildren(jp); 91 } 92 if (jp.getStyle() == JavaType.Style.INOUT) { 93 request.addChildren(jp); 94 response.addChildren(jp); 95 isHolder = true; 96 } 97 if (jp.getStyle() == JavaType.Style.OUT) { 98 isHolder = true; 99 response.addChildren(jp); 100 } 101 } 102 103 if ((returnType == null || "void".equals(returnType.getName())) && isHolder) { 104 response.setName(method.getName() + "Response"); 105 response.setStyle(JavaType.Style.OUT); 106 response.setTargetNamespace(resultTNS); 107 javaMethod.addResponse(response); 108 } 109 processExceptions(javaMethod, method); 110 } 111 112 private void setMethodUse(JavaMethod javaMethod, Method method) { 113 SOAPBinding binding = method.getAnnotation(SOAPBinding.class); 114 if (binding != null) { 115 javaMethod.setSoapUse(binding.use()); 116 } else { 117 javaMethod.setSoapUse(this.model.getUse()); 118 } 119 } 120 121 private List <JavaParameter> processWebPara(Method method) { 122 Class <?>[] parameterTypes = method.getParameterTypes(); 124 Type [] parameterGenTypes = method.getGenericParameterTypes(); 125 Annotation [][] paraAnns = AnnotationUtil.getPrivParameterAnnotations(method); 126 List <JavaParameter> paras = new ArrayList <JavaParameter>(); 127 boolean criteria1 = false; 130 boolean criteria2 = true; 133 boolean criteria3 = false; 136 int nonHeaderParamCount = 0; 138 139 int i = 0; 140 for (Class clazzType : parameterTypes) { 141 String paraName = "arg" + i; 142 String partName; 143 String paraTNS = model.getTargetNameSpace(); 144 Class clazz = clazzType; 145 boolean holder = isHolder(clazzType); 146 if (holder) { 147 clazz = getHoldedClass(clazzType, parameterGenTypes[i]); 148 } 149 for (Annotation anno : paraAnns[i]) { 150 if (anno.annotationType() == WebParam.class) { 151 WebParam webParam = (WebParam)anno; 152 153 if (!webParam.header() 154 && (webParam.mode() == WebParam.Mode.IN || webParam.mode() == WebParam.Mode.INOUT)) { 155 criteria1 = true; 156 } 157 158 if (!method.getReturnType().getName().equalsIgnoreCase("void") && !webParam.header() 159 && (webParam.mode() == WebParam.Mode.OUT || webParam.mode() == WebParam.Mode.INOUT)) { 160 criteria2 = false; 161 162 } 163 164 if (method.getReturnType().getName().equalsIgnoreCase("void") && !webParam.header() 165 && (webParam.mode() == WebParam.Mode.OUT || webParam.mode() == WebParam.Mode.INOUT)) { 166 nonHeaderParamCount++; 167 } 168 169 paraName = webParam.name().length() > 0 ? webParam.name() : paraName; 170 partName = webParam.partName().length() > 0 ? webParam.partName() : paraName; 171 paraTNS = webParam.targetNamespace().length() > 0 172 ? webParam.targetNamespace() : paraTNS; 173 174 QName requestQN = new QName (paraTNS, paraName); 175 TypeReference typeref = new TypeReference(requestQN, clazz, paraAnns[i]); 176 JavaParameter jp; 177 if (holder) { 178 if (webParam.mode() == WebParam.Mode.INOUT) { 179 jp = new JavaParameter(typeref.tagName.getLocalPart(), typeref, 180 JavaType.Style.INOUT); 181 } else { 182 jp = new JavaParameter(typeref.tagName.getLocalPart(), typeref, 183 JavaType.Style.OUT); 184 } 185 } else { 186 jp = new JavaParameter(typeref.tagName.getLocalPart(), typeref, JavaType.Style.IN); 187 } 188 jp.setName(paraName); 189 jp.setPartName(partName); 190 jp.setHeader(webParam.header()); 191 jp.setTargetNamespace(paraTNS); 192 paras.add(jp); 193 } 194 } 195 i++; 196 } 197 if (!criteria1) { 198 Message message = new Message("DOC_BARE_METHOD_CRITERIA1", LOG); 199 throw new ToolException(message); 200 } 201 if (!criteria2) { 202 Message message = new Message("DOC_BARE_METHOD_CRITERIA2", LOG); 203 throw new ToolException(message); 204 } 205 criteria3 = nonHeaderParamCount <= 1 ? true : false; 206 if (!criteria3) { 207 Message message = new Message("DOC_BARE_METHOD_CRITERIA3", LOG); 208 throw new ToolException(message); 209 } 210 return paras; 211 } 212 213 private void processExceptions(JavaMethod jmethod, Method method) { 214 for (Type exception : method.getGenericExceptionTypes()) { 215 if (RemoteException .class.isAssignableFrom((Class )exception)) { 216 continue; 217 } 218 Annotation [] anns = null; 219 Class <?> exClass = (Class <?>)exception; 220 String exNameSpace = model.getTargetNameSpace(); 221 String exName = exClass.getSimpleName(); 222 Class exReturnType = null; 223 Method faultInfo = null; 224 try { 225 faultInfo = exClass.getMethod("getFaultInfo", new Class [0]); 226 } catch (SecurityException e) { 227 throw new ToolException(e.getMessage(), e); 228 } catch (NoSuchMethodException e) { 229 throw new ToolException(e.getMessage(), e); 230 } 231 232 if (faultInfo != null) { 233 WebFault wf = exClass.getAnnotation(WebFault.class); 234 exReturnType = faultInfo.getReturnType(); 235 anns = faultInfo.getAnnotations(); 236 if (wf.targetNamespace().length() > 0) { 237 exNameSpace = wf.targetNamespace(); 238 } 239 exName = wf.name(); 240 } 241 242 QName exQName = new QName (exNameSpace, exName); 243 TypeReference tf = new TypeReference(exQName, exReturnType, anns); 244 WSDLException wsdlEx = new WSDLException(exClass, tf); 245 246 jmethod.addWSDLException(wsdlEx); 247 248 } 249 } 250 251 private boolean isHolder(Class cType) { 252 return Holder.class.isAssignableFrom(cType); 253 } 255 256 private Class getHoldedClass(Class holderClazz, Type type) { 257 ParameterizedType pt = (ParameterizedType )type; 258 return getClass(pt.getActualTypeArguments()[0]); 259 } 260 261 private Class getClass(Type type) { 262 if (type instanceof Class ) { 263 return (Class )type; 264 } else if (type instanceof GenericArrayType ) { 265 GenericArrayType gt = (GenericArrayType )type; 266 Class compType = getClass(gt.getGenericComponentType()); 267 return java.lang.reflect.Array.newInstance(compType, 0).getClass(); 268 } 269 return Object .class; 270 } 271 272 } 273 | Popular Tags |