Revision: 4563
          http://sourceforge.net/p/vexi/code/4563
Author:   mkpg2
Date:     2013-10-10 16:00:16 +0000 (Thu, 10 Oct 2013)
Log Message:
-----------
Date. Support 'date-times'. Added hours & minutes support to the date object.

Modified Paths:
--------------
    branches/vexi3/org.vexi-library.js/src/main/jpp/org/ibex/js/JSDate.jpp
    branches/vexi3/org.vexi-library.js/src/main/jpp/org/ibex/js/JSInstant.jpp
    branches/vexi3/org.vexi-library.value/src/main/java/org/vexi/value/Date.java
    
branches/vexi3/org.vexi-library.value/src/main/java/org/vexi/value/Instant.java

Added Paths:
-----------
    
branches/vexi3/org.vexi-library.value/src/test/java/org/vexi/value/TestDateTime.java

Modified: branches/vexi3/org.vexi-library.js/src/main/jpp/org/ibex/js/JSDate.jpp
===================================================================
--- branches/vexi3/org.vexi-library.js/src/main/jpp/org/ibex/js/JSDate.jpp      
2013-10-10 13:22:06 UTC (rev 4562)
+++ branches/vexi3/org.vexi-library.js/src/main/jpp/org/ibex/js/JSDate.jpp      
2013-10-10 16:00:16 UTC (rev 4563)
@@ -168,8 +168,8 @@
          * @type(Number) */
         case "day": return getPartJS(key);
         case "weekday":  return getPartJS(key);
-        case "hours":    throw new JSExn("Unsupported: "+key);
-        case "minutes":  throw new JSExn("Unsupported: "+key);
+        case "hours":    return getPartJS(key);
+        case "minutes":  return getPartJS(key);
         case "seconds":  throw new JSExn("Unsupported: "+key);
             
         case "scheme": return JSU.S(date.getScheme().name);

Modified: 
branches/vexi3/org.vexi-library.js/src/main/jpp/org/ibex/js/JSInstant.jpp
===================================================================
--- branches/vexi3/org.vexi-library.js/src/main/jpp/org/ibex/js/JSInstant.jpp   
2013-10-10 13:22:06 UTC (rev 4562)
+++ branches/vexi3/org.vexi-library.js/src/main/jpp/org/ibex/js/JSInstant.jpp   
2013-10-10 16:00:16 UTC (rev 4563)
@@ -8,6 +8,7 @@
 
 import org.vexi.value.Date;
 import org.vexi.value.Instant;
+import org.vexi.value.ValueException;
 
 /**
  * <p>Represents a point in time. Programmatically, when dealing with time as
@@ -35,7 +36,7 @@
        }
        
        static private TimeZone expectTimeZone(JS[] args, int i){
-               if(args.length<=i){
+               if(args.length<=i || args[i]==null){
                        return getTimeZone();
                }
                return expectTimeZone(args[i]);
@@ -127,27 +128,42 @@
     }
 
     public JS callMethod(JS this_, JS method, JS[] args) throws JSExn {
-        //#switch(JSU.toString(method))
-       case "format": { 
-               TimeZone timezone = expectTimeZone(args,0);
-            return JSU.S(instant.format(timezone));
-       }
-        case "getDate": { 
-               TimeZone timezone = expectTimeZone(args,0);
-            return new JSDate(instant.getDate(timezone));
+        try{
+               //#switch(JSU.toString(method))
+               case "format": { 
+                       TimeZone timezone = expectTimeZone(args,0);
+                   return JSU.S(instant.format(timezone));
+               }
+               case "getDate": { 
+                       TimeZone timezone = expectTimeZone(args,0);
+                       Date.Scheme scheme;
+                       if(args.length>=2){
+                               String schemeStr = JSU.expectArg_string(args,1);
+                               scheme = Date.getScheme(schemeStr);
+                       }else{
+                               scheme = Date.SCHEME_YMD;
+                       }
+                   return new JSDate(instant.getDate(timezone, scheme));
+               }
+               case "getDateTime": { 
+                       TimeZone timezone = expectTimeZone(args,0);
+                   return new JSDate(instant.getDate(timezone, 
Date.SCHEME_YMDHM));
+               }
+               case "getTime": { 
+                       TimeZone timezone = expectTimeZone(args,0);
+                   return JSU.S(instant.getTime(timezone));
+               }
+               case "diffMillis": return diffMillis(args);
+               case "diff": return diffMillis(args);
+               case "addMillis": { 
+                       int amount = JSU.expectArg_int(args,0);
+                   return new JSInstant(instant.millis()+amount);
+               }
+               //#end
+               return super.callMethod(this_, method, args);
+        }catch(ValueException e){
+               throw new JSExn(e.getMessage());
         }
-        case "getTime": { 
-               TimeZone timezone = expectTimeZone(args,0);
-            return JSU.S(instant.getTime(timezone));
-        }
-        case "diffMillis": return diffMillis(args);
-        case "diff": return diffMillis(args);
-        case "addMillis": { 
-               int amount = JSU.expectArg_int(args,0);
-            return new JSInstant(instant.millis()+amount);
-        }
-        //#end
-        return super.callMethod(this_, method, args);
     }
     
     public int hashCode(){ return instant.hashCode(); }

Modified: 
branches/vexi3/org.vexi-library.value/src/main/java/org/vexi/value/Date.java
===================================================================
--- 
branches/vexi3/org.vexi-library.value/src/main/java/org/vexi/value/Date.java    
    2013-10-10 13:22:06 UTC (rev 4562)
+++ 
branches/vexi3/org.vexi-library.value/src/main/java/org/vexi/value/Date.java    
    2013-10-10 16:00:16 UTC (rev 4563)
@@ -41,6 +41,8 @@
     static public Date newY(int y){ return new Date(SCHEME_Y, new int[]{y}); }
     static public Date newYM(int y, int m){ return new Date(SCHEME_YM, new 
int[]{y, m}); }
     static public Date newYMD(int y, int m, int d){ return new 
Date(SCHEME_YMD, new int[]{y, m, d}); }
+    static public Date newYMDH(int y, int m, int d, int h){ return new 
Date(SCHEME_YMDH, new int[]{y, m, d, h}); }
+    static public Date newYMDHM(int y, int m, int d, int h, int mi){ return 
new Date(SCHEME_YMDHM, new int[]{y, m, d, h, mi}); }
     static public Date newYQ(int y, int q){ return new Date(SCHEME_YQ, new 
int[]{y, q}); }
     
     static public Date newDate(String schemeStr, int[] parts) throws 
ValueException{
@@ -53,12 +55,18 @@
            PART_YEAR = 0,
            PART_MONTH = -1, 
            PART_DAY = -2,
-           PART_QUARTER = -3,
-               PART_WEEKDAY = -4;
+           PART_HOUR = -3,
+           PART_MINUTE = -4,
+                           
+           PART_QUARTER = -5,
+               PART_WEEKDAY = -6;
     static public int partId(String partName) throws ValueException{
         if("year".equals(partName)) return PART_YEAR;
         if("month".equals(partName)) return PART_MONTH;
         if("day".equals(partName)) return PART_DAY;
+        if("hour".equals(partName)) return PART_HOUR;
+        if("minute".equals(partName)) return PART_MINUTE;
+        
         if("quarter".equals(partName)) return PART_QUARTER;
         if("weekday".equals(partName)) return PART_WEEKDAY;
         throw new ValueException("No such part: "+partName);
@@ -68,6 +76,8 @@
         case PART_YEAR: return "year";
         case PART_MONTH: return "month";
         case PART_DAY: return "day";
+        case PART_HOUR: return "hour";
+        case PART_MINUTE: return "minute";
         case PART_QUARTER: return "quarter";
         case PART_WEEKDAY: return "weekday";
         }
@@ -78,6 +88,8 @@
         case PART_YEAR: return cal.get(Calendar.YEAR);
         case PART_MONTH: return cal.get(Calendar.MONTH)+1;
         case PART_DAY: return cal.get(Calendar.DAY_OF_MONTH);
+        case PART_HOUR: return cal.get(Calendar.HOUR_OF_DAY);
+        case PART_MINUTE: return cal.get(Calendar.MINUTE);
         case PART_QUARTER: return (cal.get(Calendar.MONTH)/3)+1;
         case PART_WEEKDAY: return cal.get(Calendar.DAY_OF_WEEK);
         }
@@ -87,6 +99,10 @@
     
     static private boolean partValid(int partId, int value) throws 
ValueException {
         switch(partId){
+        case PART_MINUTE:
+               return (value>=0 && value<60);
+        case PART_HOUR:
+               return (value>=0 && value<23);
         case PART_DAY:
             // HACK should check based on month 
             return (value>=1 && value<=31); 
@@ -165,6 +181,8 @@
     static final public Scheme SCHEME_Y = new Scheme("Y", new 
int[]{PART_YEAR});
     static final public Scheme SCHEME_YM = new Scheme("YM", new 
int[]{PART_YEAR, PART_MONTH});
     static final public Scheme SCHEME_YMD = new Scheme("YMD", new 
int[]{PART_YEAR, PART_MONTH, PART_DAY});
+    static final public Scheme SCHEME_YMDH = new Scheme("YMDHM", new 
int[]{PART_YEAR, PART_MONTH, PART_DAY, PART_HOUR});
+    static final public Scheme SCHEME_YMDHM = new Scheme("YMDHM", new 
int[]{PART_YEAR, PART_MONTH, PART_DAY, PART_HOUR, PART_MINUTE});
     static final public Scheme SCHEME_YQ = new Scheme("YQ", new 
int[]{PART_YEAR, PART_QUARTER});
     
     
@@ -172,6 +190,8 @@
        SCHEME_Y,
        SCHEME_YM,
        SCHEME_YMD,
+       SCHEME_YMDH,
+       SCHEME_YMDHM,
        SCHEME_YQ
     };
     
@@ -199,7 +219,7 @@
 //    
 
 
-    static Pattern p = 
Pattern.compile("([0-9]{1,4})([q-])?([0-9]{1,2})?(-([0-9]{1,2}))?");
+    static Pattern p = 
Pattern.compile("([0-9]{1,4})([q-])?([0-9]{1,2})?(-([0-9]{1,2})( 
([0-9]{1,2})(:([0-9]{1,2}))?)?)?");
     static public Date parseString(String s) throws ValueException{
         Date r = tryParseString(s);
         if(r==null) throw new ValueException("No a date '" + s + "'");
@@ -228,7 +248,20 @@
                  return newYM(year, month);
             }else{
                 int day = Integer.parseInt(dayStr);
-                return newYMD(year, month, day);
+                String hrStr = m.group(7);
+                if(hrStr==null){
+                       return newYMD(year, month, day);
+                }else{
+                       int hr = Integer.parseInt(hrStr);
+                       String miStr = m.group(9);
+                       
+                       if(miStr==null){
+                               return newYMDH(year, month, day, hr);    
+                    }else{
+                       int mi = Integer.parseInt(miStr);
+                       return newYMDHM(year, month, day, hr, mi);    
+                    }
+                }
             }
         }else{
             throw new Error(s);
@@ -249,6 +282,13 @@
             int day = expectPart(PART_DAY); 
             return year+"-"+padZero(month)+"-"+padZero(day);           
         }
+        if(scheme==SCHEME_YMDHM || scheme==SCHEME_YMDH){
+            int month = expectPart(PART_MONTH); 
+            int day = expectPart(PART_DAY); 
+            int hour = expectPart(PART_HOUR);
+            int minute = getPartDefault(PART_MINUTE);
+            return year+"-"+padZero(month)+"-"+padZero(day)+" 
"+padZero(hour)+":"+padZero(minute);             
+        }
         if(scheme==SCHEME_YQ){
             int quarter = expectPart(PART_QUARTER); 
             return year+"q"+quarter;
@@ -297,6 +337,8 @@
     public int getPartDefault(int part){ 
         if (hasPart(part)) return expectPart(part);
         switch(part){
+        case PART_MINUTE:
+        case PART_HOUR: return 0;
         case PART_DAY: return 1;
         case PART_MONTH: 
             if(hasPart(PART_QUARTER)){
@@ -329,11 +371,13 @@
     
 
     private GregorianCalendar asCalendar() {
-        return new GregorianCalendar(
+           return new GregorianCalendar(
                 getPartDefault(PART_YEAR),
                 getPartDefault(PART_MONTH)-1,
-                getPartDefault(PART_DAY)
-            );
+                getPartDefault(PART_DAY),
+                getPartDefault(PART_HOUR),
+                getPartDefault(PART_MINUTE)
+        );    
     }
     public Instant asInstant() throws ValueException { return asInstant(null); 
}
     public Instant asInstant(String timezone) throws ValueException { 
@@ -351,6 +395,30 @@
         return scheme2.newDate(asCalendar());
     }
     
+    private Scheme getSchemeForPart(int partId){
+       switch(partId){
+       case PART_YEAR: return SCHEME_Y;
+       case PART_MONTH: return SCHEME_YM;
+       case PART_DAY: return SCHEME_YMD;
+       case PART_HOUR: return SCHEME_YMDH;
+       case PART_MINUTE: return SCHEME_YMDHM;
+       case PART_QUARTER: return SCHEME_YQ;            
+       }
+       return null;
+    }
+    
+
+    private int getSuperiorPart(int partId){
+       switch(partId){
+       case PART_QUARTER: 
+       case PART_MONTH: return PART_YEAR;
+       case PART_DAY: return PART_MONTH;
+       case PART_HOUR: return PART_DAY;
+       case PART_MINUTE: return PART_HOUR;
+       }
+       throw new Error();
+    }
+    
     public Date with(int part, int value) throws ValueException { 
         if(hasPart(part)){
             int[] r = new int[parts.length];
@@ -358,13 +426,14 @@
             scheme.setPart(part, r, value);
             return scheme.newDate(r);
         }else{
-            int year = expectPart(PART_YEAR);
-            if(SCHEME_Y==scheme){
-                if(part==PART_MONTH)   return newYM(year, value);
-                if(part==PART_QUARTER) return newYQ(year, value);
-            }else if(SCHEME_YM==scheme){
-                if(part==PART_DAY)     return newYMD(year, 
expectPart(PART_MONTH), value);
-            }   
+               // appending a part - changes the scheme
+               if(hasPart(getSuperiorPart(part))){
+                       Scheme scheme1 = getSchemeForPart(part);
+                       int[] r = new int[parts.length+1];
+                       System.arraycopy(parts, 0, r, 0, parts.length);
+                       scheme1.setPart(part, r, value);
+                       return scheme1.newDate(r);
+               }
         }
         throw new ValueException("Cannot derive "+scheme.name+" with date part 
"+partName(part)); 
     }
@@ -374,6 +443,12 @@
         if(!hasPart(part)) throw new ValueException("Cannot add 
"+partName(part)+" to "+ scheme.name); 
         Calendar c = asCalendar();
         switch(part){
+        case PART_MINUTE:
+            c.add(Calendar.MINUTE, amount);
+            break;
+        case PART_HOUR:
+            c.add(Calendar.HOUR_OF_DAY, amount);
+            break;        
         case PART_YEAR:
             c.add(Calendar.YEAR, amount);
             break;

Modified: 
branches/vexi3/org.vexi-library.value/src/main/java/org/vexi/value/Instant.java
===================================================================
--- 
branches/vexi3/org.vexi-library.value/src/main/java/org/vexi/value/Instant.java 
    2013-10-10 13:22:06 UTC (rev 4562)
+++ 
branches/vexi3/org.vexi-library.value/src/main/java/org/vexi/value/Instant.java 
    2013-10-10 16:00:16 UTC (rev 4563)
@@ -105,9 +105,10 @@
         cal.setTimeInMillis(value);
         return cal;
     }
-    
-       public Date getDate(TimeZone timezone) {
-               return Date.SCHEME_YMD.newDate(asCalendar(timezone));
+
+    public Date getDate(TimeZone timezone) { return getDate(timezone, 
Date.SCHEME_YMD); }
+       public Date getDate(TimeZone timezone, Date.Scheme scheme) {
+               return scheme.newDate(asCalendar(timezone));
        }
 
        public String getTime(TimeZone timezone) {

Added: 
branches/vexi3/org.vexi-library.value/src/test/java/org/vexi/value/TestDateTime.java
===================================================================
--- 
branches/vexi3/org.vexi-library.value/src/test/java/org/vexi/value/TestDateTime.java
                                (rev 0)
+++ 
branches/vexi3/org.vexi-library.value/src/test/java/org/vexi/value/TestDateTime.java
        2013-10-10 16:00:16 UTC (rev 4563)
@@ -0,0 +1,56 @@
+package org.vexi.value;
+
+import junit.framework.TestCase;
+
+
+public class TestDateTime extends TestCase{
+
+    static void assertParse(String s) throws ValueException{ assertParse(s, 
s); }
+    static void assertParse(String s, String expected) throws ValueException{
+        Date d = Date.parseString(s);
+        assertEquals(expected, d.format());
+    }
+    
+    public void testParse() throws ValueException {
+        assertParse("2004-4-3 23:59","2004-04-03 23:59");        
+        assertParse("2004-4-3 00:00","2004-04-03 00:00");
+    }
+
+    
+    public void testWithAndAs() throws ValueException {
+        Date d = Date.newYMD(2013,10,10);
+        assertEquals("2013-10-10", d.as(Date.SCHEME_YMD).format());
+        assertEquals("2013-10-10 00:00", d.as(Date.SCHEME_YMDH).format());
+        assertEquals("2013-10-10 00:00", d.as(Date.SCHEME_YMDHM).format());
+        
+        Date dh = d.with(Date.PART_HOUR, 13);
+        assertEquals("2013-10-10 13:00", dh.format());
+        assertEquals("2013-10-10 13:25", dh.with(Date.PART_MINUTE, 
25).format());
+    }
+    
+    public void testAdd() throws ValueException {
+       Date dt = Date.newYMDHM(2013,10,10,16,29);
+       
+       assertEquals("2013-10-12 16:29", dt.addPeriod(Date.PART_DAY, 
2).format());
+       assertEquals("2013-10-11 05:29", dt.addPeriod(Date.PART_HOUR, 
13).format());
+       assertEquals("2013-10-10 17:05", dt.addPeriod(Date.PART_MINUTE, 
36).format());
+    }
+    
+    public void testCompare() throws ValueException {
+       Date d0 = Date.newYMDHM(2013,10,10,16,29);
+       Date d1 = Date.newYMDHM(2013,10,10,16,33);
+        
+       assertEquals(0,d0.compareTo(d0));
+       assertTrue(d0.compareTo(d1)<0);
+       assertTrue(d1.compareTo(d0)>0);
+    }
+//
+//    public void testDiff() throws ValueException {
+//        assertEquals(30, Date.newY(2011).diff(Date.PART_YEAR, 
Date.newY(1981)));
+//        assertEquals(50, Date.newYM(2011,11).diff(Date.PART_MONTH, 
Date.newYM(2007, 9)));
+//        assertEquals(22, Date.newYQ(2008,1).diff(Date.PART_QUARTER, 
Date.newYQ(2002, 3)));
+//    }
+//    
+
+//    
+}


Property changes on: 
branches/vexi3/org.vexi-library.value/src/test/java/org/vexi/value/TestDateTime.java
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
October Webinars: Code for Performance
Free Intel webinars can help you accelerate application performance.
Explore tips for MPI, OpenMP, advanced profiling, and more. Get the most from 
the latest Intel processors and coprocessors. See abstracts and register >
http://pubads.g.doubleclick.net/gampad/clk?id=60134071&iu=/4140/ostg.clktrk
_______________________________________________
Vexi-svn mailing list
Vexi-svn@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/vexi-svn

Reply via email to