package com.rectang.xsm; import com.rectang.xsm.doc.DocElement; import com.rectang.xsm.io.PublishedFile; import com.rectang.xsm.io.XSMDocument; import com.rectang.xsm.site.Page; import com.rectang.xsm.site.Site; import com.rectang.xsm.types.Html; import com.rectang.xsm.types.News; import com.rectang.xsm.types.PHP; import com.rectang.xsm.types.PreviewedFile; import com.rectang.xsm.util.*; import com.rectang.xsm.velocity.DateFormatter; import org.apache.velocity.app.VelocityEngine; import org.apache.velocity.context.Context; import java.io.File; import java.io.Writer; import java.util.HashMap; import java.util.Map; /** * Helpers for the main Velocity engine configuration * <p/> * Created: 10/11/2011 * * @author Andrew Williams * @since 2.0 */ public class Engine { private static VelocityEngine velocity; private static Site fakeSite; static { initTemplates(); fakeSite = new Site( "" ) { @Override public String getTitle() { return "XSM - eXtensible Site Manager"; } @Override public String getPrefixUrl() { return XSM.getConfig().getUrl().substring( 0, XSM.getConfig().getUrl().length() - 1 ); } @Override public String getId() { return "xsm"; } }; } public static void initTemplates() { /* Initialise an engine that we will use for all document publishing */ velocity = new VelocityEngine(); /* first, get and initialize an engine */ Map<String, String> properties = Engine.getProperties(); for ( String key : properties.keySet() ) { velocity.setProperty( key, properties.get( key ) ); } try { velocity.init(); } catch ( Exception e ) { // TODO handle this error in a more visible way e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } } public static VelocityEngine getVelocityEngine() { return velocity; } public static Map<String, String> getProperties() { HashMap<String, String> ret = new HashMap<String, String>(); ret.put( "resource.loader", "class,file" ); ret.put( "class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader" ); ret.put( "file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.FileResourceLoader" ); ret.put( "file.resource.loader.path", XSM.getConfig().getDataDir() ); ret.put( "file.resource.loader.cache", "false" ); ret.put( "velocimacro.library", "com/rectang/xsm/publish/macros.vm" ); ret.put( "velocimacro.library.autoreload", "true" ); ret.put( "velocimacro.permissions.allow.inline.to.replace.global", "true" ); ret.put( "runtime.log.logsystem.class", "org.apache.velocity.runtime.log.SimpleLog4JLogSystem" ); ret.put( "runtime.log.logsystem.log4j.category", "org.apache.velocity.runtime.log.SimpleLog4JLogSystem" ); return ret; } public static Map<String, Object> getContext( XSMDocument doc, Page page, DocElement rootType, PublishedFile pubFile, Site site, String content, UserData user ) { MetaData metadata = null; if ( doc != null ) { metadata = doc.getMetadata(); } if ( site == null ) { site = fakeSite; } HashMap<String, Object> ret = new HashMap<String, Object>(); ret.put( "page", page ); ret.put( "metadata", metadata ); ret.put( "user", user ); ret.put( "site", site ); ret.put( "config", XSM.getConfig() ); ret.put( "type", rootType ); ret.put( "content", content ); ret.put( "pubFile", pubFile ); ret.put( "doc", doc ); ret.put( "dateFormatter", new DateFormatter() ); ret.put( "htmlUtils", new HTMLUtils() ); ret.put( "stringUtils", new StringUtils() ); ret.put( "fileUtils", new FileUtils() ); ret.put( "numberUtils", new NumberUtils() ); ret.put( "renderUtils", new RenderUtils() ); boolean isWelcome = rootType instanceof Html && Html.WELCOME_PAGE.getBoolean( doc ) || rootType instanceof PHP && PHP.WELCOME_PAGE.getBoolean( doc ); ret.put( "isWelcome", isWelcome ); boolean hasRss = rootType instanceof News || (rootType instanceof PreviewedFile && PreviewedFile.PUBLISH_RSS.getBoolean( doc )); ret.put( "hasrss", hasRss ); return ret; } public static org.apache.velocity.Template getTemplate( Site site ) throws Exception { File customTemplate = new File( XSM.getConfig().getSiteTemplateDir( site ), "publish.vm" ); org.apache.velocity.Template t; try { if ( customTemplate.exists() ) { t = Engine.getVelocityEngine().getTemplate( site.getId() + "/template/publish.vm" ); } else { t = Engine.getVelocityEngine().getTemplate( "com/rectang/xsm/publish/publish.vm" ); } } catch ( NullPointerException e ) { // reset the template engine Engine.initTemplates(); // try again if ( customTemplate.exists() ) { t = Engine.getVelocityEngine().getTemplate( site.getId() + "/template/publish.vm" ); } else { t = Engine.getVelocityEngine().getTemplate( "com/rectang/xsm/publish/publish.vm" ); } } return t; } public static void process( Site site, Context context, Writer writer ) throws Exception { org.apache.velocity.Template t = getTemplate( site ); t.merge( context, writer ); } }