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 {

Reply via email to