package at.ac.univie.mminf.qskos4j.issues.language;
import at.ac.univie.mminf.qskos4j.issues.Issue;
import at.ac.univie.mminf.qskos4j.issues.language.util.LanguageCoverage;
import org.openrdf.OpenRDFException;
import org.openrdf.model.Resource;
import org.openrdf.model.impl.URIImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.*;
/**
* Finds all concepts with incomplete language coverage (<a href="https://github.com/cmader/qSKOS/wiki/Quality-Issues#wiki-Incomplete_Language_Coverage">Incomplete Language Coverage</a>
*/
public class IncompleteLanguageCoverage extends Issue<IncompleteLangCovResult> {
private final Logger logger = LoggerFactory.getLogger(IncompleteLanguageCoverage.class);
private Map<Resource, Collection<String>> incompleteLanguageCoverage;
private LanguageCoverage languageCoverage;
private Set<String> distinctLanguages;
public IncompleteLanguageCoverage(LanguageCoverage languageCoverage) {
super(languageCoverage,
"ilc",
"Incomplete Language Coverage",
"Finds concepts lacking description in languages that are present for other concepts",
IssueType.ANALYTICAL,
new URIImpl("https://github.com/cmader/qSKOS/wiki/Quality-Issues#incomplete-language-coverage")
);
this.languageCoverage = languageCoverage;
}
@Override
protected IncompleteLangCovResult invoke() throws OpenRDFException {
incompleteLanguageCoverage = new HashMap<Resource, Collection<String>>();
findDistinctLanguages();
generateIncompleteLanguageCoverageMap();
return new IncompleteLangCovResult(incompleteLanguageCoverage);
}
private void findDistinctLanguages() throws OpenRDFException {
distinctLanguages = new HashSet<String>();
for (Collection languages : languageCoverage.getResult().getData().values()) {
distinctLanguages.addAll(languages);
}
}
private void generateIncompleteLanguageCoverageMap() throws OpenRDFException {
incompleteLanguageCoverage = new HashMap<Resource, Collection<String>>();
Map<Resource, Collection<String>> langCovData = languageCoverage.getResult().getData();
for (Resource resource : langCovData.keySet()) {
Collection<String> coveredLanguages = langCovData.get(resource);
Collection<String> notCoveredLanguages = getNotCoveredLanguages(coveredLanguages);
if (!notCoveredLanguages.isEmpty()) {
incompleteLanguageCoverage.put(resource, notCoveredLanguages);
}
}
}
private Collection<String> getNotCoveredLanguages(Collection<String> coveredLanguages) {
Set<String> ret = new HashSet<String>(distinctLanguages);
ret.removeAll(coveredLanguages);
return ret;
}
}