]> source.dussan.org Git - jgit.git/commitdiff
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)
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

index 4e27a3d351d9f0603860b6986fecd23dbbf43394..f9f8c856b8085e11185703b2fbffb7e5ad47fd4d 100644 (file)
@@ -23,8 +23,8 @@ import java.nio.file.Files;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
+import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
 
 import org.eclipse.jetty.http.HttpVersion;
 import org.eclipse.jetty.security.AbstractLoginService;
@@ -259,7 +259,7 @@ public class AppServer {
        static class TestMappedLoginService extends AbstractLoginService {
                private String role;
 
-               protected final ConcurrentMap<String, UserPrincipal> users = new ConcurrentHashMap<>();
+               protected final Map<String, UserPrincipal> users = new ConcurrentHashMap<>();
 
                TestMappedLoginService(String role) {
                        this.role = role;
index 2c01c19c590b54d65fcdee05f48cd8072028c811..fdf8b80cd441652998426a9b5670e4c097edef83 100644 (file)
@@ -19,7 +19,6 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
 
 import org.eclipse.jgit.api.errors.GitAPIException;
 import org.eclipse.jgit.api.errors.JGitInternalException;
@@ -202,7 +201,7 @@ public class ArchiveCommand extends GitCommand<OutputStream> {
         * Available archival formats (corresponding to values for
         * the --format= option)
         */
-       private static final ConcurrentMap<String, FormatEntry> formats =
+       private static final Map<String, FormatEntry> formats =
                        new ConcurrentHashMap<>();
 
        /**
@@ -215,7 +214,7 @@ public class ArchiveCommand extends GitCommand<OutputStream> {
         * @param newValue value to be associated with the key (null to remove).
         * @return true if the value was replaced
         */
-       private static <K, V> boolean replace(ConcurrentMap<K, V> map,
+       private static <K, V> boolean replace(Map<K, V> map,
                        K key, V oldValue, V newValue) {
                if (oldValue == null && newValue == null) // Nothing to do.
                        return true;
index 2698e23035d4004886d27a5a2ed287532babf982..1c9e9d7f7103d7efb1e244373b89ec86d090b3ce 100644 (file)
@@ -12,6 +12,7 @@ package org.eclipse.jgit.attributes;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
@@ -23,7 +24,7 @@ import org.eclipse.jgit.lib.Repository;
  * @since 4.6
  */
 public class FilterCommandRegistry {
-       private static ConcurrentHashMap<String, FilterCommandFactory> filterCommandRegistry = new ConcurrentHashMap<>();
+       private static Map<String, FilterCommandFactory> filterCommandRegistry = new ConcurrentHashMap<>();
 
        /**
         * Register a {@link org.eclipse.jgit.attributes.FilterCommandFactory}
index 32c3a1d28f0e82638dcd0784395aeb6de75d37ff..476c37c1c397e8257792d80a067318a102a77151 100644 (file)
 package org.eclipse.jgit.events;
 
 import java.util.List;
+import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.CopyOnWriteArrayList;
 
 /**
  * Manages a thread-safe list of {@link org.eclipse.jgit.events.RepositoryListener}s.
  */
 public class ListenerList {
-       private final ConcurrentMap<Class<? extends RepositoryListener>, CopyOnWriteArrayList<ListenerHandle>> lists = new ConcurrentHashMap<>();
+       private final Map<Class<? extends RepositoryListener>, CopyOnWriteArrayList<ListenerHandle>> lists = new ConcurrentHashMap<>();
 
        /**
         * Register a {@link org.eclipse.jgit.events.WorkingTreeModifiedListener}.
index 2c108de86f3407a1872da061d9894ed326d32eed..c1beb6f41721803e43398b18372bcec7217e09e1 100644 (file)
@@ -14,6 +14,7 @@ import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.ScheduledThreadPoolExecutor;
@@ -193,7 +194,7 @@ public class RepositoryCache {
                cache.configureEviction(repositoryCacheConfig);
        }
 
-       private final ConcurrentHashMap<Key, Repository> cacheMap;
+       private final Map<Key, Repository> cacheMap;
 
        private final Lock[] openLocks;
 
index d7dd3bee521afa5ba62e14b2f564ffee6c84e033..881873de6f947c62216b715e3c675e251bf0f927 100644 (file)
@@ -11,6 +11,7 @@
 package org.eclipse.jgit.nls;
 
 import java.util.Locale;
+import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.eclipse.jgit.errors.TranslationBundleLoadingException;
@@ -110,7 +111,8 @@ public class NLS {
        }
 
        private final Locale locale;
-       private final ConcurrentHashMap<Class, TranslationBundle> map = new ConcurrentHashMap<>();
+
+       private final Map<Class, TranslationBundle> map = new ConcurrentHashMap<>();
 
        private NLS(Locale locale) {
                this.locale = locale;