package com.openedit.generators; import java.io.InputStream; import org.apache.commons.collections.ExtendedProperties; import org.apache.velocity.exception.ResourceNotFoundException; import org.apache.velocity.runtime.resource.Resource; import org.apache.velocity.runtime.resource.loader.ResourceLoader; import org.openedit.generators.filters.TextReaderFilter; import org.openedit.generators.filters.TranslationFilter; import org.openedit.generators.filters.XmlTranslationFilter; import org.openedit.util.ReaderInputStream; import com.openedit.ModuleManager; import com.openedit.OpenEditException; import com.openedit.page.Page; import com.openedit.page.manage.PageManager; import com.openedit.servlet.OpenEditEngine; /** * We need to clean the paths all the time except when actually returning. Yes * This needs to adjust the inputstream as it is passed out * * @author cburkey * */ public class GeneratedResourceLoader extends ResourceLoader { protected PageManager fieldPageManager; protected ModuleManager fieldModuleManager; public ModuleManager getModuleManager() { if (fieldModuleManager == null) { OpenEditEngine engine = (OpenEditEngine) rsvc.getApplicationAttribute("openEditEngine"); fieldModuleManager = engine.getModuleManager(); } return fieldModuleManager; } public void setModuleManager(ModuleManager inModuleManager) { fieldModuleManager = inModuleManager; } /** * @see org.apache.velocity.runtime.resource.loader.ResourceLoader#init(org.apache.commons.collections.ExtendedProperties) */ public void init(ExtendedProperties configuration) { if (log.isTraceEnabled()) { log.trace("FileResourceLoader : initialization starting."); } } /** * Get an InputStream so that the Runtime can build a template with it. * * @param templateName * name of template to get * @return InputStream containing the template * @throws ResourceNotFoundException * if template not found in the file template path. */ public InputStream getResourceStream(String templateName) throws ResourceNotFoundException { //ok we need to know what filters are being used int index = templateName.indexOf("?filter="); // need the locale and filter type ?filter=translate&locale=en String path = templateName; if (index == -1) { Page page = getPageManager().getPage(path); return page.getInputStream(); } path = templateName.substring(0,index); Page page = getPageManager().getPage(path); int amp = templateName.indexOf("&",index); if( amp == -1) { amp = templateName.length(); } String filter = templateName.substring(index + "?filter=".length(),amp); if( filter.equals("translation")) //TODO: Use Spring. Check performance tho { TextReaderFilter reader = new TranslationFilter(page,templateName); return new ReaderInputStream(reader, page.getCharacterEncoding()); } else if(filter.equals("xmltranslation")) //this seems slow { XmlTranslationFilter reader = new XmlTranslationFilter(page,templateName); reader.setPageManager(getPageManager()); reader.setModuleManager(getModuleManager()); return new ReaderInputStream(reader, page.getCharacterEncoding()); } //not supported throw new OpenEditException("filter " + filter + " not supported"); } /** * Overrides superclass for better performance. * * @since 1.6 */ public boolean resourceExists(String name) { if (name == null) { return false; } name = clean(name); return getPageManager().getRepository().doesExist(name); } public String clean(String inPath) { int index = inPath.indexOf("?filter="); // need the locale and filter type ?filter=translate&locale=en String template = inPath; if (index != -1) { template = template.substring(0, index); } return template; } public boolean isSourceModified(Resource resource) { String path = resource.getName(); path = clean(path); Page page = getPageManager().getPage(path); boolean modified = (page.lastModified() != resource.getLastModified()); return modified; } /** * @see org.apache.velocity.runtime.resource.loader.ResourceLoader#getLastModified(org.apache.velocity.runtime.resource.Resource) */ public long getLastModified(Resource resource) { String path = resource.getName(); path = clean(path); Page page = getPageManager().getPage(path); return page.lastModified(); } public PageManager getPageManager() { if (fieldPageManager == null) { OpenEditEngine engine = (OpenEditEngine) rsvc.getApplicationAttribute("openEditEngine"); fieldPageManager = engine.getPageManager(); } return fieldPageManager; } public void setPageManager(PageManager inPageManager) { fieldPageManager = inPageManager; } }