SLING-6399 - Implement support for date and number formatting for HTL

* implemented support for the date and number formatting features from version 1.3
of the HTL Language Specification
* applied slightly modified patch submitted by Vlad Băilescu at https://github.com/apache/sling/pull/191
(Closes #191)

git-svn-id: https://svn.apache.org/repos/asf/sling/trunk@1774351 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/sling/scripting/sightly/render/AbstractRuntimeObjectModel.java b/src/main/java/org/apache/sling/scripting/sightly/render/AbstractRuntimeObjectModel.java
index a55b21f..e4f84b0 100644
--- a/src/main/java/org/apache/sling/scripting/sightly/render/AbstractRuntimeObjectModel.java
+++ b/src/main/java/org/apache/sling/scripting/sightly/render/AbstractRuntimeObjectModel.java
@@ -21,8 +21,10 @@
 import java.lang.reflect.Modifier;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Calendar;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Date;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -48,7 +50,6 @@
      */
     public static final Set<Class<?>> PRIMITIVE_CLASSES = Collections.unmodifiableSet(new HashSet<Class<?>>() {{
         add(Boolean.class);
-        add(Boolean.class);
         add(Character.class);
         add(Byte.class);
         add(Short.class);
@@ -67,6 +68,16 @@
     }
 
     @Override
+    public boolean isDate(Object target) {
+        return (target instanceof Date || target instanceof Calendar);
+    }
+
+    @Override
+    public boolean isNumber(Object target) {
+        return (target instanceof Number);
+    }
+
+    @Override
     public boolean isCollection(Object target) {
         return (target instanceof Collection) || (target instanceof Object[]) || (target instanceof Iterable) ||
                 (target instanceof Iterator);
@@ -96,6 +107,15 @@
         return 0;
     }
 
+    public Date toDate(Object object) {
+        if (object instanceof Date) {
+            return (Date)object;
+        } else if (object instanceof Calendar) {
+            return ((Calendar)object).getTime();
+        }
+        return new Date(0);
+    }
+
     @Override
     public String toString(Object target) {
         return objectToString(target);
@@ -368,4 +388,3 @@
     }
 
 }
-
diff --git a/src/main/java/org/apache/sling/scripting/sightly/render/RuntimeObjectModel.java b/src/main/java/org/apache/sling/scripting/sightly/render/RuntimeObjectModel.java
index 7d3076f..6d8f6e0 100644
--- a/src/main/java/org/apache/sling/scripting/sightly/render/RuntimeObjectModel.java
+++ b/src/main/java/org/apache/sling/scripting/sightly/render/RuntimeObjectModel.java
@@ -17,6 +17,7 @@
 package org.apache.sling.scripting.sightly.render;
 
 import java.util.Collection;
+import java.util.Date;
 import java.util.Map;
 
 import org.osgi.annotation.versioning.ProviderType;
@@ -44,6 +45,10 @@
      */
     boolean isCollection(Object target);
 
+    boolean isNumber(Object target);
+
+    boolean isDate(Object target);
+
     /**
      * Resolve a property of a target object and return its value. The property can
      * be either an index or a name
@@ -70,6 +75,8 @@
      */
     Number toNumber(Object object);
 
+    Date toDate(Object object);
+
     /**
      * Convert the given object to a string.
      *
diff --git a/src/main/java/org/apache/sling/scripting/sightly/render/package-info.java b/src/main/java/org/apache/sling/scripting/sightly/render/package-info.java
index 1e71397..a996756 100644
--- a/src/main/java/org/apache/sling/scripting/sightly/render/package-info.java
+++ b/src/main/java/org/apache/sling/scripting/sightly/render/package-info.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  ******************************************************************************/
-@Version("2.0.0")
+@Version("2.1.0")
 package org.apache.sling.scripting.sightly.render;
 
 import org.osgi.annotation.versioning.Version;