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
commit 2bc2bc5c136f00e4a3bdd7c4ba4c1185e6e41f04 Author: opencode <[email protected]> AuthorDate: Tue Sep 29 19:28:23 2026 +0200 Fail with a clear BuildException when a JMX string-to-type conversion is impossible instead of sending the raw String to the server --- .../catalina/ant/jmx/JMXAccessorSetTask.java | 4 ++ .../apache/catalina/ant/jmx/JMXAccessorTask.java | 46 +++++++++------------- .../catalina/ant/jmx/TestJMXAccessorTask.java | 45 +++++++++++++++++++++ 3 files changed, 68 insertions(+), 27 deletions(-) diff --git a/java/org/apache/catalina/ant/jmx/JMXAccessorSetTask.java b/java/org/apache/catalina/ant/jmx/JMXAccessorSetTask.java index 96f1bae2f5..2d69b1fd8b 100644 --- a/java/org/apache/catalina/ant/jmx/JMXAccessorSetTask.java +++ b/java/org/apache/catalina/ant/jmx/JMXAccessorSetTask.java @@ -179,6 +179,10 @@ public class JMXAccessorSetTask extends JMXAccessorTask { } else { if (isConvert()) { String mType = getMBeanAttributeType(jmxServerConnection, name, attribute); + if (mType == null) { + throw new BuildException( + "Attribute '" + attribute + "' not found on MBean '" + name + "' for set"); + } realValue = convertStringToType(value, mType); } else { realValue = value; diff --git a/java/org/apache/catalina/ant/jmx/JMXAccessorTask.java b/java/org/apache/catalina/ant/jmx/JMXAccessorTask.java index 4a80078fde..5e7dd9884f 100644 --- a/java/org/apache/catalina/ant/jmx/JMXAccessorTask.java +++ b/java/org/apache/catalina/ant/jmx/JMXAccessorTask.java @@ -610,65 +610,57 @@ public class JMXAccessorTask extends BaseRedirectorHelperTask { * @param valueType The type * * @return The converted object + * + * @throws BuildException The value cannot be converted to the requested type, or the type is not supported */ protected Object convertStringToType(String value, String valueType) { if ("java.lang.String".equals(valueType)) { return value; } + if (valueType == null) { + throw new BuildException("Unable to convert value '" + value + "': no target type available"); + } - Object convertValue = value; if ("java.lang.Integer".equals(valueType) || "int".equals(valueType)) { try { - convertValue = Integer.valueOf(value); + return Integer.valueOf(value); } catch (NumberFormatException ex) { - if (isEcho()) { - handleErrorOutput("Unable to convert to integer:" + value); - } + throw new BuildException("Unable to convert to integer:" + value, ex); } } else if ("java.lang.Long".equals(valueType) || "long".equals(valueType)) { try { - convertValue = Long.valueOf(value); + return Long.valueOf(value); } catch (NumberFormatException ex) { - if (isEcho()) { - handleErrorOutput("Unable to convert to long:" + value); - } + throw new BuildException("Unable to convert to long:" + value, ex); } } else if ("java.lang.Boolean".equals(valueType) || "boolean".equals(valueType)) { - convertValue = Boolean.valueOf(value); + return Boolean.valueOf(value); } else if ("java.lang.Float".equals(valueType) || "float".equals(valueType)) { try { - convertValue = Float.valueOf(value); + return Float.valueOf(value); } catch (NumberFormatException ex) { - if (isEcho()) { - handleErrorOutput("Unable to convert to float:" + value); - } + throw new BuildException("Unable to convert to float:" + value, ex); } } else if ("java.lang.Double".equals(valueType) || "double".equals(valueType)) { try { - convertValue = Double.valueOf(value); + return Double.valueOf(value); } catch (NumberFormatException ex) { - if (isEcho()) { - handleErrorOutput("Unable to convert to double:" + value); - } + throw new BuildException("Unable to convert to double:" + value, ex); } } else if ("javax.management.ObjectName".equals(valueType) || "name".equals(valueType)) { try { - convertValue = new ObjectName(value); + return new ObjectName(value); } catch (MalformedObjectNameException e) { - if (isEcho()) { - handleErrorOutput("Unable to convert to ObjectName:" + value); - } + throw new BuildException("Unable to convert to ObjectName:" + value, e); } } else if ("java.net.InetAddress".equals(valueType)) { try { - convertValue = InetAddress.getByName(value); + return InetAddress.getByName(value); } catch (UnknownHostException exc) { - if (isEcho()) { - handleErrorOutput("Unable to resolve host name:" + value); - } + throw new BuildException("Unable to resolve host name:" + value, exc); } } - return convertValue; + throw new BuildException("Unsupported conversion type '" + valueType + "' for value '" + value + "'"); } /** diff --git a/test/org/apache/catalina/ant/jmx/TestJMXAccessorTask.java b/test/org/apache/catalina/ant/jmx/TestJMXAccessorTask.java index 3531a52ac6..b7104604d7 100644 --- a/test/org/apache/catalina/ant/jmx/TestJMXAccessorTask.java +++ b/test/org/apache/catalina/ant/jmx/TestJMXAccessorTask.java @@ -27,6 +27,8 @@ import javax.management.openmbean.TabularType; import org.junit.Assert; import org.junit.Test; +import org.apache.tools.ant.BuildException; + public class TestJMXAccessorTask { @Test @@ -44,6 +46,49 @@ public class TestJMXAccessorTask { } + @Test + public void testConvertStringToType() { + JMXAccessorTask task = new JMXAccessorTask(); + + Assert.assertEquals("x", task.convertStringToType("x", "java.lang.String")); + Assert.assertEquals(Integer.valueOf(7), task.convertStringToType("7", "int")); + Assert.assertEquals(Long.valueOf(7), task.convertStringToType("7", "java.lang.Long")); + Assert.assertEquals(Boolean.TRUE, task.convertStringToType("true", "boolean")); + Assert.assertEquals(Double.valueOf(1.5), task.convertStringToType("1.5", "double")); + } + + + @Test + public void testConvertStringToTypeInvalid() { + JMXAccessorTask task = new JMXAccessorTask(); + + assertConvertFails(task, "x", "int"); + assertConvertFails(task, "x", "java.lang.Long"); + assertConvertFails(task, "1.5", "java.lang.Integer"); + assertConvertFails(task, "x", "javax.management.ObjectName"); + } + + + @Test + public void testConvertStringToTypeUnsupportedType() { + JMXAccessorTask task = new JMXAccessorTask(); + + assertConvertFails(task, "x", "java.lang.Int"); + assertConvertFails(task, "x", "java.util.List"); + assertConvertFails(task, "x", null); + } + + + private static void assertConvertFails(JMXAccessorTask task, String value, String type) { + try { + task.convertStringToType(value, type); + Assert.fail("Expected a BuildException for value '" + value + "' and type '" + type + "'"); + } catch (BuildException expected) { + // Expected + } + } + + private static TabularDataSupport createTabularData() throws OpenDataException { CompositeType detailsType = new CompositeType("details", "details", new String[] { "name" }, new String[] { "name" }, new OpenType<?>[] { SimpleType.STRING }); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
