1 /* 2 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package com.sun.tools.internal.ws.processor.modeler.wsdl; 27 28 import com.sun.tools.internal.ws.processor.model.AbstractType; 29 import com.sun.tools.internal.ws.processor.model.Block; 30 import com.sun.tools.internal.ws.processor.model.ModelProperties; 31 import com.sun.tools.internal.ws.processor.model.Parameter; 32 import com.sun.tools.internal.ws.processor.model.java.JavaSimpleType; 33 import com.sun.tools.internal.ws.processor.model.java.JavaStructureMember; 34 import com.sun.tools.internal.ws.processor.model.java.JavaStructureType; 35 import com.sun.tools.internal.ws.processor.model.java.JavaType; 36 import com.sun.tools.internal.ws.processor.model.jaxb.*; 37 import com.sun.tools.internal.ws.resources.ModelerMessages; 38 import com.sun.tools.internal.ws.util.ClassNameInfo; 39 import com.sun.tools.internal.ws.wscompile.AbortException; 40 import com.sun.tools.internal.ws.wscompile.ErrorReceiverFilter; 41 import com.sun.tools.internal.ws.wsdl.document.Message; 42 import com.sun.tools.internal.ws.wsdl.document.MessagePart; 43 import com.sun.tools.internal.xjc.api.S2JJAXBModel; 44 import com.sun.tools.internal.xjc.api.TypeAndAnnotation; 45 46 import javax.xml.namespace.QName; 47 import java.util.ArrayList; 48 import java.util.Iterator; 49 import java.util.List; 50 51 /** 52 * Utilities to be used by WSDLModeler 53 * 54 * @author Vivek Pandey 55 * 56 */ 57 class ModelerUtils { 58 59 /** 60 * This method should be called incase of wrapper style operations. This is 61 * equivalent to wrapper style schema component or JAXB Mapping object. 62 * 63 * @param jaxbType JAXBType from which a JAXBStructured type will be created. 64 * @return returns JAXBStructured type 65 */ 66 public static JAXBStructuredType createJAXBStructureType(JAXBType jaxbType) { 67 JAXBStructuredType type = new JAXBStructuredType(jaxbType); 68 type.setName(jaxbType.getName()); 69 type.setJavaType(jaxbType.getJavaType()); 70 return type; 71 } 72 73 /** 74 * This method uses JAXBStructured type (wrapper style operations) and 75 * unwraps it to create list of parameters. 76 * 77 * 78 * @param jaxbType instance of JAXBType, could be JAXBStructured type. 79 * @param block The Block (body/Header/Attachment) to which the created Parameter belong. 80 * @return list of Parameters 81 */ 82 public static List<Parameter> createUnwrappedParameters(JAXBType jaxbType, 83 Block block) { 84 List<Parameter> paramList = new ArrayList<Parameter>(); 85 JAXBStructuredType type = null; 86 if (!(jaxbType instanceof JAXBStructuredType)) 87 type = createJAXBStructureType(jaxbType); 88 else 89 type = (JAXBStructuredType) jaxbType; 90 91 JavaStructureType jst = new JavaStructureType(jaxbType.getJavaType() 92 .getRealName(), true, type); 93 type.setJavaType(jst); 94 block.setType(type); 95 List memberList = jaxbType.getWrapperChildren(); 96 Iterator props = memberList.iterator(); 97 while (props.hasNext()) { 98 JAXBProperty prop = (JAXBProperty) props.next(); 99 paramList.add(createUnwrappedParameter(prop, jaxbType, block, type, 100 jst)); 101 } 102 103 return paramList; 104 } 105 106 /** 107 * @param prop 108 * @param jaxbType 109 * @param block 110 * @return 111 */ 112 private static Parameter createUnwrappedParameter(JAXBProperty prop, 113 JAXBType jaxbType, Block block, JAXBStructuredType type, 114 JavaStructureType jst) { 115 QName elementName = prop.getElementName(); 116 JavaType javaType = new JavaSimpleType(prop.getType()); 117 JAXBElementMember eType = new JAXBElementMember(elementName, jaxbType); 118 JavaStructureMember jsm = new JavaStructureMember(elementName 119 .getLocalPart(), javaType, eType); 120 eType.setJavaStructureMember(jsm); 121 jst.add(jsm); 122 eType.setProperty(prop); 123 type.add(eType); 124 JAXBType t = new JAXBType(elementName, javaType, jaxbType 125 .getJaxbMapping(), jaxbType.getJaxbModel()); 126 t.setUnwrapped(true); 127 Parameter parameter = createParameter(elementName.getLocalPart(), t, block); 128 parameter.setEmbedded(true); 129 return parameter; 130 } 131 132 public static List<Parameter> createRpcLitParameters(Message message, Block block, S2JJAXBModel jaxbModel, ErrorReceiverFilter errReceiver){ 133 RpcLitStructure rpcStruct = (RpcLitStructure)block.getType(); 134 135 List<Parameter> parameters = new ArrayList<Parameter>(); 136 for(MessagePart part : message.getParts()){ 137 if(!ModelerUtils.isBoundToSOAPBody(part)) 138 continue; 139 QName name = part.getDescriptor(); 140 TypeAndAnnotation typeAndAnn = jaxbModel.getJavaType(name); 141 if(typeAndAnn == null){ 142 String msgQName = "{"+message.getDefining().getTargetNamespaceURI()+"}"+message.getName(); 143 errReceiver.error(part.getLocator(), ModelerMessages.WSDLMODELER_RPCLIT_UNKOWNSCHEMATYPE(name.toString(), 144 part.getName(), msgQName)); 145 throw new AbortException(); 146 } 147 String type = typeAndAnn.getTypeClass().fullName(); 148 type = ClassNameInfo.getGenericClass(type); 149 RpcLitMember param = new RpcLitMember(new QName("", part.getName()), type); 150 JavaType javaType = new JavaSimpleType(new JAXBTypeAndAnnotation(typeAndAnn)); 151 param.setJavaType(javaType); 152 rpcStruct.addRpcLitMember(param); 153 Parameter parameter = ModelerUtils.createParameter(part.getName(), param, block); 154 parameter.setEmbedded(true); 155 parameters.add(parameter); 156 } 157 return parameters; 158 } 159 160 /** 161 * Called for non-wrapper style operations. It returns a Parameter constructed 162 * using the JAXBType and the Block. 163 * 164 * @param partName typically wsdl:part or any name to be given to the parameter 165 * @param jaxbType type of Parameter 166 * @param block Block to which the parameter belongs to 167 * @return Parameter created. 168 */ 169 public static Parameter createParameter(String partName, AbstractType jaxbType, 170 Block block) { 171 Parameter parameter = new Parameter(partName, block.getEntity()); 172 parameter.setProperty(ModelProperties.PROPERTY_PARAM_MESSAGE_PART_NAME, 173 partName); 174 parameter.setEmbedded(false); 175 parameter.setType(jaxbType); 176 parameter.setTypeName(jaxbType.getJavaType().getType().getName()); 177 parameter.setBlock(block); 178 return parameter; 179 } 180 181 /** 182 * Get Parameter from the list of parameters. 183 * 184 * @param paramName 185 * @param parameters 186 * @return the Parameter with name paramName from parameters 187 */ 188 public static Parameter getParameter(String paramName, List<Parameter> parameters){ 189 if(parameters == null) 190 return null; 191 for(Parameter param: parameters){ 192 //if(param.getName().equals("_return") && paramName.equals("return") || param.getName().equals(paramName)) { 193 if(param.getName().equals(paramName)){ 194 return param; 195 } 196 } 197 return null; 198 } 199 200 /** 201 * Compares two JAXBStructures. 202 * 203 * @param struct1 204 * @param struct2 205 * @return true if struct1 and struct2 are equivalent. 206 */ 207 public static boolean isEquivalentLiteralStructures( 208 JAXBStructuredType struct1, 209 JAXBStructuredType struct2) { 210 if (struct1.getElementMembersCount() != struct2.getElementMembersCount()) 211 return false; 212 Iterator members = struct1.getElementMembers(); 213 JAXBElementMember member1; 214 JavaStructureMember javaMember1, javaMember2; 215 for (int i = 0; members.hasNext(); i++) { 216 member1 = (JAXBElementMember)members.next(); 217 javaMember1 = member1.getJavaStructureMember(); 218 javaMember2 = 219 ((JavaStructureType)struct2.getJavaType()).getMemberByName( 220 member1.getJavaStructureMember().getName()); 221 if (javaMember2.getConstructorPos() != i 222 || !javaMember1.getType().equals(javaMember2.getType())) { 223 return false; 224 } 225 } 226 return false; 227 } 228 229 public static QName getRawTypeName(Parameter parameter) { 230 String name = parameter.getName(); 231 232 if (parameter.getType() instanceof JAXBType) { 233 JAXBType jt = (JAXBType)parameter.getType(); 234 if (jt.isUnwrappable()) { 235 List<JAXBProperty> props = jt.getWrapperChildren(); 236 for(JAXBProperty prop: props) { 237 if (prop.getName().equals(name)) { 238 return prop.getRawTypeName(); 239 } 240 } 241 } 242 } 243 return null; 244 } 245 246 /** 247 * @param part 248 * @return true if part is bound to Mime content 249 */ 250 public static boolean isBoundToMimeContent(MessagePart part) { 251 if((part != null) && part.getBindingExtensibilityElementKind() == MessagePart.WSDL_MIME_BINDING) 252 return true; 253 return false; 254 } 255 256 /** 257 * @param part 258 * @return true if part is bound to SOAPBody 259 */ 260 public static boolean isBoundToSOAPBody(MessagePart part) { 261 if((part != null) && part.getBindingExtensibilityElementKind() == MessagePart.SOAP_BODY_BINDING) 262 return true; 263 return false; 264 } 265 266 /** 267 * @param part 268 * @return true if part is bound to SOAPHeader 269 */ 270 public static boolean isBoundToSOAPHeader(MessagePart part) { 271 if((part != null) && part.getBindingExtensibilityElementKind() == MessagePart.SOAP_HEADER_BINDING) 272 return true; 273 return false; 274 } 275 276 public static boolean isUnbound(MessagePart part) { 277 if((part != null) && part.getBindingExtensibilityElementKind() == MessagePart.PART_NOT_BOUNDED) 278 return true; 279 return false; 280 } 281 }