KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > objectweb > celtix > tools > processors > java2 > internal > RPCMethodProcessor


1 package org.objectweb.celtix.tools.processors.java2.internal;
2
3 import java.lang.annotation.Annotation JavaDoc;
4 import java.lang.reflect.GenericArrayType JavaDoc;
5 import java.lang.reflect.Method JavaDoc;
6 import java.lang.reflect.ParameterizedType JavaDoc;
7 import java.lang.reflect.Type JavaDoc;
8 import java.rmi.RemoteException JavaDoc;
9 import java.util.ArrayList JavaDoc;
10 import java.util.List JavaDoc;
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 JavaDoc;
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 JavaDoc method) {
40         javaMethod.setSoapStyle(SOAPBinding.Style.RPC);
41         javaMethod.setWrapperStyle(true);
42         setMethodUse(javaMethod, method);
43
44         String JavaDoc 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 JavaDoc resQN = new QName JavaDoc(targetNS, method.getName() + "Response");
55             TypeReference typeRef = new TypeReference(resQN, this.getClass(), new Annotation JavaDoc[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 JavaDoc returnType = method.getReturnType();
62             String JavaDoc resultName = method.getName() + "Response";
63             String JavaDoc resultTNS = targetNS;
64             String JavaDoc 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 JavaDoc resultQName = new QName JavaDoc(resultTNS, resultName);
75             if (returnType != null && (!"void".equals(returnType.getName()))) {
76                 // Annotation[] rann = method.getAnnotations();
77
Annotation JavaDoc[] rann = new Annotation JavaDoc[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         // get WebParam
87
List JavaDoc<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 JavaDoc 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 JavaDoc<JavaParameter> processWebPara(Method JavaDoc method) {
104         // processWebparam
105
Class JavaDoc<?>[] parameterTypes = method.getParameterTypes();
106         Type JavaDoc[] parameterGenTypes = method.getGenericParameterTypes();
107         Annotation JavaDoc[][] paraAnns = AnnotationUtil.getPrivParameterAnnotations(method);
108         List JavaDoc<JavaParameter> paras = new ArrayList JavaDoc<JavaParameter>();
109         int i = 0;
110         for (Class JavaDoc clazzType : parameterTypes) {
111             String JavaDoc paraName = "arg" + i;
112             String JavaDoc partName;
113             String JavaDoc paraTNS = model.getTargetNameSpace();
114             Class JavaDoc clazz = clazzType;
115             boolean holder = isHolder(clazzType);
116             if (holder) {
117                 clazz = getHoldedClass(clazzType, parameterGenTypes[i]);
118             }
119             for (Annotation JavaDoc 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 JavaDoc requestQN = new QName JavaDoc(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 JavaDoc method) {
155         for (Type JavaDoc exception : method.getGenericExceptionTypes()) {
156             if (RemoteException JavaDoc.class.isAssignableFrom((Class JavaDoc)exception)) {
157                 continue;
158             }
159             Annotation JavaDoc[] anns = null;
160             Class JavaDoc<?> exClass = (Class JavaDoc<?>)exception;
161             String JavaDoc exNameSpace = model.getTargetNameSpace();
162             String JavaDoc exName = exClass.getSimpleName();
163             Class JavaDoc exReturnType = null;
164             Method JavaDoc faultInfo = null;
165             try {
166                 faultInfo = exClass.getMethod("getFaultInfo", new Class JavaDoc[0]);
167             } catch (SecurityException JavaDoc e) {
168                 throw new ToolException(e.getMessage(), e);
169             } catch (NoSuchMethodException JavaDoc 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 JavaDoc exQName = new QName JavaDoc(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 JavaDoc cType) {
192         return Holder.class.isAssignableFrom(cType);
193         // set the actual type argument of Holder in the TypeReference
194
}
195
196     private Class JavaDoc getHoldedClass(Class JavaDoc holderClazz, Type JavaDoc type) {
197         ParameterizedType JavaDoc pt = (ParameterizedType JavaDoc)type;
198         return getClass(pt.getActualTypeArguments()[0]);
199     }
200
201     private Class JavaDoc getClass(Type JavaDoc type) {
202         if (type instanceof Class JavaDoc) {
203             return (Class JavaDoc)type;
204         } else if (type instanceof GenericArrayType JavaDoc) {
205             GenericArrayType JavaDoc gt = (GenericArrayType JavaDoc)type;
206             Class JavaDoc compType = getClass(gt.getGenericComponentType());
207             return java.lang.reflect.Array.newInstance(compType, 0).getClass();
208         }
209         return Object JavaDoc.class;
210     }
211
212 }
213
Popular Tags