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 12 import javax.jws.Oneway; 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.tools.common.ToolException; 23 import org.objectweb.celtix.tools.common.model.JavaMethod; 24 import org.objectweb.celtix.tools.common.model.JavaParameter; 25 import org.objectweb.celtix.tools.common.model.JavaType; 26 import org.objectweb.celtix.tools.common.model.WSDLException; 27 import org.objectweb.celtix.tools.common.model.WSDLModel; 28 import org.objectweb.celtix.tools.common.model.WSDLParameter; 29 import org.objectweb.celtix.tools.utils.AnnotationUtil; 30 31 public class RPCMethodProcessor { 32 33 private WSDLModel model; 34 35 public RPCMethodProcessor(WSDLModel wmodel) { 36 model = wmodel; 37 } 38 39 public void process(JavaMethod javaMethod, Method method) { 40 javaMethod.setSoapStyle(SOAPBinding.Style.RPC); 41 javaMethod.setWrapperStyle(true); 42 setMethodUse(javaMethod, method); 43 44 String targetNS = model.getTargetNameSpace(); 45 WSDLParameter request = new WSDLParameter(); 46 request.setName(method.getName()); 47 request.setStyle(JavaType.Style.IN); 48 49 request.setTargetNamespace(targetNS); 50 javaMethod.addRequest(request); 51 52 boolean isOneway = method.isAnnotationPresent(Oneway.class); 53 if (!isOneway) { 54 QName resQN = new QName (targetNS, method.getName() + "Response"); 55 TypeReference typeRef = new TypeReference(resQN, this.getClass(), new Annotation [0]); 56 WSDLParameter response = new WSDLParameter(); 57 response.setName(method.getName() + "Response"); 58 response.setStyle(JavaType.Style.OUT); 59 javaMethod.addResponse(response); 60 61 Class returnType = method.getReturnType(); 62 String resultName = method.getName() + "Response"; 63 String resultTNS = targetNS; 64 String resultPartName = null; 65 WebResult webResult = method.getAnnotation(WebResult.class); 66 boolean webResultHeader = false; 67 if (webResult != null) { 68 resultName = webResult.name().length() > 0 ? webResult.name() : resultName; 69 resultPartName = webResult.partName().length() > 0 ? webResult.partName() : resultName; 70 resultTNS = webResult.targetNamespace().length() > 0 71 ? webResult.targetNamespace() : resultTNS; 72 webResultHeader = webResult.header(); 73 } 74 QName resultQName = new QName (resultTNS, resultName); 75 if (returnType != null && (!"void".equals(returnType.getName()))) { 76 Annotation [] rann = new Annotation [0]; 78 typeRef = new TypeReference(resultQName, returnType, rann); 79 JavaParameter returnParameter = new JavaParameter(resultName, typeRef, JavaType.Style.OUT); 80 returnParameter.setPartName(resultPartName); 81 returnParameter.setTargetNamespace(resultTNS); 82 returnParameter.setHeader(webResultHeader); 83 response.addChildren(returnParameter); 84 } 85 } 86 List <JavaParameter> paras = processWebPara(method); 88 for (JavaParameter jp : paras) { 89 request.addChildren(jp); 90 } 91 processExceptions(javaMethod, method); 92 } 93 94 private void setMethodUse(JavaMethod javaMethod, Method method) { 95 SOAPBinding binding = method.getAnnotation(SOAPBinding.class); 96 if (binding != null) { 97 javaMethod.setSoapUse(binding.use()); 98 } else { 99 javaMethod.setSoapUse(this.model.getUse()); 100 } 101 } 102 103 private List <JavaParameter> processWebPara(Method method) { 104 Class <?>[] parameterTypes = method.getParameterTypes(); 106 Type [] parameterGenTypes = method.getGenericParameterTypes(); 107 Annotation [][] paraAnns = AnnotationUtil.getPrivParameterAnnotations(method); 108 List <JavaParameter> paras = new ArrayList <JavaParameter>(); 109 int i = 0; 110 for (Class clazzType : parameterTypes) { 111 String paraName = "arg" + i; 112 String partName; 113 String paraTNS = model.getTargetNameSpace(); 114 Class clazz = clazzType; 115 boolean holder = isHolder(clazzType); 116 if (holder) { 117 clazz = getHoldedClass(clazzType, parameterGenTypes[i]); 118 } 119 for (Annotation anno : paraAnns[i]) { 120 if (anno.annotationType() == WebParam.class) { 121 WebParam webParam = (WebParam)anno; 122 paraName = webParam.name().length() > 0 ? webParam.name() : paraName; 123 partName = webParam.partName().length() > 0 ? webParam.partName() : paraName; 124 paraTNS = webParam.targetNamespace().length() > 0 125 ? webParam.targetNamespace() : paraTNS; 126 127 QName requestQN = new QName (paraTNS, paraName); 128 TypeReference typeref = new TypeReference(requestQN, clazz, paraAnns[i]); 129 JavaParameter jp; 130 if (holder) { 131 if (webParam.mode() == WebParam.Mode.INOUT) { 132 jp = new JavaParameter(typeref.tagName.getLocalPart(), typeref, 133 JavaType.Style.INOUT); 134 } else { 135 jp = new JavaParameter(typeref.tagName.getLocalPart(), typeref, 136 JavaType.Style.OUT); 137 } 138 } else { 139 jp = new JavaParameter(typeref.tagName.getLocalPart(), typeref, JavaType.Style.IN); 140 } 141 jp.setName(paraName); 142 jp.setPartName(partName); 143 jp.setHeader(webParam.header()); 144 jp.setTargetNamespace(paraTNS); 145 paras.add(jp); 146 } 147 } 148 i++; 149 } 150 151 return paras; 152 } 153 154 private void processExceptions(JavaMethod jmethod, Method method) { 155 for (Type exception : method.getGenericExceptionTypes()) { 156 if (RemoteException .class.isAssignableFrom((Class )exception)) { 157 continue; 158 } 159 Annotation [] anns = null; 160 Class <?> exClass = (Class <?>)exception; 161 String exNameSpace = model.getTargetNameSpace(); 162 String exName = exClass.getSimpleName(); 163 Class exReturnType = null; 164 Method faultInfo = null; 165 try { 166 faultInfo = exClass.getMethod("getFaultInfo", new Class [0]); 167 } catch (SecurityException e) { 168 throw new ToolException(e.getMessage(), e); 169 } catch (NoSuchMethodException e) { 170 throw new ToolException(e.getMessage(), e); 171 } 172 173 if (faultInfo != null) { 174 WebFault wf = exClass.getAnnotation(WebFault.class); 175 exReturnType = faultInfo.getReturnType(); 176 anns = faultInfo.getAnnotations(); 177 if (wf.targetNamespace().length() > 0) { 178 exNameSpace = wf.targetNamespace(); 179 } 180 exName = wf.name(); 181 } 182 183 QName exQName = new QName (exNameSpace, exName); 184 TypeReference tf = new TypeReference(exQName, exReturnType, anns); 185 WSDLException wsdlEx = new WSDLException(exClass, tf); 186 jmethod.addWSDLException(wsdlEx); 187 188 } 189 } 190 191 private boolean isHolder(Class cType) { 192 return Holder.class.isAssignableFrom(cType); 193 } 195 196 private Class getHoldedClass(Class holderClazz, Type type) { 197 ParameterizedType pt = (ParameterizedType )type; 198 return getClass(pt.getActualTypeArguments()[0]); 199 } 200 201 private Class getClass(Type type) { 202 if (type instanceof Class ) { 203 return (Class )type; 204 } else if (type instanceof GenericArrayType ) { 205 GenericArrayType gt = (GenericArrayType )type; 206 Class compType = getClass(gt.getGenericComponentType()); 207 return java.lang.reflect.Array.newInstance(compType, 0).getClass(); 208 } 209 return Object .class; 210 } 211 212 } 213 | Popular Tags |