/**
* This file Copyright (c) 2003-2012 Magnolia International
* Ltd. (http://www.magnolia-cms.com). All rights reserved.
*
*
* This file is dual-licensed under both the Magnolia
* Network Agreement and the GNU General Public License.
* You may elect to use one or the other of these licenses.
*
* This file is distributed in the hope that it will be
* useful, but AS-IS and WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE, TITLE, or NONINFRINGEMENT.
* Redistribution, except as permitted by whichever of the GPL
* or MNA you select, is prohibited.
*
* 1. For the GPL license (GPL), you can redistribute and/or
* modify this file under the terms of the GNU General
* Public License, Version 3, as published by the Free Software
* Foundation. You should have received a copy of the GNU
* General Public License, Version 3 along with this program;
* if not, write to the Free Software Foundation, Inc., 51
* Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* 2. For the Magnolia Network Agreement (MNA), this file
* and the accompanying materials are made available under the
* terms of the MNA which accompanies this distribution, and
* is available at http://www.magnolia-cms.com/mna.html
*
* Any modifications to this file must keep this entire header
* intact.
*
*/
package info.magnolia.freemarker;
import freemarker.cache.ClassTemplateLoader;
import freemarker.cache.MultiTemplateLoader;
import freemarker.cache.TemplateLoader;
import freemarker.template.ObjectWrapper;
import freemarker.template.TemplateExceptionHandler;
import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException;
import info.magnolia.freemarker.models.MagnoliaModelFactory;
import info.magnolia.freemarker.models.MagnoliaObjectWrapper;
import info.magnolia.objectfactory.Components;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Observed bean holding Freemarker configuration. Not to be confused with
* Freemarker's own {@link freemarker.template.Configuration}. This only exposes the few
* properties that Magnolia allows to configure and is able to handle properly.
* It also provides a few additional methods used internally.
*
* @see info.magnolia.freemarker.FreemarkerHelper
* @see info.magnolia.freemarker.models.MagnoliaObjectWrapper
* @see info.magnolia.freemarker.models.MagnoliaModelFactory
*/
public class FreemarkerConfig {
/**
* @deprecated since 4.3 should not be needed - components using this can keep their instance
* @deprecated since 4.5, use IoC !
*/
public static FreemarkerConfig getInstance() {
return Components.getSingleton(FreemarkerConfig.class);
}
/**
* The MagnoliaModelFactory implementations explicitly registered by modules.
*/
private List<MagnoliaModelFactory> registeredModelFactories = new ArrayList<MagnoliaModelFactory>();
private List<TemplateLoader> templateLoaders = new ArrayList<TemplateLoader>();
private Map<String, TemplateModel> sharedVariables = new HashMap<String, TemplateModel>();
private TemplateExceptionHandler templateExceptionHandler = TemplateExceptionHandler.IGNORE_HANDLER;
private ObjectWrapper objectWrapper;
private TemplateLoader multiTL;
public FreemarkerConfig() {
}
public ObjectWrapper getObjectWrapper() {
if (objectWrapper == null) {
objectWrapper = newObjectWrapper();
}
return objectWrapper;
}
protected ObjectWrapper newObjectWrapper() {
return new MagnoliaObjectWrapper(this);
}
public TemplateLoader getTemplateLoader() {
if (multiTL == null) {
// using getTemplateLoaders() instead of the variable to make sure we go to the proxied object!?
final List<TemplateLoader> loaders = getTemplateLoaders();
final int s = loaders.size();
// add a ClassTemplateLoader as our last loader
final TemplateLoader[] tl = loaders.toArray(new TemplateLoader[s + 1]);
tl[s] = new ClassTemplateLoader(getClass(), "/");
multiTL = new MultiTemplateLoader(tl);
}
return multiTL;
}
public List<MagnoliaModelFactory> getModelFactories() {
return registeredModelFactories;
}
public void setModelFactories(List<MagnoliaModelFactory> registeredModelFactories) {
this.registeredModelFactories.addAll(registeredModelFactories);
}
public void addModelFactory(MagnoliaModelFactory modelFactory) {
this.registeredModelFactories.add(modelFactory);
}
public List<TemplateLoader> getTemplateLoaders() {
return templateLoaders;
}
public void setTemplateLoaders(List<TemplateLoader> templateLoaders) {
this.templateLoaders.addAll(templateLoaders);
}
public void addTemplateLoader(TemplateLoader templateLoader) {
this.templateLoaders.add(templateLoader);
}
public Map<String, TemplateModel> getSharedVariables() {
return sharedVariables;
}
public void setSharedVariables(Map<String, TemplateModel> sharedVariables) {
this.sharedVariables.putAll(sharedVariables);
}
public void addSharedVariable(String name, Object value) throws TemplateModelException {
sharedVariables.put(name, getObjectWrapper().wrap(value));
}
public TemplateExceptionHandler getTemplateExceptionHandler() {
return templateExceptionHandler;
}
public void setTemplateExceptionHandler(TemplateExceptionHandler templateExceptionHandler) {
this.templateExceptionHandler = templateExceptionHandler;
}
}