blob: c7f965e59a2f7043fd410375648d7944ed824ff7 [file] [log] [blame]
/*
* Copyright 2003-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @author Srinath Perera(hemapani@openource.lk)
* @author Susantha Kumara(susantha@opensource.lk, skumara@virtusa.com)
* @author Sanjaya Singharage (sanjayas@opensource.lk, sanjayas@jkcsworld.com)
*/
package org.apache.axis.wsdl.wsdl2ws;
import java.util.Hashtable;
import javax.xml.namespace.QName;
import java.util.Vector;
import org.w3c.dom.Node;
import org.apache.axis.wsdl.symbolTable.SymbolTable;
import org.apache.axis.wsdl.toJava.Utils;
import org.apache.axis.Constants;
import org.w3c.dom.NodeList;
import org.apache.axis.wsdl.symbolTable.TypeEntry;
import javax.xml.rpc.holders.BooleanHolder;
import org.apache.axis.wsdl.symbolTable.SchemaUtils;
import org.apache.axis.wsdl.wsdl2ws.info.TypeMap;
public class CUtils {
public static final String WRAPPER_NAME_APPENDER = "Wrapper";
public static final String CLASS_LOADER_APPENDER = "Service";
public static final String WRAPPER_METHOD_APPENDER = "Wrapped";
public static final QName anyTypeQname = new QName("http://ws.apache.org/axisc/types","AnyType");
/* This type mapping only maps simple types the mapping for
complex types are done with in the type class */
private static Hashtable class2QNamemap = new Hashtable();
private static Hashtable qname2classmap = new Hashtable();
private static Hashtable schemaDefinedSimpleTypesMap = new Hashtable();
private static Hashtable type2getValueMethodName = new Hashtable();
private static Hashtable type2BasicArrayName = new Hashtable();
private static Hashtable basicType2EnumMap = new Hashtable();
static{
class2QNamemap.put("int", new QName(WrapperConstants.SCHEMA_NAMESPACE, "int"));
class2QNamemap.put("unsigned char", new QName(WrapperConstants.SCHEMA_NAMESPACE, "byte"));
class2QNamemap.put("float", new QName(WrapperConstants.SCHEMA_NAMESPACE, "float"));
class2QNamemap.put("long", new QName(WrapperConstants.SCHEMA_NAMESPACE, "long"));
class2QNamemap.put("long", new QName(WrapperConstants.SCHEMA_NAMESPACE, "integer"));
class2QNamemap.put("double", new QName(WrapperConstants.SCHEMA_NAMESPACE, "double"));
class2QNamemap.put("char", new QName(WrapperConstants.SCHEMA_NAMESPACE, "char"));
class2QNamemap.put("short", new QName(WrapperConstants.SCHEMA_NAMESPACE, "short"));
class2QNamemap.put("xsd__string", new QName(WrapperConstants.SCHEMA_NAMESPACE, "string"));
class2QNamemap.put("xsd__dateTime", new QName(WrapperConstants.SCHEMA_NAMESPACE, "dateTime"));
class2QNamemap.put("xsd__date", new QName(WrapperConstants.SCHEMA_NAMESPACE, "date"));
class2QNamemap.put("xsd__time", new QName(WrapperConstants.SCHEMA_NAMESPACE, "time"));
class2QNamemap.put("xsd__base64Binary", new QName(WrapperConstants.SCHEMA_NAMESPACE, "base64Binary"));
class2QNamemap.put("xsd__hexBinary", new QName(WrapperConstants.SCHEMA_NAMESPACE, "hexBinary"));
class2QNamemap.put("xsd__decimal", new QName(WrapperConstants.SCHEMA_NAMESPACE, "decimal"));
class2QNamemap.put("xsd__boolean", new QName(WrapperConstants.SCHEMA_NAMESPACE, "boolean"));
class2QNamemap.put("xsd__anyURI", new QName(WrapperConstants.SCHEMA_NAMESPACE, "anyURI"));
class2QNamemap.put("xsd__unsignedByte", new QName(WrapperConstants.SCHEMA_NAMESPACE, "unsignedByte"));
class2QNamemap.put("xsd__unsignedInt", new QName(WrapperConstants.SCHEMA_NAMESPACE, "unsignedInt"));
class2QNamemap.put("xsd__unsignedLong", new QName(WrapperConstants.SCHEMA_NAMESPACE, "unsignedLong"));
class2QNamemap.put("xsd__unsignedShort", new QName(WrapperConstants.SCHEMA_NAMESPACE, "unsignedShort"));
class2QNamemap.put("xsd__QName", new QName(WrapperConstants.SCHEMA_NAMESPACE, "QName"));
class2QNamemap.put("xsd__NMTOKEN", new QName(WrapperConstants.SCHEMA_NAMESPACE,"NMTOKEN"));
qname2classmap.put(new QName(WrapperConstants.SCHEMA_NAMESPACE, "int"), "int");
qname2classmap.put(new QName(WrapperConstants.SCHEMA_NAMESPACE, "byte"), "unsigned char");
qname2classmap.put(new QName(WrapperConstants.SCHEMA_NAMESPACE, "float"), "float");
qname2classmap.put(new QName(WrapperConstants.SCHEMA_NAMESPACE, "long"), "long");
qname2classmap.put(new QName(WrapperConstants.SCHEMA_NAMESPACE, "integer"), "long");
qname2classmap.put(new QName(WrapperConstants.SCHEMA_NAMESPACE, "double"), "double");
qname2classmap.put(new QName(WrapperConstants.SCHEMA_NAMESPACE, "char"), "char");
qname2classmap.put(new QName(WrapperConstants.SCHEMA_NAMESPACE, "short"), "short");
qname2classmap.put(new QName(WrapperConstants.SCHEMA_NAMESPACE, "string"), "xsd__string");
qname2classmap.put(new QName(WrapperConstants.SCHEMA_NAMESPACE, "dateTime"), "xsd__dateTime");
qname2classmap.put(new QName(WrapperConstants.SCHEMA_NAMESPACE, "date"), "xsd__date");
qname2classmap.put(new QName(WrapperConstants.SCHEMA_NAMESPACE, "time"), "xsd__time");
qname2classmap.put(new QName(WrapperConstants.SCHEMA_NAMESPACE, "base64Binary"), "xsd__base64Binary");
qname2classmap.put(new QName(WrapperConstants.SCHEMA_NAMESPACE, "hexBinary"), "xsd__hexBinary");
qname2classmap.put(new QName(WrapperConstants.SCHEMA_NAMESPACE, "decimal"), "xsd__decimal");
qname2classmap.put(new QName(WrapperConstants.SCHEMA_NAMESPACE, "boolean"), "xsd__boolean");
qname2classmap.put(new QName(WrapperConstants.SCHEMA_NAMESPACE, "anyURI"), "xsd__anyURI");
qname2classmap.put(new QName(WrapperConstants.SCHEMA_NAMESPACE, "unsignedByte"), "xsd__unsignedByte");
qname2classmap.put(new QName(WrapperConstants.SCHEMA_NAMESPACE, "unsignedInt"), "xsd__unsignedInt");
qname2classmap.put(new QName(WrapperConstants.SCHEMA_NAMESPACE, "unsignedLong"), "xsd__unsignedLong");
qname2classmap.put(new QName(WrapperConstants.SCHEMA_NAMESPACE, "unsignedShort"), "xsd__unsignedShort");
qname2classmap.put(new QName(WrapperConstants.SCHEMA_NAMESPACE, "QName"), "xsd__QName");
qname2classmap.put(new QName(WrapperConstants.SCHEMA_NAMESPACE, "NMTOKEN"), "xsd__NMTOKEN");
/* TODO:
* Should be removed when the following issue will be fixed :
* -> http://marc.theaimsgroup.com/?t=107907748000002&r=1&w=2
*/
qname2classmap.put(new QName(WrapperConstants.SOAPENC_NAMESPACE, "int"), "int");
qname2classmap.put(new QName(WrapperConstants.SOAPENC_NAMESPACE, "byte"), "unsigned char");
qname2classmap.put(new QName(WrapperConstants.SOAPENC_NAMESPACE, "float"), "float");
qname2classmap.put(new QName(WrapperConstants.SOAPENC_NAMESPACE, "long"), "long");
qname2classmap.put(new QName(WrapperConstants.SOAPENC_NAMESPACE, "integer"), "long");
qname2classmap.put(new QName(WrapperConstants.SOAPENC_NAMESPACE, "double"), "double");
qname2classmap.put(new QName(WrapperConstants.SOAPENC_NAMESPACE, "char"), "char");
qname2classmap.put(new QName(WrapperConstants.SOAPENC_NAMESPACE, "short"), "short");
qname2classmap.put(new QName(WrapperConstants.SOAPENC_NAMESPACE, "string"), "xsd__string");
qname2classmap.put(new QName(WrapperConstants.SOAPENC_NAMESPACE, "dateTime"), "xsd__dateTime");
qname2classmap.put(new QName(WrapperConstants.SOAPENC_NAMESPACE, "date"), "xsd__date");
qname2classmap.put(new QName(WrapperConstants.SOAPENC_NAMESPACE, "time"), "xsd__time");
qname2classmap.put(new QName(WrapperConstants.SOAPENC_NAMESPACE, "base64Binary"), "xsd__base64Binary");
qname2classmap.put(new QName(WrapperConstants.SOAPENC_NAMESPACE, "hexBinary"), "xsd__hexBinary");
qname2classmap.put(new QName(WrapperConstants.SOAPENC_NAMESPACE, "decimal"), "xsd__decimal");
qname2classmap.put(new QName(WrapperConstants.SOAPENC_NAMESPACE, "boolean"), "xsd__boolean");
qname2classmap.put(new QName(WrapperConstants.SOAPENC_NAMESPACE, "anyURI"), "xsd__anyURI");
qname2classmap.put(new QName(WrapperConstants.SOAPENC_NAMESPACE, "unsignedByte"), "xsd__unsignedByte");
qname2classmap.put(new QName(WrapperConstants.SOAPENC_NAMESPACE, "unsignedInt"), "xsd__unsignedInt");
qname2classmap.put(new QName(WrapperConstants.SOAPENC_NAMESPACE, "unsignedLong"), "xsd__unsignedLong");
qname2classmap.put(new QName(WrapperConstants.SOAPENC_NAMESPACE, "unsignedShort"), "xsd__unsignedShort");
qname2classmap.put(new QName(WrapperConstants.SOAPENC_NAMESPACE, "QName"), "xsd__QName");
/* TODO:
* Another strange issue from Axis 1.1 runtime when base64binary is in input/output operations.
*/
qname2classmap.put(new QName(WrapperConstants.SOAPENC_NAMESPACE, "base64"), "xsd__base64Binary");
type2getValueMethodName.put("int","Int");
type2getValueMethodName.put("float","Float");
type2getValueMethodName.put("xsd__string","String");
type2getValueMethodName.put("long","Long");
type2getValueMethodName.put("short","Short");
type2getValueMethodName.put("char","Char");
type2getValueMethodName.put("double","Double");
type2getValueMethodName.put("unsigned char","Byte");
type2getValueMethodName.put("xsd__unsignedLong","UnsignedLong");
type2getValueMethodName.put("xsd__unsignedInt","UnsignedInt");
type2getValueMethodName.put("xsd__unsignedShort","UnsignedShort");
type2getValueMethodName.put("xsd__unsignedByte","UnsignedChar");
type2getValueMethodName.put("xsd__dateTime","DateTime");
type2getValueMethodName.put("xsd__date","Date");
type2getValueMethodName.put("xsd__time","Time");
type2getValueMethodName.put("xsd__base64Binary","Base64Binary");
type2getValueMethodName.put("xsd__hexBinary","HexBinary");
type2getValueMethodName.put("xsd__decimal","Decimal");
type2getValueMethodName.put("xsd__boolean","Boolean");
type2getValueMethodName.put("xsd__anyURI","String");
type2getValueMethodName.put("xsd__QName","String");
type2getValueMethodName.put("xsd__NMTOKEN","String");
type2BasicArrayName.put("int","xsd__int_Array");
type2BasicArrayName.put("float","xsd__float_Array");
type2BasicArrayName.put("xsd__string","xsd__string_Array");
type2BasicArrayName.put("long","xsd__long_Array");
type2BasicArrayName.put("short","xsd__short_Array");
type2BasicArrayName.put("char","xsd__byte_Array");
type2BasicArrayName.put("double","xsd__double_Array");
type2BasicArrayName.put("xsd__unsignedLong","xsd__unsignedLong_Array");
type2BasicArrayName.put("xsd__unsignedInt","xsd__unsignedInt_Array");
type2BasicArrayName.put("xsd__unsignedShort","xsd__unsignedShort_Array");
type2BasicArrayName.put("xsd__unsignedByte","xsd__unsignedByte_Array");
type2BasicArrayName.put("xsd__dateTime","xsd__dateTime_Array");
type2BasicArrayName.put("xsd__date","xsd__date_Array");
type2BasicArrayName.put("xsd__time","xsd__time_Array");
type2BasicArrayName.put("xsd__base64Binary","xsd__base64Binary_Array");
type2BasicArrayName.put("xsd__hexBinary","xsd__hexBinary_Array");
type2BasicArrayName.put("xsd__decimal","xsd__decimal_Array");
type2BasicArrayName.put("xsd__boolean","xsd__boolean_Array");
type2BasicArrayName.put("xsd__anyURI","xsd__anyURI_Array");
type2BasicArrayName.put("xsd__QName","xsd__QName_Array");
type2BasicArrayName.put("xsd__NMTOKEN","xsd__NMTOKEN_Array");
basicType2EnumMap.put("int","XSD_INT");
basicType2EnumMap.put("float","XSD_FLOAT");
basicType2EnumMap.put("xsd__string","XSD_STRING");
basicType2EnumMap.put("long","XSD_LONG");
basicType2EnumMap.put("short","XSD_SHORT");
basicType2EnumMap.put("unsigned char","XSD_BYTE");
basicType2EnumMap.put("double","XSD_DOUBLE");
basicType2EnumMap.put("xsd__unsignedLong","XSD_UNSIGNEDLONG");
basicType2EnumMap.put("xsd__unsignedInt","XSD_UNSIGNEDINT");
basicType2EnumMap.put("xsd__unsignedShort","XSD_UNSIGNEDSHORT");
basicType2EnumMap.put("xsd__unsignedByte","XSD_UNSIGNEDBYTE");
basicType2EnumMap.put("xsd__dateTime","XSD_DATETIME");
basicType2EnumMap.put("xsd__date","XSD_DATE");
basicType2EnumMap.put("xsd__time","XSD_TIME");
basicType2EnumMap.put("xsd__base64Binary","XSD_BASE64BINARY");
basicType2EnumMap.put("xsd__hexBinary","XSD_HEXBINARY");
basicType2EnumMap.put("xsd__decimal","XSD_DECIMAL");
basicType2EnumMap.put("xsd__boolean","XSD_BOOLEAN");
basicType2EnumMap.put("xsd__anyURI","XSD_ANYURI");
basicType2EnumMap.put("xsd__QName","XSD_QNAME");
basicType2EnumMap.put("xsd__NMTOKEN","XSD_NMTOKEN");
}
public static void addSchemaDefinedSimpleType(QName qname, String type){
schemaDefinedSimpleTypesMap.put(qname, type);
}
public static boolean isBasicType(QName qname){
if(qname2classmap.containsKey(qname)){
return true;
}
return false;
}
public static boolean isSimpleType(String name){
if(class2QNamemap.containsKey(name))
return true;
return false;
}
public static boolean isAnyType(QName name){
return name.equals(anyTypeQname);
}
public static boolean isSimpleType(QName name){
if(qname2classmap.containsKey(name)){
return true;
}
else if (schemaDefinedSimpleTypesMap.containsKey(name)){
return true;
}
return false;
}
public static boolean isDefinedSimpleType(QName name){
return schemaDefinedSimpleTypesMap.containsKey(name);
}
public static String getParameterGetValueMethodName(String typeName, boolean isAttrib){
String methodname;
if((methodname = (String)type2getValueMethodName.get(typeName))!= null){
methodname = (isAttrib ? "getAttributeAs":"getElementAs") + methodname;
return methodname;
}
return null;
}
public static QName getQname4class(String classname) {
Object val = class2QNamemap.get(classname);
if (val != null)
return (QName) val;
else
return null;
}
public static String getclass4qname(QName qname) {
Object val = qname2classmap.get(qname);
if (val != null)
return (String) val;
val = schemaDefinedSimpleTypesMap.get(qname);
if (val != null)
return (String) val;
return null;
}
public static String getWebServiceNameFromWrapperName(String wname){
return wname.substring(0, wname.length()- CUtils.WRAPPER_NAME_APPENDER.length());
}
public static String getXSDTypeForBasicType(String stype){
String enumName;
if((enumName = (String)basicType2EnumMap.get(stype))!= null){
return enumName;
}
return null;
}
public static String getCmplxArrayNameforType(QName qname){
String arrayName = null;
if(!qname2classmap.containsKey(qname)){
/* arrayName = qname.getLocalPart()+"_Array";
* This avoid compilation issue for wsdl SimpleTypeInnerUnboundedInOutput.wsdl
* See : malling list.
*/
arrayName = qname.getLocalPart().replace('>','_')+"_Array";
}
return arrayName;
}
public static String getBasicArrayNameforType(String stype){
if (type2BasicArrayName.containsKey(stype))
return (String)type2BasicArrayName.get(stype);
else
return "";
}
/**
* If the specified node represents a supported JAX-RPC restriction,
* a Vector is returned which contains the base type and the values (enumerations etc).
* The first element in the vector is the base type (an TypeEntry).
* Subsequent elements are QNames.
*/
public static Vector getRestrictionBaseAndValues(Node node, SymbolTable symbolTable) {
if (node == null) {
return null;
}
// If the node kind is an element, dive into it.
QName nodeKind = Utils.getNodeQName(node);
if (nodeKind != null &&
nodeKind.getLocalPart().equals("element") &&
Constants.isSchemaXSD(nodeKind.getNamespaceURI())) {
NodeList children = node.getChildNodes();
Node simpleNode = null;
for (int j = 0; j < children.getLength() && simpleNode == null; j++) {
QName simpleKind = Utils.getNodeQName(children.item(j));
if (simpleKind != null &&
simpleKind.getLocalPart().equals("simpleType") &&
Constants.isSchemaXSD(simpleKind.getNamespaceURI())) {
simpleNode = children.item(j);
node = simpleNode;
}
}
}
// Get the node kind, expecting a schema simpleType
nodeKind = Utils.getNodeQName(node);
if (nodeKind != null &&
nodeKind.getLocalPart().equals("simpleType") &&
Constants.isSchemaXSD(nodeKind.getNamespaceURI())) {
// Under the simpleType there should be a restriction.
// (There may be other #text nodes, which we will ignore).
NodeList children = node.getChildNodes();
Node restrictionNode = null;
for (int j = 0; j < children.getLength() && restrictionNode == null; j++) {
QName restrictionKind = Utils.getNodeQName(children.item(j));
if (restrictionKind != null &&
restrictionKind.getLocalPart().equals("restriction") &&
Constants.isSchemaXSD(restrictionKind.getNamespaceURI()))
restrictionNode = children.item(j);
}
// The restriction node indicates the type being restricted
// (the base attribute contains this type).
// The base type must be a simple type, and not boolean
TypeEntry baseEType = null;
if (restrictionNode != null) {
QName baseType = Utils.getTypeQName(restrictionNode, new BooleanHolder(), false);
baseEType = symbolTable.getType(baseType);
if (baseEType != null) {
String javaName = TypeMap.getBasicTypeClass4qname(baseEType.getQName());
//String javaName = baseEType.getName();
if (javaName.equals("boolean") ||
! SchemaUtils.isSimpleSchemaType(baseEType.getQName())) {
baseEType = null;
}
}
}
// Process the enumeration elements underneath the restriction node
if (baseEType != null && restrictionNode != null) {
Vector v = new Vector();
NodeList enums = restrictionNode.getChildNodes();
for (int i=0; i < enums.getLength(); i++) {
QName enumKind = Utils.getNodeQName(enums.item(i));
if (enumKind != null &&
/*enumKind.getLocalPart().equals("enumeration") && lets put all not only enumerations */
Constants.isSchemaXSD(enumKind.getNamespaceURI())) {
Node enumNode = enums.item(i);
String value = Utils.getAttribute(enumNode, "value");
/*if (value != null) {
v.add(value);
}*/
v.add(new QName(value, enumKind.getLocalPart()));
}
}
// is this really an enumeration?
/* if(v.isEmpty()) return null; There can be restriction without any child nodes */
// The first element in the vector is the base type (an TypeEntry).
v.add(0,baseEType);
return v;
}
}
return null;
}
}