Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Info
titleOSGi console plugin

Version 2.0.46 of the org.apache.sling.scripting.core bundle provides an OSGi console plugin that dynamically retrieves the actual scripting variable names and types, at /system/console/scriptingvariables

Sling's scripting variables and script languages

Table of Contents

Common scripting variables

...

Since JSPs already have a few Java-objects pre-defined, things have to be named differently here. And you will have to explicitly require the variables to be defined with a custom tag <sling:defineObjects />. Your jsp should start with:

Code Block

<%@ page session="false" %>
<%@ page import="javax.jcr.*,
        org.apache.sling.api.resource.Resource"
%>
<%@ taglib prefix="sling" uri="http://sling.apache.org/taglibs/sling/1.0" %>

<sling:defineObjects />

...

For example, to specify that the Logger object should be available as a scripting variable named logger (instead of log):

Code Block

<sling:defineObject logName="logger"/>

...

Instead of sling.include("/path/to/resource") you can use the sling taglib for that:

Code Block

<sling:include path="/path/to/resource" /> 

...

Here's a few of the objects and methods available in an ESP file:

Code Block
borderStyle
borderStylesolid
titlehtml.espsolid

<html>
<head><title>Sling ESP reference documentation</title>
</head>
<body>
	
<h2>Sling ESP documentation (work in progress)</h2>
<p>Have a look at this file's source or at Sling's ScriptableNodeTest.java</p><br/>
	
<%= 'tags: use \<%=  %\> to evaluate, \<%  %\> otherwise.' %>
<%  'e.g. this will not be printed'; %><br/>
<%

// create a new node under currentNode
var n = currentNode.addNode('n');
prt('path of n: ' + n.getPath());

// create new node and specify node type
var n2 = n.addNode('n2', 'nt:folder');

// set and get property
n.setProperty('thename', 'thevalue');
prt('get prop thename: ' + n['thename']               ); // thevalue
prt('another way: '      + n.thename                  ); // thevalue
prt('get type of n2:  '  + n2['jcr:primaryType']      ); // nt:folder
prt('test type of n2: '  + n2.isNodeType('nt:folder') ); // true

// iterate over properties
var props = n.getProperties();
for(i in props) { 
  prt('getProperties(): ' + props[i].name + ': ' + props[i].value.string); 
}

// getNodes()
n.addNode('abcd');
n.addNode('abcdef')
n.addNode('abcdefgh');
prt('get all nodes: ' +n.getNodes().length         ); // 4, incl n2	
prt('get abcd: '      +n.getNodes('abcd').length   ); // 1, abcd
prt('get abcde*: '    +n.getNodes('abcde*').length ); // 2, abcdef and abdefgh

// remove()
n.getNode('abcd').remove();
prt('removed abcd node ' + n.hasNode('abcd'));				// false

// get the root node (3 ways)
prt( currentNode.getAncestor(0));
prt( currentNode.session.getRootNode());
prt( currentNode.getSession().getRootNode());

// include the rendered result of another node (see Sling in 15 minutes)
// sling.include("/content/header", "forceResourceType=wiki.page,replaceSelectors=edit,replaceSuffix=validation");

function prt(s) { out.print(s+'<br/><br/>'); }
%>
</body>
</html>

...

An enhanced version of the GET.groovy script from http://sling.apache.org/site/groovy-support.html that shows all the variables and a little of what's groovy about Groovy.

Code Block

response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");

log.info "Groovin' on ${resource}"

def mb = new groovy.xml.MarkupBuilder(out)

mb.html {

   // Shouldn't javax.jcr.Property.getString() take care of this for us?
   def formatMultipleValues = { prop ->
      if (prop.definition.isMultiple()) {
         prop.values.string.join('; ')
      } else {
         prop.string
      }
   }
   
   def tableForMap = { cap, map ->
      table {
         caption { h2 cap }
         tr { th 'property' ; th 'value' }
         map.each { key, value -> tr { td key ; td value } }
      }
   }

   meta {
      title 'Groovy Scripting Sample for Sling'
   }
   body {
      h1 "Hello World !" 
      p "This is Groovy Speaking" 
      p "You requested the Resource ${resource} (yes, this is a GString)"

      // If we get called on a system file, then there won't be a currentNode binding.
      if (this.binding.variables.containsKey('currentNode')) {
         table {
            caption { h2 'Current Node Properties' }
            tr { th 'property' ; th 'value' }
            currentNode.properties.each { prop -> tr { td prop.name ; td formatMultipleValues(prop) } }
         }
      }
      tableForMap 'Resource Properties', resource.properties
      tableForMap 'Script Bindings', this.binding.variables
      tableForMap 'Request Properties', request.properties
   }
}

...