VIVO-84 Use language filtering on the display model
This doesn't answer the questions: 1) How do we edit new pages or existing pages? 2) What is the generalized procedure for adding another language?
This commit is contained in:
parent
1b890a3767
commit
6d7f8e05c8
5 changed files with 127 additions and 45 deletions
|
@ -214,32 +214,14 @@ public class VitroRequest extends HttpServletRequestWrapper {
|
||||||
}
|
}
|
||||||
|
|
||||||
//Get the display and editing configuration model
|
//Get the display and editing configuration model
|
||||||
public OntModel getDisplayModel(){
|
public OntModel getDisplayModel(){
|
||||||
//bdc34: I have no idea what the correct way to get this model is
|
Object value = _req.getAttribute(DISPLAY_ONT_MODEL);
|
||||||
|
if (value instanceof OntModel) {
|
||||||
//try from the request
|
return (OntModel) value;
|
||||||
if( _req.getAttribute("displayOntModel") != null ){
|
} else {
|
||||||
return (OntModel) _req.getAttribute(DISPLAY_ONT_MODEL);
|
log.error("No display model on the VitroRequest. Expecting an OntModel but found " + value);
|
||||||
|
return null;
|
||||||
//try from the session
|
}
|
||||||
} else {
|
|
||||||
HttpSession session = _req.getSession(false);
|
|
||||||
if( session != null ){
|
|
||||||
if( session.getAttribute(DISPLAY_ONT_MODEL) != null ){
|
|
||||||
return (OntModel) session.getAttribute(DISPLAY_ONT_MODEL);
|
|
||||||
|
|
||||||
//try from the context
|
|
||||||
}else{
|
|
||||||
if( session.getServletContext().getAttribute(DISPLAY_ONT_MODEL) != null){
|
|
||||||
return (OntModel)session.getServletContext().getAttribute(DISPLAY_ONT_MODEL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//nothing worked, could not find display model
|
|
||||||
log.error("No display model could be found.");
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -11,6 +11,7 @@ import static edu.cornell.mannlib.vitro.webapp.dao.DisplayVocabulary.USE_MODEL_P
|
||||||
import static edu.cornell.mannlib.vitro.webapp.dao.DisplayVocabulary.USE_TBOX_MODEL_PARAM;
|
import static edu.cornell.mannlib.vitro.webapp.dao.DisplayVocabulary.USE_TBOX_MODEL_PARAM;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
@ -47,10 +48,14 @@ import edu.cornell.mannlib.vitro.webapp.dao.filtering.filters.FilterFactory;
|
||||||
import edu.cornell.mannlib.vitro.webapp.dao.filtering.filters.HideFromDisplayByPolicyFilter;
|
import edu.cornell.mannlib.vitro.webapp.dao.filtering.filters.HideFromDisplayByPolicyFilter;
|
||||||
import edu.cornell.mannlib.vitro.webapp.dao.filtering.filters.VitroFilters;
|
import edu.cornell.mannlib.vitro.webapp.dao.filtering.filters.VitroFilters;
|
||||||
import edu.cornell.mannlib.vitro.webapp.dao.jena.ModelContext;
|
import edu.cornell.mannlib.vitro.webapp.dao.jena.ModelContext;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceGraph;
|
||||||
import edu.cornell.mannlib.vitro.webapp.dao.jena.VitroModelSource;
|
import edu.cornell.mannlib.vitro.webapp.dao.jena.VitroModelSource;
|
||||||
import edu.cornell.mannlib.vitro.webapp.dao.jena.WebappDaoFactoryJena;
|
import edu.cornell.mannlib.vitro.webapp.dao.jena.WebappDaoFactoryJena;
|
||||||
import edu.cornell.mannlib.vitro.webapp.dao.jena.WebappDaoFactorySDB;
|
import edu.cornell.mannlib.vitro.webapp.dao.jena.WebappDaoFactorySDB;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.rdfservice.filter.LanguageFilteringRDFService;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.rdfservice.filter.LanguageFilteringUtils;
|
||||||
import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceUtils;
|
import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceUtils;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.jena.model.RDFServiceModel;
|
||||||
import edu.cornell.mannlib.vitro.webapp.servlet.setup.JenaDataSourceSetupBase;
|
import edu.cornell.mannlib.vitro.webapp.servlet.setup.JenaDataSourceSetupBase;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -133,6 +138,22 @@ public class VitroRequestPrep implements Filter {
|
||||||
log.debug("Found a WebappDaoFactory in the session and using it for this request");
|
log.debug("Found a WebappDaoFactory in the session and using it for this request");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set up the DisplayModel, with language filtering if appropriate.
|
||||||
|
OntModel displayModel;
|
||||||
|
Object displayModelObject = req.getSession().getAttribute(DISPLAY_ONT_MODEL);
|
||||||
|
if (displayModelObject instanceof OntModel) {
|
||||||
|
displayModel = (OntModel) displayModelObject;
|
||||||
|
} else {
|
||||||
|
displayModel = (OntModel) _context.getAttribute(DISPLAY_ONT_MODEL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Boolean.valueOf(ConfigurationProperties.getBean(vreq).getProperty(
|
||||||
|
"RDFService.languageFilter", "true"))) {
|
||||||
|
displayModel = LanguageFilteringUtils.wrapOntModelInALanguageFilter(displayModel, req);
|
||||||
|
}
|
||||||
|
vreq.setAttribute(DISPLAY_ONT_MODEL, displayModel);
|
||||||
|
|
||||||
|
|
||||||
//Do model switching and replace the WebappDaoFactory with
|
//Do model switching and replace the WebappDaoFactory with
|
||||||
//a different version if requested by parameters
|
//a different version if requested by parameters
|
||||||
wdf = checkForModelSwitching(vreq, wdf);
|
wdf = checkForModelSwitching(vreq, wdf);
|
||||||
|
|
|
@ -3,10 +3,7 @@
|
||||||
package edu.cornell.mannlib.vitro.webapp.filters;
|
package edu.cornell.mannlib.vitro.webapp.filters;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Enumeration;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
@ -22,6 +19,7 @@ import javax.servlet.http.HttpServletRequest;
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
|
||||||
|
import com.hp.hpl.jena.ontology.OntModel;
|
||||||
import com.hp.hpl.jena.ontology.OntModelSpec;
|
import com.hp.hpl.jena.ontology.OntModelSpec;
|
||||||
import com.hp.hpl.jena.query.Dataset;
|
import com.hp.hpl.jena.query.Dataset;
|
||||||
import com.hp.hpl.jena.rdf.model.ModelFactory;
|
import com.hp.hpl.jena.rdf.model.ModelFactory;
|
||||||
|
@ -38,6 +36,7 @@ import edu.cornell.mannlib.vitro.webapp.dao.jena.WebappDaoFactorySDB.SDBDatasetM
|
||||||
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
|
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService;
|
||||||
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFServiceFactory;
|
import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFServiceFactory;
|
||||||
import edu.cornell.mannlib.vitro.webapp.rdfservice.filter.LanguageFilteringRDFService;
|
import edu.cornell.mannlib.vitro.webapp.rdfservice.filter.LanguageFilteringRDFService;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.rdfservice.filter.LanguageFilteringUtils;
|
||||||
import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceUtils;
|
import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.RDFServiceUtils;
|
||||||
|
|
||||||
public class WebappDaoFactorySDBPrep implements Filter {
|
public class WebappDaoFactorySDBPrep implements Filter {
|
||||||
|
@ -88,18 +87,10 @@ public class WebappDaoFactorySDBPrep implements Filter {
|
||||||
String defaultNamespace = (String) _ctx.getAttribute("defaultNamespace");
|
String defaultNamespace = (String) _ctx.getAttribute("defaultNamespace");
|
||||||
WebappDaoFactory wadf = null;
|
WebappDaoFactory wadf = null;
|
||||||
VitroRequest vreq = new VitroRequest((HttpServletRequest) request);
|
VitroRequest vreq = new VitroRequest((HttpServletRequest) request);
|
||||||
|
|
||||||
List<String> langs = new ArrayList<String>();
|
log.debug("Accept-Language: " + vreq.getHeader("Accept-Language"));
|
||||||
|
List<String> langs = LanguageFilteringUtils.localesToLanguages(vreq.getLocales());
|
||||||
|
|
||||||
log.debug("Accept-Language: " + vreq.getHeader("Accept-Language"));
|
|
||||||
Enumeration<Locale> locs = vreq.getLocales();
|
|
||||||
while (locs.hasMoreElements()) {
|
|
||||||
Locale locale = locs.nextElement();
|
|
||||||
langs.add(locale.toString().replace("_", "-"));
|
|
||||||
}
|
|
||||||
if (langs.isEmpty()) {
|
|
||||||
langs.add("en");
|
|
||||||
}
|
|
||||||
WebappDaoFactoryConfig config = new WebappDaoFactoryConfig();
|
WebappDaoFactoryConfig config = new WebappDaoFactoryConfig();
|
||||||
config.setDefaultNamespace(defaultNamespace);
|
config.setDefaultNamespace(defaultNamespace);
|
||||||
config.setPreferredLanguages(langs);
|
config.setPreferredLanguages(langs);
|
||||||
|
@ -110,12 +101,14 @@ public class WebappDaoFactorySDBPrep implements Filter {
|
||||||
RDFService unfilteredRDFService = factory.getShortTermRDFService();
|
RDFService unfilteredRDFService = factory.getShortTermRDFService();
|
||||||
RDFService rdfService = null;
|
RDFService rdfService = null;
|
||||||
|
|
||||||
if (!"false".equals(
|
if (Boolean.valueOf(ConfigurationProperties.getBean(vreq).getProperty(
|
||||||
ConfigurationProperties.getBean(vreq).getProperty(
|
"RDFService.languageFilter", "true"))) {
|
||||||
"RDFService.languageFilter", "true"))) {
|
rdfService = new LanguageFilteringRDFService(unfilteredRDFService, langs);
|
||||||
rdfService = new LanguageFilteringRDFService(unfilteredRDFService, langs);
|
oms = LanguageFilteringUtils.replaceDisplayModelInSelector(oms,
|
||||||
|
LanguageFilteringUtils.wrapOntModelInALanguageFilter(oms.getDisplayModel(), request));
|
||||||
|
baseOms = LanguageFilteringUtils.replaceDisplayModelInSelector(baseOms, oms.getDisplayModel());
|
||||||
} else {
|
} else {
|
||||||
rdfService = unfilteredRDFService;
|
rdfService = unfilteredRDFService;
|
||||||
}
|
}
|
||||||
|
|
||||||
Dataset dataset = new RDFServiceDataset(rdfService);
|
Dataset dataset = new RDFServiceDataset(rdfService);
|
||||||
|
|
|
@ -8,8 +8,10 @@ import java.io.InputStream;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
|
import java.util.Enumeration;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
@ -368,17 +370,20 @@ public class LanguageFilteringRDFService implements RDFService {
|
||||||
|
|
||||||
int index = langs.indexOf(lang);
|
int index = langs.indexOf(lang);
|
||||||
if (index >= 0) {
|
if (index >= 0) {
|
||||||
|
log.debug("languageIndex for '" + lang + "' is " + index);
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lang.length() > 2) {
|
if (lang.length() > 2) {
|
||||||
index = langs.indexOf(lang.substring(0, 2));
|
index = langs.indexOf(lang.substring(0, 2));
|
||||||
if (index >= 0) {
|
if (index >= 0) {
|
||||||
|
log.debug("languageIndex for '" + lang + "' is " + index + inexactMatchPenalty);
|
||||||
return index + inexactMatchPenalty;
|
return index + inexactMatchPenalty;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lang.isEmpty()) {
|
if (lang.isEmpty()) {
|
||||||
|
log.debug("languageIndex for '" + lang + "' is " + noLanguage);
|
||||||
return noLanguage;
|
return noLanguage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,81 @@
|
||||||
|
/* $This file is distributed under the terms of the license in /doc/license.txt$ */
|
||||||
|
|
||||||
|
package edu.cornell.mannlib.vitro.webapp.rdfservice.filter;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Enumeration;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
|
import javax.servlet.ServletRequest;
|
||||||
|
|
||||||
|
import com.hp.hpl.jena.ontology.OntModel;
|
||||||
|
import com.hp.hpl.jena.ontology.OntModelSpec;
|
||||||
|
import com.hp.hpl.jena.rdf.model.ModelFactory;
|
||||||
|
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.dao.jena.OntModelSelector;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.dao.jena.OntModelSelectorImpl;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.dao.jena.RDFServiceGraph;
|
||||||
|
import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.jena.model.RDFServiceModel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Some methods that will come in handy when dealing with Language Filtering
|
||||||
|
*/
|
||||||
|
public class LanguageFilteringUtils {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Take an Enumeration of Locale objects, such as we might get from a
|
||||||
|
* request, and convert to a List of langauage strings, such as are needed
|
||||||
|
* by the LanguageFilteringRDFService.
|
||||||
|
*
|
||||||
|
* While converting, change all underscores (as in Locale names) to hyphens
|
||||||
|
* (as in RDF language specifiers).
|
||||||
|
*/
|
||||||
|
public static List<String> localesToLanguages(Enumeration<?> locales) {
|
||||||
|
List<String> langs = new ArrayList<>();
|
||||||
|
while (locales.hasMoreElements()) {
|
||||||
|
Locale locale = (Locale) locales.nextElement();
|
||||||
|
langs.add(locale.toString().replace("_", "-"));
|
||||||
|
}
|
||||||
|
if (langs.isEmpty()) {
|
||||||
|
langs.add("en");
|
||||||
|
}
|
||||||
|
return langs;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Make a new OntModelSelector that containing a new display model and all
|
||||||
|
* of the other models in the original OntModelSelector.
|
||||||
|
*/
|
||||||
|
public static OntModelSelector replaceDisplayModelInSelector(
|
||||||
|
OntModelSelector oldOms, OntModel newDisplayModel) {
|
||||||
|
OntModelSelectorImpl newOms = new OntModelSelectorImpl();
|
||||||
|
newOms.setABoxModel(oldOms.getABoxModel());
|
||||||
|
newOms.setApplicationMetadataModel(oldOms.getApplicationMetadataModel());
|
||||||
|
newOms.setDisplayModel(newDisplayModel);
|
||||||
|
newOms.setFullModel(oldOms.getFullModel());
|
||||||
|
newOms.setTBoxModel(oldOms.getTBoxModel());
|
||||||
|
newOms.setUserAccountsModel(oldOms.getUserAccountsModel());
|
||||||
|
return newOms;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a Language Filtering layer to an OntModel by treating it as an RDFService.
|
||||||
|
*/
|
||||||
|
public static OntModel wrapOntModelInALanguageFilter(OntModel rawModel,
|
||||||
|
ServletRequest req) {
|
||||||
|
/** This is some nasty layering. Could we do this more easily? */
|
||||||
|
List<String> languages = localesToLanguages(req.getLocales());
|
||||||
|
return ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM,
|
||||||
|
RDFServiceGraph.createRDFServiceModel(
|
||||||
|
new RDFServiceGraph(
|
||||||
|
new LanguageFilteringRDFService(
|
||||||
|
new RDFServiceModel(rawModel), languages))));
|
||||||
|
}
|
||||||
|
|
||||||
|
private LanguageFilteringUtils() {
|
||||||
|
// Nothing to instantiate
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue