blob: 4442652c32cc9c5ec6c00a64ee5924f8374bf023 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
package org.apache.axis2.description.java2wsdl;
import org.apache.axiom.om.OMElement;
import org.apache.ws.commons.schema.constants.Constants;
import org.w3c.dom.Document;
import javax.activation.DataHandler;
import javax.xml.datatype.Duration;
import javax.xml.datatype.XMLGregorianCalendar;
import javax.xml.namespace.QName;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.net.URI;
public class TypeTable {
private static HashMap<String,QName> simpleTypetoxsd;
public static final QName ANY_TYPE = new QName(Java2WSDLConstants.URI_2001_SCHEMA_XSD, "anyType", "xs");
private HashMap<String,QName> complexTypeMap;
private HashMap<String , QName> simpleTypeEnum;
/**
* this map is used to keep the class names with the Qnames.
*/
private Map<QName, String> qNameToClassMap;
/**
* Keep simpleType to Java mapping separately so that
* this table does not not populate it over and over.
*/
private static Map<QName, String> qNameToJavaTypeMap;
public TypeTable() {
//complex type table is resetted every time this is
//instantiated
complexTypeMap = new HashMap<String,QName>();
this.qNameToClassMap = new HashMap<QName, String>();
// keep qname of enum
simpleTypeEnum = new HashMap<String , QName>();
}
/* statically populate the simple type map - this is not likely to
* change and we need not populate it over and over */
static{
populateSimpleTypes();
populateJavaTypeMap();
}
/* populate the simpletype hashmap */
private static void populateSimpleTypes() {
simpleTypetoxsd = new HashMap<String,QName>();
//todo pls use the types from org.apache.ws.commons.schema.constants.Constants
simpleTypetoxsd.put("int",
new QName(Java2WSDLConstants.URI_2001_SCHEMA_XSD, "int", "xs"));
simpleTypetoxsd.put("java.lang.String",
new QName(Java2WSDLConstants.URI_2001_SCHEMA_XSD, "string", "xs"));
simpleTypetoxsd.put("boolean",
new QName(Java2WSDLConstants.URI_2001_SCHEMA_XSD, "boolean", "xs"));
simpleTypetoxsd.put("float",
new QName(Java2WSDLConstants.URI_2001_SCHEMA_XSD, "float", "xs"));
simpleTypetoxsd.put("double",
new QName(Java2WSDLConstants.URI_2001_SCHEMA_XSD, "double", "xs"));
simpleTypetoxsd.put("short",
new QName(Java2WSDLConstants.URI_2001_SCHEMA_XSD, "short", "xs"));
simpleTypetoxsd.put("long",
new QName(Java2WSDLConstants.URI_2001_SCHEMA_XSD, "long", "xs"));
simpleTypetoxsd.put("byte",
new QName(Java2WSDLConstants.URI_2001_SCHEMA_XSD, "byte", "xs"));
simpleTypetoxsd.put("char",
new QName(Java2WSDLConstants.URI_2001_SCHEMA_XSD, "unsignedShort", "xs"));
simpleTypetoxsd.put("java.lang.Integer",
new QName(Java2WSDLConstants.URI_2001_SCHEMA_XSD, "int", "xs"));
simpleTypetoxsd.put("java.lang.Double",
new QName(Java2WSDLConstants.URI_2001_SCHEMA_XSD, "double", "xs"));
simpleTypetoxsd.put("java.lang.Float",
new QName(Java2WSDLConstants.URI_2001_SCHEMA_XSD, "float", "xs"));
simpleTypetoxsd.put("java.lang.Long",
new QName(Java2WSDLConstants.URI_2001_SCHEMA_XSD, "long", "xs"));
simpleTypetoxsd.put("java.lang.Character",
ANY_TYPE);
simpleTypetoxsd.put("java.lang.Boolean",
new QName(Java2WSDLConstants.URI_2001_SCHEMA_XSD, "boolean", "xs"));
simpleTypetoxsd.put("java.lang.Byte",
new QName(Java2WSDLConstants.URI_2001_SCHEMA_XSD, "byte", "xs"));
simpleTypetoxsd.put("java.lang.Short",
new QName(Java2WSDLConstants.URI_2001_SCHEMA_XSD, "short", "xs"));
simpleTypetoxsd.put("java.util.Date",
new QName(Java2WSDLConstants.URI_2001_SCHEMA_XSD, "date", "xs"));
simpleTypetoxsd.put("java.util.Calendar",
new QName(Java2WSDLConstants.URI_2001_SCHEMA_XSD, "dateTime", "xs"));
// SQL date time
simpleTypetoxsd.put("java.sql.Date",
new QName(Java2WSDLConstants.URI_2001_SCHEMA_XSD, "date", "xs"));
simpleTypetoxsd.put("java.sql.Time",
new QName(Java2WSDLConstants.URI_2001_SCHEMA_XSD, "time", "xs"));
simpleTypetoxsd.put("java.sql.Timestamp",
new QName(Java2WSDLConstants.URI_2001_SCHEMA_XSD, "dateTime", "xs"));
//consider BigDecimal, BigInteger, Day, Duration, Month, MonthDay,
//Time, Year, YearMonth as SimpleType as well
simpleTypetoxsd.put("java.math.BigDecimal",
new QName(Java2WSDLConstants.URI_2001_SCHEMA_XSD, "decimal", "xs"));
simpleTypetoxsd.put("java.math.BigInteger",
new QName(Java2WSDLConstants.URI_2001_SCHEMA_XSD, "integer", "xs"));
simpleTypetoxsd.put("org.apache.axis2.databinding.types.Day",
new QName(Java2WSDLConstants.URI_2001_SCHEMA_XSD, "gDay", "xs"));
simpleTypetoxsd.put("org.apache.axis2.databinding.types.Duration",
new QName(Java2WSDLConstants.URI_2001_SCHEMA_XSD, "duration", "xs"));
simpleTypetoxsd.put("org.apache.axis2.databinding.types.Month",
new QName(Java2WSDLConstants.URI_2001_SCHEMA_XSD, "gMonth", "xs"));
simpleTypetoxsd.put("org.apache.axis2.databinding.types.MonthDay",
new QName(Java2WSDLConstants.URI_2001_SCHEMA_XSD, "gMonthDay", "xs"));
simpleTypetoxsd.put("org.apache.axis2.databinding.types.Time",
new QName(Java2WSDLConstants.URI_2001_SCHEMA_XSD, "time", "xs"));
simpleTypetoxsd.put("org.apache.axis2.databinding.types.Year",
new QName(Java2WSDLConstants.URI_2001_SCHEMA_XSD, "gYear", "xs"));
simpleTypetoxsd.put("org.apache.axis2.databinding.types.YearMonth",
new QName(Java2WSDLConstants.URI_2001_SCHEMA_XSD, "gYearMonth", "xs"));
simpleTypetoxsd.put("java.lang.Object",ANY_TYPE);
simpleTypetoxsd.put(URI.class.getName(), new QName(Java2WSDLConstants.URI_2001_SCHEMA_XSD, "anyURI", "xs"));
simpleTypetoxsd.put(OMElement.class.getName(),
ANY_TYPE);
simpleTypetoxsd.put(ArrayList.class.getName(),
ANY_TYPE);
simpleTypetoxsd.put(Vector.class.getName(),
ANY_TYPE);
simpleTypetoxsd.put(List.class.getName(),
ANY_TYPE);
simpleTypetoxsd.put(Document.class.getName(), ANY_TYPE);
//byteArrat
simpleTypetoxsd.put("base64Binary",
new QName(Java2WSDLConstants.URI_2001_SCHEMA_XSD, "base64Binary", "xs"));
simpleTypetoxsd.put(XMLGregorianCalendar.class.getName(),
new QName(Java2WSDLConstants.URI_2001_SCHEMA_XSD, "date", "xs"));
}
private static void populateJavaTypeMap(){
/*
* This Table populated according to the JAXB 2.0 XSD2Java binding.
* According to following table http://download.oracle.com/javaee/5/tutorial/doc/bnazq.html#bnazu
*/
qNameToJavaTypeMap = new HashMap<QName, String>();
qNameToJavaTypeMap.put(Constants.XSD_STRING, String.class.getName());
qNameToJavaTypeMap.put(Constants.XSD_INT, Integer.class.getName());
qNameToJavaTypeMap.put(Constants.XSD_INTEGER, BigInteger.class.getName());
qNameToJavaTypeMap.put(Constants.XSD_LONG, Long.class.getName());
qNameToJavaTypeMap.put(Constants.XSD_SHORT, Short.class.getName());
qNameToJavaTypeMap.put(Constants.XSD_DECIMAL, BigDecimal.class.getName());
qNameToJavaTypeMap.put(Constants.XSD_FLOAT, Float.class.getName());
qNameToJavaTypeMap.put(Constants.XSD_DOUBLE, Double.class.getName());
qNameToJavaTypeMap.put(Constants.XSD_BOOLEAN, Boolean.class.getName());
qNameToJavaTypeMap.put(Constants.XSD_BYTE, Byte.class.getName());
qNameToJavaTypeMap.put(Constants.XSD_QNAME, QName.class.getName());
qNameToJavaTypeMap.put(Constants.XSD_UNSIGNEDINT, Long.class.getName());
qNameToJavaTypeMap.put(Constants.XSD_UNSIGNEDSHORT, Integer.class.getName());
qNameToJavaTypeMap.put(Constants.XSD_UNSIGNEDBYTE, Short.class.getName());
qNameToJavaTypeMap.put(Constants.XSD_UNSIGNEDLONG, BigInteger.class.getName());
qNameToJavaTypeMap.put(Constants.XSD_TIME, XMLGregorianCalendar.class.getName());
qNameToJavaTypeMap.put(Constants.XSD_DATE, XMLGregorianCalendar.class.getName());
qNameToJavaTypeMap.put(Constants.XSD_DATETIME, XMLGregorianCalendar.class.getName());
qNameToJavaTypeMap.put(Constants.XSD_DURATION, Duration.class.getName());
qNameToJavaTypeMap.put(Constants.XSD_NOTATION, QName.class.getName());
qNameToJavaTypeMap.put(Constants.XSD_ANYURI, URI.class.getName());
qNameToJavaTypeMap.put(Constants.XSD_ANY, Object.class.getName());
qNameToJavaTypeMap.put(Constants.XSD_ANYSIMPLETYPE, Object.class.getName());
qNameToJavaTypeMap.put(Constants.XSD_ANYTYPE, Object.class.getName());
qNameToJavaTypeMap.put(Constants.XSD_NONNEGATIVEINTEGER, BigInteger.class.getName());
qNameToJavaTypeMap.put(Constants.XSD_NONPOSITIVEINTEGER, BigInteger.class.getName());
qNameToJavaTypeMap.put(Constants.XSD_NEGATIVEINTEGER, Integer.class.getName());
qNameToJavaTypeMap.put(Constants.XSD_POSITIVEINTEGER, Integer.class.getName());
qNameToJavaTypeMap.put(Constants.XSD_NORMALIZEDSTRING,String.class.getName());
qNameToJavaTypeMap.put(Constants.XSD_POSITIVEINTEGER, Integer.class.getName());
qNameToJavaTypeMap.put(Constants.XSD_POSITIVEINTEGER, Integer.class.getName());
qNameToJavaTypeMap.put(Constants.XSD_POSITIVEINTEGER, Integer.class.getName());
qNameToJavaTypeMap.put(Constants.XSD_POSITIVEINTEGER, Integer.class.getName());
qNameToJavaTypeMap.put(Constants.XSD_BASE64, DataHandler.class.getName());
qNameToJavaTypeMap.put(Constants.XSD_HEXBIN, DataHandler.class.getName());
}
/**
* Return the schema type QName given the type class name
* @param typeName the name of the type
* @return the name of the simple type or null if it is not a simple type
*/
public QName getSimpleSchemaTypeName(String typeName) {
QName qName = (QName) simpleTypetoxsd.get(typeName);
if(qName == null){
if((typeName.startsWith("java.lang")||typeName.startsWith("javax.")) &&
!Exception.class.getName().equals(typeName)){
return ANY_TYPE;
}
}
return qName;
}
/**
* Return whether the given type is a simple type or not
* @param typeName the name of the type
* @return true if the type is a simple type
*/
public boolean isSimpleType(String typeName) {
if (simpleTypetoxsd.keySet().contains(typeName)){
return true;
}else if(typeName.startsWith("java.lang")||typeName.startsWith("javax.")){
return true;
}
return false;
}
/**
* Return the complex type map
* @return the map with complex types
*/
public Map<String,QName> getSimpleTypeEnumMap() {
return simpleTypeEnum;
}
public void addSimpleTypeEnum(String className, QName simpleSchemaType) {
simpleTypeEnum.put(className, simpleSchemaType);
}
public QName getSimpleTypeEnum(String className) {
return (QName) simpleTypeEnum.get(className);
}
/**
* Return the complex type map
* @return the map with complex types
*/
public Map<String,QName> getComplexSchemaMap() {
return complexTypeMap;
}
public void addComplexSchema(String name, QName schemaType) {
complexTypeMap.put(name, schemaType);
}
public QName getComplexSchemaType(String name) {
return (QName) complexTypeMap.get(name);
}
/**
* Gets the class name for QName.
* first try the complex types if not try the simple types.
*
* @param qname the qname
* @return the class name for QName
*/
public String getClassNameForQName(QName qname) {
String className = this.qNameToClassMap.get(qname);
if(className == null){
className = qNameToJavaTypeMap.get(qname);
}
return className;
}
public void addClassNameForQName(QName qname, String className) {
this.qNameToClassMap.put(qname, className);
}
/**
* Get the qname for a type
* first try the simple types if not try the complex types
* @param typeName name of the type
* @return the Qname for this type
*/
public QName getQNamefortheType(String typeName) {
QName type = getSimpleSchemaTypeName(typeName);
if (type == null) {
type = getComplexSchemaType(typeName);
}
return type;
}
/**
* Gets the schema type name.
*
* @param name the name
* @return the schema type name
*/
public QName getSchemaTypeName(String name) {
QName qName = getSimpleSchemaTypeName(name);
if (qName == null) {
qName = getSchemaTypeNameByClass(name);
}
if( qName == null){
qName = getComplexSchemaType(name);
}
return qName;
}
/**
* Gets the schema type name by class name. Sometimes it's required perform class
* name mapping to find correct Schema type.
*
* @param name
* the name
* @return the schema type name by class
*/
private QName getSchemaTypeNameByClass(String name) {
/*
* e.g
* XMLGregorianCalendar can be found as following classes.
* 1.)com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl
* 2.)org.apache.xerces.jaxp.datatype.XMLGregorianCalendarImpl
*/
try {
Class thisClass = Class.forName(name);
if(XMLGregorianCalendar.class.isAssignableFrom(thisClass)) {
return (QName) simpleTypetoxsd.get(XMLGregorianCalendar.class
.getName());
} else if(Calendar.class.isAssignableFrom(thisClass)) {
return (QName) simpleTypetoxsd.get(Calendar.class
.getName());
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
}