This is an automated email from the ASF dual-hosted git repository.
rmaucher pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/main by this push:
new 5b89f9ab56 Fix WrapperListener and WrapperLifecycle elements in
storeconfig
5b89f9ab56 is described below
commit 5b89f9ab560f57be7d7d81ea57074db41e3047a8
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 b257859ea3..8f00e6027e 100644
--- a/java/org/apache/catalina/storeconfig/LocalStrings.properties
+++ b/java/org/apache/catalina/storeconfig/LocalStrings.properties
@@ -45,3 +45,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 26eddac83f..b664c3e43b 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -286,6 +286,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]