This is an automated email from the ASF dual-hosted git repository. andy pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/jena.git
commit 054273fcb33b7cc1e29838661efcde3e4a03a503 Author: Andy Seaborne <[email protected]> AuthorDate: Fri Mar 28 13:21:45 2025 +0000 Language tag validator service for SPARQLer --- .../jena/fuseki/validation/LangTagValidator.java | 37 ++++++ .../fuseki/validation/html/IRIValidatorHTML.java | 2 +- .../validation/html/LangTagValidatorHTML.java | 141 +++++++++++++++++++++ .../validation/html/UpdateValidatorHTML.java | 2 +- .../sparqler/pages/crossdomain.xml | 0 .../sparqler/pages/data-validator.html | 0 .../jena-fuseki-main/sparqler/pages/index.html | 1 + .../sparqler/pages/iri-validator.html | 0 .../{iri-validator.html => langtag-validator.html} | 7 +- .../sparqler/pages/query-validator.html | 0 .../jena-fuseki-main/sparqler/pages/query.html | 0 .../jena-fuseki-main/sparqler/pages/robots.txt | 0 .../jena-fuseki-main/sparqler/pages/sparql.html | 0 .../sparqler/pages/update-validator.html | 0 .../jena-fuseki-main/sparqler/pages/validator.html | 8 +- .../sparqler/pages/xml-to-html-links.xsl | 0 .../sparqler/pages/xml-to-html-plain.xsl | 0 .../sparqler/pages/xml-to-html.xsl | 0 .../apache/jena/fuseki/main/cmds/FusekiMain.java | 14 +- .../org/apache/jena/fuseki/mod/ui/FMod_UI.java | 6 +- .../org/apache/jena/langtag/cmd/CmdLangTag.java | 14 +- 21 files changed, 200 insertions(+), 32 deletions(-) diff --git a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/validation/LangTagValidator.java b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/validation/LangTagValidator.java new file mode 100644 index 0000000000..22e45f0f49 --- /dev/null +++ b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/validation/LangTagValidator.java @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.jena.fuseki.validation; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.apache.jena.fuseki.servlets.ServletOps; +import org.apache.jena.fuseki.validation.html.LangTagValidatorHTML; + +public class LangTagValidator extends ValidatorBase { + + @Override + protected void executeJSON(HttpServletRequest request, HttpServletResponse response) { + ServletOps.errorBadRequest("JSON not supported"); + } + + @Override + protected void executeHTML(HttpServletRequest request, HttpServletResponse response) { + LangTagValidatorHTML.executeHTML(request, response); + } +} diff --git a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/validation/html/IRIValidatorHTML.java b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/validation/html/IRIValidatorHTML.java index 1e801aeed1..ed36f63c07 100644 --- a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/validation/html/IRIValidatorHTML.java +++ b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/validation/html/IRIValidatorHTML.java @@ -33,7 +33,7 @@ import org.apache.jena.irix.IRIx; public class IRIValidatorHTML { - public IRIValidatorHTML() + private IRIValidatorHTML() { } static final String paramIRI = "iri"; diff --git a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/validation/html/LangTagValidatorHTML.java b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/validation/html/LangTagValidatorHTML.java new file mode 100644 index 0000000000..5ac1243c1a --- /dev/null +++ b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/validation/html/LangTagValidatorHTML.java @@ -0,0 +1,141 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.jena.fuseki.validation.html; + +import static org.apache.jena.fuseki.validation.html.ValidatorHtmlLib.finishFixed; +import static org.apache.jena.fuseki.validation.html.ValidatorHtmlLib.printHead; +import static org.apache.jena.fuseki.validation.html.ValidatorHtmlLib.setHeaders; +import static org.apache.jena.fuseki.validation.html.ValidatorHtmlLib.startFixed; + +import java.io.IOException; +import java.io.PrintStream; +import java.util.ArrayList; +import java.util.List; + +import jakarta.servlet.ServletOutputStream; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.apache.jena.langtag.LangTag; +import org.apache.jena.langtag.LangTagException; +import org.apache.jena.langtag.SysLangTag; +import org.apache.jena.shared.JenaException; + +public class LangTagValidatorHTML +{ + private LangTagValidatorHTML() + { } + + static final String paramLang = "lang"; + static final String paramLangTag = "langtag"; + + public static void executeHTML(HttpServletRequest httpRequest, HttpServletResponse httpResponse) { + try { + String[] args1 = httpRequest.getParameterValues(paramLang); + String[] args2 = httpRequest.getParameterValues(paramLangTag); + + if ( args1 == null && args2 == null ) + httpResponse.sendError(HttpServletResponse.SC_BAD_REQUEST, "No ?lang= parameter"); + + + List<String> args = new ArrayList<>(); + if ( args1 != null ) + for ( String a : args1 ) args.add(a); + if ( args2 != null ) + for ( String a : args2 ) args.add(a); + + if ( args.size() == 0 ) + httpResponse.sendError(HttpServletResponse.SC_BAD_REQUEST, "No language tags"); + + ServletOutputStream outStream = httpResponse.getOutputStream(); + PrintStream stdout = System.out; + PrintStream stderr = System.err; + System.setOut(new PrintStream(outStream)); + System.setErr(new PrintStream(outStream)); + + setHeaders(httpResponse); + + outStream.println("<html>"); + printHead(outStream, "Apache Jena LangTag"); + outStream.println("<body>"); + + outStream.println("<h1>LangTag Report</h1>"); + startFixed(outStream); + + try { + boolean first = true; + + for ( String languageTag : args ) { + if ( !first ) + System.out.println(); + first = false; + outStream.println(String.format("%-16s %s", "Input: ", languageTag)); + + if ( languageTag.isEmpty() ) { + outStream.println("Empty string for language tag"); + continue; + } + if ( languageTag.isBlank() ) { + outStream.println("Blank string for language tag"); + continue; + } + if ( languageTag.contains(" ") || languageTag.contains("\t") || languageTag.contains("\n") || languageTag.contains("\r") ) { + outStream.println("Language tag contains white space"); + continue; + } + if ( languageTag.contains("--") ) { + outStream.println("Illgeal language tag. String contains '--'"); + continue; + } + + try { + LangTag langTag = SysLangTag.create(languageTag); + outStream.println(String.format("%-16s %s", "Formatted:", langTag.str())); + print(outStream, "Formatted:", langTag.str(), true); + print(outStream, "Language:", langTag.getLanguage(), true); + print(outStream, "Script:", langTag.getScript(), true); + print(outStream, "Region:", langTag.getRegion(), true); + print(outStream, "Variant:", langTag.getVariant(), false); + print(outStream, "Extension:", langTag.getExtension(), false); + print(outStream, "Private Use:", langTag.getPrivateUse(), false); + } catch (JenaException | LangTagException ex) { + outStream.println("Bad language tag: "+ex.getMessage()); + } + } + } finally { + finishFixed(outStream); + System.out.flush(); + System.err.flush(); + System.setOut(stdout); + System.setErr(stdout); + } + + outStream.println("</body>"); + outStream.println("</html>"); + } catch (IOException ex) {} + } + + private static void print(ServletOutputStream outStream, String label, String value, boolean always) throws IOException { + if ( value == null ) { + if ( ! always ) + return; + value = "-"; + } + outStream.print(String.format(" %-14s %s\n", label, value)); + } +} diff --git a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/validation/html/UpdateValidatorHTML.java b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/validation/html/UpdateValidatorHTML.java index 2f2a003ec1..ad6f19454a 100644 --- a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/validation/html/UpdateValidatorHTML.java +++ b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/validation/html/UpdateValidatorHTML.java @@ -36,7 +36,7 @@ import org.apache.jena.update.UpdateRequest; public class UpdateValidatorHTML { - public UpdateValidatorHTML() + private UpdateValidatorHTML() { } static final String paramLineNumbers = "linenumbers"; diff --git a/jena-fuseki2/jena-fuseki-main/sparqler/pages/crossdomain.xml b/jena-fuseki2/jena-fuseki-main/sparqler/pages/crossdomain.xml old mode 100755 new mode 100644 diff --git a/jena-fuseki2/jena-fuseki-main/sparqler/pages/data-validator.html b/jena-fuseki2/jena-fuseki-main/sparqler/pages/data-validator.html old mode 100755 new mode 100644 diff --git a/jena-fuseki2/jena-fuseki-main/sparqler/pages/index.html b/jena-fuseki2/jena-fuseki-main/sparqler/pages/index.html old mode 100755 new mode 100644 index 0937b9ff94..72b10aeb1b --- a/jena-fuseki2/jena-fuseki-main/sparqler/pages/index.html +++ b/jena-fuseki2/jena-fuseki-main/sparqler/pages/index.html @@ -35,6 +35,7 @@ <li><a href="update-validator.html">SPARQL update validator</a></li> <li><a href="data-validator.html">RDF data validator</a></li> <li><a href="iri-validator.html">IRI validator</a></li> + <li><a href="langtag-validator.html">Language tag validator</a></li> </ul> <h2>Query</h2> diff --git a/jena-fuseki2/jena-fuseki-main/sparqler/pages/iri-validator.html b/jena-fuseki2/jena-fuseki-main/sparqler/pages/iri-validator.html old mode 100755 new mode 100644 diff --git a/jena-fuseki2/jena-fuseki-main/sparqler/pages/iri-validator.html b/jena-fuseki2/jena-fuseki-main/sparqler/pages/langtag-validator.html old mode 100755 new mode 100644 similarity index 86% copy from jena-fuseki2/jena-fuseki-main/sparqler/pages/iri-validator.html copy to jena-fuseki2/jena-fuseki-main/sparqler/pages/langtag-validator.html index d50977cfb7..08f48f9927 --- a/jena-fuseki2/jena-fuseki-main/sparqler/pages/iri-validator.html +++ b/jena-fuseki2/jena-fuseki-main/sparqler/pages/langtag-validator.html @@ -26,11 +26,10 @@ <div class="moreindent"> - <form action="$/validate/iri" accept-charset="UTF-8"> + <form action="$/validate/langtag" accept-charset="UTF-8"> <p> - <textarea name="iri" cols="70" rows="2"></textarea> - - <input type="submit" value="Validate IRI" /> + <textarea name="lang" cols="70" rows="2"></textarea> + <input type="submit" value="Validate language tag" /> </p> </form> <hr/> diff --git a/jena-fuseki2/jena-fuseki-main/sparqler/pages/query-validator.html b/jena-fuseki2/jena-fuseki-main/sparqler/pages/query-validator.html old mode 100755 new mode 100644 diff --git a/jena-fuseki2/jena-fuseki-main/sparqler/pages/query.html b/jena-fuseki2/jena-fuseki-main/sparqler/pages/query.html old mode 100755 new mode 100644 diff --git a/jena-fuseki2/jena-fuseki-main/sparqler/pages/robots.txt b/jena-fuseki2/jena-fuseki-main/sparqler/pages/robots.txt old mode 100755 new mode 100644 diff --git a/jena-fuseki2/jena-fuseki-main/sparqler/pages/sparql.html b/jena-fuseki2/jena-fuseki-main/sparqler/pages/sparql.html old mode 100755 new mode 100644 diff --git a/jena-fuseki2/jena-fuseki-main/sparqler/pages/update-validator.html b/jena-fuseki2/jena-fuseki-main/sparqler/pages/update-validator.html old mode 100755 new mode 100644 diff --git a/jena-fuseki2/jena-fuseki-main/sparqler/pages/validator.html b/jena-fuseki2/jena-fuseki-main/sparqler/pages/validator.html old mode 100755 new mode 100644 index 9acb325e8c..8806b6fc3a --- a/jena-fuseki2/jena-fuseki-main/sparqler/pages/validator.html +++ b/jena-fuseki2/jena-fuseki-main/sparqler/pages/validator.html @@ -23,23 +23,17 @@ <head> <title>SPARQL Query Validator</title> <link rel="stylesheet" type="text/css" href="css/fuseki.css" /> - <meta http-equiv="refresh" content="5;url=http://sparql.org/query-validator.html"> </head> <body> <h1>SPARQLer</h1> - <p> -The SPARQL query validator page has moved to -<a href="http://sparql.org/query-validator.html">http://sparql.org/query-validator.html</a>. -You should be redirected there in a few seconds. -</p> - <h2>Validators</h2> <ul> <li><a href="query-validator.html">SPARQL query validator</a></li> <li><a href="update-validator.html">SPARQL update validator</a></li> <li><a href="data-validator.html">RDF data validator</a></li> <li><a href="iri-validator.html">IRI validator</a></li> + <li><a href="langtag-validator.html">Language tag validator</a></li> </ul> <hr/> diff --git a/jena-fuseki2/jena-fuseki-main/sparqler/pages/xml-to-html-links.xsl b/jena-fuseki2/jena-fuseki-main/sparqler/pages/xml-to-html-links.xsl old mode 100755 new mode 100644 diff --git a/jena-fuseki2/jena-fuseki-main/sparqler/pages/xml-to-html-plain.xsl b/jena-fuseki2/jena-fuseki-main/sparqler/pages/xml-to-html-plain.xsl old mode 100755 new mode 100644 diff --git a/jena-fuseki2/jena-fuseki-main/sparqler/pages/xml-to-html.xsl b/jena-fuseki2/jena-fuseki-main/sparqler/pages/xml-to-html.xsl old mode 100755 new mode 100644 diff --git a/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/cmds/FusekiMain.java b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/cmds/FusekiMain.java index 9d89b82a12..1e2947dca2 100644 --- a/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/cmds/FusekiMain.java +++ b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/cmds/FusekiMain.java @@ -44,10 +44,7 @@ import org.apache.jena.fuseki.server.DataAccessPoint; import org.apache.jena.fuseki.server.DataAccessPointRegistry; import org.apache.jena.fuseki.server.FusekiCoreInfo; import org.apache.jena.fuseki.servlets.SPARQL_QueryGeneral; -import org.apache.jena.fuseki.validation.DataValidator; -import org.apache.jena.fuseki.validation.IRIValidator; -import org.apache.jena.fuseki.validation.QueryValidator; -import org.apache.jena.fuseki.validation.UpdateValidator; +import org.apache.jena.fuseki.validation.*; import org.apache.jena.query.ARQ; import org.apache.jena.riot.RDFDataMgr; import org.apache.jena.riot.RDFParser; @@ -710,10 +707,11 @@ public class FusekiMain extends CmdARQ { if ( serverArgs.validators ) { // Validators. - builder.addServlet("/$/validate/query", new QueryValidator()); - builder.addServlet("/$/validate/update", new UpdateValidator()); - builder.addServlet("/$/validate/iri", new IRIValidator()); - builder.addServlet("/$/validate/data", new DataValidator()); + builder.addServlet("/$/validate/query", new QueryValidator()); + builder.addServlet("/$/validate/update", new UpdateValidator()); + builder.addServlet("/$/validate/iri", new IRIValidator()); + builder.addServlet("/$/validate/langtag", new LangTagValidator()); + builder.addServlet("/$/validate/data", new DataValidator()); } // Apply argument for the database services diff --git a/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/mod/ui/FMod_UI.java b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/mod/ui/FMod_UI.java index 8c1c62d19c..bdfcc7b578 100644 --- a/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/mod/ui/FMod_UI.java +++ b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/mod/ui/FMod_UI.java @@ -35,10 +35,7 @@ import org.apache.jena.fuseki.main.FusekiServer; import org.apache.jena.fuseki.main.cmds.ServerArgs; import org.apache.jena.fuseki.main.sys.FusekiModule; import org.apache.jena.fuseki.mgt.FusekiServerCtl; -import org.apache.jena.fuseki.validation.DataValidator; -import org.apache.jena.fuseki.validation.IRIValidator; -import org.apache.jena.fuseki.validation.QueryValidator; -import org.apache.jena.fuseki.validation.UpdateValidator; +import org.apache.jena.fuseki.validation.*; import org.apache.jena.rdf.model.Model; import org.eclipse.jetty.util.resource.Resource; import org.eclipse.jetty.util.resource.ResourceFactory; @@ -117,6 +114,7 @@ public class FMod_UI implements FusekiModule { .addServlet("/$/validate/query", new QueryValidator()) .addServlet("/$/validate/update", new UpdateValidator()) .addServlet("/$/validate/iri", new IRIValidator()) + .addServlet("/$/validate/langtag", new LangTagValidator()) .addServlet("/$/validate/data", new DataValidator()) .enableStats(true); // LOG.info("Fuseki UI loaded"); diff --git a/jena-langtag/src/main/java/org/apache/jena/langtag/cmd/CmdLangTag.java b/jena-langtag/src/main/java/org/apache/jena/langtag/cmd/CmdLangTag.java index 0b1a46fdec..8e8add6fd7 100644 --- a/jena-langtag/src/main/java/org/apache/jena/langtag/cmd/CmdLangTag.java +++ b/jena-langtag/src/main/java/org/apache/jena/langtag/cmd/CmdLangTag.java @@ -51,13 +51,13 @@ public class CmdLangTag { try { System.out.printf("%-16s %s\n", "Input:", languageTag); LangTag langTag = SysLangTag.create(languageTag); - System.out.printf("%-16s %s\n", "Formatted:", langTag.str()); - print("Language:", langTag.getLanguage(), true); - print("Script:", langTag.getScript(), true); - print("Region:", langTag.getRegion(), true); - print("Variant:", langTag.getVariant(), false); - print("Extension:", langTag.getExtension(), false); - print("Private Use:", langTag.getPrivateUse(), false); + print("Formatted:", langTag.str(), true); + print("Language:", langTag.getLanguage(), true); + print("Script:", langTag.getScript(), true); + print("Region:", langTag.getRegion(), true); + print("Variant:", langTag.getVariant(), false); + print("Extension:", langTag.getExtension(), false); + print("Private Use:", langTag.getPrivateUse(), false); } catch (LangTagException ex) { System.out.println("Bad language tag"); System.out.printf("%s\n", ex.getMessage());
