This is an automated email from the ASF dual-hosted git repository. rmaucher pushed a commit to branch 9.0.x in repository https://gitbox.apache.org/repos/asf/tomcat.git
commit 947c28421c9b3ac6d1662b7745ba93cdb5370ecd 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. --- .../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 +- .../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 ++ 12 files changed, 36 insertions(+), 93 deletions(-) diff --git a/java/org/apache/catalina/storeconfig/ConnectorSF.java b/java/org/apache/catalina/storeconfig/ConnectorSF.java index 1bb513b17a..bc3db8fcb1 100644 --- a/java/org/apache/catalina/storeconfig/ConnectorSF.java +++ b/java/org/apache/catalina/storeconfig/ConnectorSF.java @@ -55,49 +55,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 46a8e59158..e7eb19e251 100644 --- a/java/org/apache/catalina/storeconfig/ConnectorStoreAppender.java +++ b/java/org/apache/catalina/storeconfig/ConnectorStoreAppender.java @@ -151,7 +151,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 11d1f690fb..e39064ad69 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 24d4dedac7..fa67454d0f 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 fb759f9ca4..6ad976c3ce 100644 --- a/java/org/apache/catalina/storeconfig/PersistentManagerSF.java +++ b/java/org/apache/catalina/storeconfig/PersistentManagerSF.java @@ -46,7 +46,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/StandardContextSF.java b/java/org/apache/catalina/storeconfig/StandardContextSF.java index d325147aba..bfc5e7e806 100644 --- a/java/org/apache/catalina/storeconfig/StandardContextSF.java +++ b/java/org/apache/catalina/storeconfig/StandardContextSF.java @@ -245,11 +245,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 52aefb5a8c..c5063b7fb1 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 00412c5bbb..b09ca502bf 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -182,6 +182,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]
