/* * 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; } }