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
|
@ -215,31 +215,13 @@ public class VitroRequest extends HttpServletRequestWrapper {
|
|||
|
||||
//Get the display and editing configuration model
|
||||
public OntModel getDisplayModel(){
|
||||
//bdc34: I have no idea what the correct way to get this model is
|
||||
|
||||
//try from the request
|
||||
if( _req.getAttribute("displayOntModel") != null ){
|
||||
return (OntModel) _req.getAttribute(DISPLAY_ONT_MODEL);
|
||||
|
||||
//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;
|
||||
Object value = _req.getAttribute(DISPLAY_ONT_MODEL);
|
||||
if (value instanceof OntModel) {
|
||||
return (OntModel) value;
|
||||
} else {
|
||||
log.error("No display model on the VitroRequest. Expecting an OntModel but found " + value);
|
||||
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 java.io.IOException;
|
||||
import java.util.List;
|
||||
import java.util.regex.Matcher;
|
||||
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.VitroFilters;
|
||||
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.WebappDaoFactoryJena;
|
||||
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.jena.model.RDFServiceModel;
|
||||
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");
|
||||
}
|
||||
|
||||
// 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
|
||||
//a different version if requested by parameters
|
||||
wdf = checkForModelSwitching(vreq, wdf);
|
||||
|
|
|
@ -3,10 +3,7 @@
|
|||
package edu.cornell.mannlib.vitro.webapp.filters;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Enumeration;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.regex.Matcher;
|
||||
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.LogFactory;
|
||||
|
||||
import com.hp.hpl.jena.ontology.OntModel;
|
||||
import com.hp.hpl.jena.ontology.OntModelSpec;
|
||||
import com.hp.hpl.jena.query.Dataset;
|
||||
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.RDFServiceFactory;
|
||||
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;
|
||||
|
||||
public class WebappDaoFactorySDBPrep implements Filter {
|
||||
|
@ -89,17 +88,9 @@ public class WebappDaoFactorySDBPrep implements Filter {
|
|||
WebappDaoFactory wadf = null;
|
||||
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();
|
||||
config.setDefaultNamespace(defaultNamespace);
|
||||
config.setPreferredLanguages(langs);
|
||||
|
@ -110,12 +101,14 @@ public class WebappDaoFactorySDBPrep implements Filter {
|
|||
RDFService unfilteredRDFService = factory.getShortTermRDFService();
|
||||
RDFService rdfService = null;
|
||||
|
||||
if (!"false".equals(
|
||||
ConfigurationProperties.getBean(vreq).getProperty(
|
||||
"RDFService.languageFilter", "true"))) {
|
||||
rdfService = new LanguageFilteringRDFService(unfilteredRDFService, langs);
|
||||
if (Boolean.valueOf(ConfigurationProperties.getBean(vreq).getProperty(
|
||||
"RDFService.languageFilter", "true"))) {
|
||||
rdfService = new LanguageFilteringRDFService(unfilteredRDFService, langs);
|
||||
oms = LanguageFilteringUtils.replaceDisplayModelInSelector(oms,
|
||||
LanguageFilteringUtils.wrapOntModelInALanguageFilter(oms.getDisplayModel(), request));
|
||||
baseOms = LanguageFilteringUtils.replaceDisplayModelInSelector(baseOms, oms.getDisplayModel());
|
||||
} else {
|
||||
rdfService = unfilteredRDFService;
|
||||
rdfService = unfilteredRDFService;
|
||||
}
|
||||
|
||||
Dataset dataset = new RDFServiceDataset(rdfService);
|
||||
|
|
|
@ -8,8 +8,10 @@ import java.io.InputStream;
|
|||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.Enumeration;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
@ -368,17 +370,20 @@ public class LanguageFilteringRDFService implements RDFService {
|
|||
|
||||
int index = langs.indexOf(lang);
|
||||
if (index >= 0) {
|
||||
log.debug("languageIndex for '" + lang + "' is " + index);
|
||||
return index;
|
||||
}
|
||||
|
||||
if (lang.length() > 2) {
|
||||
index = langs.indexOf(lang.substring(0, 2));
|
||||
if (index >= 0) {
|
||||
log.debug("languageIndex for '" + lang + "' is " + index + inexactMatchPenalty);
|
||||
return index + inexactMatchPenalty;
|
||||
}
|
||||
}
|
||||
|
||||
if (lang.isEmpty()) {
|
||||
log.debug("languageIndex for '" + lang + "' is " + 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