Revision: 4568
          http://sourceforge.net/p/vexi/code/4568
Author:   mkpg2
Date:     2013-10-25 06:46:43 +0000 (Fri, 25 Oct 2013)
Log Message:
-----------
Added week support to JS date.
- default week is, starting sunday, 1st week starting first sunday of the year
- probably will be elaborated in future, in which case we will very likely need 
to represent the calendar objects in js directly to make explicit choice of 
calendar system possible

Modified Paths:
--------------
    branches/vexi3/org.vexi-library.js/src/main/jpp/org/ibex/js/JSDate.jpp
    branches/vexi3/org.vexi-library.js/src/test/java/test/js/exec/date/week.js
    branches/vexi3/org.vexi-library.value/src/main/java/org/vexi/value/Date.java
    
branches/vexi3/org.vexi-library.value/src/test/java/org/vexi/value/TestDate.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-11 04:55:11 UTC (rev 4567)
+++ branches/vexi3/org.vexi-library.js/src/main/jpp/org/ibex/js/JSDate.jpp      
2013-10-25 06:46:43 UTC (rev 4568)
@@ -167,6 +167,7 @@
         /* The year as a standard Gregorian date.
          * @type(Number) */
         case "day": return getPartJS(key);
+        case "week":  return getPartJS(key);
         case "weekday":  return getPartJS(key);
         case "hour":    return getPartJS(key);
         case "minute":  return getPartJS(key);

Modified: 
branches/vexi3/org.vexi-library.js/src/test/java/test/js/exec/date/week.js
===================================================================
--- branches/vexi3/org.vexi-library.js/src/test/java/test/js/exec/date/week.js  
2013-10-11 04:55:11 UTC (rev 4567)
+++ branches/vexi3/org.vexi-library.js/src/test/java/test/js/exec/date/week.js  
2013-10-25 06:46:43 UTC (rev 4568)
@@ -3,3 +3,13 @@
 const Date = sys.js.Date;
 const ymd  = new Date("YMD",2013,8,27);
 assertEquals(3, ymd.weekday);
+
+
+//REMARK eventually will probably have to support a calendar system
+//as different systems exist with different definitions of which the first
+//week of a given year is...
+const yw  = new Date("YW",2012,40);
+assertEquals(40, yw.week);
+assertEquals(53, yw.addPeriod("week", 13).week);
+assertEquals(1, yw.addPeriod("week", 14).week);
+

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-11 04:55:11 UTC (rev 4567)
+++ 
branches/vexi3/org.vexi-library.value/src/main/java/org/vexi/value/Date.java    
    2013-10-25 06:46:43 UTC (rev 4568)
@@ -44,6 +44,7 @@
     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 newYW(int y, int q){ return new Date(SCHEME_YW, new 
int[]{y, q}); }
     
     static public Date newDate(String schemeStr, int[] parts) throws 
ValueException{
         Scheme scheme = getScheme(schemeStr);
@@ -59,7 +60,9 @@
            PART_MINUTE = -4,
                            
            PART_QUARTER = -5,
-               PART_WEEKDAY = -6;
+               PART_WEEKDAY = -6,
+               PART_WEEK = -7;
+    
     static public int partId(String partName) throws ValueException{
         if("year".equals(partName)) return PART_YEAR;
         if("month".equals(partName)) return PART_MONTH;
@@ -69,6 +72,7 @@
         
         if("quarter".equals(partName)) return PART_QUARTER;
         if("weekday".equals(partName)) return PART_WEEKDAY;
+        if("week".equals(partName)) return PART_WEEK;
         throw new ValueException("No such part: "+partName);
     }
     static public String partName(int partId){
@@ -80,6 +84,7 @@
         case PART_MINUTE: return "minute";
         case PART_QUARTER: return "quarter";
         case PART_WEEKDAY: return "weekday";
+        case PART_WEEK: return "week";
         }
         throw new Error("No such part: "+partId);
     }
@@ -92,6 +97,7 @@
         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);
