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 e4abc3e59..876f1bb04 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 @@ -443,6 +443,7 @@ public class FreemarkerHttpServlet extends VitroHttpServlet { map.put("url", new edu.cornell.mannlib.vitro.webapp.web.directives.UrlDirective()); map.put("widget", new edu.cornell.mannlib.vitro.webapp.web.directives.WidgetDirective()); + map.putAll( FreemarkerConfiguration.getDirectives() ); // Add these accumulator objects. They will collect tags so the template can write them // at the appropriate location. diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/DataGetterBase.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/DataGetterBase.java index 8c844236f..51d5b9644 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/DataGetterBase.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/DataGetterBase.java @@ -11,6 +11,7 @@ import com.hp.hpl.jena.rdf.model.Model; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; import edu.cornell.mannlib.vitro.webapp.controller.jena.JenaIngestController; +import edu.cornell.mannlib.vitro.webapp.dao.DisplayVocabulary; import edu.cornell.mannlib.vitro.webapp.dao.jena.VitroJenaModelMaker; import edu.cornell.mannlib.vitro.webapp.dao.jena.VitroJenaSDBModelMaker; @@ -26,7 +27,9 @@ public abstract class DataGetterBase implements DataGetter { }else if(REQUEST_DISPLAY_MODEL.equals(modelName)){ return vreq.getDisplayModel(); }else if( REQUEST_JENA_ONT_MODEL.equals(modelName)){ - return vreq.getJenaOntModel(); + return vreq.getJenaOntModel(); + }else if( CONTEXT_DISPLAY_MODEL.equals(modelName)){ + return (Model)context.getAttribute( DisplayVocabulary.DISPLAY_ONT_MODEL); }else if( ! StringUtils.isEmpty( modelName)){ Model model = JenaIngestController.getModel( modelName, vreq, context); if( model == null ) @@ -41,5 +44,6 @@ public abstract class DataGetterBase implements DataGetter { public final static String REQUEST_DISPLAY_MODEL = "vitro:requestDisplayModel"; public final static String REQUEST_JENA_ONT_MODEL = "vitro:requestJenaOntModel"; + public final static String CONTEXT_DISPLAY_MODEL = "vitro:contextDisplayModel"; } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/SparqlQueryDataGetter.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/SparqlQueryDataGetter.java index 4a31d0dd8..8563e97f6 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/SparqlQueryDataGetter.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/utils/dataGetter/SparqlQueryDataGetter.java @@ -83,8 +83,8 @@ public class SparqlQueryDataGetter extends DataGetterBase implements DataGetter{ else this.queryText = value.getLexicalForm(); - //model is OPTIONAL - RDFNode node = soln.getResource("model"); + //model is OPTIONAL + RDFNode node = soln.get("queryModel"); if( node != null && node.isURIResource() ){ this.modelURI = node.asResource().getURI(); }else if( node != null && node.isLiteral() ){ @@ -116,7 +116,7 @@ public class SparqlQueryDataGetter extends DataGetterBase implements DataGetter{ return Collections.emptyMap(); } - //this may throw an error + //this may throw a SPARQL syntax error Query query = QueryFactory.create( this.queryText ); //build query bindings @@ -206,14 +206,14 @@ public class SparqlQueryDataGetter extends DataGetterBase implements DataGetter{ public static final String defaultVarNameForResults = "results"; /** - * Query to get the definition of the SparqlDataGetter for a given data getter URI. + * Query to get the definition of the SparqlDataGetter for a given URI. */ private static final String dataGetterQuery = "PREFIX display: <" + DisplayVocabulary.DISPLAY_NS +"> \n" + - "SELECT ?query ?saveToVar ?model WHERE { \n" + - " ?dataGetterUri "+queryPropertyURI+" ?query . \n" + - " OPTIONAL{ ?dataGetterUri "+saveToVarPropertyURI+" ?saveToVar } \n " + - " OPTIONAL{ ?dataGetterUri "+queryModelPropertyURI+" ?model } \n" + + "SELECT ?query ?saveToVar ?queryModel WHERE { \n" + + " ?dataGetterURI "+queryPropertyURI+" ?query . \n" + + " OPTIONAL{ ?dataGetterURI "+saveToVarPropertyURI+" ?saveToVar } \n " + + " OPTIONAL{ ?dataGetterURI "+queryModelPropertyURI+" ?queryModel } \n" + "}"; diff --git a/webapp/src/freemarker/ext/dump/BaseDumpDirective.java b/webapp/src/freemarker/ext/dump/BaseDumpDirective.java index 9749a5ade..a2ff4b473 100644 --- a/webapp/src/freemarker/ext/dump/BaseDumpDirective.java +++ b/webapp/src/freemarker/ext/dump/BaseDumpDirective.java @@ -25,11 +25,12 @@ import freemarker.core.Environment; import freemarker.ext.beans.BeanModel; import freemarker.ext.beans.BeansWrapper; import freemarker.ext.beans.CollectionModel; -import freemarker.ext.beans.MapModel; import freemarker.ext.beans.SimpleMethodModel; import freemarker.ext.beans.StringModel; import freemarker.ext.beans.WrapperExtractor; +import freemarker.template.Configuration; import freemarker.template.ObjectWrapper; +import freemarker.template.SimpleScalar; import freemarker.template.Template; import freemarker.template.TemplateBooleanModel; import freemarker.template.TemplateCollectionModel; @@ -146,28 +147,28 @@ public abstract class BaseDumpDirective implements TemplateDirectiveModel { } TemplateHashModel dataModel = env.getDataModel(); - TemplateModel model = dataModel.get(varName); - return getTemplateVariableDump(varName, model); + TemplateModel valueToDump = dataModel.get(varName); + return getTemplateVariableDump(varName, valueToDump); } - protected Map getTemplateVariableDump(String varName, TemplateModel model) + protected Map getTemplateVariableDump(String varName, TemplateModel valueToDump) throws TemplateModelException { Map value = new HashMap(); - if (model == null) { + if (valueToDump == null) { value.put(Key.VALUE.toString(), Value.UNDEFINED.toString()); // TemplateMethodModel and TemplateDirectiveModel objects can only be // included in the data model at the top level. - } else if (model instanceof TemplateMethodModel) { - value.putAll( getTemplateModelDump( ( TemplateMethodModel)model, varName ) ); + } else if (valueToDump instanceof TemplateMethodModel) { + value.putAll( getTemplateModelDump( ( TemplateMethodModel)valueToDump, varName ) ); - } else if (model instanceof TemplateDirectiveModel) { - value.putAll( getTemplateModelDump( ( TemplateDirectiveModel)model, varName ) ); + } else if (valueToDump instanceof TemplateDirectiveModel) { + value.putAll( getTemplateModelDump( ( TemplateDirectiveModel)valueToDump, varName ) ); } else { - value.putAll(getDump(model)); + value.putAll(getDump(valueToDump)); } Map dump = new HashMap(); @@ -175,57 +176,57 @@ public abstract class BaseDumpDirective implements TemplateDirectiveModel { return dump; } - private Map getDump(TemplateModel model) throws TemplateModelException { + private Map getDump(TemplateModel valueToDump) throws TemplateModelException { Map map = new HashMap(); // Don't return null if model == null. We still want to send the map to the template. - if (model != null) { + if (valueToDump != null) { - if ( model instanceof TemplateSequenceModel ) { - if (model instanceof CollectionModel && ! ((CollectionModel)model).getSupportsIndexedAccess()) { - map.putAll( getTemplateModelDump( (TemplateCollectionModel)model ) ); + if ( valueToDump instanceof TemplateSequenceModel ) { + if (valueToDump instanceof CollectionModel && ! ((CollectionModel)valueToDump).getSupportsIndexedAccess()) { + map.putAll( getTemplateModelDump( (TemplateCollectionModel)valueToDump ) ); } else { - map.putAll( getTemplateModelDump( (TemplateSequenceModel)model ) ); + map.putAll( getTemplateModelDump( (TemplateSequenceModel)valueToDump ) ); } - } else if ( model instanceof TemplateNumberModel ) { - map.putAll( getTemplateModelDump( (TemplateNumberModel)model ) ); + } else if ( valueToDump instanceof TemplateNumberModel ) { + map.putAll( getTemplateModelDump( (TemplateNumberModel)valueToDump ) ); - } else if ( model instanceof TemplateBooleanModel ) { - map.putAll( getTemplateModelDump( (TemplateBooleanModel)model ) ); + } else if ( valueToDump instanceof TemplateBooleanModel ) { + map.putAll( getTemplateModelDump( (TemplateBooleanModel)valueToDump ) ); - } else if ( model instanceof TemplateDateModel ) { - map.putAll( getTemplateModelDump( (TemplateDateModel)model ) ); + } else if ( valueToDump instanceof TemplateDateModel ) { + map.putAll( getTemplateModelDump( (TemplateDateModel)valueToDump ) ); - } else if ( model instanceof TemplateCollectionModel ) { - map.putAll( getTemplateModelDump( (TemplateCollectionModel)model ) ); + } else if ( valueToDump instanceof TemplateCollectionModel ) { + map.putAll( getTemplateModelDump( (TemplateCollectionModel)valueToDump ) ); - } else if ( model instanceof StringModel ) { + } else if ( valueToDump instanceof StringModel ) { // A StringModel can wrap either a String or a plain Java object. // Unwrap it to figure out what to do. - Object unwrappedModel = DeepUnwrap.permissiveUnwrap(model); + Object unwrappedModel = DeepUnwrap.permissiveUnwrap(valueToDump); if (unwrappedModel instanceof String) { - map.putAll( getTemplateModelDump( (TemplateScalarModel)model ) ); + map.putAll( getTemplateModelDump( (TemplateScalarModel)valueToDump ) ); } else { - map.putAll( getTemplateModelDump( (TemplateHashModelEx)model ) ); + map.putAll( getTemplateModelDump( (TemplateHashModelEx)valueToDump ) ); } - } else if ( model instanceof TemplateScalarModel ) { - map.putAll( getTemplateModelDump( (TemplateScalarModel)model ) ); + } else if ( valueToDump instanceof TemplateScalarModel ) { + map.putAll( getTemplateModelDump( (TemplateScalarModel)valueToDump ) ); - } else if ( model instanceof TemplateHashModelEx ) { - map.putAll( getTemplateModelDump( (TemplateHashModelEx)model ) ); + } else if ( valueToDump instanceof TemplateHashModelEx ) { + map.putAll( getTemplateModelDump( (TemplateHashModelEx)valueToDump ) ); - } else if (model instanceof TemplateHashModel ) { - map.putAll( getTemplateModelDump( (TemplateHashModel)model ) ); + } else if (valueToDump instanceof TemplateHashModel ) { + map.putAll( getTemplateModelDump( (TemplateHashModel)valueToDump ) ); // Nodes and transforms not included here } else { // We shouldn't get here; provide as a safety net. - map.putAll( getTemplateModelDump( (TemplateModel)model ) ); + map.putAll( getTemplateModelDump( (TemplateModel)valueToDump ) ); } } else { map.put(Key.VALUE.toString(), Value.NULL.toString()); @@ -562,15 +563,7 @@ public abstract class BaseDumpDirective implements TemplateDirectiveModel { } } return null; - } - -// private Map getSimpleMethodModelDump(Object object, SimpleMethodModel model) throws TemplateModelException { -// Map map = new HashMap(); -// Method method = (Method)DeepUnwrap.permissiveUnwrap(model); -// TemplateModel value = model.get(method.getName()); -// map.put(Key.VALUE.toString(), getDump(value)); -// return map; -// } + } private Map getTemplateModelDump(TemplateModel model) throws TemplateModelException { // One of the more specific cases should have applied. Track whether this actually occurs. @@ -593,24 +586,68 @@ public abstract class BaseDumpDirective implements TemplateDirectiveModel { // Wrap the dump in another map so the template has a handle to iterate through // the values: <#list dump?keys as key>... Map map = new HashMap(); - map.put("dump", dump); + + //put the TemplateModel to be dumped at 'dumpValue' + map.put("dumpValue", dump); map.put("title", title); writeDump(map, env, templateName); } protected void writeDump(Map map, Environment env, String templateName) - throws TemplateException, IOException { - // Make the stylesheets list visible to dump.ftl - map.put("stylesheets", env.getVariable("stylesheets")); - + throws TemplateException, IOException { + + //bdc34: not sure what to do there to + //get the scope from the env to this dump template, trying an ugly copy + map.putAll( toMap( env.getDataModel() )); + Template template = env.getConfiguration().getTemplate(templateName); StringWriter sw = new StringWriter(); - template.process(map, sw); + template.process(map, sw); Writer out = env.getOut(); - out.write(sw.toString()); + out.write(sw.toString()); + } public Map help(String name) { - return new HashMap(); + return new HashMap(); + } + + /** + * Convert a Freemarker TemplateObject to a usable map. + * @throws TemplateModelException + */ + protected Map toMap( Object hash ) throws TemplateModelException{ + Map outMap = new HashMap(); + + if( hash instanceof TemplateHashModelEx ){ + TemplateHashModelEx thme = (TemplateHashModelEx) hash; + for( String key : junkToStrings( thme.keys() )){ + outMap.put(key, thme.get(key)); + } + }else{ + log.error("Freemarker is passing odd objects to method toMap(): " + hash.getClass().getName()); + } + + return outMap; + } + + protected List junkToStrings( TemplateCollectionModel junk ){ + List keys = new ArrayList(); + try{ + TemplateModelIterator it = junk.iterator(); + while( it.hasNext() ){ + Object obj = it.next(); + if( obj instanceof StringModel){ + keys.add( ((StringModel)obj).getAsString() ); + }else if( obj instanceof SimpleScalar ){ + keys.add( ((SimpleScalar)obj).getAsString()); + }else{ + log.error("Freemarker is setting keys to hashes as non-strings: " + obj.getClass().getName()); + } + } + }catch(Exception ex){ + log.error("Freemarker is messing with us",ex); + } + return keys; } } diff --git a/webapp/web/WEB-INF/ontologies/app/menuload/displayTBOX.n3 b/webapp/web/WEB-INF/ontologies/app/menuload/displayTBOX.n3 index 3edde1625..56ace73db 100644 --- a/webapp/web/WEB-INF/ontologies/app/menuload/displayTBOX.n3 +++ b/webapp/web/WEB-INF/ontologies/app/menuload/displayTBOX.n3 @@ -49,7 +49,9 @@ owl:ObjectProperty a owl:Class . - + + + a owl:Class . ########Data Properties######### @@ -101,14 +103,16 @@ owl:versionInfo a owl:DatatypeProperty . - -###Custom data getters that may or may not be associated with a page use the following relationships -###E.g. sparql data getters can specify the query to be used as well as what variable in the template -###should store the results - - a owl:DatatypeProperty . + - a owl:DatatypeProperty . + a owl:DatatypeProperty . + + + a owl:DatatypeProperty. + + + a owl:DatatypeProperty. + ######### Object Properties######### ###Basic rdfs:range @@ -179,7 +183,4 @@ owl:topObjectProperty a owl:ObjectProperty . -###Custom data getters that may or may not be associated with a page use the following relationships -###E.g. sparql data getters can specify what model to use for querying - - a owl:ObjectProperty . + diff --git a/webapp/web/templates/freemarker/body/menupage/emptyPage.ftl b/webapp/web/templates/freemarker/body/menupage/emptyPage.ftl index 6720fe6d3..7c1940558 100644 --- a/webapp/web/templates/freemarker/body/menupage/emptyPage.ftl +++ b/webapp/web/templates/freemarker/body/menupage/emptyPage.ftl @@ -5,4 +5,6 @@

Implement a link to configure this page if the user has permission.

+ + \ No newline at end of file diff --git a/webapp/web/templates/freemarker/body/menupage/page-pageList.ftl b/webapp/web/templates/freemarker/body/menupage/page-pageList.ftl new file mode 100644 index 000000000..8553f4816 --- /dev/null +++ b/webapp/web/templates/freemarker/body/menupage/page-pageList.ftl @@ -0,0 +1,32 @@ +<#-- $This file is distributed under the terms of the license in /doc/license.txt$ --> + +
+ +<#if pages?has_content > + + + + <#list pages as pagex> + + + <#if pagex.pageUri??> + + <#else> + + + + +
TitleURI
${(pagex.title)!'-untitled-'}${pagex.pageUri}URI for page not defined
+ +<#else> +

There are no pages defined yet.

+ + +
+ + + + +
+ +
\ No newline at end of file diff --git a/webapp/web/templates/freemarker/body/partials/dump/dump.ftl b/webapp/web/templates/freemarker/body/partials/dump/dump.ftl index 9276b43ba..0024ec507 100644 --- a/webapp/web/templates/freemarker/body/partials/dump/dump.ftl +++ b/webapp/web/templates/freemarker/body/partials/dump/dump.ftl @@ -7,21 +7,23 @@

${title}

- <@doDump dump /> + <#-- dump has been changed to dumpValue to avoid confusion + with the dump directive which is stored in the DataModel as 'dump' --> + <@doDump dumpValue />
-<#macro doDump dump> - <#if dump?keys?has_content> +<#macro doDump dumpValue> + <#if dumpValue?keys?has_content>
    - <#list dump?keys as key> + <#list dumpValue?keys as key>
  • Variable name: ${key}

    - <#local type = dump[key].type!> + <#local type = dumpValue[key].type!> <#if type == "Directive" || type == "Method"> - <@doMethod dump[key] /> + <@doMethod dumpValue[key] /> <#else> - <@doTypeAndValue dump[key] /> + <@doTypeAndValue dumpValue[key] />