From 93e92c3b2ff6056f9c4dc6dba865745503d92f25 Mon Sep 17 00:00:00 2001 From: Andy Seaborne Date: Sun, 21 Dec 2025 22:06:08 +0000 Subject: [PATCH] GH-3668: Put back full start-up logging in Fuseki Server --- .../jena/fuseki/server/FusekiCoreInfo.java | 8 ++- .../jena/fuseki/server/PlatformInfo.java | 6 +- .../jena/fuseki/main/FusekiMainRunner.java | 16 ++++- .../apache/jena/fuseki/main/FusekiRunner.java | 60 +++++++++++++++++++ .../apache/jena/fuseki/main/FusekiServer.java | 16 ++--- .../jena/fuseki/main/cmds/FusekiMainCmd.java | 5 +- .../fuseki/main/cmds/FusekiServerCmd.java | 2 +- .../fuseki/server/FusekiServerRunner.java | 17 +++++- 8 files changed, 108 insertions(+), 22 deletions(-) create mode 100644 jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/FusekiRunner.java diff --git a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/FusekiCoreInfo.java b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/FusekiCoreInfo.java index e143ec9d8de..eb8f472e276 100644 --- a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/FusekiCoreInfo.java +++ b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/FusekiCoreInfo.java @@ -36,6 +36,11 @@ public static void logCode(Logger log) { FmtLog.info(log, "%s %s", serverName, version); } + /** Details of the system runtime configuration. */ + public static void logSystemDetails(Logger log) { + PlatformInfo.logSystemDetails(log); + } + /** Log details - this function is about command line details */ public static void logServerCmdSetup(Logger log, boolean verbose, DataAccessPointRegistry dapRegistry, String datasetPath, String datasetDescription, String serverConfigFile, String staticFiles) { @@ -47,7 +52,7 @@ public static void logServerCmdSetup(Logger log, boolean verbose, DataAccessPoin FusekiCoreInfo.logDataAccessPointRegistry(log, dapRegistry, verbose); if ( staticFiles != null ) FmtLog.info(log, "Static files: %s", staticFiles); - PlatformInfo.logDetailsSystem(log); + PlatformInfo.logSystemDetails(log); if ( verbose ) PlatformInfo.logDetailsJVM(log); } @@ -129,5 +134,4 @@ private static List operations(DataService dataService) { others.stream().sorted(order).forEach(nice::add); return nice; } - } diff --git a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/PlatformInfo.java b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/PlatformInfo.java index 98414a16687..8b87d487a3f 100644 --- a/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/PlatformInfo.java +++ b/jena-fuseki2/jena-fuseki-core/src/main/java/org/apache/jena/fuseki/server/PlatformInfo.java @@ -24,7 +24,7 @@ import org.apache.jena.atlas.logging.FmtLog; import org.slf4j.Logger; -/** Platform inforamtion - OS and JVM */ +/** Platform information - OS and JVM */ /*package*/ class PlatformInfo { public static void main(String ...args) throws IOException { @@ -37,7 +37,7 @@ public static void main(String ...args) throws IOException { } /** System details */ - /*package*/ static void logDetailsSystem(Logger log) { + /*package*/ static void logSystemDetails(Logger log) { String prefix = " "; long maxMem = Runtime.getRuntime().maxMemory(); long totalMem = Runtime.getRuntime().totalMemory(); @@ -56,7 +56,7 @@ public static void main(String ...args) throws IOException { /** JVM details section. */ /*package*/ static void logDetailsJVM(Logger log) { - String prefix = " "; + String prefix = " "; logOne(log, prefix, "java.vendor"); logOne(log, prefix, "java.home"); logOne(log, prefix, "java.runtime.version"); diff --git a/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/FusekiMainRunner.java b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/FusekiMainRunner.java index b121a03b8a8..db66b1c4f92 100644 --- a/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/FusekiMainRunner.java +++ b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/FusekiMainRunner.java @@ -25,6 +25,8 @@ import org.apache.jena.fuseki.main.cmds.FusekiMain; import org.apache.jena.fuseki.main.sys.FusekiModules; import org.apache.jena.fuseki.server.FusekiServerRunner; +import org.apache.jena.sys.JenaSystem; +import org.slf4j.Logger; /** * Functions for building and runner a {@link FusekiServer} configured from command line arguments. @@ -33,6 +35,8 @@ */ public class FusekiMainRunner { + static { JenaSystem.init(); } + /** * Run a plain {@link FusekiServer}. * @param args line arguments. @@ -40,6 +44,11 @@ public class FusekiMainRunner { */ public static FusekiServer runAsync(String... args) { FusekiServer server = construct(args); + startAsync(server); + return server; + } + + private static FusekiServer startAsync(FusekiServer server) { try { return server.start(); } catch (FusekiException ex) { @@ -58,7 +67,12 @@ public static FusekiServer runAsync(String... args) { * This function does not return. */ public static void run(String... args) { - FusekiServer server = runAsync(args); + Logger log = Fuseki.fusekiLog; + FusekiRunner.logCode(log); + FusekiServer server = construct(args); + FusekiRunner.logServerSetup(log, server); + startAsync(server); + FusekiRunner.logServerStart(log, server); server.join(); } diff --git a/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/FusekiRunner.java b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/FusekiRunner.java new file mode 100644 index 00000000000..d01a3d7cd07 --- /dev/null +++ b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/FusekiRunner.java @@ -0,0 +1,60 @@ +/* + * 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; + +import org.apache.jena.fuseki.Fuseki; +import org.apache.jena.fuseki.FusekiException; +import org.apache.jena.fuseki.server.FusekiCoreInfo; +import org.slf4j.Logger; + +public class FusekiRunner { + + // ---- Logging fragments + + public static void logCode(Logger log) { + FusekiCoreInfo.logCode(log); + } + + public static void logServerSetup(Logger log, FusekiServer server) { + boolean verbose = Fuseki.getVerbose(server.getServletContext()); + FusekiCoreInfo.logDataAccessPointRegistry(log, server.getDataAccessPointRegistry(), verbose); + FusekiCoreInfo.logSystemDetails(log); + } + + public static void logServerStart(Logger log, FusekiServer server) { + if ( ! server.getJettyServer().isStarted() ) + throw new FusekiException("FusekiServer not ready"); + int httpPort = server.getHttpPort(); + int httpsPort = server.getHttpsPort(); + if ( httpsPort > 0 && httpPort > 0 ) + Fuseki.serverLog.info("Start Fuseki (http="+httpPort+" https="+httpsPort+")"); + else if ( httpsPort > 0 ) + Fuseki.serverLog.info("Start Fuseki (https="+httpsPort+")"); + else if ( httpPort > 0 ) + Fuseki.serverLog.info("Start Fuseki (http="+httpPort+")"); + else + Fuseki.serverLog.info("Start Fuseki"); + } + + public static void logServerStop(Logger log, FusekiServer server) { + log.info("Stopping Fuseki"); + } +} 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 3672084eae8..847628a5993 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 @@ -339,6 +339,9 @@ public String getConfigFilename() { * To synchronise with the server stopping, call {@link #join}. */ public FusekiServer start() { + if ( server.isRunning() ) + return this; + try { FusekiModuleStep.serverBeforeStarting(this); server.start(); @@ -373,18 +376,7 @@ public FusekiServer start() { FusekiModuleStep.serverAfterStarting(this); - if ( httpsPort > 0 && httpPort > 0 ) - Fuseki.serverLog.info("Start Fuseki (http="+httpPort+" https="+httpsPort+")"); - else if ( httpsPort > 0 ) - Fuseki.serverLog.info("Start Fuseki (https="+httpsPort+")"); - else if ( httpPort > 0 ) - Fuseki.serverLog.info("Start Fuseki (http="+httpPort+")"); - else - Fuseki.serverLog.info("Start Fuseki"); - // Any post-startup configuration here. - // -- - // Done! return this; } @@ -418,7 +410,7 @@ public void stop() { public void join() { try { if ( ! server.isStarted() && ! server.isStarting() ) - server.start(); + start(); server.join(); } catch (FusekiException e) { throw e; } catch (Exception e) { throw new FusekiException(e); } diff --git a/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/cmds/FusekiMainCmd.java b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/cmds/FusekiMainCmd.java index c7847ef713a..a6d23392797 100644 --- a/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/cmds/FusekiMainCmd.java +++ b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/cmds/FusekiMainCmd.java @@ -18,6 +18,7 @@ package org.apache.jena.fuseki.main.cmds; +import org.apache.jena.fuseki.main.FusekiMainRunner; import org.apache.jena.fuseki.system.FusekiLogging; /** Fuseki command that runs a Fuseki server without the admin UI, just SPARQL services. @@ -43,7 +44,7 @@ public class FusekiMainCmd { * return. See {@link FusekiMain#build} to build a server using command line * syntax but not start it. */ - static public void main(String... argv) { - FusekiMain.run(argv); + static public void main(String... args) { + FusekiMainRunner.run(args); } } diff --git a/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/cmds/FusekiServerCmd.java b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/cmds/FusekiServerCmd.java index a5a305099ca..9b9dde7759c 100644 --- a/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/cmds/FusekiServerCmd.java +++ b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/main/cmds/FusekiServerCmd.java @@ -47,7 +47,7 @@ public class FusekiServerCmd { * syntax but not start it. */ static public void main(String... args) { - FusekiServerRunner.construct(args).join(); + FusekiServerRunner.run(args); } } diff --git a/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/server/FusekiServerRunner.java b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/server/FusekiServerRunner.java index 36911b1bb81..4bade4f016c 100644 --- a/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/server/FusekiServerRunner.java +++ b/jena-fuseki2/jena-fuseki-main/src/main/java/org/apache/jena/fuseki/server/FusekiServerRunner.java @@ -26,6 +26,7 @@ import org.apache.jena.fuseki.Fuseki; import org.apache.jena.fuseki.FusekiException; import org.apache.jena.fuseki.main.FusekiMainRunner; +import org.apache.jena.fuseki.main.FusekiRunner; import org.apache.jena.fuseki.main.FusekiServer; import org.apache.jena.fuseki.main.cmds.FusekiMain; import org.apache.jena.fuseki.main.cmds.ServerArgs; @@ -33,6 +34,8 @@ import org.apache.jena.fuseki.main.sys.FusekiServerArgsCustomiser; import org.apache.jena.fuseki.mgt.FusekiServerCtl; import org.apache.jena.fuseki.mod.FusekiServerModules; +import org.apache.jena.sys.JenaSystem; +import org.slf4j.Logger; /** * Functions for building and runner a {@link FusekiServer} configured from command line arguments @@ -42,6 +45,8 @@ */ public class FusekiServerRunner { + static { JenaSystem.init(); } + /** * Run {@link FusekiServer} with {@link FusekiModules} as given by {@link FusekiServerModules#serverModules()}. * @param args Command line arguments. @@ -49,6 +54,11 @@ public class FusekiServerRunner { */ public static FusekiServer runAsync(String... args) { FusekiServer server = construct(args); + startAsync(server); + return server; + } + + private static FusekiServer startAsync(FusekiServer server) { try { return server.start(); } catch (FusekiException ex) { @@ -67,7 +77,12 @@ public static FusekiServer runAsync(String... args) { * This function does not return. */ public static void run(String... args) { - FusekiServer server = runAsync(args); + Logger log = Fuseki.fusekiLog; + FusekiRunner.logCode(log); + FusekiServer server = construct(args); + FusekiRunner.logServerSetup(log, server); + startAsync(server); + FusekiRunner.logServerStart(log, server); server.join(); }