Revision: 4542
http://sourceforge.net/p/vexi/code/4542
Author: mkpg2
Date: 2013-08-27 21:56:49 +0000 (Tue, 27 Aug 2013)
Log Message:
-----------
JSDate. Support weekday property.
Date. Refactored.
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/TestDate.java
branches/vexi3/org.vexi-library.js/src/test/java/test/js/exec/object/copy.js
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
branches/vexi3/org.vexi-library.value/src/test/java/org/vexi/value/TestDate.java
Added Paths:
-----------
branches/vexi3/org.vexi-library.js/src/test/java/test/js/exec/date/week.js
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-08-23 11:21:39 UTC (rev 4541)
+++ branches/vexi3/org.vexi-library.js/src/main/jpp/org/ibex/js/JSDate.jpp
2013-08-27 21:56:49 UTC (rev 4542)
@@ -106,8 +106,8 @@
private JS getPartJS(String key) throws JSExn {
try{
- int partId = Date.getPartId(key);
- if (!date.hasPart(partId)) return null;
+ int partId = Date.partId(key);
+ if (!date.hasPartExactly(partId)) return null;
return JSU.N(date.getPart(partId));
}catch(ValueException e){
throw new JSExn(e);
@@ -145,13 +145,12 @@
/* The year as a standard Gregorian date.
* @type(Number) */
case "day": return getPartJS(key);
-
- case "weekday":
- case "hours":
- case "minutes":
- case "seconds":
- throw new JSExn("Unsupported: "+key);
- case "scheme": return JSU.S(Date.getSchemeName(date.getScheme()));
+ case "weekday": return getPartJS(key);
+ case "hours": throw new JSExn("Unsupported: "+key);
+ case "minutes": throw new JSExn("Unsupported: "+key);
+ case "seconds": throw new JSExn("Unsupported: "+key);
+
+ case "scheme": return JSU.S(date.getScheme().name);
case "addPeriod": return METHOD;
case "as": return METHOD;
@@ -177,17 +176,17 @@
return new JSInstant(r);
}
case "addPeriod": {
- int partId =
Date.getPartId(JSU.toString(JSU.expectArg(args,0)));
+ int partId = Date.partId(JSU.toString(JSU.expectArg(args,0)));
int amount = JSU.expectArg_int(args,1);
return new JSDate(date.addPeriod(partId, amount));
}
case "diff": {
- int partId =
Date.getPartId(JSU.toString(JSU.expectArg(args,0)));
+ int partId = Date.partId(JSU.toString(JSU.expectArg(args,0)));
JSDate from = expectDate(args,1);
return JSU.N(date.diff(partId, from.date));
}
case "withPart": {
- int partId =
Date.getPartId(JSU.toString(JSU.expectArg(args,0)));
+ int partId = Date.partId(JSU.toString(JSU.expectArg(args,0)));
int amount = JSU.expectArg_int(args,1);
return new JSDate(date.with(partId, amount));
}
Modified:
branches/vexi3/org.vexi-library.js/src/test/java/test/js/exec/date/TestDate.java
===================================================================
---
branches/vexi3/org.vexi-library.js/src/test/java/test/js/exec/date/TestDate.java
2013-08-23 11:21:39 UTC (rev 4541)
+++
branches/vexi3/org.vexi-library.js/src/test/java/test/js/exec/date/TestDate.java
2013-08-27 21:56:49 UTC (rev 4542)
@@ -11,7 +11,7 @@
public static void main(String[] args) throws Throwable {
JSTestSuite jts = new JSTestSuite(TestDate.class);
- String SCRIPT = "methods.js";
+ String SCRIPT = "week.js";
//String SCRIPT = "testNumber2String.js";
TestCase t = jts.createTestCase(jts.getResourceDirs(), SCRIPT);
t.runBare();
Added:
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
(rev 0)
+++ branches/vexi3/org.vexi-library.js/src/test/java/test/js/exec/date/week.js
2013-08-27 21:56:49 UTC (rev 4542)
@@ -0,0 +1,9 @@
+sys.import("shared");
+
+const Date = sys.js.Date;
+
+var today = Date.today;
+sys.trace(["today", today.weekday]);
+
+const ymd = new Date("YMD",2011,01,05);
+sys.trace(["2011-01-05", ymd.weekday]);
Property changes on:
branches/vexi3/org.vexi-library.js/src/test/java/test/js/exec/date/week.js
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Modified:
branches/vexi3/org.vexi-library.js/src/test/java/test/js/exec/object/copy.js
===================================================================
---
branches/vexi3/org.vexi-library.js/src/test/java/test/js/exec/object/copy.js
2013-08-23 11:21:39 UTC (rev 4541)
+++
branches/vexi3/org.vexi-library.js/src/test/java/test/js/exec/object/copy.js
2013-08-27 21:56:49 UTC (rev 4542)
@@ -1,8 +1,8 @@
var aref = { };
-var orig = { key1:123, foo:"bar", ref:aref };
-var copy = orig.copy();
+var orig = { key:123, foo:"bar", ref:aref };
+var copy = sys.js.copy(orig);
assert(copy != orig);
assert(copy.key == 123);
-assert(copy.bar == "bar");
+assert(copy.foo == "bar");
assert(copy.ref == aref);
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-08-23 11:21:39 UTC (rev 4541)
+++
branches/vexi3/org.vexi-library.value/src/main/java/org/vexi/value/Date.java
2013-08-27 21:56:49 UTC (rev 4542)
@@ -37,125 +37,155 @@
*/
public class Date implements Comparable {
- static final public int SCHEME_Y = 0;
- static final public int SCHEME_YM = 1;
- static final public int SCHEME_YMD = 2;
- static final public int SCHEME_YQ = 3;
- static final private String[] SCHEMES = {"Y","YM","YMD","YQ"};
- static final private int[] SCHEME_LENGTHS = {1,2,3,2};
+ 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 newYQ(int y, int q){ return new Date(SCHEME_YQ, new
int[]{y, q}); }
+ static public Date newDate(String schemeStr, int[] parts) throws
ValueException{
+ Scheme scheme = getScheme(schemeStr);
+ return scheme.newDate(parts);
+ }
+
+
static final public int
- PART_YEAR = 0,
- PART_MONTH = -1,
- PART_DAY = -2,
- PART_QUARTER = -3;
-
- static public int getScheme(String s) throws ValueException{
- for(int i=0; i<SCHEMES.length; i++){
- if(SCHEMES[i].equals(s)){
- return i;
- }
- }
- throw new ValueException("No such date scheme: "+s);
- }
- static public String getSchemeName(int scheme) {
- return SCHEMES[scheme];
- }
-
- static public int getPartId(String partName) throws ValueException{
+ PART_YEAR = 0,
+ PART_MONTH = -1,
+ PART_DAY = -2,
+ PART_QUARTER = -3,
+ PART_WEEKDAY = -4;
+ 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("quarter".equals(partName)) return PART_QUARTER;
+ if("weekday".equals(partName)) return PART_WEEKDAY;
throw new ValueException("No such part: "+partName);
}
-
- static private int getPartIndex(int part){
- switch(part){
- case PART_YEAR: return 0;
- case PART_MONTH: return 1;
- case PART_DAY: return 2;
- case PART_QUARTER: return 1;
- }
- throw new Error("No such part: "+part);
- }
- static public String getPartName(int part){
- switch(part){
+ static public String partName(int partId){
+ switch(partId){
case PART_YEAR: return "year";
case PART_MONTH: return "month";
case PART_DAY: return "day";
case PART_QUARTER: return "quarter";
+ case PART_WEEKDAY: return "weekday";
}
- throw new Error("No such part: "+part);
+ throw new Error("No such part: "+partId);
}
-
- static private void setPart(int part, int[] vs, int value){
- int index = getPartIndex(part);
- vs[index] = value;
+ static public int partGet(int partId, Calendar cal){
+ switch(partId){
+ 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_QUARTER: return (cal.get(Calendar.MONTH)/3)+1;
+ case PART_WEEKDAY: return cal.get(Calendar.DAY_OF_WEEK);
+ }
+ throw new Error("No such part: "+partId);
}
- static private int getPart(int part, int[] vs){
- int index = getPartIndex(part);
- return vs[index];
+
+ static private boolean partValid(int partId, int value) throws
ValueException {
+ switch(partId){
+ case PART_DAY:
+ // HACK should check based on month
+ return (value>=1 && value<=31);
+ case PART_MONTH:
+ return value>=1 && value<=12;
+ case PART_QUARTER:
+ return value>=1 && value<=4;
+ case PART_WEEKDAY:
+ return value>=1 || value<=7;
+ }
+ return true;
}
-
- 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 newYQ(int y, int q){ return new Date(SCHEME_YQ, new
int[]{y, q}); }
-
+ static private ValueException invalid(String part, int value) {
+ return new ValueException("Invalid "+part+": "+value);
+ }
- static public Date newDate(String schemeStr, int[] parts) throws
ValueException{
- int scheme = getScheme(schemeStr);
- return new Date(scheme, parts);
- }
- static public Date newDate(int scheme, int[] parts) throws ValueException{
- checkValidity(scheme, parts);
- return new Date(scheme, parts);
- }
- static public Date newDate(int scheme, Calendar cal) {
- int year = cal.get(Calendar.YEAR);
- switch(scheme){
- case SCHEME_Y: return newY(year);
- case SCHEME_YM: return newYM(year, cal.get(Calendar.MONTH)+1);
- case SCHEME_YMD: return newYMD(year, cal.get(Calendar.MONTH)+1,
cal.get(Calendar.DAY_OF_MONTH));
- case SCHEME_YQ: return newYQ(year, (cal.get(Calendar.MONTH)/3)+1);
+ static public class Scheme{
+ final public String name;
+ final int[] partIds;
+ Scheme(String name, int[] partIds){
+ this.name = name;
+ this.partIds = partIds;
+ }
+
+ int getPartIndex(int partId){
+ for(int i=0; i<partIds.length; i++){
+ if(partIds[i]==partId){
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ void setPart(int partId, int[] vs, int value){
+ int index = getPartIndex(partId);
+ vs[index] = value;
}
- throw new Error("!");
- }
+
+ Date newDate(Calendar cal) {
+ int[] parts = new int[partIds.length];
+ for(int i=0; i<partIds.length; i++){
+ parts[i] = partGet(partIds[i], cal);
+ }
+ return newDateNoCheck(parts);
+ }
+
+ Date newDate(int[] parts) throws ValueException{
+ // conservatively always checking, may skip this test in
certain situations
+ checkValidity(parts);
+ return newDateNoCheck(parts);
+ }
+ Date newDateNoCheck(int[] parts) {
+ return new Date(this, parts);
+ }
+
+ void checkValidity(int[] parts) throws ValueException{
+ int length = partIds.length;
+ if(length!=parts.length) throw new ValueException("Invalid number
of parts, expected "+length+", got "+parts.length);
+
+ for(int i=0; i<partIds.length; i++){
+ int partId = partIds[i];
+ int part = parts[i];
+ if(!partValid(partId, part)){
+ throw invalid(partName(partId), part);
+ }
+ }
+ }
+
+ }
- static private ValueException invalid(String part, int value) {
- return new ValueException("Invalid "+part+": "+value);
- }
+ 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_YQ = new Scheme("YQ", new
int[]{PART_YEAR, PART_QUARTER});
- static private void checkValidity(int scheme, int[] parts) throws
ValueException {
- int length = SCHEME_LENGTHS[scheme];
- if(length!=parts.length) throw new ValueException("Invalid number of
parts, expected "+length+", got "+parts.length);
-
- switch(scheme){
- case SCHEME_YMD:
- int day = getPart(PART_DAY,parts);
- // HACK should check
- if (day<1 || day>31) throw invalid("day", day);
-
- case SCHEME_YM:
- int month = getPart(PART_MONTH,parts);
- if (month<1 || month>12) throw invalid("month", month);
- break;
- case SCHEME_YQ:
- int quarter = getPart(PART_QUARTER,parts);
- if (quarter<1 || quarter>4) throw invalid("quarter", quarter);
- break;
+
+ static final private Scheme[] SCHEMES = {
+ SCHEME_Y,
+ SCHEME_YM,
+ SCHEME_YMD,
+ SCHEME_YQ
+ };
+
+ static public Scheme getScheme(String name) throws ValueException{
+ for(int i=0; i<SCHEMES.length; i++){
+ Scheme s = SCHEMES[i];
+ if(s.name.equals(name)){
+ return s;
+ }
}
+ throw new ValueException("No such date scheme: "+name);
}
-
+
// ... etc.
//static final public int SCHEME_YQW;
//static final public int SCHEME_YMD;
@@ -167,12 +197,8 @@
// static final public int PART_MONTH = 1;
// static final public int PART_DAY = 2;
//
- static int getCalendarPart(Calendar c, int index) {
- int r = c.get(index);
- if (index == Calendar.MONTH) r = r +1;
- return r;
- }
+
static Pattern p =
Pattern.compile("([0-9]{1,4})([q-])?([0-9]{1,2})?(-([0-9]{1,2}))?");
static public Date parseString(String s) throws ValueException{
Date r = tryParseString(s);
@@ -211,19 +237,19 @@
public String format() {
int year = expectPart(PART_YEAR);
- switch(scheme){
- case SCHEME_Y:
- return year+"";
- case SCHEME_YM:{
+ if(scheme==SCHEME_Y){
+ return year+"";
+ }
+ if(scheme==SCHEME_YM){
int month = expectPart(PART_MONTH);
- return year+"-"+padZero(month);
+ return year+"-"+padZero(month);
}
- case SCHEME_YMD: {
+ if(scheme==SCHEME_YMD){
int month = expectPart(PART_MONTH);
int day = expectPart(PART_DAY);
- return year+"-"+padZero(month)+"-"+padZero(day);
+ return year+"-"+padZero(month)+"-"+padZero(day);
}
- case SCHEME_YQ:
+ if(scheme==SCHEME_YQ){
int quarter = expectPart(PART_QUARTER);
return year+"q"+quarter;
}
@@ -232,24 +258,25 @@
- final int scheme;
+ final Scheme scheme;
final int[] parts;
- private Date(int scheme, int[] parts) {
+ private Date(Scheme scheme, int[] parts) {
this.scheme = scheme;
this.parts = parts;
}
- public boolean hasPart(int part) {
- if(part == PART_YEAR) return true;
- switch(scheme){
- case SCHEME_YMD:if(part == PART_DAY) return true;
- case SCHEME_YM: return part == PART_MONTH;
- case SCHEME_YQ: return part == PART_QUARTER;
- }
- return false;
+ public boolean hasPart(int partId) {
+ return scheme.getPartIndex(partId)!=-1;
}
+ public boolean hasPartExactly(int partId) {
+ if(hasPart(partId)) return true;
+ if(partId==PART_QUARTER) hasPart(PART_MONTH);
+ if(partId==PART_WEEKDAY) hasPart(PART_DAY);
+ return false;
+ }
+
private int getPartByIndex(int index, int default_){
if(index>=parts.length) return default_;
return parts[index];
@@ -257,12 +284,14 @@
public int getPart(int partId, int default_) {
if(!hasPart(partId)) return default_;
- int index = getPartIndex(partId);
+ int index = scheme.getPartIndex(partId);
return parts[index];
}
public int getPart(int partId) throws ValueException {
- if (!hasPart(partId)) throw new ValueException("No value for part:
"+getPartName(partId));
- int index = getPartIndex(partId);
+ if (!hasPart(partId)) {
+ return partGet(partId, asCalendar());
+ }
+ int index = scheme.getPartIndex(partId);
return parts[index];
}
public int getPartDefault(int part){
@@ -287,10 +316,10 @@
return 1;
}
public int expectPart(int part) {
- int index = getPartIndex(part);
+ int index = scheme.getPartIndex(part);
return parts[index];
}
- public int getScheme(){ return scheme; }
+ public Scheme getScheme(){ return scheme; }
private String padZero(int n) {
@@ -317,41 +346,32 @@
}
public Date as(String scheme) throws ValueException { return
as(getScheme(scheme)); }
- public Date as(int scheme2) throws ValueException {
+ public Date as(Scheme scheme2) throws ValueException {
if(this.scheme == scheme2) return this;
- int year = expectPart(PART_YEAR);
- switch(scheme2){
- case SCHEME_Y: return newY(year);
- case SCHEME_YM: return newYM(year, getPartDefault(PART_MONTH));
- case SCHEME_YMD: return newYMD(year, getPartDefault(PART_MONTH),
getPartDefault(PART_DAY));
- case SCHEME_YQ: return newYQ(year, getPartDefault(PART_QUARTER));
- }
- throw new ValueException("Cannot convert date
"+getSchemeName(scheme)+" to "+getSchemeName(scheme2));
+ return scheme2.newDate(asCalendar());
}
+
public Date with(int part, int value) throws ValueException {
if(hasPart(part)){
int[] r = new int[parts.length];
System.arraycopy(parts, 0, r, 0, r.length);
- setPart(part, r, value);
- return newDate(scheme, r);
+ scheme.setPart(part, r, value);
+ return scheme.newDate(r);
}else{
int year = expectPart(PART_YEAR);
- switch(scheme){
- case SCHEME_Y:
+ if(SCHEME_Y==scheme){
if(part==PART_MONTH) return newYM(year, value);
if(part==PART_QUARTER) return newYQ(year, value);
- break;
- case SCHEME_YM:
+ }else if(SCHEME_YM==scheme){
if(part==PART_DAY) return newYMD(year,
expectPart(PART_MONTH), value);
- break;
}
}
- throw new ValueException("Cannot derive "+getSchemeName(scheme)+" with
date part "+getPartName(part));
+ throw new ValueException("Cannot derive "+scheme.name+" with date part
"+partName(part));
}
public Date addPeriod(int part, int amount) throws ValueException{
- if(!hasPart(part)) throw new ValueException("Cannot add
"+getPartName(part)+" to "+ getSchemeName(scheme));
+ if(!hasPart(part)) throw new ValueException("Cannot add
"+partName(part)+" to "+ scheme.name);
Calendar c = asCalendar();
switch(part){
case PART_YEAR:
@@ -367,7 +387,7 @@
c.add(Calendar.DAY_OF_MONTH, amount);
break;
}
- return newDate(scheme, c);
+ return scheme.newDate(c);
}
public int diff(int part, Date from) throws ValueException{
int years = getPart(PART_YEAR)-from.getPart(PART_YEAR);
@@ -384,7 +404,7 @@
return years*4 +quarters;
}
- throw new Error("Unsupported dateDiff: "+getPartName(part));
+ throw new Error("Unsupported dateDiff: "+partName(part));
}
public int hashCode() {
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-08-23 11:21:39 UTC (rev 4541)
+++
branches/vexi3/org.vexi-library.value/src/main/java/org/vexi/value/Instant.java
2013-08-27 21:56:49 UTC (rev 4542)
@@ -107,7 +107,7 @@
}
public Date getDate(TimeZone timezone) {
- return Date.newDate(Date.SCHEME_YMD, asCalendar(timezone));
+ return Date.SCHEME_YMD.newDate(asCalendar(timezone));
}
public String getTime(TimeZone timezone) {
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-08-23 11:21:39 UTC (rev 4541)
+++
branches/vexi3/org.vexi-library.value/src/test/java/org/vexi/value/TestDate.java
2013-08-27 21:56:49 UTC (rev 4542)
@@ -74,4 +74,12 @@
public void testCompare() throws ValueException {
assertEquals(Date.newY(2000).compareTo(Date.newY(1999)), new
Long(2000).compareTo(new Long(1999)));
}
+
+
+ public void testWeekdays() throws ValueException {
+ assertEquals(7,Date.newYMD(2013,8,24).getPart(Date.PART_WEEKDAY)); //
Sat
+ assertEquals(1,Date.newYMD(2013,8,25).getPart(Date.PART_WEEKDAY)); //
Sun
+ assertEquals(2,Date.newYMD(2013,8,26).getPart(Date.PART_WEEKDAY)); //
Mon
+ assertEquals(3,Date.newYMD(2013,8,27).getPart(Date.PART_WEEKDAY)); //
Tue
+ }
}
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
Learn the latest--Visual Studio 2012, SharePoint 2013, SQL 2012, more!
Discover the easy way to master current and previous Microsoft technologies
and advance your career. Get an incredible 1,500+ hours of step-by-step
tutorial videos with LearnDevNow. Subscribe today and save!
http://pubads.g.doubleclick.net/gampad/clk?id=58040911&iu=/4140/ostg.clktrk
_______________________________________________
Vexi-svn mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/vexi-svn