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 8c61fdd5e..f24c52abf 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 @@ -282,6 +282,7 @@ public class FreemarkerHttpServlet extends VitroHttpServlet { // Add any Java directives the templates should have access to private void addDirectives(Map map) { + 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/BaseTemplateDirectiveModel.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/BaseTemplateDirectiveModel.java index 31eae996a..8bb8bc46b 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/BaseTemplateDirectiveModel.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/BaseTemplateDirectiveModel.java @@ -2,16 +2,13 @@ package edu.cornell.mannlib.vitro.webapp.web.directives; -import java.util.ArrayList; 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.controller.freemarker.FreemarkerHelper; -import edu.cornell.mannlib.vitro.webapp.web.directives.dump.DumpDirective; import freemarker.template.Configuration; import freemarker.template.TemplateDirectiveModel; 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 new file mode 100644 index 000000000..dbc2c9544 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/dump/DescribeDirective.java @@ -0,0 +1,147 @@ +/* $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.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.Arrays; +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.Configuration; +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); + + @SuppressWarnings("unchecked") + @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 tm = null; + try { + tm = 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(tm); + } catch (TemplateModelException e) { + log.error("Cannot unwrap template model " + varName + "."); + } + + if (! (unwrappedModel instanceof BaseTemplateModel) ) { + throw new TemplateModelException( + varName + " is not a template model."); + } + + List methods = getPublicMethods(unwrappedModel.getClass()); + List methodDescriptions = new ArrayList(methods.size()); + for (Method m : methods) { + methodDescriptions.add(getMethodDescription(m)); + } + + Map map = new HashMap(); + map.put("var", varName); + map.put("methods", methodDescriptions); + + try { + map.put("stylesheets", dataModel.get("stylesheets")); + } catch (TemplateModelException e) { + log.error("Error getting value of stylesheets variable from data model."); + } + + DumpHelper helper = new DumpHelper(env); + helper.writeDump("describe.ftl", map, varName); + } + + + public String help(Configuration config) { + Map map = new HashMap(); + + String name = getDirectiveName(); + 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 mergeToTemplate(map, config); + } + + private List getPublicMethods(Class cls) { + + List methods = getDeclaredPublicMethods(cls); + // Don't get methods for classes higher in the class hierarchy than BaseTemplateModel. + if (! cls.getName().equals("edu.cornell.mannlib.vitro.webapp.web.templatemodels.BaseTemplateModel")) { + methods.addAll(getPublicMethods(cls.getSuperclass())); + } + + return methods; + } + + private List getDeclaredPublicMethods(Class cls) { + + List methods = new ArrayList(); + Method[] declaredMethods = cls.getDeclaredMethods(); + for (Method m : declaredMethods) { + int mod = m.getModifiers(); + if (Modifier.isPublic(mod) && !Modifier.isStatic(mod)) { + methods.add(m); + } + } + return methods; + } + + + private String getMethodDescription(Method method) { + return method.toString(); + } + +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/dump/DumpAllDirective.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/dump/DumpAllDirective.java index a6e60adab..f11bc1e49 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/dump/DumpAllDirective.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/dump/DumpAllDirective.java @@ -3,7 +3,6 @@ package edu.cornell.mannlib.vitro.webapp.web.directives.dump; import java.io.IOException; -import java.io.Writer; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -13,13 +12,10 @@ import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHelper; import edu.cornell.mannlib.vitro.webapp.web.directives.BaseTemplateDirectiveModel; - import freemarker.core.Environment; import freemarker.template.Configuration; import freemarker.template.TemplateDirectiveBody; -import freemarker.template.TemplateDirectiveModel; import freemarker.template.TemplateException; import freemarker.template.TemplateHashModel; import freemarker.template.TemplateModel; diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/dump/DumpDirective.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/dump/DumpDirective.java index e8da4ccaf..199175788 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/dump/DumpDirective.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/dump/DumpDirective.java @@ -3,7 +3,6 @@ package edu.cornell.mannlib.vitro.webapp.web.directives.dump; import java.io.IOException; -import java.io.Writer; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -12,23 +11,15 @@ import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHelper; 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.Configuration; import freemarker.template.SimpleScalar; -import freemarker.template.TemplateBooleanModel; -import freemarker.template.TemplateDateModel; import freemarker.template.TemplateDirectiveBody; import freemarker.template.TemplateException; import freemarker.template.TemplateHashModel; import freemarker.template.TemplateModel; import freemarker.template.TemplateModelException; -import freemarker.template.TemplateNumberModel; -import freemarker.template.TemplateScalarModel; -import freemarker.template.TemplateSequenceModel; -import freemarker.template.utility.DeepUnwrap; public class DumpDirective extends BaseTemplateDirectiveModel { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/dump/DumpHelper.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/dump/DumpHelper.java index d4e48020b..86de3d4fd 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/dump/DumpHelper.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/dump/DumpHelper.java @@ -59,7 +59,7 @@ public class DumpHelper { } // This case must precede the TemplateScalarModel case, because - // tm is an instance of StringModel. + // tm is an instance of StringModel and thus a TemplateScalarModel. if (unwrappedModel instanceof BaseTemplateModel) { type = unwrappedModel.getClass().getName(); value = ((BaseTemplateModel)unwrappedModel).dump(); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/dump/HelpDirective.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/dump/HelpDirective.java index 4055295b8..010e16c48 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/dump/HelpDirective.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/directives/dump/HelpDirective.java @@ -3,7 +3,6 @@ package edu.cornell.mannlib.vitro.webapp.web.directives.dump; import java.io.IOException; -import java.io.Writer; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -12,22 +11,15 @@ import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import edu.cornell.mannlib.vitro.webapp.controller.freemarker.FreemarkerHelper; 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.Configuration; import freemarker.template.SimpleScalar; -import freemarker.template.TemplateBooleanModel; -import freemarker.template.TemplateDateModel; import freemarker.template.TemplateDirectiveBody; import freemarker.template.TemplateException; import freemarker.template.TemplateHashModel; import freemarker.template.TemplateModel; import freemarker.template.TemplateModelException; -import freemarker.template.TemplateNumberModel; -import freemarker.template.TemplateScalarModel; -import freemarker.template.TemplateSequenceModel; import freemarker.template.utility.DeepUnwrap; public class HelpDirective extends BaseTemplateDirectiveModel { diff --git a/webapp/web/templates/freemarker/body/partials/dump/describe.ftl b/webapp/web/templates/freemarker/body/partials/dump/describe.ftl new file mode 100644 index 000000000..a40dabe4f --- /dev/null +++ b/webapp/web/templates/freemarker/body/partials/dump/describe.ftl @@ -0,0 +1,13 @@ +<#-- $This file is distributed under the terms of the license in /doc/license.txt$ --> + +<#-- Template for displaying directive describe --> + +

Methods available to variable ${var}

+ +
+ <#list methods as method> + ${method}
+ +
+ +${stylesheets.add("/css/dump.css")} \ No newline at end of file diff --git a/webapp/web/templates/freemarker/body/test.ftl b/webapp/web/templates/freemarker/body/test.ftl index 970fac65f..a5387e236 100644 --- a/webapp/web/templates/freemarker/body/test.ftl +++ b/webapp/web/templates/freemarker/body/test.ftl @@ -63,3 +63,5 @@ ${scripts.add("/js/script1.js", "/js/script2.js", "/js/script3.js")} <@dumpAll /> <@help directive="dump" /> + +<@describe var="stylesheets" />