Fixing problem with FM dump directive. Working on SparqlQueryDataGetter.

This commit is contained in:
briancaruso 2012-02-29 19:51:33 +00:00
parent 558985d542
commit d9669acddb
8 changed files with 159 additions and 80 deletions

View file

@ -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.

View file

@ -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";
}

View file

@ -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" +
"}";

View file

@ -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<String, Object> getTemplateVariableDump(String varName, TemplateModel model)
protected Map<String, Object> getTemplateVariableDump(String varName, TemplateModel valueToDump)
throws TemplateModelException {
Map<String, Object> value = new HashMap<String, Object>();
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<String, Object> dump = new HashMap<String, Object>();
@ -175,57 +176,57 @@ public abstract class BaseDumpDirective implements TemplateDirectiveModel {
return dump;
}
private Map<String, Object> getDump(TemplateModel model) throws TemplateModelException {
private Map<String, Object> getDump(TemplateModel valueToDump) throws TemplateModelException {
Map<String, Object> map = new HashMap<String, Object>();
// 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<String, Object> getSimpleMethodModelDump(Object object, SimpleMethodModel model) throws TemplateModelException {
// Map<String, Object> map = new HashMap<String, Object>();
// Method method = (Method)DeepUnwrap.permissiveUnwrap(model);
// TemplateModel value = model.get(method.getName());
// map.put(Key.VALUE.toString(), getDump(value));
// return map;
// }
}
private Map<String, Object> 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>...</#list>
Map<String, Object> map = new HashMap<String, Object>();
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<String, Object> 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<String, Object> help(String name) {
return new HashMap<String, Object>();
return new HashMap<String, Object>();
}
/**
* Convert a Freemarker TemplateObject to a usable map.
* @throws TemplateModelException
*/
protected Map<? extends String, ? extends Object> toMap( Object hash ) throws TemplateModelException{
Map<String,Object> outMap = new HashMap<String,Object>();
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<String> junkToStrings( TemplateCollectionModel junk ){
List<String> keys = new ArrayList<String>();
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;
}
}