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 2014/11/28 11:18:09 UTC
svn commit: r1642281 [3/14] - in /sling/trunk/contrib/scripting/sightly: ./
engine/ engine/src/main/antlr4/org/apache/sling/parser/expr/generated/
engine/src/main/antlr4/org/apache/sling/scripting/
engine/src/main/antlr4/org/apache/sling/scripting/sigh...
Modified: sling/trunk/contrib/scripting/sightly/engine/pom.xml
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/sightly/engine/pom.xml?rev=1642281&r1=1642280&r2=1642281&view=diff
==============================================================================
--- sling/trunk/contrib/scripting/sightly/engine/pom.xml (original)
+++ sling/trunk/contrib/scripting/sightly/engine/pom.xml Fri Nov 28 10:18:01 2014
@@ -78,9 +78,6 @@
<configuration>
<instructions>
<Embed-Dependency>antlr4-runtime,org.abego.treelayout.core</Embed-Dependency>
- <Export-Package>
- org.apache.sling.scripting.sightly.api
- </Export-Package>
<ScriptEngine-Name>${project.name}</ScriptEngine-Name>
<ScriptEngine-Version>${project.version}</ScriptEngine-Version>
</instructions>
Added: sling/trunk/contrib/scripting/sightly/engine/src/main/antlr4/org/apache/sling/scripting/sightly/impl/parser/expr/generated/SightlyLexer.g4
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/sightly/engine/src/main/antlr4/org/apache/sling/scripting/sightly/impl/parser/expr/generated/SightlyLexer.g4?rev=1642281&view=auto
==============================================================================
--- sling/trunk/contrib/scripting/sightly/engine/src/main/antlr4/org/apache/sling/scripting/sightly/impl/parser/expr/generated/SightlyLexer.g4 (added)
+++ sling/trunk/contrib/scripting/sightly/engine/src/main/antlr4/org/apache/sling/scripting/sightly/impl/parser/expr/generated/SightlyLexer.g4 Fri Nov 28 10:18:01 2014
@@ -0,0 +1,120 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ******************************************************************************/
+lexer grammar SightlyLexer;
+
+ESC_EXPR: '\${'.*? '}';
+
+EXPR_START: '${' -> pushMode(ExpressionMode);
+
+TEXT_PART: .; //$hello ${expr}
+
+
+mode ExpressionMode;
+
+EXPR_END: '}' -> popMode;
+
+
+BOOL_CONSTANT: 'true' | 'false';
+
+DOT: '.';
+
+LBRACKET: '(';
+
+RBRACKET: ')';
+
+AND_OP: '&&';
+
+OR_OP: '||';
+
+NOT_OP: '!';
+
+COMMA: ',';
+
+ARRAY_START: '[';
+
+ARRAY_END: ']';
+
+ASSIGN: '=';
+
+OPTION_SEP: '@';
+
+TERNARY_Q_OP: '?';
+
+TERNARY_BRANCHES_OP: ':';
+
+LT: '<';
+
+LEQ: '<=';
+
+GEQ: '>=';
+
+GT: '>';
+
+EQ: '==';
+
+NEQ: '!=';
+
+// tokens
+
+ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|':')*
+ ;
+
+INT : '0'..'9'+
+ ;
+
+FLOAT
+ : ('0'..'9')+ '.' ('0'..'9')+ EXPONENT?
+// | '.' ('0'..'9')+ EXPONENT? --> conflicts with a.2 notation
+ | ('0'..'9')+ EXPONENT
+ ;
+
+COMMENT: '<!--/*' .*? '*/-->' -> skip;
+
+WS : ( ' '
+ | '\t'
+ | '\r'
+ | '\n'
+ ) -> skip
+ ;
+
+
+STRING
+ : '"' ( ESC_SEQ | ~('\\'|'"') )* '"'
+ | '\'' ( ESC_SEQ | ~('\\'|'\'') )* '\''
+ ;
+
+//CHAR: '\'' ( ESC_SEQ | ~('\''|'\\') ) '\''
+// ;
+
+fragment
+EXPONENT : ('e'|'E') ('+'|'-')? ('0'..'9')+ ;
+
+fragment
+HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ;
+
+fragment
+ESC_SEQ
+ : '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
+ | UNICODE_ESC
+ ;
+
+fragment
+UNICODE_ESC
+ : '\\' 'u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT
+ ;
Added: sling/trunk/contrib/scripting/sightly/engine/src/main/antlr4/org/apache/sling/scripting/sightly/impl/parser/expr/generated/SightlyParser.g4
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/sightly/engine/src/main/antlr4/org/apache/sling/scripting/sightly/impl/parser/expr/generated/SightlyParser.g4?rev=1642281&view=auto
==============================================================================
--- sling/trunk/contrib/scripting/sightly/engine/src/main/antlr4/org/apache/sling/scripting/sightly/impl/parser/expr/generated/SightlyParser.g4 (added)
+++ sling/trunk/contrib/scripting/sightly/engine/src/main/antlr4/org/apache/sling/scripting/sightly/impl/parser/expr/generated/SightlyParser.g4 Fri Nov 28 10:18:01 2014
@@ -0,0 +1,139 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ******************************************************************************/
+parser grammar SightlyParser;
+
+options {
+ language = Java;
+ tokenVocab = SightlyLexer;
+}
+
+@header {
+import org.apache.sling.scripting.sightly.impl.compiler.expression.node.*;
+import org.apache.sling.scripting.sightly.impl.compiler.expression.*;
+import org.apache.sling.scripting.sightly.impl.compiler.frontend.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Collections;
+}
+
+
+interpolation returns [Interpolation interp]
+@init { $interp = new Interpolation(); }
+ : (
+ textFrag { $interp.addText($textFrag.str); }
+ | expression { $interp.addExpression($expression.expr); }
+ )* //perhaphs too restrictive
+ ;
+
+textFrag returns [String str]
+@init { StringBuilder sb = new StringBuilder(); }
+ : (TEXT_PART { sb.append($TEXT_PART.text); })+
+ { $str = sb.toString(); }
+ | (ESC_EXPR { sb.append($ESC_EXPR.text); })+
+ { $str = sb.toString().substring(1); }
+ ;
+
+expression returns [Expression expr]
+@init { ExpressionNode exNode = NullLiteral.INSTANCE; Map<String, ExpressionNode> opts = Collections.emptyMap(); }
+ : EXPR_START (exprNode {exNode = $exprNode.node;})?
+ (OPTION_SEP optionList {opts = $optionList.options;})?
+ EXPR_END
+ { $expr = new Expression(exNode, opts); }
+ ;
+
+
+optionList returns [Map<String, ExpressionNode> options]
+@init { $options = new HashMap<String, ExpressionNode>(); }
+ : f=option { $options.put($f.name, ($f.value != null) ? $f.value : NullLiteral.INSTANCE); }
+ (COMMA r=option { $options.put($r.name, $r.value); })*
+ ;
+
+option returns [String name, ExpressionNode value]
+ : ID { $name = $ID.text; } (ASSIGN exprNode { $value = $exprNode.node; } )?
+ ;
+
+
+exprNode returns [ExpressionNode node]
+ : condition=binaryOp TERNARY_Q_OP thenBranch=binaryOp TERNARY_BRANCHES_OP elseBranch=binaryOp
+ {$node = new TernaryOperator($condition.node, $thenBranch.node, $elseBranch.node);}
+ | binaryOp {$node = $binaryOp.node;}
+ ;
+
+binaryOp returns [ExpressionNode node] //is there any priority precedence between AND & OR ?
+ : left=comparisonTerm { $node = $left.node; }
+ (operator right=comparisonTerm { $node = new BinaryOperation($operator.op, $node, $right.node); })*
+ ;
+
+operator returns [BinaryOperator op]
+ : AND_OP { $op = BinaryOperator.AND; } | OR_OP { $op = BinaryOperator.OR; }
+ ;
+
+comparisonTerm returns [ExpressionNode node]
+ : factor { $node = $factor.node; }
+ | left=factor comparisonOp right=factor { $node = new BinaryOperation($comparisonOp.op, $left.node, $right.node); }
+ ;
+
+comparisonOp returns [BinaryOperator op]
+ : GT { $op = BinaryOperator.GT; }
+ | LT { $op = BinaryOperator.LT; }
+ | LEQ { $op = BinaryOperator.LEQ; }
+ | GEQ { $op = BinaryOperator.GEQ; }
+ | EQ { $op = BinaryOperator.STRICT_EQ; }
+ | NEQ { $op = BinaryOperator.STRICT_NEQ; }
+ ;
+
+factor returns [ExpressionNode node]
+ : (pa=term { $node = $pa.node; })
+ | (NOT_OP notTerm=term { $node = new UnaryOperation(UnaryOperator.NOT, $notTerm.node); })
+ ;
+
+term returns [ExpressionNode node]
+ : simple { $node = $simple.node; }
+ ( ARRAY_START exprNode ARRAY_END { $node = new PropertyAccess($node, $exprNode.node); }
+ | DOT field { $node = new PropertyAccess($node, $field.node); })*
+ ;
+
+field returns [ExpressionNode node]
+ : ID { $node = new StringConstant($ID.getText()); }
+ ;
+
+simple returns [ExpressionNode node]
+ : atom { $node = $atom.node; }
+ | LBRACKET exprNode RBRACKET { $node = $exprNode.node; }
+ | ARRAY_START valueList ARRAY_END { $node = new ArrayLiteral($valueList.values); }
+ | ARRAY_START ARRAY_END { $node = new ArrayLiteral(Collections.<ExpressionNode>emptyList()); }
+ ;
+
+valueList returns [List<ExpressionNode> values]
+@init { $values = new ArrayList<ExpressionNode>(); }
+ : (f=exprNode { $values.add($f.node); }) (COMMA p=exprNode { $values.add($p.node); })*
+ ;
+
+atom returns [Atom node]
+ : stringConst { $node = $stringConst.node; }
+ | ID { $node = new Identifier($ID.text); }
+ | numText=(FLOAT | INT) { $node = new NumericConstant($numText.text); }
+ | boolText=BOOL_CONSTANT { $node = new BooleanConstant($boolText.text); }
+ ;
+
+stringConst returns [StringConstant node]
+ : STRING { $node = ParserHelper.createStringConstant($STRING.text); }
+ ;
Added: sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/Record.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/Record.java?rev=1642281&view=auto
==============================================================================
--- sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/Record.java (added)
+++ sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/Record.java Fri Nov 28 10:18:01 2014
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ******************************************************************************/
+
+package org.apache.sling.scripting.sightly;
+
+import java.util.Set;
+
+import aQute.bnd.annotation.ProviderType;
+
+/**
+ * A key-value immutable object understood by the Sightly runtime
+ * @param <T> the type of values for this record
+ */
+@ProviderType
+public interface Record<T> {
+
+ /**
+ * Get the value of the specified property
+ * @param name the name of the property
+ * @return the value of the property or null if this record does not
+ * have the specified property
+ */
+ T get(String name);
+
+ /**
+ * Get the set of properties for this record
+ * @return this record's properties
+ */
+ Set<String> properties();
+
+}
Propchange: sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/Record.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/ResourceResolution.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/ResourceResolution.java?rev=1642281&view=auto
==============================================================================
--- sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/ResourceResolution.java (added)
+++ sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/ResourceResolution.java Fri Nov 28 10:18:01 2014
@@ -0,0 +1,176 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ******************************************************************************/
+
+package org.apache.sling.scripting.sightly;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.resource.ResourceUtil;
+
+/**
+ * Utility class which used by the Sightly engine & extensions
+ * to resolve resources
+ */
+public final class ResourceResolution {
+
+ /**
+ * Maximum number of iterations that can be performed when searching for a resource in
+ * the resource superType chain
+ */
+ private static final int RECURSION_LIMIT = 100;
+
+ /**
+ * Resolve the resource with the given path relative to the base resource, using the
+ * resource super type logic
+ * @param resourceResolver The resource resolver to be used
+ * @param base the base resource. It can be null if path is absolute
+ * @param path the path to the resource
+ * @return the retrieved resource or null if no resource was found
+ * @throws java.lang.UnsupportedOperationException if the resource is not in the resource resolver's search path
+ * @throws java.lang.IllegalStateException if the number of steps necessary to search for the resource on the resource
+ * superType chain has reached the maximum limit
+ * @throws java.lang.IllegalArgumentException if a null componentResource is provided but the path is not absolute
+ */
+ public static Resource resolveComponentRelative(ResourceResolver resourceResolver, Resource base, String path) {
+ Resource componentResource = null;
+ if (base != null) {
+ if ("nt:file".equals(base.getResourceType())) {
+ componentResource = retrieveParent(resourceResolver, base);
+ } else {
+ componentResource = base;
+ }
+ }
+ return resolveComponent(resourceResolver, componentResource, path);
+ }
+
+ public static Resource resolveComponentForRequest(ResourceResolver resolver, SlingHttpServletRequest request) {
+ String resourceType = request.getResource().getResourceType();
+ if (StringUtils.isNotEmpty(resourceType)) {
+ if (resourceType.startsWith("/")) {
+ return resolver.getResource(resourceType);
+ }
+ for (String searchPath : resolver.getSearchPath()) {
+ String componentPath = ResourceUtil.normalize(searchPath + "/" + resourceType);
+ Resource componentResource = resolver.getResource(componentPath);
+ if (componentResource != null) {
+ return componentResource;
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Resolve the resource in the specified component
+ * @param resourceResolver The resource resolver to be used
+ * @param componentResource The resource for the component. It can be null if path is absolute
+ * @param path the path to the resource
+ * @return the retrieved resource or null if no resource was found
+ * @throws java.lang.UnsupportedOperationException if the resource is not in the resource resolver's search path
+ * @throws java.lang.IllegalStateException if more than {@link ResourceResolution#RECURSION_LIMIT} steps were
+ * necessary to search for the resource on the resource superType chain
+ * @throws java.lang.IllegalArgumentException if a null componentResource is provided but the path is not absolute
+ */
+ private static Resource resolveComponent(ResourceResolver resourceResolver, Resource componentResource, String path) {
+ if (resourceResolver == null || path == null) {
+ throw new NullPointerException("Arguments cannot be null");
+ }
+ Resource resource = null;
+ if (isAbsolutePath(path)) {
+ resource = resourceResolver.getResource(path);
+ }
+ if (resource == null) {
+ if (componentResource == null) {
+ throw new IllegalArgumentException("Argument cannot be null if path is not absolute: " + path);
+ }
+ resource = recursiveResolution(resourceResolver, componentResource, path);
+ }
+ if (resource == null) {
+ resource = locateInSearchPath(resourceResolver, path);
+ }
+ return resource != null ? searchPathChecked(resourceResolver, resource) : null;
+ }
+
+ private static Resource recursiveResolution(ResourceResolver resourceResolver, Resource componentResource, String path) {
+ for (int iteration = 0; iteration < RECURSION_LIMIT; iteration++) {
+ Resource resource = resourceResolver.getResource(componentResource, path);
+ if (resource != null) {
+ return resource;
+ }
+ componentResource = findSuperComponent(resourceResolver, componentResource);
+ if (componentResource == null) {
+ return null;
+ }
+ }
+ //at this point we have reached recursion limit
+ throw new IllegalStateException("Searching for resource in component chain took more than " +
+ RECURSION_LIMIT + " steps");
+ }
+
+ private static Resource locateInSearchPath(ResourceResolver resourceResolver, String path) {
+ for (String searchPath : resourceResolver.getSearchPath()) {
+ String fullPath = searchPath + path;
+ Resource resource = resourceResolver.getResource(fullPath);
+ if (resource != null && resource.getPath().startsWith(searchPath)) { //prevent path traversal attack
+ return resource;
+ }
+ }
+ return null;
+ }
+
+ private static boolean isInSearchPath(ResourceResolver resourceResolver, Resource resource) {
+ String resourcePath = resource.getPath();
+ for (String path : resourceResolver.getSearchPath()) {
+ if (resourcePath.startsWith(path)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private static Resource findSuperComponent(ResourceResolver resourceResolver, Resource base) {
+ String superType = resourceResolver.getParentResourceType(base);
+ if (superType == null) {
+ return null;
+ }
+ return resourceResolver.getResource(superType);
+ }
+
+ private static Resource searchPathChecked(ResourceResolver resourceResolver, Resource resource) {
+ if (!isInSearchPath(resourceResolver, resource)) {
+ throw new UnsupportedOperationException("Access to resource " + resource.getPath() + " is denied, since the resource does not reside on the search path");
+ }
+ return resource;
+ }
+
+ private static Resource retrieveParent(ResourceResolver resourceResolver, Resource resource) {
+ String parentPath = ResourceUtil.getParent(resource.getPath());
+ if (parentPath == null) {
+ return null;
+ }
+ return resourceResolver.getResource(parentPath);
+ }
+
+ private static boolean isAbsolutePath(String path) {
+ return path.startsWith("/");
+ }
+
+}
Propchange: sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/ResourceResolution.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/SightlyException.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/SightlyException.java?rev=1642281&view=auto
==============================================================================
--- sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/SightlyException.java (added)
+++ sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/SightlyException.java Fri Nov 28 10:18:01 2014
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ******************************************************************************/
+package org.apache.sling.scripting.sightly;
+
+import org.apache.sling.api.SlingException;
+
+/**
+ * Exceptions caused by the Sightly engine
+ */
+public class SightlyException extends SlingException {
+
+ public SightlyException() {
+ }
+
+ public SightlyException(String message) {
+ super(message);
+ }
+
+ public SightlyException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public SightlyException(Throwable cause) {
+ super(cause);
+ }
+}
Propchange: sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/SightlyException.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/extension/ExtensionInstance.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/extension/ExtensionInstance.java?rev=1642281&view=auto
==============================================================================
--- sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/extension/ExtensionInstance.java (added)
+++ sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/extension/ExtensionInstance.java Fri Nov 28 10:18:01 2014
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ******************************************************************************/
+package org.apache.sling.scripting.sightly.extension;
+
+import aQute.bnd.annotation.ConsumerType;
+
+/**
+ * An instance of an {@link RuntimeExtension}
+ */
+@ConsumerType
+public interface ExtensionInstance {
+
+ /**
+ * Call this specific extension
+ * @param arguments - the arguments for the call
+ * @return - the result from the call
+ */
+ Object call(Object ... arguments);
+
+}
Propchange: sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/extension/ExtensionInstance.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: 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=1642281&view=auto
==============================================================================
--- sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/extension/RuntimeExtension.java (added)
+++ sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/extension/RuntimeExtension.java Fri Nov 28 10:18:01 2014
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ******************************************************************************/
+package org.apache.sling.scripting.sightly.extension;
+
+import org.apache.sling.scripting.sightly.render.RenderContext;
+
+import aQute.bnd.annotation.ConsumerType;
+
+/**
+ * Extensions provided to the Sightly runtime
+ */
+@ConsumerType
+public interface RuntimeExtension {
+
+ String SCR_PROP_NAME = "org.apache.sling.scripting.sightly.extension.name";
+
+ /**
+ * Provide an instance of this extension
+ * @param renderContext - the runtime context
+ * @return an extension instance
+ */
+ ExtensionInstance provide(RenderContext renderContext);
+}
Propchange: sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/extension/RuntimeExtension.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/extension/RuntimeExtensionException.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/extension/RuntimeExtensionException.java?rev=1642281&view=auto
==============================================================================
--- sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/extension/RuntimeExtensionException.java (added)
+++ sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/extension/RuntimeExtensionException.java Fri Nov 28 10:18:01 2014
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ******************************************************************************/
+package org.apache.sling.scripting.sightly.extension;
+
+import org.apache.sling.scripting.sightly.SightlyException;
+
+/**
+ * Exception thrown by runtime extensions
+ * @see RuntimeExtension
+ */
+public class RuntimeExtensionException extends SightlyException {
+
+ public RuntimeExtensionException() {
+ }
+
+ public RuntimeExtensionException(String message) {
+ super(message);
+ }
+
+ public RuntimeExtensionException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public RuntimeExtensionException(Throwable cause) {
+ super(cause);
+ }
+}
Propchange: sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/extension/RuntimeExtensionException.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/extension/package-info.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/extension/package-info.java?rev=1642281&view=auto
==============================================================================
--- sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/extension/package-info.java (added)
+++ sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/extension/package-info.java Fri Nov 28 10:18:01 2014
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ******************************************************************************/
+@Version("1.0.0")
+package org.apache.sling.scripting.sightly.extension;
+
+import aQute.bnd.annotation.Version;
Propchange: sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/extension/package-info.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/CompilationOutput.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/CompilationOutput.java?rev=1642281&view=auto
==============================================================================
--- sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/CompilationOutput.java (added)
+++ sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/CompilationOutput.java Fri Nov 28 10:18:01 2014
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ******************************************************************************/
+
+package org.apache.sling.scripting.sightly.impl.compiled;
+
+import java.util.Map;
+
+/**
+ * Result from compilation
+ */
+public class CompilationOutput {
+
+ private final String mainBody;
+ private final Map<String, CompilationOutput> subTemplates;
+
+ public CompilationOutput(String mainBody, Map<String, CompilationOutput> subTemplates) {
+ this.mainBody = mainBody;
+ this.subTemplates = subTemplates;
+ }
+
+ public String getMainBody() {
+ return mainBody;
+ }
+
+ public Map<String, CompilationOutput> getSubTemplates() {
+ return subTemplates;
+ }
+}
Propchange: sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/CompilationOutput.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/ExpressionTranslator.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/ExpressionTranslator.java?rev=1642281&view=auto
==============================================================================
--- sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/ExpressionTranslator.java (added)
+++ sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/ExpressionTranslator.java Fri Nov 28 10:18:01 2014
@@ -0,0 +1,185 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ******************************************************************************/
+package org.apache.sling.scripting.sightly.impl.compiled;
+
+import java.util.Map;
+
+import org.apache.sling.scripting.sightly.impl.compiled.operator.BinaryOpGen;
+import org.apache.sling.scripting.sightly.impl.compiled.operator.Operators;
+import org.apache.sling.scripting.sightly.impl.compiled.operator.UnaryOpGen;
+import org.apache.sling.scripting.sightly.impl.compiler.expression.ExpressionNode;
+import org.apache.sling.scripting.sightly.impl.compiler.expression.node.ArrayLiteral;
+import org.apache.sling.scripting.sightly.impl.compiler.expression.node.BinaryOperation;
+import org.apache.sling.scripting.sightly.impl.compiler.expression.node.BooleanConstant;
+import org.apache.sling.scripting.sightly.impl.compiler.expression.node.Identifier;
+import org.apache.sling.scripting.sightly.impl.compiler.expression.node.MapLiteral;
+import org.apache.sling.scripting.sightly.impl.compiler.expression.node.NullLiteral;
+import org.apache.sling.scripting.sightly.impl.compiler.expression.node.NumericConstant;
+import org.apache.sling.scripting.sightly.impl.compiler.expression.node.PropertyAccess;
+import org.apache.sling.scripting.sightly.impl.compiler.expression.node.RuntimeCall;
+import org.apache.sling.scripting.sightly.impl.compiler.expression.node.StringConstant;
+import org.apache.sling.scripting.sightly.impl.compiler.expression.node.TernaryOperator;
+import org.apache.sling.scripting.sightly.impl.compiler.expression.node.UnaryOperation;
+import org.apache.sling.scripting.sightly.impl.compiler.expression.node.UnaryOperator;
+import org.apache.sling.scripting.sightly.impl.compiler.util.expression.SideEffectVisitor;
+import org.apache.sling.scripting.sightly.impl.engine.runtime.RenderContextImpl;
+
+/**
+ * Builds expressions within a sling source file.
+ */
+public final class ExpressionTranslator extends SideEffectVisitor {
+
+ private final JavaSource source;
+ private final VariableAnalyzer analyzer;
+ private final TypeInfo typeInfo;
+
+ private ExpressionTranslator(JavaSource source, VariableAnalyzer analyzer, TypeInfo typeInfo) {
+ this.source = source;
+ this.analyzer = analyzer;
+ this.typeInfo= typeInfo;
+ }
+
+ public static void buildExpression(ExpressionNode node,
+ JavaSource source,
+ VariableAnalyzer analyzer,
+ TypeInfo typeInfo) {
+ ExpressionTranslator builder = new ExpressionTranslator(source, analyzer, typeInfo);
+ builder.traverse(node);
+ }
+
+ public void traverse(ExpressionNode node) {
+ visit(node);
+ }
+
+ private void visit(ExpressionNode node) {
+ node.accept(this);
+ }
+
+ @Override
+ public void visit(PropertyAccess propertyAccess) {
+ if (typeInfo.typeOf(propertyAccess.getTarget()) == Type.MAP) {
+ //Special optimization for maps
+ visit(propertyAccess.getTarget());
+ source.startCall(SourceGenConstants.MAP_GET, true);
+ visit(propertyAccess.getProperty());
+ source.endCall();
+ } else {
+ source.startMethodCall(SourceGenConstants.RENDER_CONTEXT_INSTANCE, RenderContextImpl.PROPERTY_ACCESS);
+ visit(propertyAccess.getTarget());
+ source.separateArgument();
+ visit(propertyAccess.getProperty());
+ source.endCall();
+ }
+ }
+
+ @Override
+ public void visit(Identifier identifier) {
+ String safeName = analyzer.assignedName(identifier.getName());
+ source.append(safeName);
+ }
+
+ @Override
+ public void visit(StringConstant text) {
+ source.stringLiteral(text.getText());
+ }
+
+ @Override
+ public void visit(BinaryOperation binaryOperation) {
+ BinaryOpGen opGen = Operators.generatorFor(binaryOperation.getOperator());
+ source.startExpression();
+ opGen.generate(source, this,
+ typeInfo.getTyped(binaryOperation.getLeftOperand()),
+ typeInfo.getTyped(binaryOperation.getRightOperand()));
+ source.endExpression();
+ }
+
+ @Override
+ public void visit(BooleanConstant booleanConstant) {
+ source.append(Boolean.toString(booleanConstant.getValue()));
+ }
+
+ @Override
+ public void visit(NumericConstant numericConstant) {
+ source.append(numericConstant.getValue().toString()); //todo: check correctness
+ }
+
+ @Override
+ public void visit(UnaryOperation unaryOperation) {
+ UnaryOperator operator = unaryOperation.getOperator();
+ ExpressionNode operand = unaryOperation.getTarget();
+ UnaryOpGen unaryOpGen = Operators.generatorFor(operator);
+ source.startExpression();
+ unaryOpGen.generate(source, this, typeInfo.getTyped(operand));
+ source.endExpression();
+ }
+
+ @Override
+ public void visit(TernaryOperator ternaryOperator) {
+ GenHelper.generateTernary(source, this,
+ typeInfo.getTyped(ternaryOperator.getCondition()),
+ typeInfo.getTyped(ternaryOperator.getThenBranch()),
+ typeInfo.getTyped(ternaryOperator.getElseBranch()));
+ }
+
+ @Override
+ public void visit(RuntimeCall runtimeCall) {
+ source.startMethodCall(SourceGenConstants.RENDER_CONTEXT_INSTANCE, SourceGenConstants.RUNTIME_CALL_METHOD)
+ .stringLiteral(runtimeCall.getFunctionName());
+ for (ExpressionNode arg : runtimeCall.getArguments()) {
+ source.separateArgument();
+ visit(arg);
+ }
+ source.endCall();
+ }
+
+ @Override
+ public void visit(MapLiteral mapLiteral) {
+ source.startCall(SourceGenConstants.START_MAP_METHOD).endCall();
+ for (Map.Entry<String, ExpressionNode> entry : mapLiteral.getMap().entrySet()) {
+ source.startCall(SourceGenConstants.MAP_TYPE_ADD, true)
+ .stringLiteral(entry.getKey())
+ .separateArgument();
+ visit(entry.getValue());
+ source.endCall();
+ }
+ }
+
+ @Override
+ public void visit(ArrayLiteral arrayLiteral) {
+ source.startExpression().startArray();
+ boolean needsComma = false;
+ for (ExpressionNode node : arrayLiteral.getItems()) {
+ if (needsComma) {
+ source.separateArgument();
+ }
+ visit(node);
+ needsComma = true;
+ }
+ source.endArray().endExpression();
+ }
+
+ @Override
+ public void visit(NullLiteral nullLiteral) {
+ source.nullLiteral();
+ }
+
+ public VariableAnalyzer getAnalyzer() {
+ return analyzer;
+ }
+}
Propchange: sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/ExpressionTranslator.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/GenHelper.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/GenHelper.java?rev=1642281&view=auto
==============================================================================
--- sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/GenHelper.java (added)
+++ sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/GenHelper.java Fri Nov 28 10:18:01 2014
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ******************************************************************************/
+
+package org.apache.sling.scripting.sightly.impl.compiled;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.sling.scripting.sightly.impl.compiled.operator.TypedNode;
+import org.apache.sling.scripting.sightly.impl.compiler.expression.ExpressionNode;
+import org.apache.sling.scripting.sightly.impl.compiler.expression.node.Identifier;
+import org.apache.sling.scripting.sightly.impl.compiler.util.expression.SideEffectVisitor;
+import org.apache.sling.scripting.sightly.impl.engine.runtime.RenderContextImpl;
+
+/**
+ * Helper for code generation
+ */
+public class GenHelper {
+
+ public static void generateTernary(JavaSource source, SideEffectVisitor visitor,
+ TypedNode condition, TypedNode thenBranch, TypedNode elseBranch) {
+ source.startExpression();
+ typeCoercion(source, visitor, condition, Type.BOOLEAN);
+ source.conditional();
+ thenBranch.getNode().accept(visitor);
+ source.conditionalBranchSep();
+ elseBranch.getNode().accept(visitor);
+ source.endExpression();
+ }
+
+ public static void typeCoercion(JavaSource source, SideEffectVisitor visitor, TypedNode node, Type type) {
+ if (type == node.getType() || type == Type.UNKNOWN) {
+ node.getNode().accept(visitor);
+ } else if (type == Type.LONG && node.getType() == Type.DOUBLE) {
+ callLongCoercion(source, visitor, node.getNode());
+ } else {
+ String coercionMethod = dynamicCoercions.get(type);
+ if (coercionMethod == null) {
+ throw new UnsupportedOperationException("Cannot generate coercion to type " + type);
+ }
+ callDynamicCoercion(source, visitor, node.getNode(), dynamicCoercions.get(type));
+ }
+ }
+
+ public static void listCoercion(JavaSource source, ExpressionTranslator visitor, TypedNode typedNode) {
+ ExpressionNode node = typedNode.getNode();
+ if (node instanceof Identifier) {
+ //using list coercion caching optimization
+ VariableDescriptor descriptor = visitor.getAnalyzer().descriptor(((Identifier) node).getName());
+ String listCoercionVar = descriptor.requireListCoercion();
+ source.startExpression()
+ .append(listCoercionVar)
+ .equality()
+ .nullLiteral()
+ .conditional()
+ .startExpression()
+ .append(listCoercionVar)
+ .assign()
+ .startMethodCall(SourceGenConstants.RENDER_CONTEXT_INSTANCE, RenderContextImpl.COLLECTION_COERCE);
+ node.accept(visitor);
+ source
+ .endCall()
+ .endExpression()
+ .conditionalBranchSep()
+ .append(listCoercionVar)
+ .endExpression();
+ } else {
+ source.startMethodCall(SourceGenConstants.RENDER_CONTEXT_INSTANCE, RenderContextImpl.COLLECTION_COERCE);
+ typedNode.getNode().accept(visitor);
+ source.endCall();
+ }
+ }
+
+ private static void callLongCoercion(JavaSource source, SideEffectVisitor visitor, ExpressionNode node) {
+ source.cast(Type.LONG.getNativeClass());
+ source.startExpression();
+ node.accept(visitor);
+ source.endExpression();
+ }
+
+ private static void callDynamicCoercion(JavaSource source, SideEffectVisitor visitor, ExpressionNode node, String methodName) {
+ source.startMethodCall(SourceGenConstants.RENDER_CONTEXT_INSTANCE, methodName);
+ node.accept(visitor);
+ source.endCall();
+ }
+
+ private static final Map<Type, String> dynamicCoercions = new HashMap<Type, String>();
+
+ static {
+ dynamicCoercions.put(Type.STRING, RenderContextImpl.STRING_COERCE);
+ dynamicCoercions.put(Type.BOOLEAN, RenderContextImpl.BOOLEAN_COERCE);
+ dynamicCoercions.put(Type.LONG, RenderContextImpl.NUMERIC_COERCE);
+ dynamicCoercions.put(Type.DOUBLE, RenderContextImpl.NUMERIC_COERCE);
+ }
+
+}
Propchange: sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/GenHelper.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/JavaClassBackend.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/JavaClassBackend.java?rev=1642281&view=auto
==============================================================================
--- sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/JavaClassBackend.java (added)
+++ sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/JavaClassBackend.java Fri Nov 28 10:18:01 2014
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ******************************************************************************/
+package org.apache.sling.scripting.sightly.impl.compiled;
+
+import org.apache.sling.scripting.sightly.impl.compiler.CompilerBackend;
+import org.apache.sling.scripting.sightly.impl.compiler.ris.CommandStream;
+import org.apache.sling.scripting.sightly.impl.compiler.util.stream.VisitorHandler;
+import org.apache.sling.scripting.sightly.impl.compiler.visitor.CodeGenVisitor;
+import org.apache.sling.scripting.sightly.impl.compiler.visitor.StatefulVisitor;
+
+/**
+ * Backend which generates a Java class.
+ */
+public class JavaClassBackend implements CompilerBackend {
+
+ private UnitBuilder unitBuilder = new UnitBuilder();
+
+ @Override
+ public void handle(CommandStream stream) {
+ StatefulVisitor statefulVisitor = new StatefulVisitor();
+ final CodeGenVisitor visitor = new CodeGenVisitor(unitBuilder, statefulVisitor.getControl());
+ statefulVisitor.initializeWith(visitor);
+ stream.addHandler(new VisitorHandler(statefulVisitor) {
+ @Override
+ public void onDone() {
+ super.onDone();
+ visitor.finish();
+ }
+ });
+ }
+
+ public CompilationOutput build() {
+ return this.unitBuilder.build();
+ }
+}
Propchange: sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/JavaClassBackend.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/JavaSource.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/JavaSource.java?rev=1642281&view=auto
==============================================================================
--- sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/JavaSource.java (added)
+++ sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/JavaSource.java Fri Nov 28 10:18:01 2014
@@ -0,0 +1,264 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ******************************************************************************/
+package org.apache.sling.scripting.sightly.impl.compiled;
+
+import org.apache.commons.lang.StringEscapeUtils;
+
+/**
+ * Builder object for a Java class printing method.
+ */
+public class JavaSource {
+
+ private static final String INDENT = " ";
+
+ private int indentLevel;
+ private final StringBuilder builder = new StringBuilder();
+
+ public JavaSource prepend(String str) {
+ builder.insert(0, str);
+ return this;
+ }
+
+ public JavaSource beginIf() {
+ indent().append("if (");
+ return this;
+ }
+
+ public JavaSource completeIf() {
+ append(") {\n");
+ incIndent();
+ return this;
+ }
+
+ public JavaSource endBlock() {
+ decIndent();
+ indent().append("}\n");
+ return this;
+ }
+
+ public JavaSource comment(String text) {
+ indent().append("//").append(text).append("\n");
+ return this;
+ }
+
+ public JavaSource assign() {
+ return append(" = ");
+ }
+
+ public JavaSource number(int value) {
+ return append(Integer.toString(value));
+ }
+
+ public JavaSource increment() {
+ return append("++");
+ }
+
+ public JavaSource beginAssignment(String variable, String type) {
+ return declare(variable, type).assign();
+ }
+
+ public JavaSource beginAssignment(String variable) {
+ return beginAssignment(variable, "Object");
+ }
+
+ public JavaSource declare(String variable, String type) {
+ return startStatement().append(type).append(" ").append(variable);
+ }
+
+ public JavaSource declare(String variable) {
+ return declare(variable, "Object");
+ }
+
+ public JavaSource equality() {
+ return append(" == ");
+ }
+
+ public JavaSource startCall(String methodName, boolean useDot) {
+ if (useDot) {
+ builder.append('.');
+ }
+ builder.append(methodName).append('(');
+ return this;
+ }
+
+ public JavaSource startCall(String methodName) {
+ return startCall(methodName, false);
+ }
+
+ public JavaSource startMethodCall(String target, String method) {
+ return append(target).startCall(method, true);
+ }
+
+ public JavaSource startArray() {
+ return append("new Object[] {");
+ }
+
+ public JavaSource endArray() {
+ return append("}");
+ }
+
+ public JavaSource startStatement() {
+ indent();
+ return this;
+ }
+
+ public JavaSource nullLiteral() {
+ return append("null");
+ }
+
+ public JavaSource separateArgument() {
+ builder.append(", ");
+ return this;
+ }
+
+ public JavaSource stringLiteral(String text) {
+ builder.append('"')
+ .append(StringEscapeUtils.escapeJava(text))
+ .append('"');
+ return this;
+ }
+
+ public JavaSource startExpression() {
+ builder.append('(');
+ return this;
+ }
+
+ public JavaSource endExpression() {
+ builder.append(')');
+ return this;
+ }
+
+ public JavaSource endCall() {
+ builder.append(')');
+ return this;
+ }
+
+ public JavaSource startBlock() {
+ indent().append("{\n");
+ incIndent();
+ return this;
+ }
+
+ public JavaSource beginFor(String itemVariable, String listVariable) {
+ startStatement()
+ .append("for (Object ")
+ .append(itemVariable)
+ .append(" : ")
+ .append(listVariable)
+ .append(") {\n");
+ incIndent();
+ return this;
+ }
+
+ public JavaSource endFor() {
+ return endBlock();
+ }
+
+ public JavaSource endIf() {
+ return endBlock();
+ }
+
+ public JavaSource beginNewInstanceCall(String className) {
+ return append("new ").append(className).append("(");
+ }
+
+ public JavaSource append(String str) {
+ builder.append(str);
+ return this;
+ }
+
+ public JavaSource endStatement() {
+ builder.append(";\n");
+ return this;
+ }
+
+ public JavaSource cast(String type) {
+ return append("(").append(type).append(")");
+ }
+
+ public JavaSource operator(String op) {
+ return append(" ").append(op).append(" ");
+ }
+
+ public JavaSource beginAnonymousInstance(String className) {
+ append("new ").append(className).append("() {\n");
+ incIndent();
+ return this;
+ }
+
+ public JavaSource endAnonymousInstance() {
+ decIndent();
+ append("}");
+ return this;
+ }
+
+ public JavaSource beginMethod(String name, String returnType) {
+ return startStatement().append("public ").append(returnType).append(" ").append(name).append("(");
+ }
+
+ public JavaSource methodParameter(String name, String type) {
+ return append(type).append(" ").append(name);
+ }
+
+ public JavaSource completeMethodSignature() {
+ append(") {\n");
+ incIndent();
+ return this;
+ }
+
+ public JavaSource endMethod() {
+ return endBlock();
+ }
+
+ public JavaSource conditional() {
+ return append(" ? ");
+ }
+
+ public JavaSource conditionalBranchSep() {
+ return append(" : ");
+ }
+
+ public JavaSource negation() {
+ return append("!");
+ }
+
+ public JavaSource newLine() {
+ return append("\n");
+ }
+
+ private StringBuilder indent() {
+ for (int i = 0; i < indentLevel; i++) {
+ builder.append(INDENT);
+ }
+ return builder;
+ }
+
+ private void incIndent() {
+ indentLevel++;
+ }
+
+ private void decIndent() {
+ indentLevel--;
+ }
+
+ @Override
+ public String toString() {
+ return builder.toString();
+ }
+}
Propchange: sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/JavaSource.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/SourceGenConstants.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/SourceGenConstants.java?rev=1642281&view=auto
==============================================================================
--- sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/SourceGenConstants.java (added)
+++ sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/SourceGenConstants.java Fri Nov 28 10:18:01 2014
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ******************************************************************************/
+package org.apache.sling.scripting.sightly.impl.compiled;
+
+/**
+ * Names related to Java source generation.
+ */
+public final class SourceGenConstants {
+
+ public static final String OUT_BUFFER = "out";
+
+ public static final String WRITE_METHOD = "write";
+
+ public static final String COLLECTION_TYPE = "Collection";
+
+ public static final String BINDINGS_FIELD = "bindings";
+
+ public static final String BINDINGS_GET_METHOD = "get";
+
+ public static final String START_MAP_METHOD = "obj";
+
+ public static final String MAP_TYPE_ADD = "with";
+
+ public static final String CALL_UNIT_METHOD = "callUnit";
+
+ public static final String RENDER_CONTEXT_INSTANCE = "renderContext";
+
+ public static final String RUNTIME_CALL_METHOD = "call";
+
+ public static final String COLLECTION_LENGTH_METHOD = "size";
+
+ public static final String MAP_GET = "get";
+ public static final String TRIM_METHOD = "trim";
+ public static final String STRING_EMPTY = "isEmpty";
+ public static final String OBJ_GET = "get";
+ public static final String ARGUMENTS_FIELD = "arguments";
+}
Propchange: sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/SourceGenConstants.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/Type.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/Type.java?rev=1642281&view=auto
==============================================================================
--- sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/Type.java (added)
+++ sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/Type.java Fri Nov 28 10:18:01 2014
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ******************************************************************************/
+
+package org.apache.sling.scripting.sightly.impl.compiled;
+
+/**
+ * Type inferred for an expression
+ */
+public enum Type {
+ UNKNOWN("Object", false),
+ STRING("String", false),
+ LONG("long", true),
+ DOUBLE("double", true),
+ BOOLEAN("boolean", true),
+ MAP("java.util.Map", false);
+
+ private final String nativeClass;
+ private final boolean isPrimitive;
+
+ Type(String nativeClass, boolean isPrimitive) {
+ this.nativeClass = nativeClass;
+ this.isPrimitive = isPrimitive;
+ }
+
+ public String getNativeClass() {
+ return nativeClass;
+ }
+
+ public boolean isPrimitive() {
+ return isPrimitive;
+ }
+}
Propchange: sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/Type.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/TypeInference.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/TypeInference.java?rev=1642281&view=auto
==============================================================================
--- sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/TypeInference.java (added)
+++ sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/TypeInference.java Fri Nov 28 10:18:01 2014
@@ -0,0 +1,158 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ******************************************************************************/
+
+package org.apache.sling.scripting.sightly.impl.compiled;
+
+import java.util.IdentityHashMap;
+import java.util.Map;
+
+import org.apache.sling.scripting.sightly.impl.compiled.operator.BinaryOpGen;
+import org.apache.sling.scripting.sightly.impl.compiled.operator.Operators;
+import org.apache.sling.scripting.sightly.impl.compiled.operator.UnaryOpGen;
+import org.apache.sling.scripting.sightly.impl.compiler.expression.ExpressionNode;
+import org.apache.sling.scripting.sightly.impl.compiler.expression.NodeVisitor;
+import org.apache.sling.scripting.sightly.impl.compiler.expression.node.ArrayLiteral;
+import org.apache.sling.scripting.sightly.impl.compiler.expression.node.BinaryOperation;
+import org.apache.sling.scripting.sightly.impl.compiler.expression.node.BooleanConstant;
+import org.apache.sling.scripting.sightly.impl.compiler.expression.node.Identifier;
+import org.apache.sling.scripting.sightly.impl.compiler.expression.node.MapLiteral;
+import org.apache.sling.scripting.sightly.impl.compiler.expression.node.NullLiteral;
+import org.apache.sling.scripting.sightly.impl.compiler.expression.node.NumericConstant;
+import org.apache.sling.scripting.sightly.impl.compiler.expression.node.PropertyAccess;
+import org.apache.sling.scripting.sightly.impl.compiler.expression.node.RuntimeCall;
+import org.apache.sling.scripting.sightly.impl.compiler.expression.node.StringConstant;
+import org.apache.sling.scripting.sightly.impl.compiler.expression.node.TernaryOperator;
+import org.apache.sling.scripting.sightly.impl.compiler.expression.node.UnaryOperation;
+
+/**
+ * Expression translator which uses type information
+ */
+public final class TypeInference implements NodeVisitor<Type> {
+
+ private final VariableAnalyzer analyzer;
+ private final Map<ExpressionNode, Type> inferMap = new IdentityHashMap<ExpressionNode, Type>();
+
+
+ public static TypeInfo inferTypes(ExpressionNode node, VariableAnalyzer analyzer) {
+ TypeInference typeInference = new TypeInference(analyzer);
+ typeInference.infer(node);
+ return new TypeInfo(typeInference.inferMap);
+ }
+
+ private TypeInference(VariableAnalyzer analyzer) {
+ this.analyzer = analyzer;
+ }
+
+
+
+ private Type infer(ExpressionNode node) {
+ Type type = node.accept(this);
+ inferMap.put(node, type);
+ return type;
+ }
+
+ @Override
+ public Type evaluate(PropertyAccess propertyAccess) {
+ infer(propertyAccess.getTarget());
+ infer(propertyAccess.getProperty());
+ return Type.UNKNOWN;
+ }
+
+ @Override
+ public Type evaluate(Identifier identifier) {
+ return analyzer.descriptor(identifier.getName()).getType();
+ }
+
+ @Override
+ public Type evaluate(StringConstant text) {
+ return Type.STRING;
+ }
+
+ @Override
+ public Type evaluate(BinaryOperation binaryOperation) {
+ Type leftType = infer(binaryOperation.getLeftOperand());
+ Type rightType = infer(binaryOperation.getRightOperand());
+ BinaryOpGen opGen = Operators.generatorFor(binaryOperation.getOperator());
+ return opGen.returnType(leftType, rightType);
+ }
+
+ @Override
+ public Type evaluate(BooleanConstant booleanConstant) {
+ return Type.BOOLEAN;
+ }
+
+ @Override
+ public Type evaluate(NumericConstant numericConstant) {
+ Number number = numericConstant.getValue();
+ if (number instanceof Integer || number instanceof Long) {
+ return Type.LONG;
+ }
+ if (number instanceof Float || number instanceof Double) {
+ return Type.DOUBLE;
+ }
+ return Type.UNKNOWN;
+ }
+
+ @Override
+ public Type evaluate(UnaryOperation unaryOperation) {
+ infer(unaryOperation.getTarget());
+ UnaryOpGen opGen = Operators.generatorFor(unaryOperation.getOperator());
+ return opGen.returnType(infer(unaryOperation.getTarget()));
+ }
+
+ @Override
+ public Type evaluate(TernaryOperator ternaryOperator) {
+ infer(ternaryOperator.getCondition());
+ Type thenType = infer(ternaryOperator.getThenBranch());
+ Type elseType = infer(ternaryOperator.getElseBranch());
+ if (thenType.equals(elseType)) {
+ return thenType;
+ }
+ return Type.UNKNOWN;
+ }
+
+ @Override
+ public Type evaluate(RuntimeCall runtimeCall) {
+ inferAll(runtimeCall.getArguments());
+ return Type.UNKNOWN;
+ }
+
+ @Override
+ public Type evaluate(MapLiteral mapLiteral) {
+ inferAll(mapLiteral.getMap().values());
+ return Type.MAP;
+ }
+
+ @Override
+ public Type evaluate(ArrayLiteral arrayLiteral) {
+ inferAll(arrayLiteral.getItems());
+ return Type.UNKNOWN;
+ }
+
+ @Override
+ public Type evaluate(NullLiteral nullLiteral) {
+ return Type.UNKNOWN;
+ }
+
+ private void inferAll(Iterable<ExpressionNode> nodes) {
+ for (ExpressionNode node : nodes) {
+ infer(node);
+ }
+ }
+}
Propchange: sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/TypeInference.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/TypeInfo.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/TypeInfo.java?rev=1642281&view=auto
==============================================================================
--- sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/TypeInfo.java (added)
+++ sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/TypeInfo.java Fri Nov 28 10:18:01 2014
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ******************************************************************************/
+
+package org.apache.sling.scripting.sightly.impl.compiled;
+
+import java.util.Map;
+
+import org.apache.sling.scripting.sightly.impl.compiled.operator.TypedNode;
+import org.apache.sling.scripting.sightly.impl.compiler.expression.ExpressionNode;
+
+/**
+ * Provide type information for expressions
+ */
+public class TypeInfo {
+
+ private final Map<ExpressionNode, Type> typeMap;
+
+ public TypeInfo(Map<ExpressionNode, Type> typeMap) {
+ this.typeMap = typeMap;
+ }
+
+ public Type typeOf(ExpressionNode node) {
+ Type type = typeMap.get(node);
+ if (type == null) {
+ return Type.UNKNOWN;
+ }
+ return type;
+ }
+
+ public TypedNode getTyped(ExpressionNode expressionNode) {
+ return new TypedNode(expressionNode, typeOf(expressionNode));
+ }
+}
Propchange: sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/TypeInfo.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/UnitBuilder.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/UnitBuilder.java?rev=1642281&view=auto
==============================================================================
--- sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/UnitBuilder.java (added)
+++ sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/UnitBuilder.java Fri Nov 28 10:18:01 2014
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ ******************************************************************************/
+
+package org.apache.sling.scripting.sightly.impl.compiled;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Builder for compiled sources
+ */
+public class UnitBuilder {
+
+ private final JavaSource source = new JavaSource();
+ private final Set<String> parameters;
+ private final Map<String, UnitBuilder> subTemplates = new HashMap<String, UnitBuilder>();
+
+ public UnitBuilder() {
+ this(Collections.<String>emptySet());
+ }
+
+ public UnitBuilder(Set<String> parameters) {
+ this.parameters = parameters;
+ }
+
+ public UnitBuilder newSubBuilder(String name, Set<String> parameters) {
+ UnitBuilder unitBuilder = new UnitBuilder(parameters);
+ subTemplates.put(name, unitBuilder);
+ return unitBuilder;
+ }
+
+ public JavaSource getSource() {
+ return source;
+ }
+
+ public Set<String> getParameters() {
+ return parameters;
+ }
+
+ public CompilationOutput build() {
+ Map<String, CompilationOutput> map = new HashMap<String, CompilationOutput>();
+ for (Map.Entry<String, UnitBuilder> entry : subTemplates.entrySet()) {
+ map.put(entry.getKey(), entry.getValue().build());
+ }
+ return new CompilationOutput(source.toString(), map);
+ }
+}
Propchange: sling/trunk/contrib/scripting/sightly/engine/src/main/java/org/apache/sling/scripting/sightly/impl/compiled/UnitBuilder.java
------------------------------------------------------------------------------
svn:mime-type = text/plain