Class DataSourceResourceLoader
- java.lang.Object
-
- org.apache.velocity.runtime.resource.loader.ResourceLoader
-
- org.apache.velocity.runtime.resource.loader.DataSourceResourceLoader
-
public class DataSourceResourceLoader extends ResourceLoader
This is a simple template file loader that loads templates from a DataSource instead of plain files.
It can be configured with a datasource name, a table name, id column (name), content column (the template body) and a datetime column (for last modification info).
Example configuration snippet for velocity.properties:
resource.loaders = file, ds resource.loader.ds.description = Velocity DataSource Resource Loader
resource.loader.ds.class = org.apache.velocity.runtime.resource.loader.DataSourceResourceLoader
resource.loader.ds.resource.datasource_url = java:comp/env/jdbc/Velocity
resource.loader.ds.resource.table = tb_velocity_template
resource.loader.ds.resource.key_column = id_template
resource.loader.ds.resource.template_column = template_definition
resource.loader.ds.resource.timestamp_column = template_timestamp
resource.loader.ds.cache = false
resource.loader.ds.modification_check_interval = 60
resource.loader.ds.statements_pool_max_size = 50
Optionally, the developer can instantiate the DataSourceResourceLoader and set the DataSource via code in a manner similar to the following:
DataSourceResourceLoader ds = new DataSourceResourceLoader(); ds.setDataSource(DATASOURCE); Velocity.setProperty("resource.loader.ds.instance",ds);The property
resource.loader.ds.classshould be left out, otherwise all the other properties in velocity.properties would remain the same.
Example WEB-INF/web.xml:
<resource-ref> <description>Velocity template DataSource</description> <res-ref-name>jdbc/Velocity</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref>
and Tomcat 4 server.xml file:
[...] <Context path="/exampleVelocity" docBase="exampleVelocity" debug="0"> [...] <ResourceParams name="jdbc/Velocity"> <parameter> <name>driverClassName</name> <value>org.hsql.jdbcDriver</value> </parameter> <parameter> <name>driverName</name> <value>jdbc:HypersonicSQL:database</value> </parameter> <parameter> <name>user</name> <value>database_username</value> </parameter> <parameter> <name>password</name> <value>database_password</value> </parameter> </ResourceParams> [...] </Context> [...]
Example sql script:
CREATE TABLE tb_velocity_template ( id_template varchar (40) NOT NULL , template_definition text (16) NOT NULL , template_timestamp datetime NOT NULL );Prior to Velocity 2.4, this class should not be considered thread-safe.
Since Velocity 2.4, the handling of JDBC connections and prepared statements is delegated to the
DatabaseObjectsFactoryinstance. The default class for this database objects factory isDefaultDatabaseObjectsFactory, which obtains a new connection from the data source and prepares statements at each query. You can configure this resource loader to use theorg.apache.velocity.runtime.resource.loader.CachingDatabaseObjectsFactorywhich will keep a single connection and tries to reuse prepared statements. statements- Since:
- 1.5
- Version:
- $Id$
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private classDataSourceResourceLoader.SelfCleaningReader
-
Field Summary
Fields Modifier and Type Field Description private static java.lang.StringDATABASE_OBJECTS_FACTORY_DEFAULT_CLASSprivate javax.sql.DataSourcedataSourceprivate DatabaseObjectsFactoryfactoryprivate java.lang.StringtemplateColumnprivate java.lang.StringtemplateSQLprivate java.lang.StringtimestampColumnprivate java.lang.StringtimestampSQL-
Fields inherited from class org.apache.velocity.runtime.resource.loader.ResourceLoader
className, isCachingOn, log, modificationCheckInterval, rsvc
-
-
Constructor Summary
Constructors Constructor Description DataSourceResourceLoader()
-
Method Summary
All Methods Instance Methods Concrete Methods Deprecated Methods Modifier and Type Method Description voidclear()Frees all resources.private voidcloseResultSet(java.sql.ResultSet rs)Closes the result set.protected java.sql.ResultSetfetchResult(java.sql.PreparedStatement ps, java.lang.String templateName)Fetches the result for a given template name.longgetLastModified(Resource resource)Get the last modified time of the InputStream source that was used to create the template.protected java.io.ReadergetReader(java.sql.ResultSet resultSet, java.lang.String column)Gets a reader from a result set's column.protected java.io.ReadergetReader(java.sql.ResultSet resultSet, java.lang.String column, java.lang.String encoding)Deprecated.the 'encoding' parameter is useless, it should have been set in the database.java.io.ReadergetResourceReader(java.lang.String name, java.lang.String encoding)Get an InputStream so that the Runtime can build a template with it.voidinit(ExtProperties configuration)Initialize the template loader with a a resources class.booleanisSourceModified(Resource resource)Given a template, check to see if the source of InputStream has been modified.private longreadLastModified(Resource resource, java.lang.String operation)Fetches the last modification time of the resourcevoidsetDataSource(javax.sql.DataSource dataSource)Set the DataSource used by this resource loader.-
Methods inherited from class org.apache.velocity.runtime.resource.loader.ResourceLoader
buildReader, commonInit, getClassName, getModificationCheckInterval, isCachingOn, resourceExists, setCachingOn, setModificationCheckInterval
-
-
-
-
Field Detail
-
DATABASE_OBJECTS_FACTORY_DEFAULT_CLASS
private static final java.lang.String DATABASE_OBJECTS_FACTORY_DEFAULT_CLASS
- See Also:
- Constant Field Values
-
dataSource
private javax.sql.DataSource dataSource
-
factory
private DatabaseObjectsFactory factory
-
templateColumn
private java.lang.String templateColumn
-
timestampColumn
private java.lang.String timestampColumn
-
templateSQL
private java.lang.String templateSQL
-
timestampSQL
private java.lang.String timestampSQL
-
-
Method Detail
-
init
public void init(ExtProperties configuration)
Description copied from class:ResourceLoaderInitialize the template loader with a a resources class.- Specified by:
initin classResourceLoader- See Also:
ResourceLoader.init(org.apache.velocity.util.ExtProperties)
-
setDataSource
public void setDataSource(javax.sql.DataSource dataSource)
Set the DataSource used by this resource loader. Call this as an alternative to specifying the data source name via properties.- Parameters:
dataSource- The data source for this ResourceLoader.
-
isSourceModified
public boolean isSourceModified(Resource resource)
Description copied from class:ResourceLoaderGiven a template, check to see if the source of InputStream has been modified.- Specified by:
isSourceModifiedin classResourceLoader- Returns:
- True if the resource has been modified.
- See Also:
ResourceLoader.isSourceModified(org.apache.velocity.runtime.resource.Resource)
-
getLastModified
public long getLastModified(Resource resource)
Description copied from class:ResourceLoaderGet the last modified time of the InputStream source that was used to create the template. We need the template here because we have to extract the name of the template in order to locate the InputStream source.- Specified by:
getLastModifiedin classResourceLoader- Returns:
- Time in millis when the resource has been modified.
- See Also:
ResourceLoader.getLastModified(org.apache.velocity.runtime.resource.Resource)
-
getResourceReader
public java.io.Reader getResourceReader(java.lang.String name, java.lang.String encoding) throws ResourceNotFoundExceptionGet an InputStream so that the Runtime can build a template with it.- Specified by:
getResourceReaderin classResourceLoader- Parameters:
name- name of templateencoding- asked encoding- Returns:
- InputStream containing template
- Throws:
ResourceNotFoundException- Since:
- 2.0
-
readLastModified
private long readLastModified(Resource resource, java.lang.String operation)
Fetches the last modification time of the resource- Parameters:
resource- Resource object we are finding timestamp ofoperation- string for logging, indicating caller's intention- Returns:
- timestamp as long
-
closeResultSet
private void closeResultSet(java.sql.ResultSet rs)
Closes the result set.
-
fetchResult
protected java.sql.ResultSet fetchResult(java.sql.PreparedStatement ps, java.lang.String templateName) throws java.sql.SQLExceptionFetches the result for a given template name. Inherit this method if there is any calculation to perform on the template name.- Parameters:
ps- target prepared statementtemplateName- input template name- Returns:
- result set
- Throws:
java.sql.SQLException
-
getReader
protected java.io.Reader getReader(java.sql.ResultSet resultSet, java.lang.String column, java.lang.String encoding) throws java.sql.SQLExceptionDeprecated.the 'encoding' parameter is useless, it should have been set in the database. UsegetReader(ResultSet, String)Gets a reader from a result set's column.- Parameters:
resultSet- result setcolumn- template columnencoding- template encoding (unused)- Returns:
- reader
- Throws:
java.sql.SQLException
-
getReader
protected java.io.Reader getReader(java.sql.ResultSet resultSet, java.lang.String column) throws java.sql.SQLExceptionGets a reader from a result set's column.- Parameters:
resultSet- result setcolumn- template column- Returns:
- reader
- Throws:
java.sql.SQLException
-
clear
public void clear()
Frees all resources.
-
-