1 package org.objectweb.celtix.tools.generators.java2; 2 3 import java.util.Iterator ; 4 5 import javax.jws.soap.SOAPBinding; 6 import javax.wsdl.Definition; 7 import javax.wsdl.Fault; 8 import javax.wsdl.Input; 9 import javax.wsdl.Message; 10 import javax.wsdl.Operation; 11 import javax.wsdl.Output; 12 import javax.wsdl.Part; 13 import javax.wsdl.PortType; 14 import javax.xml.namespace.QName ; 15 16 import com.sun.xml.bind.api.JAXBRIContext; 17 18 import org.objectweb.celtix.tools.common.model.JavaMethod; 19 import org.objectweb.celtix.tools.common.model.JavaParameter; 20 import org.objectweb.celtix.tools.common.model.WSDLModel; 21 import org.objectweb.celtix.tools.common.model.WSDLParameter; 22 23 public class MessagePortTypeGenerator { 24 private WSDLModel wmodel; 25 private Definition definition; 26 27 public MessagePortTypeGenerator(WSDLModel model) { 28 this.definition = model.getDefinition(); 29 this.wmodel = model; 30 } 31 32 public void generate() { 33 PortType portType = definition.createPortType(); 34 portType.setQName(new QName (wmodel.getTargetNameSpace(), wmodel.getPortTypeName())); 35 portType.setUndefined(false); 36 for (JavaMethod method : wmodel.getJavaMethods()) { 37 Operation operation = definition.createOperation(); 38 operation.setName(method.getName()); 39 operation.setUndefined(false); 40 41 Message inputMessage = null; 42 inputMessage = definition.createMessage(); 43 inputMessage.setQName(new QName (wmodel.getTargetNameSpace(), method.getName())); 44 processInputMessage(operation, method, inputMessage); 45 46 Message outputMessage = null; 47 if (!method.isOneWay()) { 48 outputMessage = definition.createMessage(); 49 outputMessage.setQName(new QName (wmodel.getTargetNameSpace(), method.getName() + "Response")); 50 processOutputMessage(operation, method, outputMessage); 51 } 52 53 generateFault(method, operation); 54 55 portType.addOperation(operation); 56 definition.addPortType(portType); 57 } 58 59 } 60 61 private void processInputMessage(Operation operation, JavaMethod method, Message inputMessage) { 62 WSDLParameter request = method.getRequest(); 63 String reqNS = request.getTargetNamespace(); 64 65 if (method.getSoapStyle() == SOAPBinding.Style.DOCUMENT && method.isWrapperStyle()) { 66 addPartByElementName(inputMessage, request.getName(), new QName (reqNS, request.getName())); 67 68 } 69 70 if (method.getSoapStyle() == SOAPBinding.Style.DOCUMENT && !method.isWrapperStyle()) { 72 for (JavaParameter jp : request.getChildren()) { 73 addPartByElementName(inputMessage, jp.getPartName(), new QName (jp.getTargetNamespace(), jp 74 .getName())); 75 } 76 } 77 78 80 if (method.getSoapStyle() == SOAPBinding.Style.RPC) { 81 JAXBRIContext jxbcontext = wmodel.getJaxbContext(); 82 if (request != null && request.getChildren().size() > 0) { 83 Iterator ite2 = request.getChildren().iterator(); 84 while (ite2.hasNext()) { 85 JavaParameter jp = (JavaParameter)ite2.next(); 86 QName qname = jxbcontext.getTypeName(jp.getTypeReference()); 87 addPartByTypeName(inputMessage, jp.getName(), qname); 88 } 89 90 } 91 } 92 93 addInputToMessage(operation, inputMessage, request.getName()); 94 inputMessage.setUndefined(false); 95 definition.addMessage(inputMessage); 96 97 } 98 99 100 101 private void processOutputMessage(Operation operation, JavaMethod method, Message outputMessage) { 102 WSDLParameter response = method.getResponse(); 103 String resNS = response.getTargetNamespace(); 104 105 if (method.getSoapStyle() == SOAPBinding.Style.DOCUMENT && method.isWrapperStyle()) { 106 addPartByElementName(outputMessage, response.getName(), new QName (resNS, response.getName())); 107 108 } 109 110 if (method.getSoapStyle() == SOAPBinding.Style.DOCUMENT && !method.isWrapperStyle()) { 112 for (JavaParameter jp : response.getChildren()) { 113 addPartByElementName(outputMessage, jp.getPartName(), new QName (jp.getTargetNamespace(), jp 114 .getName())); 115 } 116 } 117 118 120 if (method.getSoapStyle() == SOAPBinding.Style.RPC) { 121 JAXBRIContext jxbcontext = wmodel.getJaxbContext(); 122 if (response != null && response.getChildren().size() > 0) { 123 Iterator ite2 = response.getChildren().iterator(); 124 while (ite2.hasNext()) { 125 JavaParameter jp = (JavaParameter)ite2.next(); 126 QName qname = jxbcontext.getTypeName(jp.getTypeReference()); 127 addPartByTypeName(outputMessage, jp.getName(), qname); 128 } 129 130 } 131 132 } 133 134 addOutputToMessage(operation, outputMessage, response.getName()); 135 outputMessage.setUndefined(false); 136 definition.addMessage(outputMessage); 137 138 } 139 140 141 142 143 private void generateFault(JavaMethod method, Operation operation) { 144 for (org.objectweb.celtix.tools.common.model.WSDLException exception : method.getWSDLExceptions()) { 145 String exceptionName = exception.getExcpetionClass().getSimpleName(); 146 Message msg = definition.createMessage(); 147 msg.setQName(new QName (wmodel.getTargetNameSpace(), exceptionName)); 148 Part part = definition.createPart(); 149 part.setName(exception.getDetailType().getSimpleName()); 150 part.setElementName(exception.getDetailTypeReference().tagName); 151 msg.addPart(part); 152 msg.setUndefined(false); 153 definition.addMessage(msg); 154 Fault fault = definition.createFault(); 155 fault.setMessage(msg); 156 fault.setName(exceptionName); 157 operation.addFault(fault); 158 } 159 } 160 161 private void addPartByElementName(Message message, String partName, QName partElementName) { 162 if (partName == null) { 163 return; 164 } 165 Part part = definition.createPart(); 166 part.setName(partName); 167 part.setElementName(partElementName); 168 message.addPart(part); 169 } 170 171 private void addPartByTypeName(Message message, String partName, QName typeName) { 172 Part part = definition.createPart(); 173 part.setName(partName); 174 part.setTypeName(typeName); 175 message.addPart(part); 176 } 177 178 private void addInputToMessage(Operation operation, Message msg, String inputName) { 179 Input input = definition.createInput(); 180 input.setMessage(msg); 181 input.setName(inputName); 182 operation.setInput(input); 183 } 184 185 private void addOutputToMessage(Operation operation, Message msg, String outputName) { 186 Output output = definition.createOutput(); 187 output.setMessage(msg); 188 output.setName(outputName); 189 operation.setOutput(output); 190 } 191 } 192 | Popular Tags |