From c41853440f8d8ff28ff94fb1db7371ffd8ca404b Mon Sep 17 00:00:00 2001 From: Georgy Litvinov Date: Fri, 20 May 2022 14:29:59 +0200 Subject: [PATCH] I18n regression fix (#289) * fix: get back language filtering for sparql construct query * feat: LanguageFilteringRDFService sparqlConstructQuery tests added --- .../filter/LanguageFilteringRDFService.java | 11 +++- .../LanguageFilteringRDFServiceTest.java | 61 ++++++++++++++++--- .../filter/LangFilteringTestModelDe_NoTag.n3 | 2 + .../LangFilteringTestModelEn_De_NoTag.n3 | 2 + .../filter/LangFilteringTestModelNoTag.n3 | 2 + 5 files changed, 70 insertions(+), 8 deletions(-) create mode 100644 api/src/test/resources/edu/cornell/mannlib/vitro/webapp/rdfservice/filter/LangFilteringTestModelDe_NoTag.n3 create mode 100644 api/src/test/resources/edu/cornell/mannlib/vitro/webapp/rdfservice/filter/LangFilteringTestModelEn_De_NoTag.n3 create mode 100644 api/src/test/resources/edu/cornell/mannlib/vitro/webapp/rdfservice/filter/LangFilteringTestModelNoTag.n3 diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/rdfservice/filter/LanguageFilteringRDFService.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/rdfservice/filter/LanguageFilteringRDFService.java index 5e59118dd..6e9c4b3e7 100644 --- a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/rdfservice/filter/LanguageFilteringRDFService.java +++ b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/rdfservice/filter/LanguageFilteringRDFService.java @@ -22,6 +22,7 @@ import org.apache.jena.query.ResultSetFormatter; import org.apache.jena.rdf.model.Literal; import org.apache.jena.rdf.model.Model; import org.apache.jena.rdf.model.ModelChangedListener; +import org.apache.jena.rdf.model.ModelFactory; import org.apache.jena.rdf.model.RDFNode; import edu.cornell.mannlib.vitro.webapp.controller.VitroRequest; @@ -77,7 +78,15 @@ public class LanguageFilteringRDFService implements RDFService { @Override public void sparqlConstructQuery(String query, Model model) throws RDFServiceException { - s.sparqlConstructQuery(query, model); + if (model.isEmpty()) { + s.sparqlConstructQuery(query, model); + filterModel.filterModel(model, langs); + } else { + Model constructedModel = ModelFactory.createDefaultModel(); + s.sparqlConstructQuery(query, constructedModel); + filterModel.filterModel(constructedModel, langs); + model.add(constructedModel); + } } @Override diff --git a/api/src/test/java/edu/cornell/mannlib/vitro/webapp/rdfservice/filter/LanguageFilteringRDFServiceTest.java b/api/src/test/java/edu/cornell/mannlib/vitro/webapp/rdfservice/filter/LanguageFilteringRDFServiceTest.java index a062798f1..241d1477a 100644 --- a/api/src/test/java/edu/cornell/mannlib/vitro/webapp/rdfservice/filter/LanguageFilteringRDFServiceTest.java +++ b/api/src/test/java/edu/cornell/mannlib/vitro/webapp/rdfservice/filter/LanguageFilteringRDFServiceTest.java @@ -4,11 +4,12 @@ package edu.cornell.mannlib.vitro.webapp.rdfservice.filter; import static org.junit.Assert.assertEquals; +import java.io.InputStreamReader; +import java.io.Reader; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.Comparator; import java.util.HashSet; import java.util.List; @@ -21,9 +22,15 @@ import org.junit.Test; import stubs.org.apache.jena.rdf.model.LiteralStub; +import org.apache.jena.ontology.OntModel; +import org.apache.jena.ontology.OntModelSpec; import org.apache.jena.rdf.model.Literal; +import org.apache.jena.rdf.model.ModelFactory; import edu.cornell.mannlib.vitro.testing.AbstractTestClass; +import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFService; +import edu.cornell.mannlib.vitro.webapp.rdfservice.RDFServiceException; +import edu.cornell.mannlib.vitro.webapp.rdfservice.impl.jena.model.RDFServiceModel; /** * This is the matching order we expect to see: @@ -36,12 +43,15 @@ import edu.cornell.mannlib.vitro.testing.AbstractTestClass; * */ public class LanguageFilteringRDFServiceTest extends AbstractTestClass { + private static final Log log = LogFactory .getLog(LanguageFilteringRDFServiceTest.class); private static final String COLLATOR_CLASSNAME = "edu.cornell.mannlib.vitro.webapp.rdfservice.filter.LanguageFilteringRDFService$RowIndexedLiteralSortByLang"; private static final String RIL_CLASSNAME = "edu.cornell.mannlib.vitro.webapp.rdfservice.filter.LanguageFilteringRDFService$RowIndexedLiteral"; + private static final String TEST_CONSTRUCT_QUERY = "CONSTRUCT { ?s ?o ?p . } WHERE { ?s ?o ?p . }"; + private LanguageFilteringRDFService filteringRDFService; private List listOfRowIndexedLiterals; private int literalIndex; @@ -158,6 +168,39 @@ public class LanguageFilteringRDFServiceTest extends AbstractTestClass { testBothWays(); } + @Test + public void sparqlConstructQueryTestGetPreferredExistingLang() throws RDFServiceException { + preferredLanguages = list("en-US", "de-DE"); + OntModel model; + createLanguageFilter("LangFilteringTestModelEn_De_NoTag.n3"); + model = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); + filteringRDFService.sparqlConstructQuery(TEST_CONSTRUCT_QUERY, model); + assertEquals(model.size(),1); + assertEquals(model.listStatements().next().getObject().toString(), "US label@en-US"); + } + + @Test + public void sparqlConstructQueryTestGetSecodAvailPreferredLang() throws RDFServiceException { + preferredLanguages = list("en-US", "de-DE"); + OntModel model; + createLanguageFilter("LangFilteringTestModelDe_NoTag.n3"); + model = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); + filteringRDFService.sparqlConstructQuery(TEST_CONSTRUCT_QUERY, model); + assertEquals(model.size(),1); + assertEquals(model.listStatements().next().getObject().toString(), "DE label@de-DE"); + } + + @Test + public void sparqlConstructQueryTestGetNoTagAsLangsNotAvailable() throws RDFServiceException { + preferredLanguages = list("en-US", "de-DE"); + OntModel model; + createLanguageFilter("LangFilteringTestModelNoTag.n3"); + model = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); + filteringRDFService.sparqlConstructQuery(TEST_CONSTRUCT_QUERY, model); + assertEquals(model.size(),1); + assertEquals(model.listStatements().next().getObject().toString(), "no tag label"); + } + // ---------------------------------------------------------------------- // Helper methods // ---------------------------------------------------------------------- @@ -167,7 +210,7 @@ public class LanguageFilteringRDFServiceTest extends AbstractTestClass { * sort again. */ private void testBothWays() { - createLanguageFilter(); + createLanguageFilter(null); buildListOfLiterals(); sortListOfLiterals(); @@ -184,7 +227,7 @@ public class LanguageFilteringRDFServiceTest extends AbstractTestClass { * thrown, and no languages are "lost in translation". */ private void testArbitraryOrder() { - createLanguageFilter(); + createLanguageFilter(null); buildListOfLiterals(); sortListOfLiterals(); @@ -193,16 +236,20 @@ public class LanguageFilteringRDFServiceTest extends AbstractTestClass { buildReversedListOfLiterals(); sortListOfLiterals(); assertLanguages("sort reversed literals"); - } private List list(String... strings) { return new ArrayList(Arrays.asList(strings)); } - private void createLanguageFilter() { - filteringRDFService = new LanguageFilteringRDFService(null, - preferredLanguages); + private void createLanguageFilter(String fileName) { + OntModel model = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM); + if (fileName != null) { + Reader reader = new InputStreamReader(this.getClass().getResourceAsStream(fileName)); + model.read(reader, "http://test.edu/", "N3"); + } + RDFService rdfService = new RDFServiceModel(model); + filteringRDFService = new LanguageFilteringRDFService(rdfService, preferredLanguages); } private void buildListOfLiterals() { diff --git a/api/src/test/resources/edu/cornell/mannlib/vitro/webapp/rdfservice/filter/LangFilteringTestModelDe_NoTag.n3 b/api/src/test/resources/edu/cornell/mannlib/vitro/webapp/rdfservice/filter/LangFilteringTestModelDe_NoTag.n3 new file mode 100644 index 000000000..a567d9620 --- /dev/null +++ b/api/src/test/resources/edu/cornell/mannlib/vitro/webapp/rdfservice/filter/LangFilteringTestModelDe_NoTag.n3 @@ -0,0 +1,2 @@ +@prefix rdfs: . + rdfs:label "DE label"@de-DE, "no tag label" . \ No newline at end of file diff --git a/api/src/test/resources/edu/cornell/mannlib/vitro/webapp/rdfservice/filter/LangFilteringTestModelEn_De_NoTag.n3 b/api/src/test/resources/edu/cornell/mannlib/vitro/webapp/rdfservice/filter/LangFilteringTestModelEn_De_NoTag.n3 new file mode 100644 index 000000000..635236f99 --- /dev/null +++ b/api/src/test/resources/edu/cornell/mannlib/vitro/webapp/rdfservice/filter/LangFilteringTestModelEn_De_NoTag.n3 @@ -0,0 +1,2 @@ +@prefix rdfs: . + rdfs:label "US label"@en-US , "DE label"@de-DE, "no tag label" . diff --git a/api/src/test/resources/edu/cornell/mannlib/vitro/webapp/rdfservice/filter/LangFilteringTestModelNoTag.n3 b/api/src/test/resources/edu/cornell/mannlib/vitro/webapp/rdfservice/filter/LangFilteringTestModelNoTag.n3 new file mode 100644 index 000000000..ba42a8047 --- /dev/null +++ b/api/src/test/resources/edu/cornell/mannlib/vitro/webapp/rdfservice/filter/LangFilteringTestModelNoTag.n3 @@ -0,0 +1,2 @@ +@prefix rdfs: . + rdfs:label "no tag label" .