Added GECacheKey.toString() to allow debugging hashcode/equals problems 25/3725/2
authorTuukka Lehtonen <tuukka.lehtonen@semantum.fi>
Thu, 19 Dec 2019 10:35:40 +0000 (12:35 +0200)
committerTuukka Lehtonen <tuukka.lehtonen@semantum.fi>
Thu, 19 Dec 2019 10:37:29 +0000 (12:37 +0200)
gitlab #312

Change-Id: I1a719581210c4587336df4e371f6dacb38c949c8

bundles/org.simantics.browsing.ui.common/src/org/simantics/browsing/ui/common/internal/GECache.java

index 014a5c0d54b37c0fbd06810137ca04b83a9f88f9..bdc0e16a04920de2029da3f919fa118e293a8c89 100644 (file)
@@ -24,38 +24,38 @@ import org.simantics.browsing.ui.NodeContext.CacheKey;
 
 public class GECache implements IGECache {
 
-    final Map<GECacheKey, IGECacheEntry> entries = new THashMap<GECacheKey, IGECacheEntry>();
-    final Map<GECacheKey, Set<UIElementReference>> treeReferences = new THashMap<GECacheKey, Set<UIElementReference>>();
+    final Map<GECacheKey, IGECacheEntry> entries = new THashMap<>();
+    final Map<GECacheKey, Set<UIElementReference>> treeReferences = new THashMap<>();
 
     final private static class GECacheKey {
 
         private NodeContext context;
         private CacheKey<?> key;
+        private int hash;
 
         GECacheKey(NodeContext context, CacheKey<?> key) {
-            this.context = context;
-            this.key = key;
-            if (context == null || key == null) 
-               throw new IllegalArgumentException("Null context or key is not accepted");
+            setValues(context, key);
         }
 
         GECacheKey(GECacheKey other) {
-            this.context = other.context;
-            this.key = other.key;
-            if (context == null || key == null) 
-               throw new IllegalArgumentException("Null context or key is not accepted");
+            setValues(other.context, other.key);
         }
 
         void setValues(NodeContext context, CacheKey<?> key) {
+            if (context == null || key == null) 
+                throw new IllegalArgumentException("Null context or key is not accepted");
             this.context = context;
             this.key = key;
-            if (context == null || key == null) 
-               throw new IllegalArgumentException("Null context or key is not accepted");
+            this.hash = calcHash();
+        }
+
+        private int calcHash() {
+            return (31 * context.hashCode()) + key.hashCode();
         }
 
         @Override
         public int hashCode() {
-            return context.hashCode() | key.hashCode();
+            return hash;
         }
 
         @Override
@@ -74,6 +74,11 @@ public class GECache implements IGECache {
 
         }
 
+        @Override
+        public String toString() {
+            return String.format("%s@%d [key=%s, context=%s]", getClass().getSimpleName(), System.identityHashCode(this), key, context); //$NON-NLS-1$
+        }
+
     };
 
     /**
@@ -116,9 +121,7 @@ public class GECache implements IGECache {
     public <T> T get(NodeContext context, CacheKey<T> key) {
         getKey.setValues(context, key);
         IGECacheEntry entry = entries.get(getKey);
-        if (entry == null)
-            return null;
-        return (T) entry.getValue();
+        return entry != null ? (T) entry.getValue() : null;
     }
 
     @Override
@@ -171,7 +174,7 @@ public class GECache implements IGECache {
        return references.get(context) > 0;
     }
 
-    private TObjectIntHashMap<NodeContext> references = new TObjectIntHashMap<NodeContext>();
+    private TObjectIntHashMap<NodeContext> references = new TObjectIntHashMap<>();
     
     @Override
     synchronized public void incRef(NodeContext context) {