diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerHttpServlet.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerHttpServlet.java index b1079bda1..a97721bd9 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerHttpServlet.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/controller/freemarker/FreemarkerHttpServlet.java @@ -313,7 +313,6 @@ public class FreemarkerHttpServlet extends VitroHttpServlet { */ public static Map getDirectives() { Map map = new HashMap(); - map.put("describe", new edu.cornell.mannlib.vitro.webapp.web.directives.dump.DescribeDirective()); map.put("dump", new edu.cornell.mannlib.vitro.webapp.web.directives.dump.DumpDirective()); map.put("dumpAll", new edu.cornell.mannlib.vitro.webapp.web.directives.dump.DumpAllDirective()); map.put("help", new edu.cornell.mannlib.vitro.webapp.web.directives.dump.HelpDirective()); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/dump/DescribeDirective.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/dump/DescribeDirective.java deleted file mode 100644 index d6148d6d4..000000000 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/dump/DescribeDirective.java +++ /dev/null @@ -1,109 +0,0 @@ -/* $This file is distributed under the terms of the license in /doc/license.txt$ */ - -package edu.cornell.mannlib.vitro.webapp.web.directives.dump; - -import java.io.IOException; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -import edu.cornell.mannlib.vitro.webapp.web.directives.BaseTemplateDirectiveModel; -import edu.cornell.mannlib.vitro.webapp.web.templatemodels.BaseTemplateModel; -import freemarker.core.Environment; -import freemarker.template.SimpleScalar; -import freemarker.template.TemplateDirectiveBody; -import freemarker.template.TemplateException; -import freemarker.template.TemplateHashModel; -import freemarker.template.TemplateModel; -import freemarker.template.TemplateModelException; -import freemarker.template.utility.DeepUnwrap; - -public class DescribeDirective extends BaseTemplateDirectiveModel { - - private static final Log log = LogFactory.getLog(DescribeDirective.class); - - @Override - public void execute(Environment env, Map params, TemplateModel[] loopVars, - TemplateDirectiveBody body) throws TemplateException, IOException { - - if (loopVars.length != 0) { - throw new TemplateModelException( - "The describe directive doesn't allow loop variables."); - } - if (body != null) { - throw new TemplateModelException( - "The describe directive doesn't allow nested content."); - } - - Object o = params.get("var"); - if ( !(o instanceof SimpleScalar)) { - throw new TemplateModelException( - "Value of parameter 'var' must be a string."); - } - - String varName = ((SimpleScalar)o).getAsString(); - - TemplateHashModel dataModel = env.getDataModel(); - - TemplateModel wrappedModel = null; - try { - wrappedModel = dataModel.get(varName); - } catch (TemplateModelException tme) { - log.error("Error getting value of template model " + varName + " from data model."); - } - - Object unwrappedModel = null; - try { - unwrappedModel = DeepUnwrap.permissiveUnwrap(wrappedModel); - } catch (TemplateModelException e) { - log.error("Cannot unwrap template model " + varName + "."); - } - - if (! (unwrappedModel instanceof BaseTemplateModel) ) { - throw new TemplateModelException( - varName + " is not a template model."); - } - - DumpHelper helper = new DumpHelper(env); - List methods = helper.getMethodsAvailableToTemplate(wrappedModel, (BaseTemplateModel)unwrappedModel); - List methodDisplayNames = new ArrayList(methods.size()); - for (Method m : methods) { - methodDisplayNames.add(helper.getMethodDisplayName(m)); - } - Collections.sort(methodDisplayNames); - - Map map = new HashMap(); - map.put("var", varName); - map.put("methods", methodDisplayNames); - - helper.writeDump("describe.ftl", map, varName, dataModel); - } - - @Override - public String help(String name, Environment env) { - Map map = new HashMap(); - - map.put("name", name); - - map.put("effect", "Describe the methods callable on a template variable."); - - //map.put("comments", ""); - - Map params = new HashMap(); - params.put("var", "name of variable to describe"); - map.put("params", params); - - List examples = new ArrayList(); - examples.add("<@" + name + " var=\"stylesheets\" />"); - map.put("examples", examples); - - return mergeToHelpTemplate(map, env); - } - -} diff --git a/webapp/src/freemarker/ext/dump/BaseDumpDirective.java b/webapp/src/freemarker/ext/dump/BaseDumpDirective.java index b9d2c52a6..8c45a559f 100644 --- a/webapp/src/freemarker/ext/dump/BaseDumpDirective.java +++ b/webapp/src/freemarker/ext/dump/BaseDumpDirective.java @@ -465,4 +465,7 @@ public abstract class BaseDumpDirective implements TemplateDirectiveModel { out.write(sw.toString()); } + protected Map help(String name) { + return new HashMap(); + } } diff --git a/webapp/src/freemarker/ext/dump/DumpAllDirective.java b/webapp/src/freemarker/ext/dump/DumpAllDirective.java index 7f0f7ae8b..cad3b2e9e 100644 --- a/webapp/src/freemarker/ext/dump/DumpAllDirective.java +++ b/webapp/src/freemarker/ext/dump/DumpAllDirective.java @@ -48,7 +48,7 @@ public class DumpAllDirective extends BaseDumpDirective { } SortedMap dataModelDump = getDataModelDump(env); - dump("dumpAll.ftl", dataModelDump, env); + dump("dump-all.ftl", dataModelDump, env); } SortedMap getDataModelDump(Environment env) throws TemplateModelException { @@ -66,5 +66,21 @@ public class DumpAllDirective extends BaseDumpDirective { return dump; } - + + @Override + protected Map help(String name) { + Map map = new HashMap(); + + //map.put("name", name); + + map.put("effect", "Dump the contents of the template data model."); + + //map.put("comments", ""); + + List examples = new ArrayList(); + examples.add("<@" + name + " />"); + map.put("examples", examples); + + return map; + } } diff --git a/webapp/src/freemarker/ext/dump/DumpDirective.java b/webapp/src/freemarker/ext/dump/DumpDirective.java index 45ce17f66..f30fd67b3 100644 --- a/webapp/src/freemarker/ext/dump/DumpDirective.java +++ b/webapp/src/freemarker/ext/dump/DumpDirective.java @@ -3,7 +3,9 @@ package freemarker.ext.dump; import java.io.IOException; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.apache.commons.logging.Log; @@ -42,9 +44,30 @@ public class DumpDirective extends BaseDumpDirective { } String varName = ((SimpleScalar)o).getAsString(); - Map map = new HashMap(); - map.put("var", getTemplateVariableDump(varName, env)); + Map map = getTemplateVariableDump(varName, env); dump("dumpvar.ftl", map, env); } + + @Override + protected Map help(String name) { + Map map = new HashMap(); + + //map.put("name", name); + + map.put("effect", "Dump the contents of a template variable."); + + //map.put("comments", ""); + + Map params = new HashMap(); + params.put("var", "name of variable to dump"); + map.put("params", params); + + List examples = new ArrayList(); + examples.add("<@" + name + " var=\"urls\" />"); + map.put("examples", examples); + + return map; + + } } diff --git a/webapp/src/freemarker/ext/dump/HelpDirective.java b/webapp/src/freemarker/ext/dump/HelpDirective.java new file mode 100644 index 000000000..2433edd75 --- /dev/null +++ b/webapp/src/freemarker/ext/dump/HelpDirective.java @@ -0,0 +1,89 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package freemarker.ext.dump; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import freemarker.core.Environment; +import freemarker.template.SimpleScalar; +import freemarker.template.TemplateDirectiveBody; +import freemarker.template.TemplateDirectiveModel; +import freemarker.template.TemplateException; +import freemarker.template.TemplateHashModel; +import freemarker.template.TemplateMethodModel; +import freemarker.template.TemplateModel; +import freemarker.template.TemplateModelException; +import freemarker.template.utility.DeepUnwrap; + +public class HelpDirective extends BaseDumpDirective { + + @Override + public void execute(Environment env, Map params, TemplateModel[] loopVars, + TemplateDirectiveBody body) throws TemplateException, IOException { + + if (loopVars.length != 0) { + throw new TemplateModelException( + "The help directive doesn't allow loop variables."); + } + if (body != null) { + throw new TemplateModelException( + "The help directive doesn't allow nested content."); + } + + Object o = params.get("for"); + + if ( o == null) { + throw new TemplateModelException( + "Must specify 'for' argument."); + } + + if ( !(o instanceof SimpleScalar)) { + throw new TemplateModelException( + "Value of parameter 'for' must be a string."); + } + + String varName = ((SimpleScalar)o).getAsString(); + TemplateHashModel dataModel = env.getDataModel(); + Object templateModel = dataModel.get(varName); + + if (templateModel == null) { + throw new TemplateModelException( + "Value of parameter '" + varName + "' must be the name of a directive or method"); + } + + if (! (templateModel instanceof TemplateMethodModel || templateModel instanceof TemplateDirectiveModel)) { + throw new TemplateModelException( + "Value of parameter '" + varName + "' must be the name of a directive or method"); + } + + Map map = getTemplateVariableDump(varName, env); + dump("dumpvar.ftl", map, env); + } + + @Override + protected Map help(String name) { + Map map = new HashMap(); + + //map.put("name", name); + + map.put("effect", "Output help for a directive or method."); + + //map.put("comments", ""); + + Map params = new HashMap(); + params.put("for", "name of directive or method"); + map.put("params", params); + + List examples = new ArrayList(); + examples.add("<@" + name + " for=\"dump\" />"); + examples.add("<@" + name + " for=\"profileUrl\" />"); + map.put("examples", examples); + + return map; + } + +} diff --git a/webapp/test/freemarker/ext/dump/DumpDirectiveTest.java b/webapp/test/freemarker/ext/dump/DumpDirectiveTest.java index 66d79740c..77276e9be 100644 --- a/webapp/test/freemarker/ext/dump/DumpDirectiveTest.java +++ b/webapp/test/freemarker/ext/dump/DumpDirectiveTest.java @@ -228,9 +228,7 @@ public class DumpDirectiveTest { test(varName, dataModel, expectedDump); } - - // RY test method and directive types with and without help methods - + @Test public void dumpHelplessMethod() { diff --git a/webapp/test/freemarker/ext/dump/HelpDirectiveTest.java b/webapp/test/freemarker/ext/dump/HelpDirectiveTest.java new file mode 100644 index 000000000..111d8fab4 --- /dev/null +++ b/webapp/test/freemarker/ext/dump/HelpDirectiveTest.java @@ -0,0 +1,281 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package freemarker.ext.dump; + +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.fail; + +import java.io.IOException; +import java.io.StringReader; +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.junit.Before; +import org.junit.Test; + +import freemarker.core.Environment; +import freemarker.ext.dump.BaseDumpDirective.Key; +import freemarker.ext.dump.BaseDumpDirective.Type; +import freemarker.template.Configuration; +import freemarker.template.Template; +import freemarker.template.TemplateDirectiveBody; +import freemarker.template.TemplateDirectiveModel; +import freemarker.template.TemplateException; +import freemarker.template.TemplateMethodModel; +import freemarker.template.TemplateModel; +import freemarker.template.TemplateModelException; + +public class HelpDirectiveTest { + + private Template template; + + @Before + public void setUp() { + Configuration config = new Configuration(); + String templateStr = ""; + try { + template = new Template("template", new StringReader(templateStr), config); + } catch (Exception e) { + fail(e.getMessage()); + } + // Turn off log messages to console + Logger.getLogger(BaseDumpDirective.class).setLevel(Level.OFF); + } + + @Test + public void dumpHelplessMethod() { + + String varName = "square"; + Map dataModel = new HashMap(); + + TemplateMethodModel methodModel = new HelplessMethod(); + dataModel.put(varName, methodModel); + + Map expectedDumpValue = new HashMap(); + expectedDumpValue.put(Key.TYPE.toString(), Type.METHOD); + expectedDumpValue.put("help", null); + + Map expectedDump = new HashMap(); + expectedDump.put(varName, expectedDumpValue); + + test(varName, dataModel, expectedDump); + } + + @Test + public void dumpHelpfulMethod() { + + String varName = "square"; + Map dataModel = new HashMap(); + + TemplateMethodModel methodModel = new HelpfulMethod(); + dataModel.put(varName, methodModel); + + Map expectedDumpValue = new HashMap(); + expectedDumpValue.put(Key.TYPE.toString(), Type.METHOD); + expectedDumpValue.put("help", getMethodHelp(varName)); + + Map expectedDump = new HashMap(); + expectedDump.put(varName, expectedDumpValue); + + test(varName, dataModel, expectedDump); + } + + @Test + public void dumpMethodWithBadHelp() { + + String varName = "square"; + Map dataModel = new HashMap(); + + TemplateMethodModel methodModel = new MethodWithBadHelp(); + dataModel.put(varName, methodModel); + + Map expectedDumpValue = new HashMap(); + expectedDumpValue.put(Key.TYPE.toString(), Type.METHOD); + expectedDumpValue.put("help", null); + + Map expectedDump = new HashMap(); + expectedDump.put(varName, expectedDumpValue); + + test(varName, dataModel, expectedDump); + } + + @Test + public void dumpHelplessDirective() { + + String varName = "dump"; + Map dataModel = new HashMap(); + + TemplateDirectiveModel directiveModel = new HelplessDirective(); + dataModel.put(varName, directiveModel); + + Map expectedDumpValue = new HashMap(); + expectedDumpValue.put(Key.TYPE.toString(), Type.DIRECTIVE); + expectedDumpValue.put("help", null); + + Map expectedDump = new HashMap(); + expectedDump.put(varName, expectedDumpValue); + + test(varName, dataModel, expectedDump); + } + + @Test + public void dumpHelpfulDirective() { + + String varName = "dump"; + Map dataModel = new HashMap(); + + TemplateDirectiveModel directiveModel = new HelpfulDirective(); + dataModel.put(varName, directiveModel); + + Map expectedDumpValue = new HashMap(); + expectedDumpValue.put(Key.TYPE.toString(), Type.DIRECTIVE); + expectedDumpValue.put("help", getDirectiveHelp(varName)); + + Map expectedDump = new HashMap(); + expectedDump.put(varName, expectedDumpValue); + + test(varName, dataModel, expectedDump); + } + + @Test + public void dumpDirectiveWithBadHelp() { + + String varName = "dump"; + Map dataModel = new HashMap(); + + TemplateDirectiveModel directiveModel = new DirectiveWithBadHelp(); + dataModel.put(varName, directiveModel); + + Map expectedDumpValue = new HashMap(); + expectedDumpValue.put(Key.TYPE.toString(), Type.DIRECTIVE); + expectedDumpValue.put("help", null); + + Map expectedDump = new HashMap(); + expectedDump.put(varName, expectedDumpValue); + + test(varName, dataModel, expectedDump); + } + + /////////////////////////// Private test classes and helper methods /////////////////////////// + + private class HelplessMethod implements TemplateMethodModel { + + @Override + public Object exec(List arg0) throws TemplateModelException { + return null; + } + } + + private class HelpfulMethod implements TemplateMethodModel { + + @Override + public Object exec(List arg0) throws TemplateModelException { + return null; + } + + public Map help(String name) { + return getMethodHelp(name); + } + } + + private class MethodWithBadHelp implements TemplateMethodModel { + + @Override + public Object exec(List arg0) throws TemplateModelException { + return null; + } + + public Map help() { + return new HashMap(); + } + } + + private class HelplessDirective implements TemplateDirectiveModel { + + @Override + public void execute(Environment arg0, Map arg1, TemplateModel[] arg2, + TemplateDirectiveBody arg3) throws TemplateException, + IOException { + } + } + + private class HelpfulDirective implements TemplateDirectiveModel { + + @Override + public void execute(Environment arg0, Map arg1, TemplateModel[] arg2, + TemplateDirectiveBody arg3) throws TemplateException, + IOException { + } + + public Map help(String name) { + return getDirectiveHelp(name); + } + } + + private class DirectiveWithBadHelp implements TemplateDirectiveModel { + + @Override + public void execute(Environment arg0, Map arg1, TemplateModel[] arg2, + TemplateDirectiveBody arg3) throws TemplateException, + IOException { + } + + public String help(String name) { + return "help"; + } + } + + private Map getDirectiveHelp(String name) { + Map map = new HashMap(); + + map.put("effect", "Dump the contents of a template variable."); + + map.put("comments", "Sequences (lists and arrays) are enclosed in square brackets. Hashes are enclosed in curly braces."); + + Map params = new HashMap(); + params.put("var", "name of variable to dump"); + map.put("params", params); + + List examples = new ArrayList(); + examples.add("<@" + name + " var=\"urls\" />"); + map.put("examples", examples); + + return map; + } + + private Map getMethodHelp(String name) { + Map map = new HashMap(); + + map.put("returns", "The square of the argument"); + + Listparams = new ArrayList(); + params.add("Integer to square"); + map.put("params", params); + + List examples = new ArrayList(); + examples.add(name + "(4)"); + map.put("examples", examples); + + return map; + } + + private Map getDump(String varName, Map dataModel) { + try { + Environment env = template.createProcessingEnvironment(dataModel, new StringWriter()); + return new DumpDirective().getTemplateVariableDump(varName, env); + } catch (Exception e) { + fail(e.getMessage()); + return null; + } + } + + private void test(String varName, Map dataModel, Map expectedDump) { + Map dump = getDump(varName, dataModel); + assertEquals(expectedDump, dump); + } +} diff --git a/webapp/web/templates/freemarker/body/partials/dump/dump-all.ftl b/webapp/web/templates/freemarker/body/partials/dump/dump-all.ftl new file mode 100644 index 000000000..e69de29bb