fixes for language filtering to support private-use subtags (#330)

This commit is contained in:
Georgy Litvinov 2022-12-08 11:18:08 +01:00 committed by GitHub
parent 020b9385f8
commit 81e12cc492
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 98 additions and 3 deletions

View file

@ -1,6 +1,7 @@
package edu.cornell.mannlib.vitro.webapp.rdfservice.filter; package edu.cornell.mannlib.vitro.webapp.rdfservice.filter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
@ -12,6 +13,8 @@ import org.apache.commons.logging.LogFactory;
*/ */
public class AcceptableLanguages extends ArrayList<String>{ public class AcceptableLanguages extends ArrayList<String>{
private static final String SEPARATOR = "-";
private static final String PRIVATE_USE_SUBTAG = "x";
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private static final Log log = LogFactory.getLog(AcceptableLanguages.class); private static final Log log = LogFactory.getLog(AcceptableLanguages.class);
@ -25,11 +28,19 @@ public class AcceptableLanguages extends ArrayList<String>{
log.debug("Raw language strings:" + rawLanguageStrs); log.debug("Raw language strings:" + rawLanguageStrs);
for (String lang : rawLanguageStrs) { for (String lang : rawLanguageStrs) {
this.add(lang); this.add(lang);
String baseLang = lang.split("-")[0]; String[] subtags = lang.split(SEPARATOR);
int length = subtags.length;
for (int i = 1; i < length; i++) {
int lastIndex = length - i;
if (PRIVATE_USE_SUBTAG.equals(subtags[lastIndex - 1])) {
continue;
}
String baseLang = String.join(SEPARATOR, Arrays.copyOfRange(subtags, 0, lastIndex));
if (!lang.equals(baseLang) && !this.contains(baseLang)) { if (!lang.equals(baseLang) && !this.contains(baseLang)) {
this.add(baseLang); this.add(baseLang);
} }
} }
}
log.debug("Normalized language strings:" + this); log.debug("Normalized language strings:" + this);
} }

View file

@ -201,6 +201,80 @@ public class LanguageFilteringRDFServiceTest extends AbstractTestClass {
assertEquals(model.listStatements().next().getObject().toString(), "no tag label"); assertEquals(model.listStatements().next().getObject().toString(), "no tag label");
} }
@Test
public void sparqlConstructQueryTestPrivateFallback1() throws RDFServiceException {
preferredLanguages = list("fr-CA");
OntModel model;
createLanguageFilter("LangFilteringTestModelPrivateFallback.n3");
model = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);
filteringRDFService.sparqlConstructQuery(TEST_CONSTRUCT_QUERY, model);
assertEquals(model.size(),1);
final String expected = "fr@fr";
assertEquals(expected, model.listStatements().next().getObject().toString());
}
@Test
public void sparqlConstructQueryTestPrivateFallback2() throws RDFServiceException {
preferredLanguages = list("fr");
OntModel model;
createLanguageFilter("LangFilteringTestModelPrivateFallback2.n3");
model = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);
filteringRDFService.sparqlConstructQuery(TEST_CONSTRUCT_QUERY, model);
assertEquals(model.size(),1);
final String expected = "TIB FR ca@fr-CA-x-tib";
assertEquals(expected, model.listStatements().next().getObject().toString());
}
@Test
public void sparqlConstructQueryTestPrivateFallback3() throws RDFServiceException {
preferredLanguages = list("fr-CA-x-tib");
OntModel model;
createLanguageFilter("LangFilteringTestModelPrivateFallback3.n3");
model = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);
filteringRDFService.sparqlConstructQuery(TEST_CONSTRUCT_QUERY, model);
assertEquals(model.size(),1);
final String expected = "fr@fr";
assertEquals(expected, model.listStatements().next().getObject().toString());
}
@Test
public void sparqlConstructQueryTestPrivate() throws RDFServiceException {
preferredLanguages = list("fr-CA-x-tib");
OntModel model;
createLanguageFilter("LangFilteringTestModelPrivate.n3");
model = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);
filteringRDFService.sparqlConstructQuery(TEST_CONSTRUCT_QUERY, model);
assertEquals(model.size(),1);
final String expected = "TIB FR ca@fr-CA-x-tib";
assertEquals(expected, model.listStatements().next().getObject().toString());
}
@Test
public void sparqlConstructQueryTestFallback1() throws RDFServiceException {
preferredLanguages = list("fr-CA");
OntModel model;
createLanguageFilter("LangFilteringTestModelFallback.n3");
model = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);
filteringRDFService.sparqlConstructQuery(TEST_CONSTRUCT_QUERY, model);
assertEquals(model.size(),1);
final String expected = "fr CH@fr-CH";
assertEquals(expected, model.listStatements().next().getObject().toString());
}
@Test
public void sparqlConstructQueryTestFallback2() throws RDFServiceException {
preferredLanguages = list("fr");
OntModel model;
createLanguageFilter("LangFilteringTestModelFallback.n3");
model = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);
filteringRDFService.sparqlConstructQuery(TEST_CONSTRUCT_QUERY, model);
assertEquals(model.size(),1);
final String expected = "fr CH@fr-CH";
assertEquals(expected, model.listStatements().next().getObject().toString());
}
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------
// Helper methods // Helper methods
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------

View file

@ -0,0 +1,2 @@
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
<http://test.edu/u> rdfs:label "fr CH"@fr-CH, "de DE"@de-DE, "en US"@en-US, "no tag" .

View file

@ -0,0 +1,2 @@
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
<http://test.edu/u> rdfs:label "fr BE"@fr-BE, "fr-FR"@fr-FR, "fr CA"@fr-CA, "fr-CH"@fr-CH, "TIB FR ca"@fr-CA-x-tib, "en-US"@en-US, "no tag" .

View file

@ -0,0 +1,2 @@
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
<http://test.edu/u> rdfs:label "fr"@fr, "fr BE"@fr-BE, "fr-FR"@fr-FR, "fr-CH"@fr-CH, "TIB FR ca"@fr-CA-x-tib, "en-US"@en-US, "no tag" .

View file

@ -0,0 +1,2 @@
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
<http://test.edu/u> rdfs:label "en"@en, "fi FI"@fi-FI, "TIB FR ca"@fr-CA-x-tib, "en-US"@en-US, "no tag" .

View file

@ -0,0 +1,2 @@
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
<http://test.edu/u> rdfs:label "en"@en, "fi FI"@fi-FI, "fr"@fr, "en-US"@en-US, "no tag" .