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 b24a742fd75dea9976145efea68d8d937c70c2d6 Author: Andy Seaborne <[email protected]> AuthorDate: Tue Dec 23 10:11:51 2025 +0000 Extract Servlet404 --- .../org/apache/jena/fuseki/main/FusekiServer.java | 34 ++---------- .../apache/jena/fuseki/main/cmds/Servlet404.java | 64 ++++++++++++++++++++++ .../main/sys/FusekiServerArgsCustomiser.java | 7 ++- 3 files changed, 72 insertions(+), 33 deletions(-) diff --git a/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/FusekiServer.java b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/FusekiServer.java index 847628a599..ed2ddc7e82 100644 --- a/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/FusekiServer.java +++ b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/FusekiServer.java @@ -20,7 +20,6 @@ package org.apache.jena.fuseki.main; import static java.util.Objects.requireNonNull; import static org.apache.jena.atlas.lib.PropertyUtils.loadFromFile; -import static org.apache.jena.fuseki.Fuseki.serverLog; import java.io.IOException; import java.nio.file.Path; @@ -30,8 +29,6 @@ import java.util.function.Predicate; import jakarta.servlet.Filter; import jakarta.servlet.ServletContext; import jakarta.servlet.http.HttpServlet; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; import org.apache.jena.atlas.json.JSON; import org.apache.jena.atlas.json.JsonObject; import org.apache.jena.atlas.lib.FileOps; @@ -50,6 +47,7 @@ import org.apache.jena.fuseki.auth.AuthPolicy; import org.apache.jena.fuseki.build.FusekiConfig; import org.apache.jena.fuseki.ctl.*; import org.apache.jena.fuseki.main.cmds.FusekiMain; +import org.apache.jena.fuseki.main.cmds.Servlet404; import org.apache.jena.fuseki.main.sys.*; import org.apache.jena.fuseki.metrics.MetricsProvider; import org.apache.jena.fuseki.mod.prometheus.PrometheusMetricsProvider; @@ -67,7 +65,6 @@ import org.apache.jena.sparql.util.ContextAccumulator; import org.apache.jena.sys.JenaSystem; import org.apache.jena.system.G; import org.apache.jena.system.RDFDataException; -import org.apache.jena.web.HttpSC; import org.eclipse.jetty.ee11.servlet.DefaultServlet; import org.eclipse.jetty.ee11.servlet.FilterHolder; import org.eclipse.jetty.ee11.servlet.ServletContextHandler; @@ -362,7 +359,7 @@ public class FusekiServer { // Post-start completion. Find the ports. Connector[] connectors = server.getServer().getConnectors(); if ( connectors.length == 0 ) - serverLog.warn("Start Fuseki: No connectors"); + Fuseki.serverLog.warn("Start Fuseki: No connectors"); // Extract the ports from the Connectors. Arrays.stream(connectors).forEach(c->{ @@ -1742,36 +1739,13 @@ public class FusekiServer { context.addServlet(staticContent, "/"); } else { // Backstop servlet - // Jetty default is 404 on GET and 405 otherwise + // Jetty default is 404 on GET and 405 (Method not allowed) otherwise HttpServlet staticServlet = new Servlet404(); ServletHolder staticContent = new ServletHolder(staticServlet); context.addServlet(staticContent, "/"); } } - /** 404 for HEAD/GET/POST/PUT */ - static class Servlet404 extends HttpServlet { - - public Servlet404() {} - // service()? - @Override - protected void doHead(HttpServletRequest req, HttpServletResponse resp) { err404(req, resp); } - @Override - protected void doGet(HttpServletRequest req, HttpServletResponse resp) { err404(req, resp); } - @Override - protected void doPost(HttpServletRequest req, HttpServletResponse resp) { err404(req, resp); } - @Override - protected void doPut(HttpServletRequest req, HttpServletResponse resp) { err404(req, resp); } - //protected void doDelete(HttpServletRequest req, HttpServletResponse resp) - //protected void doTrace(HttpServletRequest req, HttpServletResponse resp) - //protected void doOptions(HttpServletRequest req, HttpServletResponse resp) - private static void err404(HttpServletRequest req, HttpServletResponse response) { - try { - response.sendError(HttpSC.NOT_FOUND_404, HttpSC.getMessage(HttpSC.NOT_FOUND_404)); - } catch (IOException ex) {} - } - } - private static void addServlet(ServletContextHandler context, String pathspec, HttpServlet httpServlet) { ServletHolder sh = new ServletHolder(httpServlet); context.addServlet(sh, pathspec); @@ -1804,7 +1778,7 @@ public class FusekiServer { } private Server jettyServer(ServletContextHandler handler, String jettyServerConfig) { - serverLog.info("Jetty server config file = " + jettyServerConfig); + Fuseki.serverLog.info("Jetty server config file = " + jettyServerConfig); Server server = JettyServer.jettyServer(jettyServerConfig); server.setHandler(handler); return server; diff --git a/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/cmds/Servlet404.java b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/cmds/Servlet404.java new file mode 100644 index 0000000000..cee099a6d7 --- /dev/null +++ b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/cmds/Servlet404.java @@ -0,0 +1,64 @@ +/* + * 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. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.apache.jena.fuseki.main.cmds; + +import java.io.IOException; + +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.apache.jena.web.HttpSC; + +/** 404 for HEAD/GET/POST/PUT */ +public class Servlet404 extends HttpServlet { + public Servlet404() {} + + // service()? + @Override + protected void doHead(HttpServletRequest req, HttpServletResponse resp) { + err404(req, resp); + } + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) { + err404(req, resp); + } + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) { + err404(req, resp); + } + + @Override + protected void doPut(HttpServletRequest req, HttpServletResponse resp) { + err404(req, resp); + } + + // protected void doDelete(HttpServletRequest req, HttpServletResponse resp) + // protected void doTrace(HttpServletRequest req, HttpServletResponse resp) + // protected void doOptions(HttpServletRequest req, HttpServletResponse resp) + + private static void err404(HttpServletRequest req, HttpServletResponse response) { + try { + response.sendError(HttpSC.NOT_FOUND_404, HttpSC.getMessage(HttpSC.NOT_FOUND_404)); + } catch (IOException ex) {} + } +} diff --git a/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/sys/FusekiServerArgsCustomiser.java b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/sys/FusekiServerArgsCustomiser.java index 275a61877b..51e39c9001 100644 --- a/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/sys/FusekiServerArgsCustomiser.java +++ b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/sys/FusekiServerArgsCustomiser.java @@ -44,13 +44,14 @@ import org.apache.jena.rdf.model.Model; * {@link FusekiAutoModule#start()} or from Java application code. * </li> * <li> - * {@link #serverArgsModify} – Register or modify the argument setup to be + * {@link #serverArgsModify} – Called before command line processing. + * This call can register or modify the argument setup to be * used to parse the command line. * </li> * <li> * {@link #serverArgsPrepare} – Called after parsing the command line and - * recoding the command line settings in {@link ServerArgs}. Customisers can record - * argument values and flags. + * recording the command line settings in {@link ServerArgs}. + * Customisers can record argument values and flags. * </li> * <li> * {@link #serverArgsBuilder} – Called after the {@link ServerArgs} have
