This is an automated email from the ASF dual-hosted git repository.
rmannibucau pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/johnzon.git
The following commit(s) were added to refs/heads/master by this push:
new 651b38d [JOHNZON-342] avoid too much reflection in
PerHierarchyAndLexicographicalOrderFieldComparator
651b38d is described below
commit 651b38dca544c3d6043a378b22c1c5cd1fe6eec2
Author: Romain Manni-Bucau <[email protected]>
AuthorDate: Fri May 7 20:05:08 2021 +0200
[JOHNZON-342] avoid too much reflection in
PerHierarchyAndLexicographicalOrderFieldComparator
---
.../PerHierarchyAndLexicographicalOrderFieldComparator.java | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git
a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/order/PerHierarchyAndLexicographicalOrderFieldComparator.java
b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/order/PerHierarchyAndLexicographicalOrderFieldComparator.java
index 83f1deb..48948f6 100644
---
a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/order/PerHierarchyAndLexicographicalOrderFieldComparator.java
+++
b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/order/PerHierarchyAndLexicographicalOrderFieldComparator.java
@@ -19,9 +19,12 @@
package org.apache.johnzon.jsonb.order;
import java.util.Comparator;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
public class PerHierarchyAndLexicographicalOrderFieldComparator implements
Comparator<String> {
private final Class<?> clazz;
+ private final Map<String, Integer> distances = new ConcurrentHashMap<>();
public PerHierarchyAndLexicographicalOrderFieldComparator(final Class<?>
clazz) {
this.clazz = clazz;
@@ -29,6 +32,9 @@ public class
PerHierarchyAndLexicographicalOrderFieldComparator implements Compa
@Override
public int compare(final String o1, final String o2) {
+ if (o1.equals(o2)) {
+ return 0;
+ }
final int d1 = distance(o1);
final int d2 = distance(o2);
final int res = d2 - d1; // reversed!
@@ -39,6 +45,10 @@ public class
PerHierarchyAndLexicographicalOrderFieldComparator implements Compa
}
private int distance(final String o1) {
+ return distances.computeIfAbsent(o1, this::slowDistance);
+ }
+
+ private int slowDistance(String o1) {
Class<?> current = clazz;
int i = 0;
while (current != null && current != Object.class) {