diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/dao/jena/JenaBaseDao.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/dao/jena/JenaBaseDao.java index 74a224829..c6b9edade 100644 --- a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/dao/jena/JenaBaseDao.java +++ b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/dao/jena/JenaBaseDao.java @@ -868,6 +868,28 @@ public class JenaBaseDao extends JenaBaseDaoCon { return label; } + /** + * Searches for literal in preferred language. + * @param labels + * the literals to search; must not be null + * @return the literal in preferred language if its containing in given list; + * otherwise the first entry will returned; returns null if an empty list was given + */ + protected Literal tryLiteralForPreferredLanguages(List labels) { + + // search for literal of preferred language + for (Literal literal : labels) { + for (String lang : PREFERRED_LANGUAGES) { + if (lang.equals(literal.getLanguage())) { + return literal; + } + } + } + + // return first literal as last resort + return 0 == labels.size() ? null : labels.get(0); + } + private Literal tryPropertyForPreferredLanguages( OntResource r, Property p, boolean alsoTryNoLang ) { Literal label = null; List labels = r.listPropertyValues(p).toList(); diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/dao/jena/ObjectPropertyStatementDaoJena.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/dao/jena/ObjectPropertyStatementDaoJena.java index 43c43699c..7985a4932 100644 --- a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/dao/jena/ObjectPropertyStatementDaoJena.java +++ b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/dao/jena/ObjectPropertyStatementDaoJena.java @@ -7,7 +7,9 @@ import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; +import java.util.Locale; import java.util.Map; +import java.util.Map.Entry; import java.util.Objects; import java.util.Set; @@ -17,6 +19,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.jena.ontology.OntModel; +import org.apache.jena.ontology.OntResource; import org.apache.jena.query.Dataset; import org.apache.jena.query.Query; import org.apache.jena.query.QueryExecution; @@ -26,6 +29,7 @@ import org.apache.jena.query.QuerySolution; import org.apache.jena.query.QuerySolutionMap; import org.apache.jena.query.ResultSet; import org.apache.jena.query.Syntax; +import org.apache.jena.rdf.model.Literal; import org.apache.jena.rdf.model.Model; import org.apache.jena.rdf.model.ModelFactory; import org.apache.jena.rdf.model.Property; @@ -503,7 +507,8 @@ public class ObjectPropertyStatementDaoJena extends JenaBaseDao implements Objec return Collections.emptyMap(); } - Map types = new LinkedHashMap(); + Map result = new LinkedHashMap(); + Map> types = new LinkedHashMap>(); DatasetWrapper w = dwf.getDatasetWrapper(); Dataset dataset = w.getDataset(); dataset.getLock().enterCriticalSection(Lock.READ); @@ -521,16 +526,24 @@ public class ObjectPropertyStatementDaoJena extends JenaBaseDao implements Objec } RDFNode labelNode = soln.get("label"); - String label = null; - if (labelNode.isLiteral()) { - label = labelNode.asLiteral().getLexicalForm(); - } - - if (StringUtils.isNotBlank(type) && StringUtils.isNotBlank(label)) { - types.put(type, label); + if (StringUtils.isNotBlank(type) && labelNode.isLiteral()) { + + List langLabels = types.get(type); + if (null == langLabels) { + types.put(type, langLabels = new ArrayList()); + } + langLabels.add(labelNode.asLiteral()); + } } - return types; + + // choose labels corresponding to preferred languages + Set>> typeEntries = types.entrySet(); + for (Entry> current : typeEntries) { + result.put(current.getKey(), tryLiteralForPreferredLanguages(current.getValue()).getLexicalForm()); + } + + return result; } catch (Exception e) { log.error("Error getting most specific types for subject " + subjectUri);