Package com.acciente.induction.template

Source Code of com.acciente.induction.template.FreemarkerTemplatingEngine

/*
* Copyright 2008-2011 Acciente, LLC
*
* Acciente, LLC licenses this file to you under the
* Apache License, Version 2.0 (the "License"); you
* may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in
* writing, software distributed under the License is
* distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
* OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing
* permissions and limitations under the License.
*/
package com.acciente.induction.template;

import com.acciente.induction.init.config.Config;
import com.acciente.induction.view.Template;
import freemarker.cache.ClassTemplateLoader;
import freemarker.cache.FileTemplateLoader;
import freemarker.cache.MultiTemplateLoader;
import freemarker.cache.TemplateLoader;
import freemarker.cache.WebappTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.TemplateException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import javax.servlet.ServletConfig;
import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
* An implementation of the Induction template engine interface that plugs in the Freemarker templating engine.
*
* @created Apr 17, 2008
*
* @author Adinath Raveendra Raj
*/
public class FreemarkerTemplatingEngine implements TemplatingEngine
{
   private  Configuration  _oConfiguration;

   public FreemarkerTemplatingEngine( Config.Templating        oConfig,
                                      ClassLoader              oClassLoader,
                                      ServletConfig            oServletConfig )
      throws IOException, ClassNotFoundException
   {
      Log oLog;

      oLog = LogFactory.getLog( FreemarkerTemplatingEngine.class );

      _oConfiguration = new Configuration();

      // set up the template loading path
      List oTemplateLoaderList = new ArrayList( oConfig.getTemplatePath().getList().size() );

      for ( Iterator oIter = oConfig.getTemplatePath().getList().iterator(); oIter.hasNext(); )
      {
         Object oLoaderPathItem = oIter.next();

         if ( oLoaderPathItem instanceof Config.Templating.TemplatePath.Dir )
         {
            Config.Templating.TemplatePath.Dir oDir = ( Config.Templating.TemplatePath.Dir ) oLoaderPathItem;

            if ( ! oDir.getDir().exists() )
            {
               oLog.warn( "freemarker > template load path > ignoring missing directory > " + oDir.getDir() );
            }
            else
            {
               oLog.info( "freemarker > template load path > adding directory > " + oDir.getDir() );

               oTemplateLoaderList.add( new FileTemplateLoader( oDir.getDir() ) );
            }
         }
         else if ( oLoaderPathItem instanceof Config.Templating.TemplatePath.LoaderClass )
         {
            Config.Templating.TemplatePath.LoaderClass oLoaderClass = ( Config.Templating.TemplatePath.LoaderClass ) oLoaderPathItem;

            Class oClass = Class.forName( oLoaderClass.getLoaderClassName() );

            oLog.info( "freemarker > template load path > adding class > "
                       + oLoaderClass.getLoaderClassName()
                       + ", prefix: "
                       + oLoaderClass.getPath() );

            oTemplateLoaderList.add( new ClassTemplateLoader( oClass, oLoaderClass.getPath() ) );
         }
         else if ( oLoaderPathItem instanceof Config.Templating.TemplatePath.WebappPath )
         {
            Config.Templating.TemplatePath.WebappPath oWebappPath = ( Config.Templating.TemplatePath.WebappPath ) oLoaderPathItem;

            oLog.info( "freemarker > template load path > adding webapp path > "
                       + oWebappPath.getPath() );

            oTemplateLoaderList.add( new WebappTemplateLoader( oServletConfig.getServletContext(),
                                                               oWebappPath.getPath() ) );
         }
         else
         {
            throw new IllegalArgumentException( "Unexpected template path type in configuration: " + oLoaderPathItem.getClass() );
         }
      }

      TemplateLoader[] oTemplateLoaderArray = new TemplateLoader[ oTemplateLoaderList.size() ];
      oTemplateLoaderList.toArray( oTemplateLoaderArray );
      _oConfiguration.setTemplateLoader( new MultiTemplateLoader( oTemplateLoaderArray ) );

      // next set the object wrapper handler
      DefaultObjectWrapper oDefaultObjectWrapper = new DefaultObjectWrapper();

      // should publics fields in views be available in the templates
      oDefaultObjectWrapper.setExposeFields( oConfig.isExposePublicFields() );

      oLog.info( "freemarker > expose public fields > " + oConfig.isExposePublicFields() );

      _oConfiguration.setObjectWrapper( oDefaultObjectWrapper );

      if ( oConfig.getLocale() != null )
      {
         _oConfiguration.setLocale( oConfig.getLocale() );

         oLog.info( "freemarker > using configured locale > " + oConfig.getLocale() );
      }
      else
      {
         oLog.warn( "freemarker > no locale configured, using default > " + _oConfiguration.getLocale() );
      }
   }

   public void process( Template oTemplate, Writer oWriter ) throws TemplatingEngineException, IOException
   {
      try
      {
         _oConfiguration
            .getTemplate( oTemplate.getTemplateName() )
               .process( oTemplate, oWriter );
      }
      catch ( TemplateException e )
      {
         throw new TemplatingEngineException( "View " + oTemplate.getClass().getName() + ", freemaker error: ", e );
      }
   }

   /**
    * This method was added to allow classes to extend this class to modify the Freemarker configuration
    * @return
    */
   public Configuration getConfiguration()
   {
      return _oConfiguration;
   }
}

// EOF
TOP

Related Classes of com.acciente.induction.template.FreemarkerTemplatingEngine

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.