You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by fm...@apache.org on 2015/01/15 18:35:59 UTC

svn commit: r1652186 - in /sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly: extension/ impl/engine/extension/ impl/engine/extension/use/ impl/engine/runtime/ impl/filter/ render/

Author: fmeschbe
Date: Thu Jan 15 17:35:58 2015
New Revision: 1652186

URL: http://svn.apache.org/r1652186
Log:
FELIX-4313 Remove ExtensionInstance interface

The ExtensionInstance is an indirection from the RuntimeExtension which
turned out to not be needed since there is no instance state that has to
be kept. Hence removing ExtensionInstance and adding the call method
to RuntimeExtension.

Applied patch by Radu Cotescu (thanks a lot)

Removed:
    sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/extension/ExtensionInstance.java
Modified:
    sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/extension/RuntimeExtension.java
    sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/I18nRuntimeExtension.java
    sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/IncludeRuntimeExtension.java
    sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/ResourceRuntimeExtension.java
    sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/XSSRuntimeExtension.java
    sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/use/UseRuntimeExtension.java
    sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/runtime/RenderContextImpl.java
    sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/filter/FormatFilter.java
    sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/filter/JoinFilter.java
    sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/render/RenderContext.java

Modified: sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/extension/RuntimeExtension.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/extension/RuntimeExtension.java?rev=1652186&r1=1652185&r2=1652186&view=diff
==============================================================================
--- sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/extension/RuntimeExtension.java (original)
+++ sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/extension/RuntimeExtension.java Thu Jan 15 17:35:58 2015
@@ -37,9 +37,10 @@ public interface RuntimeExtension {
     String NAME = "org.apache.sling.scripting.sightly.extension.name";
 
     /**
-     * Provide an instance of this extension
+     * Call the {@code RuntimeExtension}
      * @param renderContext - the runtime context
+     * @param arguments - the call arguments
      * @return an extension instance
      */
-    ExtensionInstance provide(RenderContext renderContext);
+    Object call(RenderContext renderContext, Object... arguments);
 }

Modified: sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/I18nRuntimeExtension.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/I18nRuntimeExtension.java?rev=1652186&r1=1652185&r2=1652186&view=diff
==============================================================================
--- sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/I18nRuntimeExtension.java (original)
+++ sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/I18nRuntimeExtension.java Thu Jan 15 17:35:58 2015
@@ -33,7 +33,6 @@ import org.apache.sling.api.SlingHttpSer
 import org.apache.sling.api.scripting.SlingBindings;
 import org.apache.sling.api.scripting.SlingScriptHelper;
 import org.apache.sling.i18n.ResourceBundleProvider;
-import org.apache.sling.scripting.sightly.extension.ExtensionInstance;
 import org.apache.sling.scripting.sightly.extension.RuntimeExtension;
 import org.apache.sling.scripting.sightly.impl.filter.I18nFilter;
 import org.apache.sling.scripting.sightly.render.RenderContext;
@@ -50,50 +49,44 @@ public class I18nRuntimeExtension implem
     private static final Logger LOG = LoggerFactory.getLogger(I18nRuntimeExtension.class);
 
     @Override
