| /* |
| * 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.databinding.typemapping; |
| |
| import org.apache.axiom.attachments.ByteArrayDataSource; |
| import org.apache.axiom.om.OMElement; |
| import org.apache.axiom.om.OMNode; |
| import org.apache.axiom.om.OMText; |
| import org.apache.axiom.util.base64.Base64Utils; |
| import org.apache.axis2.databinding.types.HexBinary; |
| import org.apache.axis2.databinding.utils.ConverterUtil; |
| import org.apache.axis2.context.MessageContext; |
| import org.apache.axis2.description.AxisService; |
| import org.w3c.dom.Document; |
| |
| import javax.activation.DataHandler; |
| import javax.xml.datatype.XMLGregorianCalendar; |
| import javax.xml.namespace.QName; |
| |
| import java.text.DateFormat; |
| import java.text.SimpleDateFormat; |
| import java.util.*; |
| import java.net.URI; |
| import java.net.URISyntaxException; |
| |
| public class SimpleTypeMapper { |
| |
| private static final String STRING = "java.lang.String"; |
| private static final String W_INT = "java.lang.Integer"; |
| private static final String W_DOUBLE = "java.lang.Double"; |
| private static final String W_LONG = "java.lang.Long"; |
| private static final String W_BYTE = "java.lang.Byte"; |
| private static final String W_SHORT = "java.lang.Short"; |
| private static final String W_BOOLEAN = "java.lang.Boolean"; |
| private static final String W_CHAR = "java.lang.Character"; |
| private static final String W_FLOAT = "java.lang.Float"; |
| private static final String W_CALENDAR = "java.util.Calendar"; |
| private static final String W_DATE = "java.util.Date"; |
| private static final String W_SQL_DATE = "java.sql.Date"; |
| private static final String W_URI = URI.class.getName(); |
| private static final String INT = "int"; |
| private static final String BOOLEAN = "boolean"; |
| private static final String BYTE = "byte"; |
| private static final String DOUBLE = "double"; |
| private static final String SHORT = "short"; |
| private static final String LONG = "long"; |
| private static final String FLOAT = "float"; |
| private static final String CHAR = "char"; |
| |
| /* |
| * To support deserialize BigDecimal, BigInteger |
| * Day, Duration, Month, MonthDay, Time, Year, YearMonth |
| */ |
| private static final String BIG_DECIMAL = "java.math.BigDecimal"; |
| private static final String BIG_INTEGER = "java.math.BigInteger"; |
| private static final String DAY = "org.apache.axis2.databinding.types.Day"; |
| private static final String DURATION = "org.apache.axis2.databinding.types.Duration"; |
| private static final String MONTH = "org.apache.axis2.databinding.types.Month"; |
| private static final String MONTH_DAY = "org.apache.axis2.databinding.types.MonthDay"; |
| private static final String TIME = "org.apache.axis2.databinding.types.Time"; |
| private static final String YEAR = "org.apache.axis2.databinding.types.Year"; |
| private static final String YEAR_MONTH = "org.apache.axis2.databinding.types.YearMonth"; |
| |
| private static final String SQL_DATE_FORMAT = "yyyy-MM-dd"; |
| |
| public static Object getSimpleTypeObject(Class parameter, String text) { |
| String name = parameter.getName(); |
| |
| if(name.equals(STRING)) { |
| return text; |
| } else if (text == null || text.length() == 0) { |
| return null; |
| } else if (name.equals(INT)) { |
| return new Integer(text); |
| } else if (name.equals(BOOLEAN)) { |
| return ConverterUtil.convertToBoolean(text); |
| } else if (name.equals(BYTE)) { |
| return new Byte(text); |
| } else if (name.equals(DOUBLE)) { |
| return new Double(text); |
| } else if (name.equals(SHORT)) { |
| return new Short(text); |
| } else if (name.equals(LONG)) { |
| return new Long(text); |
| } else if (name.equals(FLOAT)) { |
| return new Float(text); |
| } else if (name.equals(CHAR)) { |
| return text.toCharArray()[0]; |
| } else if (name.equals(W_INT)) { |
| return new Integer(text); |
| } else if (name.equals(W_BOOLEAN)) { |
| return Boolean.valueOf(text); |
| } else if (name.equals(W_BYTE)) { |
| return new Byte(text); |
| } else if (name.equals(W_DOUBLE)) { |
| return new Double(text); |
| } else if (name.equals(W_SHORT)) { |
| return new Short(text); |
| } else if (name.equals(W_LONG)) { |
| return new Long(text); |
| } else if (name.equals(W_FLOAT)) { |
| return new Float(text); |
| } else if (name.equals(W_CHAR)) { |
| return text.toCharArray()[0]; |
| } else if (name.equals(W_CALENDAR)) { |
| return makeCalendar(text); |
| } else if (name.equals(W_DATE)) { |
| return makeDate(text); |
| } else if(name.equals(W_SQL_DATE)) { |
| java.util.Date utilDate = (java.util.Date)makeDate(text); |
| DateFormat sqlDateFormatter = new SimpleDateFormat(SQL_DATE_FORMAT); |
| return java.sql.Date.valueOf(sqlDateFormatter.format(utilDate)); |
| } |
| /* |
| * return the correpsonding object for adding data type |
| */ |
| else if(name.equals(BIG_DECIMAL)) { |
| return new java.math.BigDecimal(text); |
| } |
| else if(name.equals(BIG_INTEGER)) { |
| return new java.math.BigInteger(text); |
| } |
| else if(name.equals(DAY)) { |
| return new org.apache.axis2.databinding.types.Day(text); |
| } |
| else if(name.equals(DURATION)) { |
| return new org.apache.axis2.databinding.types.Duration(text); |
| } |
| else if(name.equals(MONTH)) { |
| return new org.apache.axis2.databinding.types.Month(text); |
| } |
| else if(name.equals(MONTH_DAY)) { |
| return new org.apache.axis2.databinding.types.MonthDay(text); |
| } |
| else if(name.equals(TIME)) { |
| return new org.apache.axis2.databinding.types.Time(text); |
| } |
| else if(name.equals(YEAR)) { |
| return new org.apache.axis2.databinding.types.Year(text); |
| } |
| else if(name.equals(YEAR_MONTH)) { |
| return new org.apache.axis2.databinding.types.YearMonth(text); |
| } else if(name.equals(W_URI)) { |
| try { |
| return new URI(text); |
| } catch (URISyntaxException e) { |
| throw new RuntimeException(" Invalid URI " + text, e); |
| } |
| } else { |
| return null; |
| } |
| } |
| |
| public static Object getSimpleTypeObject(Class parameter, OMElement value) { |
| return getSimpleTypeObject(parameter, value.getText()); |
| } |
| |
| public static ArrayList getArrayList(OMElement element, String localName) { |
| Iterator<OMElement> childitr = element.getChildrenWithName(new QName(localName)); |
| ArrayList list = new ArrayList(); |
| while (childitr.hasNext()) { |
| Object o = childitr.next(); |
| list.add(o); |
| } |
| return list; |
| } |
| |
| public static HashSet getHashSet(OMElement element, String localName) { |
| Iterator<OMElement> childitr = element.getChildrenWithName(new QName(localName)); |
| final HashSet list = new HashSet(); |
| while (childitr.hasNext()) { |
| OMElement o = childitr.next(); |
| list.add(o.getText()); |
| } |
| return list; |
| } |
| |
| |
| |
| public static DataHandler getDataHandler(OMElement element) { |
| OMNode node = element.getFirstOMChild(); |
| if (node instanceof OMText) { |
| OMText txt = (OMText)node; |
| if (txt.isOptimized()) { |
| return (DataHandler)txt.getDataHandler(); |
| } else { |
| return new DataHandler(new ByteArrayDataSource(Base64Utils.decode(txt.getText()))); |
| } |
| } |
| return null; |
| } |
| |
| /** |
| * Gets the DataHandler according to hexBin value. |
| * |
| * @param element the element |
| * @param hexBin the hex bin |
| * @return the DataHandler object |
| */ |
| public static DataHandler getDataHandler(OMElement element, boolean hexBin) { |
| if(hexBin){ |
| ByteArrayDataSource byteArrayDataSource = new ByteArrayDataSource( |
| HexBinary.decode(element.getText())); |
| return new DataHandler(byteArrayDataSource); |
| } |
| return getDataHandler(element); |
| } |
| |
| |
| public static ArrayList getArrayList(OMElement element) { |
| Iterator childitr = element.getChildren(); |
| ArrayList list = new ArrayList(); |
| while (childitr.hasNext()) { |
| Object o = childitr.next(); |
| list.add(o); |
| } |
| return list; |
| } |
| |
| public static boolean isSimpleType(Object obj) { |
| if(obj == null){ |
| return false; |
| } |
| String objClassName = obj.getClass().getName(); |
| return obj instanceof Calendar || obj instanceof Date || obj instanceof XMLGregorianCalendar || isSimpleType(objClassName); |
| } |
| |
| public static boolean isSimpleType(Class obj) { |
| String objClassName = obj.getName(); |
| return isSimpleType(objClassName); |
| } |
| |
| public static boolean isDataHandler(Class obj) { |
| return obj.isAssignableFrom(DataHandler.class) && !obj.equals(Object.class); |
| } |
| |
| public static boolean isHashSet(Class obj) { |
| return java.util.HashSet.class.isAssignableFrom(obj); |
| } |
| |
| |
| public static boolean isCollection(Class obj) { |
| return java.util.Collection.class.isAssignableFrom(obj); |
| } |
| |
| public static boolean isSimpleType(String objClassName) { |
| if (objClassName.equals(STRING)) { |
| return true; |
| } else if (objClassName.equals(INT)) { |
| return true; |
| } else if (objClassName.equals(BOOLEAN)) { |
| return true; |
| } else if (objClassName.equals(BYTE)) { |
| return true; |
| } else if (objClassName.equals(DOUBLE)) { |
| return true; |
| } else if (objClassName.equals(SHORT)) { |
| return true; |
| } else if (objClassName.equals(LONG)) { |
| return true; |
| } else if (objClassName.equals(FLOAT)) { |
| return true; |
| } else if (objClassName.equals(CHAR)) { |
| return true; |
| } else if (objClassName.equals(W_INT)) { |
| return true; |
| } else if (objClassName.equals(W_BOOLEAN)) { |
| return true; |
| } else if (objClassName.equals(W_BYTE)) { |
| return true; |
| } else if (objClassName.equals(W_DOUBLE)) { |
| return true; |
| } else if (objClassName.equals(W_SHORT)) { |
| return true; |
| } else if (objClassName.equals(W_LONG)) { |
| return true; |
| } else if (objClassName.equals(W_FLOAT)) { |
| return true; |
| } else if (objClassName.equals(W_CALENDAR)) { |
| return true; |
| } else if (objClassName.equals(W_DATE)) { |
| return true; |
| } else if (objClassName.equals(W_SQL_DATE)) { |
| return true; |
| } else if (objClassName.equals(W_URI)) { |
| return true; |
| } |
| |
| |
| /* |
| * consider BigDecimal, BigInteger, Day, Duration, Month |
| * MonthDay, Time, Year, YearMonth as simple type |
| */ |
| else return objClassName.equals(BIG_DECIMAL) |
| || objClassName.equals(BIG_INTEGER) |
| || objClassName.equals(DAY) |
| || objClassName.equals(DURATION) |
| || objClassName.equals(MONTH) |
| || objClassName.equals(MONTH_DAY) |
| || objClassName.equals(TIME) |
| || objClassName.equals(YEAR) |
| || objClassName.equals(YEAR_MONTH) || objClassName.equals(W_CHAR); |
| } |
| |
| public static String getStringValue(Object obj) { |
| if (obj instanceof Float || |
| obj instanceof Double) { |
| double data; |
| if (obj instanceof Float) { |
| data = ((Float)obj).doubleValue(); |
| } else { |
| data = (Double)obj; |
| } |
| if (Double.isNaN(data)) { |
| return "NaN"; |
| } else if (data == Double.POSITIVE_INFINITY) { |
| return "INF"; |
| } else if (data == Double.NEGATIVE_INFINITY) { |
| return "-INF"; |
| } else { |
| return obj.toString(); |
| } |
| } else if (obj instanceof Calendar) { |
| Calendar calendar = (Calendar) obj; |
| return ConverterUtil.convertToString(calendar); |
| } else if (obj instanceof Date) { |
| SimpleDateFormat zulu = new SimpleDateFormat("yyyy-MM-dd"); |
| |
| MessageContext messageContext = MessageContext.getCurrentMessageContext(); |
| if (messageContext != null) { |
| AxisService axisServce = messageContext.getAxisService(); |
| // if the user has given a pirticualr timezone we use it. |
| if (axisServce.getParameter("TimeZone") != null) { |
| zulu.setTimeZone(TimeZone.getTimeZone((String) axisServce.getParameter("TimeZone").getValue())); |
| } |
| } |
| return zulu.format(obj); |
| } else if (obj instanceof URI){ |
| return obj.toString(); |
| } |
| return obj.toString(); |
| } |
| |
| public static Object makeCalendar(String source) { |
| return ConverterUtil.convertToDateTime(source); |
| } |
| |
| public static Object makeDate(String source) { |
| return ConverterUtil.convertToDate(source); |
| } |
| |
| |
| /** |
| * Checks weather passed parameter class is java.lang.Object[] or not. |
| * |
| * @param obj the Class type of particular object. |
| * @return true, if is object array |
| */ |
| public static boolean isObjectArray(Class obj) { |
| if (obj != null |
| && obj.getComponentType() != null |
| && obj.getComponentType().getName() |
| .equals(Object.class.getName())) { |
| return true; |
| } |
| return false; |
| } |
| |
| /** |
| * Checks weather passed parameter class is java.lang.Object or not. |
| * |
| * @param obj the Class type of particular object. |
| * @return true, if is object type |
| */ |
| public static boolean isObjectType(Class obj) { |
| if (obj.getName().equals(Object.class.getName())) { |
| return true; |
| } |
| return false; |
| } |
| |
| /** |
| * Checks that given classType is a W3C Document. |
| * |
| * @param classType |
| * the class type |
| * @return true, if is dom document |
| */ |
| public static boolean isDomDocument(Class classType) { |
| return Document.class.isAssignableFrom(classType); |
| } |
| |
| /** |
| * Checks weather passed parameter class is a java.util.Map |
| * |
| * @param classType the class type |
| * @return true, if it is a map |
| */ |
| public static boolean isMap(Class classType){ |
| return java.util.Map.class.isAssignableFrom(classType); |
| } |
| |
| /** |
| * Checks weather passed parameter class is a multidimensional object array. |
| * |
| * @param type the type |
| * @return true, if is multidimensional object array |
| */ |
| public static boolean isMultidimensionalObjectArray(Class type) { |
| Class compType = type.getComponentType(); |
| if (compType == null) { |
| return false; |
| } else if (isObjectArray(compType)) { |
| return true; |
| } else { |
| return isMultidimensionalObjectArray(compType); |
| } |
| } |
| |
| /*check weather passed parameter class is a java.lang.Enum |
| * |
| * @param classType the class type |
| * @return true , if it is an Enum |
| * */ |
| |
| public static boolean isEnum(Class classType) { |
| return java.lang.Enum.class.isAssignableFrom(classType); |
| } |
| } |