You are viewing a plain text version of this content. The canonical link for it is here.
Posted to axis-cvs@ws.apache.org by di...@apache.org on 2004/06/08 19:23:35 UTC

cvs commit: ws-axis/java/src/org/apache/axis/encoding/ser CalendarDeserializer.java

dims        2004/06/08 10:23:35

  Modified:    java/src/org/apache/axis/encoding/ser
                        CalendarDeserializer.java
  Log:
  Fix for AXIS-1381 - deserialization exception when a specify an empty tag for a date field
  
  Notes:
  - Throw exception up front if there isn't anything to parse.
  - add extra braces and reformat source
  
  Revision  Changes    Path
  1.11      +77 -83    ws-axis/java/src/org/apache/axis/encoding/ser/CalendarDeserializer.java
  
  Index: CalendarDeserializer.java
  ===================================================================
  RCS file: /home/cvs/ws-axis/java/src/org/apache/axis/encoding/ser/CalendarDeserializer.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- CalendarDeserializer.java	25 Feb 2004 14:02:37 -0000	1.10
  +++ CalendarDeserializer.java	8 Jun 2004 17:23:35 -0000	1.11
  @@ -24,18 +24,19 @@
   import java.util.Date;
   import java.util.GregorianCalendar;
   import java.util.TimeZone;
  +
   /**
    * The CalendarSerializer deserializes a dateTime.
    * Much of the work is done in the base class.
  - *
  + * 
    * @author Sam Ruby (rubys@us.ibm.com)
  - * Modified for JAX-RPC @author Rich Scheuerle (scheu@us.ibm.com)
  + *         Modified for JAX-RPC @author Rich Scheuerle (scheu@us.ibm.com)
    */
   public class CalendarDeserializer extends SimpleDeserializer {
   
       private static SimpleDateFormat zulu =
  -        new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
  -                          //  0123456789 0 123456789
  +            new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
  +    //  0123456789 0 123456789
   
       static {
           zulu.setTimeZone(TimeZone.getTimeZone("GMT"));
  @@ -59,110 +60,103 @@
           boolean bc = false;
   
           // validate fixed portion of format
  -        if ( source != null ) {
  -            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(
  -                           Messages.getMessage("badDateTime00"));
  -
  -            if (source.charAt(4) != '-' || source.charAt(7) != '-' ||
  -                source.charAt(10) != 'T')
  -                throw new NumberFormatException(
  -                                                Messages.getMessage("badDate00"));
  -
  -            if (source.charAt(13) != ':' || source.charAt(16) != ':')
  -                throw new NumberFormatException(
  -                                                Messages.getMessage("badTime00"));
  +        if (source == null || source.length() == 0) {
  +            throw new NumberFormatException(
  +                    Messages.getMessage("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(
  +                    Messages.getMessage("badDateTime00"));
  +        }
  +        if (source.charAt(4) != '-' || source.charAt(7) != '-' ||
  +                source.charAt(10) != 'T') {
  +            throw new NumberFormatException(Messages.getMessage("badDate00"));
  +        }
  +        if (source.charAt(13) != ':' || source.charAt(16) != ':') {
  +            throw new NumberFormatException(Messages.getMessage("badTime00"));
           }
  -
           // convert what we have validated so far
           try {
               synchronized (zulu) {
  -                date = zulu.parse(source == null ? null :
  -                                    (source.substring(0,19)+".000Z") );
  +                date = zulu.parse(source.substring(0, 19) + ".000Z");
               }
           } catch (Exception e) {
               throw new NumberFormatException(e.toString());
           }
  -
           int pos = 19;
   
           // parse optional milliseconds
  -        if ( source != null ) {
  -            if (pos < source.length() && source.charAt(pos)=='.') {
  -                int milliseconds = 0;
  -                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);
  +        if (pos < source.length() && source.charAt(pos) == '.') {
  +            int milliseconds = 0;
  +            int start = ++pos;
  +            while (pos < source.length() &&
  +                    Character.isDigit(source.charAt(pos))) {
  +                pos++;
               }
  -
  -            // 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(
  -                                                        Messages.getMessage("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;
  +            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;
                   }
  -
  -            if (pos < source.length() && source.charAt(pos)=='Z') {
  -                pos++;
  -                calendar.setTimeZone(TimeZone.getTimeZone("GMT"));
               }
   
  -            if (pos < source.length())
  -                throw new NumberFormatException(
  -                                                Messages.getMessage("badChars00"));
  +            // 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(
  +                        Messages.getMessage("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(Messages.getMessage("badChars00"));
  +        }
           calendar.setTime(date);
   
           // support dates before the Christian era
           if (bc) {
               calendar.set(Calendar.ERA, GregorianCalendar.BC);
           }
  -
           if (super.javaType == Date.class) {
               return date;
  -        }
  -        else {
  +        } else {
               return calendar;
           }
       }