X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=source%2Fmir%2Fgenerator%2Ftal%2FTALTemplateEngine.java;h=b3c31c61ae88dc36cbd4d02ee77389efeb9c7782;hb=b7ea95152eaddbf069564a5f2f117774165d36e6;hp=13125bf0fce42fdbb20cb6c15cfbc6d9be30ce50;hpb=04bf29aa1f1abf43e96d0272b2a286f0c1f9fea8;p=mir.git diff --git a/source/mir/generator/tal/TALTemplateEngine.java b/source/mir/generator/tal/TALTemplateEngine.java index 13125bf0..b3c31c61 100755 --- a/source/mir/generator/tal/TALTemplateEngine.java +++ b/source/mir/generator/tal/TALTemplateEngine.java @@ -33,29 +33,80 @@ package mir.generator.tal; import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.util.List; +import java.util.Map; import mir.generator.tal.interfaces.TALExpressionParser; +import mir.generator.tal.template.CoreTemplateNodeLibrary; +import mir.generator.tal.template.MacroTemplateNodeLibrary; +import mir.generator.tal.template.Template; +import mir.generator.tal.template.TemplateLibrary; +import mir.generator.tal.template.TemplateNode; +import mir.generator.tal.template.TemplateNodeLibrary; +import mir.generator.tal.template.TemplateProcessingException; +import mir.util.StringRoutines; -public class TALTemplateEngine { +public class TALTemplateEngine implements TemplateLibrary { private TALExpressionParser expressionParser; - private String basePath; + private File basePath; private CachingFileLoader loader; - public TALTemplateEngine(TALExpressionParser anExpressionParser, String aBasePath) { + private SimpleTemplateNodeLibraryRegistry registry; + + public TALTemplateEngine(TALExpressionParser anExpressionParser, File aBasePath) { expressionParser = anExpressionParser; basePath = aBasePath; loader = new CachingFileLoader(100, new TemplateFactory()); + + registry = new SimpleTemplateNodeLibraryRegistry(); + + registerTemplateNodeLibrary("tal", "http://xml.zope.org/namespaces/tal", + new CoreTemplateNodeLibrary("tal", "http://xml.zope.org/namespaces/tal")); + registerTemplateNodeLibrary("metal", "http://xml.zope.org/namespaces/metal", + new MacroTemplateNodeLibrary("metal", "http://xml.zope.org/namespaces/metal")); + } + + public void registerTemplateNodeLibrary(String aPrefix, String aUrl, TemplateNodeLibrary aLibrary) { + registry.registerTemplateNodeLibrary(aPrefix, aUrl, aLibrary); + } + + public Template loadTemplate(String aName) throws IOException, TemplateProcessingException { + List parts = StringRoutines.splitString(aName, "#"); + + if (parts.size()!=1 && parts.size()!=2) { + throw new TemplateProcessingException("Invalid template name: " + aName); + } + + File location = new File(basePath, (String) parts.get(0)); + + Template baseTemplate = (Template) loader.retrieveFile(location.getCanonicalPath()); + + if (baseTemplate!=null && parts.size()>1) { + Map definitions = (Map) baseTemplate.getContext().get(MacroTemplateNodeLibrary.MACRO_DEFINITIONS_KEY); + if (definitions==null || !definitions.containsKey(parts.get(1))) { + throw new TemplateProcessingException("No macro '"+(String) parts.get(1)+"' found in template '" + (String) parts.get(0) + "'"); + } + + return new Template(expressionParser, (TemplateNode) definitions.get(parts.get(1)), baseTemplate.getContext()); + } + return baseTemplate; } - public TALTemplate loadTemplate(String aName) throws IOException { - File location = new File(basePath, aName); - return (TALTemplate) loader.retrieveFile(location.getCanonicalPath()); + public Template lookupTemplate(String aName) throws TemplateProcessingException { + try { + return loadTemplate(aName); + } + catch (IOException e) { + throw new TemplateProcessingException("Can't load template " + aName + ": " + e.toString(), e); + } } private class TemplateFactory implements CachingFileLoader.CachedFileObjectFactory { public Object constructObject(InputStream aStream) { try { - return TALTemplateParser.parse(aStream, expressionParser); + TALTemplateParser parser = new TALTemplateParser(registry); + + return parser.parse(aStream, expressionParser); } catch (Throwable t) { throw new TALFailure(t);