blob: 93e06b94efe904c7f56acfed35b9126b0e24d312 [file] [log] [blame]
/*
* Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package com.sun.tools.internal.ws.processor.modeler.wsdl;
import com.sun.tools.internal.ws.processor.model.AbstractType;
import com.sun.tools.internal.ws.processor.model.Block;
import com.sun.tools.internal.ws.processor.model.ModelProperties;
import com.sun.tools.internal.ws.processor.model.Parameter;
import com.sun.tools.internal.ws.processor.model.java.JavaSimpleType;
import com.sun.tools.internal.ws.processor.model.java.JavaStructureMember;
import com.sun.tools.internal.ws.processor.model.java.JavaStructureType;
import com.sun.tools.internal.ws.processor.model.java.JavaType;
import com.sun.tools.internal.ws.processor.model.jaxb.*;
import com.sun.tools.internal.ws.resources.ModelerMessages;
import com.sun.tools.internal.ws.util.ClassNameInfo;
import com.sun.tools.internal.ws.wscompile.AbortException;
import com.sun.tools.internal.ws.wscompile.ErrorReceiverFilter;
import com.sun.tools.internal.ws.wsdl.document.Message;
import com.sun.tools.internal.ws.wsdl.document.MessagePart;
import com.sun.tools.internal.xjc.api.S2JJAXBModel;
import com.sun.tools.internal.xjc.api.TypeAndAnnotation;
import javax.xml.namespace.QName;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* Utilities to be used by WSDLModeler
*
* @author Vivek Pandey
*
*/
class ModelerUtils {
/**
* This method should be called incase of wrapper style operations. This is
* equivalent to wrapper style schema component or JAXB Mapping object.
*
* @param jaxbType JAXBType from which a JAXBStructured type will be created.
* @return returns JAXBStructured type
*/
public static JAXBStructuredType createJAXBStructureType(JAXBType jaxbType) {
JAXBStructuredType type = new JAXBStructuredType(jaxbType);
type.setName(jaxbType.getName());
type.setJavaType(jaxbType.getJavaType());
return type;
}
/**
* This method uses JAXBStructured type (wrapper style operations) and
* unwraps it to create list of parameters.
*
*
* @param jaxbType instance of JAXBType, could be JAXBStructured type.
* @param block The Block (body/Header/Attachment) to which the created Parameter belong.
* @return list of Parameters
*/
public static List<Parameter> createUnwrappedParameters(JAXBType jaxbType,
Block block) {
List<Parameter> paramList = new ArrayList<Parameter>();
JAXBStructuredType type = null;
if (!(jaxbType instanceof JAXBStructuredType))
type = createJAXBStructureType(jaxbType);
else
type = (JAXBStructuredType) jaxbType;
JavaStructureType jst = new JavaStructureType(jaxbType.getJavaType()
.getRealName(), true, type);
type.setJavaType(jst);
block.setType(type);
List memberList = jaxbType.getWrapperChildren();
Iterator props = memberList.iterator();
while (props.hasNext()) {
JAXBProperty prop = (JAXBProperty) props.next();
paramList.add(createUnwrappedParameter(prop, jaxbType, block, type,
jst));
}
return paramList;
}
/**
* @param prop
* @param jaxbType
* @param block
* @return unwrapped parameter
*/
private static Parameter createUnwrappedParameter(JAXBProperty prop,
JAXBType jaxbType, Block block, JAXBStructuredType type,
JavaStructureType jst) {
QName elementName = prop.getElementName();
JavaType javaType = new JavaSimpleType(prop.getType());
JAXBElementMember eType = new JAXBElementMember(elementName, jaxbType);
JavaStructureMember jsm = new JavaStructureMember(elementName
.getLocalPart(), javaType, eType);
eType.setJavaStructureMember(jsm);
jst.add(jsm);
eType.setProperty(prop);
type.add(eType);
JAXBType t = new JAXBType(elementName, javaType, jaxbType
.getJaxbMapping(), jaxbType.getJaxbModel());
t.setUnwrapped(true);
Parameter parameter = createParameter(elementName.getLocalPart(), t, block);
parameter.setEmbedded(true);
return parameter;
}
public static List<Parameter> createRpcLitParameters(Message message, Block block, S2JJAXBModel jaxbModel, ErrorReceiverFilter errReceiver){
RpcLitStructure rpcStruct = (RpcLitStructure)block.getType();
List<Parameter> parameters = new ArrayList<Parameter>();
for(MessagePart part : message.getParts()){
if(!ModelerUtils.isBoundToSOAPBody(part))
continue;
QName name = part.getDescriptor();
TypeAndAnnotation typeAndAnn = jaxbModel.getJavaType(name);
if(typeAndAnn == null){
String msgQName = "{"+message.getDefining().getTargetNamespaceURI()+"}"+message.getName();
errReceiver.error(part.getLocator(), ModelerMessages.WSDLMODELER_RPCLIT_UNKOWNSCHEMATYPE(name.toString(),
part.getName(), msgQName));
throw new AbortException();
}
String type = typeAndAnn.getTypeClass().fullName();
type = ClassNameInfo.getGenericClass(type);
RpcLitMember param = new RpcLitMember(new QName("", part.getName()), type);
JavaType javaType = new JavaSimpleType(new JAXBTypeAndAnnotation(typeAndAnn));
param.setJavaType(javaType);
rpcStruct.addRpcLitMember(param);
Parameter parameter = ModelerUtils.createParameter(part.getName(), param, block);
parameter.setEmbedded(true);
parameters.add(parameter);
}
return parameters;
}
/**
* Called for non-wrapper style operations. It returns a Parameter constructed
* using the JAXBType and the Block.
*
* @param partName typically wsdl:part or any name to be given to the parameter
* @param jaxbType type of Parameter
* @param block Block to which the parameter belongs to
* @return Parameter created.
*/
public static Parameter createParameter(String partName, AbstractType jaxbType,
Block block) {
Parameter parameter = new Parameter(partName, block.getEntity());
parameter.setProperty(ModelProperties.PROPERTY_PARAM_MESSAGE_PART_NAME,
partName);
parameter.setEmbedded(false);
parameter.setType(jaxbType);
parameter.setTypeName(jaxbType.getJavaType().getType().getName());
parameter.setBlock(block);
return parameter;
}
/**
* Get Parameter from the list of parameters.
*
* @param paramName
* @param parameters
* @return the Parameter with name paramName from parameters
*/
public static Parameter getParameter(String paramName, List<Parameter> parameters){
if(parameters == null)
return null;
for(Parameter param: parameters){
//if(param.getName().equals("_return") && paramName.equals("return") || param.getName().equals(paramName)) {
if(param.getName().equals(paramName)){
return param;
}
}
return null;
}
/**
* Compares two JAXBStructures.
*
* @param struct1
* @param struct2
* @return true if struct1 and struct2 are equivalent.
*/
public static boolean isEquivalentLiteralStructures(
JAXBStructuredType struct1,
JAXBStructuredType struct2) {
if (struct1.getElementMembersCount() != struct2.getElementMembersCount())
return false;
Iterator members = struct1.getElementMembers();
JAXBElementMember member1;
JavaStructureMember javaMember1, javaMember2;
for (int i = 0; members.hasNext(); i++) {
member1 = (JAXBElementMember)members.next();
javaMember1 = member1.getJavaStructureMember();
javaMember2 =
((JavaStructureType)struct2.getJavaType()).getMemberByName(
member1.getJavaStructureMember().getName());
if (javaMember2.getConstructorPos() != i
|| !javaMember1.getType().equals(javaMember2.getType())) {
return false;
}
}
return false;
}
public static QName getRawTypeName(Parameter parameter) {
String name = parameter.getName();
if (parameter.getType() instanceof JAXBType) {
JAXBType jt = (JAXBType)parameter.getType();
if (jt.isUnwrappable()) {
List<JAXBProperty> props = jt.getWrapperChildren();
for(JAXBProperty prop: props) {
if (prop.getName().equals(name)) {
return prop.getRawTypeName();
}
}
}
}
return null;
}
/**
* @param part
* @return true if part is bound to Mime content
*/
public static boolean isBoundToMimeContent(MessagePart part) {
if((part != null) && part.getBindingExtensibilityElementKind() == MessagePart.WSDL_MIME_BINDING)
return true;
return false;
}
/**
* @param part
* @return true if part is bound to SOAPBody
*/
public static boolean isBoundToSOAPBody(MessagePart part) {
if((part != null) && part.getBindingExtensibilityElementKind() == MessagePart.SOAP_BODY_BINDING)
return true;
return false;
}
/**
* @param part
* @return true if part is bound to SOAPHeader
*/
public static boolean isBoundToSOAPHeader(MessagePart part) {
if((part != null) && part.getBindingExtensibilityElementKind() == MessagePart.SOAP_HEADER_BINDING)
return true;
return false;
}
public static boolean isUnbound(MessagePart part) {
if((part != null) && part.getBindingExtensibilityElementKind() == MessagePart.PART_NOT_BOUNDED)
return true;
return false;
}
}