+        case PART_WEEK: return cal.get(Calendar.WEEK_OF_YEAR);
         }
         throw new Error("No such part: "+partId);
     }
@@ -145,6 +151,8 @@
         }
        
         Date newDate(Calendar cal) {
+               cal = initCalendar(cal);
+               
                int[] parts = new int[partIds.length];
                for(int i=0; i<partIds.length; i++){
                        parts[i] = partGet(partIds[i], cal);
@@ -174,7 +182,18 @@
                }
            }
        }
-       
+
+               public boolean hasPart(int partId) {
+                       return getPartIndex(partId)!=-1;
+               }       
+               
+           Calendar initCalendar(Calendar c){
+               if(hasPart(PART_WEEK)){
+                       c.setMinimalDaysInFirstWeek(7);
+                       c.setFirstDayOfWeek(Calendar.SUNDAY);
+               }
+               return c;
+           }
        }
     
     
@@ -184,6 +203,7 @@
     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});
+    static final public Scheme SCHEME_YW = new Scheme("YW", new 
int[]{PART_YEAR, PART_WEEK});
     
     
     static final private Scheme[] SCHEMES = {
@@ -192,7 +212,8 @@
        SCHEME_YMD,
        SCHEME_YMDH,
        SCHEME_YMDHM,
-       SCHEME_YQ
+       SCHEME_YQ,
+       SCHEME_YW
     };
     
     static public Scheme getScheme(String name) throws ValueException{
@@ -219,10 +240,11 @@
 //    
 
 
-    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 Pattern p = 
Pattern.compile("([0-9]{1,4})((wk)|[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 + "'");
+        if(r==null) 
+               throw new ValueException("Not a date '" + s + "'");
         return r;
     }
     static public Date tryParseString(String s){
@@ -237,34 +259,38 @@
         String sep1 = m.group(2);
         if(sep1==null){
             return newY(year);
-        }else if("q".equals(sep1)){
-            String quarterStr = m.group(3);
-            int quarter = Integer.parseInt(quarterStr);
-            return newYQ(year, quarter);
-        }else if("-".equals(sep1)){
-            int month = Integer.parseInt(m.group(3));
-            String dayStr = m.group(5);
-            if(dayStr==null){
-                 return newYM(year, month);
-            }else{
-                int day = Integer.parseInt(dayStr);
-                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 {
+               String part2Str = m.group(4);
+            int part2 = Integer.parseInt(part2Str);
+            if("wk".equals(sep1)){
+                return newYW(year, part2);
+               }else if("q".equals(sep1)){
+                   return newYQ(year, part2);
+               }else if("-".equals(sep1)){
+                   int month = part2;
+                   String dayStr = m.group(6);
+                   if(dayStr==null){
+                        return newYM(year, month);
+                   }else{
+                       int day = Integer.parseInt(dayStr);
+                       String hrStr = m.group(8);
+                       if(hrStr==null){
+                               return newYMD(year, month, day);
+                       }else{
+                               int hr = Integer.parseInt(hrStr);
+                               String miStr = m.group(10);
+                               
+                               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);
             }
-        }else{
-            throw new Error(s);
         }
     }
 
@@ -291,6 +317,10 @@
             int quarter = expectPart(PART_QUARTER); 
             return year+"q"+quarter;
         }
+        if(scheme==SCHEME_YW){
+            int week = expectPart(PART_WEEK); 
+            return year+"wk"+padZero(week);
+        }
         throw new Error("!");
     }
 
@@ -310,7 +340,7 @@
 
     
     public boolean hasPart(int partId) {
-       return scheme.getPartIndex(partId)!=-1;
+       return scheme.hasPart(partId);
     }
     public boolean hasPartExactly(int partId) {
        if(hasPart(partId)) return true;
@@ -372,14 +402,23 @@
     }
     
 
-    private GregorianCalendar asCalendar() {
-           return new GregorianCalendar(
-                getPartDefault(PART_YEAR),
-                getPartDefault(PART_MONTH)-1,
-                getPartDefault(PART_DAY),
-                getPartDefault(PART_HOUR),
-                getPartDefault(PART_MINUTE)
-        );    
+    private Calendar asCalendar() {
+       if(hasPart(PART_WEEK)){
+               Calendar c = scheme.initCalendar(Calendar.getInstance());
+               c.set(Calendar.YEAR, getPartDefault(PART_YEAR));
+               c.set(Calendar.WEEK_OF_YEAR, getPartDefault(PART_WEEK));
+               c.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
+               return c;
+       }else{
+       
+                   return new GregorianCalendar(
+                       getPartDefault(PART_YEAR),
+                       getPartDefault(PART_MONTH)-1,
+                       getPartDefault(PART_DAY),
+                       getPartDefault(PART_HOUR),
+                       getPartDefault(PART_MINUTE)
+               );
+       }
     }
     public Instant asInstant() throws ValueException { return asInstant(null); 
}
     public Instant asInstant(String timezone) throws ValueException { 
@@ -404,7 +443,8 @@
        case PART_DAY: return SCHEME_YMD;
        case PART_HOUR: return SCHEME_YMDH;
        case PART_MINUTE: return SCHEME_YMDHM;
-       case PART_QUARTER: return SCHEME_YQ;            
+       case PART_QUARTER: return SCHEME_YQ;
+       case PART_WEEK: return SCHEME_YW;  
        }
        return null;
     }
@@ -417,8 +457,9 @@
        case PART_DAY: return PART_MONTH;
        case PART_HOUR: return PART_DAY;
        case PART_MINUTE: return PART_HOUR;
+       case PART_WEEK: return PART_YEAR;
        }
-       throw new Error();
+       throw new Error(""+partId);
     }
     
     public Date with(int part, int value) throws ValueException { 
@@ -463,6 +504,11 @@
         case PART_DAY:
             c.add(Calendar.DAY_OF_MONTH, amount);
             break;
+        case PART_WEEK:
+            c.add(Calendar.WEEK_OF_YEAR, amount);
+            break;
+        default:
+               throw new Error();
         }
         return scheme.newDate(c);
     }
