aboutsummaryrefslogtreecommitdiff
path: root/velocity-engine-core/src/main/java/org/apache/velocity/app/VelocityEngine.java
diff options
context:
space:
mode:
Diffstat (limited to 'velocity-engine-core/src/main/java/org/apache/velocity/app/VelocityEngine.java')
-rw-r--r--velocity-engine-core/src/main/java/org/apache/velocity/app/VelocityEngine.java431
1 files changed, 431 insertions, 0 deletions
diff --git a/velocity-engine-core/src/main/java/org/apache/velocity/app/VelocityEngine.java b/velocity-engine-core/src/main/java/org/apache/velocity/app/VelocityEngine.java
new file mode 100644
index 00000000..93751f3a
--- /dev/null
+++ b/velocity-engine-core/src/main/java/org/apache/velocity/app/VelocityEngine.java
@@ -0,0 +1,431 @@
+package org.apache.velocity.app;
+
+/*
+ * 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 org.apache.velocity.Template;
+import org.apache.velocity.context.Context;
+import org.apache.velocity.exception.MethodInvocationException;
+import org.apache.velocity.exception.ParseErrorException;
+import org.apache.velocity.exception.ResourceNotFoundException;
+import org.apache.velocity.runtime.RuntimeConstants;
+import org.apache.velocity.runtime.RuntimeInstance;
+import org.slf4j.Logger;
+
+import java.io.Reader;
+import java.io.Writer;
+import java.util.Properties;
+
+/**
+ * <p>
+ * This class provides a separate new-able instance of the
+ * Velocity template engine. The alternative model for use
+ * is using the Velocity class which employs the singleton
+ * model.
+ * </p>
+ * <p>Velocity will call
+ * the parameter-less init() at the first use of this class
+ * if the init() wasn't explicitly called. While this will
+ * ensure that Velocity functions, it probably won't
+ * function in the way you intend, so it is strongly recommended that
+ * you call an init() method yourself if you use the default constructor.
+ * </p>
+ *
+ * @version $Id$
+ */
+public class VelocityEngine implements RuntimeConstants
+{
+ private RuntimeInstance ri = new RuntimeInstance();
+
+ /**
+ * Init-less CTOR
+ */
+ public VelocityEngine()
+ {
+ // do nothing
+ }
+
+ /**
+ * Construct a VelocityEngine with the initial properties defined in the file
+ * propsFilename
+ * @param propsFilename properties filename
+ */
+ public VelocityEngine(String propsFilename)
+ {
+ ri.setProperties(propsFilename);
+ }
+
+ /**
+ * Construct a VelocityEngine instance with the specified initial properties.
+ * @param p properties
+ */
+ public VelocityEngine(Properties p)
+ {
+ ri.setProperties(p);
+ }
+
+ /**
+ * initialize the Velocity runtime engine, using the default
+ * properties of the Velocity distribution
+ */
+ public void init()
+ {
+ ri.init();
+ }
+
+ /**
+ * Resets the instance, so Velocity can be re-initialized again.
+ *
+ * @since 2.0.0
+ */
+ public void reset()
+ {
+ ri.reset();
+ }
+
+ /**
+ * initialize the Velocity runtime engine, using default properties
+ * plus the properties in the properties file passed in as the arg
+ *
+ * @param propsFilename file containing properties to use to initialize
+ * the Velocity runtime
+ */
+ public void init(String propsFilename)
+ {
+ ri.init(propsFilename);
+ }
+
+ /**
+ * initialize the Velocity runtime engine, using default properties
+ * plus the properties in the passed in java.util.Properties object
+ *
+ * @param p Properties object containing initialization properties
+ */
+ public void init(Properties p)
+ {
+ ri.init(p);
+ }
+
+ /**
+ * Set a Velocity Runtime property.
+ *
+ * @param key
+ * @param value
+ */
+ public void setProperty(String key, Object value)
+ {
+ ri.setProperty(key, value);
+ }
+
+ /**
+ * Add a Velocity Runtime property.
+ *
+ * @param key
+ * @param value
+ */
+ public void addProperty(String key, Object value)
+ {
+ ri.addProperty(key, value);
+ }
+
+ /**
+ * Clear a Velocity Runtime property.
+ *
+ * @param key of property to clear
+ */
+ public void clearProperty(String key)
+ {
+ ri.clearProperty(key);
+ }
+
+ /**
+ * Set an entire configuration at once from a Properties configuration
+ *
+ * @param configuration
+ * @since 2.0
+ */
+ public void setProperties(Properties configuration)
+ {
+ ri.setProperties( configuration );
+ }
+
+ /**
+ * Set an entire configuration at once from a named properties file
+ *
+ * @param propsFilename properties filename
+ * @since 2.1
+ */
+ public void setProperties(String propsFilename)
+ {
+ ri.setProperties(propsFilename);
+ }
+
+ /**
+ * Get a Velocity Runtime property.
+ *
+ * @param key property to retrieve
+ * @return property value or null if the property
+ * not currently set
+ */
+ public Object getProperty( String key )
+ {
+ return ri.getProperty( key );
+ }
+
+ /**
+ * renders the input string using the context into the output writer.
+ * To be used when a template is dynamically constructed, or want to use
+ * Velocity as a token replacer.
+ *
+ * @param context context to use in rendering input string
+ * @param out Writer in which to render the output
+ * @param logTag string to be used as the template name for log
+ * messages in case of error
+ * @param instring input string containing the VTL to be rendered
+ *
+ * @return true if successful, false otherwise. If false, see
+ * Velocity runtime log
+ * @throws ParseErrorException The template could not be parsed.
+ * @throws MethodInvocationException A method on a context object could not be invoked.
+ * @throws ResourceNotFoundException A referenced resource could not be loaded.
+ */
+ public boolean evaluate( Context context, Writer out,
+ String logTag, String instring )
+ throws ParseErrorException, MethodInvocationException,
+ ResourceNotFoundException
+ {
+ return ri.evaluate(context, out, logTag, instring);
+ }
+
+ /**
+ * Renders the input reader using the context into the output writer.
+ * To be used when a template is dynamically constructed, or want to
+ * use Velocity as a token replacer.
+ *
+ * @param context context to use in rendering input string
+ * @param writer Writer in which to render the output
+ * @param logTag string to be used as the template name for log messages
+ * in case of error
+ * @param reader Reader containing the VTL to be rendered
+ *
+ * @return true if successful, false otherwise. If false, see
+ * Velocity runtime log
+ * @throws ParseErrorException The template could not be parsed.
+ * @throws MethodInvocationException A method on a context object could not be invoked.
+ * @throws ResourceNotFoundException A referenced resource could not be loaded.
+ * @since Velocity v1.1
+ */
+ public boolean evaluate(Context context, Writer writer,
+ String logTag, Reader reader)
+ throws ParseErrorException, MethodInvocationException,
+ ResourceNotFoundException
+ {
+ return ri.evaluate(context, writer, logTag, reader);
+ }
+
+
+ /**
+ * Invokes a currently registered Velocimacro with the params provided
+ * and places the rendered stream into the writer.
+ * <br>
+ * Note : currently only accepts args to the VM if they are in the context.
+ *
+ * @param vmName name of Velocimacro to call
+ * @param logTag string to be used for template name in case of error. if null,
+ * the vmName will be used
+ * @param params keys for args used to invoke Velocimacro, in java format
+ * rather than VTL (eg "foo" or "bar" rather than "$foo" or "$bar")
+ * @param context Context object containing data/objects used for rendering.
+ * @param writer Writer for output stream
+ * @return true if Velocimacro exists and successfully invoked, false otherwise.
+ */
+ public boolean invokeVelocimacro( String vmName, String logTag,
+ String params[], Context context,
+ Writer writer )
+ {
+ return ri.invokeVelocimacro(vmName, logTag, params, context, writer);
+ }
+
+ /**
+ * merges a template and puts the rendered stream into the writer
+ *
+ * @param templateName name of template to be used in merge
+ * @param encoding encoding used in template
+ * @param context filled context to be used in merge
+ * @param writer writer to write template into
+ *
+ * @return true if successful, false otherwise. Errors
+ * logged to velocity log
+ * @throws ResourceNotFoundException
+ * @throws ParseErrorException
+ * @throws MethodInvocationException
+ * @since Velocity v1.1
+ */
+ public boolean mergeTemplate( String templateName, String encoding,
+ Context context, Writer writer )
+ throws ResourceNotFoundException, ParseErrorException, MethodInvocationException
+ {
+ Template template = ri.getTemplate(templateName, encoding);
+
+ if ( template == null )
+ {
+ String msg = "VelocityEngine.mergeTemplate() was unable to load template '"
+ + templateName + "'";
+ getLog().error(msg);
+ throw new ResourceNotFoundException(msg);
+ }
+ else
+ {
+ template.merge(context, writer);
+ return true;
+ }
+ }
+
+ /**
+ * Returns a <code>Template</code> from the Velocity
+ * resource management system.
+ *
+ * @param name The file name of the desired template.
+ * @return The template.
+ * @throws ResourceNotFoundException if template not found
+ * from any available source.
+ * @throws ParseErrorException if template cannot be parsed due
+ * to syntax (or other) error.
+ */
+ public Template getTemplate(String name)
+ throws ResourceNotFoundException, ParseErrorException
+ {
+ return ri.getTemplate( name );
+ }
+
+ /**
+ * Returns a <code>Template</code> from the Velocity
+ * resource management system.
+ *
+ * @param name The file name of the desired template.
+ * @param encoding The character encoding to use for the template.
+ * @return The template.
+ * @throws ResourceNotFoundException if template not found
+ * from any available source.
+ * @throws ParseErrorException if template cannot be parsed due
+ * to syntax (or other) error.
+ * @since Velocity v1.1
+ */
+ public Template getTemplate(String name, String encoding)
+ throws ResourceNotFoundException, ParseErrorException
+ {
+ return ri.getTemplate( name, encoding );
+ }
+
+ /**
+ * Determines if a resource is accessible via the currently
+ * configured resource loaders.
+ * <br><br>
+ * Note that the current implementation will <b>not</b>
+ * change the state of the system in any real way - so this
+ * cannot be used to pre-load the resource cache, as the
+ * previous implementation did as a side-effect.
+ * <br><br>
+ * The previous implementation exhibited extreme laziness and
+ * sloth, and the author has been flogged.
+ *
+ * @param resourceName name of the resource to search for
+ * @return true if found, false otherwise
+ * @since 1.5
+ */
+ public boolean resourceExists(String resourceName)
+ {
+ return (ri.getLoaderNameForResource(resourceName) != null);
+ }
+
+ /**
+ * Returns the current slf4j logger. Its namespace defaults to <code>org.apache.velocity</code>
+ * if it hasn't been configured using the property <code>runtime.log.name</code> or the property
+ * <code>runtime.log.instance</code>.
+ * @return A Logger object.
+ * @since 1.5
+ */
+ public Logger getLog()
+ {
+ return ri.getLog();
+ }
+
+ /**
+ * <p>
+ * Sets an application attribute (which can be any Object) that will be
+ * accessible from any component of the system that gets a
+ * RuntimeServices. This allows communication between the application
+ * environment and custom pluggable components of the Velocity engine,
+ * such as ResourceLoaders and Loggers.
+ * </p>
+ *
+ * <p>
+ * Note that there is no enforcement or rules for the key
+ * used - it is up to the application developer. However, to
+ * help make the intermixing of components possible, using
+ * the target Class name (e.g. com.foo.bar ) as the key
+ * might help avoid collision.
+ * </p>
+ *
+ * @param key object 'name' under which the object is stored
+ * @param value object to store under this key
+ */
+ public void setApplicationAttribute( Object key, Object value )
+ {
+ ri.setApplicationAttribute(key, value);
+ }
+
+ /**
+ * <p>
+ * Return an application attribute (which can be any Object)
+ * that was set by the application in order to be accessible from
+ * any component of the system that gets a RuntimeServices.
+ * This allows communication between the application
+ * environment and custom pluggable components of the
+ * Velocity engine, such as ResourceLoaders and Loggers.
+ * </p>
+ *
+ * @param key object 'name' under which the object is stored
+ * @return value object to store under this key
+ * @since 1.5
+ */
+ public Object getApplicationAttribute( Object key )
+ {
+ return ri.getApplicationAttribute(key);
+ }
+
+ /**
+ * Remove a directive.
+ * @param name name of the directive.
+ */
+ public void removeDirective(String name)
+ {
+ ri.removeDirective(name);
+ }
+
+ /**
+ * Instantiates and loads the directive with some basic checks.
+ *
+ * @param directiveClass classname of directive to load
+ */
+ public void loadDirective(String directiveClass)
+ {
+ ri.loadDirective(directiveClass);
+ }
+}