show class names in list views corresponding to preferred languages

This commit is contained in:
Stefan Wolff 2016-11-01 15:48:49 +01:00
parent 8c8985bdc2
commit f518e78760
2 changed files with 44 additions and 9 deletions

View file

@ -868,6 +868,28 @@ public class JenaBaseDao extends JenaBaseDaoCon {
return label; 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<Literal> 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 ) { private Literal tryPropertyForPreferredLanguages( OntResource r, Property p, boolean alsoTryNoLang ) {
Literal label = null; Literal label = null;
List<RDFNode> labels = r.listPropertyValues(p).toList(); List<RDFNode> labels = r.listPropertyValues(p).toList();

View file

@ -7,7 +7,9 @@ import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
@ -17,6 +19,7 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.apache.jena.ontology.OntModel; import org.apache.jena.ontology.OntModel;
import org.apache.jena.ontology.OntResource;
import org.apache.jena.query.Dataset; import org.apache.jena.query.Dataset;
import org.apache.jena.query.Query; import org.apache.jena.query.Query;
import org.apache.jena.query.QueryExecution; 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.QuerySolutionMap;
import org.apache.jena.query.ResultSet; import org.apache.jena.query.ResultSet;
import org.apache.jena.query.Syntax; 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.Model;
import org.apache.jena.rdf.model.ModelFactory; import org.apache.jena.rdf.model.ModelFactory;
import org.apache.jena.rdf.model.Property; import org.apache.jena.rdf.model.Property;
@ -503,7 +507,8 @@ public class ObjectPropertyStatementDaoJena extends JenaBaseDao implements Objec
return Collections.emptyMap(); return Collections.emptyMap();
} }
Map<String, String> types = new LinkedHashMap<String, String>(); Map<String, String> result = new LinkedHashMap<String, String>();
Map<String, List<Literal>> types = new LinkedHashMap<String, List<Literal>>();
DatasetWrapper w = dwf.getDatasetWrapper(); DatasetWrapper w = dwf.getDatasetWrapper();
Dataset dataset = w.getDataset(); Dataset dataset = w.getDataset();
dataset.getLock().enterCriticalSection(Lock.READ); dataset.getLock().enterCriticalSection(Lock.READ);
@ -521,16 +526,24 @@ public class ObjectPropertyStatementDaoJena extends JenaBaseDao implements Objec
} }
RDFNode labelNode = soln.get("label"); RDFNode labelNode = soln.get("label");
String label = null; if (StringUtils.isNotBlank(type) && labelNode.isLiteral()) {
if (labelNode.isLiteral()) {
label = labelNode.asLiteral().getLexicalForm(); List<Literal> langLabels = types.get(type);
} if (null == langLabels) {
types.put(type, langLabels = new ArrayList<Literal>());
if (StringUtils.isNotBlank(type) && StringUtils.isNotBlank(label)) { }
types.put(type, label); langLabels.add(labelNode.asLiteral());
} }
} }
return types;
// choose labels corresponding to preferred languages
Set<Entry<String, List<Literal>>> typeEntries = types.entrySet();
for (Entry<String, List<Literal>> current : typeEntries) {
result.put(current.getKey(), tryLiteralForPreferredLanguages(current.getValue()).getLexicalForm());
}
return result;
} catch (Exception e) { } catch (Exception e) {
log.error("Error getting most specific types for subject " + subjectUri); log.error("Error getting most specific types for subject " + subjectUri);