001: package org.objectweb.celtix.tools.processors.wsdl2.internal;
002:
003: import java.util.*;
004: import javax.jws.soap.SOAPBinding;
005: import javax.wsdl.Definition;
006:
007: import org.objectweb.celtix.tools.common.ProcessorEnvironment;
008: import org.objectweb.celtix.tools.common.model.JavaAnnotation;
009: import org.objectweb.celtix.tools.common.model.JavaInterface;
010: import org.objectweb.celtix.tools.common.model.JavaMethod;
011: import org.objectweb.celtix.tools.common.model.JavaModel;
012: import org.objectweb.celtix.tools.utils.SOAPBindingUtil;
013:
014: public class SEIAnnotationProcessor extends AbstractProcessor {
015:
016: public SEIAnnotationProcessor(ProcessorEnvironment penv) {
017: super (penv);
018: }
019:
020: public void process(JavaModel javaModel, Definition def) {
021: Map<String, JavaInterface> interfaces = javaModel
022: .getInterfaces();
023: for (Iterator iter = interfaces.keySet().iterator(); iter
024: .hasNext();) {
025: String interfaceName = (String) iter.next();
026: JavaInterface intf = interfaces.get(interfaceName);
027:
028: JavaAnnotation serviceAnnotation = new JavaAnnotation(
029: "WebService");
030: serviceAnnotation.addArgument("targetNamespace", intf
031: .getNamespace());
032: serviceAnnotation.addArgument("wsdlLocation", intf
033: .getLocation());
034: serviceAnnotation.addArgument("name", intf
035: .getWebServiceName());
036:
037: intf.addAnnotation(serviceAnnotation.toString());
038:
039: if (def.getBindings().size() == 0) {
040: return;
041: }
042: if (processBinding(intf)) {
043: JavaAnnotation bindingAnnotation = new JavaAnnotation(
044: "SOAPBinding");
045: String style = SOAPBindingUtil
046: .getBindingAnnotation(intf.getSOAPStyle()
047: .toString());
048: bindingAnnotation.addArgument("style", style, "");
049: String use = SOAPBindingUtil.getBindingAnnotation(intf
050: .getSOAPUse().toString());
051: bindingAnnotation.addArgument("use", use, "");
052: if (intf.getSOAPStyle() == SOAPBinding.Style.DOCUMENT) {
053: String parameterStyle = SOAPBindingUtil
054: .getBindingAnnotation(intf
055: .getSOAPParameterStyle().toString());
056: bindingAnnotation.addArgument("parameterStyle",
057: parameterStyle, "");
058: }
059: intf.addAnnotation(bindingAnnotation.toString());
060: }
061: }
062: }
063:
064: private boolean processBinding(JavaInterface intf) {
065: SOAPBinding.Style soapStyle = intf.getSOAPStyle();
066: SOAPBinding.Use soapUse = intf.getSOAPUse();
067: boolean isWrapped = true;
068: int count = 0;
069: for (JavaMethod method : intf.getMethods()) {
070: if (!method.isWrapperStyle()) {
071: isWrapped = false;
072: count++;
073: }
074: if (soapStyle == null && method.getSoapStyle() != null) {
075: soapStyle = method.getSoapStyle();
076: }
077: if (soapUse == null && method.getSoapUse() != null) {
078: soapUse = method.getSoapUse();
079: }
080: }
081:
082: if (soapStyle == SOAPBinding.Style.DOCUMENT) {
083: intf.setSOAPStyle(SOAPBinding.Style.DOCUMENT);
084: if (isWrapped) {
085: intf
086: .setSOAPParameterStyle(SOAPBinding.ParameterStyle.WRAPPED);
087: } else {
088: intf
089: .setSOAPParameterStyle(SOAPBinding.ParameterStyle.BARE);
090: }
091: } else if (soapStyle == null) {
092: intf.setSOAPStyle(SOAPBinding.Style.DOCUMENT);
093: if (isWrapped) {
094: intf
095: .setSOAPParameterStyle(SOAPBinding.ParameterStyle.WRAPPED);
096: } else {
097: intf
098: .setSOAPParameterStyle(SOAPBinding.ParameterStyle.BARE);
099: }
100:
101: } else {
102: intf.setSOAPStyle(SOAPBinding.Style.RPC);
103: }
104:
105: if (soapUse == SOAPBinding.Use.LITERAL) {
106: intf.setSOAPUse(SOAPBinding.Use.LITERAL);
107: } else if (soapUse == null) {
108: intf.setSOAPUse(SOAPBinding.Use.LITERAL);
109: } else {
110: intf.setSOAPUse(SOAPBinding.Use.ENCODED);
111: }
112:
113: if (intf.getSOAPStyle() == SOAPBinding.Style.DOCUMENT
114: && count != 0 && count != intf.getMethods().size()) {
115: return false;
116: }
117:
118: if (intf.getSOAPStyle() == SOAPBinding.Style.DOCUMENT
119: && intf.getSOAPUse() == SOAPBinding.Use.LITERAL
120: && intf.getSOAPParameterStyle() == SOAPBinding.ParameterStyle.WRAPPED) {
121: return false;
122: }
123: return true;
124: }
125: }
|