@@ -541,4 +587,6 @@
        } while (cursor.getTimeInMillis() <= endInstant);  
        return presumedDays;  
     }
+    
+
 }

Modified: 
branches/vexi3/org.vexi-library.value/src/test/java/org/vexi/value/TestDate.java
===================================================================
--- 
branches/vexi3/org.vexi-library.value/src/test/java/org/vexi/value/TestDate.java
    2013-10-11 04:55:11 UTC (rev 4567)
+++ 
branches/vexi3/org.vexi-library.value/src/test/java/org/vexi/value/TestDate.java
    2013-10-25 06:46:43 UTC (rev 4568)
@@ -16,6 +16,7 @@
         assertParse("2001-01");
         assertParse("2002-2","2002-02");
         assertParse("2003q1");
+        assertParse("2003wk50");
     }
 
     
@@ -49,7 +50,11 @@
 
         d = d.with(Date.PART_DAY, 5);
         assertEquals("2003-04-05", d.format());
-
+        
+        
+        d = Date.newY(2000).with(Date.PART_WEEK, 10);
+        assertEquals("2000wk10", d.format());
+        
     }
     
     public void testAdd() throws ValueException {
@@ -63,6 +68,12 @@
 
         
         assertEquals("2008q3", Date.newYQ(2004,4).addPeriod(Date.PART_QUARTER, 
15).format());
+        
+        // by the default week scheme - first week starts on first sunday of 
the year
+        //(as of yet no means to change this) 2012 has 53 weeks 
+        assertEquals("2012wk53", Date.newYW(2012,50).addPeriod(Date.PART_WEEK, 
3).format());
+        assertEquals("2013wk01", Date.newYW(2012,50).addPeriod(Date.PART_WEEK, 
4).format());
+        
     }
 
     public void testDiff() throws ValueException {

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=60135991&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