[
https://issues.apache.org/jira/browse/JEXL-174?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14721005#comment-14721005
]
Dmitri Blinov edited comment on JEXL-174 at 8/29/15 8:03 AM:
-------------------------------------------------------------
Wow, here comes magic, now it's possible to work with j.u.Date as simply as
{{date.yyyy}} or may be {{date\["MM/yy/dd"\]}} or may be {{date.yyyy = 2016}}
or may be even {{date.dd += 3}}
{code}
protected Object getDateValue(Date date, String key) {
try {
if (key.equals("Time"))
return date.getTime();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
if ("yyyy".equals(key)) {
return cal.get(Calendar.YEAR);
} else if ("MM".equals(key)) {
return cal.get(Calendar.MONTH) + 1;
} else if ("dd".equals(key)) {
return cal.get(Calendar.DAY_OF_MONTH);
} else if ("HH".equals(key)) {
return cal.get(Calendar.HOUR_OF_DAY);
} else if ("mm".equals(key)) {
return cal.get(Calendar.MINUTE);
} else if ("ss".equals(key)) {
return cal.get(Calendar.SECOND);
} else if ("SSS".equals(key)) {
return cal.get(Calendar.MILLISECOND);
} else if ("E".equals(key)) {
return cal.get(Calendar.DAY_OF_WEEK);
} else if ("G".equals(key)) {
return cal.get(Calendar.ERA);
} else if ("z".equals(key)) {
return cal.getTimeZone().getID();
}
// Otherwise treat as format mask
DateFormatSymbols dfs = new DateFormatSymbols(Locale.getDefault());
SimpleDateFormat df = new SimpleDateFormat(key, dfs);
return (df == null) ? null : df.format(date);
} catch(Exception ex) {
return null;
}
}
protected Object setDateValue(Date date, String key, Object value) throws
Exception {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.setLenient(true);
if ("yyyy".equals(key)) {
cal.set(Calendar.YEAR, TypeCast.getInt(value));
} else if ("MM".equals(key)) {
cal.set(Calendar.MONTH, TypeCast.getInt(value) - 1);
} else if ("dd".equals(key)) {
cal.set(Calendar.DAY_OF_MONTH, TypeCast.getInt(value));
} else if ("HH".equals(key)) {
cal.set(Calendar.HOUR_OF_DAY, TypeCast.getInt(value));
} else if ("mm".equals(key)) {
cal.set(Calendar.MINUTE, TypeCast.getInt(value));
} else if ("ss".equals(key)) {
cal.set(Calendar.SECOND, TypeCast.getInt(value));
} else if ("SSS".equals(key)) {
cal.set(Calendar.MILLISECOND, TypeCast.getInt(value));
} else if ("G".equals(key)) {
cal.set(Calendar.ERA, TypeCast.getInt(value));
} else if ("z".equals(key)) {
cal.setTimeZone(TimeZone.getTimeZone(String.valueOf(value)));
}
date.setTime(cal.getTimeInMillis());
return date;
}
public Object propertyGet(Date date, Object identifier) {
return getDateValue(date, String.valueOf(identifier));
}
public Object propertySet(Date date, Object identifier, Object value)
throws Exception {
return setDateValue(date, String.valueOf(identifier), value);
}
public Object arrayGet(Date date, Object identifier) {
return getDateValue(date, String.valueOf(identifier));
}
public Object arraySet(Date date, Object identifier, Object value) throws
Exception {
return setDateValue(date, String.valueOf(identifier), value);
}
{code}
Note: The example does not contain TypeCast.getInt() method
was (Author: dmitri_blinov):
Wow, here comes magic, now it's possible to work with j.u.Date as simply as
{{date.yyyy}} or may be {{date\["MM/yy/dd"\]}} or may be {{date.yyyy = 2016}}
or may be even {{date.dd += 3}}
{code}
protected Object getDateValue(Date date, String key) {
try {
if (key.equals("Time"))
return date.getTime();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
if ("yyyy".equals(key)) {
return cal.get(Calendar.YEAR);
} else if ("MM".equals(key)) {
return cal.get(Calendar.MONTH) + 1;
} else if ("dd".equals(key)) {
return cal.get(Calendar.DAY_OF_MONTH);
} else if ("HH".equals(key)) {
return cal.get(Calendar.HOUR_OF_DAY);
} else if ("mm".equals(key)) {
return cal.get(Calendar.MINUTE);
} else if ("ss".equals(key)) {
return cal.get(Calendar.SECOND);
} else if ("SSS".equals(key)) {
return cal.get(Calendar.MILLISECOND);
} else if ("E".equals(key)) {
return cal.get(Calendar.DAY_OF_WEEK);
} else if ("G".equals(key)) {
return cal.get(Calendar.ERA);
} else if ("z".equals(key)) {
return cal.getTimeZone().getID();
}
// Otherwise treat as format mask
DateFormatSymbols dfs = new DateFormatSymbols(Locale.getDefault());
SimpleDateFormat df = new SimpleDateFormat(key, dfs);
return (df == null) ? null : df.format(date);
} catch(Exception ex) {
return null;
}
}
protected Object setDateValue(Date date, String key, Object value) throws
Exception {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.setLenient(true);
if ("yyyy".equals(key)) {
cal.set(Calendar.YEAR, TypeCast.getInt(value));
} else if ("MM".equals(key)) {
cal.set(Calendar.MONTH, TypeCast.getInt(value) - 1);
} else if ("dd".equals(key)) {
cal.set(Calendar.DAY_OF_MONTH, TypeCast.getInt(value));
} else if ("HH".equals(key)) {
cal.set(Calendar.HOUR_OF_DAY, TypeCast.getInt(value));
} else if ("mm".equals(key)) {
cal.set(Calendar.MINUTE, TypeCast.getInt(value));
} else if ("ss".equals(key)) {
cal.set(Calendar.SECOND, TypeCast.getInt(value));
} else if ("SSS".equals(key)) {
cal.set(Calendar.MILLISECOND, TypeCast.getInt(value));
} else if ("G".equals(key)) {
cal.set(Calendar.ERA, TypeCast.getInt(value));
} else if ("z".equals(key)) {
cal.setTimeZone(TimeZone.getTimeZone(String.valueOf(value)));
}
date.setTime(cal.getTimeInMillis());
return date;
}
public Object propertyGet(Date date, Object identifier) {
return getDateValue(date, String.valueOf(identifier));
}
public Object propertySet(Date date, Object identifier, Object value)
throws Exception {
return setDateValue(date, String.valueOf(identifier), value);
}
public Object arrayGet(Date date, Object identifier) {
return getDateValue(date, String.valueOf(identifier));
}
public Object arraySet(Date date, Object identifier, Object value) throws
Exception {
return setDateValue(date, String.valueOf(identifier), value);
}
{code}
Note: The following example does not contain TypeCast.getInt() method
> Overloadable property access operators
> --------------------------------------
>
> Key: JEXL-174
> URL: https://issues.apache.org/jira/browse/JEXL-174
> Project: Commons JEXL
> Issue Type: New Feature
> Affects Versions: 3.0
> Reporter: Dmitri Blinov
> Assignee: Henri Biestro
> Priority: Minor
> Fix For: 3.0
>
>
> In analogy with overloading operators like empty(), size() etc, provide a way
> to overload property "get" and "set" operators ([] and .), like
> {code}
> public Object getAt(Object obj, Object index) {...}
> public Object putAt(Object obj, Object index, Object value) {...}
> {code}
> Overloaded operators should be tried before any standard access stategy, ie
> MAP, POJO etc.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)