Skip to content

Commit 4440730

Browse files
committed
fix AXIS2-6041 (totalDigits Facet of XSD type short incorrectly treated in databinding)
This change builds on commit bb10ab2, which fixed `compare(BigInteger, String)` for AXIS2-5724, to fix the other variations for `int`, `long`, and `short`. These variations seem to be invoked by the generated Java code when using different base types, such as the following: <xsd:simpleType name="MyType"> <xsd:restriction base="xsd:int"> <xsd:totalDigits value="1"/> </xsd:restriction> </xsd:simpleType> This change also adds test cases for the variations.
1 parent 4145b18 commit 4440730

File tree

2 files changed

+66
-5
lines changed

2 files changed

+66
-5
lines changed

modules/adb/src/org/apache/axis2/databinding/utils/ConverterUtil.java

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1289,9 +1289,14 @@ public static List toList(Object[] array) {
12891289
* @return 0 if equal , + value if greater than , - value if less than
12901290
*/
12911291
public static int compare(int intValue, String value) {
1292-
int other = Integer.parseInt(value);
1293-
return intValue < other ? -1 : (intValue == other ? 0 : 1);
1294-
1292+
int param;
1293+
try {
1294+
NumberFormat nf = NumberFormat.getInstance();
1295+
param = nf.parse(value).intValue();
1296+
} catch (Exception e) {
1297+
throw new ObjectConversionException(e);
1298+
}
1299+
return intValue < param ? -1 : (intValue == param ? 0 : 1);
12951300
}
12961301

12971302
/**
@@ -1319,7 +1324,14 @@ public static float compare(float floatValue, String value) {
13191324
* @return 0 if equal , + value if greater than , - value if less than
13201325
*/
13211326
public static long compare(long longValue, String value) {
1322-
return longValue - Long.parseLong(value);
1327+
long param;
1328+
try {
1329+
NumberFormat nf = NumberFormat.getInstance();
1330+
param = nf.parse(value).longValue();
1331+
} catch (Exception e) {
1332+
throw new ObjectConversionException(e);
1333+
}
1334+
return longValue - param;
13231335
}
13241336

13251337
/**
@@ -1328,7 +1340,14 @@ public static long compare(long longValue, String value) {
13281340
* @return 0 if equal , + value if greater than , - value if less than
13291341
*/
13301342
public static int compare(short shortValue, String value) {
1331-
return shortValue - Short.parseShort(value);
1343+
short param;
1344+
try {
1345+
NumberFormat nf = NumberFormat.getInstance();
1346+
param = nf.parse(value).shortValue();
1347+
} catch (Exception e) {
1348+
throw new ObjectConversionException(e);
1349+
}
1350+
return shortValue - param;
13321351
}
13331352

13341353
/**

modules/adb/test/org/apache/axis2/databinding/utils/ConverterUtilTest.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -583,4 +583,46 @@ public void testCompareBigIntegerValueIsGreaterThanOrEqualToTotalDigitsFacetRest
583583
long result = ConverterUtil.compare(value, decimalNotationString);
584584
assertThat(result).isGreaterThanOrEqualTo(0L);
585585
}
586+
587+
public void testCompareLongIsLessThanTotalDigitsFacetRestriction() {
588+
long value = 1L;
589+
String totalDigitsFromXsd = "1";
590+
String decimalNotationString = ConverterUtil.convertToStandardDecimalNotation(totalDigitsFromXsd).toPlainString();
591+
assertThat(ConverterUtil.compare(value, decimalNotationString)).isLessThan(0L);
592+
}
593+
594+
public void testCompareLongIsGreaterThanOrEqualToTotalDigitsFacetRestriction() {
595+
long value = 10L;
596+
String totalDigitsFromXsd = "1";
597+
String decimalNotationString = ConverterUtil.convertToStandardDecimalNotation(totalDigitsFromXsd).toPlainString();
598+
assertThat(ConverterUtil.compare(value, decimalNotationString)).isGreaterThanOrEqualTo(0L);
599+
}
600+
601+
public void testCompareIntIsLessThanTotalDigitsFacetRestriction() {
602+
int value = 1;
603+
String totalDigitsFromXsd = "1";
604+
String decimalNotationString = ConverterUtil.convertToStandardDecimalNotation(totalDigitsFromXsd).toPlainString();
605+
assertThat(ConverterUtil.compare(value, decimalNotationString)).isLessThan(0);
606+
}
607+
608+
public void testCompareIntIsGreaterThanOrEqualToTotalDigitsFacetRestriction() {
609+
int value = 10;
610+
String totalDigitsFromXsd = "1";
611+
String decimalNotationString = ConverterUtil.convertToStandardDecimalNotation(totalDigitsFromXsd).toPlainString();
612+
assertThat(ConverterUtil.compare(value, decimalNotationString)).isGreaterThanOrEqualTo(0);
613+
}
614+
615+
public void testCompareShortIsLessThanTotalDigitsFacetRestriction() {
616+
short value = 1;
617+
String totalDigitsFromXsd = "1";
618+
String decimalNotationString = ConverterUtil.convertToStandardDecimalNotation(totalDigitsFromXsd).toPlainString();
619+
assertThat(ConverterUtil.compare(value, decimalNotationString)).isLessThan(0);
620+
}
621+
622+
public void testCompareShortIsGreaterThanOrEqualToTotalDigitsFacetRestriction() {
623+
short value = 10;
624+
String totalDigitsFromXsd = "1";
625+
String decimalNotationString = ConverterUtil.convertToStandardDecimalNotation(totalDigitsFromXsd).toPlainString();
626+
assertThat(ConverterUtil.compare(value, decimalNotationString)).isGreaterThanOrEqualTo(0);
627+
}
586628
}

0 commit comments

Comments
 (0)