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

    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
      );
     
    Since:
    1.5
    Version:
    $Id$
    • Field Detail

      • dataSourceName

        private java.lang.String dataSourceName
      • tableName

        private java.lang.String tableName
      • keyColumn

        private java.lang.String keyColumn
      • templateColumn

        private java.lang.String templateColumn
      • timestampColumn

        private java.lang.String timestampColumn
      • ctx

        private javax.naming.InitialContext ctx
      • dataSource

        private javax.sql.DataSource dataSource
      • connection

        private java.sql.Connection connection
      • templatePrepStatement

        private java.sql.PreparedStatement templatePrepStatement
      • timestampPrepStatement

        private java.sql.PreparedStatement timestampPrepStatement
    • 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
      • 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 of
        operation - string for logging, indicating caller's intention
        Returns:
        timestamp as long
      • openDBConnection

        private void openDBConnection()
                               throws javax.naming.NamingException,
                                      java.sql.SQLException
        Gets connection to the datasource specified through the configuration parameters.
        Throws:
        javax.naming.NamingException
        java.sql.SQLException
      • checkDBConnection

        private void checkDBConnection()
                                throws javax.naming.NamingException,
                                       java.sql.SQLException
        Checks the connection is valid
        Throws:
        javax.naming.NamingException
        java.sql.SQLException
      • finalize

        protected void finalize()
                         throws java.lang.Throwable
        Close DB connection on finalization
        Overrides:
        finalize in class java.lang.Object
        Throws:
        java.lang.Throwable
      • closeDBConnection

        private void closeDBConnection()
        Closes the prepared statements and the connection to the datasource
      • closeResultSet

        private void closeResultSet​(java.sql.ResultSet rs)
        Closes the result set.
      • prepareStatement

        protected java.sql.PreparedStatement prepareStatement​(java.sql.Connection conn,
                                                              java.lang.String columnNames,
                                                              java.lang.String tableName,
                                                              java.lang.String keyColumn)
                                                       throws java.sql.SQLException
        Creates the following PreparedStatement query :
        SELECT columnNames FROM tableName WHERE keyColumn = 'templateName'
        where keyColumn is a class member set in init()
        Parameters:
        conn - connection to datasource
        columnNames - columns to fetch from datasource
        tableName - table to fetch from
        keyColumn - column whose value should match templateName
        Returns:
        PreparedStatement
        Throws:
        java.sql.SQLException
      • 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
        Gets a reader from a result set's column
        Parameters:
        resultSet -
        column -
        encoding -
        Returns:
        reader
        Throws:
        java.sql.SQLException