You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by "Matthias Weiler (JIRA)" <ji...@apache.org> on 2006/09/26 10:55:50 UTC

[jira] Commented: (AXIS2-1211) Mapping a value of type xs:dateTime to null

    [ http://issues.apache.org/jira/browse/AXIS2-1211?page=comments#action_12437771 ] 
            
Matthias Weiler commented on AXIS2-1211:
----------------------------------------

The checked in fix is OK. But I can't test it against the current nightly build, because there is a problem with duplicate port names in the wsdl for my service. 


> Mapping a value of type xs:dateTime to null
> -------------------------------------------
>
>                 Key: AXIS2-1211
>                 URL: http://issues.apache.org/jira/browse/AXIS2-1211
>             Project: Apache Axis 2.0 (Axis2)
>          Issue Type: Bug
>          Components: databinding
>    Affects Versions: 1.1
>            Reporter: Matthias Weiler
>            Priority: Critical
>         Attachments: SimpleTypeMapper.java
>
>
> There is no mapping for "java.util.Date" in SimpleTypeMapper.
> A quick fix is attached here:
> /*
> * Copyright 2004,2005 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.
> *
> */
> package org.apache.axis2.databinding.typemapping;
> import org.apache.axiom.om.OMElement;
> import javax.xml.namespace.QName;
> import java.text.SimpleDateFormat;
> import java.util.*;
> public class SimpleTypeMapper {
>     private static SimpleDateFormat zulu =
>             new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
>     //  0123456789 0 123456789
>     static {
>         zulu.setTimeZone(TimeZone.getTimeZone("GMT"));
>     }
>     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_CALANDER = "java.util.Calendar";
>     private static final String W_DATE = "java.util.Date";
>     private static final String ARRAY_LIST = "java.util.ArrayList";
>     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";
>     public static Object getSimpleTypeObject(Class parameter, OMElement value) {
>         if (parameter.getName().equals(STRING)) {
>             return value.getText();
>         } else if (parameter.getName().equals(INT)) {
>             return new Integer(value.getText());
>         } else if (parameter.getName().equals(BOOLEAN)) {
>             return Boolean.valueOf(value.getText());
>         } else if (parameter.getName().equals(BYTE)) {
>             return new Byte(value.getText());
>         } else if (parameter.getName().equals(DOUBLE)) {
>             return new Double(value.getText());
>         } else if (parameter.getName().equals(SHORT)) {
>             return new Short(value.getText());
>         } else if (parameter.getName().equals(LONG)) {
>             return new Long(value.getText());
>         } else if (parameter.getName().equals(FLOAT)) {
>             return new Float(value.getText());
>         } else if (parameter.getName().equals(CHAR)) {
>             return new Character(value.getText().toCharArray()[0]);
>         } else if (parameter.getName().equals(W_INT)) {
>             return new Integer(value.getText());
>         } else if (parameter.getName().equals(W_BOOLEAN)) {
>             return Boolean.valueOf(value.getText());
>         } else if (parameter.getName().equals(W_BYTE)) {
>             return new Byte(value.getText());
>         } else if (parameter.getName().equals(W_DOUBLE)) {
>             return new Double(value.getText());
>         } else if (parameter.getName().equals(W_SHORT)) {
>             return new Short(value.getText());
>         } else if (parameter.getName().equals(W_LONG)) {
>             return new Long(value.getText());
>         } else if (parameter.getName().equals(W_FLOAT)) {
>             return new Float(value.getText());
>         } else if (parameter.getName().equals(W_CHAR)) {
>             return new Character(value.getText().toCharArray()[0]);
>         } else if (parameter.getName().equals(W_CALANDER)) {
>             return makeCalendar(value.getText(), false);
>         } else if (parameter.getName().equals(W_DATE)) {
>             return makeCalendar(value.getText(), true);
>         } else {
>             return null;
>         }
>     }
>     public static ArrayList getArrayList(OMElement element, String localName) {
>         Iterator childitr = element.getChildrenWithName(new QName(localName));
>         ArrayList list = new ArrayList();
>         while (childitr.hasNext()) {
>             Object o = childitr.next();
>             list.add(o);
>         }
>         return list;
>     }
>     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) {
>         String objClassName = obj.getClass().getName();
>         if (obj instanceof Calendar) {
>             return true;
>         } else {
>             return isSimpleType(objClassName);
>         }
>     }
>     public static boolean isSimpleType(Class obj) {
>         String objClassName = obj.getName();
>         return isSimpleType(objClassName);
>     }
>     public static boolean isArrayList(Class obj) {
>         String objClassName = obj.getName();
>         return ARRAY_LIST.equals(objClassName);
>     }
>     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_CALANDER)) {
>             return true;
>         } else if (objClassName.equals(W_DATE)) {
>             return true;
>         } else return 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).doubleValue();
>             }
>             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) {
>             return zulu.format(((Calendar) obj).getTime());
>         }
>         return obj.toString();
>     }
>     public static Object makeCalendar(String source, boolean returnDate) {
>         Calendar calendar = Calendar.getInstance();
>         Date date;
>         boolean bc = false;
>         // validate fixed portion of format
>         if (source == null || source.length() == 0) {
>             throw new NumberFormatException(
>                     "badDateTime00");
>         }
>         if (source.charAt(0) == '+') {
>             source = source.substring(1);
>         }
>         if (source.charAt(0) == '-') {
>             source = source.substring(1);
>             bc = true;
>         }
>         if (source.length() < 19) {
>             throw new NumberFormatException(
>                     "badDateTime00");
>         }
>         if (source.charAt(4) != '-' || source.charAt(7) != '-' ||
>                 source.charAt(10) != 'T') {
>             throw new NumberFormatException("badDate00");
>         }
>         if (source.charAt(13) != ':' || source.charAt(16) != ':') {
>             throw new NumberFormatException("badTime00");
>         }
>         // convert what we have validated so far
>         try {
>             synchronized (zulu) {
>                 date = zulu.parse(source.substring(0, 19) + ".000Z");
>             }
>         } catch (Exception e) {
>             throw new NumberFormatException(e.toString());
>         }
>         int pos = 19;
>         // parse optional milliseconds
>         if (pos < source.length() && source.charAt(pos) == '.') {
>             int milliseconds;
>             int start = ++pos;
>             while (pos < source.length() &&
>                     Character.isDigit(source.charAt(pos))) {
>                 pos++;
>             }
>             String decimal = source.substring(start, pos);
>             if (decimal.length() == 3) {
>                 milliseconds = Integer.parseInt(decimal);
>             } else if (decimal.length() < 3) {
>                 milliseconds = Integer.parseInt((decimal + "000")
>                         .substring(0, 3));
>             } else {
>                 milliseconds = Integer.parseInt(decimal.substring(0, 3));
>                 if (decimal.charAt(3) >= '5') {
>                     ++milliseconds;
>                 }
>             }
>             // add milliseconds to the current date
>             date.setTime(date.getTime() + milliseconds);
>         }
>         // parse optional timezone
>         if (pos + 5 < source.length() &&
>                 (source.charAt(pos) == '+' || (source.charAt(pos) == '-'))) {
>             if (!Character.isDigit(source.charAt(pos + 1)) ||
>                     !Character.isDigit(source.charAt(pos + 2)) ||
>                     source.charAt(pos + 3) != ':' ||
>                     !Character.isDigit(source.charAt(pos + 4)) ||
>                     !Character.isDigit(source.charAt(pos + 5))) {
>                 throw new NumberFormatException(
>                         "badTimezone00");
>             }
>             int hours = (source.charAt(pos + 1) - '0') * 10
>                     + source.charAt(pos + 2) - '0';
>             int mins = (source.charAt(pos + 4) - '0') * 10
>                     + source.charAt(pos + 5) - '0';
>             int milliseconds = (hours * 60 + mins) * 60 * 1000;
>             // subtract milliseconds from current date to obtain GMT
>             if (source.charAt(pos) == '+') {
>                 milliseconds = -milliseconds;
>             }
>             date.setTime(date.getTime() + milliseconds);
>             pos += 6;
>         }
>         if (pos < source.length() && source.charAt(pos) == 'Z') {
>             pos++;
>             calendar.setTimeZone(TimeZone.getTimeZone("GMT"));
>         }
>         if (pos < source.length()) {
>             throw new NumberFormatException("badChars00");
>         }
>         calendar.setTime(date);
>         // support dates before the Christian era
>         if (bc) {
>             calendar.set(Calendar.ERA, GregorianCalendar.BC);
>         }
>         if (returnDate) {
>             return date;
>         } else {
>             return calendar;
>         }
>     }
> }

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe, e-mail: axis-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-dev-help@ws.apache.org