Signing off that this Sun license falls under A category despite not being explicitly listed.
On Fri, Jul 15, 2016 at 6:31 PM, <cbris...@apache.org> wrote: > Author: cbrisson > Date: Fri Jul 15 22:30:59 2016 > New Revision: 1752882 > > URL: http://svn.apache.org/viewvc?rev=1752882&view=rev > Log: > review (ahem... rewrite using Sun provided example) scripting interface > > Added: > velocity/engine/trunk/velocity-engine-scripting/src/test/resources/ > > velocity/engine/trunk/velocity-engine-scripting/src/test/resources/velocity.properties > - copied unchanged from r1752841, > velocity/engine/trunk/velocity-engine-scripting/src/test/java/org/apache/velocity/script/test/resources/velocity.properties > Removed: > > velocity/engine/trunk/velocity-engine-scripting/src/main/java/org/apache/velocity/script/VelocityBindings.java > > velocity/engine/trunk/velocity-engine-scripting/src/main/java/org/apache/velocity/script/VelocityCompilable.java > > velocity/engine/trunk/velocity-engine-scripting/src/main/java/org/apache/velocity/script/VelocityCompiledScript.java > > velocity/engine/trunk/velocity-engine-scripting/src/main/java/org/apache/velocity/script/VelocityInvocable.java > > velocity/engine/trunk/velocity-engine-scripting/src/main/java/org/apache/velocity/script/VelocityScriptContext.java > > velocity/engine/trunk/velocity-engine-scripting/src/main/java/org/apache/velocity/script/VelocityScriptException.java > > velocity/engine/trunk/velocity-engine-scripting/src/main/java/org/apache/velocity/script/util/ > > velocity/engine/trunk/velocity-engine-scripting/src/test/java/org/apache/velocity/script/test/ScriptEngineFactoryTest.java > > velocity/engine/trunk/velocity-engine-scripting/src/test/java/org/apache/velocity/script/test/resources/velocity.properties > Modified: > velocity/engine/trunk/velocity-engine-scripting/pom.xml > > velocity/engine/trunk/velocity-engine-scripting/src/main/java/org/apache/velocity/script/VelocityScriptEngine.java > > velocity/engine/trunk/velocity-engine-scripting/src/main/java/org/apache/velocity/script/VelocityScriptEngineFactory.java > > velocity/engine/trunk/velocity-engine-scripting/src/test/java/org/apache/velocity/script/test/ScriptEngineTest.java > > velocity/engine/trunk/velocity-engine-scripting/src/test/java/org/apache/velocity/script/test/VelocityScriptContextTest.java > > Modified: velocity/engine/trunk/velocity-engine-scripting/pom.xml > URL: > http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-scripting/pom.xml?rev=1752882&r1=1752881&r2=1752882&view=diff > ============================================================================== > --- velocity/engine/trunk/velocity-engine-scripting/pom.xml (original) > +++ velocity/engine/trunk/velocity-engine-scripting/pom.xml Fri Jul 15 > 22:30:59 2016 > @@ -21,26 +21,60 @@ > --> > <project xmlns="http://maven.apache.org/POM/4.0.0" > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 > http://maven.apache.org/xsd/maven-4.0.0.xsd"> > - <modelVersion>4.0.0</modelVersion> > - <parent> > - <groupId>org.apache.velocity</groupId> > - <artifactId>velocity-engine-parent</artifactId> > - <version>2.0.0-SNAPSHOT</version> > - </parent> > - <artifactId>velocity-engine-scripting</artifactId> > + <modelVersion>4.0.0</modelVersion> > + <parent> > + <groupId>org.apache.velocity</groupId> > + <artifactId>velocity-engine-parent</artifactId> > <version>2.0.0-SNAPSHOT</version> > - <name>Apache Velocity - JSR 223 Scripting</name> > - <dependencies> > - <dependency> > - <groupId>org.apache.velocity</groupId> > - <artifactId>velocity-engine-core</artifactId> > - <version>2.0.0-SNAPSHOT</version> > - </dependency> > - <dependency> > - <groupId>junit</groupId> > - <artifactId>junit</artifactId> > - <version>4.8.2</version> > - <scope>test</scope> > - </dependency> > - </dependencies> > + </parent> > + <artifactId>velocity-engine-scripting</artifactId> > + <version>2.0.0-SNAPSHOT</version> > + <name>Apache Velocity - JSR 223 Scripting</name> > + <dependencies> > + <dependency> > + <groupId>org.apache.velocity</groupId> > + <artifactId>velocity-engine-core</artifactId> > + <version>2.0.0-SNAPSHOT</version> > + </dependency> > + <dependency> > + <groupId>junit</groupId> > + <artifactId>junit</artifactId> > + <version>4.8.2</version> > + <scope>test</scope> > + </dependency> > + <dependency> > + <groupId>org.slf4j</groupId> > + <artifactId>slf4j-simple</artifactId> > + <version>1.7.12</version> > + <scope>test</scope> > + </dependency> > + </dependencies> > + <build> > + <plugins> > + <plugin> > + <groupId>org.apache.maven.plugins</groupId> > + <artifactId>maven-surefire-plugin</artifactId> > + <configuration> > + <systemProperties> > + <property> > + <name>test.resources.dir</name> > + <value>${project.build.directory}</value> > + </property> > + </systemProperties> > + </configuration> > + <executions> > + <execution> > + <id>integration-test</id> > + <phase>integration-test</phase> > + <goals> > + <goal>test</goal> > + </goals> > + <configuration> > + <skip>false</skip> > + </configuration> > + </execution> > + </executions> > + </plugin> > + </plugins> > + </build> > </project> > > Modified: > velocity/engine/trunk/velocity-engine-scripting/src/main/java/org/apache/velocity/script/VelocityScriptEngine.java > URL: > http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-scripting/src/main/java/org/apache/velocity/script/VelocityScriptEngine.java?rev=1752882&r1=1752881&r2=1752882&view=diff > ============================================================================== > --- > velocity/engine/trunk/velocity-engine-scripting/src/main/java/org/apache/velocity/script/VelocityScriptEngine.java > (original) > +++ > velocity/engine/trunk/velocity-engine-scripting/src/main/java/org/apache/velocity/script/VelocityScriptEngine.java > Fri Jul 15 22:30:59 2016 > @@ -1,5 +1,7 @@ > package org.apache.velocity.script; > > +/* dual licencing... */ > + > /* > * Licensed to the Apache Software Foundation (ASF) under one > * or more contributor license agreements. See the NOTICE file > @@ -19,471 +21,227 @@ package org.apache.velocity.script; > * under the License. > */ > > -import org.apache.velocity.Template; > -import org.apache.velocity.VelocityContext; > -import org.apache.velocity.app.VelocityEngine; > -import org.apache.velocity.exception.ResourceNotFoundException; > -import org.apache.velocity.script.util.ScriptResourceHolder; > -import org.apache.velocity.script.util.ScriptUtil; > - > -import javax.script.*; > -import java.io.*; > -import java.util.Properties; > - > -/** > - * VelocityScriptEngine is the fundamental class whose methods inherited > from .javax.script.ScriptEngine interface > - * These methods provide basic scripting functionality. This includes > methods that execute scripts, and ones that set and get values. > - * The values are key/value pairs of two types. > - * This Provides a standard implementation for several of the variants of > the eval method. > - * eval(Reader) > - * eval(String) > - * eval(String, Bindings) > - * eval(Reader, Bindings) > +/* > + * Copyright 2006 Sun Microsystems, Inc. All rights reserved. > + * Use is subject to license terms. > * > - * There are two ways to instantiate VelocityScriptEngine. One is directly > using the script engine factory which was used to create this > - * engine. Other one is by passing the factory and the pre defined bindings > required for the engine. > + * Redistribution and use in source and binary forms, with or without > modification, are > + * permitted provided that the following conditions are met: Redistributions > of source code > + * must retain the above copyright notice, this list of conditions and the > following disclaimer. > + * 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. Neither the name of the Sun Microsystems > nor the names of > + * is contributors may be used to endorse or promote products derived from > this software > + * without specific prior written permission. > + > + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS > IS" AND ANY EXPRESS > + * 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 COPYRIGHT OWNER > + * OR 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. > */ > -public class VelocityScriptEngine implements ScriptEngine { > - > - /** > - * ScriptEngineFactory reference from whom this engine got created > - */ > - private ScriptEngineFactory scriptEngineFactory; > - > - > - /** > - * Velocity core engine reference > - */ > - private VelocityEngine velocityEngine; > - > - > - /** > - * unmodifiable property name which is ued to obtain properties from > context as well as from system to initialize velocity core engine > - */ > - public static final String VELOCITY_PROPERTIES = > "org.apache.velocity.engine.properties"; > - > - > - /** > - * Default velocity log tag > - */ > - public static final String DEFAULT_LOG_TAG = "default_log_tag"; > - > - > - /** > - * script context reference which belongs to this engine instance > - */ > - private ScriptContext scriptContext; > - > - > - /** > - * Constructor which gets created engine factory reference as input > - * > - * @param scriptEngineFactory ScriptEngineFactory reference from whom > this engine got created > - */ > - public VelocityScriptEngine(ScriptEngineFactory scriptEngineFactory) { > - this.scriptEngineFactory = scriptEngineFactory; > - this.scriptContext = new VelocityScriptContext(); > - ScriptUtil.setScriptContext(scriptContext); > - } > - > - /** > - * @param scriptEngineFactory ScriptEngineFactory reference from whom > this engine got created > - * @param bindings required binding needs to initialize this > engine, unless it defaults to engine scope > - */ > - public VelocityScriptEngine(ScriptEngineFactory scriptEngineFactory, > Bindings bindings) { > - this.scriptEngineFactory = scriptEngineFactory; > - this.scriptContext = new VelocityScriptContext(); > - ScriptUtil.setScriptContext(scriptContext); > - if (bindings != null) { > - this.scriptContext.setBindings(bindings, > ScriptContext.ENGINE_SCOPE); > - } else { > - ScriptUtil.addExceptionToErrorWriter(new > NullPointerException("Bindings cannot be null")); > - throw new NullPointerException("Bindings cannot be null"); > - } > - } > - > - > - /** > - * @return script engine factory who created this engine > - */ > - public ScriptEngineFactory getFactory() { > - > - // if null return a newly created one > - if (scriptEngineFactory == null) { > - createNewFactory(); > - } > - return scriptEngineFactory; > - } > > - private void createNewFactory() { > -// Added creation inside sync block to avoid creating two factories > from a engine by two parallel threads at the same time. > -// Also the additional null check out from sync block is to avoid > every thread to get blocked inside it even there is an already created > factory. > - synchronized (this) { > - if (scriptEngineFactory == null) { > - scriptEngineFactory = new VelocityScriptEngineFactory(); > - } > - } > - } > - > - /** > - * Creates the velocity core engine by initializing it from reading > property file/system properties > - * > - * @param context > - */ > - private void constructVelocityEngine(ScriptContext context) { > - > - Properties props = getPropertiesFromContext(context); > - //Check if property exists in context > - if (props != null) { > - initVelocityEngine(props); > - return; > - } else { > - props = getPropertiesFromSystem(); > - //Check if properties exists in System > - if (props != null) { > - initVelocityEngine(props); > - return; > - } > - } > - //Init velocity engine with default settings > - initVelocityEngine(); > - } > - > - /** > - * Init velocity engine without properties. > - */ > - private void initVelocityEngine() { > - > - if (velocityEngine != null) { > - > -// Add sync block from a parallel thread creating two velocity > engine instances > - synchronized (this) { > - velocityEngine = new VelocityEngine(); > - velocityEngine.init(); > - } > - } > - } > +/* > + * Main class for the Velocity script engine. Please refer to the > + * javax.script.ScriptEngine documentation for details. > + * > + * @author A. Sundararajan > + * @author <a href="mailto:claude.bris...@gmail.com">Claude Brisson</a> > + * @version $Id: VelocityScriptEngine.java$ > + */ > > - /** > - * Initializes the velocity engine with pre defined properties > - * > - * @param props > - */ > - private void initVelocityEngine(Properties props) { > - if (velocityEngine == null) { > - synchronized (this) { > - velocityEngine = new VelocityEngine(); > - velocityEngine.init(props); > - } > - } > - } > +import java.io.File; > +import java.io.FileInputStream; > +import java.io.Reader; > +import java.io.StringReader; > +import java.io.StringWriter; > +import java.io.Writer; > +import java.util.Properties; > +import org.apache.velocity.*; > +import org.apache.velocity.app.*; > > - /** > - * Obtain properties from a property file which is taken from a system > property > - * > - * @return > - */ > - private Properties getPropertiesFromSystem() { > - String propFileName = System.getProperty(VELOCITY_PROPERTIES); > - File propFile = new File(propFileName); > - if (propFile.exists()) { > - Properties properties = new Properties(); > - try { > - properties.load(new FileInputStream(propFile)); > - return properties; > - } catch (IOException e) { > - ScriptUtil.addExceptionToErrorWriter(e); > - return null; > - } > +import javax.script.AbstractScriptEngine; > +import javax.script.Bindings; > +import javax.script.ScriptContext; > +import javax.script.ScriptEngine; > +import javax.script.ScriptEngineFactory; > +import javax.script.ScriptException; > +import javax.script.SimpleBindings; > + > +public class VelocityScriptEngine extends AbstractScriptEngine > +{ > + > + public static final String STRING_OUTPUT_MODE_KEY = > "org.apache.velocity.stringOutput"; > + public static final String VELOCITY_PROPERTIES_KEY = > "org.apache.velocity.script.properties"; > + > + // my factory, may be null > + private volatile ScriptEngineFactory factory; > + private volatile VelocityEngine vengine; > + > + public VelocityScriptEngine(ScriptEngineFactory factory) > + { > + this.factory = factory; > + } > + > + public VelocityScriptEngine() > + { > + this(null); > + } > + > + public VelocityEngine getVelocityEngine() > + { > + return vengine; > + } > + > + // ScriptEngine methods > + public Object eval(String str, ScriptContext ctx) > + throws ScriptException > + { > + return eval(new StringReader(str), ctx); > + } > + > + public Object eval(Reader reader, ScriptContext ctx) > + throws ScriptException > + { > + initVelocityEngine(ctx); > + String fileName = getFilename(ctx); > + VelocityContext vctx = getVelocityContext(ctx); > + boolean outputAsString = isStringOutputMode(ctx); > + Writer out; > + if (outputAsString) > + { > + out = new StringWriter(); > + } > + else > + { > + out = ctx.getWriter(); > + } > + try > + { > + vengine.evaluate(vctx, out, fileName, reader); > + out.flush(); > } > - //TODO log error msg saying no such property file > - return null; > - } > - > - private Properties getPropertiesFromContext(ScriptContext context) { > - Object props = context.getAttribute(VELOCITY_PROPERTIES); > - if (props instanceof Properties) { > - return (Properties) props; > - } else { > - return null; > + catch (Exception exp) > + { > + throw new ScriptException(exp); > } > + return outputAsString ? out.toString() : null; > } > > - > - /** > - * Causes the immediate execution of the script whose source is the > String passed as the first argument. The script may be > - * re-parsed or recompiled before execution. State left in the engine > from previous executions, including variable values and > - * compiled procedures may be visible during this execution. > - * > - * @param s The script to be executed by the script engine. > - * @param scriptContext A ScriptContext exposing sets of attributes in > different scopes. The meanings of the > - * scopes ScriptContext.GLOBAL_SCOPE, and > ScriptContext.ENGINE_SCOPE are defined in the specification. > - * @return The value returned from the execution of the script. > - * @throws ScriptException > - */ > - public Object eval(String s, ScriptContext scriptContext) throws > ScriptException { > - return eval(new StringReader(s),scriptContext); > - } > - > - > - /** > - * Same as eval(String, ScriptContext) where the source of the script is > read from a Reader. > - * > - * @param reader The source of the script to be executed by the > script engine. > - * @param scriptContext The ScriptContext passed to the script engine. > - * @return The value returned from the execution of the script. > - * @throws ScriptException if an error occurrs in script. > - * java.lang.NullPointerException - if either > argument is null. > - */ > - public Object eval(Reader reader, ScriptContext scriptContext) throws > ScriptException { > - > - if (reader == null) { > - throw new NullPointerException("Reader passed cannot be null"); > - } > - constructVelocityEngine(scriptContext); > - VelocityContext velocityContext = getVelocityContext(scriptContext); > - > - Writer outPut; > - if (scriptContext.getWriter() != null) { > - outPut = scriptContext.getWriter(); > - } else { > - outPut = new StringWriter(); > - } > - boolean result; > - > - try { > - //Check for velocity tools vm file > - if (scriptContext.getAttribute(VelocityScriptEngine.FILENAME) != > null) { > - Template template = null; > - String fileName = > scriptContext.getAttribute(VelocityScriptEngine.FILENAME).toString(); > - //Cache hit > - if (ScriptResourceHolder.hasTemplate(fileName)) { > - template = ScriptResourceHolder.getTemplate(fileName); > - } else { > - try { > - template = velocityEngine.getTemplate(fileName); > - ScriptResourceHolder.putTemplate(fileName,template); > - template.merge(velocityContext, outPut); > - } catch(ResourceNotFoundException e1){ > + public ScriptEngineFactory getFactory() > + { > + if (factory == null) > + { > + synchronized (this) > + { > + if (factory == null) > + { > + factory = new VelocityScriptEngineFactory(); > + } > + } > + } > + return factory; > + } > + > + public Bindings createBindings() > + { > + return new SimpleBindings(); > + } > + > + // internals only below this point > + private void initVelocityEngine(ScriptContext ctx) > + { > + if (vengine == null) > + { > + synchronized (this) > + { > + if (vengine != null) return; > + > + Properties props = getVelocityProperties(ctx); > + VelocityEngine tmpEngine = new VelocityEngine(); > + try > + { > + if (props != null) > + { > + tmpEngine.init(props); > + } > + else > + { > + tmpEngine.init(); > } > - > } > + catch (RuntimeException rexp) > + { > + throw rexp; > + } > + catch (Exception exp) > + { > + throw new RuntimeException(exp); > + } > + vengine = tmpEngine; > } > - > - result = velocityEngine.evaluate(velocityContext, outPut, > VelocityScriptEngine.DEFAULT_LOG_TAG, reader); > - > - } catch (Exception exp) { > - ScriptUtil.addExceptionToErrorWriter(exp); > - throw new ScriptException(exp); > } > - return String.valueOf(result); > } > > - /** > - * Executes the specified script. The default ScriptContext for the > ScriptEngine is used. > - * > - * @param s The script language source to be executed. > - * @return The value returned from the execution of the script. > - * @throws ScriptException - if error occurrs in script. > - * java.lang.NullPointerException - if either > argument is null. > - */ > - public Object eval(String s) throws ScriptException { > - return eval(s, scriptContext); > - } > - > - > - /** > - * Same as eval(String) except that the source of the script is provided > as a Reader > - * > - * @param reader The source of the script. > - * @return The value returned by the script. > - * @throws ScriptException > - */ > - public Object eval(Reader reader) throws ScriptException { > - return eval(reader, scriptContext); > - } > - > - > - /** > - * Executes the script using the Bindings argument as the ENGINE_SCOPE > Bindings of the ScriptEngine during the script > - * execution. The Reader, Writer and non-ENGINE_SCOPE Bindings of the > default ScriptContext are used. > - * The ENGINE_SCOPE Bindings of the ScriptEngine is not changed, and its > mappings are unaltered by the script execution. > - * > - * @param s The source for the script. > - * @param bindings The Bindings of attributes to be used for script > execution. > - * @return The value returned by the script. > - * @throws ScriptException > - */ > - public Object eval(String s, Bindings bindings) throws ScriptException { > - ScriptContext scriptContext = > getGeneratedScriptContextFromBinding(bindings); > - return eval(new StringReader(s), scriptContext); > - } > - > - > - /** > - * Same as eval(String, Bindings) except that the source of the script > is provided as a Reader. > - * > - * @param reader The source of the script. > - * @param bindings The Bindings of attributes to be used for script > execution. > - * @return The value returned by the script. > - * @throws ScriptException > - */ > - public Object eval(Reader reader, Bindings bindings) throws > ScriptException { > - ScriptContext scriptContext = > getGeneratedScriptContextFromBinding(bindings); > - return eval(reader, scriptContext); > - } > - > - private ScriptContext getGeneratedScriptContextFromBinding(Bindings > bindings) { > - ScriptContext tmpContext = new VelocityScriptContext(); > - Bindings globalScope = > scriptContext.getBindings(ScriptContext.GLOBAL_SCOPE); > - > - //Setting global and engine scopes to context > - if (globalScope != null) { > - tmpContext.setBindings(globalScope, ScriptContext.GLOBAL_SCOPE); > - } > - > - if (bindings != null) { > - tmpContext.setBindings(bindings, ScriptContext.ENGINE_SCOPE); > - } else { > - ScriptUtil.addExceptionToErrorWriter(new > NullPointerException("Engine scope Bindings cannot be null.")); > - throw new NullPointerException("Engine scope Bindings cannot be > null."); > - } > - > - tmpContext.setReader(scriptContext.getReader()); > - tmpContext.setWriter(scriptContext.getWriter()); > - tmpContext.setErrorWriter(scriptContext.getErrorWriter()); > - > - return tmpContext; > - } > - > - /** > - * Sets a key/value pair in the state of the ScriptEngine that may > either create a Java Language Binding to be used in the > - * execution of scripts or be used in some other way, depending on > whether the key is reserved. Must have the same effect > - * as getBindings(ScriptContext.ENGINE_SCOPE).put. > - * > - * @param s The name of named value to add > - * @param o The value of named value to add. > - * Throws: > - * java.lang.NullPointerException - if key is null. > - * java.lang.IllegalArgumentException - if key is empty. > - */ > - public void put(String s, Object o) { > - > - if (s == null) { > - ScriptUtil.addExceptionToErrorWriter(new > NullPointerException("Name cannot be null")); > - throw new NullPointerException("Name cannot be null"); > - } > - > - if ("".equals(s)) { > - ScriptUtil.addExceptionToErrorWriter(new > IllegalArgumentException("Name cannot be empty")); > - throw new IllegalArgumentException("Name cannot be empty"); > - } > - > - Bindings engineScope = > scriptContext.getBindings(ScriptContext.ENGINE_SCOPE); > - engineScope.put(s, o); > - } > - > - > - /** > - * Retrieves a value set in the state of this engine. The value might be > one which was set using setValue or some other value in > - * the state of the ScriptEngine, depending on the implementation. Must > have the same effect as getBindings > - * (ScriptContext.ENGINE_SCOPE).get > - * > - * @param s The key whose value is to be returned > - * @return the value for the given key > - * Throws: > - * java.lang.NullPointerException - if key is null. > - * java.lang.IllegalArgumentException - if key is empty. > - */ > - public Object get(String s) { > - > - if (s == null) { > - ScriptUtil.addExceptionToErrorWriter(new > NullPointerException("Name cannot be null")); > - throw new NullPointerException("Name cannot be null"); > - } > - > - if ("".equals(s)) { > - ScriptUtil.addExceptionToErrorWriter(new > IllegalArgumentException("Name cannot be empty")); > - throw new IllegalArgumentException("Name cannot be empty"); > - } > - > - Bindings engineScope = > scriptContext.getBindings(ScriptContext.ENGINE_SCOPE); > - return engineScope.get(s); > - } > - > - > - /** > - * The Bindings instances that are returned must be identical to those > returned by the getBindings method of ScriptContext > - * called with corresponding arguments on the default ScriptContext of > the ScriptEngine. > - * > - * @param i scope > - * @return The Bindings with the specified scope. > - */ > - public Bindings getBindings(int i) { > - return scriptContext.getBindings(i); > - } > - > - > - /** > - * Sets a scope of named values to be used by scripts. The possible > scopes are: > - * ScriptContext.ENGINE_SCOPE - The specified Bindings replaces the > engine scope of the ScriptEngine. > - * ScriptContext.GLOBAL_SCOPE - The specified Bindings must be visible > as the GLOBAL_SCOPE. > - * Any other value of scope defined in the default ScriptContext of the > ScriptEngine. > - * > - * @param bindings The Bindings for the specified scope. > - * @param i The specified scope. Either > ScriptContext.ENGINE_SCOPE, ScriptContext.GLOBAL_SCOPE, or any other valid > value of scope. > - */ > - public void setBindings(Bindings bindings, int i) { > - scriptContext.setBindings(bindings, i); > - } > - > - > - /** > - * @return A Bindings that can be used to replace the state of this > ScriptEngine. > - */ > - public Bindings createBindings() { > - return new VelocityBindings(); > - } > - > - /** > - * Returns the default ScriptContext of the ScriptEngine whose Bindings, > Reader and Writers are used for script executions when no ScriptContext is > specified. > - * > - * @return The default ScriptContext of the ScriptEngine. > - */ > - public ScriptContext getContext() { > - return scriptContext; > - } > - > - > - /** > - * Sets the default ScriptContext of the ScriptEngine whose Bindings, > Reader and Writers are used for script executions when no ScriptContext is > specified. > - * > - * @param scriptContext A ScriptContext that will replace the default > ScriptContext in the ScriptEngine. > - * Throws: java.lang.NullPointerException - if > context is null. > - */ > - public void setContext(ScriptContext scriptContext) { > - if (scriptContext == null) { > - throw new NullPointerException("script context cannot be null"); > - } > - > - this.scriptContext = scriptContext; > - } > - > - private VelocityContext getVelocityContext(ScriptContext ctx) { > + private static VelocityContext getVelocityContext(ScriptContext ctx) > + { > + ctx.setAttribute("context", ctx, ScriptContext.ENGINE_SCOPE); > + Bindings globalScope = ctx.getBindings(ScriptContext.GLOBAL_SCOPE); > Bindings engineScope = ctx.getBindings(ScriptContext.ENGINE_SCOPE); > - if (ctx.getBindings(ScriptContext.GLOBAL_SCOPE) == null) { > + if (globalScope != null) > + { > + return new VelocityContext(engineScope, new > VelocityContext(globalScope)); > + } > + else > + { > return new VelocityContext(engineScope); > - } else { > - return new VelocityContext(engineScope, new > VelocityContext(ctx.getBindings(ScriptContext.GLOBAL_SCOPE))); > } > } > > - private String getTargetFilename(ScriptContext ctx) { > + private static String getFilename(ScriptContext ctx) > + { > Object fileName = ctx.getAttribute(ScriptEngine.FILENAME); > - if (fileName != null) { > - return fileName.toString(); > - } else { > - return "No-Such-File"; > + return fileName != null? fileName.toString() : "<unknown>"; > + } > + > + private static boolean isStringOutputMode(ScriptContext ctx) > + { > + Object flag = ctx.getAttribute(STRING_OUTPUT_MODE_KEY); > + return Boolean.parseBoolean(String.valueOf(flag)); > + } > + > + private static Properties getVelocityProperties(ScriptContext ctx) > + { > + try > + { > + Object props = ctx.getAttribute(VELOCITY_PROPERTIES_KEY); > + if (props instanceof Properties) > + { > + return (Properties) props; > + } > + else > + { > + String propsName = > System.getProperty(VELOCITY_PROPERTIES_KEY); > + if (propsName != null) > + { > + File propsFile = new File(propsName); > + if (propsFile.exists() && propsFile.canRead()) > + { > + Properties p = new Properties(); > + p.load(new FileInputStream(propsFile)); > + return p; > + } > + } > + } > } > + catch (Exception exp) > + { > + System.err.println(exp); > + } > + return null; > } > } > > Modified: > velocity/engine/trunk/velocity-engine-scripting/src/main/java/org/apache/velocity/script/VelocityScriptEngineFactory.java > URL: > http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-scripting/src/main/java/org/apache/velocity/script/VelocityScriptEngineFactory.java?rev=1752882&r1=1752881&r2=1752882&view=diff > ============================================================================== > --- > velocity/engine/trunk/velocity-engine-scripting/src/main/java/org/apache/velocity/script/VelocityScriptEngineFactory.java > (original) > +++ > velocity/engine/trunk/velocity-engine-scripting/src/main/java/org/apache/velocity/script/VelocityScriptEngineFactory.java > Fri Jul 15 22:30:59 2016 > @@ -1,304 +1,184 @@ > -package org.apache.velocity.script; > -/* > - * 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. > - */ > - > -import javax.script.ScriptEngine; > -import javax.script.ScriptEngineFactory; > -import java.util.ArrayList; > -import java.util.Collections; > -import java.util.List; > - > -/** > - * VelocityScriptEngineFactory is used to describe and instantiate > ScriptEngines. > - * There are two fundamental ways to instantiate this. > - * > - * 1. Create a factory by providing only name and version and allows to > inherit default factory settings. > - * 2. Create a factory by providing all required attributes i.e > List<String> names, List<String> extensions > - * List<String> mimeTypes , String name,String version, String > langName, String langVersion > - */ > -public class VelocityScriptEngineFactory implements ScriptEngineFactory { > - > - /** > - * names of the script engine > - */ > - private List<String> names; > - > - > - /** > - * List of extensions for script engine > - */ > - private List<String> extensions; > - > - > - /** > - * List of mime types for script engine > - */ > - private List<String> mimeTypes; > - > - /** > - * Default name of the engine > - */ > - private String name = "velocity"; > - > - > - /** > - * Default version of the engine > - */ > - private String version = "1.8"; > - > - > - /** > - * Default script language name > - */ > - private String langName = "velocity"; > - > - > - /** > - * Default version of the script language > - */ > - private String langVersion = "1.8"; > - > - > - /** > - * Provides full capability to change default engine settings > - * > - * @param names Override default names for script engine > - * @param extensions Override default extensions for script engine > - * @param mimeTypes Override default mime types for script engine > - * @param name Override default name for script engine > - * @param version Override default version for script engine > - * @param langName Override default language names for script engine > - * @param langVersion Override default language version for script engine > - */ > - public VelocityScriptEngineFactory(List<String> names, List<String> > extensions > - , List<String> mimeTypes > - , String name > - , String version > - , String langName > - , String langVersion > - ) { > - this.names = Collections.unmodifiableList(names); > - this.extensions = Collections.unmodifiableList(extensions); > - this.mimeTypes = Collections.unmodifiableList(mimeTypes); > - this.name = name; > - this.version = version; > - this.langName = langName; > - this.langVersion = langVersion; > - } > - > - /** > - * @param name Override default name for script engine > - * @param version Override default version for script engine > - */ > - public VelocityScriptEngineFactory(String name, String version) { > - this.name = name; > - this.version = version; > - initDefaultSettings(); > - } > - > - /** > - * Simple Factory with all default settings > - */ > - public VelocityScriptEngineFactory() { > - initDefaultSettings(); > - } > - > - private void initDefaultSettings() { > - names = new ArrayList<String>(1); > - names.add("Velocity"); > - names = Collections.unmodifiableList(names); > - extensions = new ArrayList<String>(3); > - extensions.add("vm"); > - extensions.add("vtl"); > - extensions.add("vhtml"); > - extensions = Collections.unmodifiableList(extensions); > - mimeTypes = new ArrayList<String>(1); > - mimeTypes.add("text/x-velocity"); > - mimeTypes = Collections.unmodifiableList(mimeTypes); > - } > - > - /** > - * Returns the full name of the ScriptEngine. > - * @return > - */ > - public String getEngineName() { > - return name; > - } > - > - > - /** > - * Returns the version of the ScriptEngine. > - * @return > - */ > - public String getEngineVersion() { > - return version; > - } > - > - > - /** > - * Returns an immutable list of filename extensions, which generally > identify scripts written in the language > - * supported by this ScriptEngine. > - * @return > - */ > - public List<String> getExtensions() { > - return extensions; > - } > - > - > - /** > - * Returns an immutable list of mimetypes, associated with scripts that > can be executed by the engine. > - * @return > - */ > - public List<String> getMimeTypes() { > - return mimeTypes; > - } > - > - > - /** > - * Returns an immutable list of short names for the ScriptEngine, which > may be used to identify the ScriptEngine by the ScriptEngineManager. > - * @return > - */ > - public List<String> getNames() { > - return names; > - } > - > - > - /** > - * Returns the name of the scripting langauge supported by this > ScriptEngine. > - * @return > - */ > - public String getLanguageName() { > - return langName; > - } > - > - > - /** > - * Returns the version of the scripting language supported by this > ScriptEngine. > - * @return > - */ > - public String getLanguageVersion() { > - return langVersion; > - } > - > - > - > - /** > - * Returns the value of an attribute whose meaning may be > implementation-specific. > - * @param s > - * @return > - */ > - public Object getParameter(String s) { > - if (s.equals(ScriptEngine.ENGINE)) { > - return getEngineName(); > - } else if (s.equals(ScriptEngine.NAME)) { > - return getNames().get(0); > - } else if (s.equals(ScriptEngine.LANGUAGE)) { > - return getLanguageName(); > - } else if (s.equals(ScriptEngine.ENGINE_VERSION)) { > - return getEngineVersion(); > - } else if (s.equals(ScriptEngine.LANGUAGE_VERSION)) { > - return getLanguageVersion(); > - } else if (s.equals("THREADING")) { > - return "MULTITHREADED"; > - } else { > - return null; > - } > - } > - > - > - > - /** > - * > - * @param s Name of the Object to whom the method belongs to > - * @param s1 Name of the method > - * @param strings method arguments to be passed > - * @return the method syntax for velocity script > - */ > - public String getMethodCallSyntax(String s, String s1, String... > strings) { > - StringBuilder syntax = new StringBuilder(); > - syntax.append("$"); > - syntax.append("{"); > - syntax.append(s); > - syntax.append("."); > - syntax.append(s1); > - syntax.append("("); > - if (strings.length != 0) { > - int i = 0; > - for (; i < strings.length - 1; i++) { > - syntax.append("$" + strings[i]); > - syntax.append(", "); > - } > - syntax.append("$" + strings[i]); > - } > - syntax.append(")"); > - syntax.append("}"); > - return syntax.toString(); > - } > - > - > - > - /** > - * > - * @param s String to display > - * @return //TODO > - */ > - public String getOutputStatement(String s) { > - StringBuilder output = new StringBuilder(); > - output.append("${context.getWriter().write(\""); > - for (int i = 0; i < s.length(); i++) { > - char ch = s.charAt(i); > - switch (ch) { > - case '"': > - output.append("\\\""); > - break; > - case '\\': > - output.append("\\\\"); > - break; > - default: > - output.append(ch); > - break; > - } > - } > - output.append("\")}"); > - return output.toString(); > - } > - > - > - /** > - * Returns A valid scripting language executable progam with given > statements. > - * @param strings scripting statements provided > - * @return the program from the statements given > - */ > - public String getProgram(String... strings) { > - StringBuilder program = new StringBuilder(); > - for (int i = 0; i < strings.length; i++) { > - program.append(strings[i]); > - program.append("\n"); > - } > - return program.toString(); > - } > - > - /** > - * Returns an instance of the ScriptEngine associated with this > ScriptEngineFactory > - * @return > - */ > - public ScriptEngine getScriptEngine() { > - return new VelocityScriptEngine(this); > - } > -} > +package org.apache.velocity.script; > + > +/* dual licencing... */ > + > +/* > + * 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. > + */ > + > +/* > + * Copyright 2006 Sun Microsystems, Inc. All rights reserved. > + * Use is subject to license terms. > + * > + * Redistribution and use in source and binary forms, with or without > modification, are > + * permitted provided that the following conditions are met: Redistributions > of source code > + * must retain the above copyright notice, this list of conditions and the > following disclaimer. > + * 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. Neither the name of the Sun Microsystems > nor the names of > + * is contributors may be used to endorse or promote products derived from > this software > + * without specific prior written permission. > + > + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS > IS" AND ANY EXPRESS > + * 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 COPYRIGHT OWNER > + * OR 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. > + */ > + > +/* > + * Factory class for the Velocity scripting interface. Please refer to the > + * javax.script.ScriptEngineFactory documentation for details. > + * > + * @author A. Sundararajan > + * @author <a href="mailto:claude.bris...@gmail.com">Claude Brisson</a> > + * @version $Id: VelocityScriptEngineFactory.java$ > + */ > + > +import javax.script.ScriptEngine; > +import javax.script.ScriptEngineFactory; > +import java.util.ArrayList; > +import java.util.Collections; > +import java.util.List; > +import java.util.Properties; > + > +public class VelocityScriptEngineFactory implements ScriptEngineFactory > +{ > + > + private static final String VELOCITY_NAME = "Velocity"; > + private static final String VELOCITY_VERSION = "2.0"; > + private static final String VELOCITY_LANGUAGE = "VTL"; > + > + private static List<String> names; > + private static List<String> extensions; > + private static List<String> mimeTypes; > + > + private static Properties parameters; > + > + static > + { > + names = new ArrayList(); > + names.add("velocity"); > + names.add("Velocity"); > + names = Collections.unmodifiableList(names); > + extensions = new ArrayList(); > + extensions.add("vm"); > + extensions.add("vtl"); > + extensions.add("vhtml"); > + extensions = Collections.unmodifiableList(extensions); > + mimeTypes = new ArrayList(); > + mimeTypes.add("text/x-velocity"); > + mimeTypes = Collections.unmodifiableList(mimeTypes); > + parameters = new Properties(); > + parameters.put(ScriptEngine.NAME, VELOCITY_NAME); > + parameters.put(ScriptEngine.ENGINE_VERSION, VELOCITY_VERSION); > + parameters.put(ScriptEngine.ENGINE, VELOCITY_NAME); > + parameters.put(ScriptEngine.LANGUAGE, VELOCITY_LANGUAGE); > + parameters.put(ScriptEngine.LANGUAGE_VERSION, VELOCITY_VERSION); > + parameters.put("THREADING", "MULTITHREADED"); > + } > + > + public String getEngineName() > + { > + return VELOCITY_NAME; > + } > + > + public String getEngineVersion() > + { > + return VELOCITY_VERSION; > + } > + > + public List<String> getExtensions() > + { > + return extensions; > + } > + > + public String getLanguageName() > + { > + return VELOCITY_NAME; > + } > + > + public String getLanguageVersion() > + { > + return VELOCITY_VERSION; > + } > + > + public String getMethodCallSyntax(String obj, String m, String... args) > + { > + StringBuilder buf = new StringBuilder(); > + buf.append("${"); > + buf.append(obj); > + buf.append("."); > + buf.append(m); > + buf.append("("); > + if (args.length != 0) > + { > + int i = 0; > + for (; i < args.length - 1; i++) > + { > + buf.append("$" + args[i]); > + buf.append(", "); > + } > + buf.append("$" + args[i]); > + } > + buf.append(")}"); > + return buf.toString(); > + } > + > + public List<String> getMimeTypes() > + { > + return mimeTypes; > + } > + > + public List<String> getNames() > + { > + return names; > + } > + > + public String getOutputStatement(String toDisplay) > + { > + StringBuilder buf = new StringBuilder(); > + buf.append("#[[").append(toDisplay).append("]]#"); > + return buf.toString(); > + } > + > + public String getParameter(String key) > + { > + return parameters.getProperty(key); > + } > + > + public String getProgram(String... statements) > + { > + StringBuilder buf = new StringBuilder(); > + for (int i = 0; i < statements.length; i++) > + { > + buf.append(statements[i]); > + buf.append("\n"); > + } > + return buf.toString(); > + } > + > + public ScriptEngine getScriptEngine() > + { > + return new VelocityScriptEngine(this); > + } > +} > > Modified: > velocity/engine/trunk/velocity-engine-scripting/src/test/java/org/apache/velocity/script/test/ScriptEngineTest.java > URL: > http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-scripting/src/test/java/org/apache/velocity/script/test/ScriptEngineTest.java?rev=1752882&r1=1752881&r2=1752882&view=diff > ============================================================================== > --- > velocity/engine/trunk/velocity-engine-scripting/src/test/java/org/apache/velocity/script/test/ScriptEngineTest.java > (original) > +++ > velocity/engine/trunk/velocity-engine-scripting/src/test/java/org/apache/velocity/script/test/ScriptEngineTest.java > Fri Jul 15 22:30:59 2016 > @@ -65,29 +65,13 @@ public class ScriptEngineTest extends Ab > } > > public void testEngineEvals() throws ScriptException { > - String path = > ScriptEngineTest.class.getProtectionDomain().getCodeSource().getLocation().getPath(); > - String propertyFile = > path.substring(0,path.indexOf("target/test-classes")) + > - > "src/test/java/org/apache/velocity/script/test/resources/velocity.properties"; > - System.setProperty(VelocityScriptEngine.VELOCITY_PROPERTIES, > propertyFile) ; > - //Comment test case > - > + String path = System.getProperty("test.resources.dir"); > Writer writer = new StringWriter(); > engine.getContext().setWriter(writer); > - String script = "<html>\n" + > - "<body>\n" + > - "#set( $foo = \"Velocity\" )\n" + > - "Hello $foo World!\n" + > - "</body>\n" + > - "<html>"; > -// String script = "## This is a comment "; > + > engine.getContext().setAttribute(VelocityScriptEngine.VELOCITY_PROPERTIES_KEY, > path + "/test-classes/velocity.properties", ScriptContext.ENGINE_SCOPE); > + > engine.getContext().setAttribute(VelocityScriptEngine.STRING_OUTPUT_MODE_KEY, > "true", ScriptContext.ENGINE_SCOPE); > + String script = "<html><body>#set( $foo = 'Velocity' )Hello $foo > World!</body><html>"; > Object result = engine.eval(script); > - assertTrue(Boolean.valueOf(result.toString())); > - System.out.println(">>>"+writer); > - //TODO add more engine script evaluation test cases > - > + assertEquals(String.valueOf(result), "<html><body>Hello Velocity > World!</body><html>"); > } > - > - > - > - > } > > Modified: > velocity/engine/trunk/velocity-engine-scripting/src/test/java/org/apache/velocity/script/test/VelocityScriptContextTest.java > URL: > http://svn.apache.org/viewvc/velocity/engine/trunk/velocity-engine-scripting/src/test/java/org/apache/velocity/script/test/VelocityScriptContextTest.java?rev=1752882&r1=1752881&r2=1752882&view=diff > ============================================================================== > --- > velocity/engine/trunk/velocity-engine-scripting/src/test/java/org/apache/velocity/script/test/VelocityScriptContextTest.java > (original) > +++ > velocity/engine/trunk/velocity-engine-scripting/src/test/java/org/apache/velocity/script/test/VelocityScriptContextTest.java > Fri Jul 15 22:30:59 2016 > @@ -19,8 +19,9 @@ package org.apache.velocity.script.test; > * under the License. > */ > > -import org.apache.velocity.script.VelocityBindings; > +import javax.script.Bindings; > import javax.script.ScriptContext; > +import javax.script.SimpleBindings; > import java.util.List; > > > @@ -41,7 +42,7 @@ public class VelocityScriptContextTest e > > public void testScopes() { > > - VelocityBindings velocityBindings = new VelocityBindings(); > + Bindings velocityBindings = new SimpleBindings(); > engine.getContext().setBindings(velocityBindings, > ScriptContext.ENGINE_SCOPE); > assertNotNull(engine.getBindings(ScriptContext.ENGINE_SCOPE)); > assertNotNull("Engines Registered through manager sets the global > scope", engine.getBindings(ScriptContext.GLOBAL_SCOPE)); > @@ -88,7 +89,7 @@ public class VelocityScriptContextTest e > } > > try { > - context.setBindings(new VelocityBindings(), invalidScope); > + context.setBindings(new SimpleBindings(), invalidScope); > fail("Cannot pass invalid scope"); > } catch (IllegalArgumentException n) { > //Success > @@ -156,5 +157,3 @@ public class VelocityScriptContextTest e > > } > } > - > - > > --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@velocity.apache.org For additional commands, e-mail: dev-h...@velocity.apache.org