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 de...@apache.org on 2005/10/18 12:12:47 UTC

svn commit: r326074 - /webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/rpc/receivers/SimpleTypeMapper.java

Author: deepal
Date: Tue Oct 18 03:12:19 2005
New Revision: 326074

URL: http://svn.apache.org/viewcvs?rev=326074&view=rev
Log:
Added calander type into SimpleTypeMapper , so that it can handle that type too

Modified:
    webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/rpc/receivers/SimpleTypeMapper.java

Modified: webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/rpc/receivers/SimpleTypeMapper.java
URL: http://svn.apache.org/viewcvs/webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/rpc/receivers/SimpleTypeMapper.java?rev=326074&r1=326073&r2=326074&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/rpc/receivers/SimpleTypeMapper.java (original)
+++ webservices/axis2/trunk/java/modules/codegen/src/org/apache/axis2/rpc/receivers/SimpleTypeMapper.java Tue Oct 18 03:12:19 2005
@@ -1,6 +1,13 @@
 package org.apache.axis2.rpc.receivers;
 
 import org.apache.axis2.om.OMElement;
+import org.apache.axis2.i18n.Messages;
+
+import java.text.SimpleDateFormat;
+import java.util.TimeZone;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
 
 /*
 * Copyright 2004,2005 The Apache Software Foundation.
@@ -27,6 +34,14 @@
  */
 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";
@@ -36,6 +51,7 @@
     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 INT = "int";
     private static final String BOOLEAN = "boolean";
     private static final String BYTE = "byte";
@@ -64,7 +80,9 @@
             return new Float(value.getText());
         } else if (paramter.getName().equals(CHAR)) {
             return new Character(value.getText().toCharArray()[0]);
-        } else {
+        } else if (paramter.getName().equals(W_CALANDER)) {
+            return makeCalendar(value.getText(),false);
+        }else {
             return null;
         }
     }
@@ -136,5 +154,113 @@
             }
         }
         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(
+                    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.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 = 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);
+        }
+
+        // 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 (returnDate) {
+            return date;
+        } else {
+            return calendar;
+        }
     }
 }