]> source.dussan.org Git - jgit.git/commit
Use Map interface instead of ConcurrentHashMap class 51/174151/2
authorThomas Wolf <thomas.wolf@paranor.ch>
Wed, 30 Dec 2020 16:17:44 +0000 (17:17 +0100)
committerMatthias Sohn <matthias.sohn@sap.com>
Fri, 1 Jan 2021 17:49:05 +0000 (12:49 -0500)
commit0f442d70836ee292ed916605448f806cc7d1fe78
tree385934b067f392c40b645d46ecc94101815b53ac
parent5b1a6e0e382da62e8678afdb2524109efb38eeb4
Use Map interface instead of ConcurrentHashMap class

On Android, the co-variant override of ConcurrentHashMap.keySet()
introduced in Java 8 was undone. [1] If compiled Java code calls that
co-variant override directly, one gets a NoSuchMethodError exception
at run-time on Android.

Making the code call that method via Map.keySet() side-steps this
problem.

This is similar to bug 496262, where the same problem cropped up when
compiling with Java 8 against a Java 7 target, but here we cannot use
bootclasspath. We build against Java 8, not against the Android version
of it.

Recent Android versions should have some bytecode "magic" that adds the
co-variant override in bytecode (see the commit referenced in [1]), but
on older Android version this problem may still occur. (Or perhaps the
"magic" is ineffective...) There are two pull requests on Github for
this problem, both from 2020, [2][3] while the Android commit [1] is
from March 2018. Apparently people still occasionally run into this
problem in the wild.

[1] https://android.googlesource.com/platform/libcore/+/0e8b937ded4de39f1d1cea5f04800d67dd2ec570/ojluni/src/main/java/java/util/concurrent/ConcurrentHashMap.java#1244
[2] https://github.com/eclipse/jgit/pull/104
[3] https://github.com/eclipse/jgit/pull/100

Change-Id: I7c07e0cc59871cb7fe60795e22867827fa9c2458
Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
org.eclipse.jgit.junit.http/src/org/eclipse/jgit/junit/http/AppServer.java
org.eclipse.jgit/src/org/eclipse/jgit/api/ArchiveCommand.java
org.eclipse.jgit/src/org/eclipse/jgit/attributes/FilterCommandRegistry.java
org.eclipse.jgit/src/org/eclipse/jgit/events/ListenerList.java
org.eclipse.jgit/src/org/eclipse/jgit/lib/RepositoryCache.java
org.eclipse.jgit/src/org/eclipse/jgit/nls/NLS.java