-    public ExtensionInstance provide(final RenderContext renderContext) {
+    public Object call(final RenderContext renderContext, Object... arguments) {
+        ExtensionUtils.checkArgumentCount(I18nFilter.FUNCTION, arguments, 3);
+        String text = renderContext.toString(arguments[0]);
+        String locale = renderContext.toString(arguments[1]);
+        String hint = renderContext.toString(arguments[2]);
+        final Bindings bindings = renderContext.getBindings();
+        return get(bindings, text, locale, hint);
+    }
 
-        return new ExtensionInstance() {
-            @Override
-            public Object call(Object... arguments) {
-                ExtensionUtils.checkArgumentCount(I18nFilter.FUNCTION, arguments, 3);
-                String text = renderContext.toString(arguments[0]);
-                String locale = renderContext.toString(arguments[1]);
-                String hint = renderContext.toString(arguments[2]);
-                return get(text, locale, hint);
-            }
+    private String get(final Bindings bindings, String text, String locale, String hint) {
 
-            private String get(String text, String locale, String hint) {
-                final Bindings bindings = renderContext.getBindings();
-                final SlingScriptHelper slingScriptHelper = (SlingScriptHelper) bindings.get(SlingBindings.SLING);
-                final SlingHttpServletRequest request = (SlingHttpServletRequest) bindings.get(SlingBindings.REQUEST);
-                final ResourceBundleProvider resourceBundleProvider = slingScriptHelper.getService(ResourceBundleProvider.class);
-                if (resourceBundleProvider != null) {
-                    String key = text;
-                    if (StringUtils.isNotEmpty(hint)) {
-                        key += " ((" + hint + "))";
-                    }
-                    if (StringUtils.isEmpty(locale)) {
-                        Enumeration<Locale> requestLocales = request.getLocales();
-                        while (requestLocales.hasMoreElements()) {
-                            Locale l = requestLocales.nextElement();
-                            ResourceBundle resourceBundle = resourceBundleProvider.getResourceBundle(l);
-                            if (resourceBundle != null && resourceBundle.containsKey(key)) {
-                                return resourceBundle.getString(key);
-                            }
-                        }
-                    } else {
-                        Locale l = new Locale(locale);
-                        ResourceBundle resourceBundle = resourceBundleProvider.getResourceBundle(l);
-                        if (resourceBundle != null && resourceBundle.containsKey(key)) {
-                            return resourceBundle.getString(key);
-                        }
+        final SlingScriptHelper slingScriptHelper = (SlingScriptHelper) bindings.get(SlingBindings.SLING);
+        final SlingHttpServletRequest request = (SlingHttpServletRequest) bindings.get(SlingBindings.REQUEST);
+        final ResourceBundleProvider resourceBundleProvider = slingScriptHelper.getService(ResourceBundleProvider.class);
+        if (resourceBundleProvider != null) {
+            String key = text;
+            if (StringUtils.isNotEmpty(hint)) {
+                key += " ((" + hint + "))";
+            }
+            if (StringUtils.isEmpty(locale)) {
+                Enumeration<Locale> requestLocales = request.getLocales();
+                while (requestLocales.hasMoreElements()) {
+                    Locale l = requestLocales.nextElement();
+                    ResourceBundle resourceBundle = resourceBundleProvider.getResourceBundle(l);
+                    if (resourceBundle != null && resourceBundle.containsKey(key)) {
+                        return resourceBundle.getString(key);
                     }
                 }
-                LOG.warn("No translation found for string '{}' using expression provided locale '{}' or default locale '{}'",
-                        new String[] {text, locale, resourceBundleProvider.getDefaultLocale().getLanguage()});
-                return text;
+            } else {
+                Locale l = new Locale(locale);
+                ResourceBundle resourceBundle = resourceBundleProvider.getResourceBundle(l);
+                if (resourceBundle != null && resourceBundle.containsKey(key)) {
+                    return resourceBundle.getString(key);
+                }
             }
-
-        };
+        }
+        LOG.warn("No translation found for string '{}' using expression provided locale '{}' or default locale '{}'",
+                new String[] {text, locale, resourceBundleProvider.getDefaultLocale().getLanguage()});
+        return text;
     }
 }

Modified: sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/IncludeRuntimeExtension.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/IncludeRuntimeExtension.java?rev=1652186&r1=1652185&r2=1652186&view=diff
==============================================================================
--- sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/IncludeRuntimeExtension.java (original)
+++ sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/IncludeRuntimeExtension.java Thu Jan 15 17:35:58 2015
@@ -35,7 +35,6 @@ import org.apache.sling.api.SlingHttpSer
 import org.apache.sling.api.scripting.SlingBindings;
 import org.apache.sling.api.scripting.SlingScriptHelper;
 import org.apache.sling.api.servlets.ServletResolver;
-import org.apache.sling.scripting.sightly.extension.ExtensionInstance;
 import org.apache.sling.scripting.sightly.extension.RuntimeExtension;
 import org.apache.sling.scripting.sightly.impl.engine.runtime.SightlyRenderException;
 import org.apache.sling.scripting.sightly.impl.plugin.IncludePlugin;
@@ -48,7 +47,6 @@ import org.slf4j.LoggerFactory;
 @Properties({
         @Property(name = RuntimeExtension.NAME, value = IncludePlugin.FUNCTION)
 })
-@SuppressWarnings("unused")
 /**
  * Runtime support for including resources in a Sightly script through {@code data-sly-include}. For more details check the implementation
  * of the {@link org.apache.sling.scripting.sightly.impl.plugin.IncludePlugin}.
@@ -62,70 +60,62 @@ public class IncludeRuntimeExtension imp
 
 
     @Override
-    public ExtensionInstance provide(final RenderContext renderContext) {
+    public Object call(final RenderContext renderContext, Object... arguments) {
+        ExtensionUtils.checkArgumentCount(IncludePlugin.FUNCTION, arguments, 2);
+        String originalPath = renderContext.toString(arguments[0]);
+        Map options = (Map) arguments[1];
+        String path = buildPath(originalPath, options);
+        if (path == null) {
+            throw new SightlyRenderException("Path for include is empty");
+        }
+        StringWriter output = new StringWriter();
+        final Bindings bindings = renderContext.getBindings();
+        includeScript(bindings, path, new PrintWriter(output));
+        return output.toString();
 
-        return new ExtensionInstance() {
-
-            private final Bindings bindings = renderContext.getBindings();
-
-            @Override
-            public Object call(Object... arguments) {
-                ExtensionUtils.checkArgumentCount(IncludePlugin.FUNCTION, arguments, 2);
-                String originalPath = renderContext.toString(arguments[0]);
-                Map options = (Map) arguments[1];
-                String path = buildPath(originalPath, options);
-                if (path == null) {
-                    throw new SightlyRenderException("Path for include is empty");
-                }
-                StringWriter output = new StringWriter();
-                includeScript(path, new PrintWriter(output));
-                return output.toString();
-
-            }
+    }
 
-            private String buildPath(String path, Map options) {
-                if (StringUtils.isEmpty(path)) {
-                    path = (String) options.get(OPTION_FILE);
-                }
-                if (StringUtils.isEmpty(path)) {
-                    return null;
-                }
-                String prependPath = (String) options.get(OPTION_PREPEND_PATH);
-                String appendPath = (String) options.get(OPTION_APPEND_PATH);
-                if (StringUtils.isNotEmpty(prependPath)) {
-                    path = prependPath + path;
-                }
-                if (StringUtils.isNotEmpty(appendPath)) {
-                    path = path + appendPath;
-                }
-                return path;
-            }
+    private String buildPath(String path, Map options) {
+        if (StringUtils.isEmpty(path)) {
+            path = (String) options.get(OPTION_FILE);
+        }
+        if (StringUtils.isEmpty(path)) {
+            return null;
+        }
+        String prependPath = (String) options.get(OPTION_PREPEND_PATH);
+        String appendPath = (String) options.get(OPTION_APPEND_PATH);
+        if (StringUtils.isNotEmpty(prependPath)) {
+            path = prependPath + path;
+        }
+        if (StringUtils.isNotEmpty(appendPath)) {
+            path = path + appendPath;
+        }
+        return path;
+    }
 
-            private void includeScript(String script, PrintWriter out) {
-                if (StringUtils.isEmpty(script)) {
-                    LOG.error("Script path cannot be empty");
-                } else {
-                    SlingScriptHelper slingScriptHelper = (SlingScriptHelper) bindings.get(SlingBindings.SLING);
-                    ServletResolver servletResolver = slingScriptHelper.getService(ServletResolver.class);
-                    if (servletResolver != null) {
-                        SlingHttpServletRequest request = (SlingHttpServletRequest) bindings.get(SlingBindings.REQUEST);
-                        Servlet servlet = servletResolver.resolveServlet(request.getResource(), script);
-                        if (servlet != null) {
-                            try {
-                                SlingHttpServletResponse response = (SlingHttpServletResponse) bindings.get(SlingBindings.RESPONSE);
-                                PrintWriterResponseWrapper resWrapper = new PrintWriterResponseWrapper(out, response);
-                                servlet.service(request, resWrapper);
-                            } catch (Exception e) {
-                                LOG.error("Failed to include script {}", script, e);
-                            }
-                        } else {
-                            LOG.error("Failed to locate script {}", script);
-                        }
-                    } else {
-                        LOG.error("Sling ServletResolver service is unavailable, failed to include {}", script);
+    private void includeScript(final Bindings bindings, String script, PrintWriter out) {
+        if (StringUtils.isEmpty(script)) {
+            LOG.error("Script path cannot be empty");
+        } else {
+            SlingScriptHelper slingScriptHelper = (SlingScriptHelper) bindings.get(SlingBindings.SLING);
+            ServletResolver servletResolver = slingScriptHelper.getService(ServletResolver.class);
+            if (servletResolver != null) {
+                SlingHttpServletRequest request = (SlingHttpServletRequest) bindings.get(SlingBindings.REQUEST);
+                Servlet servlet = servletResolver.resolveServlet(request.getResource(), script);
+                if (servlet != null) {
+                    try {
+                        SlingHttpServletResponse response = (SlingHttpServletResponse) bindings.get(SlingBindings.RESPONSE);
+                        PrintWriterResponseWrapper resWrapper = new PrintWriterResponseWrapper(out, response);
+                        servlet.service(request, resWrapper);
+                    } catch (Exception e) {
+                        LOG.error("Failed to include script {}", script, e);
                     }
+                } else {
+                    LOG.error("Failed to locate script {}", script);
                 }
+            } else {
+                LOG.error("Sling ServletResolver service is unavailable, failed to include {}", script);
             }
-        };
+        }
     }
 }

Modified: sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/ResourceRuntimeExtension.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/ResourceRuntimeExtension.java?rev=1652186&r1=1652185&r2=1652186&view=diff
==============================================================================
--- sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/ResourceRuntimeExtension.java (original)
+++ sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/ResourceRuntimeExtension.java Thu Jan 15 17:35:58 2015
@@ -39,7 +39,6 @@ import org.apache.sling.api.resource.Res
 import org.apache.sling.api.resource.ResourceUtil;
 import org.apache.sling.api.resource.SyntheticResource;
 import org.apache.sling.api.scripting.SlingBindings;
-import org.apache.sling.scripting.sightly.extension.ExtensionInstance;
 import org.apache.sling.scripting.sightly.extension.RuntimeExtension;
 import org.apache.sling.scripting.sightly.impl.plugin.ResourcePlugin;
 import org.apache.sling.scripting.sightly.render.RenderContext;
@@ -69,173 +68,165 @@ public class ResourceRuntimeExtension im
     private static final String OPTION_REPLACE_SELECTORS = "replaceSelectors";
 
     @Override
-    public ExtensionInstance provide(final RenderContext renderContext) {
-        return new ExtensionInstance() {
+    @SuppressWarnings("unchecked")
+    public Object call(final RenderContext renderContext, Object... arguments) {
+        ExtensionUtils.checkArgumentCount(ResourcePlugin.FUNCTION, arguments, 2);
+        return provideResource(renderContext, arguments[0], (Map<String, Object>) arguments[1]);
+    }
 
-            private final Bindings bindings = renderContext.getBindings();
+    private String provideResource(final RenderContext renderContext, Object pathObj, Map<String, Object> options) {
+        Map<String, Object> opts = new HashMap<String, Object>(options);
+        String path = buildPath(pathObj, opts);
+        String resourceType = getAndRemoveOption(opts, OPTION_RESOURCE_TYPE);
+        final Bindings bindings = renderContext.getBindings();
+        handleSelectors(bindings, path, opts);
+        String dispatcherOptions = createDispatcherOptions(opts);
+        StringWriter writer = new StringWriter();
+        PrintWriter printWriter = new PrintWriter(writer);
+        includeResource(bindings, printWriter, path, dispatcherOptions, resourceType);
+        return writer.toString();
+    }
 
-            @Override
-            @SuppressWarnings("unchecked")
-            public Object call(Object... arguments) {
-                ExtensionUtils.checkArgumentCount(ResourcePlugin.FUNCTION, arguments, 2);
-                return provideResource(arguments[0], (Map<String, Object>) arguments[1]);
-            }
-
-            private String provideResource(Object pathObj, Map<String, Object> options) {
-                Map<String, Object> opts = new HashMap<String, Object>(options);
-                String path = buildPath(pathObj, opts);
-                String resourceType = getAndRemoveOption(opts, OPTION_RESOURCE_TYPE);
-                handleSelectors(path, opts);
-                String dispatcherOptions = createDispatcherOptions(opts);
-                StringWriter writer = new StringWriter();
-                PrintWriter printWriter = new PrintWriter(writer);
-                includeResource(printWriter, path, dispatcherOptions, resourceType);
-                return writer.toString();
-            }
-
-            private void handleSelectors(String path, Map<String, Object> options) {
-                String selectors = getAndRemoveOption(options, OPTION_SELECTORS);
-                if (StringUtils.isNotEmpty(selectors)) {
-                    // handle the selectors option
-                    options.put(OPTION_ADD_SELECTORS, selectors);
+    private void handleSelectors(final Bindings bindings, String path, Map<String, Object> options) {
+        String selectors = getAndRemoveOption(options, OPTION_SELECTORS);
+        if (StringUtils.isNotEmpty(selectors)) {
+            // handle the selectors option
+            options.put(OPTION_ADD_SELECTORS, selectors);
+            options.put(OPTION_REPLACE_SELECTORS, " ");
+        } else {
+            if (options.containsKey(OPTION_REMOVE_SELECTORS)) {
+                String removeSelectors = getAndRemoveOption(options, OPTION_REMOVE_SELECTORS);
+                if (StringUtils.isEmpty(removeSelectors)) {
                     options.put(OPTION_REPLACE_SELECTORS, " ");
                 } else {
-                    if (options.containsKey(OPTION_REMOVE_SELECTORS)) {
-                        String removeSelectors = getAndRemoveOption(options, OPTION_REMOVE_SELECTORS);
-                        if (StringUtils.isEmpty(removeSelectors)) {
-                            options.put(OPTION_REPLACE_SELECTORS, " ");
-                        } else {
-                            String currentSelectors = getSelectorsFromPath(path);
-                            if (StringUtils.isEmpty(currentSelectors)) {
-                                currentSelectors = ((SlingHttpServletRequest) bindings.get(SlingBindings.REQUEST)).getRequestPathInfo()
-                                        .getSelectorString();
-                            }
-                            if (StringUtils.isNotEmpty(currentSelectors)) {
-                                options.put(OPTION_REPLACE_SELECTORS, " ");
-                                String addSelectors = currentSelectors.replace(removeSelectors, "").replaceAll("\\.\\.", "\\.");
-                                if (addSelectors.startsWith(".")) {
-                                    addSelectors = addSelectors.substring(1);
-                                }
-                                if (addSelectors.endsWith(".")) {
-                                    addSelectors = addSelectors.substring(0, addSelectors.length() - 1);
-                                }
-                                options.put(OPTION_ADD_SELECTORS, addSelectors);
-                            }
+                    String currentSelectors = getSelectorsFromPath(path);
+                    if (StringUtils.isEmpty(currentSelectors)) {
+                        currentSelectors = ((SlingHttpServletRequest) bindings.get(SlingBindings.REQUEST)).getRequestPathInfo()
+                                .getSelectorString();
+                    }
+                    if (StringUtils.isNotEmpty(currentSelectors)) {
+                        options.put(OPTION_REPLACE_SELECTORS, " ");
+                        String addSelectors = currentSelectors.replace(removeSelectors, "").replaceAll("\\.\\.", "\\.");
+                        if (addSelectors.startsWith(".")) {
+                            addSelectors = addSelectors.substring(1);
+                        }
+                        if (addSelectors.endsWith(".")) {
+                            addSelectors = addSelectors.substring(0, addSelectors.length() - 1);
                         }
+                        options.put(OPTION_ADD_SELECTORS, addSelectors);
                     }
                 }
             }
+        }
+    }
 
-            private String buildPath(Object pathObj, Map<String, Object> options) {
-                String path = coerceString(pathObj);
-                String prependPath = getAndRemoveOption(options, OPTION_PREPEND_PATH);
-                String appendPath = getAndRemoveOption(options, OPTION_APPEND_PATH);
-                if (StringUtils.isEmpty(path)) {
-                    path = getOption(options, OPTION_PATH);
-                }
-                if (StringUtils.isNotEmpty(prependPath)) {
-                    path = prependPath + "/" + path;
-                }
-                if (StringUtils.isNotEmpty(appendPath)) {
-                    path = path + "/" + appendPath;
-                }
+    private String buildPath(Object pathObj, Map<String, Object> options) {
+        String path = coerceString(pathObj);
+        String prependPath = getAndRemoveOption(options, OPTION_PREPEND_PATH);
+        String appendPath = getAndRemoveOption(options, OPTION_APPEND_PATH);
+        if (StringUtils.isEmpty(path)) {
+            path = getOption(options, OPTION_PATH);
+        }
+        if (StringUtils.isNotEmpty(prependPath)) {
+            path = prependPath + "/" + path;
+        }
+        if (StringUtils.isNotEmpty(appendPath)) {
+            path = path + "/" + appendPath;
+        }
 
-                return path;
-            }
+        return path;
+    }
 
-            private String createDispatcherOptions(Map<String, Object> options) {
-                if (options == null || options.isEmpty()) {
-                    return null;
-                }
-                StringBuilder buffer = new StringBuilder();
-                boolean hasPreceding = false;
-                for (Map.Entry<String, Object> option : options.entrySet()) {
-                    if (hasPreceding) {
-                        buffer.append(", ");
-                    }
-                    String key = option.getKey();
-                    buffer.append(key).append("=");
-                    String strVal = coerceString(option.getValue());
-                    if (strVal == null) {
-                        strVal = "";
-                    }
-                    buffer.append(strVal);
-                    hasPreceding = true;
-                }
-                return buffer.toString();
-            }
+    private String createDispatcherOptions(Map<String, Object> options) {
+        if (options == null || options.isEmpty()) {
+            return null;
+        }
+        StringBuilder buffer = new StringBuilder();
+        boolean hasPreceding = false;
+        for (Map.Entry<String, Object> option : options.entrySet()) {
+            if (hasPreceding) {
+                buffer.append(", ");
+            }
+            String key = option.getKey();
+            buffer.append(key).append("=");
+            String strVal = coerceString(option.getValue());
+            if (strVal == null) {
+                strVal = "";
+            }
+            buffer.append(strVal);
+            hasPreceding = true;
+        }
+        return buffer.toString();
+    }
 
-            private String coerceString(Object obj) {
-                if (obj instanceof String) {
-                    return (String) obj;
-                }
-                return null;
-            }
+    private String coerceString(Object obj) {
+        if (obj instanceof String) {
+            return (String) obj;
+        }
+        return null;
+    }
 
-            private String getOption(Map<String, Object> options, String property) {
-                return (String) options.get(property);
-            }
+    private String getOption(Map<String, Object> options, String property) {
+        return (String) options.get(property);
+    }
 
-            private String getAndRemoveOption(Map<String, Object> options, String property) {
-                return (String) options.remove(property);
-            }
+    private String getAndRemoveOption(Map<String, Object> options, String property) {
+        return (String) options.remove(property);
+    }
 
-            private String getSelectorsFromPath(String path) {
-                String filePath;
-                if (path.contains("/")) {
-                    filePath = path.substring(path.lastIndexOf('/') + 1, path.length());
-                } else {
-                    filePath = path;
-                }
-                String[] parts = filePath.split("\\.");
-                if (parts.length > 2) {
-                    StringBuilder sb = new StringBuilder();
-                    for (int i = 1; i < parts.length - 1; i++) {
-                        sb.append(parts[i]);
-                        if (i != parts.length - 2) {
-                            sb.append(".");
-                        }
-                    }
-                    if (sb.length() > 0) {
-                        return sb.toString();
-                    }
+    private String getSelectorsFromPath(String path) {
+        String filePath;
+        if (path.contains("/")) {
+            filePath = path.substring(path.lastIndexOf('/') + 1, path.length());
+        } else {
+            filePath = path;
+        }
+        String[] parts = filePath.split("\\.");
+        if (parts.length > 2) {
+            StringBuilder sb = new StringBuilder();
+            for (int i = 1; i < parts.length - 1; i++) {
+                sb.append(parts[i]);
+                if (i != parts.length - 2) {
+                    sb.append(".");
                 }
-                return null;
             }
-
-            private void includeResource(PrintWriter out, String script, String dispatcherOptions, String resourceType) {
-                if (StringUtils.isEmpty(script)) {
-                    LOG.error("Script path cannot be empty");
-                } else {
-                    SlingHttpServletResponse customResponse = new PrintWriterResponseWrapper(out,
-                            (SlingHttpServletResponse) bindings.get(SlingBindings.RESPONSE));
-                    SlingHttpServletRequest request = (SlingHttpServletRequest) bindings.get(SlingBindings.REQUEST);
-                    script = normalizePath(request, script);
-
-                    Resource includeRes = request.getResourceResolver().resolve(script);
-                    if (includeRes instanceof NonExistingResource || includeRes.isResourceType(Resource.RESOURCE_TYPE_NON_EXISTING)) {
-                        includeRes = new SyntheticResource(request.getResourceResolver(), script, resourceType);
-                    }
-                    try {
-                        RequestDispatcherOptions opts = new RequestDispatcherOptions(dispatcherOptions);
-                        if (StringUtils.isNotEmpty(resourceType)) {
-                            opts.setForceResourceType(resourceType);
-                        }
-                        RequestDispatcher dispatcher = request.getRequestDispatcher(includeRes, opts);
-                        dispatcher.include(request, customResponse);
-                    } catch (Exception e) {
-                        LOG.error("Failed to include resource {}", script, e);
-                    }
-                }
+            if (sb.length() > 0) {
+                return sb.toString();
             }
+        }
+        return null;
+    }
 
-            private String normalizePath(SlingHttpServletRequest request, String path) {
-                if (!path.startsWith("/")) {
-                    path = request.getResource().getPath() + "/" + path;
-                }
-                return ResourceUtil.normalize(path);
+    private void includeResource(final Bindings bindings, PrintWriter out, String script, String dispatcherOptions, String resourceType) {
+        if (StringUtils.isEmpty(script)) {
+            LOG.error("Script path cannot be empty");
+        } else {
+            SlingHttpServletResponse customResponse = new PrintWriterResponseWrapper(out,
+                    (SlingHttpServletResponse) bindings.get(SlingBindings.RESPONSE));
+            SlingHttpServletRequest request = (SlingHttpServletRequest) bindings.get(SlingBindings.REQUEST);
+            script = normalizePath(request, script);
+
+            Resource includeRes = request.getResourceResolver().resolve(script);
+            if (includeRes instanceof NonExistingResource || includeRes.isResourceType(Resource.RESOURCE_TYPE_NON_EXISTING)) {
+                includeRes = new SyntheticResource(request.getResourceResolver(), script, resourceType);
+            }
+            try {
+                RequestDispatcherOptions opts = new RequestDispatcherOptions(dispatcherOptions);
+                if (StringUtils.isNotEmpty(resourceType)) {
+                    opts.setForceResourceType(resourceType);
+                }
+                RequestDispatcher dispatcher = request.getRequestDispatcher(includeRes, opts);
+                dispatcher.include(request, customResponse);
+            } catch (Exception e) {
+                LOG.error("Failed to include resource {}", script, e);
             }
+        }
+    }
 
-        };
+    private String normalizePath(SlingHttpServletRequest request, String path) {
+        if (!path.startsWith("/")) {
+            path = request.getResource().getPath() + "/" + path;
+        }
+        return ResourceUtil.normalize(path);
     }
 }

Modified: sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/XSSRuntimeExtension.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/XSSRuntimeExtension.java?rev=1652186&r1=1652185&r2=1652186&view=diff
==============================================================================
--- sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/XSSRuntimeExtension.java (original)
+++ sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/XSSRuntimeExtension.java Thu Jan 15 17:35:58 2015
@@ -31,7 +31,6 @@ import org.apache.felix.scr.annotations.
 import org.apache.felix.scr.annotations.Service;
 import org.apache.sling.api.SlingHttpServletRequest;
 import org.apache.sling.scripting.sightly.SightlyException;
-import org.apache.sling.scripting.sightly.extension.ExtensionInstance;
 import org.apache.sling.scripting.sightly.extension.RuntimeExtension;
 import org.apache.sling.scripting.sightly.impl.compiler.CompilerException;
 import org.apache.sling.scripting.sightly.impl.filter.XSSFilter;
@@ -57,78 +56,71 @@ public class XSSRuntimeExtension impleme
     private static final Pattern VALID_ATTRIBUTE = Pattern.compile("^[a-zA-Z_:][\\-a-zA-Z0-9_:\\.]*$");
 
     @Override
-    public ExtensionInstance provide(final RenderContext renderContext) {
-
+    public Object call(final RenderContext renderContext, Object... arguments) {
+        if (arguments.length < 2) {
+            throw new SightlyException(
+                    String.format("Extension %s requires at least %d arguments", XSSFilter.FUNCTION_NAME, 2));
+        }
+        Object original = arguments[0];
+        Object option = arguments[1];
+        Object hint = null;
+        if (arguments.length >= 3) {
+            hint = arguments[2];
+        }
+        MarkupContext markupContext = null;
+        if (option != null && option instanceof String) {
+            String name = (String) option;
+            markupContext = MarkupContext.lookup(name);
+        }
+        if (markupContext == MarkupContext.UNSAFE) {
+            return original;
+        }
+        if (markupContext == null) {
+            LOG.warn("Expression context {} is invalid, expression will be replaced by the empty string", option);
+            return "";
+        }
+        String text = renderContext.toString(original);
         final XSSAPI xssapi = obtainAPI(renderContext.getBindings());
+        return applyXSSFilter(xssapi, text, hint, markupContext);
+    }
+
+    private String applyXSSFilter(final XSSAPI xssapi, String text, Object hint, MarkupContext xssContext) {
+        if (xssContext.equals(MarkupContext.ATTRIBUTE) && hint instanceof String) {
+            String attributeName = (String) hint;
+            MarkupContext attrMarkupContext = getAttributeMarkupContext(attributeName);
+            return applyXSSFilter(xssapi, text, attrMarkupContext);
+        }
+        return applyXSSFilter(xssapi, text, xssContext);
+    }
 
-        return new ExtensionInstance() {
-            @Override
-            public Object call(Object... arguments) {
-                if (arguments.length < 2) {
-                    throw new SightlyException(
-                            String.format("Extension %s requires at least %d arguments", XSSFilter.FUNCTION_NAME, 2));
-                }
-                Object original = arguments[0];
-                Object option = arguments[1];
-                Object hint = null;
-                if (arguments.length >= 3) {
-                    hint = arguments[2];
-                }
-                MarkupContext markupContext = null;
-                if (option != null && option instanceof String) {
-                    String name = (String) option;
-                    markupContext = MarkupContext.lookup(name);
-                }
-                if (markupContext == MarkupContext.UNSAFE) {
-                    return original;
-                }
-                if (markupContext == null) {
-                    LOG.warn("Expression context {} is invalid, expression will be replaced by the empty string", option);
-                    return "";
-                }
-                String text = renderContext.toString(original);
-                return applyXSSFilter(text, hint, markupContext);
-            }
-
-            private String applyXSSFilter(String text, Object hint, MarkupContext xssContext) {
-                if (xssContext.equals(MarkupContext.ATTRIBUTE) && hint instanceof String) {
-                    String attributeName = (String) hint;
-                    MarkupContext attrMarkupContext = getAttributeMarkupContext(attributeName);
-                    return applyXSSFilter(text, attrMarkupContext);
-                }
-                return applyXSSFilter(text, xssContext);
-            }
-
-            private String applyXSSFilter(String text, MarkupContext xssContext) {
-                switch (xssContext) {
-                    case ATTRIBUTE:
-                        return xssapi.encodeForHTMLAttr(text);
-                    case COMMENT:
-                    case TEXT:
-                        return xssapi.encodeForHTML(text);
-                    case ATTRIBUTE_NAME:
-                        return escapeAttributeName(text);
-                    case NUMBER:
-                        return xssapi.getValidLong(text, 0).toString();
-                    case URI:
-                        return xssapi.getValidHref(text);
-                    case SCRIPT_TOKEN:
-                    case SCRIPT_COMMENT:
-                        return xssapi.getValidJSToken(text, "");
-                    case STYLE_TOKEN:
-                        return xssapi.getValidStyleToken(text, "");
-                    case SCRIPT_STRING:
-                        return xssapi.encodeForJSString(text);
-                    case STYLE_STRING:
-                        return xssapi.encodeForCSSString(text);
-                    case ELEMENT_NAME:
-                        return escapeElementName(text);
-                    case HTML:
-                        return xssapi.filterHTML(text);
-                }
-                return text; //todo: apply the rest of XSS filters
-            }
-        };
+    private String applyXSSFilter(final XSSAPI xssapi, String text, MarkupContext xssContext) {
+        switch (xssContext) {
+            case ATTRIBUTE:
+                return xssapi.encodeForHTMLAttr(text);
+            case COMMENT:
+            case TEXT:
+                return xssapi.encodeForHTML(text);
+            case ATTRIBUTE_NAME:
+                return escapeAttributeName(text);
+            case NUMBER:
+                return xssapi.getValidLong(text, 0).toString();
+            case URI:
+                return xssapi.getValidHref(text);
+            case SCRIPT_TOKEN:
+            case SCRIPT_COMMENT:
+                return xssapi.getValidJSToken(text, "");
+            case STYLE_TOKEN:
+                return xssapi.getValidStyleToken(text, "");
+            case SCRIPT_STRING:
+                return xssapi.encodeForJSString(text);
+            case STYLE_STRING:
+                return xssapi.encodeForCSSString(text);
+            case ELEMENT_NAME:
+                return escapeElementName(text);
+            case HTML:
+                return xssapi.filterHTML(text);
+        }
+        return text; //todo: apply the rest of XSS filters
     }
 
     private String escapeElementName(String original) {

Modified: sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/use/UseRuntimeExtension.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/use/UseRuntimeExtension.java?rev=1652186&r1=1652185&r2=1652186&view=diff
==============================================================================
--- sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/use/UseRuntimeExtension.java (original)
+++ sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/extension/use/UseRuntimeExtension.java Thu Jan 15 17:35:58 2015
@@ -36,7 +36,6 @@ import org.apache.felix.scr.annotations.
 import org.apache.felix.scr.annotations.ReferencePolicy;
 import org.apache.felix.scr.annotations.Service;
 import org.apache.sling.scripting.sightly.SightlyException;
-import org.apache.sling.scripting.sightly.extension.ExtensionInstance;
 import org.apache.sling.scripting.sightly.extension.RuntimeExtension;
 import org.apache.sling.scripting.sightly.impl.plugin.UsePlugin;
 import org.apache.sling.scripting.sightly.render.RenderContext;
@@ -64,33 +63,26 @@ public class UseRuntimeExtension impleme
     private final Map<ServiceReference, UseProvider> providersMap = new ConcurrentSkipListMap<ServiceReference, UseProvider>();
 
     @Override
-    @SuppressWarnings("unchecked")
-    public ExtensionInstance provide(final RenderContext renderContext) {
-        return new ExtensionInstance() {
-
-            @Override
-            public Object call(Object... arguments) {
-                if (arguments.length != 2) {
-                    throw new SightlyException("Use extension requires two arguments");
-                }
-                String identifier = renderContext.toString(arguments[0]);
-                if (StringUtils.isEmpty(identifier)) {
-                    return null;
-                }
-                Map<String, Object> useArgumentsMap = renderContext.toMap(arguments[1]);
-                Bindings useArguments = new SimpleBindings(Collections.unmodifiableMap(useArgumentsMap));
-                ArrayList<UseProvider> providers = new ArrayList<UseProvider>(providersMap.values());
-                ListIterator<UseProvider> iterator = providers.listIterator(providers.size());
-                while (iterator.hasPrevious()) {
-                    UseProvider provider = iterator.previous();
-                    ProviderOutcome outcome = provider.provide(identifier, renderContext, useArguments);
-                    if (outcome.isSuccess()) {
-                        return outcome.getResult();
-                    }
-                }
-                throw new SightlyException("No use provider could resolve identifier: " + identifier);
+    public Object call(final RenderContext renderContext, Object... arguments) {
+        if (arguments.length != 2) {
+            throw new SightlyException("Use extension requires two arguments");
+        }
+        String identifier = renderContext.toString(arguments[0]);
+        if (StringUtils.isEmpty(identifier)) {
+            return null;
+        }
+        Map<String, Object> useArgumentsMap = renderContext.toMap(arguments[1]);
+        Bindings useArguments = new SimpleBindings(Collections.unmodifiableMap(useArgumentsMap));
+        ArrayList<UseProvider> providers = new ArrayList<UseProvider>(providersMap.values());
+        ListIterator<UseProvider> iterator = providers.listIterator(providers.size());
+        while (iterator.hasPrevious()) {
+            UseProvider provider = iterator.previous();
+            ProviderOutcome outcome = provider.provide(identifier, renderContext, useArguments);
+            if (outcome.isSuccess()) {
+                return outcome.getResult();
             }
-        };
+        }
+        throw new SightlyException("No use provider could resolve identifier: " + identifier);
     }
 
     // OSGi ################################################################################################################################

Modified: sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/runtime/RenderContextImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/runtime/RenderContextImpl.java?rev=1652186&r1=1652185&r2=1652186&view=diff
==============================================================================
--- sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/runtime/RenderContextImpl.java (original)
+++ sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/engine/runtime/RenderContextImpl.java Thu Jan 15 17:35:58 2015
@@ -27,7 +27,6 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Enumeration;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
@@ -42,7 +41,6 @@ import org.apache.sling.api.resource.Res
 import org.apache.sling.api.resource.ValueMap;
 import org.apache.sling.scripting.sightly.Record;
 import org.apache.sling.scripting.sightly.SightlyException;
-import org.apache.sling.scripting.sightly.extension.ExtensionInstance;
 import org.apache.sling.scripting.sightly.extension.RuntimeExtension;
 import org.apache.sling.scripting.sightly.render.RenderContext;
 
@@ -62,7 +60,6 @@ public class RenderContextImpl implement
     private final Bindings bindings;
     private final Map<String, RuntimeExtension> mapping;
     private final ResourceResolver scriptResourceResolver;
-    private final Map<String, ExtensionInstance> instanceCache = new HashMap<String, ExtensionInstance>();
 
     public static ResourceResolver getScriptResourceResolver(RenderContext renderContext) {
         if (renderContext instanceof RenderContextImpl) {
@@ -93,21 +90,11 @@ public class RenderContextImpl implement
 
     @Override
     public Object call(String functionName, Object... arguments) {
-        ExtensionInstance instance;
-        instance = instanceCache.get(functionName);
-        if (instance == null) {
-            instance = createInstance(functionName);
-            instanceCache.put(functionName, instance);
-        }
-        return instance.call(arguments);
-    }
-
-    private ExtensionInstance createInstance(String name) {
-        RuntimeExtension extension = mapping.get(name);
+        RuntimeExtension extension = mapping.get(functionName);
         if (extension == null) {
-            throw new SightlyRenderException("Runtime extension is not available: " + name);
+            throw new SightlyRenderException("Runtime extension is not available: " + functionName);
         }
-        return extension.provide(this);
+        return extension.call(this, arguments);
     }
 
     @Override

Modified: sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/filter/FormatFilter.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/filter/FormatFilter.java?rev=1652186&r1=1652185&r2=1652186&view=diff
==============================================================================
--- sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/filter/FormatFilter.java (original)
+++ sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/filter/FormatFilter.java Thu Jan 15 17:35:58 2015
@@ -27,7 +27,6 @@ import org.apache.felix.scr.annotations.
 import org.apache.felix.scr.annotations.Property;
 import org.apache.felix.scr.annotations.Service;
 import org.apache.sling.scripting.sightly.SightlyException;
-import org.apache.sling.scripting.sightly.extension.ExtensionInstance;
 import org.apache.sling.scripting.sightly.extension.RuntimeExtension;
 import org.apache.sling.scripting.sightly.impl.compiler.expression.Expression;
 import org.apache.sling.scripting.sightly.impl.compiler.expression.ExpressionNode;
@@ -62,56 +61,50 @@ public class FormatFilter extends Filter
     }
 
     @Override
-    public ExtensionInstance provide(final RenderContext renderContext) {
-
-        return new ExtensionInstance() {
-            @Override
-            public Object call(Object... arguments) {
-                if (arguments.length != 2) {
-                    throw new SightlyException("Format function must be called with two arguments");
-                }
-                String source = renderContext.toString(arguments[0]);
-                Object[] params = decodeParams(arguments[1]);
-                return replace(source, params);
-            }
+    public Object call(final RenderContext renderContext, Object... arguments) {
+        if (arguments.length != 2) {
+            throw new SightlyException("Format function must be called with two arguments");
+        }
+        String source = renderContext.toString(arguments[0]);
+        Object[] params = decodeParams(renderContext, arguments[1]);
+        return replace(renderContext, source, params);
+    }
 
-            private Object[] decodeParams(Object paramObj) {
-                if (renderContext.isCollection(paramObj)) {
-                    return renderContext.toCollection(paramObj).toArray();
-                }
-                return new Object[] {paramObj};
-            }
+    private Object[] decodeParams(final RenderContext renderContext, Object paramObj) {
+        if (renderContext.isCollection(paramObj)) {
+            return renderContext.toCollection(paramObj).toArray();
+        }
+        return new Object[] {paramObj};
+    }
 
-            private String replace(String source, Object[] params) {
-                Matcher matcher = PLACEHOLDER_REGEX.matcher(source);
-                StringBuilder builder = new StringBuilder();
-                int lastPos = 0;
-                boolean matched = true;
-                while (matched) {
-                    matched = matcher.find();
-                    if (matched) {
-                        int paramIndex = placeholderIndex(matcher.group());
-                        String replacement = param(params, paramIndex);
-                        int matchStart = matcher.start();
-                        int matchEnd = matcher.end();
-                        builder.append(source, lastPos, matchStart).append(replacement);
-                        lastPos = matchEnd;
-                    }
-                }
-                builder.append(source, lastPos, source.length());
-                return builder.toString();
+    private String replace(final RenderContext renderContext, String source, Object[] params) {
+        Matcher matcher = PLACEHOLDER_REGEX.matcher(source);
+        StringBuilder builder = new StringBuilder();
+        int lastPos = 0;
+        boolean matched = true;
+        while (matched) {
+            matched = matcher.find();
+            if (matched) {
+                int paramIndex = placeholderIndex(matcher.group());
+                String replacement = param(renderContext, params, paramIndex);
+                int matchStart = matcher.start();
+                int matchEnd = matcher.end();
+                builder.append(source, lastPos, matchStart).append(replacement);
+                lastPos = matchEnd;
             }
+        }
+        builder.append(source, lastPos, source.length());
+        return builder.toString();
+    }
 
-            private String param(Object[] params, int index) {
-                if (index >= 0 && index < params.length) {
-                    return renderContext.toString(params[index]);
-                }
-                return "";
-            }
+    private String param(final RenderContext renderContext, Object[] params, int index) {
+        if (index >= 0 && index < params.length) {
+            return renderContext.toString(params[index]);
+        }
+        return "";
+    }
 
-            private int placeholderIndex(String placeholder) {
-                return Integer.parseInt(placeholder.substring(1, placeholder.length() - 1));
-            }
-        };
+    private int placeholderIndex(String placeholder) {
+        return Integer.parseInt(placeholder.substring(1, placeholder.length() - 1));
     }
 }

Modified: sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/filter/JoinFilter.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/filter/JoinFilter.java?rev=1652186&r1=1652185&r2=1652186&view=diff
==============================================================================
--- sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/filter/JoinFilter.java (original)
+++ sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/filter/JoinFilter.java Thu Jan 15 17:35:58 2015
@@ -27,7 +27,6 @@ import org.apache.felix.scr.annotations.
 import org.apache.felix.scr.annotations.Property;
 import org.apache.felix.scr.annotations.Service;
 import org.apache.sling.scripting.sightly.SightlyException;
-import org.apache.sling.scripting.sightly.extension.ExtensionInstance;
 import org.apache.sling.scripting.sightly.extension.RuntimeExtension;
 import org.apache.sling.scripting.sightly.impl.compiler.expression.Expression;
 import org.apache.sling.scripting.sightly.impl.compiler.expression.ExpressionNode;
@@ -58,32 +57,25 @@ public class JoinFilter extends FilterCo
     }
 
     @Override
-    public ExtensionInstance provide(final RenderContext renderContext) {
-
-        return new ExtensionInstance() {
-            @Override
-            public Object call(Object... arguments) {
-                if (arguments.length != 2) {
-                    throw new SightlyException("Join function must be called with two arguments.");
-                }
-                Collection<?> collection = renderContext.toCollection(arguments[0]);
-                String joinString = renderContext.toString(arguments[1]);
-                return join(collection, joinString);
-            }
+    public Object call(final RenderContext renderContext, Object... arguments) {
+        if (arguments.length != 2) {
+            throw new SightlyException("Join function must be called with two arguments.");
+        }
+        Collection<?> collection = renderContext.toCollection(arguments[0]);
+        String joinString = renderContext.toString(arguments[1]);
+        return join(renderContext, collection, joinString);
+    }
 
-            private String join(Collection<?> collection, String joinString) {
-                StringBuilder sb = new StringBuilder();
-                Iterator<?> iterator = collection.iterator();
-                while (iterator.hasNext()) {
-                    String element = renderContext.toString(iterator.next());
-                    sb.append(element);
-                    if (iterator.hasNext()) {
-                        sb.append(joinString);
-                    }
-                }
-                return sb.toString();
+    private String join(final RenderContext renderContext, Collection<?> collection, String joinString) {
+        StringBuilder sb = new StringBuilder();
+        Iterator<?> iterator = collection.iterator();
+        while (iterator.hasNext()) {
+            String element = renderContext.toString(iterator.next());
+            sb.append(element);
+            if (iterator.hasNext()) {
+                sb.append(joinString);
             }
-        };
-
+        }
+        return sb.toString();
     }
 }

Modified: sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/render/RenderContext.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/render/RenderContext.java?rev=1652186&r1=1652185&r2=1652186&view=diff
==============================================================================
--- sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/render/RenderContext.java (original)
+++ sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/render/RenderContext.java Thu Jan 15 17:35:58 2015
@@ -23,7 +23,6 @@ import java.util.Map;
 
 import javax.script.Bindings;
 
-import org.apache.sling.scripting.sightly.extension.ExtensionInstance;
 import org.apache.sling.scripting.sightly.extension.RuntimeExtension;
 import org.apache.sling.scripting.sightly.impl.engine.runtime.RenderUnit;
 
@@ -47,7 +46,7 @@ public interface RenderContext {
      *
      * @param functionName the name under which the extension is registered
      * @param arguments    the extension's arguments
-     * @return the {@link ExtensionInstance}'s result
+     * @return the {@link RuntimeExtension}'s result
      */
     Object call(String functionName, Object... arguments);