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

rmaucher 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 7bb431e99a Fix WrapperListener and WrapperLifecycle elements in 
storeconfig
7bb431e99a is described below

commit 7bb431e99ac90bf44b082ea6534430a169d1d513
Author: remm <[email protected]>
AuthorDate: Tue May 26 14:21:07 2026 +0200

    Fix WrapperListener and WrapperLifecycle elements in storeconfig
    
    Also lots of minor issues identified by code review.
---
 .../catalina/storeconfig/CatalinaClusterSF.java    | 18 ++++-----
 .../apache/catalina/storeconfig/ConnectorSF.java   | 45 ----------------------
 .../storeconfig/ConnectorStoreAppender.java        |  4 +-
 java/org/apache/catalina/storeconfig/LoaderSF.java | 25 ++++++------
 .../catalina/storeconfig/LocalStrings.properties   |  1 +
 .../catalina/storeconfig/NamingResourcesSF.java    |  1 +
 .../catalina/storeconfig/PersistentManagerSF.java  |  4 +-
 java/org/apache/catalina/storeconfig/RealmSF.java  | 22 ++++++-----
 .../catalina/storeconfig/StandardContextSF.java    |  8 ++--
 .../apache/catalina/storeconfig/StoreAppender.java | 28 --------------
 .../apache/catalina/storeconfig/StoreConfig.java   |  2 +-
 .../catalina/storeconfig/StoreContextAppender.java |  2 +-
 .../catalina/storeconfig/StoreFileMover.java       |  5 ++-
 webapps/docs/changelog.xml                         |  4 ++
 14 files changed, 56 insertions(+), 113 deletions(-)

