[ 
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)

Reply via email to