Author: cbrisson
Date: Wed Jul 20 14:44:04 2016
New Revision: 1753523
URL: http://svn.apache.org/viewvc?rev=1753523&view=rev
Log:
[site] update engine/devel doc:
- split dev guide page into distinct dev guide page and configuration page
- reflect java 1.5 -> java 1.7 change
- new "Customizing Introspection" section listing all available Uberspector
- some doc fixes
Added:
velocity/site/cms/trunk/content/engine/devel/configuration.mdtext
Modified:
velocity/site/cms/trunk/content/engine/devel/build.mdtext
velocity/site/cms/trunk/content/engine/devel/developer-guide.mdtext
velocity/site/cms/trunk/content/engine/devel/left.nav
velocity/site/cms/trunk/content/engine/devel/upgrading.mdtext
velocity/site/cms/trunk/content/engine/devel/user-guide.mdtext
Modified: velocity/site/cms/trunk/content/engine/devel/build.mdtext
URL:
http://svn.apache.org/viewvc/velocity/site/cms/trunk/content/engine/devel/build.mdtext?rev=1753523&r1=1753522&r2=1753523&view=diff
==============================================================================
--- velocity/site/cms/trunk/content/engine/devel/build.mdtext (original)
+++ velocity/site/cms/trunk/content/engine/devel/build.mdtext Wed Jul 20
14:44:04 2016
@@ -14,7 +14,7 @@ To build Velocity we require [Maven](htt
Velocity requires JDK 1.6 or greater to compile.
-Finally, if you wish to modify Velocity's grammar you will need to a tool
called [JavaCC](http://javacc.dev.java.net). We recommend version 3.2 or
greater (for compatibility with JDK 1.5 syntax changes).
+Finally, if you wish to modify Velocity's grammar you will need to a tool
called [JavaCC](http://javacc.dev.java.net). We recommend version 3.2 or
greater.
## Building
Added: velocity/site/cms/trunk/content/engine/devel/configuration.mdtext
URL:
http://svn.apache.org/viewvc/velocity/site/cms/trunk/content/engine/devel/configuration.mdtext?rev=1753523&view=auto
==============================================================================
--- velocity/site/cms/trunk/content/engine/devel/configuration.mdtext (added)
+++ velocity/site/cms/trunk/content/engine/devel/configuration.mdtext Wed Jul
20 14:44:04 2016
@@ -0,0 +1,345 @@
+Title: Apache Velocity Engine - Configuration
+
+## Velocity Configuration - Contents
+
+[TOC]
+
+## Configuring Velocity
+
+Velocity's runtime configuration is controlled by a set of configuration keys
listed below. Generally, these keys will have values that consist of either a
String, or a comma-separated list of Strings, referred to as a CSV for
comma-separated values.
+
+There is a set of default values contained in Velocity's jar, found in
/src/java/org/apache/velocity/runtime/defaults/velocity.defaults, that Velocity
uses as its configuration baseline. This ensures that Velocity will always have
a 'correct' value for its configuration keys at startup, although it may not be
what you want.
+
+Any values specified before init() time will replace the default values.
Therefore, you only have to configure velocity with the values for the keys
that you need to change, and not worry about the rest. Further, as we add more
features and configuration capability, you don't have to change your
configuration files to suit - the Velocity engine will always have default
values.
+
+Please sees the section [**Using
Velocity**](developer-guide.html#using-velocity) for discussion on the
configuration API.
+
+Below are listed the configuration keys that control Velocity's behavior,
organized by category. Each key is listed with its current default value to the
right of the '=' sign.
+
+## Logging
+
+`runtime.log.instance = *Java Object instance*`
+
+> Living Java instance, that must implement the interface org.slf4j.Logger.
This property can only be set programmatically. By default, Velocity uses the
SLF4J static discovery mechanism, see the
[Logging](developer-guide.html#logging) section in the dev guide.
+
+`runtime.log.name = Velocity`
+
+> If no living Logger instance has been given using the previous property,
Velocity will get a Logger object using the provided name.
+
+`runtime.log.invalid.references = true`
+
+> Property to turn off the log output when a reference isn't valid. Good thing
to turn off in production, but very valuable for debugging.
+
+## Character Encoding
+
+`input.encoding = UTF-8`
+
+> Character encoding for input (templates). If not specified, Velocity relies
on the 'file.encoding' system property.
+
+## VTL Directives
+
+### #define() Directive
+
+`define.provide.scope.control = false`
+
+> Used to turn on the automatic provision of the $define scope control during
#define() calls. The default is false. Set it to true if you want a local,
managed namespace you can put references in when within a #define block or if
you want it for more advanced #break usage.
+
+### #evaluate() Directive
+
+`evaluate.provide.scope.control = false`
+
+> Used to turn on the automatic provision of the $evaluate scope during
#evaluate() or Velocity[Engine].evaluate(...) calls. The default is false. Set
it to true if you want a local, managed namespace you can put references in
during an evaluation or if you want it for more advanced #break usage.
+
+### #foreach() Directive
+
+`foreach.provide.scope.control = true`
+
+> Used to control the automatic provision of the $foreach scope during
#foreach calls. This gives access to the foreach status information (e.g.
$foreach.index or $foreach.hasNext). The default is true. Set it to false if
unused and you want a tiny performance boost.
+
+`directive.foreach.maxloops = -1`
+
+> Maximum allowed number of loops for a #foreach() statement.
+
+`directive.foreach.skip.invalid = true`
+
+> Tells #foreach to simply skip rendering when the object it is iterating over
is not or cannot produce a valid Iterator.
+
+### #if() Directive
+
+`directive.if.tostring.nullcheck = true`
+
+> Default behavior is to check return value of toString() and treat an object
with toString() that returns null as null. If all objects have toString()
methods that never return null, this check is unnecessary and can be disabled
to gain performance. In Velocity 1.5, no such null check was performed.
+
+### #set() Directive
+
+`directive.set.null.allowed = false`
+
+> If true, having a right hand side of a #set() statement with an invalid
reference or null value will set the left hand side to null. If false, the left
hand side will stay the same.
+
+### #include() and #parse() Directives
+
+`directive.include.output.errormsg.start = <!-- include error :`
+`directive.include.output.errormsg.end = see error log --> `
+
+> Defines the beginning and ending tags for an in-stream error message in the
case of a problem with the #include() directive. If both the .start and .end
tags are defined, an error message will be output to the stream, of the form
'.start msg .end' where .start and .end refer to the property values. Output to
the render stream will only occur if both the .start and .end (next) tag are
defined.
+
+`directive.parse.max.depth = 10`
+
+> Defines the allowable parse depth for a template. A template may #parse()
another template which itself may have a #parse() directive. This value
prevents runaway #parse() recursion.
+
+`template.provide.scope.control = false`
+
+> Used to turn on the automatic provision of the $template scope control
during #parse calls and template.merge(...) calls. The default is false. Set it
to true if you want a secure namespace for your template variables or more
advanced #break control.
+
+## Resource Management
+
+`resource.manager.logwhenfound = true`
+
+> Switch to control logging of 'found' messages from resource manager. When a
resource is found for the first time, the resource name and classname of the
loader that found it will be noted in the runtime log.
+
+`resource.manager.cache.class`
+
+> Declares the class to be used for resource caching. The current default is
`org.apache.velocity.runtime.resource.ResourceCacheImpl`. When
`resource.manager.defaultcache.size` is set to 0, then the default
implementation is the standard Java `ConcurrentHashMap`. Otherwise, a non-zero
cache size uses an LRU Map. The default cache size is 89. Note that the
ConcurrentHashMap may be better at thread concurrency.
+
+`resource.manager.defaultcache.size`
+
+> Sets the size of the default implementation of the resource manager cache
size. The default is 89.
+
+`resource.loader = <name> (default = file)`
+
+> *Multi-valued key. Will accept CSV for value.* Public name of a resource
loader to be used. This public name will then be used in the specification of
the specific properties for that resource loader. Note that as a multi-valued
key, it's possible to pass a value like "file, class" (sans quotes), indicating
that following will be configuration values for two loaders.
+
+`<name>.loader.description = Velocity File Resource Loader`
+
+> Description string for the given loader.
+
+`<name>.resource.loader.class =
org.apache.velocity.runtime.resource.loader.FileResourceLoader`
+
+> Name of implementation class for the loader. The default loader is the file
loader.
+
+`<name>.resource.loader.path = .`
+
+> *Multi-valued key. Will accept CSV for value.* Root(s) from which the
loader loads templates. Templates may live in subdirectories of this root. ex.
homesite/index.vm This configuration key applies currently to the
FileResourceLoader and JarResourceLoader.
+
+`<name>.resource.loader.cache = false`
+
+> Controls caching of the templates in the loader. Default is false, to make
life easy for development and debugging. This should be set to true for
production deployment. When 'true', the `modificationCheckInterval` property
applies. This allows for the efficiency of caching, with the convenience of
controlled reloads - useful in a hosted or ISP environment where templates can
be modifed frequently and bouncing the application or servlet engine is not
desired or permitted.
+
+`<name>.resource.loader.modificationCheckInterval = 2`
+
+> This is the number of seconds between modification checks when caching is
turned on. When this is an integer > 0, this represents the number of seconds
between checks to see if the template was modified. If the template has been
modified since last check, then it is reloaded and reparsed. Otherwise nothing
is done. When <= 0, no modification checks will take place, and assuming that
the property `cache` (above) is true, once a template is loaded and parsed the
first time it is used, it will not be checked or reloaded after that until the
application or servlet engine is restarted.
+
+> To illustrate, here is an example taken right from the default Velocity
properties, showing how setting up the FileResourceLoader is managed
+
+ resource.loader = file
+
+ file.resource.loader.description = Velocity File Resource Loader
+ file.resource.loader.class =
org.apache.velocity.runtime.resource.loader.FileResourceLoader
+ file.resource.loader.path = .
+ file.resource.loader.cache = false
+ file.resource.loader.modificationCheckInterval = 2
+
+## Velocimacros
+
+`velocimacro.library = VM_global_library.vm `
+
+
+> *Multi-valued key. Will accept CSV for value.* Filename(s) of Velocimacro
library to be loaded when the Velocity Runtime engine starts. These
Velocimacros are accessable to all templates. The file is assumed to be
relative to the root of the file loader resource path.
+
+`velocimacro.permissions.allow.inline = true`
+
+> Determines of the definition of new Velocimacros via the #macro() directive
in templates is allowed. The default value is true, meaning any template can
define and use new Velocimacros. Note that depending on other properties,
those #macro() statements can replace global definitions.
+
+`velocimacro.permissions.allow.inline.to.replace.global = false `
+
+> Controls if a Velocimacro defind 'inline' in a template can replace a
Velocimacro defined in a library loaded at startup.
+
+`velocimacro.permissions.allow.inline.local.scope = false`
+
+> Controls 'private' templates namespaces for Velocimacros. When true, a
#macro() directive in a template creates a Velocimacro that is accessable only
from the defining template. This means that Velocimacros cannot be shared
unless they are in the global or local library loaded at startup. (See above.)
It also means that templates cannot interfere with each other. This property
also allows a technique where there is a 'default' Velocimacro definition in
the global or local library, and a template can 'override' the implementation
for use within that template. This occurrs because when this property is true,
the template's namespace is searched for a Velocimacro before the global
namespace, therefore allowing the override mechanism.
+
+`velocimacro.context.localscope = false`
+
+> Controls whether reference access (set/get) within a Velocimacro will change
the context, or be of local scope in that Velocimacro. This feature is
deprecated and has been removed in Velocity 2.0. Instead, please use the
$macro namespace for storage of references local to your Velocimacro. (e.g.
#set( $macro.foo = 'bar') and $macro.foo)
+
+`velocimacro.library.autoreload = false`
+
+> Controls Velocimacro library autoloading. When set to `true` the source
Velocimacro library for an invoked Velocimacro will be checked for changes, and
reloaded if necessary. This allows you to change and test Velocimacro
libraries without having to restart your application or servlet container, just
like you can with regular templates. This mode only works when caching is *off*
in the resource loaders (e.g. `file.resource.loader.cache = false` ). This
feature is intended for development, not for production.
+
+`velocimacro.arguments.strict = false`
+
+> When set to true, will throw a `ParseErrorException` when parsing a template
containing a macro with an invalid number of arguments. Is set to false by
default to maintain backwards compatibility with templates written before this
feature became available.
+
+`velocimacro.body.reference = false`
+
+> Defines name of the reference that can be used to get the body content (an
AST block) given for a block macro call (e.g. #@myMacro() has a body #end). The
default reference name is "bodyContent" (e.g. $bodyContent). This block macro
feature was introduced in Velocity 1.7.
+
+`macro.provide.scope.control = false`
+
+> Used to turn on the automatic provision of the $macro scope control during
#macro calls. The default is false. Set it to true if you need a local
namespace in macros or more advanced #break controls.
+
+`<somebodymacro>.provide.scope.control = false`
+
+> Used to turn on the automatic provision of the $<nameofthemacro> scope
control during a call to a macro with a body (e.g. #@foo #set($foo.a=$b) ...
$foo.a #end). The default is false. Set it to true if you happen to need a
namespace just for your macro's body content or more advanced #break controls.
+</p>
+
+## Strict Reference Setting
+
+`runtime.references.strict = false`
+
+> New in Velocity 1.6, when set to true Velocity will throw a
`MethodInvocationException` for references that are not defined in the context,
or have not been defined with a #set directive. This setting will also throw
an exception if an attempt is made to call a non-existing property on an object
or if the object is null. When this property is true then property
'directive.set.null.allowed' is also set to true. Also,
'directive.foreach.skip.invalid' defaults to true when this property is true,
but explicitly setting 'directive.foreach.skip.invalid' will override this
default. For a complete discussion see <a
href="user-guide.html#strict-reference-mode">Strict References Setting</a>.
+>
+> `runtime.references.strict.escape = false` Changes escape behavior such that
putting a forward slash before a reference or macro always escapes the
reference or macro and absorbs the forward slash regardless if the reference or
macro is defined. For example "\$foo" always renders as "$foo", or "\#foo()" is
always rendered as "#foo()". This escape behavior is of use in strict mode
since unintended strings of characters that look like references or macros will
throw an exception. This provides an easy way to escape these references.
However, even in non-strict mode the developer may find this a more consistent
and reliable method for escaping.
+
+## String Interpolation
+
+`runtime.interpolate.string.literals = true`
+
+> Controls interpolation mechanism of VTL String Literals. Note that a VTL
StringLiteral is specifically a string using double quotes that is used in a
#set() statement, a method call of a reference, a parameter to a VM, or as an
argument to a VTL directive in general. See the VTL reference for further
information.
+
+## Math
+
+`runtime.strict.math = false`
+
+> Affects all math operations in VTL. If changed to true, this will cause
Velocity to throw a MathException whenever one side of a math operation has a
null value (e.g. `#set( $foo = $null * 5 )`) or when trying to divide by zero.
If this value is left `false`, then rendering will continue and that math
operation will be ignored.
+
+## Parser Configuration
+
+`parser.pool.class = org.apache.velocity.runtime.ParserPoolImpl`
+
+> This property selects the implementation for the parser pool. This class
must implement ParserPool. Generally there is no reason to change this though
if you are building a high volume web application you might consider including
an alternate implementation that automatically adjusts the size of the pool.
+
+`parser.pool.size = 20`
+
+> This property is used by the default pooling implementation to set the
number of parser instances that Velocity will create at startup and keep in a
pool. The default of 20 parsers should be more than enough for most uses. In
the event that Velocity does run out of parsers, it will indicate so in the
log, and dynamically create overflow instances as needed. Note that these
extra parsers will not be added to the pool, and will be discarded after use.
This will result in very slow operation compared to the normal usage of pooled
parsers, but this is considered an exceptional condition. A web application
using Velocity as its view engine might exhibit this behavior under extremely
high concurrency (such as when getting Slashdotted). If you see a
corresponding message referencing the `parser.pool.size` property in your log
files, please increment this property immediately to avoid performance
degradation.
+
+## Event Handlers
+
+See the [Event Handlers](developer-guide.html#event-handlers) section of the
dev guide.
+
+`eventhandler.include.class = `*classname*
+> register an [include event
handler](apidocs/org/apache/velocity/app/event/IncludeEventHandler.html).
+
+`eventhandler.invalidreference.class = `*classname*
+> register an [invalid reference event
handler](apidocs/org/apache/velocity/app/event/InvalidReferenceEventHandler.html).
+
+`eventhandler.methodexception.class = `*classname*
+> register a [method exception event
handler](apidocs/org/apache/velocity/app/event/MethodExceptionEventHandler.html).
+
+`eventhandler.referenceinsertion.class = `*classname*
+> register a [reference insertion event
handler](apidocs/org/apache/velocity/app/event/ReferenceInsertionEventHandler.html).
+
+## Pluggable Introspection
+
+`runtime.introspector.uberspect =
org.apache.velocity.util.introspection.UberspectImpl`
+
+> This property sets the 'Uberspector', the introspection package that handles
all introspection strategies for Velocity. You can specify a comma-separated
list of Uberspector classes, in which case all Uberspectors are chained. The
default chaining behaviour is to return the first non-null value for each
introspection call among all provided uberspectors. You can modify this
behaviour (for instance to restrict access to some methods) by subclassing
org.apache.velocity.util.introspection.AbstractChainableUberspector (or
implementing directly
org.apache.velocity.util.introspection.ChainableUberspector). This allows you
to create more interesting rules or patterns for Uberspection, rather than just
returning the first non-null value.
+>
+> Some alternate Uberspectors are provided. Please refer to the [Customizing
Introspection](developer-guide.html#customizing-introspection) section for a
detailed list. You would for instance use `runtime.introspector.uberspect =
org.apache.velocity.util.introspection.SecureUberspector` to avoid template
authors to instanciate new classes or to use reflection, or use
`runtime.introspector.uberspect =
org.apache.velocity.util.introspection.UberspectImpl,
org.apache.velocity.util.introspection.UberspectPublicFields` to expose Java
public fields in your templates.
+
+## Context
+
+`context.autoreference.key = *name*`
+
+> This property has no default value. If present, the Context object will
become accessible from the templates under the provided name. For instance,
with the configuration "`context.autoreference.key = self`", then `$self` will
contain the context itself. This feature is meant to be used for debugging
purposes.
+
+## Pluggable Resource Manager and Resource Cache
+
+The Resource Manager is the main part of the resource (template and static
content) management system, and is responsible for taking application requests
for templates, finding them in the available resource loaders, and then
optionally caching the parsed template. The Resource Cache is the mechanism
that the Resource Manager uses to cache templates for quick reuse. While the
default versions of these two facilities are suitable for most applications,
for advanced users it now is possible to replace the default resource manager
and resource cache with custom implementations.
+
+A resource manager implementation must implement the
`org.apache.velocity.runtime.resource.ResourceManager` interface. A description
of the requirements of a resource manager is out of scope for this document.
Implementors are encouraged to review the default implementation. To configure
Velocity to load the replacement implementation, use the configuration key:
+
+ resource.manager.class
+
+This key is also defined as a contstant
`RuntimeConstants.RESOURCE_MANAGER_CLASS`
+
+A resource cache implementation must implement the
`org.apache.velocity.runtime.resource.ResourceCache` interface As with the
resource manager, a description of the requirements of a resource manager is
out of scope for this document. Implementors are encouraged to review the
default implementation. To configure Velocity to load the replacement
implementation, use the configuration key:
+
+ resource.manager.cache.class
+
+This key is also defined as a contstant
`RuntimeConstants.RESOURCE_MANAGER_CACHE_CLASS`
+
+A resource cache implementation may want to limit the cache size (rather than
providing an unbounded cache which could consume all available memory). To
configure Velocity to set the size for your cache, use the configuration key:
+
+ resource.manager.cache.size
+
+This key is also defined as a contstant
`RuntimeConstants.RESOURCE_MANAGER_CACHE_SIZE`
+
+
+## Configuration Examples
+
+Configuring the resource loaders for Velocity is straightforward. The
properties that control the are listed in the <a
href="#Configuring_Resource_Loaders">resource configuration</a> section, for
further reference.
+
+The first step in configuring one or more resource loaders is do 'declare'
them by name to Velocity. Use the property `resource.loader` and list one or
more loader names. You can use anything you want - these names are used to
associate configuration properties with a given loader.
+
+ resource.loader = file
+
+That entry declares that we will have a resource loader known as 'file'. The
next thing to do is to set the important properties. The most critical is to
declare the class to use as the loader:
+
+ file.resource.loader.class =
org.apache.velocity.runtime.resource.loader.FileResourceLoader
+
+In this case, we are telling velocity that we are setting up
+a resource loadercalled 'file', and are using the class
`org.apache.velocity.runtime.resource.loader.FileResourceLoader` to be the
class to use. The next thing we do is set the properties important to this
loader.
+
+ file.resource.loader.path = /opt/templates
+ file.resource.loader.cache = true
+ file.resource.loader.modificationCheckInterval = 2
+
+Here, we set a few things. First, we set the path to find the templates to be
`/opt/templates`. Second, we turned caching on, so that after a template or
static file is read in, it is cached in memory. And finally, we set the
modification check interval to 2 seconds, allowing Velocity to check for new
templates.
+
+Those are the basics. What follows are a few examples of different
configuraitons.
+
+**Do-nothing Default Configuration: ** As the name says, there is nothing you
have to do or configure to get the default configuration. This configuration
uses the FileResourceLoader with the current directory as the default resource
path, and caching is off. As a properties set, this is expressed as:
+
+ resource.loader = file
+
+ file.resource.loader.description = Velocity File Resource Loader
+ file.resource.loader.class =
org.apache.velocity.runtime.resource.loader.FileResourceLoader
+ file.resource.loader.path = .
+ file.resource.loader.cache = false
+ file.resource.loader.modificationCheckInterval = 0
+
+**Multiple Template Path Configuration: ** This configuration uses the
FileResourceLoader with several directories as 'nodes' on the template search
path. We also want to use caching, and have the templates checked for changes
in 10 second intervals. As a properties set, this is expressed as:
+
+ resource.loader = file
+
+ file.resource.loader.description = Velocity File Resource Loader
+ file.resource.loader.class =
org.apache.velocity.runtime.resource.loader.FileResourceLoader
+ file.resource.loader.path = /opt/directory1, /opt/directory2
+ file.resource.loader.cache = true
+ file.resource.loader.modificationCheckInterval = 10
+
+**Multiple Loader Configuration :** This configuration sets up three loaders
at the same time, the FileResourceLoader, the ClasspathResourceLoader, and the
JarResourceLoader. The loaders are set-up such that the FileResourceLoader is
consulted first, then the ClasspathResourceLoader, and finally the
JarResourceLoader. This would allow you to qickly drop a template into the file
template area to replace on of the templates found in the classpath (usually
via a jar) without having to rebuild the jar.
+
+ #
+ # specify three resource loaders to use
+ #
+ resource.loader = file, class, jar
+
+ #
+ # for the loader we call 'file', set the FileResourceLoader as the
+ # class to use, turn off caching, and use 3 directories for templates
+ #
+ file.resource.loader.description = Velocity File Resource Loader
+ file.resource.loader.class =
org.apache.velocity.runtime.resource.loader.FileResourceLoader
+ file.resource.loader.path = templatedirectory1, anotherdirectory, foo/bar
+ file.resource.loader.cache = false
+ file.resource.loader.modificationCheckInterval = 0
+
+ #
+ # for the loader we call 'class', use the ClasspathResourceLoader
+ #
+ class.resource.loader.description = Velocity Classpath Resource Loader
+ class.resource.loader.class =
org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
+
+ #
+ # and finally, for the loader we call 'jar', use the JarResourceLoader
+ # and specify two jars to load from
+ #
+ jar.resource.loader.description = Velocity Jar Resource Loader
+ jar.resource.loader.class =
org.apache.velocity.runtime.resource.loader.JarResourceLoader
+ jar.resource.loader.path = jar:file:/myjarplace/myjar.jar,
jar:file:/myjarplace/myjar2.jar
+
+Node that the three names 'file', 'class', and 'jar' are merely for your
convenience and sanity. They can be anything you want - they are just used to
associate a set of properties together. However, it is recommended that you
use names that give some hint of the function.
+
+Note that while all three require very little configuration information for
proper operation, the ClasspathResourceLoader is the simplest.
Modified: velocity/site/cms/trunk/content/engine/devel/developer-guide.mdtext
URL:
http://svn.apache.org/viewvc/velocity/site/cms/trunk/content/engine/devel/developer-guide.mdtext?rev=1753523&r1=1753522&r2=1753523&view=diff
==============================================================================
--- velocity/site/cms/trunk/content/engine/devel/developer-guide.mdtext
(original)
+++ velocity/site/cms/trunk/content/engine/devel/developer-guide.mdtext Wed Jul
20 14:44:04 2016
@@ -29,12 +29,12 @@ Instructions for building Velocity from
### Dependencies
-For compiling or at runtime, Velocity needs a Java runtime environment version
of 1.5 or more recent.
+For compiling or at runtime, Velocity needs a Java runtime environment version
of 1.7 or more recent.
-Velocity also is dependent upon a few packages for general functionality:
+Velocity also depends upon a few packages for general functionality:
-+ [**Apache Commons
Collections**](https://commons.apache.org/proper/commons-collections/) -
required for compilation.
-+ [**Apache Commons Lang**](http://commons.apache.org/proper/commons-lang/) -
required for compilation.
++ [**Apache Commons
Collections**](https://commons.apache.org/proper/commons-collections/) -
required for compilation only.
++ [**Apache Commons Lang**](http://commons.apache.org/proper/commons-lang/) -
required for compilation only.
+ [** SLF4J API**](http://www.slf4j.org) - required for compilation and at
runtime.
At runtime, Velocity will require an SLF4J binding to be present in the path.
Typically, one of:
@@ -220,7 +220,7 @@ As a programmer, you have great freedom
+ `java.util.Map ` Here, Velocity depends upon the `values()` method of the
interface to get a `Collection` interface, on which `iterator()` is called to
retrieve an Iterator for the loop.
+ `java.util.Iterator` USE WITH CAUTION: This is currently supported only
provisionally - the issue of concern is the 'non-resettablity' of the Iterator.
If a 'naked' Iterator is placed into the context, and used in more than one
#foreach(), subsequent #foreach() blocks after the first will fail, as the
Iterator doesn't reset.
+ `java.util.Enumeration` USE WITH CAUTION: Like `java.util.Iterator`, this is
currently supported only provisionally - the issue of concern is the
'non-resettablity' of the Enumeration. If a 'naked' Enumeration is placed into
the context, and used in more than one #foreach(), subsequent #foreach() blocks
after the first will fail, as the Enumeration doesn't reset.
-+ Any public class with a `public Iterator iterator()` method that never
returns `null`. As a last resort, Velocity will look for an `iterator()`
method. This provides great flexibility and automatic support for Java 1.5's
`java.util.Iterable` interface.
++ Any public class with a `public Iterator iterator()` method that never
returns `null`. As a last resort, Velocity will look for an `iterator()`
method. This provides great flexibility and automatic support for
`java.util.Iterable` interface.
In the case of the `Iterator` and `Enumeration`, it is recommended that they
are placed in the context only when it cannot be avoided, and you should let
Velocity find the appropriate reusable iterative interface when that is
sufficient and possible.
@@ -319,7 +319,7 @@ It is possible that your VelocityContext
## Using Velocity
-If you are using [VelocityViewServlet](/tools/devel/view-servlet.html) or
other web frameworks, you may never call Velocity directly. However, if you
use Velocity for non-web purposes, or create your own web framework you will
need to directly call the Velocity Engine similar to <a
href="#thefundamentalpattern">the fundamental pattern</a> shown earlier. One
important additional thing to remember is to initialize the Velocity Engine
before using it to merge templates.
+If you are using [VelocityViewServlet](/tools/devel/view-servlet.html) or
other web frameworks, you may never call Velocity directly. However, if you
use Velocity for non-web purposes, or create your own web framework you will
need to directly call the Velocity Engine similar to [the fundamental
pattern](#the-fundamental-pattern) shown earlier. One important additional
thing to remember is to initialize the Velocity Engine before using it to merge
templates.
### The Velocity Helper Class
@@ -480,16 +480,16 @@ If we wanted to use a different director
And, assuming you have a directory `/opt/templates` and the template
`testtemplate.vm` is in there, then things would work just fine. If you try
this and have a problem, be sure to look at the velocity.log for information -
the error messages are pretty good for figuring out what is wrong.
-If you need to place objects into the Velocity properties then you cannot use
the Velocity.init(Properties p) method. Instead you should create a new
instance of the `org.apache.commons.collections.ExtendedProperties` class, copy
all properties from an existing Properties object into the ExtendedProperties
and then add new properties with your objects to the ExtendedProperties object.
+If you need to place objects into the Velocity properties then you cannot use
the Velocity.init(Properties p) method. Instead you should create a new
instance of the `org.apache.velocity.util.ExtProperties` class, copy all
properties from an existing Properties object into the ExtProperties and then
add new properties with your objects to the ExtProperties object.
...
VelocityEngine velocityEngine = new VelocityEngine();
- ExtendedProperties eprops = null;
+ ExtProperties eprops = null;
if (props==null) {
- eprops = new ExtendedProperties();
+ eprops = new ExtProperties();
} else {
- eprops = ExtendedProperties.convertProperties(props);
+ eprops = ExtProperties.convertProperties(props);
}
// Now set the property with your object instance
@@ -502,6 +502,47 @@ If you need to place objects into the Ve
You may want to also consider using the Application Attributes feature
described in the following section.
+## Logging
+
+Since version 2.0, Velocity has switched to the [SLF4J](http://www.slf4j.org/)
logging facade.
+
+All you have to do to enable logging is to make sure that your classpath
contains the slf4j-api jar, and one and only one slf4j binding jar towards your
favourite logsystem or facade. See the [dependecies](#dependencies) section for
a list of SLF4J bindings.
+
+By default, Velocity will use a logger tagged for the
org.apache.velocity.app.Velocity class. You can customize this logger in two
ways:
+
++ By programmatically giving Velocity a living instance of an orf.slf4j.Logger
object, using the runtime.log.instance property key.
++ By configuring the name of the logger to be used by your velocity instance,
using the runtime.log.name property key. It can be done from the
velocity.properties file, if present.
+
+## Resource Loaders
+
+One of the fundamental and important parts about Velocity is the resource
management system and the resource loaders. They are referred to as
'resources' here rather than 'templates' because the resource management system
will also handle non-template reasources, specifically things that are loaded
via the #include() directive.
+
+The resource loader system if very flexible, allowing one or more resource
loaders to be in operation at the same time. This allows tremendous
flexibility in configuration and resource managment, and futher allows you to
write your own resource loaders for your special needs.
+
+There are currently four kinds of resource loaders that are included with
Velocity, each described below. Note that in the example configuration
properties given, a common name for the loader is shown (ex.'file' in
`file.resource.loader.path`). This 'common name' may not work for your
configuration, as resource loaders common names are defined by the
`resource.loader` configuration entry. Also, each of these loaders is located
in the package `org.apache.velocity.runtime.resource.loader`.
+
++ **FileResourceLoader :** This loader gets resources from the filesystem. Its
configuration properties include:
+
+ + `file.resource.loader.path` = <path to root of templates>
+ + `file.resource.loader.cache` = true/false
+ + `file.resource.loader.modificationCheckInterval` = <seconds between
checks>
+
+ This is the default loader, and is configured, by default to get templates
from the 'current directory'. In the case of using Velocity with servlets,
this can be a problem as you don't want to have to keep your templates in the
directory from which you start your servlet engine. See the documentation for
your servlet or web framework (for example
[VelocityViewServlet](/tools/devel/view-servlet.html)) for more info on how to
configure the location of the Velocity templates.
+
++ **JarResourceLoader :** This loader gets resource from specific jar files.
It is very similar to the FileResourceLoader, except that you have the
convenience of bundling your templates into jars. The properties are
identical, except for `jar.resource.loader.path`, where you provide the full
location of the jar(s) you wish to load resources from. To specify a jar for
the loader.path you use the standard JAR URL syntax of
`java.net.JarURLConnection`.
+
++ **ClasspathResourceLoader :** This loader gets resources from the
classloader. In general, this means that the ClasspathResourceLoader will load
templates placed in the classpath (in jars, for example) While the classpath is
a source of great pain and suffering in general, it is a very useful mechanism
when working on a Servlet Spec 2.2 (or newer) compliant servlet runner. <a
href="http://jakarta.apache.org/tomcat/" class="externalLink">Tomcat</a> is an
example of such. To use this loader effectively, all you must do is jar your
templates, and put that jar into the WEB-INF/lib directory of your webapp.
There are no configuration options to worry about, nor is the absolute vs.
relative path an issue, as it is with Jar and File resource loaders. Again,
please note that the ClasspathResourceLoader is not only for use with a servlet
container, but can be used in any application context.
+
++ **URLResourceLoader :** This loader gets resources from a URL connection.
Its configuration properties include:
+
+ + `url.resource.loader.root` = <root URL path of templates>
+ + `url.resource.loader.cache` = true/false
+ + `url.resource.loader.modificationCheckInterval` = <seconds between
checks>
+
+ This loader simply downloads resources from configured URLs. It works
much like the FileResourceLoader, however, it can pull templates down from any
valid URL to which the application can create a connection.
+
++ **DataSourceResourceLoader :** This loader will load resources from a
DataSource such as a database. This loader is only available under JDK 1.4 and
later. For more information on this loader, please see the javadoc for the
class `org.apache.velocity.runtime.resource.loader.DataSourceResourceLoader`.
+
## Application Attributes
*Application Attributes* are name-value pairs that can be associated with a
RuntimeInstance (either via the `VelocityEngine` or the `Velocity` singleton)
and accessed from any part of the Velocity engine that has access to the
RuntimeInstance.
@@ -520,7 +561,7 @@ Internal components can access the key-v
Note that internal components cannot set the value of the key, just get it. if
the internal component must communicate information to the application layer,
it must do so via the Object passed as the value.
-## Configuring Event Handlers
+## Event Handlers
Velocity contains a fine-grained event handling system that allows you to
customize the operation of the engine. For example, you may change the text of
references that are inserted into a page, modify which templates are actually
included with `#include` or `#parse`, or capture all invalid references.
@@ -675,375 +716,34 @@ The following code shows how to register
...
}
}
-
-## Velocity Configuration Keys and Values
-
-Velocity's runtime configuration is controlled by a set of configuration keys
listed below. Generally, these keys will have values that consist of either a
String, or a comma-separated list of Strings, referred to as a CSV for
comma-separated values.
-
-There is a set of default values contained in Velocity's jar, found in
/src/java/org/apache/velocity/runtime/defaults/velocity.defaults, that Velocity
uses as its configuration baseline. This ensures that Velocity will always have
a 'correct' value for its configuration keys at startup, although it may not be
what you want.
-
-Any values specified before init() time will replace the default values.
Therefore, you only have toconfigure velocity with the values for the keys that
you need to change, and not worry about the rest. Further, as we add more
features and configuration capability, you don't have to change your
configuration files to suit - the Velocity engine will always have default
values.
-
-Please sees the section above [**Using Velocity**](#Using-Velocity) for
discussion on the configuration API.
-
-Below are listed the configuration keys that control Velocity's behavior.
Organized by category, each key is listed with its current default value to the
right of the '=' sign.
-
-### Runtime Log
-
-`runtime.log.instance = *Java Object instance*`
-
-> Living Java instance, that must implement the interface org.slf4j.Logger.
This property can only be set programmatically.
-
-`runtime.log.name = *name*`
-
-> This property has no default value, since the default logger will be
instanciated as the logger for the class org.apache.velocity.app.Velocity. See
[Configuring Logging](#configuring-Logging).
-
-`runtime.log.invalid.references = true `
-
-> Property to turn off the log output when a reference isn't valid. Good thing
to turn off in production, but very valuable for debugging.
-
-`runtime.log.logsystem.avalon.logger = *name*`
-
-> Allows user to specify an existing logger *name* in the Avalon hierarchy
without having to wrap with a LogChute interface. **Note:** You must also
specify `runtime.log.logsystem.class =
org.apache.velocity.runtime.log.AvalonLogChute` as the default logsystem may
change. There is **no** guarantee that the Avalon log system will remain the
default log system.
-
-### Character Encoding
-
-`input.encoding = UTF-8`
-
-> Character encoding for input (templates). If not specified, Velocity relies
on the 'file.encoding' system property.
-
-### #define() Directive
-
-`define.provide.scope.control = false`
-
-> Used to turn on the automatic provision of the $define scope control during
#define() calls. The default is false. Set it to true if you want a local,
managed namespace you can put references in when within a #define block or if
you want it for more advanced #break usage.
-
-### #evaluate() Directive
-
-`evaluate.provide.scope.control = false`
-
-> Used to turn on the automatic provision of the $evaluate scope during
#evaluate() or Velocity[Engine].evaluate(...) calls. The default is false. Set
it to true if you want a local, managed namespace you can put references in
during an evaluation or if you want it for more advanced #break usage.
-
-### #foreach() Directive
-
-`foreach.provide.scope.control = true`
-
-> Used to control the automatic provision of the $foreach scope during
#foreach calls. This gives access to the foreach status information (e.g.
$foreach.index or $foreach.hasNext). The default is true. Set it to false if
unused and you want a tiny performance boost.
-
-`directive.foreach.maxloops = -1`
-
-> Maximum allowed number of loops for a #foreach() statement.
-
-`directive.foreach.skip.invalid = true`
-
-> Tells #foreach to simply skip rendering when the object it is iterating over
is not or cannot produce a valid Iterator.
-
-### #if() Directive
-
-`directive.if.tostring.nullcheck = true`
-
-> Default behavior is to check return value of toString() and treat an object
with toString() that returns null as null. If all objects have toString()
methods that never return null, this check is unnecessary and can be disabled
to gain performance. In Velocity 1.5, no such null check was performed.
-
-### #set() Directive
-
-`directive.set.null.allowed = false`
-
-> If true, having a right hand side of a #set() statement with an invalid
reference or null value will set the left hand side to null. If false, the left
hand side will stay the same.
-
-### #include() and #parse() Directives
-
-`directive.include.output.errormsg.start = <!-- include error :`
-`directive.include.output.errormsg.end = see error log --> `
-
-> Defines the beginning and ending tags for an in-stream error message in the
case of a problem with the #include() directive. If both the .start and .end
tags are defined, an error message will be output to the stream, of the form
'.start msg .end' where .start and .end refer to the property values. Output to
the render stream will only occur if both the .start and .end (next) tag are
defined.
-
-`directive.parse.max.depth = 10`
-
-> Defines the allowable parse depth for a template. A template may #parse()
another template which itself may have a #parse() directive. This value
prevents runaway #parse() recursion.
-
-`template.provide.scope.control = false`
-
-> Used to turn on the automatic provision of the $template scope control
during #parse calls and template.merge(...) calls. The default is false. Set it
to true if you want a secure namespace for your template variables or more
advanced #break control.
-
-### Resource Management
-
-`resource.manager.logwhenfound = true`
-
-> Switch to control logging of 'found' messages from resource manager. When a
resource is found for the first time, the resource name and classname of the
loader that found it will be noted in the runtime log.
-
-`resource.manager.cache.class`
-
-> Declares the class to be used for resource caching. The current default is
`org.apache.velocity.runtime.resource.ResourceCacheImpl`. When
`resource.manager.defaultcache.size` is set to 0, then the default
implementation is the standard Java `ConcurrentHashMap`. Otherwise, a non-zero
cache size uses an LRU Map. The default cache size is 89. Note that the
ConcurrentHashMap may be better at thread concurrency.
-
-`resource.manager.defaultcache.size`
-
-> Sets the size of the default implementation of the resource manager cache
size. The default is 89.
-
-`resource.loader = <name> (default = file)`
-
-> *Multi-valued key. Will accept CSV for value.* Public name of a resource
loader to be used. This public name will then be used in the specification of
the specific properties for that resource loader. Note that as a multi-valued
key, it's possible to pass a value like "file, class" (sans quotes), indicating
that following will be configuration values for two loaders.
-
-`<name>.loader.description = Velocity File Resource Loader`
-
-> Description string for the given loader.
-
-`<name>.resource.loader.class =
org.apache.velocity.runtime.resource.loader.FileResourceLoader`
-
-> Name of implementation class for the loader. The default loader is the file
loader.
-
-`<name>.resource.loader.path = .`
-
-> *Multi-valued key. Will accept CSV for value.* Root(s) from which the
loader loads templates. Templates may live in subdirectories of this root. ex.
homesite/index.vm This configuration key applies currently to the
FileResourceLoader and JarResourceLoader.
-
-`<name>.resource.loader.cache = false`
-
-> Controls caching of the templates in the loader. Default is false, to make
life easy for development and debugging. This should be set to true for
production deployment. When 'true', the `modificationCheckInterval` property
applies. This allows for the efficiency of caching, with the convenience of
controlled reloads - useful in a hosted or ISP environment where templates can
be modifed frequently and bouncing the application or servlet engine is not
desired or permitted.
-
-`<name>.resource.loader.modificationCheckInterval = 2`
-
-> This is the number of seconds between modification checks when caching is
turned on. When this is an integer > 0, this represents the number of seconds
between checks to see if the template was modified. If the template has been
modified since last check, then it is reloaded and reparsed. Otherwise nothing
is done. When <= 0, no modification checks will take place, and assuming that
the property `cache` (above) is true, once a template is loaded and parsed the
first time it is used, it will not be checked or reloaded after that until the
application or servlet engine is restarted.
-
-> To illustrate, here is an example taken right from the default Velocity
properties, showing how setting up the FileResourceLoader is managed
-
- resource.loader = file
-
- file.resource.loader.description = Velocity File Resource Loader
- file.resource.loader.class =
org.apache.velocity.runtime.resource.loader.FileResourceLoader
- file.resource.loader.path = .
- file.resource.loader.cache = false
- file.resource.loader.modificationCheckInterval = 2
-
-### Velocimacro
-
-`velocimacro.library = VM_global_library.vm `
-
-
-> *Multi-valued key. Will accept CSV for value.* Filename(s) of Velocimacro
library to be loaded when the Velocity Runtime engine starts. These
Velocimacros are accessable to all templates. The file is assumed to be
relative to the root of the file loader resource path.
-
-`velocimacro.permissions.allow.inline = true`
-
-> Determines of the definition of new Velocimacros via the #macro() directive
in templates is allowed. The default value is true, meaning any template can
define and use new Velocimacros. Note that depending on other properties,
those #macro() statements can replace global definitions.
-
-`velocimacro.permissions.allow.inline.to.replace.global = false `
-
-> Controls if a Velocimacro defind 'inline' in a template can replace a
Velocimacro defined in a library loaded at startup.
-
-`velocimacro.permissions.allow.inline.local.scope = false`
-
-> Controls 'private' templates namespaces for Velocimacros. When true, a
#macro() directive in a template creates a Velocimacro that is accessable only
from the defining template. This means that Velocimacros cannot be shared
unless they are in the global or local library loaded at startup. (See above.)
It also means that templates cannot interfere with each other. This property
also allows a technique where there is a 'default' Velocimacro definition in
the global or local library, and a template can 'override' the implementation
for use within that template. This occurrs because when this property is true,
the template's namespace is searched for a Velocimacro before the global
namespace, therefore allowing the override mechanism.
-
-`velocimacro.context.localscope = false`
-
-> Controls whether reference access (set/get) within a Velocimacro will change
the context, or be of local scope in that Velocimacro. This feature is
deprecated and has been removed in Velocity 2.0. Instead, please use the
$macro namespace for storage of references local to your Velocimacro. (e.g.
#set( $macro.foo = 'bar') and $macro.foo)
-
-`velocimacro.library.autoreload = false`
-
-> Controls Velocimacro library autoloading. When set to `true` the source
Velocimacro library for an invoked Velocimacro will be checked for changes, and
reloaded if necessary. This allows you to change and test Velocimacro
libraries without having to restart your application or servlet container, just
like you can with regular templates. This mode only works when caching is *off*
in the resource loaders (e.g. `file.resource.loader.cache = false` ). This
feature is intended for development, not for production.
-
-`velocimacro.arguments.strict = false`
-
-> When set to true, will throw a `ParseErrorException` when parsing a template
containing a macro with an invalid number of arguments. Is set to false by
default to maintain backwards compatibility with templates written before this
feature became available.
-
-`velocimacro.body.reference = false`
-
-> Defines name of the reference that can be used to get the body content (an
AST block) given for a block macro call (e.g. #@myMacro() has a body #end). The
default reference name is "bodyContent" (e.g. $bodyContent). This block macro
feature was introduced in Velocity 1.7.
-
-`macro.provide.scope.control = false`
-
-> Used to turn on the automatic provision of the $macro scope control during
#macro calls. The default is false. Set it to true if you need a local
namespace in macros or more advanced #break controls.
-
-`<somebodymacro>.provide.scope.control = false`
-
-> Used to turn on the automatic provision of the $<nameofthemacro> scope
control during a call to a macro with a body (e.g. #@foo #set($foo.a=$b) ...
$foo.a #end). The default is false. Set it to true if you happen to need a
namespace just for your macro's body content or more advanced #break controls.
-</p>
-
-### Strict Reference Setting
-
-`runtime.references.strict = false`
-
-> New in Velocity 1.6, when set to true Velocity will throw a
`MethodInvocationException` for references that are not defined in the context,
or have not been defined with a #set directive. This setting will also throw
an exception if an attempt is made to call a non-existing property on an object
or if the object is null. When this property is true then property
'directive.set.null.allowed' is also set to true. Also,
'directive.foreach.skip.invalid' defaults to true when this property is true,
but explicitly setting 'directive.foreach.skip.invalid' will override this
default. For a complete discussion see <a
href="user-guide.html#strict-reference-mode">Strict References Setting</a>.
->
-> `runtime.references.strict.escape = false` Changes escape behavior such that
putting a forward slash before a reference or macro always escapes the
reference or macro and absorbs the forward slash regardless if the reference or
macro is defined. For example "\$foo" always renders as "$foo", or "\#foo()" is
always rendered as "#foo()". This escape behavior is of use in strict mode
since unintended strings of characters that look like references or macros will
throw an exception. This provides an easy way to escape these references.
However, even in non-strict mode the developer may find this a more consistent
and reliable method for escaping.
-
-### String Interpolation
-
-`runtime.interpolate.string.literals = true`
-
-> Controls interpolation mechanism of VTL String Literals. Note that a VTL
StringLiteral is specifically a string using double quotes that is used in a
#set() statement, a method call of a reference, a parameter to a VM, or as an
argument to a VTL directive in general. See the VTL reference for further
information.
-
-### Math
-
-`runtime.strict.math = false`
-
-> Affects all math operations in VTL. If changed to true, this will cause
Velocity to throw a MathException whenever one side of a math operation has a
null value (e.g. `#set( $foo = $null * 5 )`) or when trying to divide by zero.
If this value is left `false`, then rendering will continue and that math
operation will be ignored.
-
-### Parser Configuration
-
-`parser.pool.class = org.apache.velocity.runtime.ParserPoolImpl`
-
-> This property selects the implementation for the parser pool. This class
must implement ParserPool. Generally there is no reason to change this though
if you are building a high volume web application you might consider including
an alternate implementation that automatically adjusts the size of the pool.
-
-`parser.pool.size = 20`
-
-> This property is used by the default pooling implementation to set the
number of parser instances that Velocity will create at startup and keep in a
pool. The default of 20 parsers should be more than enough for most uses. In
the event that Velocity does run out of parsers, it will indicate so in the
log, and dynamically create overflow instances as needed. Note that these
extra parsers will not be added to the pool, and will be discarded after use.
This will result in very slow operation compared to the normal usage of pooled
parsers, but this is considered an exceptional condition. A web application
using Velocity as its view engine might exhibit this behavior under extremely
high concurrency (such as when getting Slashdotted). If you see a
corresponding message referencing the `parser.pool.size` property in your log
files, please increment this property immediately to avoid performance
degradation.
-
-### Pluggable Introspection
-
-`runtime.introspector.uberspect =
org.apache.velocity.util.introspection.UberspectImpl`
-
-> This property sets the 'Uberspector', the introspection package that handles
all introspection strategies for Velocity. You can specify a comma-separated
list of Uberspector classes, in which case all Uberspectors are chained. The
default chaining behaviour is to return the first non-null value for each
introspection call among all provided uberspectors. You can modify this
behaviour (for instance to restrict access to some methods) by subclassing
org.apache.velocity.util.introspection.AbstractChainableUberspector (or
implementing directly
org.apache.velocity.util.introspection.ChainableUberspector). This allows you
to create more interesting rules or patterns for Uberspection, rather than just
returning the first non-null value.
->
-> Some alternate Uberspectors are provided. You would for instance use
`runtime.introspector.uberspect =
org.apache.velocity.util.introspection.SecureUberspector` to avoid template
authors to instanciate new classes or to use reflection, or use
`runtime.introspector.uberspect =
org.apache.velocity.util.introspection.UberspectImpl,
org.apache.velocity.util.introspection.UberspectPublicFields` to expose Java
public fields in your templates.
-
-### Context
-
-`context.autoreference.key = *name*`
-
-> This property has no default value. If present, the Context object will
become accessible from the templates under the provided name. For instance,
with the configuration `context.autoreference.key = self`, `$self` will contain
the context itself. This feature is meant to be used for debugging purposes.
-
-## Configuring Logging
-
-Since version 2.0, Velocity has switched to the [SLF4J](http://www.slf4j.org/)
logging facade.
-
-All you have to do to enable logging is to make sure that your classpath
contains the slf4j-api jar, and one and only one slf4j binding jar towards your
favourite logsystem or facade. See the [dependecies](#dependencies) section for
a list of SLF4J bindings.
-
-By default, Velocity will use a logger tagged for the
org.apache.velocity.app.Velocity class. You can customize this logger in two
ways:
-
-+ By programmatically giving Velocity a living instance of an orf.slf4j.Logger
object, using the runtime.log.instance property key.
-+ By configuring the name of the logger to be used by your velocity instance,
using the runtime.log.name property key. It can be done from the
velocity.properties file, if present.
-
-## Configuring Resource Loaders
-
-### Resource Loaders
-
-One of the fundamental and important parts about Velocity is the resource
management system and the resource loaders. They are referred to as
'resources' here rather than 'templates' because the resource management system
will also handle non-template reasources, specifically things that are loaded
via the #include() directive.
-
-The resource loader system if very flexible, allowing one or more resource
loaders to be in operation at the same time. This allows tremendous
flexibility in configuration and resource managment, and futher allows you to
write your own resource loaders for your special needs.
-
-There are currently four kinds of resource loaders that are included with
Velocity, each described below. Note that in the example configuration
properties given, a common name for the loader is shown (ex.'file' in
`file.resource.loader.path`). This 'common name' may not work for your
configuration. Please read the section on <a
href="#Velocity_Configuration_Keys_and_Values">resource configuration
properties</a> to understand how this system works. Also, each of these
loaders is located in the package `org.apache.velocity.runtime.resource.loader`.
-
-+ **FileResourceLoader :** This loader gets resources from the filesystem. Its
configuration properties include:
-
- + `file.resource.loader.path` = <path to root of templates>
- + `file.resource.loader.cache` = true/false
- + `file.resource.loader.modificationCheckInterval` = <seconds between
checks>
-
- This is the default loader, and is configured, by default to get templates
from the 'current directory'. In the case of using Velocity with servlets,
this can be a problem as you don't want to have to keep your templates in the
directory from which you start your servlet engine. See the documentation for
your servlet or web framework (for example
[VelocityViewServlet](/tools/devel/view-servlet.html)) for more info on how to
configure the location of the Velocity templates.
-
-+ **JarResourceLoader :** This loader gets resource from specific jar files.
It is very similar to the FileResourceLoader, except that you have the
convenience of bundling your templates into jars. The properties are
identical, except for `jar.resource.loader.path`, where you provide the full
location of the jar(s) you wish to load resources from. To specify a jar for
the loader.path you use the standard JAR URL syntax of
`java.net.JarURLConnection`.
-
-+ **ClasspathResourceLoader :** This loader gets resources from the
classloader. In general, this means that the ClasspathResourceLoader will load
templates placed in the classpath (in jars, for example) While the classpath is
a source of great pain and suffering in general, it is a very useful mechanism
when working on a Servlet Spec 2.2 (or newer) compliant servlet runner. <a
href="http://jakarta.apache.org/tomcat/" class="externalLink">Tomcat</a> is an
example of such. To use this loader effectively, all you must do is jar your
templates, and put that jar into the WEB-INF/lib directory of your webapp.
There are no configuration options to worry about, nor is the absolute vs.
relative path an issue, as it is with Jar and File resource loaders. Again,
please note that the ClasspathResourceLoader is not only for use with a servlet
container, but can be used in any application context.
-
-+ **URLResourceLoader :** This loader gets resources from a URL connection.
Its configuration properties include:
-
- + `url.resource.loader.root` = <root URL path of templates>
- + `url.resource.loader.cache` = true/false
- + `url.resource.loader.modificationCheckInterval` = <seconds between
checks>
-
- This loader simply downloads resources from configured URLs. It works
much like the FileResourceLoader, however, it can pull templates down from any
valid URL to which the application can create a connection.
-
-+ **DataSourceResourceLoader :** This loader will load resources from a
DataSource such as a database. This loader is only available under JDK 1.4 and
later. For more information on this loader, please see the javadoc for the
class `org.apache.velocity.runtime.resource.loader.DataSourceResourceLoader`.
-
-### Configuration Examples
-
-
-Configuring the resource loaders for Velocity is straightforward. The
properties that control the are listed in the <a
href="#Configuring_Resource_Loaders">resource configuration</a> section, for
further reference.
-
-The first step in configuring one or more resource loaders is do 'declare'
them by name to Velocity. Use the property `resource.loader` and list one or
more loader names. You can use anything you want - these names are used to
associate configuration properties with a given loader.
-
- resource.loader = file
-
-That entry declares that we will have a resource loader known as 'file'. The
next thing to do is to set the important properties. The most critical is to
declare the class to use as the loader:
-
- file.resource.loader.class =
org.apache.velocity.runtime.resource.loader.FileResourceLoader
-
-In this case, we are telling velocity that we are setting up
-a resource loadercalled 'file', and are using the class
`org.apache.velocity.runtime.resource.loader.FileResourceLoader` to be the
class to use. The next thing we do is set the properties important to this
loader.
-
- file.resource.loader.path = /opt/templates
- file.resource.loader.cache = true
- file.resource.loader.modificationCheckInterval = 2
-
-Here, we set a few things. First, we set the path to find the templates to be
`/opt/templates`. Second, we turned caching on, so that after a template or
static file is read in, it is cached in memory. And finally, we set the
modification check interval to 2 seconds, allowing Velocity to check for new
templates.
-
-Those are the basics. What follows are a few examples of different
configuraitons.
-
-**Do-nothing Default Configuration: ** As the name says, there is nothing you
have to do or configure to get the default configuration. This configuration
uses the FileResourceLoader with the current directory as the default resource
path, and caching is off. As a properties set, this is expressed as:
-
- resource.loader = file
-
- file.resource.loader.description = Velocity File Resource Loader
- file.resource.loader.class =
org.apache.velocity.runtime.resource.loader.FileResourceLoader
- file.resource.loader.path = .
- file.resource.loader.cache = false
- file.resource.loader.modificationCheckInterval = 0
-
-**Multiple Template Path Configuration: ** This configuration uses the
FileResourceLoader with several directories as 'nodes' on the template search
path. We also want to use caching, and have the templates checked for changes
in 10 second intervals. As a properties set, this is expressed as:
-
- resource.loader = file
-
- file.resource.loader.description = Velocity File Resource Loader
- file.resource.loader.class =
org.apache.velocity.runtime.resource.loader.FileResourceLoader
- file.resource.loader.path = /opt/directory1, /opt/directory2
- file.resource.loader.cache = true
- file.resource.loader.modificationCheckInterval = 10
-
-**Multiple Loader Configuration :** This configuration sets up three loaders
at the same time, the FileResourceLoader, the ClasspathResourceLoader, and the
JarResourceLoader. The loaders are set-up such that the FileResourceLoader is
consulted first, then the ClasspathResourceLoader, and finally the
JarResourceLoader. This would allow you to qickly drop a template into the file
template area to replace on of the templates found in the classpath (usually
via a jar) without having to rebuild the jar.
-
- #
- # specify three resource loaders to use
- #
- resource.loader = file, class, jar
-
- #
- # for the loader we call 'file', set the FileResourceLoader as the
- # class to use, turn off caching, and use 3 directories for templates
- #
- file.resource.loader.description = Velocity File Resource Loader
- file.resource.loader.class =
org.apache.velocity.runtime.resource.loader.FileResourceLoader
- file.resource.loader.path = templatedirectory1, anotherdirectory, foo/bar
- file.resource.loader.cache = false
- file.resource.loader.modificationCheckInterval = 0
-
- #
- # for the loader we call 'class', use the ClasspathResourceLoader
- #
- class.resource.loader.description = Velocity Classpath Resource Loader
- class.resource.loader.class =
org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
-
- #
- # and finally, for the loader we call 'jar', use the JarResourceLoader
- # and specify two jars to load from
- #
- jar.resource.loader.description = Velocity Jar Resource Loader
- jar.resource.loader.class =
org.apache.velocity.runtime.resource.loader.JarResourceLoader
- jar.resource.loader.path = jar:file:/myjarplace/myjar.jar,
jar:file:/myjarplace/myjar2.jar
-
-Node that the three names 'file', 'class', and 'jar' are merely for your
convenience and sanity. They can be anything you want - they are just used to
associate a set of properties together. However, it is recommended that you
use names that give some hint of the function.
-
-Note that while all three require very little configuration information for
proper operation, the ClasspathResourceLoader is the simplest.
-
-### Pluggable Resource Manager and Resource Cache
-
-The Resource Manager is the main part of the resource (template and static
content) management system, and is responsible for taking application requests
for templates, finding them in the available resource loaders, and then
optionally caching the parsed template. The Resource Cache is the mechanism
that the Resource Manager uses to cache templates for quick reuse. While the
default versions of these two facilities are suitable for most applications,
for advanced users it now is possible to replace the default resource manager
and resource cache with custom implementations.
-
-A resource manager implementation must implement the
`org.apache.velocity.runtime.resource.ResourceManager` interface. A description
of the requirements of a resource manager is out of scope for this document.
Implementors are encouraged to review the default implementation. To configure
Velocity to load the replacement implementation, use the configuration key:
- resource.manager.class
+## Customizing Introspection
-This key is also defined as a contstant
`RuntimeConstants.RESOURCE_MANAGER_CLASS`
+The [runtime.introspector.uberspect configuration
property](configuration.html#Pluggable-Introspection] property takes a list of
Uberspector class names that constitute the Velocity introspection chain. By
means it, you can change the way context objects are introspected at runtime to
map VTL properties and methods to Java calls.
-A resource cache implementation must implement the
`org.apache.velocity.runtime.resource.ResourceCache` interface As with the
resource manager, a description of the requirements of a resource manager is
out of scope for this document. Implementors are encouraged to review the
default implementation. To configure Velocity to load the replacement
implementation, use the configuration key:
+Here is the list of provided uberspectors (which are found in the
(org.apache.velocity.util.introspection)[apidocs/org/apache/velocity/util/introspection/package-summary.html]
package).
- resource.manager.cache.class
+### Standard Uberspectors
-This key is also defined as a contstant
`RuntimeConstants.RESOURCE_MANAGER_CACHE_CLASS`
+-
[UberspectImpl](apidocs/org/apache/velocity/util/introspection/UberspectImpl.html)
+> this is the default uberspector. It successively tries to resolve `$foo.bar`
into `foo.getBar()`, `foo.get('bar')` or `foo.isBar()` (plus some case
variants), and tries to match methods using arguments count and type.
+-
[ChainableUberspector](apidocs/org/apache/velocity/util/introspection/ChainableUberspector.html)
(interface) and
[AbstractChainableUberspector](apidocs/org/apache/velocity/util/introspection/AbstractChainableUberspector.html)
(meant to be inherited)
+> A Chainable uberspector is an uberspector that wraps the previous
uberspector in the introspection chain.
+-
[LinkingUberspector](apidocs/org/apache/velocity/util/introspection/LinkingUberspector.html)
+> The Linking uberspector is meant for internal use only. It provides
introspection chaining when the left uberspector of two following uberspectors
of the introspection chain is not a ChainableUberspector. It first tries to
delegate introspection to the left uberspector, and only calls the right one in
case of failure.
+-
[UberspectLoggable](apidocs/org/apache/velocity/util/introspection/UberspectLoggable.html)
interface
+> When an uberspector implements the UberspectLoggable interface, it is
provided a logger during initialization via the `setLog(Logger)` method.
-A resource cache implementation may want to limit the cache size (rather than
providing an unbounded cache which could consume all available memory). To
configure Velocity to set the size for your cache, use the configuration key:
+If an Uberspector implements the
[RuntimeServicesAware](apidocs/org/apache/velocity/util/RuntimeServicesAware.html)
interface, it will be provided a Velocity
[RuntimeServices](apidocs/org/apache/velocity/runtime/RuntimeServices.html)
instance during initialization, via the `setRuntimeServices(RuntimeServices)`
method.
- resource.manager.cache.size
+### Uberspectors providing extra features
-This key is also defined as a contstant
`RuntimeConstants.RESOURCE_MANAGER_CACHE_SIZE`
+-
[DeprecatedCheckUberspector](apidocs/org/apache/velocity/util/introspection/DeprecatedCheckUberspector.html)
+> This uberspector will emit warnings in the log whenever a VTL fragment uses
a deprecated Java method. It is a Chainable uberspector that must be declared
*after* its wrapped uberspector.
+-
[SecureUberspector](apidocs/org/apache/velocity/util/introspection/SecureUberspector.html)
+> This uberspector prevents classloader related method calls. Use this
introspector for situations in which template writers are numerous or
untrusted. Specifically, this introspector prevents creation of arbitrary
objects or reflection on objects. It is a standalone uberspector.
+-
[UberspectPublicFields](apidocs/org/apache/velocity/util/introspection/UberspectPublicFields)
+> This uberspector exposes the public fields of objects. It can be prepended
or suffixed to other uberspectors, depending on whether you want to priorize or
not public fields versus potentially matching methods.
## Template Encoding for Internationalization
Modified: velocity/site/cms/trunk/content/engine/devel/left.nav
URL:
http://svn.apache.org/viewvc/velocity/site/cms/trunk/content/engine/devel/left.nav?rev=1753523&r1=1753522&r2=1753523&view=diff
==============================================================================
--- velocity/site/cms/trunk/content/engine/devel/left.nav (original)
+++ velocity/site/cms/trunk/content/engine/devel/left.nav Wed Jul 20 14:44:04
2016
@@ -9,6 +9,7 @@
* [User Guide](user-guide.html)
* [Developer Guide](developer-guide.html)
* [VTL Reference](vtl-reference.html)
+* [Configuration](configuration.html)
* [Glossary](glossary.html)
* [Javadoc](apidocs/index.html)
## Developers
Modified: velocity/site/cms/trunk/content/engine/devel/upgrading.mdtext
URL:
http://svn.apache.org/viewvc/velocity/site/cms/trunk/content/engine/devel/upgrading.mdtext?rev=1753523&r1=1753522&r2=1753523&view=diff
==============================================================================
--- velocity/site/cms/trunk/content/engine/devel/upgrading.mdtext (original)
+++ velocity/site/cms/trunk/content/engine/devel/upgrading.mdtext Wed Jul 20
14:44:04 2016
@@ -4,10 +4,11 @@ Title: Apache Velocity Engine - Upgradin
Release with the same major number (1.x) are intended to be drop-in
replacements. However, in most cases the versions of dependency jars must be
adjusted because newer versions of Velocity might require updates.
-### Upgrading from Velocity 1.7
+### Upgrading from Velocity 1.7.x to Velocity 2.0.x
Behavior / API changes:
++ velocity is now using the SLF4J logging facade. Hence, all methods accepting
or returning a logger now use the org.slf4j.Logger object.
+ the internal Context API now enforces String keys everywhere, this may break
custom Context implementations at compile-time.
+ invalid reference events are now more sparsely sent; they're not sent if
*any* of the following conditions is met:
@@ -18,9 +19,9 @@ Behavior / API changes:
The 1.x behavior did send invalid reference events in all those cases.
+ The `ResourceLoader` class has been deprecated in favor of a
`ResourceLoader2` class, in which the `InputStream
ResourceLoader.getResourceStream(String name)` has been replaced by a `Reader
ResourceLoader.getResourceReader(String name, String encoding)`. Since
`ResourceLoader` inherits from `ResourceLoader2`, the change remains backward
compatible, but custom resource loaders should be upgraded to avoid
deprecattion warnings.
-+ The default encoding ('ISO-8859-1' in 1.x) is now read from the standard
`file.encoding` Java system property.
-+ The `output.encoding` configuration property has been removed.
++ the default encoding ('ISO-8859-1' in 1.x) is now read from the standard
`file.encoding` Java system property.
+ the MethodException event handler now receives an additional argument
providing template name and location infos.
++ all occurences of the class
org.apache.commons.collections.ExtendedProperties in the initialization API
have been replaced by org.apache.velocity.util.ExtProperties.
VTL Syntax changes:
@@ -29,11 +30,12 @@ VTL Syntax changes:
Dependencies changes:
++ Velocity now requires a JDK version of 1.7 or higher.
+ commons-lang, commons-collections and commons-logging aren't needed any more
at runtime.
+ there's a new runtime dependency, slf4j-api 1.7.12
+ you'll need an [SLF4J binding](dependencies.html)
-### Upgrading from Velocity 1.6
+### Upgrading from Velocity 1.6.x to Velocity 1.7.x
There are no changes in the dependencies since Velocity 1.6
@@ -46,7 +48,7 @@ There are no changes in the dependencies
+ Removed obsolete Veltag (use VelocityViewTag in VelocityTools project)
+ Removed obsolete WebMacro conversion code.
-### Upgrading from Velocity 1.5
+### Upgrading from Velocity 1.5.x to Velocity 1.6.x
+ [Commons Collections](http://commons.apache.org/collections/) has been
upgraded to version 3.2.1.
+ [Commons Lang](http://commons.apache.org/lang/) has been upgraded to version
2.4.
Modified: velocity/site/cms/trunk/content/engine/devel/user-guide.mdtext
URL:
http://svn.apache.org/viewvc/velocity/site/cms/trunk/content/engine/devel/user-guide.mdtext?rev=1753523&r1=1753522&r2=1753523&view=diff
==============================================================================
--- velocity/site/cms/trunk/content/engine/devel/user-guide.mdtext (original)
+++ velocity/site/cms/trunk/content/engine/devel/user-guide.mdtext Wed Jul 20
14:44:04 2016
@@ -200,7 +200,7 @@ As of Velocity 1.6, all array references
$myarray.set(1, 'test')
-Also new in Velocity 1.6 is support for vararg methods. A method like
`azpublic void setPlanets(String... planets)` or even just `public void
setPlanets(String[] planets)` (if you are using a pre-Java 5 JDK), can now
accept any number of arguments when called in a template.
+Also new in Velocity 1.6 is support for vararg methods. A method like
`azpublic void setPlanets(String... planets)` or even just `public void
setPlanets(String[] planets)` can now accept any number of arguments when
called in a template.
$sun.setPlanets('Earth', 'Mars', 'Neptune')