You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by tv...@apache.org on 2023/08/22 15:23:48 UTC

[commons-jcs] branch master updated: Further clean up array usage

This is an automated email from the ASF dual-hosted git repository.

tv pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-jcs.git


The following commit(s) were added to refs/heads/master by this push:
     new 21ca6933 Further clean up array usage
21ca6933 is described below

commit 21ca69330f6a82705fb082fb0188b15e497e8146
Author: Thomas Vandahl <tv...@apache.org>
AuthorDate: Tue Aug 22 17:23:43 2023 +0200

    Further clean up array usage
---
 .../auxiliary/disk/indexed/IndexedDiskCache.java   | 20 +++----
 .../auxiliary/remote/server/RemoteCacheServer.java | 66 ++++++++--------------
 .../indexed/AbstractIndexDiskCacheUnitTest.java    | 10 ++--
 3 files changed, 38 insertions(+), 58 deletions(-)

diff --git a/commons-jcs3-core/src/main/java/org/apache/commons/jcs3/auxiliary/disk/indexed/IndexedDiskCache.java b/commons-jcs3-core/src/main/java/org/apache/commons/jcs3/auxiliary/disk/indexed/IndexedDiskCache.java
index e70bdcf7..4f16181d 100644
--- a/commons-jcs3-core/src/main/java/org/apache/commons/jcs3/auxiliary/disk/indexed/IndexedDiskCache.java
+++ b/commons-jcs3-core/src/main/java/org/apache/commons/jcs3/auxiliary/disk/indexed/IndexedDiskCache.java
@@ -24,6 +24,7 @@ import java.io.IOException;
 import java.io.Serializable;
 import java.nio.file.Files;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashMap;
@@ -398,7 +399,7 @@ public class IndexedDiskCache<K, V> extends AbstractDiskCache<K, V>
      * @param sortedDescriptors
      * @return false if there are overlaps.
      */
