Class 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.class should 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 DatabaseObjectsFactory instance. The default class for this database objects factory is DefaultDatabaseObjectsFactory, which obtains a new connection from the data source and prepares statements at each query. You can configure this resource loader to use the org.apache.velocity.runtime.resource.loader.CachingDatabaseObjectsFactory which will keep a single connection and tries to reuse prepared statements. statements

    Since:
    1.5
    Version:
    $Id$
    Author:
    Will Glass-Husain, Matt Raible, David Kinnvall, Paulo Gaspar, Sylwester Lachiewicz, Henning P. Schmiedehausen
    • Constructor Detail

      • DataSourceResourceLoader

        public DataSourceResourceLoader()
    • Method Detail

      • 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.
      • getResourceReader

        public java.io.Reader getResourceReader​(java.lang.String name,
                                                java.lang.String encoding)
                                         throws ResourceNotFoundException
        Get an InputStream so that the Runtime can build a template with it.
        Specified by:
        getResourceReader in class ResourceLoader
        Parameters:
        name - name of template
        encoding - asked encoding
        Returns:
        InputStream containing template
        Throws:
        ResourceNotFoundException
        Since:
        2.0
      • fetchResult

        protected java.sql.ResultSet fetchResult​(java.sql.PreparedStatement ps,
                                                 java.lang.String templateName)
                                          throws java.sql.SQLException
        Fetches 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 statement
        templateName - 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.SQLException
        Deprecated.
        the 'encoding' parameter is useless, it should have been set in the database. Use getReader(ResultSet, String)
        Gets a reader from a result set's column.
        Parameters:
        resultSet - result set
        column - template column
        encoding - 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.SQLException
        Gets a reader from a result set's column.
        Parameters:
        resultSet - result set
        column - template column
        Returns:
        reader
        Throws:
        java.sql.SQLException
      • clear

        public void clear()
        Frees all resources.