Author: radu Date: Wed Dec 14 22:13:32 2016 New Revision: 1774351 URL: http://svn.apache.org/viewvc?rev=1774351&view=rev Log: 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) Modified: sling/trunk/bundles/scripting/sightly/compiler/src/main/java/org/apache/sling/scripting/sightly/compiler/SightlyCompiler.java sling/trunk/bundles/scripting/sightly/compiler/src/main/java/org/apache/sling/scripting/sightly/compiler/expression/nodes/NumericConstant.java sling/trunk/bundles/scripting/sightly/compiler/src/main/java/org/apache/sling/scripting/sightly/impl/filter/FormatFilter.java sling/trunk/bundles/scripting/sightly/compiler/src/main/java/org/apache/sling/scripting/sightly/impl/filter/I18nFilter.java sling/trunk/bundles/scripting/sightly/compiler/src/test/java/org/apache/sling/scripting/sightly/impl/frontend/ExpressionWrapperTest.java sling/trunk/bundles/scripting/sightly/engine/pom.xml sling/trunk/bundles/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/FormatFilterExtension.java sling/trunk/bundles/scripting/sightly/java-compiler/src/main/java/org/apache/sling/scripting/sightly/render/AbstractRuntimeObjectModel.java sling/trunk/bundles/scripting/sightly/java-compiler/src/main/java/org/apache/sling/scripting/sightly/render/RuntimeObjectModel.java sling/trunk/bundles/scripting/sightly/java-compiler/src/main/java/org/apache/sling/scripting/sightly/render/package-info.java sling/trunk/bundles/scripting/sightly/testing-content/pom.xml sling/trunk/bundles/scripting/sightly/testing-content/src/main/java/org/apache/sling/scripting/sightly/testing/models/TestModel.java sling/trunk/bundles/scripting/sightly/testing-content/src/main/java/org/apache/sling/scripting/sightly/testing/use/Test.java sling/trunk/bundles/scripting/sightly/testing-content/src/main/java/org/apache/sling/scripting/sightly/testing/use/package-info.java sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightly/locales/de.json sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/Test.java sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/jsp-el.jsp sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/sly-java-pojo-bundle.html sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/sly-java-pojo-repo.html sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/sly-java-slingmodels.html sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/sly-js-async.html sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/sly-js-sync.html sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/test-async.js sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/test-sync.js sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/test.jsp sling/trunk/bundles/scripting/sightly/testing/pom.xml sling/trunk/bundles/scripting/sightly/testing/src/main/provisioning/model.txt Modified: sling/trunk/bundles/scripting/sightly/compiler/src/main/java/org/apache/sling/scripting/sightly/compiler/SightlyCompiler.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/compiler/src/main/java/org/apache/sling/scripting/sightly/compiler/SightlyCompiler.java?rev=1774351&r1=1774350&r2=1774351&view=diff ============================================================================== --- sling/trunk/bundles/scripting/sightly/compiler/src/main/java/org/apache/sling/scripting/sightly/compiler/SightlyCompiler.java (original) +++ sling/trunk/bundles/scripting/sightly/compiler/src/main/java/org/apache/sling/scripting/sightly/compiler/SightlyCompiler.java Wed Dec 14 22:13:32 2016 @@ -103,8 +103,8 @@ public final class SightlyCompiler { // register filters final List<Filter> filters = new ArrayList<>(5); - filters.add(FormatFilter.getInstance()); filters.add(I18nFilter.getInstance()); + filters.add(FormatFilter.getInstance()); filters.add(JoinFilter.getInstance()); filters.add(URIManipulationFilter.getInstance()); filters.add(XSSFilter.getInstance()); Modified: sling/trunk/bundles/scripting/sightly/compiler/src/main/java/org/apache/sling/scripting/sightly/compiler/expression/nodes/NumericConstant.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/compiler/src/main/java/org/apache/sling/scripting/sightly/compiler/expression/nodes/NumericConstant.java?rev=1774351&r1=1774350&r2=1774351&view=diff ============================================================================== --- sling/trunk/bundles/scripting/sightly/compiler/src/main/java/org/apache/sling/scripting/sightly/compiler/expression/nodes/NumericConstant.java (original) +++ sling/trunk/bundles/scripting/sightly/compiler/src/main/java/org/apache/sling/scripting/sightly/compiler/expression/nodes/NumericConstant.java Wed Dec 14 22:13:32 2016 @@ -49,7 +49,7 @@ public final class NumericConstant imple * @param value the number representation */ public NumericConstant(Number value) { - this.value = value.longValue(); + this.value = value; this.text = value.toString(); } @@ -80,11 +80,10 @@ public final class NumericConstant imple } private Number parseNumber(String s) { - try { - return Long.parseLong(s); - } catch (NumberFormatException e) { + if (s.contains(".")) { return Double.parseDouble(s); } + return Long.parseLong(s); } } Modified: sling/trunk/bundles/scripting/sightly/compiler/src/main/java/org/apache/sling/scripting/sightly/impl/filter/FormatFilter.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/compiler/src/main/java/org/apache/sling/scripting/sightly/impl/filter/FormatFilter.java?rev=1774351&r1=1774350&r2=1774351&view=diff ============================================================================== --- sling/trunk/bundles/scripting/sightly/compiler/src/main/java/org/apache/sling/scripting/sightly/impl/filter/FormatFilter.java (original) +++ sling/trunk/bundles/scripting/sightly/compiler/src/main/java/org/apache/sling/scripting/sightly/impl/filter/FormatFilter.java Wed Dec 14 22:13:32 2016 @@ -21,6 +21,7 @@ package org.apache.sling.scripting.sight import org.apache.sling.scripting.sightly.compiler.RuntimeFunction; import org.apache.sling.scripting.sightly.compiler.expression.Expression; import org.apache.sling.scripting.sightly.compiler.expression.ExpressionNode; +import org.apache.sling.scripting.sightly.compiler.expression.nodes.MapLiteral; import org.apache.sling.scripting.sightly.compiler.expression.nodes.RuntimeCall; /** @@ -29,6 +30,9 @@ import org.apache.sling.scripting.sightl public class FormatFilter extends AbstractFilter { public static final String FORMAT_OPTION = "format"; + public static final String TYPE_OPTION = "type"; + public static final String FORMAT_LOCALE_OPTION = "formatLocale"; + public static final String TIMEZONE_OPTION = "timezone"; private static final class FormatFilterLoader { private static final FormatFilter INSTANCE = new FormatFilter(); @@ -53,7 +57,13 @@ public class FormatFilter extends Abstra return expression; } ExpressionNode translation = - new RuntimeCall(RuntimeFunction.FORMAT, expression.getRoot(), expression.removeOption(FORMAT_OPTION)); + new RuntimeCall(RuntimeFunction.FORMAT, expression.getRoot(), + new MapLiteral(getFilterOptions(expression, + FORMAT_OPTION, + TYPE_OPTION, + I18nFilter.LOCALE_OPTION, + FORMAT_LOCALE_OPTION, + TIMEZONE_OPTION))); return expression.withNode(translation); } } Modified: sling/trunk/bundles/scripting/sightly/compiler/src/main/java/org/apache/sling/scripting/sightly/impl/filter/I18nFilter.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/compiler/src/main/java/org/apache/sling/scripting/sightly/impl/filter/I18nFilter.java?rev=1774351&r1=1774350&r2=1774351&view=diff ============================================================================== --- sling/trunk/bundles/scripting/sightly/compiler/src/main/java/org/apache/sling/scripting/sightly/impl/filter/I18nFilter.java (original) +++ sling/trunk/bundles/scripting/sightly/compiler/src/main/java/org/apache/sling/scripting/sightly/impl/filter/I18nFilter.java Wed Dec 14 22:13:32 2016 @@ -18,6 +18,8 @@ ******************************************************************************/ package org.apache.sling.scripting.sightly.impl.filter; +import java.util.Map; + import org.apache.sling.scripting.sightly.compiler.RuntimeFunction; import org.apache.sling.scripting.sightly.compiler.expression.Expression; import org.apache.sling.scripting.sightly.compiler.expression.ExpressionNode; @@ -55,9 +57,11 @@ public final class I18nFilter extends Ab == ExpressionContext.PLUGIN_DATA_SLY_TEMPLATE || expressionContext == ExpressionContext.PLUGIN_DATA_SLY_CALL) { return expression; } + Map <String, ExpressionNode> options = getFilterOptions(expression, HINT_OPTION, LOCALE_OPTION, BASENAME_OPTION); ExpressionNode translation = new RuntimeCall(RuntimeFunction.I18N, expression.getRoot(), new MapLiteral - (getFilterOptions(expression, HINT_OPTION, LOCALE_OPTION, BASENAME_OPTION))); + (options)); expression.removeOption(I18N_OPTION); + expression.getOptions().put(FormatFilter.FORMAT_LOCALE_OPTION, options.get(LOCALE_OPTION)); return expression.withNode(translation); } } Modified: sling/trunk/bundles/scripting/sightly/compiler/src/test/java/org/apache/sling/scripting/sightly/impl/frontend/ExpressionWrapperTest.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/compiler/src/test/java/org/apache/sling/scripting/sightly/impl/frontend/ExpressionWrapperTest.java?rev=1774351&r1=1774350&r2=1774351&view=diff ============================================================================== --- sling/trunk/bundles/scripting/sightly/compiler/src/test/java/org/apache/sling/scripting/sightly/impl/frontend/ExpressionWrapperTest.java (original) +++ sling/trunk/bundles/scripting/sightly/compiler/src/test/java/org/apache/sling/scripting/sightly/impl/frontend/ExpressionWrapperTest.java Wed Dec 14 22:13:32 2016 @@ -74,7 +74,7 @@ public class ExpressionWrapperTest { interpolation.addExpression(new Expression(new StringConstant("hello"), options)); ExpressionWrapper wrapper = new ExpressionWrapper(filters); Expression result = wrapper.transform(interpolation, MarkupContext.TEXT, ExpressionContext.TEXT); - List<ExpressionNode> xssArguments = runEmptyOptionsAndXSSAssertions(result); + List<ExpressionNode> xssArguments = runOptionsAndXSSAssertions(result, 1); RuntimeCall i18n = (RuntimeCall) xssArguments.get(0); assertEquals("Expected to I18n runtime function call.", RuntimeFunction.I18N, i18n.getFunctionName()); } @@ -90,7 +90,7 @@ public class ExpressionWrapperTest { interpolation.addExpression(new Expression(new StringConstant("Hello {0} {1}"), options)); ExpressionWrapper wrapper = new ExpressionWrapper(filters); Expression result = wrapper.transform(interpolation, MarkupContext.TEXT, ExpressionContext.TEXT); - List<ExpressionNode> xssArguments = runEmptyOptionsAndXSSAssertions(result); + List<ExpressionNode> xssArguments = runOptionsAndXSSAssertions(result, 0); RuntimeCall format = (RuntimeCall) xssArguments.get(0); assertEquals(RuntimeFunction.FORMAT, format.getFunctionName()); } @@ -106,7 +106,7 @@ public class ExpressionWrapperTest { interpolation.addExpression(new Expression(new ArrayLiteral(array), options)); ExpressionWrapper wrapper = new ExpressionWrapper(filters); Expression result = wrapper.transform(interpolation, MarkupContext.TEXT, ExpressionContext.TEXT); - List<ExpressionNode> xssArguments = runEmptyOptionsAndXSSAssertions(result); + List<ExpressionNode> xssArguments = runOptionsAndXSSAssertions(result, 0); RuntimeCall join = (RuntimeCall) xssArguments.get(0); assertEquals(RuntimeFunction.JOIN, join.getFunctionName()); } @@ -142,13 +142,13 @@ public class ExpressionWrapperTest { options)); ExpressionWrapper wrapper = new ExpressionWrapper(filters); Expression result = wrapper.transform(interpolation, MarkupContext.TEXT, ExpressionContext.TEXT); - List<ExpressionNode> xssArguments = runEmptyOptionsAndXSSAssertions(result); + List<ExpressionNode> xssArguments = runOptionsAndXSSAssertions(result, 0); RuntimeCall join = (RuntimeCall) xssArguments.get(0); assertEquals(RuntimeFunction.URI_MANIPULATION, join.getFunctionName()); } - private List<ExpressionNode> runEmptyOptionsAndXSSAssertions(Expression result) { - assertTrue("Expected empty options map for expression after processing.", result.getOptions().isEmpty()); + private List<ExpressionNode> runOptionsAndXSSAssertions(Expression result, int expectedOptions) { + assertEquals("Options map size for expression after processing is different from expected.", expectedOptions, result.getOptions().size()); RuntimeCall xss = (RuntimeCall) result.getRoot(); assertEquals("Expected XSS escaping applied to expression.", RuntimeFunction.XSS, xss.getFunctionName()); return xss.getArguments(); Modified: sling/trunk/bundles/scripting/sightly/engine/pom.xml URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/engine/pom.xml?rev=1774351&r1=1774350&r2=1774351&view=diff ============================================================================== --- sling/trunk/bundles/scripting/sightly/engine/pom.xml (original) +++ sling/trunk/bundles/scripting/sightly/engine/pom.xml Wed Dec 14 22:13:32 2016 @@ -170,7 +170,7 @@ <dependency> <groupId>org.apache.sling</groupId> <artifactId>org.apache.sling.scripting.sightly.compiler.java</artifactId> - <version>1.0.4</version> + <version>1.0.5-SNAPSHOT</version> <scope>provided</scope> </dependency> Modified: sling/trunk/bundles/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/FormatFilterExtension.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/FormatFilterExtension.java?rev=1774351&r1=1774350&r2=1774351&view=diff ============================================================================== --- sling/trunk/bundles/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/FormatFilterExtension.java (original) +++ sling/trunk/bundles/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/FormatFilterExtension.java Wed Dec 14 22:13:32 2016 @@ -18,9 +18,21 @@ ******************************************************************************/ package org.apache.sling.scripting.sightly.impl.engine.extension; +import java.text.DecimalFormat; +import java.text.DecimalFormatSymbols; +import java.text.NumberFormat; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.Locale; +import java.util.Map; +import java.util.TimeZone; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.apache.commons.lang.LocaleUtils; +import org.apache.commons.lang.StringUtils; +import org.apache.sling.scripting.sightly.SightlyException; import org.apache.sling.scripting.sightly.compiler.RuntimeFunction; import org.apache.sling.scripting.sightly.extension.RuntimeExtension; import org.apache.sling.scripting.sightly.render.RenderContext; @@ -36,14 +48,65 @@ import org.osgi.service.component.annota public class FormatFilterExtension implements RuntimeExtension { private static final Pattern PLACEHOLDER_REGEX = Pattern.compile("\\{\\d+}"); + private static final String FORMAT_OPTION = "format"; + private static final String TYPE_OPTION = "type"; + private static final String LOCALE_OPTION = "locale"; + private static final String FORMAT_LOCALE_OPTION = "formatLocale"; + private static final String TIMEZONE_OPTION = "timezone"; + + private static final String DATE_FORMAT_TYPE = "date"; + private static final String NUMBER_FORMAT_TYPE = "number"; + private static final String STRING_FORMAT_TYPE = "string"; @Override public Object call(final RenderContext renderContext, Object... arguments) { ExtensionUtils.checkArgumentCount(RuntimeFunction.FORMAT, arguments, 2); RuntimeObjectModel runtimeObjectModel = renderContext.getObjectModel(); String source = runtimeObjectModel.toString(arguments[0]); - Object[] params = decodeParams(runtimeObjectModel, arguments[1]); - return replace(runtimeObjectModel, source, params); + Map<String, Object> options = (Map<String, Object>) arguments[1]; + + String formattingType = runtimeObjectModel.toString(options.get(TYPE_OPTION)); + Object formatObject = options.get(FORMAT_OPTION); + boolean hasPlaceHolders = PLACEHOLDER_REGEX.matcher(source).find(); + if (STRING_FORMAT_TYPE.equals(formattingType)) { + Object[] params = decodeParams(runtimeObjectModel, formatObject); + return formatString(runtimeObjectModel, source, params); + } else if (DATE_FORMAT_TYPE.equals(formattingType) || (!hasPlaceHolders && runtimeObjectModel.isDate(formatObject))) { + Locale locale = getLocale(runtimeObjectModel, options); + TimeZone timezone = getTimezone(runtimeObjectModel, options); + return formatDate(source, runtimeObjectModel.toDate(formatObject), locale, timezone); + } else if (NUMBER_FORMAT_TYPE.equals(formattingType) || (!hasPlaceHolders && runtimeObjectModel.isNumber(formatObject))) { + Locale locale = getLocale(runtimeObjectModel, options); + return formatNumber(source, runtimeObjectModel.toNumber(formatObject), locale); + } + Object[] params = decodeParams(runtimeObjectModel, formatObject); + return formatString(runtimeObjectModel, source, params); + } + + private Locale getLocale(RuntimeObjectModel runtimeObjectModel, Map<String, Object> options) { + String localeOption = null; + if (options.containsKey(LOCALE_OPTION)) { + localeOption = runtimeObjectModel.toString(options.get(LOCALE_OPTION)); + } + if (localeOption == null && options.containsKey(FORMAT_LOCALE_OPTION)) { + localeOption = runtimeObjectModel.toString(options.get(FORMAT_LOCALE_OPTION)); + } + if (StringUtils.isNotBlank(localeOption)) { + return LocaleUtils.toLocale(localeOption); + } + return null; + } + + private TimeZone getTimezone(RuntimeObjectModel runtimeObjectModel, Map<String, Object> options) { + if ( options.containsKey(TIMEZONE_OPTION)) { + return TimeZone.getTimeZone(runtimeObjectModel.toString(options.get(TIMEZONE_OPTION))); + } else { + Object formatObject = options.get(FORMAT_OPTION); + if (formatObject instanceof Calendar) { + return ((Calendar)formatObject).getTimeZone(); + } + return TimeZone.getDefault(); + } } private Object[] decodeParams(RuntimeObjectModel runtimeObjectModel, Object paramObj) { @@ -53,7 +116,7 @@ public class FormatFilterExtension imple return new Object[] {paramObj}; } - private String replace(RuntimeObjectModel runtimeObjectModel, String source, Object[] params) { + private String formatString(RuntimeObjectModel runtimeObjectModel, String source, Object[] params) { Matcher matcher = PLACEHOLDER_REGEX.matcher(source); StringBuilder builder = new StringBuilder(); int lastPos = 0; @@ -63,7 +126,7 @@ public class FormatFilterExtension imple if (matched) { String group = matcher.group(); int paramIndex = Integer.parseInt(group.substring(1, group.length() - 1)); - String replacement = param(runtimeObjectModel, params, paramIndex); + String replacement = toString(runtimeObjectModel, params, paramIndex); int matchStart = matcher.start(); int matchEnd = matcher.end(); builder.append(source, lastPos, matchStart).append(replacement); @@ -74,10 +137,43 @@ public class FormatFilterExtension imple return builder.toString(); } - private String param(RuntimeObjectModel runtimeObjectModel, Object[] params, int index) { + private String toString(RuntimeObjectModel runtimeObjectModel, Object[] params, int index) { if (index >= 0 && index < params.length) { return runtimeObjectModel.toString(params[index]); } return ""; } + + private String formatDate(String format, Date date, Locale locale, TimeZone timezone) { + try { + SimpleDateFormat formatter; + if (locale != null) { + formatter = new SimpleDateFormat(format, locale); + } else { + formatter = new SimpleDateFormat(format); + } + if (timezone != null) { + formatter.setTimeZone(timezone); + } + return formatter.format(date); + } catch (Exception e) { + String error = String.format("Error during formatting of date %s with format %s, locale %s and timezone %s", date, format, locale, timezone); + throw new SightlyException( error, e); + } + } + + private String formatNumber(String format, Number number, Locale locale) { + try { + NumberFormat formatter; + if (locale != null) { + formatter = new DecimalFormat(format, new DecimalFormatSymbols(locale)); + } else { + formatter = new DecimalFormat(format); + } + return formatter.format(number); + } catch (Exception e) { + String error = String.format("Error during formatting of number %s with format %s and locale %s", number, format, locale); + throw new SightlyException( error, e); + } + } } Modified: sling/trunk/bundles/scripting/sightly/java-compiler/src/main/java/org/apache/sling/scripting/sightly/render/AbstractRuntimeObjectModel.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/java-compiler/src/main/java/org/apache/sling/scripting/sightly/render/AbstractRuntimeObjectModel.java?rev=1774351&r1=1774350&r2=1774351&view=diff ============================================================================== --- sling/trunk/bundles/scripting/sightly/java-compiler/src/main/java/org/apache/sling/scripting/sightly/render/AbstractRuntimeObjectModel.java (original) +++ sling/trunk/bundles/scripting/sightly/java-compiler/src/main/java/org/apache/sling/scripting/sightly/render/AbstractRuntimeObjectModel.java Wed Dec 14 22:13:32 2016 @@ -21,8 +21,10 @@ import java.lang.reflect.Method; 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 abstract class AbstractRuntimeObj */ 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 @@ public abstract class AbstractRuntimeObj } @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 @@ public abstract class AbstractRuntimeObj 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 @@ public abstract class AbstractRuntimeObj } } - Modified: sling/trunk/bundles/scripting/sightly/java-compiler/src/main/java/org/apache/sling/scripting/sightly/render/RuntimeObjectModel.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/java-compiler/src/main/java/org/apache/sling/scripting/sightly/render/RuntimeObjectModel.java?rev=1774351&r1=1774350&r2=1774351&view=diff ============================================================================== --- sling/trunk/bundles/scripting/sightly/java-compiler/src/main/java/org/apache/sling/scripting/sightly/render/RuntimeObjectModel.java (original) +++ sling/trunk/bundles/scripting/sightly/java-compiler/src/main/java/org/apache/sling/scripting/sightly/render/RuntimeObjectModel.java Wed Dec 14 22:13:32 2016 @@ -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 @@ public interface RuntimeObjectModel { */ 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 @@ public interface RuntimeObjectModel { */ Number toNumber(Object object); + Date toDate(Object object); + /** * Convert the given object to a string. * Modified: sling/trunk/bundles/scripting/sightly/java-compiler/src/main/java/org/apache/sling/scripting/sightly/render/package-info.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/java-compiler/src/main/java/org/apache/sling/scripting/sightly/render/package-info.java?rev=1774351&r1=1774350&r2=1774351&view=diff ============================================================================== --- sling/trunk/bundles/scripting/sightly/java-compiler/src/main/java/org/apache/sling/scripting/sightly/render/package-info.java (original) +++ sling/trunk/bundles/scripting/sightly/java-compiler/src/main/java/org/apache/sling/scripting/sightly/render/package-info.java Wed Dec 14 22:13:32 2016 @@ -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; Modified: sling/trunk/bundles/scripting/sightly/testing-content/pom.xml URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/testing-content/pom.xml?rev=1774351&r1=1774350&r2=1774351&view=diff ============================================================================== --- sling/trunk/bundles/scripting/sightly/testing-content/pom.xml (original) +++ sling/trunk/bundles/scripting/sightly/testing-content/pom.xml Wed Dec 14 22:13:32 2016 @@ -100,7 +100,7 @@ <artifactItem> <groupId>io.sightly</groupId> <artifactId>io.sightly.tck</artifactId> - <version>1.2.5</version> + <version>1.3.0-SNAPSHOT</version> <type>jar</type> <outputDirectory>${project.build.directory}/sightlytck/</outputDirectory> <includes>**/*.html,**/*.js,**/*.java</includes> @@ -187,6 +187,14 @@ </plugins> </build> + <repositories> + <repository> + <id>oss-sonatype</id> + <name>OSS Sonatype</name> + <url>https://oss.sonatype.org/content/repositories/snapshots</url> + </repository> + </repositories> + <dependencies> <!-- Test bundle dependencies --> <dependency> Modified: sling/trunk/bundles/scripting/sightly/testing-content/src/main/java/org/apache/sling/scripting/sightly/testing/models/TestModel.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/testing-content/src/main/java/org/apache/sling/scripting/sightly/testing/models/TestModel.java?rev=1774351&r1=1774350&r2=1774351&view=diff ============================================================================== --- sling/trunk/bundles/scripting/sightly/testing-content/src/main/java/org/apache/sling/scripting/sightly/testing/models/TestModel.java (original) +++ sling/trunk/bundles/scripting/sightly/testing-content/src/main/java/org/apache/sling/scripting/sightly/testing/models/TestModel.java Wed Dec 14 22:13:32 2016 @@ -16,6 +16,7 @@ ******************************************************************************/ package org.apache.sling.scripting.sightly.testing.models; +import java.util.Date; import java.util.Iterator; import javax.inject.Inject; @@ -72,4 +73,8 @@ public class TestModel { return resource.listChildren(); } + public Date getDate() { + return new Date(); + } + } Modified: sling/trunk/bundles/scripting/sightly/testing-content/src/main/java/org/apache/sling/scripting/sightly/testing/use/Test.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/testing-content/src/main/java/org/apache/sling/scripting/sightly/testing/use/Test.java?rev=1774351&r1=1774350&r2=1774351&view=diff ============================================================================== --- sling/trunk/bundles/scripting/sightly/testing-content/src/main/java/org/apache/sling/scripting/sightly/testing/use/Test.java (original) +++ sling/trunk/bundles/scripting/sightly/testing-content/src/main/java/org/apache/sling/scripting/sightly/testing/use/Test.java Wed Dec 14 22:13:32 2016 @@ -16,6 +16,7 @@ ******************************************************************************/ package org.apache.sling.scripting.sightly.testing.use; +import java.util.Date; import java.util.Iterator; import javax.script.Bindings; @@ -82,4 +83,8 @@ public class Test implements Use { public Iterator<Resource> getChildren() { return this.children; } + + public Date getDate() { + return new Date(); + } } \ No newline at end of file Modified: sling/trunk/bundles/scripting/sightly/testing-content/src/main/java/org/apache/sling/scripting/sightly/testing/use/package-info.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/testing-content/src/main/java/org/apache/sling/scripting/sightly/testing/use/package-info.java?rev=1774351&r1=1774350&r2=1774351&view=diff ============================================================================== --- sling/trunk/bundles/scripting/sightly/testing-content/src/main/java/org/apache/sling/scripting/sightly/testing/use/package-info.java (original) +++ sling/trunk/bundles/scripting/sightly/testing-content/src/main/java/org/apache/sling/scripting/sightly/testing/use/package-info.java Wed Dec 14 22:13:32 2016 @@ -15,7 +15,7 @@ * limitations under the License. ******************************************************************************/ -@Version("1.0.0") +@Version("1.1.0") package org.apache.sling.scripting.sightly.testing.use; import org.osgi.annotation.versioning.Version; Modified: sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightly/locales/de.json URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightly/locales/de.json?rev=1774351&r1=1774350&r2=1774351&view=diff ============================================================================== --- sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightly/locales/de.json (original) +++ sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightly/locales/de.json Wed Dec 14 22:13:32 2016 @@ -26,5 +26,20 @@ "jcr:primaryType": "sling:MessageEntry", "sling:key" : "the bank", "sling:message" : "das Ufer" + }, + "dayofweek" : { + "jcr:primaryType": "sling:MessageEntry", + "sling:key" : "'Day of week': EEEE", + "sling:message" : "'Wochentag': EEEE" + }, + "total" : { + "jcr:primaryType": "sling:MessageEntry", + "sling:key" : "Total: {0}", + "sling:message" : "Gesamtbetrag: {0}" + }, + "number" : { + "jcr:primaryType": "sling:MessageEntry", + "sling:key" : "##", + "sling:message" : "##.###" } } Modified: sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/Test.java URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/Test.java?rev=1774351&r1=1774350&r2=1774351&view=diff ============================================================================== --- sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/Test.java (original) +++ sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/Test.java Wed Dec 14 22:13:32 2016 @@ -18,6 +18,7 @@ ******************************************************************************/ package apps.sightlyperf.test; +import java.util.Date; import java.util.Iterator; import javax.script.Bindings; @@ -85,4 +86,8 @@ public class Test implements Use { public Iterator<Resource> getChildren() { return this.children; } + + public Date getDate() { + return new Date(); + } } \ No newline at end of file Modified: sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/jsp-el.jsp URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/jsp-el.jsp?rev=1774351&r1=1774350&r2=1774351&view=diff ============================================================================== --- sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/jsp-el.jsp (original) +++ sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/jsp-el.jsp Wed Dec 14 22:13:32 2016 @@ -1,4 +1,5 @@ <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> <%@ taglib prefix="sling" uri="http://sling.apache.org/taglibs/sling"%> <%--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -22,9 +23,11 @@ <sling:defineObjects /> <c:set var="properties" value="${sling:adaptTo(resource,'org.apache.sling.api.resource.ValueMap')}" /> <c:set var="tag" value="${sling:getValue(properties, 'tag', '')}" /> +<c:set var="now" value="<%=new java.util.Date()%>" /> <c:if test="${tag != ''}"><${tag}></c:if> ${sling:encode(sling:getValue(properties, 'text', resource.path), 'HTML')} <c:if test="${tag != ''}"></${tag}></c:if> +<fmt:formatDate pattern="yyyy-MM-dd HH:mm:ss.SSS" value="${now}" /> <sling:call script="mode.jsp" /> <c:if test="${sling:getValue(properties, 'includeChildren', false)}"> <ul> Modified: sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/sly-java-pojo-bundle.html URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/sly-java-pojo-bundle.html?rev=1774351&r1=1774350&r2=1774351&view=diff ============================================================================== --- sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/sly-java-pojo-bundle.html (original) +++ sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/sly-java-pojo-bundle.html Wed Dec 14 22:13:32 2016 @@ -20,6 +20,7 @@ ${test.tag != null ? test.startTag : '' @ context = "unsafe"} ${test.text @ context = "text"} ${test.tag != null ? test.endTag : '' @ context = "unsafe"} + ${'yyyy-MM-dd HH:mm:ss.SSS' @ format = test.date} <div data-sly-include="mode.jsp" data-sly-unwrap=""></div> <ul data-sly-test="${test.includeChildren}" data-sly-list.child="${test.children}"> <li data-sly-resource="${child.path}"></li> Modified: sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/sly-java-pojo-repo.html URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/sly-java-pojo-repo.html?rev=1774351&r1=1774350&r2=1774351&view=diff ============================================================================== --- sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/sly-java-pojo-repo.html (original) +++ sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/sly-java-pojo-repo.html Wed Dec 14 22:13:32 2016 @@ -20,6 +20,7 @@ ${test.tag != null ? test.startTag : '' @ context = "unsafe"} ${test.text @ context = "text"} ${test.tag != null ? test.endTag : '' @ context = "unsafe"} + ${'yyyy-MM-dd HH:mm:ss.SSS' @ format = test.date} <div data-sly-include="mode.jsp" data-sly-unwrap=""></div> <ul data-sly-test="${test.includeChildren}" data-sly-list.child="${test.children}"> <li data-sly-resource="${child.path}"></li> Modified: sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/sly-java-slingmodels.html URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/sly-java-slingmodels.html?rev=1774351&r1=1774350&r2=1774351&view=diff ============================================================================== --- sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/sly-java-slingmodels.html (original) +++ sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/sly-java-slingmodels.html Wed Dec 14 22:13:32 2016 @@ -20,6 +20,7 @@ ${test.tag != null ? test.startTag : '' @ context = "unsafe"} ${test.text @ context = "text"} ${test.tag != null ? test.endTag : '' @ context = "unsafe"} + ${'yyyy-MM-dd HH:mm:ss.SSS' @ format = test.date} <div data-sly-include="mode.jsp" data-sly-unwrap=""></div> <ul data-sly-test="${test.includeChildren}" data-sly-list.child="${test.children}"> <li data-sly-resource="${child.path}"></li> Modified: sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/sly-js-async.html URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/sly-js-async.html?rev=1774351&r1=1774350&r2=1774351&view=diff ============================================================================== --- sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/sly-js-async.html (original) +++ sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/sly-js-async.html Wed Dec 14 22:13:32 2016 @@ -20,6 +20,7 @@ ${test.tag != null ? test.startTag : '' @ context = "unsafe"} ${test.text @ context = "text"} ${test.tag != null ? test.endTag : '' @ context = "unsafe"} + ${'yyyy-MM-dd HH:mm:ss.SSS' @ format = test.date} <div data-sly-include="mode.jsp" data-sly-unwrap=""></div> <ul data-sly-test="${test.includeChildren}" data-sly-list.child="${test.children}"> <li data-sly-resource="${child.path}"></li> Modified: sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/sly-js-sync.html URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/sly-js-sync.html?rev=1774351&r1=1774350&r2=1774351&view=diff ============================================================================== --- sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/sly-js-sync.html (original) +++ sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/sly-js-sync.html Wed Dec 14 22:13:32 2016 @@ -18,6 +18,7 @@ ${test.tag != null ? test.startTag : '' @ context = "unsafe"} ${test.text @ context = "text"} ${test.tag != null ? test.endTag : '' @ context = "unsafe"} + ${'yyyy-MM-dd HH:mm:ss.SSS' @ format = test.date} <div data-sly-include="mode.jsp" data-sly-unwrap=""></div> <ul data-sly-test="${test.includeChildren}" data-sly-list.child="${test.children}"> <li data-sly-resource="${child.path}"></li> Modified: sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/test-async.js URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/test-async.js?rev=1774351&r1=1774350&r2=1774351&view=diff ============================================================================== --- sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/test-async.js (original) +++ sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/test-async.js Wed Dec 14 22:13:32 2016 @@ -28,6 +28,7 @@ use(function () { test.startTag = '<' + test.tag + '>'; test.endTag = '</' + test.tag + '>'; } + test.date = new Packages.java.util.Date(); test.includeChildren = properties.get('includeChildren') || false; if (test.includeChildren) { test.children = sightly.resource.getChildren(); Modified: sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/test-sync.js URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/test-sync.js?rev=1774351&r1=1774350&r2=1774351&view=diff ============================================================================== --- sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/test-sync.js (original) +++ sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/test-sync.js Wed Dec 14 22:13:32 2016 @@ -26,6 +26,7 @@ use(function () { test.startTag = '<' + test.tag + '>'; test.endTag = '</' + test.tag + '>'; } + test.date = new Packages.java.util.Date(); test.includeChildren = properties.get('includeChildren') || false; if (test.includeChildren) { test.children = resource.getChildren(); Modified: sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/test.jsp URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/test.jsp?rev=1774351&r1=1774350&r2=1774351&view=diff ============================================================================== --- sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/test.jsp (original) +++ sling/trunk/bundles/scripting/sightly/testing-content/src/main/resources/SLING-INF/apps/sightlyperf/test/test.jsp Wed Dec 14 22:13:32 2016 @@ -1,7 +1,9 @@ <%@ page import="org.apache.sling.api.resource.Resource" %> <%@ page import="org.apache.sling.api.resource.ValueMap" %> <%@ page import="org.apache.sling.xss.XSSAPI" %> +<%@ page import="java.util.Date" %> <%@ page import="java.util.Iterator" %> +<%@ page import="java.text.SimpleDateFormat" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> <%@ taglib prefix="sling" uri="http://sling.apache.org/taglibs/sling"%> @@ -36,8 +38,9 @@ if (tag != null) { out.println("</" + tag + ">"); } - + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); %> + <%=sdf.format(new Date())%> <sling:call script="mode.jsp" /> <% Modified: sling/trunk/bundles/scripting/sightly/testing/pom.xml URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/testing/pom.xml?rev=1774351&r1=1774350&r2=1774351&view=diff ============================================================================== --- sling/trunk/bundles/scripting/sightly/testing/pom.xml (original) +++ sling/trunk/bundles/scripting/sightly/testing/pom.xml Wed Dec 14 22:13:32 2016 @@ -379,13 +379,21 @@ </profile> </profiles> + <repositories> + <repository> + <id>oss-sonatype</id> + <name>OSS Sonatype</name> + <url>https://oss.sonatype.org/content/repositories/snapshots</url> + </repository> + </repositories> + <dependencies> <!-- The integration tests --> <dependency> <groupId>io.sightly</groupId> <artifactId>io.sightly.tck</artifactId> - <version>1.2.5</version> + <version>1.3.0-SNAPSHOT</version> <scope>test</scope> <exclusions> <exclusion> Modified: sling/trunk/bundles/scripting/sightly/testing/src/main/provisioning/model.txt URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/sightly/testing/src/main/provisioning/model.txt?rev=1774351&r1=1774350&r2=1774351&view=diff ============================================================================== --- sling/trunk/bundles/scripting/sightly/testing/src/main/provisioning/model.txt (original) +++ sling/trunk/bundles/scripting/sightly/testing/src/main/provisioning/model.txt Wed Dec 14 22:13:32 2016 @@ -20,8 +20,8 @@ # Dependencies [artifacts] org.apache.sling/org.apache.sling.launchpad/9-SNAPSHOT/slingstart - org.apache.sling/org.apache.sling.scripting.api/2.1.11-SNAPSHOT - org.apache.sling/org.apache.sling.scripting.core/2.0.43-SNAPSHOT + org.apache.sling/org.apache.sling.scripting.api/2.1.13-SNAPSHOT + org.apache.sling/org.apache.sling.scripting.core/2.0.45-SNAPSHOT org.apache.sling/org.apache.sling.scripting.sightly.compiler org.apache.sling/org.apache.sling.scripting.sightly.compiler.java org.apache.sling/org.apache.sling.scripting.sightly
