fixes for language filtering to support private-use subtags (#330)
This commit is contained in:
parent
020b9385f8
commit
81e12cc492
7 changed files with 98 additions and 3 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
// ----------------------------------------------------------------------
|
// ----------------------------------------------------------------------
|
||||||
|
|
|
@ -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" .
|
|
@ -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" .
|
|
@ -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" .
|
|
@ -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" .
|
|
@ -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" .
|
Loading…
Add table
Reference in a new issue