svn commit: r1695126 [6/22] - in /ofbiz/trunk: applications/accounting/src/org/ofbiz/accounting/thirdparty/authorizedotnet/ applications/accounting/src/org/ofbiz/accounting/thirdparty/securepay/ applications/content/src/org/ofbiz/content/webapp/ftl/ ap...

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

svn commit: r1695126 [6/22] - in /ofbiz/trunk: applications/accounting/src/org/ofbiz/accounting/thirdparty/authorizedotnet/ applications/accounting/src/org/ofbiz/accounting/thirdparty/securepay/ applications/content/src/org/ofbiz/content/webapp/ftl/ ap...

jleroux@apache.org
Modified: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/cache/test/UtilCacheTests.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/util/cache/test/UtilCacheTests.java?rev=1695126&r1=1695125&r2=1695126&view=diff
==============================================================================
--- ofbiz/trunk/framework/base/src/org/ofbiz/base/util/cache/test/UtilCacheTests.java (original)
+++ ofbiz/trunk/framework/base/src/org/ofbiz/base/util/cache/test/UtilCacheTests.java Mon Aug 10 16:15:37 2015
@@ -1,436 +1,436 @@
-/*******************************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *******************************************************************************/
-package org.ofbiz.base.util.cache.test;
-
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.greaterThan;
-
-import java.io.Serializable;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import org.ofbiz.base.test.GenericTestCaseBase;
-import org.ofbiz.base.util.UtilMisc;
-import org.ofbiz.base.util.UtilObject;
-import org.ofbiz.base.util.cache.CacheListener;
-import org.ofbiz.base.util.cache.UtilCache;
-
-@SuppressWarnings("serial")
-public class UtilCacheTests extends GenericTestCaseBase implements Serializable {
-    public static final String module = UtilCacheTests.class.getName();
-
-    protected static abstract class Change<V> {
-        protected int count = 1;
-    }
-
-    protected static final class Removal<V> extends Change<V> {
-        protected final V oldValue;
-
-        protected Removal(V oldValue) {
-            this.oldValue = oldValue;
-        }
-
-        @Override
-        public int hashCode() {
-            return UtilObject.doHashCode(oldValue);
-        }
-
-        @Override
-        public boolean equals(Object o) {
-            if (o instanceof Removal<?>) {
-                Removal<?> other = (Removal<?>) o;
-                return UtilObject.equalsHelper(oldValue, other.oldValue);
-            }
-            return false;
-        }
-    }
-
-    protected static final class Addition<V> extends Change<V> {
-        protected final V newValue;
-
-        protected Addition(V newValue) {
-            this.newValue = newValue;
-        }
-
-        @Override
-        public int hashCode() {
-            return UtilObject.doHashCode(newValue);
-        }
-
-        @Override
-        public boolean equals(Object o) {
-            if (o instanceof Addition<?>) {
-                Addition<?> other = (Addition<?>) o;
-                return UtilObject.equalsHelper(newValue, other.newValue);
-            }
-            return false;
-        }
-    }
-
-    protected static final class Update<V> extends Change<V> {
-        protected final V newValue;
-        protected final V oldValue;
-
-        protected Update(V newValue, V oldValue) {
-            this.newValue = newValue;
-            this.oldValue = oldValue;
-        }
-
-        @Override
-        public int hashCode() {
-            return UtilObject.doHashCode(newValue) ^ UtilObject.doHashCode(oldValue);
-        }
-
-        @Override
-        public boolean equals(Object o) {
-            if (o instanceof Update<?>) {
-                Update<?> other = (Update<?>) o;
-                if (!UtilObject.equalsHelper(newValue, other.newValue)) {
-                   return false;
-                }
-                return UtilObject.equalsHelper(oldValue, other.oldValue);
-            }
-            return false;
-        }
-    }
-
-    protected static class Listener<K, V> implements CacheListener<K, V> {
-        protected Map<K, Set<Change<V>>> changeMap = new HashMap<K, Set<Change<V>>>();
-
-        private void add(K key, Change<V> change) {
-            Set<Change<V>> changeSet = changeMap.get(key);
-            if (changeSet == null) {
-                changeSet = new HashSet<Change<V>>();
-                changeMap.put(key, changeSet);
-            }
-            for (Change<V> checkChange: changeSet) {
-                if (checkChange.equals(change)) {
-                    checkChange.count++;
-                    return;
-                }
-            }
-            changeSet.add(change);
-        }
-
-        public synchronized void noteKeyRemoval(UtilCache<K, V> cache, K key, V oldValue) {
-            add(key, new Removal<V>(oldValue));
-        }
-
-        public synchronized void noteKeyAddition(UtilCache<K, V> cache, K key, V newValue) {
-            add(key, new Addition<V>(newValue));
-        }
-
-        public synchronized void noteKeyUpdate(UtilCache<K, V> cache, K key, V newValue, V oldValue) {
-            add(key, new Update<V>(newValue, oldValue));
-        }
-
-        @Override
-        public boolean equals(Object o) {
-            Listener<?, ?> other = (Listener<?, ?>) o;
-            return changeMap.equals(other.changeMap);
-        }
-    }
-
-    private static <K, V> Listener<K, V> createListener(UtilCache<K, V> cache) {
-        Listener<K, V> listener = new Listener<K, V>();
-        cache.addListener(listener);
-        return listener;
-    }
-
-    public UtilCacheTests(String name) {
-        super(name);
-    }
-
-    private <K, V> UtilCache<K, V> createUtilCache(int sizeLimit, int maxInMemory, long ttl, boolean useSoftReference, boolean useFileSystemStore) {
-        return UtilCache.createUtilCache(getClass().getName() + "." + getName(), sizeLimit, maxInMemory, ttl, useSoftReference, useFileSystemStore);
-    }
-
-    private static <K, V> void assertUtilCacheSettings(UtilCache<K, V> cache, Integer sizeLimit, Integer maxInMemory, Long expireTime, Boolean useSoftReference, Boolean useFileSystemStore) {
-        if (sizeLimit != null) {
-            assertEquals(cache.getName() + ":sizeLimit", sizeLimit.intValue(), cache.getSizeLimit());
-        }
-        if (maxInMemory != null) {
-            assertEquals(cache.getName() + ":maxInMemory", maxInMemory.intValue(), cache.getMaxInMemory());
-        }
-        if (expireTime != null) {
-            assertEquals(cache.getName() + ":expireTime", expireTime.longValue(), cache.getExpireTime());
-        }
-        if (useSoftReference != null) {
-            assertEquals(cache.getName() + ":useSoftReference", useSoftReference.booleanValue(), cache.getUseSoftReference());
-        }
-        if (useFileSystemStore != null) {
-            assertEquals(cache.getName() + ":useFileSystemStore", useFileSystemStore.booleanValue(), cache.getUseFileSystemStore());
-        }
-        assertEquals("initial empty", true, cache.isEmpty());
-        assertEquals("empty keys", Collections.emptySet(), cache.getCacheLineKeys());
-        assertEquals("empty values", Collections.emptyList(), cache.values());
-        assertSame("find cache", cache, UtilCache.findCache(cache.getName()));
-        assertNotSame("new cache", cache, UtilCache.createUtilCache());
-    }
-
-    public void testCreateUtilCache() {
-        String name = getClass().getName() + "." + getName();
-        assertUtilCacheSettings(UtilCache.createUtilCache(), null, null, null, null, null);
-        assertUtilCacheSettings(UtilCache.createUtilCache(name), null, null, null, null, null);
-        assertUtilCacheSettings(UtilCache.createUtilCache(name, false), null, null, null, Boolean.FALSE, null);
-        assertUtilCacheSettings(UtilCache.createUtilCache(name, true), null, null, null, Boolean.TRUE, null);
-        assertUtilCacheSettings(UtilCache.createUtilCache(5, 15000), 5, null, 15000L, null, null);
-        assertUtilCacheSettings(UtilCache.createUtilCache(name, 6, 16000), 6, null, 16000L, null, null);
-        assertUtilCacheSettings(UtilCache.createUtilCache(name, 7, 17000, false), 7, null, 17000L, Boolean.FALSE, null);
-        assertUtilCacheSettings(UtilCache.createUtilCache(name, 8, 18000, true), 8, null, 18000L, Boolean.TRUE, null);
-        assertUtilCacheSettings(UtilCache.createUtilCache(name, 9, 5, 19000, false, false), 9, 5, 19000L, Boolean.FALSE, null);
-        assertUtilCacheSettings(UtilCache.createUtilCache(name, 10, 6, 20000, false, true), 10, 6, 20000L, Boolean.FALSE, null);
-        assertUtilCacheSettings(UtilCache.createUtilCache(name, 11, 7, 21000, false, false, "a", "b"), 11, 7, 21000L, Boolean.FALSE, Boolean.FALSE);
-        assertUtilCacheSettings(UtilCache.createUtilCache(name, 12, 8, 22000, false, true, "c", "d"), 12, 8, 22000L, Boolean.FALSE, Boolean.TRUE);
-    }
-
-    public static <K, V> void assertKey(String label, UtilCache<K, V> cache, K key, V value, V other, int size, Map<K, V> map) {
-        assertNull(label + ":get-empty", cache.get(key));
-        assertFalse(label + ":containsKey-empty", cache.containsKey(key));
-        V oldValue = cache.put(key, other);
-        assertTrue(label + ":containsKey-class", cache.containsKey(key));
-        assertEquals(label + ":get-class", other, cache.get(key));
-        assertNull(label + ":oldValue-class", oldValue);
-        assertEquals(label + ":size-class", size, cache.size());
-        oldValue = cache.put(key, value);
-        assertTrue(label + ":containsKey-value", cache.containsKey(key));
-        assertEquals(label + ":get-value", value, cache.get(key));
-        assertEquals(label + ":oldValue-value", other, oldValue);
-        assertEquals(label + ":size-value", size, cache.size());
-        map.put(key, value);
-        assertEquals(label + ":map-keys", map.keySet(), cache.getCacheLineKeys());
-        assertEquals(label + ":map-values", map.values(), cache.values());
-    }
-
-    private static <K, V> void assertHasSingleKey(UtilCache<K, V> cache, K key, V value) {
-        assertFalse("is-empty", cache.isEmpty());
-        assertEquals("size", 1, cache.size());
-        assertTrue("found", cache.containsKey(key));
-        assertTrue("validKey", UtilCache.validKey(cache.getName(), key));
-        assertFalse("validKey", UtilCache.validKey(":::" + cache.getName(), key));
-        assertEquals("get", value, cache.get(key));
-        assertEquals("keys", new HashSet<K>(UtilMisc.toList(key)), cache.getCacheLineKeys());
-        assertEquals("values", UtilMisc.toList(value), cache.values());
-    }
-
-    private static <K, V> void assertNoSingleKey(UtilCache<K, V> cache, K key) {
-        assertFalse("not-found", cache.containsKey(key));
-        assertFalse("validKey", UtilCache.validKey(cache.getName(), key));
-        assertNull("no-get", cache.get(key));
-        assertNull("remove", cache.remove(key));
-        assertTrue("is-empty", cache.isEmpty());
-        assertEquals("size", 0, cache.size());
-        assertEquals("keys", Collections.emptySet(), cache.getCacheLineKeys());
-        assertEquals("values", Collections.emptyList(), cache.values());
-    }
-
-    private static void basicTest(UtilCache<String, String> cache) throws Exception {
-        Listener<String, String> gotListener = createListener(cache);
-        Listener<String, String> wantedListener = new Listener<String, String>();
-        for (int i = 0; i < 2; i++) {
-            assertTrue("UtilCacheTable.keySet", UtilCache.getUtilCacheTableKeySet().contains(cache.getName()));
-            assertSame("UtilCache.findCache", cache, UtilCache.findCache(cache.getName()));
-            assertSame("UtilCache.getOrCreateUtilCache", cache, UtilCache.getOrCreateUtilCache(cache.getName(), cache.getSizeLimit(), cache.getMaxInMemory(), cache.getExpireTime(), cache.getUseSoftReference(), cache.getUseFileSystemStore()));
-
-            assertNoSingleKey(cache, "one");
-            long origByteSize = cache.getSizeInBytes();
-
-            wantedListener.noteKeyAddition(cache, null, "null");
-            assertNull("put", cache.put(null, "null"));
-            assertHasSingleKey(cache, null, "null");
-            long nullByteSize = cache.getSizeInBytes();
-            assertThat(nullByteSize, greaterThan(origByteSize));
-
-            wantedListener.noteKeyRemoval(cache, null, "null");
-            assertEquals("remove", "null", cache.remove(null));
-            assertNoSingleKey(cache, null);
-
-            wantedListener.noteKeyAddition(cache, "one", "uno");
-            assertNull("put", cache.put("one", "uno"));
-            assertHasSingleKey(cache, "one", "uno");
-            long unoByteSize = cache.getSizeInBytes();
-            assertThat(unoByteSize, greaterThan(origByteSize));
-
-            wantedListener.noteKeyUpdate(cache, "one", "single", "uno");
-            assertEquals("replace", "uno", cache.put("one", "single"));
-            assertHasSingleKey(cache, "one", "single");
-            long singleByteSize = cache.getSizeInBytes();
-            assertThat(singleByteSize, greaterThan(origByteSize));
-            assertThat(singleByteSize, greaterThan(unoByteSize));
-
-            wantedListener.noteKeyRemoval(cache, "one", "single");
-            assertEquals("remove", "single", cache.remove("one"));
-            assertNoSingleKey(cache, "one");
-            assertEquals("byteSize", origByteSize, cache.getSizeInBytes());
-
-            wantedListener.noteKeyAddition(cache, "one", "uno");
-            assertNull("put", cache.put("one", "uno"));
-            assertHasSingleKey(cache, "one", "uno");
-
-            wantedListener.noteKeyUpdate(cache, "one", "only", "uno");
-            assertEquals("replace", "uno", cache.put("one", "only"));
-            assertHasSingleKey(cache, "one", "only");
-
-            wantedListener.noteKeyRemoval(cache, "one", "only");
-            cache.erase();
-            assertNoSingleKey(cache, "one");
-            assertEquals("byteSize", origByteSize, cache.getSizeInBytes());
-
-            cache.setExpireTime(100);
-            wantedListener.noteKeyAddition(cache, "one", "uno");
-            assertNull("put", cache.put("one", "uno"));
-            assertHasSingleKey(cache, "one", "uno");
-
-            wantedListener.noteKeyRemoval(cache, "one", "uno");
-            Thread.sleep(200);
-            assertNoSingleKey(cache, "one");
-        }
-
-        assertEquals("get-miss", 10, cache.getMissCountNotFound());
-        assertEquals("get-miss-total", 10, cache.getMissCountTotal());
-        assertEquals("get-hit", 12, cache.getHitCount());
-        assertEquals("remove-hit", 6, cache.getRemoveHitCount());
-        assertEquals("remove-miss", 10, cache.getRemoveMissCount());
-        cache.removeListener(gotListener);
-        assertEquals("listener", wantedListener, gotListener);
-        UtilCache.clearCache(cache.getName());
-        UtilCache.clearCache(":::" + cache.getName());
-    }
-
-    public void testBasicDisk() throws Exception {
-        UtilCache<String, String> cache = createUtilCache(5, 0, 0, false, true);
-        basicTest(cache);
-    }
-
-    public void testSimple() throws Exception {
-        UtilCache<String, String> cache = createUtilCache(5, 0, 0, false, false);
-        basicTest(cache);
-    }
-
-    public void testPutIfAbsent() throws Exception {
-        UtilCache<String, String> cache = createUtilCache(5, 5, 2000, false, false);
-        Listener<String, String> gotListener = createListener(cache);
-        Listener<String, String> wantedListener = new Listener<String, String>();
-        wantedListener.noteKeyAddition(cache, "two", "dos");
-        assertNull("putIfAbsent", cache.putIfAbsent("two", "dos"));
-        assertHasSingleKey(cache, "two", "dos");
-        assertEquals("putIfAbsent", "dos", cache.putIfAbsent("two", "double"));
-        assertHasSingleKey(cache, "two", "dos");
-        cache.removeListener(gotListener);
-        assertEquals("listener", wantedListener, gotListener);
-    }
-
-    public void testPutIfAbsentAndGet() throws Exception {
-        UtilCache<String, String> cache = createUtilCache(5, 5, 2000, false, false);
-        Listener<String, String> gotListener = createListener(cache);
-        Listener<String, String> wantedListener = new Listener<String, String>();
-        wantedListener.noteKeyAddition(cache, "key", "value");
-        wantedListener.noteKeyAddition(cache, "anotherKey", "anotherValue");
-        assertNull("no-get", cache.get("key"));
-        assertEquals("putIfAbsentAndGet", "value", cache.putIfAbsentAndGet("key", "value"));
-        assertHasSingleKey(cache, "key", "value");
-        assertEquals("putIfAbsentAndGet", "value", cache.putIfAbsentAndGet("key", "newValue"));
-        assertHasSingleKey(cache, "key", "value");
-        String anotherValueAddedToCache = new String("anotherValue");
-        String anotherValueNotAddedToCache = new String("anotherValue");
-        assertEquals(anotherValueAddedToCache, anotherValueNotAddedToCache);
-        assertNotSame(anotherValueAddedToCache, anotherValueNotAddedToCache);
-        String cachedValue = cache.putIfAbsentAndGet("anotherKey", anotherValueAddedToCache);
-        assertSame(cachedValue, anotherValueAddedToCache);
-        cachedValue = cache.putIfAbsentAndGet("anotherKey", anotherValueNotAddedToCache);
-        assertNotSame(cachedValue, anotherValueNotAddedToCache);
-        assertSame(cachedValue, anotherValueAddedToCache);
-        cache.removeListener(gotListener);
-        assertEquals("listener", wantedListener, gotListener);
-    }
-
-    public void testChangeMemSize() throws Exception {
-        int size = 5;
-        long ttl = 2000;
-        UtilCache<String, Serializable> cache = createUtilCache(size, size, ttl, false, false);
-        Map<String, Serializable> map = new HashMap<String, Serializable>();
-        for (int i = 0; i < size; i++) {
-            String s = Integer.toString(i);
-            assertKey(s, cache, s, new String(s), new String(":" + s), i + 1, map);
-        }
-        cache.setMaxInMemory(2);
-        assertEquals("cache.size", 2, cache.size());
-        map.keySet().retainAll(cache.getCacheLineKeys());
-        assertEquals("map-keys", map.keySet(), cache.getCacheLineKeys());
-        assertEquals("map-values", map.values(), cache.values());
-        cache.setMaxInMemory(0);
-        assertEquals("map-keys", map.keySet(), cache.getCacheLineKeys());
-        assertEquals("map-values", map.values(), cache.values());
-        for (int i = size * 2; i < size * 3; i++) {
-            String s = Integer.toString(i);
-            assertKey(s, cache, s, new String(s), new String(":" + s), i - size * 2 + 3, map);
-        }
-        cache.setMaxInMemory(0);
-        assertEquals("map-keys", map.keySet(), cache.getCacheLineKeys());
-        assertEquals("map-values", map.values(), cache.values());
-        cache.setMaxInMemory(size);
-        for (int i = 0; i < size * 2; i++) {
-            map.remove(Integer.toString(i));
-        }
-        // Can't compare the contents of these collections, as setting LRU after not
-        // having one, means the items that get evicted are essentially random.
-        assertEquals("map-keys", map.keySet().size(), cache.getCacheLineKeys().size());
-        assertEquals("map-values", map.values().size(), cache.values().size());
-    }
-
-    private void expireTest(UtilCache<String, Serializable> cache, int size, long ttl) throws Exception {
-        Map<String, Serializable> map = new HashMap<String, Serializable>();
-        for (int i = 0; i < size; i++) {
-            String s = Integer.toString(i);
-            assertKey(s, cache, s, new String(s), new String(":" + s), i + 1, map);
-        }
-        Thread.sleep(ttl + 500);
-        map.clear();
-        for (int i = 0; i < size; i++) {
-            String s = Integer.toString(i);
-            assertNull("no-key(" + s + ")", cache.get(s));
-        }
-        assertEquals("map-keys", map.keySet(), cache.getCacheLineKeys());
-        assertEquals("map-values", map.values(), cache.values());
-        for (int i = 0; i < size; i++) {
-            String s = Integer.toString(i);
-            assertKey(s, cache, s, new String(s), new String(":" + s), i + 1, map);
-        }
-        assertEquals("map-keys", map.keySet(), cache.getCacheLineKeys());
-        assertEquals("map-values", map.values(), cache.values());
-    }
-
-    public void testExpire() throws Exception {
-        UtilCache<String, Serializable> cache = createUtilCache(5, 5, 2000, false, false);
-        expireTest(cache, 5, 2000);
-        long start = System.currentTimeMillis();
-        useAllMemory();
-        long end = System.currentTimeMillis();
-        long ttl = end - start + 1000;
-        cache = createUtilCache(1, 1, ttl, true, false);
-        expireTest(cache, 1, ttl);
-        assertFalse("not empty", cache.isEmpty());
-        useAllMemory();
-        assertNull("not-key(0)", cache.get("0"));
-        assertTrue("empty", cache.isEmpty());
-    }
-}
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *******************************************************************************/
+package org.ofbiz.base.util.cache.test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.greaterThan;
+
+import java.io.Serializable;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.ofbiz.base.test.GenericTestCaseBase;
+import org.ofbiz.base.util.UtilMisc;
+import org.ofbiz.base.util.UtilObject;
+import org.ofbiz.base.util.cache.CacheListener;
+import org.ofbiz.base.util.cache.UtilCache;
+
+@SuppressWarnings("serial")
+public class UtilCacheTests extends GenericTestCaseBase implements Serializable {
+    public static final String module = UtilCacheTests.class.getName();
+
+    protected static abstract class Change<V> {
+        protected int count = 1;
+    }
+
+    protected static final class Removal<V> extends Change<V> {
+        protected final V oldValue;
+
+        protected Removal(V oldValue) {
+            this.oldValue = oldValue;
+        }
+
+        @Override
+        public int hashCode() {
+            return UtilObject.doHashCode(oldValue);
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (o instanceof Removal<?>) {
+                Removal<?> other = (Removal<?>) o;
+                return UtilObject.equalsHelper(oldValue, other.oldValue);
+            }
+            return false;
+        }
+    }
+
+    protected static final class Addition<V> extends Change<V> {
+        protected final V newValue;
+
+        protected Addition(V newValue) {
+            this.newValue = newValue;
+        }
+
+        @Override
+        public int hashCode() {
+            return UtilObject.doHashCode(newValue);
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (o instanceof Addition<?>) {
+                Addition<?> other = (Addition<?>) o;
+                return UtilObject.equalsHelper(newValue, other.newValue);
+            }
+            return false;
+        }
+    }
+
+    protected static final class Update<V> extends Change<V> {
+        protected final V newValue;
+        protected final V oldValue;
+
+        protected Update(V newValue, V oldValue) {
+            this.newValue = newValue;
+            this.oldValue = oldValue;
+        }
+
+        @Override
+        public int hashCode() {
+            return UtilObject.doHashCode(newValue) ^ UtilObject.doHashCode(oldValue);
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (o instanceof Update<?>) {
+                Update<?> other = (Update<?>) o;
+                if (!UtilObject.equalsHelper(newValue, other.newValue)) {
+                   return false;
+                }
+                return UtilObject.equalsHelper(oldValue, other.oldValue);
+            }
+            return false;
+        }
+    }
+
+    protected static class Listener<K, V> implements CacheListener<K, V> {
+        protected Map<K, Set<Change<V>>> changeMap = new HashMap<K, Set<Change<V>>>();
+
+        private void add(K key, Change<V> change) {
+            Set<Change<V>> changeSet = changeMap.get(key);
+            if (changeSet == null) {
+                changeSet = new HashSet<Change<V>>();
+                changeMap.put(key, changeSet);
+            }
+            for (Change<V> checkChange: changeSet) {
+                if (checkChange.equals(change)) {
+                    checkChange.count++;
+                    return;
+                }
+            }
+            changeSet.add(change);
+        }
+
+        public synchronized void noteKeyRemoval(UtilCache<K, V> cache, K key, V oldValue) {
+            add(key, new Removal<V>(oldValue));
+        }
+
+        public synchronized void noteKeyAddition(UtilCache<K, V> cache, K key, V newValue) {
+            add(key, new Addition<V>(newValue));
+        }
+
+        public synchronized void noteKeyUpdate(UtilCache<K, V> cache, K key, V newValue, V oldValue) {
+            add(key, new Update<V>(newValue, oldValue));
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            Listener<?, ?> other = (Listener<?, ?>) o;
+            return changeMap.equals(other.changeMap);
+        }
+    }
+
+    private static <K, V> Listener<K, V> createListener(UtilCache<K, V> cache) {
+        Listener<K, V> listener = new Listener<K, V>();
+        cache.addListener(listener);
+        return listener;
+    }
+
+    public UtilCacheTests(String name) {
+        super(name);
+    }
+
+    private <K, V> UtilCache<K, V> createUtilCache(int sizeLimit, int maxInMemory, long ttl, boolean useSoftReference, boolean useFileSystemStore) {
+        return UtilCache.createUtilCache(getClass().getName() + "." + getName(), sizeLimit, maxInMemory, ttl, useSoftReference, useFileSystemStore);
+    }
+
+    private static <K, V> void assertUtilCacheSettings(UtilCache<K, V> cache, Integer sizeLimit, Integer maxInMemory, Long expireTime, Boolean useSoftReference, Boolean useFileSystemStore) {
+        if (sizeLimit != null) {
+            assertEquals(cache.getName() + ":sizeLimit", sizeLimit.intValue(), cache.getSizeLimit());
+        }
+        if (maxInMemory != null) {
+            assertEquals(cache.getName() + ":maxInMemory", maxInMemory.intValue(), cache.getMaxInMemory());
+        }
+        if (expireTime != null) {
+            assertEquals(cache.getName() + ":expireTime", expireTime.longValue(), cache.getExpireTime());
+        }
+        if (useSoftReference != null) {
+            assertEquals(cache.getName() + ":useSoftReference", useSoftReference.booleanValue(), cache.getUseSoftReference());
+        }
+        if (useFileSystemStore != null) {
+            assertEquals(cache.getName() + ":useFileSystemStore", useFileSystemStore.booleanValue(), cache.getUseFileSystemStore());
+        }
+        assertEquals("initial empty", true, cache.isEmpty());
+        assertEquals("empty keys", Collections.emptySet(), cache.getCacheLineKeys());
+        assertEquals("empty values", Collections.emptyList(), cache.values());
+        assertSame("find cache", cache, UtilCache.findCache(cache.getName()));
+        assertNotSame("new cache", cache, UtilCache.createUtilCache());
+    }
+
+    public void testCreateUtilCache() {
+        String name = getClass().getName() + "." + getName();
+        assertUtilCacheSettings(UtilCache.createUtilCache(), null, null, null, null, null);
+        assertUtilCacheSettings(UtilCache.createUtilCache(name), null, null, null, null, null);
+        assertUtilCacheSettings(UtilCache.createUtilCache(name, false), null, null, null, Boolean.FALSE, null);
+        assertUtilCacheSettings(UtilCache.createUtilCache(name, true), null, null, null, Boolean.TRUE, null);
+        assertUtilCacheSettings(UtilCache.createUtilCache(5, 15000), 5, null, 15000L, null, null);
+        assertUtilCacheSettings(UtilCache.createUtilCache(name, 6, 16000), 6, null, 16000L, null, null);
+        assertUtilCacheSettings(UtilCache.createUtilCache(name, 7, 17000, false), 7, null, 17000L, Boolean.FALSE, null);
+        assertUtilCacheSettings(UtilCache.createUtilCache(name, 8, 18000, true), 8, null, 18000L, Boolean.TRUE, null);
+        assertUtilCacheSettings(UtilCache.createUtilCache(name, 9, 5, 19000, false, false), 9, 5, 19000L, Boolean.FALSE, null);
+        assertUtilCacheSettings(UtilCache.createUtilCache(name, 10, 6, 20000, false, true), 10, 6, 20000L, Boolean.FALSE, null);
+        assertUtilCacheSettings(UtilCache.createUtilCache(name, 11, 7, 21000, false, false, "a", "b"), 11, 7, 21000L, Boolean.FALSE, Boolean.FALSE);
+        assertUtilCacheSettings(UtilCache.createUtilCache(name, 12, 8, 22000, false, true, "c", "d"), 12, 8, 22000L, Boolean.FALSE, Boolean.TRUE);
+    }
+
+    public static <K, V> void assertKey(String label, UtilCache<K, V> cache, K key, V value, V other, int size, Map<K, V> map) {
+        assertNull(label + ":get-empty", cache.get(key));
+        assertFalse(label + ":containsKey-empty", cache.containsKey(key));
+        V oldValue = cache.put(key, other);
+        assertTrue(label + ":containsKey-class", cache.containsKey(key));
+        assertEquals(label + ":get-class", other, cache.get(key));
+        assertNull(label + ":oldValue-class", oldValue);
+        assertEquals(label + ":size-class", size, cache.size());
+        oldValue = cache.put(key, value);
+        assertTrue(label + ":containsKey-value", cache.containsKey(key));
+        assertEquals(label + ":get-value", value, cache.get(key));
+        assertEquals(label + ":oldValue-value", other, oldValue);
+        assertEquals(label + ":size-value", size, cache.size());
+        map.put(key, value);
+        assertEquals(label + ":map-keys", map.keySet(), cache.getCacheLineKeys());
+        assertEquals(label + ":map-values", map.values(), cache.values());
+    }
+
+    private static <K, V> void assertHasSingleKey(UtilCache<K, V> cache, K key, V value) {
+        assertFalse("is-empty", cache.isEmpty());
+        assertEquals("size", 1, cache.size());
+        assertTrue("found", cache.containsKey(key));
+        assertTrue("validKey", UtilCache.validKey(cache.getName(), key));
+        assertFalse("validKey", UtilCache.validKey(":::" + cache.getName(), key));
+        assertEquals("get", value, cache.get(key));
+        assertEquals("keys", new HashSet<K>(UtilMisc.toList(key)), cache.getCacheLineKeys());
+        assertEquals("values", UtilMisc.toList(value), cache.values());
+    }
+
+    private static <K, V> void assertNoSingleKey(UtilCache<K, V> cache, K key) {
+        assertFalse("not-found", cache.containsKey(key));
+        assertFalse("validKey", UtilCache.validKey(cache.getName(), key));
+        assertNull("no-get", cache.get(key));
+        assertNull("remove", cache.remove(key));
+        assertTrue("is-empty", cache.isEmpty());
+        assertEquals("size", 0, cache.size());
+        assertEquals("keys", Collections.emptySet(), cache.getCacheLineKeys());
+        assertEquals("values", Collections.emptyList(), cache.values());
+    }
+
+    private static void basicTest(UtilCache<String, String> cache) throws Exception {
+        Listener<String, String> gotListener = createListener(cache);
+        Listener<String, String> wantedListener = new Listener<String, String>();
+        for (int i = 0; i < 2; i++) {
+            assertTrue("UtilCacheTable.keySet", UtilCache.getUtilCacheTableKeySet().contains(cache.getName()));
+            assertSame("UtilCache.findCache", cache, UtilCache.findCache(cache.getName()));
+            assertSame("UtilCache.getOrCreateUtilCache", cache, UtilCache.getOrCreateUtilCache(cache.getName(), cache.getSizeLimit(), cache.getMaxInMemory(), cache.getExpireTime(), cache.getUseSoftReference(), cache.getUseFileSystemStore()));
+
+            assertNoSingleKey(cache, "one");
+            long origByteSize = cache.getSizeInBytes();
+
+            wantedListener.noteKeyAddition(cache, null, "null");
+            assertNull("put", cache.put(null, "null"));
+            assertHasSingleKey(cache, null, "null");
+            long nullByteSize = cache.getSizeInBytes();
+            assertThat(nullByteSize, greaterThan(origByteSize));
+
+            wantedListener.noteKeyRemoval(cache, null, "null");
+            assertEquals("remove", "null", cache.remove(null));
+            assertNoSingleKey(cache, null);
+
+            wantedListener.noteKeyAddition(cache, "one", "uno");
+            assertNull("put", cache.put("one", "uno"));
+            assertHasSingleKey(cache, "one", "uno");
+            long unoByteSize = cache.getSizeInBytes();
+            assertThat(unoByteSize, greaterThan(origByteSize));
+
+            wantedListener.noteKeyUpdate(cache, "one", "single", "uno");
+            assertEquals("replace", "uno", cache.put("one", "single"));
+            assertHasSingleKey(cache, "one", "single");
+            long singleByteSize = cache.getSizeInBytes();
+            assertThat(singleByteSize, greaterThan(origByteSize));
+            assertThat(singleByteSize, greaterThan(unoByteSize));
+
+            wantedListener.noteKeyRemoval(cache, "one", "single");
+            assertEquals("remove", "single", cache.remove("one"));
+            assertNoSingleKey(cache, "one");
+            assertEquals("byteSize", origByteSize, cache.getSizeInBytes());
+
+            wantedListener.noteKeyAddition(cache, "one", "uno");
+            assertNull("put", cache.put("one", "uno"));
+            assertHasSingleKey(cache, "one", "uno");
+
+            wantedListener.noteKeyUpdate(cache, "one", "only", "uno");
+            assertEquals("replace", "uno", cache.put("one", "only"));
+            assertHasSingleKey(cache, "one", "only");
+
+            wantedListener.noteKeyRemoval(cache, "one", "only");
+            cache.erase();
+            assertNoSingleKey(cache, "one");
+            assertEquals("byteSize", origByteSize, cache.getSizeInBytes());
+
+            cache.setExpireTime(100);
+            wantedListener.noteKeyAddition(cache, "one", "uno");
+            assertNull("put", cache.put("one", "uno"));
+            assertHasSingleKey(cache, "one", "uno");
+
+            wantedListener.noteKeyRemoval(cache, "one", "uno");
+            Thread.sleep(200);
+            assertNoSingleKey(cache, "one");
+        }
+
+        assertEquals("get-miss", 10, cache.getMissCountNotFound());
+        assertEquals("get-miss-total", 10, cache.getMissCountTotal());
+        assertEquals("get-hit", 12, cache.getHitCount());
+        assertEquals("remove-hit", 6, cache.getRemoveHitCount());
+        assertEquals("remove-miss", 10, cache.getRemoveMissCount());
+        cache.removeListener(gotListener);
+        assertEquals("listener", wantedListener, gotListener);
+        UtilCache.clearCache(cache.getName());
+        UtilCache.clearCache(":::" + cache.getName());
+    }
+
+    public void testBasicDisk() throws Exception {
+        UtilCache<String, String> cache = createUtilCache(5, 0, 0, false, true);
+        basicTest(cache);
+    }
+
+    public void testSimple() throws Exception {
+        UtilCache<String, String> cache = createUtilCache(5, 0, 0, false, false);
+        basicTest(cache);
+    }
+
+    public void testPutIfAbsent() throws Exception {
+        UtilCache<String, String> cache = createUtilCache(5, 5, 2000, false, false);
+        Listener<String, String> gotListener = createListener(cache);
+        Listener<String, String> wantedListener = new Listener<String, String>();
+        wantedListener.noteKeyAddition(cache, "two", "dos");
+        assertNull("putIfAbsent", cache.putIfAbsent("two", "dos"));
+        assertHasSingleKey(cache, "two", "dos");
+        assertEquals("putIfAbsent", "dos", cache.putIfAbsent("two", "double"));
+        assertHasSingleKey(cache, "two", "dos");
+        cache.removeListener(gotListener);
+        assertEquals("listener", wantedListener, gotListener);
+    }
+
+    public void testPutIfAbsentAndGet() throws Exception {
+        UtilCache<String, String> cache = createUtilCache(5, 5, 2000, false, false);
+        Listener<String, String> gotListener = createListener(cache);
+        Listener<String, String> wantedListener = new Listener<String, String>();
+        wantedListener.noteKeyAddition(cache, "key", "value");
+        wantedListener.noteKeyAddition(cache, "anotherKey", "anotherValue");
+        assertNull("no-get", cache.get("key"));
+        assertEquals("putIfAbsentAndGet", "value", cache.putIfAbsentAndGet("key", "value"));
+        assertHasSingleKey(cache, "key", "value");
+        assertEquals("putIfAbsentAndGet", "value", cache.putIfAbsentAndGet("key", "newValue"));
+        assertHasSingleKey(cache, "key", "value");
+        String anotherValueAddedToCache = new String("anotherValue");
+        String anotherValueNotAddedToCache = new String("anotherValue");
+        assertEquals(anotherValueAddedToCache, anotherValueNotAddedToCache);
+        assertNotSame(anotherValueAddedToCache, anotherValueNotAddedToCache);
+        String cachedValue = cache.putIfAbsentAndGet("anotherKey", anotherValueAddedToCache);
+        assertSame(cachedValue, anotherValueAddedToCache);
+        cachedValue = cache.putIfAbsentAndGet("anotherKey", anotherValueNotAddedToCache);
+        assertNotSame(cachedValue, anotherValueNotAddedToCache);
+        assertSame(cachedValue, anotherValueAddedToCache);
+        cache.removeListener(gotListener);
+        assertEquals("listener", wantedListener, gotListener);
+    }
+
+    public void testChangeMemSize() throws Exception {
+        int size = 5;
+        long ttl = 2000;
+        UtilCache<String, Serializable> cache = createUtilCache(size, size, ttl, false, false);
+        Map<String, Serializable> map = new HashMap<String, Serializable>();
+        for (int i = 0; i < size; i++) {
+            String s = Integer.toString(i);
+            assertKey(s, cache, s, new String(s), new String(":" + s), i + 1, map);
+        }
+        cache.setMaxInMemory(2);
+        assertEquals("cache.size", 2, cache.size());
+        map.keySet().retainAll(cache.getCacheLineKeys());
+        assertEquals("map-keys", map.keySet(), cache.getCacheLineKeys());
+        assertEquals("map-values", map.values(), cache.values());
+        cache.setMaxInMemory(0);
+        assertEquals("map-keys", map.keySet(), cache.getCacheLineKeys());
+        assertEquals("map-values", map.values(), cache.values());
+        for (int i = size * 2; i < size * 3; i++) {
+            String s = Integer.toString(i);
+            assertKey(s, cache, s, new String(s), new String(":" + s), i - size * 2 + 3, map);
+        }
+        cache.setMaxInMemory(0);
+        assertEquals("map-keys", map.keySet(), cache.getCacheLineKeys());
+        assertEquals("map-values", map.values(), cache.values());
+        cache.setMaxInMemory(size);
+        for (int i = 0; i < size * 2; i++) {
+            map.remove(Integer.toString(i));
+        }
+        // Can't compare the contents of these collections, as setting LRU after not
+        // having one, means the items that get evicted are essentially random.
+        assertEquals("map-keys", map.keySet().size(), cache.getCacheLineKeys().size());
+        assertEquals("map-values", map.values().size(), cache.values().size());
+    }
+
+    private void expireTest(UtilCache<String, Serializable> cache, int size, long ttl) throws Exception {
+        Map<String, Serializable> map = new HashMap<String, Serializable>();
+        for (int i = 0; i < size; i++) {
+            String s = Integer.toString(i);
+            assertKey(s, cache, s, new String(s), new String(":" + s), i + 1, map);
+        }
+        Thread.sleep(ttl + 500);
+        map.clear();
+        for (int i = 0; i < size; i++) {
+            String s = Integer.toString(i);
+            assertNull("no-key(" + s + ")", cache.get(s));
+        }
+        assertEquals("map-keys", map.keySet(), cache.getCacheLineKeys());
+        assertEquals("map-values", map.values(), cache.values());
+        for (int i = 0; i < size; i++) {
+            String s = Integer.toString(i);
+            assertKey(s, cache, s, new String(s), new String(":" + s), i + 1, map);
+        }
+        assertEquals("map-keys", map.keySet(), cache.getCacheLineKeys());
+        assertEquals("map-values", map.values(), cache.values());
+    }
+
+    public void testExpire() throws Exception {
+        UtilCache<String, Serializable> cache = createUtilCache(5, 5, 2000, false, false);
+        expireTest(cache, 5, 2000);
+        long start = System.currentTimeMillis();
+        useAllMemory();
+        long end = System.currentTimeMillis();
+        long ttl = end - start + 1000;
+        cache = createUtilCache(1, 1, ttl, true, false);
+        expireTest(cache, 1, ttl);
+        assertFalse("not empty", cache.isEmpty());
+        useAllMemory();
+        assertNull("not-key(0)", cache.get("0"));
+        assertTrue("empty", cache.isEmpty());
+    }
+}

Propchange: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/cache/test/UtilCacheTests.java
            ('svn:eol-style' removed)

Modified: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/collections/GenericMap.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/util/collections/GenericMap.java?rev=1695126&r1=1695125&r2=1695126&view=diff
==============================================================================
--- ofbiz/trunk/framework/base/src/org/ofbiz/base/util/collections/GenericMap.java (original)
+++ ofbiz/trunk/framework/base/src/org/ofbiz/base/util/collections/GenericMap.java Mon Aug 10 16:15:37 2015
@@ -1,253 +1,253 @@
-/*******n***********************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *******************************************************************************/
-package org.ofbiz.base.util.collections;
-
-import java.io.Serializable;
-import java.util.ConcurrentModificationException;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
-import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
-
-import org.ofbiz.base.lang.Appender;
-import org.ofbiz.base.util.UtilGenerics;
-import org.ofbiz.base.util.UtilObject;
-
-@SuppressWarnings("serial")
-public abstract class GenericMap<K, V> implements Appender<StringBuilder>, Map<K, V>, Serializable {
-    private static final AtomicReferenceFieldUpdater<GenericMap<?, ?>, Set<?>> keySetUpdater = UtilGenerics.cast(AtomicReferenceFieldUpdater.newUpdater(GenericMap.class, Set.class, "keySet"));
-    private static final AtomicReferenceFieldUpdater<GenericMap<?, ?>, Set<?>> entrySetUpdater = UtilGenerics.cast(AtomicReferenceFieldUpdater.newUpdater(GenericMap.class, Set.class, "entrySet"));
-    private static final AtomicReferenceFieldUpdater<GenericMap<?, ?>, Collection<?>> valuesUpdater = UtilGenerics.cast(AtomicReferenceFieldUpdater.newUpdater(GenericMap.class, Collection.class, "values"));
-    private static final AtomicIntegerFieldUpdater<GenericMap<?, ?>> modCountUpdater = UtilGenerics.cast(AtomicIntegerFieldUpdater.newUpdater(GenericMap.class, "modCount"));
-
-    private volatile Set<K> keySet;
-    private volatile Set<Map.Entry<K, V>> entrySet;
-    private volatile Collection<V> values;
-    private volatile int modCount;
-
-    public int getModCount() {
-        return modCount;
-    }
-
-    protected void incrementModCount() {
-        modCountUpdater.getAndIncrement(this);
-    }
-
-    public final void clear() {
-        if (isEmpty()) return;
-        incrementModCount();
-        clearInternal();
-    }
-
-    protected abstract void clearInternal();
-
-    public boolean containsValue(Object value) {
-        return values().contains(value);
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (!(o instanceof Map<?, ?>)) return false;
-        if (this == o) return true;
-        Map<?, ?> map = (Map<?, ?>) o;
-        if (size() != map.size()) return false;
-        if (o instanceof GenericMap<?, ?>) return equalsGenericMap((GenericMap<?, ?>) o);
-        return equalsMap(map);
-    }
-
-    protected boolean equalsGenericMap(GenericMap<?, ?> map) {
-        Iterator<Map.Entry<K, V>> it = iterator(false);
-        while (it.hasNext()) {
-            Map.Entry<K, V> entry = it.next();
-            K key = entry.getKey();
-            V value = entry.getValue();
-            if (value != null) {
-                if (!value.equals(map.get(key, false))) return false;
-            } else {
-                Object otherValue = map.get(key, false);
-                if (otherValue != null) return false;
-                if (!map.containsKey(key)) return false;
-            }
-        }
-        return true;
-    }
-
-    protected boolean equalsMap(Map<?, ?> map) {
-        Iterator<Map.Entry<K, V>> it = iterator(false);
-        while (it.hasNext()) {
-            Map.Entry<K, V> entry = it.next();
-            K key = entry.getKey();
-            V value = entry.getValue();
-            if (value != null) {
-                if (!value.equals(map.get(key))) return false;
-            } else {
-                Object otherValue = map.get(key);
-                if (otherValue != null) return false;
-                if (!map.containsKey(key)) return false;
-            }
-        }
-        return true;
-    }
-
-    public final V get(Object key) {
-        return get(key, true);
-    }
-
-    protected abstract V get(Object key, boolean noteAccess);
-
-    protected abstract class GenericMapIterator<DEST> extends IteratorWrapper<DEST, Map.Entry<K, V>> {
-        private final int currentModCount = getModCount();
-
-        protected GenericMapIterator(boolean noteAccess) {
-            super(iterator(noteAccess));
-        }
-
-        protected boolean isValid(Map.Entry<K, V> src) {
-            if (currentModCount != getModCount()) throw new ConcurrentModificationException();
-            return true;
-        }
-    }
-
-    public final Set<Map.Entry<K, V>> entrySet() {
-        if (entrySet == null) {
-            entrySetUpdater.compareAndSet(this, null, new GenericMapEntrySet<K, V, GenericMap<K, V>>(this) {
-                @Override
-                protected boolean contains(Object key, Object value) {
-                    return UtilObject.equalsHelper(get(key, false), value);
-                }
-
-                @Override
-                public Iterator<Map.Entry<K, V>> iterator(boolean noteAccess) {
-                    return new GenericMapIterator<Map.Entry<K, V>>(noteAccess) {
-                        @Override
-                        protected void noteRemoval(Map.Entry<K, V> dest, Map.Entry<K, V> src) {
-                            // No need to note the remove, the wrapped iterator does that for us
-                            // evictionPolicy.remove(evictionDeque, dest);
-                            // if (diskStore != null) diskStore.remove(dest);
-                        }
-
-                        @Override
-                        protected Map.Entry<K, V> convert(Map.Entry<K, V> src) {
-                            return src;
-                        }
-                    };
-                }
-            });
-        }
-        return entrySet;
-    }
-
-    protected abstract Iterator<Map.Entry<K, V>> iterator(boolean noteAccess);
-
-    public final Set<K> keySet() {
-        if (keySet == null) {
-            keySetUpdater.compareAndSet(this, null, new GenericMapKeySet<K, V, GenericMap<K, V>>(this) {
-                public boolean contains(Object key) {
-                    return containsKey(key);
-                }
-
-                @Override
-                public Iterator<K> iterator(boolean noteAccess) {
-                    return new GenericMapIterator<K>(noteAccess) {
-                        @Override
-                        protected void noteRemoval(K dest, Map.Entry<K, V> src) {
-                            // No need to note the remove, the wrapped iterator does that for us
-                            // evictionPolicy.remove(evictionDeque, dest);
-                            // if (diskStore != null) diskStore.remove(dest);
-                        }
-
-                        @Override
-                        protected K convert(Map.Entry<K, V> src) {
-                            return src.getKey();
-                        }
-                    };
-                }
-            });
-        }
-        return keySet;
-    }
-
-    public final Collection<V> values() {
-        if (values == null) {
-            valuesUpdater.compareAndSet(this, null, new GenericMapValues<K, V, GenericMap<K, V>>(this) {
-                @Override
-                public Iterator<V> iterator(boolean noteAccess) {
-                    return new GenericMapIterator<V>(noteAccess) {
-                        @Override
-                        protected void noteRemoval(V dest, Map.Entry<K, V> src) {
-                            // No need to note the remove, the wrapped iterator does that for us
-                            // evictionPolicy.remove(evictionDeque, src.getKey());
-                            // if (diskStore != null) diskStore.remove(src.getKey());
-                        }
-
-                        @Override
-                        protected V convert(Map.Entry<K, V> src) {
-                            return src.getValue();
-                        }
-                    };
-                }
-            });
-        }
-        return values;
-    }
-
-    public final V remove(Object key) {
-        return removeInternal(key, true);
-    }
-
-    protected abstract V removeInternal(Object key, boolean incrementModCount);
-
-    public final void putAll(Map<? extends K, ? extends V> map) {
-        putAllInternal(map);
-    }
-
-    private <KE extends K, VE extends V> void putAllInternal(Map<KE, VE> map) {
-        if (map.isEmpty()) return;
-        incrementModCount();
-        Iterator<Map.Entry<KE, VE>> it;
-        if (map instanceof GenericMap<?, ?>) {
-            GenericMap<KE, VE> otherMap = UtilGenerics.cast(map);
-            it = otherMap.iterator(false);
-        } else {
-            it = map.entrySet().iterator();
-        }
-        putAllIterator(it);
-    }
-
-    protected abstract <KE extends K, VE extends V> void putAllIterator(Iterator<Map.Entry<KE, VE>> it);
-
-    @Override
-    public String toString() {
-        return appendTo(new StringBuilder()).toString();
-    }
-
-    public StringBuilder appendTo(StringBuilder sb) {
-        sb.append("{");
-        Iterator<Map.Entry<K, V>> it = iterator(false);
-        while (it.hasNext()) {
-            Map.Entry<K, V> entry = it.next();
-            sb.append(entry.getKey()).append("=").append(entry.getValue());
-            if (it.hasNext()) sb.append(",");
-        }
-        return sb.append("}");
-    }
-}
-
+/*******n***********************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *******************************************************************************/
+package org.ofbiz.base.util.collections;
+
+import java.io.Serializable;
+import java.util.ConcurrentModificationException;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
+import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
+
+import org.ofbiz.base.lang.Appender;
+import org.ofbiz.base.util.UtilGenerics;
+import org.ofbiz.base.util.UtilObject;
+
+@SuppressWarnings("serial")
+public abstract class GenericMap<K, V> implements Appender<StringBuilder>, Map<K, V>, Serializable {
+    private static final AtomicReferenceFieldUpdater<GenericMap<?, ?>, Set<?>> keySetUpdater = UtilGenerics.cast(AtomicReferenceFieldUpdater.newUpdater(GenericMap.class, Set.class, "keySet"));
+    private static final AtomicReferenceFieldUpdater<GenericMap<?, ?>, Set<?>> entrySetUpdater = UtilGenerics.cast(AtomicReferenceFieldUpdater.newUpdater(GenericMap.class, Set.class, "entrySet"));
+    private static final AtomicReferenceFieldUpdater<GenericMap<?, ?>, Collection<?>> valuesUpdater = UtilGenerics.cast(AtomicReferenceFieldUpdater.newUpdater(GenericMap.class, Collection.class, "values"));
+    private static final AtomicIntegerFieldUpdater<GenericMap<?, ?>> modCountUpdater = UtilGenerics.cast(AtomicIntegerFieldUpdater.newUpdater(GenericMap.class, "modCount"));
+
+    private volatile Set<K> keySet;
+    private volatile Set<Map.Entry<K, V>> entrySet;
+    private volatile Collection<V> values;
+    private volatile int modCount;
+
+    public int getModCount() {
+        return modCount;
+    }
+
+    protected void incrementModCount() {
+        modCountUpdater.getAndIncrement(this);
+    }
+
+    public final void clear() {
+        if (isEmpty()) return;
+        incrementModCount();
+        clearInternal();
+    }
+
+    protected abstract void clearInternal();
+
+    public boolean containsValue(Object value) {
+        return values().contains(value);
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (!(o instanceof Map<?, ?>)) return false;
+        if (this == o) return true;
+        Map<?, ?> map = (Map<?, ?>) o;
+        if (size() != map.size()) return false;
+        if (o instanceof GenericMap<?, ?>) return equalsGenericMap((GenericMap<?, ?>) o);
+        return equalsMap(map);
+    }
+
+    protected boolean equalsGenericMap(GenericMap<?, ?> map) {
+        Iterator<Map.Entry<K, V>> it = iterator(false);
+        while (it.hasNext()) {
+            Map.Entry<K, V> entry = it.next();
+            K key = entry.getKey();
+            V value = entry.getValue();
+            if (value != null) {
+                if (!value.equals(map.get(key, false))) return false;
+            } else {
+                Object otherValue = map.get(key, false);
+                if (otherValue != null) return false;
+                if (!map.containsKey(key)) return false;
+            }
+        }
+        return true;
+    }
+
+    protected boolean equalsMap(Map<?, ?> map) {
+        Iterator<Map.Entry<K, V>> it = iterator(false);
+        while (it.hasNext()) {
+            Map.Entry<K, V> entry = it.next();
+            K key = entry.getKey();
+            V value = entry.getValue();
+            if (value != null) {
+                if (!value.equals(map.get(key))) return false;
+            } else {
+                Object otherValue = map.get(key);
+                if (otherValue != null) return false;
+                if (!map.containsKey(key)) return false;
+            }
+        }
+        return true;
+    }
+
+    public final V get(Object key) {
+        return get(key, true);
+    }
+
+    protected abstract V get(Object key, boolean noteAccess);
+
+    protected abstract class GenericMapIterator<DEST> extends IteratorWrapper<DEST, Map.Entry<K, V>> {
+        private final int currentModCount = getModCount();
+
+        protected GenericMapIterator(boolean noteAccess) {
+            super(iterator(noteAccess));
+        }
+
+        protected boolean isValid(Map.Entry<K, V> src) {
+            if (currentModCount != getModCount()) throw new ConcurrentModificationException();
+            return true;
+        }
+    }
+
+    public final Set<Map.Entry<K, V>> entrySet() {
+        if (entrySet == null) {
+            entrySetUpdater.compareAndSet(this, null, new GenericMapEntrySet<K, V, GenericMap<K, V>>(this) {
+                @Override
+                protected boolean contains(Object key, Object value) {
+                    return UtilObject.equalsHelper(get(key, false), value);
+                }
+
+                @Override
+                public Iterator<Map.Entry<K, V>> iterator(boolean noteAccess) {
+                    return new GenericMapIterator<Map.Entry<K, V>>(noteAccess) {
+                        @Override
+                        protected void noteRemoval(Map.Entry<K, V> dest, Map.Entry<K, V> src) {
+                            // No need to note the remove, the wrapped iterator does that for us
+                            // evictionPolicy.remove(evictionDeque, dest);
+                            // if (diskStore != null) diskStore.remove(dest);
+                        }
+
+                        @Override
+                        protected Map.Entry<K, V> convert(Map.Entry<K, V> src) {
+                            return src;
+                        }
+                    };
+                }
+            });
+        }
+        return entrySet;
+    }
+
+    protected abstract Iterator<Map.Entry<K, V>> iterator(boolean noteAccess);
+
+    public final Set<K> keySet() {
+        if (keySet == null) {
+            keySetUpdater.compareAndSet(this, null, new GenericMapKeySet<K, V, GenericMap<K, V>>(this) {
+                public boolean contains(Object key) {
+                    return containsKey(key);
+                }
+
+                @Override
+                public Iterator<K> iterator(boolean noteAccess) {
+                    return new GenericMapIterator<K>(noteAccess) {
+                        @Override
+                        protected void noteRemoval(K dest, Map.Entry<K, V> src) {
+                            // No need to note the remove, the wrapped iterator does that for us
+                            // evictionPolicy.remove(evictionDeque, dest);
+                            // if (diskStore != null) diskStore.remove(dest);
+                        }
+
+                        @Override
+                        protected K convert(Map.Entry<K, V> src) {
+                            return src.getKey();
+                        }
+                    };
+                }
+            });
+        }
+        return keySet;
+    }
+
+    public final Collection<V> values() {
+        if (values == null) {
+            valuesUpdater.compareAndSet(this, null, new GenericMapValues<K, V, GenericMap<K, V>>(this) {
+                @Override
+                public Iterator<V> iterator(boolean noteAccess) {
+                    return new GenericMapIterator<V>(noteAccess) {
+                        @Override
+                        protected void noteRemoval(V dest, Map.Entry<K, V> src) {
+                            // No need to note the remove, the wrapped iterator does that for us
+                            // evictionPolicy.remove(evictionDeque, src.getKey());
+                            // if (diskStore != null) diskStore.remove(src.getKey());
+                        }
+
+                        @Override
+                        protected V convert(Map.Entry<K, V> src) {
+                            return src.getValue();
+                        }
+                    };
+                }
+            });
+        }
+        return values;
+    }
+
+    public final V remove(Object key) {
+        return removeInternal(key, true);
+    }
+
+    protected abstract V removeInternal(Object key, boolean incrementModCount);
+
+    public final void putAll(Map<? extends K, ? extends V> map) {
+        putAllInternal(map);
+    }
+
+    private <KE extends K, VE extends V> void putAllInternal(Map<KE, VE> map) {
+        if (map.isEmpty()) return;
+        incrementModCount();
+        Iterator<Map.Entry<KE, VE>> it;
+        if (map instanceof GenericMap<?, ?>) {
+            GenericMap<KE, VE> otherMap = UtilGenerics.cast(map);
+            it = otherMap.iterator(false);
+        } else {
+            it = map.entrySet().iterator();
+        }
+        putAllIterator(it);
+    }
+
+    protected abstract <KE extends K, VE extends V> void putAllIterator(Iterator<Map.Entry<KE, VE>> it);
+
+    @Override
+    public String toString() {
+        return appendTo(new StringBuilder()).toString();
+    }
+
+    public StringBuilder appendTo(StringBuilder sb) {
+        sb.append("{");
+        Iterator<Map.Entry<K, V>> it = iterator(false);
+        while (it.hasNext()) {
+            Map.Entry<K, V> entry = it.next();
+            sb.append(entry.getKey()).append("=").append(entry.getValue());
+            if (it.hasNext()) sb.append(",");
+        }
+        return sb.append("}");
+    }
+}
+

Propchange: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/collections/GenericMap.java
            ('svn:eol-style' removed)

Modified: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/collections/GenericMapCollection.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/util/collections/GenericMapCollection.java?rev=1695126&r1=1695125&r2=1695126&view=diff
==============================================================================
--- ofbiz/trunk/framework/base/src/org/ofbiz/base/util/collections/GenericMapCollection.java (original)
+++ ofbiz/trunk/framework/base/src/org/ofbiz/base/util/collections/GenericMapCollection.java Mon Aug 10 16:15:37 2015
@@ -1,121 +1,121 @@
-/*******************************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *******************************************************************************/
-package org.ofbiz.base.util.collections;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-public abstract class GenericMapCollection<K, V, M extends Map<K, V>, I> implements Collection<I> {
-    protected final M source;
-
-    public GenericMapCollection(M source) {
-        this.source = source;
-    }
-
-    public boolean add(I item) {
-        throw new UnsupportedOperationException();
-    }
-
-    public boolean addAll(Collection<? extends I> collection) {
-        throw new UnsupportedOperationException();
-    }
-
-    public void clear() {
-        source.clear();
-    }
-
-    public boolean containsAll(Collection<?> collection) {
-        for (Object item: collection) {
-            if (!contains(item)) return false;
-        }
-        return true;
-    }
-
-    public boolean isEmpty() {
-        return source.isEmpty();
-    }
-
-    public final Iterator<I> iterator() {
-        return iterator(true);
-    }
-
-    protected abstract Iterator<I> iterator(boolean noteAccess);
-
-    public boolean removeAll(Collection<?> collection) {
-        int count = 0;
-        for (Object item: collection) {
-            if (remove(item)) count++;
-        }
-        return count > 0;
-    }
-
-    public boolean retainAll(Collection<?> collection) {
-        int count = 0;
-        Iterator<I> it = iterator(false);
-        while (it.hasNext()) {
-            I item = it.next();
-            if (!collection.contains(item)) {
-                it.remove();
-                count++;
-            }
-        }
-        return count > 0;
-    }
-
-    public int size() {
-        return source.size();
-    }
-
-    public Object[] toArray() {
-        List<I> list = new LinkedList<I>();
-        Iterator<I> it = iterator(false);
-        while (it.hasNext()) {
-            list.add(it.next());
-        }
-        return list.toArray();
-    }
-
-    public <T> T[] toArray(T[] array) {
-        List<Object> list = new LinkedList<Object>();
-        Iterator<I> it = iterator(false);
-        while (it.hasNext()) {
-            list.add(it.next());
-        }
-        return list.toArray(array);
-    }
-
-    @Override
-    public String toString() {
-        return appendTo(new StringBuilder()).toString();
-    }
-
-    public StringBuilder appendTo(StringBuilder sb) {
-        sb.append("[");
-        Iterator<I> it = iterator(false);
-        while (it.hasNext()) {
-            sb.append(it.next());
-            if (it.hasNext()) sb.append(", ");
-        }
-        return sb.append("]");
-    }
-}
-
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *******************************************************************************/
+package org.ofbiz.base.util.collections;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+public abstract class GenericMapCollection<K, V, M extends Map<K, V>, I> implements Collection<I> {
+    protected final M source;
+
+    public GenericMapCollection(M source) {
+        this.source = source;
+    }
+
+    public boolean add(I item) {
+        throw new UnsupportedOperationException();
+    }
+
+    public boolean addAll(Collection<? extends I> collection) {
+        throw new UnsupportedOperationException();
+    }
+
+    public void clear() {
+        source.clear();
+    }
+
+    public boolean containsAll(Collection<?> collection) {
+        for (Object item: collection) {
+            if (!contains(item)) return false;
+        }
+        return true;
+    }
+
+    public boolean isEmpty() {
+        return source.isEmpty();
+    }
+
+    public final Iterator<I> iterator() {
+        return iterator(true);
+    }
+
+    protected abstract Iterator<I> iterator(boolean noteAccess);
+
+    public boolean removeAll(Collection<?> collection) {
+        int count = 0;
+        for (Object item: collection) {
+            if (remove(item)) count++;
+        }
+        return count > 0;
+    }
+
+    public boolean retainAll(Collection<?> collection) {
+        int count = 0;
+        Iterator<I> it = iterator(false);
+        while (it.hasNext()) {
+            I item = it.next();
+            if (!collection.contains(item)) {
+                it.remove();
+                count++;
+            }
+        }
+        return count > 0;
+    }
+
+    public int size() {
+        return source.size();
+    }
+
+    public Object[] toArray() {
+        List<I> list = new LinkedList<I>();
+        Iterator<I> it = iterator(false);
+        while (it.hasNext()) {
+            list.add(it.next());
+        }
+        return list.toArray();
+    }
+
+    public <T> T[] toArray(T[] array) {
+        List<Object> list = new LinkedList<Object>();
+        Iterator<I> it = iterator(false);
+        while (it.hasNext()) {
+            list.add(it.next());
+        }
+        return list.toArray(array);
+    }
+
+    @Override
+    public String toString() {
+        return appendTo(new StringBuilder()).toString();
+    }
+
+    public StringBuilder appendTo(StringBuilder sb) {
+        sb.append("[");
+        Iterator<I> it = iterator(false);
+        while (it.hasNext()) {
+            sb.append(it.next());
+            if (it.hasNext()) sb.append(", ");
+        }
+        return sb.append("]");
+    }
+}
+

Propchange: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/collections/GenericMapCollection.java
            ('svn:eol-style' removed)

Modified: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/collections/GenericMapEntry.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/util/collections/GenericMapEntry.java?rev=1695126&r1=1695125&r2=1695126&view=diff
==============================================================================
--- ofbiz/trunk/framework/base/src/org/ofbiz/base/util/collections/GenericMapEntry.java (original)
+++ ofbiz/trunk/framework/base/src/org/ofbiz/base/util/collections/GenericMapEntry.java Mon Aug 10 16:15:37 2015
@@ -1,60 +1,60 @@
-/*******************************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *******************************************************************************/
-package org.ofbiz.base.util.collections;
-
-import java.util.Map;
-
-import org.ofbiz.base.util.UtilObject;
-
-public class GenericMapEntry<K, V> implements Map.Entry<K, V> {
-    protected final GenericMap<K, V> map;
-    protected final K key;
-    protected final boolean noteAccess;
-
-    public GenericMapEntry(GenericMap<K, V> map, K key, boolean noteAccess) {
-        this.map = map;
-        this.key = key;
-        this.noteAccess = noteAccess;
-    }
-
-    public K getKey() {
-        return key;
-    }
-
-    public V getValue() {
-        return map.get(key, noteAccess);
-    }
-
-    public V setValue(V value) {
-        return map.put(key, value);
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (!(o instanceof Map.Entry<?, ?>)) return false;
-        if (this == o) return true;
-        Map.Entry<?, ?> other = (Map.Entry<?, ?>) o;
-        return UtilObject.equalsHelper(getKey(), other.getKey()) && UtilObject.equalsHelper(getValue(), other.getValue());
-    }
-
-    @Override
-    public int hashCode() {
-        return UtilObject.doHashCode(getKey()) ^ UtilObject.doHashCode(getValue());
-    }
-}
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *******************************************************************************/
+package org.ofbiz.base.util.collections;
+
+import java.util.Map;
+
+import org.ofbiz.base.util.UtilObject;
+
+public class GenericMapEntry<K, V> implements Map.Entry<K, V> {
+    protected final GenericMap<K, V> map;
+    protected final K key;
+    protected final boolean noteAccess;
+
+    public GenericMapEntry(GenericMap<K, V> map, K key, boolean noteAccess) {
+        this.map = map;
+        this.key = key;
+        this.noteAccess = noteAccess;
+    }
+
+    public K getKey() {
+        return key;
+    }
+
+    public V getValue() {
+        return map.get(key, noteAccess);
+    }
+
+    public V setValue(V value) {
+        return map.put(key, value);
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (!(o instanceof Map.Entry<?, ?>)) return false;
+        if (this == o) return true;
+        Map.Entry<?, ?> other = (Map.Entry<?, ?>) o;
+        return UtilObject.equalsHelper(getKey(), other.getKey()) && UtilObject.equalsHelper(getValue(), other.getValue());
+    }
+
+    @Override
+    public int hashCode() {
+        return UtilObject.doHashCode(getKey()) ^ UtilObject.doHashCode(getValue());
+    }
+}

Propchange: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/collections/GenericMapEntry.java
            ('svn:eol-style' removed)

Modified: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/collections/GenericMapEntrySet.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/util/collections/GenericMapEntrySet.java?rev=1695126&r1=1695125&r2=1695126&view=diff
==============================================================================
--- ofbiz/trunk/framework/base/src/org/ofbiz/base/util/collections/GenericMapEntrySet.java (original)
+++ ofbiz/trunk/framework/base/src/org/ofbiz/base/util/collections/GenericMapEntrySet.java Mon Aug 10 16:15:37 2015
@@ -1,47 +1,47 @@
-/*******************************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *******************************************************************************/
-package org.ofbiz.base.util.collections;
-
-import java.util.Map;
-
-public abstract class GenericMapEntrySet<K, V, M extends GenericMap<K, V>> extends GenericMapSet<K, V, M, Map.Entry<K, V>> {
-    public GenericMapEntrySet(M source) {
-        super(source);
-    }
-
-    public boolean contains(Object item) {
-        if (item == null) return false;
-        if (!(item instanceof Map.Entry<?, ?>)) return false;
-        Map.Entry<?, ?> other = (Map.Entry<?, ?>) item;
-        return contains(other.getKey(), other.getValue());
-    }
-
-    protected abstract boolean contains(Object key, Object value);
-
-    public boolean remove(Object item) {
-        if (item == null) return false;
-        if (!(item instanceof Map.Entry<?, ?>)) return false;
-        Map.Entry<?, ?> other = (Map.Entry<?, ?>) item;
-        Object key = other.getKey();
-        if (!source.containsKey(key)) return false;
-        source.remove(key);
-        return true;
-    }
-}
-
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *******************************************************************************/
+package org.ofbiz.base.util.collections;
+
+import java.util.Map;
+
+public abstract class GenericMapEntrySet<K, V, M extends GenericMap<K, V>> extends GenericMapSet<K, V, M, Map.Entry<K, V>> {
+    public GenericMapEntrySet(M source) {
+        super(source);
+    }
+
+    public boolean contains(Object item) {
+        if (item == null) return false;
+        if (!(item instanceof Map.Entry<?, ?>)) return false;
+        Map.Entry<?, ?> other = (Map.Entry<?, ?>) item;
+        return contains(other.getKey(), other.getValue());
+    }
+
+    protected abstract boolean contains(Object key, Object value);
+
+    public boolean remove(Object item) {
+        if (item == null) return false;
+        if (!(item instanceof Map.Entry<?, ?>)) return false;
+        Map.Entry<?, ?> other = (Map.Entry<?, ?>) item;
+        Object key = other.getKey();
+        if (!source.containsKey(key)) return false;
+        source.remove(key);
+        return true;
+    }
+}
+

Propchange: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/collections/GenericMapEntrySet.java
            ('svn:eol-style' removed)

Modified: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/collections/GenericMapKeySet.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/util/collections/GenericMapKeySet.java?rev=1695126&r1=1695125&r2=1695126&view=diff
==============================================================================
--- ofbiz/trunk/framework/base/src/org/ofbiz/base/util/collections/GenericMapKeySet.java (original)
+++ ofbiz/trunk/framework/base/src/org/ofbiz/base/util/collections/GenericMapKeySet.java Mon Aug 10 16:15:37 2015
@@ -1,32 +1,32 @@
-/*******************************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *******************************************************************************/
-package org.ofbiz.base.util.collections;
-
-import java.util.Map;
-
-public abstract class GenericMapKeySet<K, V, M extends Map<K, V>> extends GenericMapSet<K, V, M, K> {
-    public GenericMapKeySet(M source) {
-        super(source);
-    }
-
-    public boolean remove(Object item) {
-        return source.remove(item) != null;
-    }
-}
-
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *******************************************************************************/
+package org.ofbiz.base.util.collections;
+
+import java.util.Map;
+
+public abstract class GenericMapKeySet<K, V, M extends Map<K, V>> extends GenericMapSet<K, V, M, K> {
+    public GenericMapKeySet(M source) {
+        super(source);
+    }
+
+    public boolean remove(Object item) {
+        return source.remove(item) != null;
+    }
+}
+

Propchange: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/collections/GenericMapKeySet.java
            ('svn:eol-style' removed)

Modified: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/collections/GenericMapSet.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/util/collections/GenericMapSet.java?rev=1695126&r1=1695125&r2=1695126&view=diff
==============================================================================
--- ofbiz/trunk/framework/base/src/org/ofbiz/base/util/collections/GenericMapSet.java (original)
+++ ofbiz/trunk/framework/base/src/org/ofbiz/base/util/collections/GenericMapSet.java Mon Aug 10 16:15:37 2015
@@ -1,50 +1,50 @@
-/*******************************************************************************
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *******************************************************************************/
-package org.ofbiz.base.util.collections;
-
-import java.util.Map;
-import java.util.Set;
-
-public abstract class GenericMapSet<K, V, M extends Map<K, V>, I> extends GenericMapCollection<K, V, M, I> implements Set<I> {
-    public GenericMapSet(M source) {
-        super(source);
-    }
-
-    @Override
-    public final boolean equals(Object o) {
-        if (!(o instanceof Set<?>)) return false;
-        Set<?> other = (Set<?>) o;
-        if (source.size() != other.size()) return false;
-        for (I item: this) {
-            if (!other.contains(item)) return false;
-        }
-        return true;
-    }
-
-    @Override
-    public final int hashCode() {
-        int h = 0;
-        for (I item: this) {
-            if (item == null) continue;
-            h += item.hashCode();
-        }
-        return h;
-    }
-}
-
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *******************************************************************************/
+package org.ofbiz.base.util.collections;
+
+import java.util.Map;
+import java.util.Set;
+
+public abstract class GenericMapSet<K, V, M extends Map<K, V>, I> extends GenericMapCollection<K, V, M, I> implements Set<I> {
+    public GenericMapSet(M source) {
+        super(source);
+    }
+
+    @Override
+    public final boolean equals(Object o) {
+        if (!(o instanceof Set<?>)) return false;
+        Set<?> other = (Set<?>) o;
+        if (source.size() != other.size()) return false;
+        for (I item: this) {
+            if (!other.contains(item)) return false;
+        }
+        return true;
+    }
+
+    @Override
+    public final int hashCode() {
+        int h = 0;
+        for (I item: this) {
+            if (item == null) continue;
+            h += item.hashCode();
+        }
+        return h;
+    }
+}
+

Propchange: ofbiz/trunk/framework/base/src/org/ofbiz/base/util/collections/GenericMapSet.java
            ('svn:eol-style' removed)