You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 4 Next »

As of r902947, Sling Scripting allows bundles to contribute objects to the variables available to scripts by exposing OSGi services.

This can be done by implementing either java.util.Map or org.apache.sling.scripting.api.BindingsValuesProvider. Implement org.apache.sling.scripting.api.BindingsValuesProvider if you need access to the current script variables.

In either case, implementations are able to add one or more name/value pairs to the javax.script.Bindings object, but they cannot overwrite or remove any of the default scripting variables (defined here: Scripting Variables). These custom bindings can be configured to apply to any scripting language or a specific scripting language.

An example of the binding of a custom object using java.util.Map can be found in the extensions.groovy bundle (source):

import org.apache.sling.commons.json.groovy.JSONGroovyBuilder;

/**
 * BindingsValuesProvider which binds an instance of JSONGroovyBuilder.
 *
 * @scr.component immediate="true" metatype="no"
 * @scr.service
 *
 * @scr.property name="service.description" value="JSONGroovyBuilder BindingsValuesProvider"
 * @scr.property name="service.vendor" value="The Apache Software Foundation"
 *
 * @scr.property name="javax.script.name" value="groovy"
 */
public class JSONGroovyBuilderBindingsValuesProvider extends HashMap<String,Object> {

    public JSONGroovyBuilderBindingsValuesProvider() {
        super();
        put("jsonBuilder", new JSONGroovyBuilder());
    }

}

In this example, the jsonBuilder key is bound to an instance of JSONGroovyBuilder only for Groovy scripts.

An example of the binding of a custom object using org.apache.sling.scripting.api.BindingsValuesProvider can be found in the jcr.resource bundle (source):

import javax.jcr.Node;
import javax.script.Bindings;

import org.apache.sling.api.resource.Resource;
import org.apache.sling.scripting.api.BindingsValuesProvider;

/**
 * BindingsValuesProvider for currentNode object.
 *
 * @scr.component immediate="true" metatype="no"
 * @scr.service
 *
 * @scr.property name="service.description" value="CurrentNode BindingsValuesProvider"
 * @scr.property name="service.vendor" value="The Apache Software Foundation"
 *
 * @scr.property name="javax.script.name" value="any"
 */
public class CurrentNodeBindingsValuesProvider implements BindingsValuesProvider {

    /**
     * {@inheritDoc}
     */
    public void addBindings(Bindings bindings) {
        Resource resource = (Resource) bindings.get("resource");
        Node node = resource.adaptTo(Node.class);
        if (node != null) {
            bindings.put("currentNode", node);
        }

    }

}
  • No labels