Author: bdelacretaz
Date: Thu May 15 07:46:26 2008
New Revision: 656687
URL: http://svn.apache.org/viewvc?rev=656687&view=rev
Log:
SLING-454 - javascript wrappers now output an ECMA-formatted String for the
default value of Properties of type Date
Added:
incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableCalendar.java
Modified:
incubator/sling/trunk/commons/json/src/main/java/org/apache/sling/commons/json/jcr/JsonItemWriter.java
incubator/sling/trunk/scripting/javascript/pom.xml
incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/RhinoJavaScriptEngineFactory.java
incubator/sling/trunk/scripting/javascript/src/test/java/org/apache/sling/scripting/wrapper/ScriptableNodeTest.java
Modified:
incubator/sling/trunk/commons/json/src/main/java/org/apache/sling/commons/json/jcr/JsonItemWriter.java
URL:
http://svn.apache.org/viewvc/incubator/sling/trunk/commons/json/src/main/java/org/apache/sling/commons/json/jcr/JsonItemWriter.java?rev=656687&r1=656686&r2=656687&view=diff
==============================================================================
---
incubator/sling/trunk/commons/json/src/main/java/org/apache/sling/commons/json/jcr/JsonItemWriter.java
(original)
+++
incubator/sling/trunk/commons/json/src/main/java/org/apache/sling/commons/json/jcr/JsonItemWriter.java
Thu May 15 07:46:26 2008
@@ -43,6 +43,13 @@
private static DateFormat calendarFormat;
private final Set<String> propertyNamesToIgnore;
+
+ /** Used to format date values */
+ public static final String ECMA_DATE_FORMAT = "EEE MMM dd yyyy HH:mm:ss
'GMT'Z";
+
+ /** Used to format date values */
+ public static final Locale DATE_FORMAT_LOCALE = Locale.US;
+
/**
* Create a JsonItemWriter
@@ -240,8 +247,7 @@
public static synchronized String format(Calendar date) {
if (calendarFormat == null) {
- calendarFormat = new SimpleDateFormat(
- "EEE MMM dd yyyy HH:mm:ss 'GMT'Z", Locale.US);
+ calendarFormat = new SimpleDateFormat(ECMA_DATE_FORMAT,
DATE_FORMAT_LOCALE);
}
return calendarFormat.format(date.getTime());
}
Modified: incubator/sling/trunk/scripting/javascript/pom.xml
URL:
http://svn.apache.org/viewvc/incubator/sling/trunk/scripting/javascript/pom.xml?rev=656687&r1=656686&r2=656687&view=diff
==============================================================================
--- incubator/sling/trunk/scripting/javascript/pom.xml (original)
+++ incubator/sling/trunk/scripting/javascript/pom.xml Thu May 15 07:46:26 2008
@@ -101,6 +101,11 @@
<scope>test</scope>
</dependency>
<dependency>
+ <groupId>org.apache.sling</groupId>
+ <artifactId>org.apache.sling.commons.json</artifactId>
+ <version>2.0.0-incubator-SNAPSHOT</version>
+ </dependency>
+ <dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</dependency>
Modified:
incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/RhinoJavaScriptEngineFactory.java
URL:
http://svn.apache.org/viewvc/incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/RhinoJavaScriptEngineFactory.java?rev=656687&r1=656686&r2=656687&view=diff
==============================================================================
---
incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/RhinoJavaScriptEngineFactory.java
(original)
+++
incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/RhinoJavaScriptEngineFactory.java
Thu May 15 07:46:26 2008
@@ -24,6 +24,7 @@
import org.apache.sling.scripting.javascript.helper.SlingContextFactory;
import org.apache.sling.scripting.javascript.helper.SlingWrapFactory;
import org.apache.sling.scripting.javascript.helper.SlingWrapper;
+import org.apache.sling.scripting.javascript.wrapper.ScriptableCalendar;
import org.apache.sling.scripting.javascript.wrapper.ScriptableItemMap;
import org.apache.sling.scripting.javascript.wrapper.ScriptableNode;
import org.apache.sling.scripting.javascript.wrapper.ScriptablePrintWriter;
@@ -55,7 +56,8 @@
ScriptableItemMap.class,
ScriptablePrintWriter.class,
ScriptableVersionHistory.class,
- ScriptableVersion.class
+ ScriptableVersion.class,
+ ScriptableCalendar.class
};
/** default log */
Added:
incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableCalendar.java
URL:
http://svn.apache.org/viewvc/incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableCalendar.java?rev=656687&view=auto
==============================================================================
---
incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableCalendar.java
(added)
+++
incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/wrapper/ScriptableCalendar.java
Thu May 15 07:46:26 2008
@@ -0,0 +1,105 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.scripting.javascript.wrapper;
+
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+
+import org.apache.sling.scripting.javascript.helper.SlingWrapper;
+import org.mozilla.javascript.ScriptRuntime;
+import org.mozilla.javascript.Scriptable;
+import org.mozilla.javascript.Undefined;
+import org.apache.sling.commons.json.jcr.JsonItemWriter;
+
[EMAIL PROTECTED]("serial")
+public class ScriptableCalendar extends ScriptableBase implements SlingWrapper
{
+
+ public static final String CLASSNAME = "Calendar";
+ private SimpleDateFormat calendarFormat;
+
+ /** Calendar is a class, not an interface - so we need to enumerate
possible implementations here */
+ public static final Class<?> [] WRAPPED_CLASSES = { Calendar.class,
GregorianCalendar.class };
+
+ private Calendar calendar;
+
+ public Class<?>[] getWrappedClasses() {
+ return WRAPPED_CLASSES;
+ }
+
+ public void jsConstructor(Object o) {
+ this.calendar = (Calendar) o;
+ }
+
+ @Override
+ public Object get(String name, Scriptable start) {
+
+ // builtin javascript properties (jsFunction_ etc.) have priority
+ final Object fromSuperclass = super.get(name, start);
+ if(fromSuperclass != Scriptable.NOT_FOUND) {
+ return fromSuperclass;
+ }
+
+ if(calendar == null) {
+ return Undefined.instance;
+ }
+
+ if("date".equals(name)) {
+ return ScriptRuntime.toObject(this, calendar.getTime());
+ }
+
+ return getNative(name, start);
+ }
+
+ @Override
+ protected Class<?> getStaticType() {
+ return Calendar.class;
+ }
+
+ @Override
+ protected Object getWrappedObject() {
+ return calendar;
+ }
+
+ @Override
+ public Class<?> jsGet_javascriptWrapperClass() {
+ return getClass();
+ }
+
+ @Override
+ public String getClassName() {
+ return CLASSNAME;
+ }
+
+ @Override
+ public String toString() {
+ if (calendarFormat == null) {
+ calendarFormat = new
SimpleDateFormat(JsonItemWriter.ECMA_DATE_FORMAT,
JsonItemWriter.DATE_FORMAT_LOCALE);
+ }
+ return calendarFormat.format(calendar.getTime());
+ }
+
+ public Object unwrap() {
+ return calendar;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public Object getDefaultValue(Class typeHint) {
+ return toString();
+ }
+}
Modified:
incubator/sling/trunk/scripting/javascript/src/test/java/org/apache/sling/scripting/wrapper/ScriptableNodeTest.java
URL:
http://svn.apache.org/viewvc/incubator/sling/trunk/scripting/javascript/src/test/java/org/apache/sling/scripting/wrapper/ScriptableNodeTest.java?rev=656687&r1=656686&r2=656687&view=diff
==============================================================================
---
incubator/sling/trunk/scripting/javascript/src/test/java/org/apache/sling/scripting/wrapper/ScriptableNodeTest.java
(original)
+++
incubator/sling/trunk/scripting/javascript/src/test/java/org/apache/sling/scripting/wrapper/ScriptableNodeTest.java
Thu May 15 07:46:26 2008
@@ -18,6 +18,7 @@
*/
package org.apache.sling.scripting.wrapper;
+import java.text.SimpleDateFormat;
import java.util.Calendar;
import javax.jcr.Node;
@@ -25,6 +26,7 @@
import org.apache.sling.scripting.RepositoryScriptingTestBase;
import org.apache.sling.scripting.ScriptEngineHelper;
+import org.apache.sling.commons.json.jcr.JsonItemWriter;
/** Test the ScriptableNode class "live", by retrieving
* Nodes from a Repository and executing javascript code
@@ -142,10 +144,26 @@
);
}
+ public void testDateWrapperClass() throws Exception {
+ assertEquals(
+
"org.apache.sling.scripting.javascript.wrapper.ScriptableCalendar",
+ script.eval("node.cal.javascriptWrapperClass.getName()", data)
+ );
+ }
+
public void testViaNodeDirectPropertyAccessCal() throws Exception {
+ final SimpleDateFormat f = new
SimpleDateFormat(JsonItemWriter.ECMA_DATE_FORMAT,
JsonItemWriter.DATE_FORMAT_LOCALE);
+ final String expected = f.format(testCal.getTime());
assertEquals(
- testCal,
- script.eval("node.cal", data)
+ expected,
+ script.evalToString("out.print(node.cal)", data)
+ );
+ }
+
+ public void testCalDateClass() throws Exception {
+ assertEquals(
+ "number",
+ script.evalToString("out.print(typeof node.cal.date.time)",
data)
);
}