package org.springframework.roo.addon.gwt; import hapax.Template; import hapax.TemplateException; import hapax.TemplateLoader; import hapax.parser.TemplateParser; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Map; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.Validate; /** * Loads hapax templates from the classpath. * * @author Alan Stewart * @since 1.1 */ public class TemplateResourceLoader implements TemplateLoader { private static final Map<String, Template> cache = new HashMap<String, Template>(); private static final String TEMPLATE_DIR = "org/springframework/roo/addon/gwt/scaffold/templates/"; /** * Creates a TemplateLoader for CTemplate language using the default * template directory */ public static TemplateLoader create() { return new TemplateResourceLoader(TEMPLATE_DIR); } /** * Creates a TemplateLoader for CTemplate language */ public static TemplateLoader create(final String base_path) { return new TemplateResourceLoader(base_path); } /** * Creates a TemplateLoader using the argument parser. */ public static TemplateLoader createForParser(final String base_path, final TemplateParser parser) { return new TemplateResourceLoader(base_path, parser); } protected final String baseDir; protected final TemplateParser parser; public TemplateResourceLoader(final String baseDir) { this(baseDir, null); } public TemplateResourceLoader(final String baseDir, final TemplateParser parser) { this.baseDir = baseDir; this.parser = parser; } public Template getTemplate(final String resource) throws TemplateException { return getTemplate(new TemplateLoader.Context(this, baseDir), resource); } public Template getTemplate(final TemplateLoader context, String resource) throws TemplateException { if (!resource.endsWith(".xtm")) { resource += ".xtm"; } final String templatePath = baseDir + resource; if (cache.containsKey(templatePath)) { return cache.get(templatePath); } final InputStream inputStream = getClass().getClassLoader() .getResourceAsStream(templatePath); Validate.notNull(inputStream, "template path required"); String contents; try { contents = IOUtils.toString(inputStream); } catch (final IOException e) { throw new IllegalStateException(e); } finally { IOUtils.closeQuietly(inputStream); } final Template template = parser == null ? new Template(contents, context) : new Template(parser, contents, context); synchronized (cache) { cache.put(templatePath, template); } return template; } public String getTemplateDirectory() { return baseDir; } }