Replacement of language comparisons using '=' by the 'langMatches'

function
This commit is contained in:
michel-heon 2022-10-28 15:53:25 +00:00
parent 2e682e6f38
commit 542d1c30ef

View file

@ -52,463 +52,466 @@ import edu.cornell.mannlib.vitro.webapp.utils.dataGetter.SparqlQueryDataGetter;
* TODO Get rid of this when the Application Ontology is implemented. * TODO Get rid of this when the Application Ontology is implemented.
*/ */
public class FakeApplicationOntologyService { public class FakeApplicationOntologyService {
private static final Log log = LogFactory private static final Log log = LogFactory
.getLog(FakeApplicationOntologyService.class); .getLog(FakeApplicationOntologyService.class);
public static final String FILE_OF_SHORT_VIEW_INFO = "/WEB-INF/resources/shortview_config.n3"; public static final String FILE_OF_SHORT_VIEW_INFO = "/WEB-INF/resources/shortview_config.n3";
private static final String NS = "http://vitro.mannlib.cornell.edu/ontologies/display/1.1#"; private static final String NS = "http://vitro.mannlib.cornell.edu/ontologies/display/1.1#";
private static final String HAS_TEMPLATE = NS + "hasTemplate"; private static final String HAS_TEMPLATE = NS + "hasTemplate";
private static final String CUSTOM_VIEW = NS + "customViewForIndividual"; private static final String CUSTOM_VIEW = NS + "customViewForIndividual";
private static final String APPLIES_TO = NS + "appliesToContext"; private static final String APPLIES_TO = NS + "appliesToContext";
private static final String HAS_DATA_GETTER = NS + "hasDataGetter"; private static final String HAS_DATA_GETTER = NS + "hasDataGetter";
private static final String HAS_VIEW = NS + "hasCustomView"; private static final String HAS_VIEW = NS + "hasCustomView";
private static final String RDF_TYPE = VitroVocabulary.RDF_TYPE; private static final String RDF_TYPE = VitroVocabulary.RDF_TYPE;
private final OntModel viewModel; private final OntModel viewModel;
private final Map<String, List<ViewSpec>> classUriToViewSpecs; private final Map<String, List<ViewSpec>> classUriToViewSpecs;
/** /**
* Load the model from the config file, and inspect it for Views and * Load the model from the config file, and inspect it for Views and
* mappings. * mappings.
* *
* Keep the model - we'll need it when its time to create the DataGetters * Keep the model - we'll need it when its time to create the DataGetters
* (on each request). * (on each request).
*/ */
public FakeApplicationOntologyService(ServletContext ctx) public FakeApplicationOntologyService(ServletContext ctx)
throws ShortViewConfigException { throws ShortViewConfigException {
this.viewModel = createModelFromFile(ctx); this.viewModel = createModelFromFile(ctx);
Map<String, ViewSpec> viewSpecsByUri = createViewSpecs(); Map<String, ViewSpec> viewSpecsByUri = createViewSpecs();
this.classUriToViewSpecs = createClassMappings(viewSpecsByUri); this.classUriToViewSpecs = createClassMappings(viewSpecsByUri);
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("Mapping: " + classUriToViewSpecs); log.debug("Mapping: " + classUriToViewSpecs);
} }
} }
/** /**
* If we fail to parse the config file, use this constructor instead, to * If we fail to parse the config file, use this constructor instead, to
* simulate an empty config file. * simulate an empty config file.
*/ */
public FakeApplicationOntologyService() { public FakeApplicationOntologyService() {
this.viewModel = ModelFactory this.viewModel = ModelFactory
.createOntologyModel(OntModelSpec.OWL_DL_MEM); .createOntologyModel(OntModelSpec.OWL_DL_MEM);
this.classUriToViewSpecs = new HashMap<String, List<ViewSpec>>(); this.classUriToViewSpecs = new HashMap<String, List<ViewSpec>>();
log.debug("Created empty FakeApplicationOntologyService."); log.debug("Created empty FakeApplicationOntologyService.");
} }
/** /**
* Load the short view config file into an OntModel. * Load the short view config file into an OntModel.
*/ */
private OntModel createModelFromFile(ServletContext ctx) private OntModel createModelFromFile(ServletContext ctx)
throws ShortViewConfigException { throws ShortViewConfigException {
InputStream stream = ctx.getResourceAsStream(FILE_OF_SHORT_VIEW_INFO); InputStream stream = ctx.getResourceAsStream(FILE_OF_SHORT_VIEW_INFO);
if (stream == null) { if (stream == null) {
throw new ShortViewConfigException("The short view config file " throw new ShortViewConfigException("The short view config file "
+ "doesn't exist in the servlet context: '" + "doesn't exist in the servlet context: '"
+ FILE_OF_SHORT_VIEW_INFO + "'"); + FILE_OF_SHORT_VIEW_INFO + "'");
} }
OntModel m = ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM); OntModel m = ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM);
try { try {
m.read(stream, null, "N3"); m.read(stream, null, "N3");
} catch (Exception e) { } catch (Exception e) {
throw new ShortViewConfigException( throw new ShortViewConfigException(
"Parsing error in the short view config file.", e); "Parsing error in the short view config file.", e);
} finally { } finally {
try { try {
stream.close(); stream.close();
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
log.debug("Loaded " + m.size() + " statements"); log.debug("Loaded " + m.size() + " statements");
return m; return m;
} }
/** /**
* Find all of the views. * Find all of the views.
*/ */
private Map<String, ViewSpec> createViewSpecs() private Map<String, ViewSpec> createViewSpecs()
throws ShortViewConfigException { throws ShortViewConfigException {
Property rdfType = viewModel.getProperty(RDF_TYPE); Property rdfType = viewModel.getProperty(RDF_TYPE);
Property appliesTo = viewModel.getProperty(APPLIES_TO); Property appliesTo = viewModel.getProperty(APPLIES_TO);
Property dataGetter = viewModel.getProperty(HAS_DATA_GETTER); Property dataGetter = viewModel.getProperty(HAS_DATA_GETTER);
Property template = viewModel.getProperty(HAS_TEMPLATE); Property template = viewModel.getProperty(HAS_TEMPLATE);
Resource customView = viewModel.getResource(CUSTOM_VIEW); Resource customView = viewModel.getResource(CUSTOM_VIEW);
ResIterator views = viewModel.listResourcesWithProperty(rdfType, ResIterator views = viewModel.listResourcesWithProperty(rdfType,
customView); customView);
try { try {
Map<String, ViewSpec> map = new HashMap<String, ViewSpec>(); Map<String, ViewSpec> map = new HashMap<String, ViewSpec>();
while (views.hasNext()) { while (views.hasNext()) {
Resource view = views.next(); Resource view = views.next();
List<String> contextNames = getDataPropertyValues(view, List<String> contextNames = getDataPropertyValues(view,
appliesTo, "context"); appliesTo, "context");
List<ShortViewContext> contexts = contextsFromNames(view, List<ShortViewContext> contexts = contextsFromNames(view,
contextNames); contextNames);
List<String> dataGetterUris = getObjectPropertyValues(view, List<String> dataGetterUris = getObjectPropertyValues(view,
dataGetter, "data getter"); dataGetter, "data getter");
String tn = getDataProperty(view, template); String tn = getDataProperty(view, template);
map.put(view.getURI(), new ViewSpec(view.getURI(), contexts, map.put(view.getURI(), new ViewSpec(view.getURI(), contexts,
dataGetterUris, tn)); dataGetterUris, tn));
} }
return map; return map;
} finally { } finally {
views.close(); views.close();
} }
} }
/** /**
* Got a list of context names. Make sure that each one actually represents * Got a list of context names. Make sure that each one actually represents
* a known context. * a known context.
*/ */
private List<ShortViewContext> contextsFromNames(Resource view, private List<ShortViewContext> contextsFromNames(Resource view,
List<String> contextNames) throws ShortViewConfigException { List<String> contextNames) throws ShortViewConfigException {
List<ShortViewContext> list = new ArrayList<ShortViewContext>(); List<ShortViewContext> list = new ArrayList<ShortViewContext>();
for (String name : contextNames) { for (String name : contextNames) {
ShortViewContext context = ShortViewContext.fromString(name); ShortViewContext context = ShortViewContext.fromString(name);
if (context == null) { if (context == null) {
throw new ShortViewConfigException("Unrecognized context '" throw new ShortViewConfigException("Unrecognized context '"
+ name + "' for view '" + view.getURI() + "'"); + name + "' for view '" + view.getURI() + "'");
} }
list.add(context); list.add(context);
} }
return list; return list;
} }
/** /**
* Create a map of classes to views. * Create a map of classes to views.
*/ */
private Map<String, List<ViewSpec>> createClassMappings( private Map<String, List<ViewSpec>> createClassMappings(
Map<String, ViewSpec> viewSpecsByUri) Map<String, ViewSpec> viewSpecsByUri)
throws ShortViewConfigException { throws ShortViewConfigException {
Property hasView = viewModel.getProperty(HAS_VIEW); Property hasView = viewModel.getProperty(HAS_VIEW);
StmtIterator stmts = viewModel.listStatements(null, hasView, StmtIterator stmts = viewModel.listStatements(null, hasView,
(RDFNode) null); (RDFNode) null);
try { try {
Map<String, List<ViewSpec>> map = new HashMap<String, List<ViewSpec>>(); Map<String, List<ViewSpec>> map = new HashMap<String, List<ViewSpec>>();
while (stmts.hasNext()) { while (stmts.hasNext()) {
Statement s = stmts.next(); Statement s = stmts.next();
String classUri = s.getSubject().getURI(); String classUri = s.getSubject().getURI();
RDFNode node = s.getObject(); RDFNode node = s.getObject();
if (!node.isResource()) { if (!node.isResource()) {
throw new ShortViewConfigException("The hasCustomView" throw new ShortViewConfigException("The hasCustomView"
+ " property for '" + classUri + " property for '" + classUri
+ "' must be a resource."); + "' must be a resource.");
} }
String viewUri = node.asResource().getURI(); String viewUri = node.asResource().getURI();
ViewSpec view = viewSpecsByUri.get(viewUri); ViewSpec view = viewSpecsByUri.get(viewUri);
if (view == null) { if (view == null) {
throw new ShortViewConfigException("On '" + classUri throw new ShortViewConfigException("On '" + classUri
+ "', the view '" + viewUri + "' does not exist."); + "', the view '" + viewUri + "' does not exist.");
} }
if (!map.containsKey(classUri)) { if (!map.containsKey(classUri)) {
map.put(classUri, new ArrayList<ViewSpec>()); map.put(classUri, new ArrayList<ViewSpec>());
} }
map.get(classUri).add(view); map.get(classUri).add(view);
} }
return map; return map;
} finally { } finally {
stmts.close(); stmts.close();
} }
} }
private String getDataProperty(Resource subject, Property predicate) private String getDataProperty(Resource subject, Property predicate)
throws ShortViewConfigException { throws ShortViewConfigException {
Statement s = viewModel.getProperty(subject, predicate); Statement s = viewModel.getProperty(subject, predicate);
if (s == null) { if (s == null) {
throw new ShortViewConfigException("The required property '" throw new ShortViewConfigException("The required property '"
+ predicate.getURI() + "' is not present for '" + predicate.getURI() + "' is not present for '"
+ subject.getURI() + "'"); + subject.getURI() + "'");
} }
RDFNode node = s.getObject(); RDFNode node = s.getObject();
if (!node.isLiteral()) if (!node.isLiteral())
throw new ShortViewConfigException("The value of '" throw new ShortViewConfigException("The value of '"
+ predicate.getURI() + "' for '" + subject.getURI() + predicate.getURI() + "' for '" + subject.getURI()
+ "' must be a literal."); + "' must be a literal.");
return node.asLiteral().getString(); return node.asLiteral().getString();
} }
private List<String> getDataPropertyValues(Resource subject, private List<String> getDataPropertyValues(Resource subject,
Property predicate, String label) throws ShortViewConfigException { Property predicate, String label) throws ShortViewConfigException {
StmtIterator stmts = viewModel.listStatements(subject, predicate, StmtIterator stmts = viewModel.listStatements(subject, predicate,
(RDFNode) null); (RDFNode) null);
try { try {
List<String> list = new ArrayList<String>(); List<String> list = new ArrayList<String>();
while (stmts.hasNext()) { while (stmts.hasNext()) {
Statement stmt = stmts.next(); Statement stmt = stmts.next();
RDFNode node = stmt.getObject(); RDFNode node = stmt.getObject();
if (!node.isLiteral()) { if (!node.isLiteral()) {
throw new ShortViewConfigException("The " + label throw new ShortViewConfigException("The " + label
+ " property for '" + subject.getURI() + " property for '" + subject.getURI()
+ "' must be a literal."); + "' must be a literal.");
} }
list.add(node.asLiteral().getString()); list.add(node.asLiteral().getString());
} }
return list; return list;
} finally { } finally {
stmts.close(); stmts.close();
} }
} }
private List<String> getObjectPropertyValues(Resource subject, private List<String> getObjectPropertyValues(Resource subject,
Property predicate, String label) throws ShortViewConfigException { Property predicate, String label) throws ShortViewConfigException {
StmtIterator stmts = viewModel.listStatements(subject, predicate, StmtIterator stmts = viewModel.listStatements(subject, predicate,
(RDFNode) null); (RDFNode) null);
try { try {
List<String> list = new ArrayList<String>(); List<String> list = new ArrayList<String>();
while (stmts.hasNext()) { while (stmts.hasNext()) {
Statement stmt = stmts.next(); Statement stmt = stmts.next();
RDFNode node = stmt.getObject(); RDFNode node = stmt.getObject();
if (!node.isResource()) { if (!node.isResource()) {
throw new ShortViewConfigException("The " + label throw new ShortViewConfigException("The " + label
+ " property for '" + subject.getURI() + " property for '" + subject.getURI()
+ "' must be a resource."); + "' must be a resource.");
} }
list.add(node.asResource().getURI()); list.add(node.asResource().getURI());
} }
return list; return list;
} finally { } finally {
stmts.close(); stmts.close();
} }
} }
/** /**
* Return the template name and DataGetter instances associated with this * Return the template name and DataGetter instances associated with this
* class and this short view context. If none, return null. * class and this short view context. If none, return null.
*/ */
public TemplateAndDataGetters getShortViewProperties(VitroRequest vreq, public TemplateAndDataGetters getShortViewProperties(VitroRequest vreq,
Individual individual, String classUri, String contextName) { Individual individual, String classUri, String contextName) {
/* /*
* If we have a mapping for this class that applies to this context, * If we have a mapping for this class that applies to this context,
* construct the DataGetter instances and return them with the template. * construct the DataGetter instances and return them with the template.
*/ */
if (classUriToViewSpecs.containsKey(classUri)) { if (classUriToViewSpecs.containsKey(classUri)) {
for (ViewSpec view : classUriToViewSpecs.get(classUri)) { for (ViewSpec view : classUriToViewSpecs.get(classUri)) {
for (ShortViewContext context : view.getContexts()) { for (ShortViewContext context : view.getContexts()) {
if (context.name().equalsIgnoreCase(contextName)) { if (context.name().equalsIgnoreCase(contextName)) {
List<DataGetter> dgList = new ArrayList<DataGetter>(); List<DataGetter> dgList = new ArrayList<DataGetter>();
for (String dgUri : view.getDataGetterUris()) { for (String dgUri : view.getDataGetterUris()) {
dgList.add(new SparqlQueryDataGetter(vreq, dgList.add(new SparqlQueryDataGetter(vreq,
viewModel, dgUri)); viewModel, dgUri));
} }
return new TemplateAndDataGetters( return new TemplateAndDataGetters(
view.getTemplateName(), view.getTemplateName(),
dgList.toArray(new DataGetter[0])); dgList.toArray(new DataGetter[0]));
} }
} }
} }
} }
/* /*
* Otherwise, check for this hard-coded kluge. Any class in the People * Otherwise, check for this hard-coded kluge. Any class in the People
* class group gets a special view with preferred title. * class group gets a special view with preferred title.
*/ */
if ((BROWSE.name().equals(contextName)) if ((BROWSE.name().equals(contextName))
&& (isClassInPeopleClassGroup(vreq.getWebappDaoFactory(), && (isClassInPeopleClassGroup(vreq.getWebappDaoFactory(),
classUri))) { classUri))) {
return new TemplateAndDataGetters("view-browse-people.ftl", return new TemplateAndDataGetters("view-browse-people.ftl",
new FakeVivoPeopleDataGetter(vreq, individual.getURI())); new FakeVivoPeopleDataGetter(vreq, individual.getURI()));
} }
/* /*
* Otherwise, no custom view. * Otherwise, no custom view.
*/ */
return null; return null;
} }
private boolean isClassInPeopleClassGroup(WebappDaoFactory wadf, private boolean isClassInPeopleClassGroup(WebappDaoFactory wadf,
String classUri) { String classUri) {
if (wadf == null) { if (wadf == null) {
log.debug("isClassInPeopleClassGroup: WebappDaoFactory is null."); log.debug("isClassInPeopleClassGroup: WebappDaoFactory is null.");
return false; return false;
} }
VClassDao vcDao = wadf.getVClassDao(); VClassDao vcDao = wadf.getVClassDao();
if (vcDao == null) { if (vcDao == null) {
log.debug("isClassInPeopleClassGroup: VClassDao is null."); log.debug("isClassInPeopleClassGroup: VClassDao is null.");
return false; return false;
} }
VClass vclass = vcDao.getVClassByURI(classUri); VClass vclass = vcDao.getVClassByURI(classUri);
if (vclass == null) { if (vclass == null) {
log.debug("isClassInPeopleClassGroup: VClass is null."); log.debug("isClassInPeopleClassGroup: VClass is null.");
return false; return false;
} }
String vclassGroupUri = vclass.getGroupURI(); String vclassGroupUri = vclass.getGroupURI();
if (vclassGroupUri == null) { if (vclassGroupUri == null) {
log.debug("isClassInPeopleClassGroup: vclassGroupUri is null."); log.debug("isClassInPeopleClassGroup: vclassGroupUri is null.");
return false; return false;
} }
boolean isPeople = PEOPLE_CLASSGROUP_URI.equals(vclassGroupUri); boolean isPeople = PEOPLE_CLASSGROUP_URI.equals(vclassGroupUri);
log.debug("isClassInPeopleClassGroup: isPeople = " + isPeople); log.debug("isClassInPeopleClassGroup: isPeople = " + isPeople);
return isPeople; return isPeople;
} }
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------
// Helper classes // Helper classes
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------
/** The info associated with a short view. */ /** The info associated with a short view. */
public static class TemplateAndDataGetters { public static class TemplateAndDataGetters {
private final String templateName; private final String templateName;
private final Set<DataGetter> dataGetters; private final Set<DataGetter> dataGetters;
public TemplateAndDataGetters(String templateName, public TemplateAndDataGetters(String templateName,
DataGetter... dataGetters) { DataGetter... dataGetters) {
this.templateName = templateName; this.templateName = templateName;
this.dataGetters = new HashSet<DataGetter>( this.dataGetters = new HashSet<DataGetter>(
Arrays.asList(dataGetters)); Arrays.asList(dataGetters));
} }
public String getTemplateName() { public String getTemplateName() {
return templateName; return templateName;
} }
public Set<DataGetter> getDataGetters() { public Set<DataGetter> getDataGetters() {
return dataGetters; return dataGetters;
} }
@Override @Override
public String toString() { public String toString() {
return "[template=" + templateName + ", dataGetters=" + dataGetters return "[template=" + templateName + ", dataGetters=" + dataGetters
+ "]"; + "]";
} }
} }
/** The view specifications that we read from the config file. */ /** The view specifications that we read from the config file. */
private class ViewSpec { private class ViewSpec {
private final String uri; private final String uri;
private final List<ShortViewContext> contexts; private final List<ShortViewContext> contexts;
private final List<String> dataGetterUris; private final List<String> dataGetterUris;
private final String templateName; private final String templateName;
public ViewSpec(String uri, List<ShortViewContext> contexts, public ViewSpec(String uri, List<ShortViewContext> contexts,
List<String> dataGetterUris, String templateName) { List<String> dataGetterUris, String templateName) {
this.uri = uri; this.uri = uri;
this.contexts = contexts; this.contexts = contexts;
this.dataGetterUris = dataGetterUris; this.dataGetterUris = dataGetterUris;
this.templateName = templateName; this.templateName = templateName;
} }
public List<ShortViewContext> getContexts() { public List<ShortViewContext> getContexts() {
return contexts; return contexts;
} }
public List<String> getDataGetterUris() { public List<String> getDataGetterUris() {
return dataGetterUris; return dataGetterUris;
} }
public String getTemplateName() { public String getTemplateName() {
return templateName; return templateName;
} }
@Override @Override
public String toString() { public String toString() {
return "ViewSpec[uri='" + uri + "', contexts=" + contexts return "ViewSpec[uri='" + uri + "', contexts=" + contexts
+ ", dataGetterUris=" + dataGetterUris + ", templateName='" + ", dataGetterUris=" + dataGetterUris + ", templateName='"
+ templateName + "']"; + templateName + "']";
} }
} }
/** A custom exception that says something was wrong with the config file. */ /** A custom exception that says something was wrong with the config file. */
public class ShortViewConfigException extends Exception { public class ShortViewConfigException extends Exception {
public ShortViewConfigException(String message) { public ShortViewConfigException(String message) {
super(message); super(message);
} }
public ShortViewConfigException(String message, Throwable cause) { public ShortViewConfigException(String message, Throwable cause) {
super(message, cause); super(message, cause);
} }
} }
private static final String PEOPLE_CLASSGROUP_URI = "http://vivoweb.org/ontology#vitroClassGrouppeople"; private static final String PEOPLE_CLASSGROUP_URI = "http://vivoweb.org/ontology#vitroClassGrouppeople";
/** /**
* A special data getter to support the kluge case of browsing an individual * A special data getter to support the kluge case of browsing an individual
* that belongs to the People class group. * that belongs to the People class group.
* *
* A SPARQL query data getter that initializes itself from its own private * A SPARQL query data getter that initializes itself from its own private
* "display model". The query finds a preferred title for the individual. * "display model". The query finds a preferred title for the individual.
*/ */
private static class FakeVivoPeopleDataGetter extends SparqlQueryDataGetter { private static class FakeVivoPeopleDataGetter extends SparqlQueryDataGetter {
// private static String QUERY_STRING = "" // private static String QUERY_STRING = ""
// + "PREFIX obo: <http://purl.obolibrary.org/obo/> \n" // + "PREFIX obo: <http://purl.obolibrary.org/obo/> \n"
// + "PREFIX vcard: <http://www.w3.org/2006/vcard/ns#> \n" // + "PREFIX vcard: <http://www.w3.org/2006/vcard/ns#> \n"
// + "SELECT ?pt \n" + "WHERE { \n" // + "SELECT ?pt \n" + "WHERE { \n"
// + " ?uri obo:ARG_2000028 ?vIndividual . \n" // + " ?uri obo:ARG_2000028 ?vIndividual . \n"
// + " ?vIndividual vcard:hasTitle ?vTitle . \n" // + " ?vIndividual vcard:hasTitle ?vTitle . \n"
// + " ?vTitle vcard:title ?pt . \n" + "} LIMIT 1"; // + " ?vTitle vcard:title ?pt . \n" + "} LIMIT 1";
/* /*
* UQAM-Optimization New query including Linguistic context * UQAM-Optimization New query including Linguistic context
*/ * and UQAM - In the filter, Case-insensitive language processing
private static String QUERY_STRING_LANG = "" */
+ "PREFIX obo: <http://purl.obolibrary.org/obo/> \n" private static String QUERY_STRING_LANG(String lang) {
+ "PREFIX vcard: <http://www.w3.org/2006/vcard/ns#> \n" return "\n"
+ "SELECT ?pt \n" + "WHERE { \n" + "PREFIX obo: <http://purl.obolibrary.org/obo/> \n"
+ " ?uri obo:ARG_2000028 ?vIndividual . \n" + "PREFIX vcard: <http://www.w3.org/2006/vcard/ns#> \n"
+ " ?vIndividual vcard:hasTitle ?vTitle . \n" + "SELECT ?pt \n" + "WHERE { \n"
+ " ?vTitle vcard:title ?pt . \n" + " ?uri obo:ARG_2000028 ?vIndividual . \n"
+ " FILTER (lang(?pt) = '?langCtx' ) \n" + " ?vIndividual vcard:hasTitle ?vTitle . \n"
+ " } LIMIT 1"; + " ?vTitle vcard:title ?pt . \n"
private static final String FAKE_VIVO_PEOPLE_DATA_GETTER_URI = "http://FakeVivoPeopleDataGetter"; // + " FILTER (lang(?pt) = '?langCtx' ) \n" old and buggy
+ " FILTER (langMatches(lang(?pt), '" + lang+"' ) ) \n"
+ " } LIMIT 1";
}
private static final String FAKE_VIVO_PEOPLE_DATA_GETTER_URI = "http://FakeVivoPeopleDataGetter";
private static OntModel fakeDisplayModel = initializeFakeDisplayModel(); private static OntModel fakeDisplayModel = initializeFakeDisplayModel();
private static OntModel initializeFakeDisplayModel() { private static OntModel initializeFakeDisplayModel() {
OntModel m = ModelFactory OntModel m = ModelFactory
.createOntologyModel(OntModelSpec.OWL_DL_MEM); .createOntologyModel(OntModelSpec.OWL_DL_MEM);
Resource dataGetter = m Resource dataGetter = m
.getResource(FAKE_VIVO_PEOPLE_DATA_GETTER_URI); .getResource(FAKE_VIVO_PEOPLE_DATA_GETTER_URI);
Property queryProperty = m.getProperty(DisplayVocabulary.QUERY); Property queryProperty = m.getProperty(DisplayVocabulary.QUERY);
Property saveToVarProperty = m Property saveToVarProperty = m
.getProperty(DisplayVocabulary.SAVE_TO_VAR); .getProperty(DisplayVocabulary.SAVE_TO_VAR);
m.add(dataGetter, queryProperty, QUERY_STRING_LANG); //UQAM-Optimization Using query with linguistic context m.add(dataGetter, queryProperty, QUERY_STRING_LANG("en-US")); //UQAM-Optimization Using query with linguistic context
m.add(dataGetter, saveToVarProperty, "extra"); m.add(dataGetter, saveToVarProperty, "extra");
return m; return m;
} }
private String individualUri; private String individualUri;
private VitroRequest vreq; private VitroRequest vreq;
private ServletContext ctx; private ServletContext ctx;
private String langCtx = "en-US"; private String langCtx = "en-US";
public FakeVivoPeopleDataGetter(VitroRequest vreq, String individualUri) { public FakeVivoPeopleDataGetter(VitroRequest vreq, String individualUri) {
super(vreq, initializeFakeDisplayModel(), "http://FakeVivoPeopleDataGetter"); super(vreq, initializeFakeDisplayModel(), "http://FakeVivoPeopleDataGetter");
this.individualUri = individualUri; this.individualUri = individualUri;
this.vreq = vreq; this.vreq = vreq;
this.ctx = vreq.getSession().getServletContext(); this.ctx = vreq.getSession().getServletContext();
this.langCtx = vreq.getLocale().getLanguage(); // UQAM-Optimization add the linguistic context this.langCtx = vreq.getLocale().getLanguage(); // UQAM-Optimization add the linguistic context
if (!vreq.getLocale().getCountry().isEmpty()) { if (!vreq.getLocale().getCountry().isEmpty()) {
this.langCtx += "-" + vreq.getLocale().getCountry(); this.langCtx += "-" + vreq.getLocale().getCountry();
} }
} }
@Override @Override
public Map<String, Object> getData(Map<String, Object> pageData) { public Map<String, Object> getData(Map<String, Object> pageData) {
Map<String, Object> parms = new HashMap<>(); Map<String, Object> parms = new HashMap<>();
parms.put("uri", individualUri); parms.put("uri", individualUri);
parms.put("langCtx", langCtx); //UQAM-Optimization add the linguistic context parms.put("langCtx", langCtx); //UQAM-Optimization add the linguistic context
return super.getData(parms);
}
return super.getData(parms); }
}
}
} }