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());

Reply via email to