From 7b0d1942b4c172361475bd92c197eea1f13ae5ce Mon Sep 17 00:00:00 2001 From: Sean Leary Date: Thu, 3 Jul 2025 20:39:13 -0500 Subject: [PATCH] tech-debt-25250701 add jacoco to gradle build, refactor JSONObject to restore performance --- build.gradle | 14 +++++++- src/main/java/org/json/JSONObject.java | 44 ++++++++++++-------------- 2 files changed, 34 insertions(+), 24 deletions(-) diff --git a/build.gradle b/build.gradle index 7291bf1d5..6dcdca6fc 100644 --- a/build.gradle +++ b/build.gradle @@ -3,9 +3,10 @@ */ apply plugin: 'java' apply plugin: 'eclipse' -// apply plugin: 'jacoco' +apply plugin: 'jacoco' apply plugin: 'maven-publish' +// for now, publishing to maven is still a manual process //plugins { // id 'java' //id 'maven-publish' @@ -19,6 +20,17 @@ repositories { } } +// To view the report open build/reports/jacoco/test/html/index.html +jacocoTestReport { + reports { + html.required = true + } +} + +test { + finalizedBy jacocoTestReport +} + dependencies { testImplementation 'junit:junit:4.13.2' testImplementation 'com.jayway.jsonpath:json-path:2.9.0' diff --git a/src/main/java/org/json/JSONObject.java b/src/main/java/org/json/JSONObject.java index 99b256bed..b5045192a 100644 --- a/src/main/java/org/json/JSONObject.java +++ b/src/main/java/org/json/JSONObject.java @@ -1780,30 +1780,32 @@ private void populateMap(Object bean, Set objectsRecord, JSONParserConfi Method[] methods = includeSuperClass ? klass.getMethods() : klass.getDeclaredMethods(); for (final Method method : methods) { - final String key = getKeyNameFromMethod(method); - if (key != null && !key.isEmpty()) { - try { - final Object result = method.invoke(bean); - if (result != null || jsonParserConfiguration.isUseNativeNulls()) { - // check cyclic dependency and throw error if needed - // the wrap and populateMap combination method is - // itself DFS recursive - if (objectsRecord.contains(result)) { - throw recursivelyDefinedObjectException(key); - } + if (isValidMethod(method)) { + final String key = getKeyNameFromMethod(method); + if (key != null && !key.isEmpty()) { + try { + final Object result = method.invoke(bean); + if (result != null || jsonParserConfiguration.isUseNativeNulls()) { + // check cyclic dependency and throw error if needed + // the wrap and populateMap combination method is + // itself DFS recursive + if (objectsRecord.contains(result)) { + throw recursivelyDefinedObjectException(key); + } - objectsRecord.add(result); + objectsRecord.add(result); - testValidity(result); - this.map.put(key, wrap(result, objectsRecord)); + testValidity(result); + this.map.put(key, wrap(result, objectsRecord)); - objectsRecord.remove(result); + objectsRecord.remove(result); - closeClosable(result); + closeClosable(result); + } + } catch (IllegalAccessException ignore) { + } catch (IllegalArgumentException ignore) { + } catch (InvocationTargetException ignore) { } - } catch (IllegalAccessException ignore) { - } catch (IllegalArgumentException ignore) { - } catch (InvocationTargetException ignore) { } } } @@ -1814,10 +1816,6 @@ private static boolean isValidMethodName(String name) { } private static String getKeyNameFromMethod(Method method) { - if (!isValidMethod(method)) { - return null; - } - final int ignoreDepth = getAnnotationDepth(method, JSONPropertyIgnore.class); if (ignoreDepth > 0) { final int forcedNameDepth = getAnnotationDepth(method, JSONPropertyName.class);