dependabot[bot] opened a new pull request, #21049: URL: https://github.com/apache/camel/pull/21049
Bumps [com.cedarsoftware:java-util](https://github.com/jdereg/java-util) from 4.84.0 to 4.87.0. <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/jdereg/java-util/blob/master/changelog.md">com.cedarsoftware:java-util's changelog</a>.</em></p> <blockquote> <h4>4.87.0 - 2026-01-26</h4> <ul> <li><strong>BUILD</strong>: Version alignment with json-io 4.87.0 <ul> <li>Keeping java-util and json-io version numbers synchronized simplifies dependency management and ensures compatibility</li> </ul> </li> </ul> <h4>4.86.0 - 2025-01-26</h4> <ul> <li><strong>PERFORMANCE</strong>: <code>CompactMap</code> - Multiple optimizations reducing memory allocation and improving iteration performance <ul> <li>Fixed redundant <code>get()</code> call in <code>entrySet().contains()</code> - now reuses the result instead of calling both <code>get()</code> and <code>containsKey()</code></li> <li>Use <code>getCachedLegacyConstructed()</code> consistently in <code>switchBackingFromMapToArray()</code> instead of calling <code>getClass().getName().endsWith()</code></li> <li>Cache <code>CompactMapComparator</code> instances statically - 4 pre-created comparators for all combinations of case-insensitive and reverse ordering</li> <li>Added <code>isArraySorted()</code> check in <code>quickSort()</code> to skip unnecessary sorting during iteration (common case since binary insertion in <code>put()</code> maintains order)</li> </ul> </li> </ul> <h4>4.85.0 - 2025-01-24</h4> <ul> <li><strong>PERFORMANCE</strong>: <code>ClassUtilities</code> - Lock-free cache operations using CAS-based removal <ul> <li>Replaced synchronized blocks in <code>fromCache()</code>, <code>toCache()</code>, and <code>drainQueue()</code> with <code>ConcurrentHashMap.remove(key, value)</code></li> <li>CAS-based removal only removes if the exact WeakReference is still present, preventing race conditions</li> <li>Eliminates lock contention in high-throughput class loading scenarios</li> </ul> </li> <li><strong>PERFORMANCE</strong>: <code>ClassUtilities</code> - Added cache for assignable type lookups in <code>getArgForType()</code> <ul> <li>New <code>ASSIGNABLE_TYPE_CACHE</code> using <code>ClassValueMap<Optional<Supplier<Object>>></code> avoids repeated O(n) scans of <code>ASSIGNABLE_CLASS_MAPPING</code></li> <li>Uses <code>Optional</code> to distinguish "no match found" (<code>Optional.empty()</code>) from "not yet cached" (<code>null</code>)</li> <li>Improves constructor parameter resolution performance for repeated type lookups</li> </ul> </li> <li><strong>PERFORMANCE</strong>: <code>ClassUtilities</code> - Optimized synthetic parameter name detection <ul> <li>Added <code>isSyntheticArgName()</code> method using efficient string operations instead of regex</li> <li>Avoids <code>Pattern.matcher().matches()</code> overhead for checking "arg0", "arg1", etc. patterns</li> <li>Used in constructor parameter resolution to detect compiler-generated names</li> </ul> </li> <li><strong>PERFORMANCE</strong>: <code>DeepEquals</code> - Replace O(n²) visited set copying with O(1) ScopedSet for unordered collections <ul> <li>Previously, comparing unordered collections copied the entire visited set for each probe element (O(n × k))</li> <li>New <code>ScopedSet</code> wrapper creates a lightweight view with O(1) creation time</li> <li>Tracks local additions separately and discards them when probe completes</li> <li>Significant improvement for comparing large unordered collections/maps with cycles</li> </ul> </li> <li><strong>PERFORMANCE</strong>: <code>DeepEquals</code> - Multiple optimizations reducing per-comparison overhead <ul> <li>Replaced <code>ConcurrentSet</code> with <code>HashSet</code> for visited tracking - no concurrent access occurs</li> <li>Cache system properties at class load time instead of parsing on every call</li> <li>Simplified <code>hashCode()</code> by removing unnecessary <code>finalizeHash()</code> call</li> </ul> </li> <li><strong>IMPROVED</strong>: <code>ConcurrentNavigableSetNullSafe</code> - Changed sentinel from String to Object instance <ul> <li>Previous <code>"null_" + UUID.randomUUID()</code> String could theoretically collide with user data</li> <li>New <code>new Object()</code> sentinel is guaranteed unique and cannot collide</li> <li>Also changed from <code>.equals()</code> to identity comparison (<code>==</code>) for sentinel detection</li> </ul> </li> <li><strong>BUG FIX</strong>: <code>ClassValueMap</code> - Fixed <code>clear()</code> race condition that could leave permanently stale cache entries <ul> <li>Previous order: invalidate cache → clear backingMap (allowed concurrent <code>get()</code> to repopulate cache from still-populated backingMap)</li> <li>Fixed order: snapshot keys → clear backingMap → invalidate cache (ensures any <code>computeValue</code> after clear sees empty map)</li> <li>After <code>clear()</code> completes, all subsequent <code>get()</code> calls now see correct state</li> </ul> </li> <li><strong>BUG FIX</strong>: <code>ConcurrentNavigableMapNullSafe</code> - Fixed <code>ClassCastException</code> on sub-map views <ul> <li>Navigational methods (<code>lowerKey</code>, <code>floorKey</code>, <code>ceilingKey</code>, <code>higherKey</code>, etc.) incorrectly cast to <code>ConcurrentSkipListMap</code></li> <li>Sub-map, head-map, tail-map, and descending-map views are not <code>ConcurrentSkipListMap</code> instances</li> <li>Fixed by casting to <code>ConcurrentNavigableMap</code> instead (the interface that defines these methods)</li> </ul> </li> <li><strong>BUG FIX</strong>: <code>ConcurrentNavigableSetNullSafe</code> - Fixed user comparators that don't handle nulls throwing NPE <ul> <li>Comparators like <code>String.CASE_INSENSITIVE_ORDER</code> would throw NPE when comparing null elements</li> <li>Wrapper now gracefully falls back to default null ordering (nulls > non-nulls) if comparator throws NPE</li> <li>User comparators that handle nulls (via <code>Comparator.nullsFirst/nullsLast</code> or custom handling) still control null ordering</li> </ul> </li> <li><strong>BUILD</strong>: Updated json-io test dependency from 4.83.0 to 4.84.0</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/jdereg/java-util/commit/60d880ffbbc0e5f8e413513b827f1f00b6573576"><code>60d880f</code></a> Bump version to 4.87.0</li> <li><a href="https://github.com/jdereg/java-util/commit/df4457f32988260a8ba6374fc13ec64670016c85"><code>df4457f</code></a> Update json-io test dependency to 4.85.0</li> <li><a href="https://github.com/jdereg/java-util/commit/fdda14259254977aafc90877a119be9e1bc2bffe"><code>fdda142</code></a> Bump version to 4.86.0</li> <li><a href="https://github.com/jdereg/java-util/commit/fab239f02711d832786608709fea6ddf74ca9043"><code>fab239f</code></a> Performance: CompactMap optimizations</li> <li><a href="https://github.com/jdereg/java-util/commit/81651cf28157b215475519e0b5bd83079308b419"><code>81651cf</code></a> Change Benefits and More Utilities headers to blue</li> <li><a href="https://github.com/jdereg/java-util/commit/b76c423c80ab11da36a5aaf87b02194fbd904737"><code>b76c423</code></a> Move java-util logo right, double left margin</li> <li><a href="https://github.com/jdereg/java-util/commit/1ef82953cd1ebe6139037eff4e2b883d9cb5bbf2"><code>1ef8295</code></a> Bump cache version to v=3</li> <li><a href="https://github.com/jdereg/java-util/commit/4580f535d46cfd36f7db1cc87fdcf90ab866ace9"><code>4580f53</code></a> Docs: Reduce vertical spacing, make infographic wider</li> <li><a href="https://github.com/jdereg/java-util/commit/ef2184688d09e0a4d1f267c617aa1e5b9d8f5679"><code>ef21846</code></a> Add cache-busting param to infographic URL</li> <li><a href="https://github.com/jdereg/java-util/commit/f4606450e71ca02b0113bdeae902bbaf6a6c3ce6"><code>f460645</code></a> Docs: Move hero infographic to top, remove badge logo</li> <li>Additional commits viewable in <a href="https://github.com/jdereg/java-util/compare/4.84.0...4.87.0">compare view</a></li> </ul> </details> <br /> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected]
