This is an automated email from the ASF dual-hosted git repository.

markt-asf pushed a commit to branch 11.0.x
in repository https://gitbox.apache.org/repos/asf/tomcat.git


The following commit(s) were added to refs/heads/11.0.x by this push:
     new ba7271d7ec Review "Report failure when storing a context class without 
store..."
ba7271d7ec is described below

commit ba7271d7ecd01836618f1f62c8b8557b372ed8f6
Author: Mark Thomas <[email protected]>
AuthorDate: Wed Oct 21 08:38:50 2026 +0100

    Review "Report failure when storing a context class without store..."
    
    Add similar reporting for Server
    
    Co-authored by: CoPilot / GPT-5.6 Sol
---
 .../apache/catalina/storeconfig/StoreConfig.java   |  9 +++++-
 .../catalina/storeconfig/TestStoreConfig.java      | 32 ++++++++++++++++++++++
 2 files changed, 40 insertions(+), 1 deletion(-)

diff --git a/java/org/apache/catalina/storeconfig/StoreConfig.java 
b/java/org/apache/catalina/storeconfig/StoreConfig.java
index 8290e02082..39ac34d2f9 100644
--- a/java/org/apache/catalina/storeconfig/StoreConfig.java
+++ b/java/org/apache/catalina/storeconfig/StoreConfig.java
@@ -97,7 +97,9 @@ public class StoreConfig implements IStoreConfig {
 
     @Override
     public void storeConfig() {
-        store(server);
+        if (!store(server)) {
+            throw new 
IllegalStateException(sm.getString("config.storeServerError"));
+        }
     }
 
     /**
@@ -201,6 +203,11 @@ public class StoreConfig implements IStoreConfig {
 
     @Override
     public synchronized boolean store(Server aServer) {
+        StoreDescription desc = 
getRegistry().findDescription(aServer.getClass());
+        if (desc == null) {
+            log.warn(sm.getString("factory.storeNoDescriptor", 
aServer.getClass()));
+            return false;
+        }
         StoreFileMover mover =
                 new StoreFileMover(Bootstrap.getCatalinaBase(), 
getServerFilename(), getRegistry().getEncoding());
         // Open an output writer for the new configuration file
diff --git a/test/org/apache/catalina/storeconfig/TestStoreConfig.java 
b/test/org/apache/catalina/storeconfig/TestStoreConfig.java
index d48b4a79b2..3e7b1322a0 100644
--- a/test/org/apache/catalina/storeconfig/TestStoreConfig.java
+++ b/test/org/apache/catalina/storeconfig/TestStoreConfig.java
@@ -21,6 +21,7 @@ import java.io.FileReader;
 import java.io.PrintWriter;
 import java.io.StringReader;
 import java.io.StringWriter;
+import java.lang.reflect.Proxy;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 
@@ -31,6 +32,7 @@ import org.junit.Test;
 
 import org.apache.catalina.Context;
 import org.apache.catalina.Host;
+import org.apache.catalina.Server;
 import org.apache.catalina.connector.Connector;
 import org.apache.catalina.core.StandardContext;
 import org.apache.catalina.realm.LockOutRealm;
@@ -687,6 +689,36 @@ public class TestStoreConfig extends TomcatBaseTest {
         Assert.assertFalse(storeConfig.store(context));
     }
 
+    /**
+     * Verify that storing a Server whose class has no store description fails 
without replacing the existing
+     * configuration, and that the MBean operation reports the failure.
+     *
+     * @throws Exception if the test experiences an unexpected error
+     */
+    @Test
+    public void testStoreServerWithoutDescriptionFails() throws Exception {
+        StoreLoader loader = new StoreLoader();
+        loader.load(null);
+        StoreConfig storeConfig = new StoreConfig();
+        storeConfig.setRegistry(loader.getRegistry());
+
+        Server server = (Server) 
Proxy.newProxyInstance(Server.class.getClassLoader(), new Class<?>[] { 
Server.class },
+                (proxy, method, args) -> null);
+        
Assert.assertNull(loader.getRegistry().findDescription(server.getClass()));
+
+        File serverXml = new File(getTemporaryDirectory(), 
"server-custom.xml");
+        String original = "<Server port=\"8005\"/>";
+        Files.writeString(serverXml.toPath(), original, 
StandardCharsets.UTF_8);
+        storeConfig.setServerFilename(serverXml.getAbsolutePath());
+
+        Assert.assertFalse(storeConfig.store(server));
+        Assert.assertEquals(original, Files.readString(serverXml.toPath(), 
StandardCharsets.UTF_8));
+
+        storeConfig.setServer(server);
+        Assert.assertThrows(IllegalStateException.class, 
storeConfig::storeConfig);
+        Assert.assertEquals(original, Files.readString(serverXml.toPath(), 
StandardCharsets.UTF_8));
+    }
+
     private static String storeToString(StoreDescription desc, Object element) 
throws Exception {
         StringWriter buffer = new StringWriter();
         desc.getStoreFactory().store(new PrintWriter(buffer), -2, element);


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to