From 58b71733c7e08de996fa0985efa369f47ca91575 Mon Sep 17 00:00:00 2001 From: Shanmuganathan R Date: Mon, 22 Jun 2026 12:58:04 +0530 Subject: [PATCH 1/3] TC-110123: Replace JAXB DatatypeConverter with JDK DatatypeFactory (Java 11+ fix) --- .../jenkins/plugins/testcomplete/Utils.java | 13 +++++++++++++ .../plugins/testcomplete/parser/LogNodeUtils.java | 3 +-- .../plugins/testcomplete/parser/LogParser.java | 3 +-- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/smartbear/jenkins/plugins/testcomplete/Utils.java b/src/main/java/com/smartbear/jenkins/plugins/testcomplete/Utils.java index a8ebe36..eb0a04f 100644 --- a/src/main/java/com/smartbear/jenkins/plugins/testcomplete/Utils.java +++ b/src/main/java/com/smartbear/jenkins/plugins/testcomplete/Utils.java @@ -33,6 +33,8 @@ import org.jenkinsci.remoting.RoleChecker; import javax.crypto.Cipher; +import javax.xml.datatype.DatatypeConfigurationException; +import javax.xml.datatype.DatatypeFactory; import java.lang.ref.WeakReference; import java.security.Key; import java.security.KeyFactory; @@ -178,6 +180,17 @@ private static long OLEDateToMillis(double dSerialDate) return (long) ((dSerialDate - 25569) * 24 * 3600 * 1000); } + public static String printDateTime(Calendar cal) { + GregorianCalendar gc = new GregorianCalendar(); + gc.setTimeZone(cal.getTimeZone()); + gc.setTimeInMillis(cal.getTimeInMillis()); + try { + return DatatypeFactory.newInstance().newXMLGregorianCalendar(gc).toXMLFormat(); + } catch (DatatypeConfigurationException e) { + throw new RuntimeException(e); + } + } + static String encryptPassword(String password) throws Exception { byte[] keyRawData = Base64.getDecoder().decode(PUBLIC_KEY); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); diff --git a/src/main/java/com/smartbear/jenkins/plugins/testcomplete/parser/LogNodeUtils.java b/src/main/java/com/smartbear/jenkins/plugins/testcomplete/parser/LogNodeUtils.java index ba93a2a..5e2151b 100644 --- a/src/main/java/com/smartbear/jenkins/plugins/testcomplete/parser/LogNodeUtils.java +++ b/src/main/java/com/smartbear/jenkins/plugins/testcomplete/parser/LogNodeUtils.java @@ -28,7 +28,6 @@ import org.w3c.dom.*; import org.xml.sax.SAXException; -import javax.xml.bind.DatatypeConverter; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; @@ -422,7 +421,7 @@ static public String startTimeToTimestamp(String startTime) { long startDate = Utils.safeConvertDate(startTime); Calendar cal = new GregorianCalendar(); cal.setTimeInMillis(startDate); - return DatatypeConverter.printDateTime(cal); + return Utils.printDateTime(cal); } } diff --git a/src/main/java/com/smartbear/jenkins/plugins/testcomplete/parser/LogParser.java b/src/main/java/com/smartbear/jenkins/plugins/testcomplete/parser/LogParser.java index a712cbc..6b48015 100644 --- a/src/main/java/com/smartbear/jenkins/plugins/testcomplete/parser/LogParser.java +++ b/src/main/java/com/smartbear/jenkins/plugins/testcomplete/parser/LogParser.java @@ -32,7 +32,6 @@ import org.apache.commons.lang.StringUtils; import org.w3c.dom.*; -import javax.xml.bind.DatatypeConverter; import javax.xml.stream.*; import java.io.IOException; @@ -283,7 +282,7 @@ private void processProject(ZipFile logArchive, Node rootOwnerNode, Node rootOwn String projectName = LogNodeUtils.getTextProperty(rootOwnerNodeInfoSummary, "test"); Calendar cal = new GregorianCalendar(); cal.setTimeInMillis(startDate); - String timestamp = DatatypeConverter.printDateTime(cal); + String timestamp = Utils.printDateTime(cal); String rootOwnerNodeFileName = LogNodeUtils.getTextProperty(rootOwnerNode, "filename"); if (rootOwnerNodeFileName == null || rootOwnerNodeFileName.isEmpty()) { From 11c8b4a5a40be3e5731d161c688880f7e70ce2ff Mon Sep 17 00:00:00 2001 From: Shanmuganathan R Date: Mon, 22 Jun 2026 17:15:52 +0530 Subject: [PATCH 2/3] TC-110123 Added exception message --- .../java/com/smartbear/jenkins/plugins/testcomplete/Utils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/smartbear/jenkins/plugins/testcomplete/Utils.java b/src/main/java/com/smartbear/jenkins/plugins/testcomplete/Utils.java index eb0a04f..31c0c0b 100644 --- a/src/main/java/com/smartbear/jenkins/plugins/testcomplete/Utils.java +++ b/src/main/java/com/smartbear/jenkins/plugins/testcomplete/Utils.java @@ -187,7 +187,7 @@ public static String printDateTime(Calendar cal) { try { return DatatypeFactory.newInstance().newXMLGregorianCalendar(gc).toXMLFormat(); } catch (DatatypeConfigurationException e) { - throw new RuntimeException(e); + throw new IllegalStateException("Failed to obtain a DatatypeFactory instance for XML date/time conversion", e); } } From e5fc43673ed7df70bf05afaa60ebc4371a3aff18 Mon Sep 17 00:00:00 2001 From: Shanmuganathan R Date: Mon, 22 Jun 2026 20:15:59 +0530 Subject: [PATCH 3/3] TC-110123 single initialization --- .../jenkins/plugins/testcomplete/Utils.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/smartbear/jenkins/plugins/testcomplete/Utils.java b/src/main/java/com/smartbear/jenkins/plugins/testcomplete/Utils.java index 31c0c0b..d0c9be5 100644 --- a/src/main/java/com/smartbear/jenkins/plugins/testcomplete/Utils.java +++ b/src/main/java/com/smartbear/jenkins/plugins/testcomplete/Utils.java @@ -55,6 +55,16 @@ public class Utils { private static final int ENC_CHUNK_MAX_SIZE = 116; + private static final DatatypeFactory XML_DATATYPE_FACTORY = createXmlDatatypeFactory(); + + private static DatatypeFactory createXmlDatatypeFactory() { + try { + return DatatypeFactory.newInstance(); + } catch (DatatypeConfigurationException e) { + throw new IllegalStateException("Failed to obtain a DatatypeFactory instance for XML date/time conversion", e); + } + } + private Utils() { } @@ -184,13 +194,9 @@ public static String printDateTime(Calendar cal) { GregorianCalendar gc = new GregorianCalendar(); gc.setTimeZone(cal.getTimeZone()); gc.setTimeInMillis(cal.getTimeInMillis()); - try { - return DatatypeFactory.newInstance().newXMLGregorianCalendar(gc).toXMLFormat(); - } catch (DatatypeConfigurationException e) { - throw new IllegalStateException("Failed to obtain a DatatypeFactory instance for XML date/time conversion", e); - } + return XML_DATATYPE_FACTORY.newXMLGregorianCalendar(gc).toXMLFormat(); } - + static String encryptPassword(String password) throws Exception { byte[] keyRawData = Base64.getDecoder().decode(PUBLIC_KEY); KeyFactory keyFactory = KeyFactory.getInstance("RSA");