horwat 01/10/09 16:57:17
Modified: jsptl build.xml
jsptl/src/org/apache/taglibs/jsptl/lang/spel Evaluator.java
Added: jsptl/src/org/apache/taglibs/jsptl/lang/javascript
JavascriptExpressionEvaluator.java
jsptl/lib js.jar
Log:
Adding support for javascript as an expression language. Using Rhino, a mozilla open
source implemenation of Javascript.
Configure your web.xml file as follows in order to use Javascript as the jsptl EL:
----
<context-param>
<param-name>javax.servlet.jsptl.ExpressionEvaluatorClass</param-name>
<param-value>org.apache.taglibs.jsptl.lang.javascript.JavascriptExpressionEvaluator</param-value>
</context-param>
----
Known issues:
- Iterator Tags examples, Data Types test will fail for $enum. "enum" is a
javascript reserved word
Revision Changes Path
1.4 +2 -1 jakarta-taglibs/jsptl/build.xml
Index: build.xml
===================================================================
RCS file: /home/cvs/jakarta-taglibs/jsptl/build.xml,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- build.xml 2001/09/20 05:22:30 1.3
+++ build.xml 2001/10/09 23:57:17 1.4
@@ -4,6 +4,7 @@
<property file="../build.properties"/>
<property file="../common.properties"/>
+ <property name="js.jar" value="lib/js.jar"/>
<property name="classpath" value="${servlet23.jar}"/>
<property name="taglib.name" value="jsptl"/>
@@ -155,7 +156,7 @@
-->
<javac srcdir="${library.src}" destdir="${build.library}"
- classpath="${servlet23.jar}:${jxpath.jar}"
+ classpath="${servlet23.jar}:${jxpath.jar}:${js.jar}"
debug="on"/>
</target>
1.2 +2 -2
jakarta-taglibs/jsptl/src/org/apache/taglibs/jsptl/lang/spel/Evaluator.java
Index: Evaluator.java
===================================================================
RCS file:
/home/cvs/jakarta-taglibs/jsptl/src/org/apache/taglibs/jsptl/lang/spel/Evaluator.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- Evaluator.java 2001/07/08 16:26:45 1.1
+++ Evaluator.java 2001/10/09 23:57:17 1.2
@@ -83,7 +83,7 @@
* ExpectedType/LiteralString to parsed literal values.
*
* @author Nathan Abramson - Art Technology Group
- * @version $Change: 181177 $$DateTime: 2001/06/26 08:45:09 $$Author: glenn $
+ * @version $Change: 181177 $$DateTime: 2001/06/26 08:45:09 $$Author: horwat $
**/
public class Evaluator
@@ -213,7 +213,7 @@
* Evaluates the given expression as a literal value converted to
* the given expected type
**/
- Object evaluateLiteral (String pExpression,
+ public Object evaluateLiteral (String pExpression,
PageContext pPageContext,
Class pExpectedType)
throws JspException
1.1
jakarta-taglibs/jsptl/src/org/apache/taglibs/jsptl/lang/javascript/JavascriptExpressionEvaluator.java
Index: JavascriptExpressionEvaluator.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
*/
package org.apache.taglibs.jsptl.lang.javascript;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
import java.util.Enumeration;
import org.apache.taglibs.jsptl.lang.support.ExpressionEvaluator;
import org.apache.taglibs.jsptl.lang.spel.Evaluator;
import org.mozilla.javascript.*;
public class JavascriptExpressionEvaluator implements ExpressionEvaluator {
/**
* Translation time validation of an expression.
* This method will return a null String if the expression
* is valid; otherwise an error message.
*/
public String validate(String attributeName,
String expression) {
return null;
}
/**
* Evaluates the expression at request time.
* Rhino is the java implementation of JavaScript.
*
*/
public Object evaluate(String attributeName,
String expression,
Class expectedType,
Tag tag,
PageContext pageContext)
throws JspException {
Object result = null;
Evaluator evalLiteral = new Evaluator();
// Creates and enters a Context. Context stores information
// about the execution environment of a script
Context cx = Context.enter();
// Initialize standard objects
Scriptable scope = cx.initStandardObjects(null);
// Put PageContext attributes/parameters in Rhino Scope
putAttributesInScope(scope, cx, pageContext, PageContext.PAGE_SCOPE);
putAttributesInScope(scope, cx, pageContext, PageContext.REQUEST_SCOPE);
putAttributesInScope(scope, cx, pageContext, PageContext.SESSION_SCOPE);
putAttributesInScope(scope, cx, pageContext, PageContext.APPLICATION_SCOPE);
putParametersInScope(scope, cx, pageContext);
// Evaluate string
try {
// skip $, use the SPEL evaluate literal method 'cuz why reinvent the
wheel?
if (expression.startsWith("$")) {
expression = expression.substring(1);
result = cx.evaluateString(scope, expression, "", 0, null); //
expression
}
else result = evalLiteral.evaluateLiteral(expression, pageContext,
expectedType); //literal
// Unwrap scoped object
if (result instanceof Wrapper)
result = ((Wrapper) result).unwrap();
if (result instanceof NativeString)
result = result.toString();
} catch (JavaScriptException jse) {
throw new JspException(jse.getMessage());
}
//System.out.println("RHINO result: " + result + ":");
if (result != null && !expectedType.isInstance(result)) {
throw new JspException("The tag expected an object of type ["
+ expectedType.getName() + "] for the " + attributeName
+ " attribute. However, it received an "
+ "object of type [" + result.getClass().getName() + "]");
}
return result;
}
/**
* put PageContext attributes into Rhino scope
*/
void putAttributesInScope(Scriptable rhinoScope,
Context rhinoContext,
PageContext pageContext,
int scope) {
Enumeration attributes = null;
Object value = null;
String attribute = null;
attributes = pageContext.getAttributeNamesInScope(scope);
while (attributes !=null && attributes.hasMoreElements()) {
attribute = (String)attributes.nextElement();
value = pageContext.getAttribute(attribute, scope);
rhinoScope.put(attribute, rhinoScope, rhinoContext.toObject(value,
rhinoScope));
}
}
/**
* put PageContext parameters into Rhino scope
*/
void putParametersInScope(Scriptable rhinoScope,
Context rhinoContext,
PageContext pageContext) {
Enumeration attributes = null;
Object value = null;
String attribute = null;
attributes = (pageContext.getRequest()).getParameterNames();
while (attributes !=null && attributes.hasMoreElements()) {
attribute = (String)attributes.nextElement();
value = (pageContext.getRequest()).getParameter(attribute);
rhinoScope.put(attribute, rhinoScope, rhinoContext.toObject(value,
rhinoScope));
}
}
}
1.1 jakarta-taglibs/jsptl/lib/js.jar
<<Binary file>>