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