KickJava   Java API By Example, From Geeks To Geeks.

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


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 import java.util.logging.Logger JavaDoc;
12
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.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 JavaDoc 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 JavaDoc method) {
42         boolean isHolder = false;
43         javaMethod.setSoapStyle(SOAPBinding.Style.DOCUMENT);
44         javaMethod.setWrapperStyle(false);
45         setMethodUse(javaMethod, method);
46
47         // process webresult annotation
48
String JavaDoc resultName = method.getName() + "Response";
49         String JavaDoc resultTNS = model.getTargetNameSpace();
50         String JavaDoc 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         // get return type class
62

63         WSDLParameter response = new WSDLParameter();
64         // process return
65
Class JavaDoc returnType = method.getReturnType();
66         if (returnType != null && !"void".equals(returnType.getName())) {
67             QName JavaDoc resQN = new QName JavaDoc(resultTNS, resultName);
68             TypeReference typeRef = new TypeReference(resQN, returnType, new Annotation JavaDoc[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         // processWebparam
82
WSDLParameter request = new WSDLParameter();
83         request.setName(method.getName());
84         request.setStyle(JavaType.Style.IN);
85         javaMethod.addRequest(request);
86         List JavaDoc<JavaParameter> paras = processWebPara(method);
87         for (JavaParameter jp : paras) {
88             // requestWrapper.addWrapperChild(jp);
89
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 JavaDoc 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 JavaDoc<JavaParameter> processWebPara(Method JavaDoc method) {
122         // processWebparam
123
Class JavaDoc<?>[] parameterTypes = method.getParameterTypes();
124         Type JavaDoc[] parameterGenTypes = method.getGenericParameterTypes();
125         Annotation JavaDoc[][] paraAnns = AnnotationUtil.getPrivParameterAnnotations(method);
126         List JavaDoc<JavaParameter> paras = new ArrayList JavaDoc<JavaParameter>();
127         // DocumentBare_criteria defined jaxws spec 3.6.2.2
128
// criteria 1 - it must have at most one in or in/out non_header
129
boolean criteria1 = false;
130         // criteria 2 - if it has a return type other than void
131
// it must have no in/out or out non-header parameters
132
boolean criteria2 = true;
133         // criteria 3 - if it has a return type of void
134
// it must have at most one in/out or out-header parameter
135
boolean criteria3 = false;
136         // for doc_bare criteria3
137
int nonHeaderParamCount = 0;
138
139         int i = 0;
140         for (Class JavaDoc clazzType : parameterTypes) {
141             String JavaDoc paraName = "arg" + i;
142             String JavaDoc partName;
143             String JavaDoc paraTNS = model.getTargetNameSpace();
144             Class JavaDoc clazz = clazzType;
145             boolean holder = isHolder(clazzType);
146             if (holder) {
147                 clazz = getHoldedClass(clazzType, parameterGenTypes[i]);
148             }
149             for (Annotation JavaDoc 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 JavaDoc requestQN = new QName JavaDoc(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 JavaDoc method) {
214         for (Type JavaDoc exception : method.getGenericExceptionTypes()) {
215             if (RemoteException JavaDoc.class.isAssignableFrom((Class JavaDoc)exception)) {
216                 continue;
217             }
218             Annotation JavaDoc[] anns = null;
219             Class JavaDoc<?> exClass = (Class JavaDoc<?>)exception;
220             String JavaDoc exNameSpace = model.getTargetNameSpace();
221             String JavaDoc exName = exClass.getSimpleName();
222             Class JavaDoc exReturnType = null;
223             Method JavaDoc faultInfo = null;
224             try {
225                 faultInfo = exClass.getMethod("getFaultInfo", new Class JavaDoc[0]);
226             } catch (SecurityException JavaDoc e) {
227                 throw new ToolException(e.getMessage(), e);
228             } catch (NoSuchMethodException JavaDoc 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 JavaDoc exQName = new QName JavaDoc(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 JavaDoc cType) {
252         return Holder.class.isAssignableFrom(cType);
253         // set the actual type argument of Holder in the TypeReference
254
}
255
256     private Class JavaDoc getHoldedClass(Class JavaDoc holderClazz, Type JavaDoc type) {
257         ParameterizedType JavaDoc pt = (ParameterizedType JavaDoc)type;
258         return getClass(pt.getActualTypeArguments()[0]);
259     }
260
261     private Class JavaDoc getClass(Type JavaDoc type) {
262         if (type instanceof Class JavaDoc) {
263             return (Class JavaDoc)type;
264         } else if (type instanceof GenericArrayType JavaDoc) {
265             GenericArrayType JavaDoc gt = (GenericArrayType JavaDoc)type;
266             Class JavaDoc compType = getClass(gt.getGenericComponentType());
267             return java.lang.reflect.Array.newInstance(compType, 0).getClass();
268         }
269         return Object JavaDoc.class;
270     }
271
272 }
273
Popular Tags