diff --git a/java/org/apache/catalina/storeconfig/CatalinaClusterSF.java 
b/java/org/apache/catalina/storeconfig/CatalinaClusterSF.java
index 12b3eeb60b..97db740c41 100644
--- a/java/org/apache/catalina/storeconfig/CatalinaClusterSF.java
+++ b/java/org/apache/catalina/storeconfig/CatalinaClusterSF.java
@@ -49,13 +49,6 @@ public class CatalinaClusterSF extends StoreFactoryBase {
     public void storeChildren(PrintWriter aWriter, int indent, Object 
aCluster, StoreDescription parentDesc)
             throws Exception {
         if (aCluster instanceof CatalinaCluster cluster) {
-            if (cluster instanceof SimpleTcpCluster tcpCluster) {
-                // Store nested <Manager> element
-                ClusterManager manager = tcpCluster.getManagerTemplate();
-                if (manager != null) {
-                    storeElement(aWriter, indent, manager);
-                }
-            }
             // Store nested <Channel> element
             Channel channel = cluster.getChannel();
             if (channel != null) {
@@ -71,12 +64,17 @@ public class CatalinaClusterSF extends StoreFactoryBase {
             Valve[] valves = cluster.getValves();
             storeElementArray(aWriter, indent, valves);
 
-            if (aCluster instanceof SimpleTcpCluster) {
+            if (cluster instanceof SimpleTcpCluster tcpCluster) {
+                // Store nested <Manager> element
+                ClusterManager manager = tcpCluster.getManagerTemplate();
+                if (manager != null) {
+                    storeElement(aWriter, indent, manager);
+                }
                 // Store nested <Listener> elements
-                LifecycleListener[] listeners = ((SimpleTcpCluster) 
cluster).findLifecycleListeners();
+                LifecycleListener[] listeners = 
tcpCluster.findLifecycleListeners();
                 storeElementArray(aWriter, indent, listeners);
                 // Store nested <ClusterListener> elements
-                ClusterListener[] mlisteners = ((SimpleTcpCluster) 
cluster).findClusterListeners();
+                ClusterListener[] mlisteners = 
tcpCluster.findClusterListeners();
                 List<ClusterListener> clusterListeners = new ArrayList<>();
                 for (ClusterListener clusterListener : mlisteners) {
                     if (clusterListener != deployer) {
diff --git a/java/org/apache/catalina/storeconfig/ConnectorSF.java 
b/java/org/apache/catalina/storeconfig/ConnectorSF.java
index cb4eee86c3..e4d10344b1 100644
--- a/java/org/apache/catalina/storeconfig/ConnectorSF.java
+++ b/java/org/apache/catalina/storeconfig/ConnectorSF.java
@@ -54,49 +54,4 @@ public class ConnectorSF extends StoreFactoryBase {
         }
     }
 
-    /**
-     * Prints the opening XML tag for a connector element.
-     * @param aWriter the writer to output to
-     * @param indent the indentation level
-     * @param bean the connector bean
-     * @param aDesc the store description
-     * @throws Exception if an error occurs during output
-     */
-    protected void printOpenTag(PrintWriter aWriter, int indent, Object bean, 
StoreDescription aDesc) throws Exception {
-        aWriter.print("<");
-        aWriter.print(aDesc.getTag());
-        storeConnectorAttributes(aWriter, indent, bean, aDesc);
-        aWriter.println(">");
-    }
-
-  /**
-     * Stores connector-specific attributes to the XML output.
-     * @param aWriter the writer to output to
-     * @param indent the indentation level
-     * @param bean the connector bean
-     * @param aDesc the store description
-     * @throws Exception if an error occurs during output
-     */
-    protected void storeConnectorAttributes(PrintWriter aWriter, int indent, 
Object bean, StoreDescription aDesc)
-             throws Exception {
-        if (aDesc.isAttributes()) {
-            getStoreAppender().printAttributes(aWriter, indent, false, bean, 
aDesc);
-        }
-    }
-
-    /**
-     * Prints a self-closing XML tag for a connector element.
-     * @param aWriter the writer to output to
-     * @param indent the indentation level
-     * @param bean the connector bean
-     * @param aDesc the store description
-     * @throws Exception if an error occurs during output
-     */
-    protected void printTag(PrintWriter aWriter, int indent, Object bean, 
StoreDescription aDesc) throws Exception {
-        aWriter.print("<");
-        aWriter.print(aDesc.getTag());
-        storeConnectorAttributes(aWriter, indent, bean, aDesc);
-        aWriter.println("/>");
-    }
-
 }
\ No newline at end of file
diff --git a/java/org/apache/catalina/storeconfig/ConnectorStoreAppender.java 
b/java/org/apache/catalina/storeconfig/ConnectorStoreAppender.java
index a08498b41e..7820edf50a 100644
--- a/java/org/apache/catalina/storeconfig/ConnectorStoreAppender.java
+++ b/java/org/apache/catalina/storeconfig/ConnectorStoreAppender.java
@@ -145,7 +145,9 @@ public class ConnectorStoreAppender extends StoreAppender {
             propertyKeys.add(descriptor.getName());
         }
         // Add the properties of the protocol handler
-        descriptors = 
Introspector.getBeanInfo(protocolHandler.getClass()).getPropertyDescriptors();
+        if (protocolHandler != null) {
+            descriptors = 
Introspector.getBeanInfo(protocolHandler.getClass()).getPropertyDescriptors();
+        }
         if (descriptors == null) {
             descriptors = new PropertyDescriptor[0];
         }
diff --git a/java/org/apache/catalina/storeconfig/LoaderSF.java 
b/java/org/apache/catalina/storeconfig/LoaderSF.java
index e8a3c6a9a3..0c061c26c5 100644
--- a/java/org/apache/catalina/storeconfig/LoaderSF.java
+++ b/java/org/apache/catalina/storeconfig/LoaderSF.java
@@ -38,20 +38,23 @@ public class LoaderSF extends StoreFactoryBase {
 
     @Override
     public void store(PrintWriter aWriter, int indent, Object aElement) throws 
Exception {
-        StoreDescription elementDesc = 
getRegistry().findDescription(aElement.getClass());
-        if (elementDesc != null) {
-            Loader loader = (Loader) aElement;
-            if (!isDefaultLoader(loader)) {
-                if (log.isTraceEnabled()) {
-                    log.trace("store " + elementDesc.getTag() + "( " + 
aElement + " )");
+        if (aElement instanceof Loader loader) {
+            StoreDescription elementDesc = 
getRegistry().findDescription(aElement.getClass());
+            if (elementDesc != null) {
+                if (!isDefaultLoader(loader)) {
+                    if (log.isTraceEnabled()) {
+                        log.trace("store " + elementDesc.getTag() + "( " + 
aElement + " )");
+                    }
+                    getStoreAppender().printIndent(aWriter, indent + 2);
+                    getStoreAppender().printTag(aWriter, indent + 2, loader, 
elementDesc);
+                }
+            } else {
+                if (log.isWarnEnabled()) {
+                    log.warn(sm.getString("factory.storeNoDescriptor", 
aElement.getClass()));
                 }
-                getStoreAppender().printIndent(aWriter, indent + 2);
-                getStoreAppender().printTag(aWriter, indent + 2, loader, 
elementDesc);
             }
         } else {
-            if (log.isWarnEnabled()) {
-                log.warn(sm.getString("factory.storeNoDescriptor", 
aElement.getClass()));
-            }
+            super.store(aWriter, indent, aElement);
         }
     }
 
diff --git a/java/org/apache/catalina/storeconfig/LocalStrings.properties 
b/java/org/apache/catalina/storeconfig/LocalStrings.properties
index 4c2aa53bee..e19dd0014b 100644
--- a/java/org/apache/catalina/storeconfig/LocalStrings.properties
+++ b/java/org/apache/catalina/storeconfig/LocalStrings.properties
@@ -48,3 +48,4 @@ storeFactory.noDescriptor=Descriptor for element [{0}].[{1}] 
not configured
 
 storeFileMover.directoryCreationError=Cannot create directory [{0}]
 storeFileMover.renameError=Cannot rename [{0}] to [{1}]
+storeFileMover.restoreError=Rename [{0}] to [{1}] failed and restoring also 
failed
diff --git a/java/org/apache/catalina/storeconfig/NamingResourcesSF.java 
b/java/org/apache/catalina/storeconfig/NamingResourcesSF.java
index d055c4c6eb..3d4af855e3 100644
--- a/java/org/apache/catalina/storeconfig/NamingResourcesSF.java
+++ b/java/org/apache/catalina/storeconfig/NamingResourcesSF.java
@@ -48,6 +48,7 @@ public class NamingResourcesSF extends StoreFactoryBase {
             if (log.isTraceEnabled()) {
                 log.trace("store " + elementDesc.getTag() + "( " + aElement + 
" )");
             }
+            // Note: The elements go directly inside another one without any 
specific parent
             storeChildren(aWriter, indent, aElement, elementDesc);
         } else {
             log.warn(sm.getString("storeFactory.noDescriptor", 
aElement.getClass(), "NamingResources"));
diff --git a/java/org/apache/catalina/storeconfig/PersistentManagerSF.java 
b/java/org/apache/catalina/storeconfig/PersistentManagerSF.java
index 0ffc425d61..b5583bf7ce 100644
--- a/java/org/apache/catalina/storeconfig/PersistentManagerSF.java
+++ b/java/org/apache/catalina/storeconfig/PersistentManagerSF.java
@@ -45,7 +45,9 @@ public class PersistentManagerSF extends StoreFactoryBase {
 
             // Store nested <Store> element
             Store store = manager.getStore();
-            storeElement(aWriter, indent, store);
+            if (store != null) {
+                storeElement(aWriter, indent, store);
+            }
 
             // Store nested <SessionIdGenerator> element
             SessionIdGenerator sessionIdGenerator = 
manager.getSessionIdGenerator();
diff --git a/java/org/apache/catalina/storeconfig/RealmSF.java 
b/java/org/apache/catalina/storeconfig/RealmSF.java
index eb7b688302..c543e4924a 100644
--- a/java/org/apache/catalina/storeconfig/RealmSF.java
+++ b/java/org/apache/catalina/storeconfig/RealmSF.java
@@ -68,17 +68,19 @@ public class RealmSF extends StoreFactoryBase {
     @Override
     public void storeChildren(PrintWriter aWriter, int indent, Object aRealm, 
StoreDescription parentDesc)
             throws Exception {
-        if (aRealm instanceof CombinedRealm combinedRealm) {
+        if (aRealm instanceof Realm realm) {
+            if (realm instanceof CombinedRealm combinedRealm) {
 
-            // Store nested <Realm> element
-            Realm[] realms = combinedRealm.getNestedRealms();
-            storeElementArray(aWriter, indent, realms);
-        }
-        // Store nested <CredentialHandler> element
-        CredentialHandler credentialHandler = ((Realm) 
aRealm).getCredentialHandler();
-        if (credentialHandler != null && 
!(credentialHandler.getClass().getName()
-                
.equals("org.apache.catalina.realm.CombinedRealm$CombinedRealmCredentialHandler")))
 {
-            storeElement(aWriter, indent, credentialHandler);
+                // Store nested <Realm> element
+                Realm[] realms = combinedRealm.getNestedRealms();
+                storeElementArray(aWriter, indent, realms);
+            }
+            // Store nested <CredentialHandler> element
+            CredentialHandler credentialHandler = realm.getCredentialHandler();
+            if (credentialHandler != null && 
!(credentialHandler.getClass().getName()
+                    
.equals("org.apache.catalina.realm.CombinedRealm$CombinedRealmCredentialHandler")))
 {
+                storeElement(aWriter, indent, credentialHandler);
+            }
         }
     }
 
diff --git a/java/org/apache/catalina/storeconfig/StandardContextSF.java 
b/java/org/apache/catalina/storeconfig/StandardContextSF.java
index c4302ce14c..a3076673c8 100644
--- a/java/org/apache/catalina/storeconfig/StandardContextSF.java
+++ b/java/org/apache/catalina/storeconfig/StandardContextSF.java
@@ -244,11 +244,11 @@ public class StandardContextSF extends StoreFactoryBase {
             storeElement(aWriter, indent, resources);
 
             // Store nested <WrapperListener> elements
-            String[] wLifecycles = context.findWrapperLifecycles();
-            getStoreAppender().printTagArray(aWriter, "WrapperListener", 
indent + 2, wLifecycles);
-            // Store nested <WrapperLifecycle> elements
             String[] wListeners = context.findWrapperListeners();
-            getStoreAppender().printTagArray(aWriter, "WrapperLifecycle", 
indent + 2, wListeners);
+            getStoreAppender().printTagArray(aWriter, "WrapperListener", 
indent + 2, wListeners);
+            // Store nested <WrapperLifecycle> elements
+            String[] wLifecycles = context.findWrapperLifecycles();
+            getStoreAppender().printTagArray(aWriter, "WrapperLifecycle", 
indent + 2, wLifecycles);
 
             // Store nested <Parameter> elements
             ApplicationParameter[] appParams = 
context.findApplicationParameters();
diff --git a/java/org/apache/catalina/storeconfig/StoreAppender.java 
b/java/org/apache/catalina/storeconfig/StoreAppender.java
index 6f188184c5..41571a750d 100644
--- a/java/org/apache/catalina/storeconfig/StoreAppender.java
+++ b/java/org/apache/catalina/storeconfig/StoreAppender.java
@@ -118,34 +118,6 @@ public class StoreAppender {
         aWriter.println(">");
     }
 
-    /**
-     * Print an array of values.
-     *
-     * @param aWriter  The output writer
-     * @param tag      The element name
-     * @param indent   Indentation level
-     * @param elements Array of element values
-     */
-    public void printTagValueArray(PrintWriter aWriter, String tag, int 
indent, String[] elements) {
-        if (elements != null && elements.length > 0) {
-            printIndent(aWriter, indent + 2);
-            aWriter.print("<");
-            aWriter.print(tag);
-            aWriter.print(">");
-            for (int i = 0; i < elements.length; i++) {
-                printIndent(aWriter, indent + 4);
-                aWriter.print(elements[i]);
-                if (i + 1 < elements.length) {
-                    aWriter.println(",");
-                }
-            }
-            printIndent(aWriter, indent + 2);
-            aWriter.print("</");
-            aWriter.print(tag);
-            aWriter.println(">");
-        }
-    }
-
     /**
      * Print an array of elements.
      *
diff --git a/java/org/apache/catalina/storeconfig/StoreConfig.java 
b/java/org/apache/catalina/storeconfig/StoreConfig.java
index 3be20e19d3..0c4d2ce044 100644
--- a/java/org/apache/catalina/storeconfig/StoreConfig.java
+++ b/java/org/apache/catalina/storeconfig/StoreConfig.java
@@ -182,7 +182,7 @@ public class StoreConfig implements IStoreConfig {
                         } finally {
                             desc.setStoreSeparate(oldSeparate);
                             desc.setBackup(oldBackup);
-                            desc.setBackup(oldExternalAllowed);
+                            desc.setExternalAllowed(oldExternalAllowed);
                         }
                     }
                 } else {
diff --git a/java/org/apache/catalina/storeconfig/StoreContextAppender.java 
b/java/org/apache/catalina/storeconfig/StoreContextAppender.java
index 74247f532e..65ed790d3a 100644
--- a/java/org/apache/catalina/storeconfig/StoreContextAppender.java
+++ b/java/org/apache/catalina/storeconfig/StoreContextAppender.java
@@ -82,7 +82,7 @@ public class StoreContextAppender extends StoreAppender {
                 if (host instanceof StandardHost) {
                     File appBase = getAppBase(((StandardHost) host));
                     File docBase = getDocBase(context, appBase);
-                    isPrint = !appBase.equals(docBase.getParentFile());
+                    isPrint = docBase.getParentFile() == null || 
!appBase.equals(docBase.getParentFile());
                 }
             }
         }
diff --git a/java/org/apache/catalina/storeconfig/StoreFileMover.java 
b/java/org/apache/catalina/storeconfig/StoreFileMover.java
index f10ca01428..262066c757 100644
--- a/java/org/apache/catalina/storeconfig/StoreFileMover.java
+++ b/java/org/apache/catalina/storeconfig/StoreFileMover.java
@@ -189,7 +189,10 @@ public class StoreFileMover {
     public void move() throws IOException {
         if (configOld.renameTo(configSave)) {
             if (!configNew.renameTo(configOld)) {
-                configSave.renameTo(configOld);
+                if (!configSave.renameTo(configOld)) {
+                    throw new 
IOException(sm.getString("storeFileMover.restoreError", 
configNew.getAbsolutePath(),
+                            configOld.getAbsolutePath()));
+                }
                 throw new 
IOException(sm.getString("storeFileMover.renameError", 
configNew.getAbsolutePath(),
                         configOld.getAbsolutePath()));
             }
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index 88446b62e7..beb56403f2 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -190,6 +190,10 @@
       <fix>
         Skip BOM when serving files with UTF-32 encoding. (remm)
       </fix>
+      <fix>
+        Mixup of WrapperListener and WrapperLifecycle elements in storeconfig.
+        (remm)
+      </fix>
     </changelog>
   </subsection>
   <subsection name="Coyote">


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

Reply via email to