-    protected boolean checkForDedOverlaps(final IndexedDiskElementDescriptor[] sortedDescriptors)
+    protected boolean checkForDedOverlaps(final Collection<IndexedDiskElementDescriptor> sortedDescriptors)
     {
         final ElapsedTimer timer = new ElapsedTimer();
         boolean isOk = true;
@@ -1124,7 +1125,7 @@ public class IndexedDiskCache<K, V> extends AbstractDiskCache<K, V>
         log.info("{0}: Beginning Optimization #{1}", logCacheName, timesOptimized);
 
         // CREATE SNAPSHOT
-        IndexedDiskElementDescriptor[] defragList = null;
+        Collection<IndexedDiskElementDescriptor> defragList = null;
 
         storageLock.writeLock().lock();
 
@@ -1153,10 +1154,8 @@ public class IndexedDiskCache<K, V> extends AbstractDiskCache<K, V>
             {
                 if (!queuedPutList.isEmpty())
                 {
-                    defragList = queuedPutList.toArray(new IndexedDiskElementDescriptor[0]);
-
                     // pack them at the end
-                    expectedNextPos = defragFile(defragList, expectedNextPos);
+                    expectedNextPos = defragFile(queuedPutList, expectedNextPos);
                 }
                 // TRUNCATE THE FILE
                 dataFile.truncate(expectedNextPos);
@@ -1197,7 +1196,7 @@ public class IndexedDiskCache<K, V> extends AbstractDiskCache<K, V>
      *            the start position in the file
      * @return this is the potential new file end
      */
-    private long defragFile(final IndexedDiskElementDescriptor[] defragList, final long startingPos)
+    private long defragFile(final Collection<IndexedDiskElementDescriptor> defragList, final long startingPos)
     {
         final ElapsedTimer timer = new ElapsedTimer();
         long preFileSize = 0;
@@ -1208,7 +1207,8 @@ public class IndexedDiskCache<K, V> extends AbstractDiskCache<K, V>
             preFileSize = this.dataFile.length();
             // find the first gap in the disk and start defragging.
             expectedNextPos = startingPos;
-            for (final IndexedDiskElementDescriptor element : defragList) {
+            for (final IndexedDiskElementDescriptor element : defragList)
+            {
                 storageLock.writeLock().lock();
                 try
                 {
@@ -1247,14 +1247,14 @@ public class IndexedDiskCache<K, V> extends AbstractDiskCache<K, V>
      * sorted by position in the dataFile.
      * <p>
      *
-     * @return IndexedDiskElementDescriptor[]
+     * @return Collection<IndexedDiskElementDescriptor>
      */
-    private IndexedDiskElementDescriptor[] createPositionSortedDescriptorList()
+    private Collection<IndexedDiskElementDescriptor> createPositionSortedDescriptorList()
     {
         final List<IndexedDiskElementDescriptor> defragList = new ArrayList<>(keyHash.values());
         Collections.sort(defragList, (ded1, ded2) -> Long.compare(ded1.pos, ded2.pos));
 
-        return defragList.toArray(new IndexedDiskElementDescriptor[0]);
+        return defragList;
     }
 
     /**
diff --git a/commons-jcs3-core/src/main/java/org/apache/commons/jcs3/auxiliary/remote/server/RemoteCacheServer.java b/commons-jcs3-core/src/main/java/org/apache/commons/jcs3/auxiliary/remote/server/RemoteCacheServer.java
index 527839d2..97f13375 100644
--- a/commons-jcs3-core/src/main/java/org/apache/commons/jcs3/auxiliary/remote/server/RemoteCacheServer.java
+++ b/commons-jcs3-core/src/main/java/org/apache/commons/jcs3/auxiliary/remote/server/RemoteCacheServer.java
@@ -26,7 +26,9 @@ import java.rmi.registry.Registry;
 import java.rmi.server.RMISocketFactory;
 import java.rmi.server.UnicastRemoteObject;
 import java.rmi.server.Unreferenced;
+import java.util.ArrayList;
 import java.util.Collections;
+import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
@@ -314,9 +316,10 @@ public class RemoteCacheServer<K, V>
                 // IF LOCAL CLUSTER CONSISTENCY IS CONFIGURED
                 if (!fromCluster || fromCluster && remoteCacheServerAttributes.isLocalClusterConsistency())
                 {
-                    final ICacheEventQueue<K, V>[] qlist = getEventQList( cacheDesc, requesterId );
-                    log.debug( "qlist.length = {0}", qlist.length );
-                    for (final ICacheEventQueue<K, V> element : qlist) {
+                    final List<ICacheEventQueue<K,V>> qlist = getEventQList( cacheDesc, requesterId );
+                    log.debug("qlist.size() = {0}", qlist.size());
+                    for (final ICacheEventQueue<K, V> element : qlist)
+                    {
                         element.addPutEvent( item );
                     }
                 }
@@ -837,9 +840,10 @@ public class RemoteCacheServer<K, V>
                 // IF LOCAL CLUSTER CONSISTENCY IS CONFIGURED
                 if (!fromCluster || fromCluster && remoteCacheServerAttributes.isLocalClusterConsistency())
                 {
-                    final ICacheEventQueue<K, V>[] qlist = getEventQList( cacheDesc, requesterId );
+                    final List<ICacheEventQueue<K,V>> qlist = getEventQList( cacheDesc, requesterId );
 
-                    for (final ICacheEventQueue<K, V> element : qlist) {
+                    for (final ICacheEventQueue<K, V> element : qlist)
+                    {
                         element.addRemoveEvent( key );
                     }
                 }
@@ -921,7 +925,7 @@ public class RemoteCacheServer<K, V>
                 // update registered listeners
                 if (!fromCluster || fromCluster && remoteCacheServerAttributes.isLocalClusterConsistency())
                 {
-                    final ICacheEventQueue<K, V>[] qlist = getEventQList( cacheDesc, requesterId );
+                    final List<ICacheEventQueue<K,V>> qlist = getEventQList( cacheDesc, requesterId );
 
                     for (final ICacheEventQueue<K, V> q : qlist)
                     {
@@ -995,9 +999,10 @@ public class RemoteCacheServer<K, V>
             // best attempt to achieve ordered free-cache-op and notification.
             synchronized ( cacheDesc )
             {
-                final ICacheEventQueue<K, V>[] qlist = getEventQList( cacheDesc, requesterId );
+                final List<ICacheEventQueue<K,V>> qlist = getEventQList( cacheDesc, requesterId );
 
-                for (final ICacheEventQueue<K, V> element : qlist) {
+                for (final ICacheEventQueue<K, V> element : qlist)
+                {
                     element.addDisposeEvent();
                 }
                 cacheManager.freeCache( cacheName );
@@ -1016,9 +1021,10 @@ public class RemoteCacheServer<K, V>
     {
         for (final CacheListeners<K, V> cacheDesc : cacheListenersMap.values())
         {
-            final ICacheEventQueue<K, V>[] qlist = getEventQList( cacheDesc, 0 );
+            final List<ICacheEventQueue<K,V>> qlist = getEventQList( cacheDesc, 0 );
 
-            for (final ICacheEventQueue<K, V> element : qlist) {
+            for (final ICacheEventQueue<K, V> element : qlist)
+            {
                 element.addDisposeEvent();
             }
         }
@@ -1034,7 +1040,6 @@ public class RemoteCacheServer<K, V>
      */
     protected CacheListeners<K, V> getCacheListeners( final String cacheName )
     {
-
         return cacheListenersMap.computeIfAbsent(cacheName, key -> {
             final CompositeCache<K, V> cache = cacheManager.getCache(key);
             return new CacheListeners<>( cache );
@@ -1050,7 +1055,6 @@ public class RemoteCacheServer<K, V>
      */
     protected CacheListeners<K, V> getClusterListeners( final String cacheName )
     {
-
         return clusterListenersMap.computeIfAbsent(cacheName, key -> {
             final CompositeCache<K, V> cache = cacheManager.getCache( cacheName );
             return new CacheListeners<>( cache );
@@ -1069,40 +1073,14 @@ public class RemoteCacheServer<K, V>
      * @param requesterId
      * @return The eventQList value
      */
-    @SuppressWarnings("unchecked") // No generic arrays in java
-    private ICacheEventQueue<K, V>[] getEventQList( final CacheListeners<K, V> cacheListeners, final long requesterId )
+    private List<ICacheEventQueue<K, V>> getEventQList( final CacheListeners<K, V> cacheListeners, final long requesterId )
     {
-        final ICacheEventQueue<K, V>[] list = cacheListeners.eventQMap.values().toArray( new ICacheEventQueue[0] );
-        int count = 0;
-        // Set those not qualified to null; Count those qualified.
-        for ( int i = 0; i < list.length; i++ )
-        {
-            final ICacheEventQueue<K, V> q = list[i];
-            if ( q.isWorking() && q.getListenerId() != requesterId )
-            {
-                count++;
-            }
-            else
-            {
-                list[i] = null;
-            }
-        }
-        if ( count == list.length )
-        {
-            // All qualified.
-            return list;
-        }
+        final List<ICacheEventQueue<K, V>> list = new ArrayList<>(cacheListeners.eventQMap.values());
 
-        // Returns only the qualified.
-        final ICacheEventQueue<K, V>[] qq = new ICacheEventQueue[count];
-        count = 0;
-        for (final ICacheEventQueue<K, V> element : list) {
-            if ( element != null )
-            {
-                qq[count++] = element;
-            }
-        }
-        return qq;
+        // Only return qualified event queues
+        list.removeIf(q -> (!q.isWorking() || q.getListenerId() == requesterId));
+
+        return list;
     }
 
     /**
diff --git a/commons-jcs3-core/src/test/java/org/apache/commons/jcs3/auxiliary/disk/indexed/AbstractIndexDiskCacheUnitTest.java b/commons-jcs3-core/src/test/java/org/apache/commons/jcs3/auxiliary/disk/indexed/AbstractIndexDiskCacheUnitTest.java
index 4729a15e..15f149af 100644
--- a/commons-jcs3-core/src/test/java/org/apache/commons/jcs3/auxiliary/disk/indexed/AbstractIndexDiskCacheUnitTest.java
+++ b/commons-jcs3-core/src/test/java/org/apache/commons/jcs3/auxiliary/disk/indexed/AbstractIndexDiskCacheUnitTest.java
@@ -21,7 +21,9 @@ package org.apache.commons.jcs3.auxiliary.disk.indexed;
 
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -147,12 +149,12 @@ public abstract class AbstractIndexDiskCacheUnitTest extends TestCase
 
         final int numDescriptors = 5;
         int pos = 0;
-        final IndexedDiskElementDescriptor[] sortedDescriptors = new IndexedDiskElementDescriptor[numDescriptors];
+        final List<IndexedDiskElementDescriptor> sortedDescriptors = new ArrayList<>();
         for (int i = 0; i < numDescriptors; i++)
         {
             final IndexedDiskElementDescriptor descriptor = new IndexedDiskElementDescriptor(pos, i * 2);
             pos = pos + (i * 2) + IndexedDisk.HEADER_SIZE_BYTES;
-            sortedDescriptors[i] = descriptor;
+            sortedDescriptors.add(descriptor);
         }
 
         // DO WORK
@@ -175,13 +177,13 @@ public abstract class AbstractIndexDiskCacheUnitTest extends TestCase
 
         final int numDescriptors = 5;
         int pos = 0;
-        final IndexedDiskElementDescriptor[] sortedDescriptors = new IndexedDiskElementDescriptor[numDescriptors];
+        final List<IndexedDiskElementDescriptor> sortedDescriptors = new ArrayList<>();
         for (int i = 0; i < numDescriptors; i++)
         {
             final IndexedDiskElementDescriptor descriptor = new IndexedDiskElementDescriptor(pos, i * 2);
             // don't add the header + IndexedDisk.RECORD_HEADER;
             pos = pos + (i * 2);
-            sortedDescriptors[i] = descriptor;
+            sortedDescriptors.add(descriptor);
         }
 
         // DO WORK