This is an automated email from the ASF dual-hosted git repository. coheigea pushed a commit to branch coheigea/boolean in repository https://gitbox.apache.org/repos/asf/cxf-xjc-utils.git
commit de281d50d05c62a7b3ff52702d141edcfca6b752 Author: Colm O hEigeartaigh <[email protected]> AuthorDate: Tue Oct 27 08:05:40 2026 +0000 Fix default value parsing in DefaultValuePlugin and report forked XJC errors --- .../java/org/apache/cxf/maven_plugin/XSDToJavaRunner.java | 10 +++++++++- .../test/java/org/apache/cxf/xjc/dv/DefaultValueTest.java | 12 ++++++++++++ dv-test/src/test/resources/schemas/configuration/foo.xsd | 6 ++++++ .../java/org/apache/cxf/xjc/dv/DefaultValuePlugin.java | 14 ++++++++------ 4 files changed, 35 insertions(+), 7 deletions(-) diff --git a/cxf-xjc-plugin/src/main/java/org/apache/cxf/maven_plugin/XSDToJavaRunner.java b/cxf-xjc-plugin/src/main/java/org/apache/cxf/maven_plugin/XSDToJavaRunner.java index 6a41f28..1b4f452 100644 --- a/cxf-xjc-plugin/src/main/java/org/apache/cxf/maven_plugin/XSDToJavaRunner.java +++ b/cxf-xjc-plugin/src/main/java/org/apache/cxf/maven_plugin/XSDToJavaRunner.java @@ -469,7 +469,15 @@ public class XSDToJavaRunner { if (outputFile == null) { outputFile = new File(args[args.length - 1]); } - int i = new XSDToJavaRunner(args, listener, outputFile, cplist).run(); + int i; + try { + i = new XSDToJavaRunner(args, listener, outputFile, cplist).run(); + } catch (Throwable t) { + // e.g. an XJC plugin failing while generating code: report it through the listener, as + // AbstractXSDToJavaMojo only picks up the escaped message lines from this process + listener.error("Failed to generate code", t instanceof Exception ? (Exception)t : new Exception(t)); + i = -1; + } System.exit(i); } diff --git a/dv-test/src/test/java/org/apache/cxf/xjc/dv/DefaultValueTest.java b/dv-test/src/test/java/org/apache/cxf/xjc/dv/DefaultValueTest.java index 7846f96..20818a5 100644 --- a/dv-test/src/test/java/org/apache/cxf/xjc/dv/DefaultValueTest.java +++ b/dv-test/src/test/java/org/apache/cxf/xjc/dv/DefaultValueTest.java @@ -68,6 +68,8 @@ public class DefaultValueTest extends Assert { "hello", foo.getStringAttr()); assertTrue("Unexpected value for attribute booleanAttr", foo.isBooleanAttr()); + assertTrue("Unexpected value for attribute booleanNumericAttr", + foo.isBooleanNumericAttr()); assertEquals("Unexpected value for attribute integerAttr", new BigInteger("111"), foo.getIntegerAttr()); assertEquals("Unexpected value for attribute intAttr", @@ -82,6 +84,10 @@ public class DefaultValueTest extends Assert { 116F, foo.getFloatAttr(), 0F); assertEquals("Unexpected value for attribute doubleAttr", 117D, foo.getDoubleAttr(), 0D); + assertEquals("Unexpected value for attribute floatInfAttr", + Float.POSITIVE_INFINITY, foo.getFloatInfAttr(), 0F); + assertTrue("Unexpected value for attribute doubleNaNAttr", + Double.isNaN(foo.getDoubleNaNAttr())); assertEquals("Unexpected value for attribute byteAttr", 118, foo.getByteAttr()); @@ -175,6 +181,8 @@ public class DefaultValueTest extends Assert { "hello", foo.getStringElem()); assertTrue("Unexpected value for element booleanElem", foo.isBooleanElem()); + assertTrue("Unexpected value for element booleanNumericElem", + foo.isBooleanNumericElem()); assertEquals("Unexpected value for element integerElem", new BigInteger("11"), foo.getIntegerElem()); assertEquals("Unexpected value for element intElem", @@ -189,6 +197,10 @@ public class DefaultValueTest extends Assert { 16F, foo.getFloatElem(), 0F); assertEquals("Unexpected value for element doubleElem", 17D, foo.getDoubleElem(), 0D); + assertTrue("Unexpected value for element floatNaNElem", + Float.isNaN(foo.getFloatNaNElem())); + assertEquals("Unexpected value for element doubleInfElem", + Double.NEGATIVE_INFINITY, foo.getDoubleInfElem(), 0D); assertEquals("Unexpected value for element byteElem", (byte)18, foo.getByteElem().byteValue()); diff --git a/dv-test/src/test/resources/schemas/configuration/foo.xsd b/dv-test/src/test/resources/schemas/configuration/foo.xsd index dfa9b2b..eec4c05 100644 --- a/dv-test/src/test/resources/schemas/configuration/foo.xsd +++ b/dv-test/src/test/resources/schemas/configuration/foo.xsd @@ -55,6 +55,7 @@ <xs:element name="driving" type="tns:drivingDecision" default="LeftTurn" minOccurs="0"></xs:element> <xs:element name="StringElem" type="xs:string" default="hello" minOccurs="0"></xs:element> <xs:element name="BooleanElem" type="xs:boolean" default="true" minOccurs="0"></xs:element> + <xs:element name="booleanNumericElem" type="xs:boolean" default="1" minOccurs="0"></xs:element> <xs:element name="IntegerElem" type="xs:integer" default="11" minOccurs="0"></xs:element> <xs:element name="intElem" type="xs:int" default="12" minOccurs="0"></xs:element> <xs:element name="longElem" type="xs:long" default="13" minOccurs="0"></xs:element> @@ -62,6 +63,8 @@ <xs:element name="decimalElem" type="xs:decimal" default="15" minOccurs="0"></xs:element> <xs:element name="floatElem" type="xs:float" default="16" minOccurs="0"></xs:element> <xs:element name="doubleElem" type="xs:double" default="17" minOccurs="0"></xs:element> + <xs:element name="floatNaNElem" type="xs:float" default="NaN" minOccurs="0"></xs:element> + <xs:element name="doubleInfElem" type="xs:double" default="-INF" minOccurs="0"></xs:element> <xs:element name="byteElem" type="xs:byte" default="18" minOccurs="0"></xs:element> <xs:element name="qnameElem" type="xs:QName" default="xs:string" minOccurs="0"></xs:element> <xs:element name="base64BinaryElem" type="xs:base64Binary" default="abcdefgh" minOccurs="0"></xs:element> @@ -89,6 +92,7 @@ <xs:attribute name="stringAttr" type="xs:string" default="hello"/> <xs:attribute name="booleanAttr" type="xs:boolean" default="true"/> + <xs:attribute name="booleanNumericAttr" type="xs:boolean" default="1"/> <xs:attribute name="integerAttr" type="xs:integer" default="111"/> <xs:attribute name="intAttr" type="xs:int" default="112"/> <xs:attribute name="longAttr" type="xs:long" default="113"/> @@ -96,6 +100,8 @@ <xs:attribute name="decimalAttr" type="xs:decimal" default="115"/> <xs:attribute name="floatAttr" type="xs:float" default="116"/> <xs:attribute name="doubleAttr" type="xs:double" default="117"/> + <xs:attribute name="floatInfAttr" type="xs:float" default="INF"/> + <xs:attribute name="doubleNaNAttr" type="xs:double" default="NaN"/> <xs:attribute name="byteAttr" type="xs:byte" default="118"/> <xs:attribute name="qnameAttr" type="xs:QName" default="xs:schema"/> <xs:attribute name="base64BinaryAttr" type="xs:base64Binary" default="wxyz"/> diff --git a/dv/src/main/java/org/apache/cxf/xjc/dv/DefaultValuePlugin.java b/dv/src/main/java/org/apache/cxf/xjc/dv/DefaultValuePlugin.java index 6464705..f1ec49b 100644 --- a/dv/src/main/java/org/apache/cxf/xjc/dv/DefaultValuePlugin.java +++ b/dv/src/main/java/org/apache/cxf/xjc/dv/DefaultValuePlugin.java @@ -426,17 +426,19 @@ public class DefaultValuePlugin { JExpression dv = null; + // booleans and floating point values are parsed as defined by XML Schema, which allows + // e.g. "1" for true and "INF" or "NaN" for a double, unlike Boolean or Double.parseDouble if ("java.lang.Boolean".equals(typeName) && isElement) { - dv = JExpr.direct(Boolean.valueOf(defaultValue) ? "Boolean.TRUE" : "Boolean.FALSE"); + dv = JExpr.direct(DatatypeConverter.parseBoolean(defaultValue) ? "Boolean.TRUE" : "Boolean.FALSE"); } else if ("java.lang.Byte".equals(typeName) && isElement) { dv = ((JClass) type).staticInvoke("valueOf") .arg(JExpr.cast(type.unboxify(), JExpr.lit(Byte.parseByte(defaultValue)))); } else if ("java.lang.Double".equals(typeName) && isElement) { dv = ((JClass) type).staticInvoke("valueOf") - .arg(JExpr.lit(Double.parseDouble(defaultValue))); + .arg(JExpr.lit(DatatypeConverter.parseDouble(defaultValue))); } else if ("java.lang.Float".equals(typeName) && isElement) { dv = ((JClass) type).staticInvoke("valueOf") - .arg(JExpr.lit(Float.parseFloat(defaultValue))); + .arg(JExpr.lit(DatatypeConverter.parseFloat(defaultValue))); } else if ("java.lang.Integer".equals(typeName) && isElement) { dv = ((JClass) type).staticInvoke("valueOf") .arg(JExpr.lit(Integer.parseInt(defaultValue))); @@ -486,11 +488,11 @@ public class DefaultValuePlugin { } else if ("short".equals(typeName)) { dv = JExpr.lit(Short.parseShort(defaultValue)); } else if ("boolean".equals(typeName)) { - dv = JExpr.lit(Boolean.parseBoolean(defaultValue)); + dv = JExpr.lit(DatatypeConverter.parseBoolean(defaultValue)); } else if ("double".equals(typeName)) { - dv = JExpr.lit(Double.parseDouble(defaultValue)); + dv = JExpr.lit(DatatypeConverter.parseDouble(defaultValue)); } else if ("float".equals(typeName)) { - dv = JExpr.lit(Float.parseFloat(defaultValue)); + dv = JExpr.lit(DatatypeConverter.parseFloat(defaultValue)); } else if ("byte".equals(typeName)) { dv = JExpr.lit(Byte.parseByte(defaultValue)); } else {
