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

cziegeler pushed a commit to branch SLING-11980
in repository 
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-tracer.git


The following commit(s) were added to refs/heads/SLING-11980 by this push:
     new eee9847  Remove usage of guava library
eee9847 is described below

commit eee984715356798c8ec633d40de789dd1a3ede93
Author: Carsten Ziegeler <[email protected]>
AuthorDate: Mon Jul 24 07:41:44 2023 +0200

    Remove usage of guava library
---
 .gitignore                                         |   1 +
 pom.xml                                            |  57 +++++----
 .../sling/tracer/internal/JSONRecording.java       |   8 +-
 .../sling/tracer/internal/PrefixExcludeFilter.java |  17 ++-
 .../sling/tracer/internal/TracerLogServlet.java    | 127 ++++++++++++++++-----
 .../sling/tracer/internal/JSONRecordingTest.java   |   1 -
 .../sling/tracer/internal/LogTracerTest.java       |  22 ++--
 .../tracer/internal/TracerLogServletTest.java      |   5 +-
 8 files changed, 162 insertions(+), 76 deletions(-)

diff --git a/.gitignore b/.gitignore
index 5b783ed..d4bfe7c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
+.vscode
 /target
 .idea
 .classpath
diff --git a/pom.xml b/pom.xml
index b2a3efa..2862422 100644
--- a/pom.xml
+++ b/pom.xml
@@ -62,60 +62,68 @@
 
   <dependencies>
     <dependency>
-      <!-- the used logback version is only compatible with SLF4J 1.6 -->
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-api</artifactId>
+      <version>1.7.32</version>
       <scope>provided</scope>
     </dependency>
     <dependency>
       <groupId>ch.qos.logback</groupId>
       <artifactId>logback-classic</artifactId>
-      <version>1.0.13</version>
+      <version>1.2.10</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.osgi</groupId>
+      <artifactId>osgi.core</artifactId>
+      <version>7.0.0</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.osgi</groupId>
+      <artifactId>org.osgi.service.component.annotations</artifactId>
+      <version>1.4.0</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.osgi</groupId>
+      <artifactId>org.osgi.service.metatype.annotations</artifactId>
+      <version>1.4.0</version>
       <scope>provided</scope>
     </dependency>
     <dependency>
       <groupId>javax.servlet</groupId>
       <artifactId>javax.servlet-api</artifactId>
+      <scope>provided</scope>
     </dependency>
     <dependency>
       <groupId>org.apache.sling</groupId>
       <artifactId>org.apache.sling.commons.osgi</artifactId>
-      <version>2.2.0</version>
+      <version>2.4.2</version>
+      <scope>provided</scope>
     </dependency>
     <dependency>
       <groupId>org.apache.sling</groupId>
       <artifactId>org.apache.sling.api</artifactId>
-      <version>2.2.0</version>
-    </dependency>
-    <dependency>
-      <groupId>org.osgi</groupId>
-      <artifactId>osgi.cmpn</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.osgi</groupId>
-      <artifactId>osgi.core</artifactId>
+      <version>2.27.2</version>
+      <scope>provided</scope>
     </dependency>
     <dependency>
         <groupId>org.apache.felix</groupId>
         <artifactId>org.apache.felix.utils</artifactId>
-        <version>1.9.0</version>
+        <version>1.11.8</version>
         <scope>provided</scope>
     </dependency>
-    <!-- TODO Inline just the cache related classes -->
-    <dependency>
-      <groupId>com.google.guava</groupId>
-      <artifactId>guava</artifactId>
-      <version>15.0</version>
-    </dependency>
     <dependency>
       <groupId>org.apache.felix</groupId>
       <artifactId>org.apache.felix.webconsole</artifactId>
       <version>4.2.0</version>
+      <scope>provided</scope>
     </dependency>
     <dependency>
       <groupId>commons-io</groupId>
       <artifactId>commons-io</artifactId>
-      <version>1.4</version>
+      <version>2.13.0</version>
       <scope>provided</scope>
     </dependency>
     <dependency>
@@ -132,30 +140,31 @@
     <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
+      <version>4.13.2</version>
       <scope>test</scope>
     </dependency>
     <dependency>
       <groupId>org.apache.sling</groupId>
       <artifactId>org.apache.sling.testing.osgi-mock</artifactId>
-      <version>2.3.4</version>
+      <version>3.3.8</version>
       <scope>test</scope>
     </dependency>
     <dependency>
       <groupId>org.apache.sling</groupId>
       <artifactId>org.apache.sling.testing.sling-mock</artifactId>
-      <version>2.2.14</version>
+      <version>3.4.10</version>
       <scope>test</scope>
     </dependency>
     <dependency>
       <groupId>org.mockito</groupId>
       <artifactId>mockito-core</artifactId>
-      <version>4.5.1</version>
+      <version>5.4.0</version>
       <scope>test</scope>
     </dependency>
         <dependency>
       <groupId>org.apache.sling</groupId>
       <artifactId>org.apache.sling.commons.johnzon</artifactId>
-      <version>1.2.14</version>
+      <version>1.2.16</version>
       <scope>test</scope>
     </dependency>
 
diff --git a/src/main/java/org/apache/sling/tracer/internal/JSONRecording.java 
b/src/main/java/org/apache/sling/tracer/internal/JSONRecording.java
index 17d3312..f1b868e 100644
--- a/src/main/java/org/apache/sling/tracer/internal/JSONRecording.java
+++ b/src/main/java/org/apache/sling/tracer/internal/JSONRecording.java
@@ -43,7 +43,6 @@ import java.util.zip.GZIPOutputStream;
 import javax.servlet.http.HttpServletRequest;
 
 import ch.qos.logback.classic.Level;
-import com.google.common.primitives.Longs;
 import org.apache.commons.io.IOUtils;
 import org.apache.felix.utils.json.JSONWriter;
 import org.apache.sling.api.request.RequestProgressTracker;
@@ -53,7 +52,6 @@ import org.slf4j.LoggerFactory;
 import org.slf4j.helpers.FormattingTuple;
 import org.slf4j.helpers.MessageFormatter;
 
-import static com.google.common.base.Preconditions.checkArgument;
 import static org.apache.sling.tracer.internal.Util.count;
 import static org.apache.sling.tracer.internal.Util.nullSafeString;
 import static org.apache.sling.tracer.internal.Util.nullSafeTrim;
@@ -235,7 +233,9 @@ class JSONRecording implements Recording, 
Comparable<JSONRecording> {
         InputStream is = new ByteArrayInputStream(json);
 
         if (compressed) {
-            checkArgument(compress, "Cannot provide compressed response with 
compression disabled");
+            if (!compress) {
+                throw new IllegalArgumentException("Cannot provide compressed 
response with compression disabled");
+            }
             return is;
         }
 
@@ -247,7 +247,7 @@ class JSONRecording implements Recording, 
Comparable<JSONRecording> {
 
     @Override
     public int compareTo(@NotNull JSONRecording o) {
-        return Longs.compare(start, o.start);
+        return Long.compare(start, o.start);
     }
 
     private interface JsonEntry {
diff --git 
a/src/main/java/org/apache/sling/tracer/internal/PrefixExcludeFilter.java 
b/src/main/java/org/apache/sling/tracer/internal/PrefixExcludeFilter.java
index 8199010..20f3d2e 100644
--- a/src/main/java/org/apache/sling/tracer/internal/PrefixExcludeFilter.java
+++ b/src/main/java/org/apache/sling/tracer/internal/PrefixExcludeFilter.java
@@ -19,11 +19,10 @@
 
 package org.apache.sling.tracer.internal;
 
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
-import com.google.common.base.Splitter;
-import com.google.common.collect.ImmutableList;
-
 /**
  * Filter which returns false if the package of stack trace element
  * is part of exclude list of prefixes
@@ -32,11 +31,17 @@ class PrefixExcludeFilter implements CallerFilter{
     private final List<String> prefixesToExclude;
 
     public PrefixExcludeFilter(List<String> prefixes) {
-        this.prefixesToExclude = ImmutableList.copyOf(prefixes);
+        this.prefixesToExclude = Collections.unmodifiableList(prefixes);
     }
 
-    public static PrefixExcludeFilter from(String filter){
-        List<String> prefixes = 
Splitter.on('|').omitEmptyStrings().trimResults().splitToList(filter);
+    public static PrefixExcludeFilter from(String filter) {
+        final List<String> prefixes = new ArrayList<>();
+        for(String v : filter.split("\\|")) {
+            v = v.trim();
+            if (!v.isEmpty()) {
+                prefixes.add(v);
+            }
+        }
         return new PrefixExcludeFilter(prefixes);
     }
 
diff --git 
a/src/main/java/org/apache/sling/tracer/internal/TracerLogServlet.java 
b/src/main/java/org/apache/sling/tracer/internal/TracerLogServlet.java
index 88be9b5..09de28d 100644
--- a/src/main/java/org/apache/sling/tracer/internal/TracerLogServlet.java
+++ b/src/main/java/org/apache/sling/tracer/internal/TracerLogServlet.java
@@ -25,7 +25,11 @@ import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.TimeUnit;
 
@@ -33,13 +37,8 @@ import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import com.google.common.cache.Cache;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.Weigher;
-import org.apache.commons.io.FileUtils;
 import org.apache.felix.utils.json.JSONWriter;
 import org.apache.felix.webconsole.SimpleWebConsolePlugin;
-import org.jetbrains.annotations.NotNull;
 import org.osgi.framework.BundleContext;
 
 class TracerLogServlet extends SimpleWebConsolePlugin implements 
TraceLogRecorder {
@@ -57,7 +56,7 @@ class TracerLogServlet extends SimpleWebConsolePlugin 
implements TraceLogRecorde
 
     public static final int TRACER_PROTOCOL_VERSION = 1;
 
-    private final Cache<String, JSONRecording> cache;
+    private final BoundedCache cache;
 
     private final boolean compressRecording;
 
@@ -74,17 +73,7 @@ class TracerLogServlet extends SimpleWebConsolePlugin 
implements TraceLogRecorde
         this.cacheDurationInSecs = cacheDurationInSecs;
         this.cacheSizeInMB = cacheSizeInMB;
         this.gzipResponse = compressionEnabled && gzipResponse;
-        this.cache = CacheBuilder.newBuilder()
-                .maximumWeight(cacheSizeInMB * FileUtils.ONE_MB)
-                .weigher(new Weigher<String, JSONRecording>() {
-                    @Override
-                    public int weigh(@NotNull  String key, @NotNull 
JSONRecording value) {
-                        return value.size();
-                    }
-                })
-                .expireAfterAccess(cacheDurationInSecs, TimeUnit.SECONDS)
-                .recordStats()
-                .build();
+        this.cache = new BoundedCache(cacheSizeInMB, cacheDurationInSecs);
         register(context);
     }
 
@@ -104,6 +93,96 @@ class TracerLogServlet extends SimpleWebConsolePlugin 
implements TraceLogRecorde
         return cacheDurationInSecs;
     }
 
+    public static class BoundedCache {
+
+        public static class Entry implements Comparable<Entry> {
+            long lastAccessed;
+            JSONRecording recording;
+
+            @Override
+            public int compareTo(Entry o) {
+                return Long.compare(this.lastAccessed, o.lastAccessed);
+            }
+        }
+
+        private final Map<String, Entry> cache = new HashMap<>();
+
+        private final long maxSize;
+
+        private volatile long currentSize;
+
+        private final long cacheDurationInMillis;
+
+        public BoundedCache(final long maxSizeInMB, final long 
cacheDurationInSecs) {
+            this.maxSize = maxSizeInMB * 1024 * 1024;
+            this.cacheDurationInMillis = 
TimeUnit.SECONDS.toMillis(cacheDurationInSecs);
+        }
+
+        public synchronized JSONRecording get(final String requestId) {
+            checkCache();
+            final Entry entry = this.cache.get(requestId);
+            if (entry != null) {
+                entry.lastAccessed = System.currentTimeMillis();
+                cache.put(requestId, entry);
+                return entry.recording;
+            }
+            return null;
+        }
+
+        public synchronized void put(final String requestId, final 
JSONRecording recording) {
+            final Entry entry = new Entry();
+            entry.lastAccessed = System.currentTimeMillis();
+            entry.recording = recording;
+            cache.put(requestId, entry);
+            this.currentSize += recording.size();
+            checkCache();
+        }
+
+        private void checkCache() {
+            final Set<String> toRemove = new HashSet<>();
+            final ArrayList<Entry> list = new ArrayList<>(this.cache.values());
+            Collections.sort(list);
+            if ( this.currentSize > this.maxSize ) {
+                while (this.currentSize > this.maxSize && !list.isEmpty()) {
+                    final Entry entry = list.remove(list.size() - 1);
+                    toRemove.add(entry.recording.getRequestId());
+                    currentSize -= entry.recording.size();
+                }
+            }
+            final long time = System.currentTimeMillis() - 
this.cacheDurationInMillis;
+            for(final Entry entry : list) {
+                if ( entry.lastAccessed < time ) {
+                    toRemove.add(entry.recording.getRequestId());
+                    currentSize -= entry.recording.size();
+                }
+            }
+            for(final String key : toRemove) {
+                this.cache.remove(key);
+            }
+        }
+
+        public synchronized int size() {
+            return this.cache.size();
+        }
+
+        public synchronized long memorySize() {
+            return this.currentSize;
+        }
+
+        public synchronized void clear() {
+            this.cache.clear();
+            this.currentSize = 0;
+        }
+
+        public synchronized List<JSONRecording> asList() {
+            final List<JSONRecording> result = new ArrayList<>();
+            for(final Entry entry : this.cache.values()) {
+                result.add(entry.recording);
+            }
+            return result;
+        }
+    }
+
     //~-----------------------------------------------< WebConsole Plugin >
 
     @Override
@@ -118,7 +197,7 @@ class TracerLogServlet extends SimpleWebConsolePlugin 
implements TraceLogRecorde
             try {
                 boolean responseDone = false;
                 if (requestId != null) {
-                    JSONRecording recording = cache.getIfPresent(requestId);
+                    JSONRecording recording = cache.get(requestId);
                     if (recording != null){
                         boolean shouldGZip = prepareForGZipResponse(request, 
response);
                         responseDone = 
recording.render(response.getOutputStream(), shouldGZip);
@@ -193,17 +272,13 @@ class TracerLogServlet extends SimpleWebConsolePlugin 
implements TraceLogRecorde
     }
 
     private String memorySize() {
-        long size = 0;
-        for (JSONRecording r : cache.asMap().values()){
-            size += r.size();
-        }
-        return humanReadableByteCount(size);
+        return humanReadableByteCount(cache.memorySize());
     }
 
     private void renderRequests(PrintWriter pw) {
         if (cache.size() > 0){
             pw.println("<ol>");
-            List<JSONRecording> recordings = new 
ArrayList<JSONRecording>(cache.asMap().values());
+            List<JSONRecording> recordings = cache.asList();
             SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
             Collections.sort(recordings);
             for (JSONRecording r : recordings){
@@ -271,7 +346,7 @@ class TracerLogServlet extends SimpleWebConsolePlugin 
implements TraceLogRecorde
     }
 
     Recording getRecording(String requestId) {
-        Recording recording = cache.getIfPresent(requestId);
+        Recording recording = cache.get(requestId);
         return recording == null ? Recording.NOOP : recording;
     }
 
@@ -304,6 +379,6 @@ class TracerLogServlet extends SimpleWebConsolePlugin 
implements TraceLogRecorde
     }
 
     void resetCache(){
-        cache.invalidateAll();
+        cache.clear();
     }
 }
diff --git 
a/src/test/java/org/apache/sling/tracer/internal/JSONRecordingTest.java 
b/src/test/java/org/apache/sling/tracer/internal/JSONRecordingTest.java
index f5f1eff..282ebf2 100644
--- a/src/test/java/org/apache/sling/tracer/internal/JSONRecordingTest.java
+++ b/src/test/java/org/apache/sling/tracer/internal/JSONRecordingTest.java
@@ -36,7 +36,6 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.assertFalse;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
diff --git a/src/test/java/org/apache/sling/tracer/internal/LogTracerTest.java 
b/src/test/java/org/apache/sling/tracer/internal/LogTracerTest.java
index 41b67c8..4cad5fb 100644
--- a/src/test/java/org/apache/sling/tracer/internal/LogTracerTest.java
+++ b/src/test/java/org/apache/sling/tracer/internal/LogTracerTest.java
@@ -59,12 +59,10 @@ import org.slf4j.LoggerFactory;
 
 import static org.apache.sling.tracer.internal.TestUtil.createTracker;
 import static org.apache.sling.tracer.internal.TestUtil.getRequestId;
-import static org.hamcrest.CoreMatchers.hasItem;
-import static org.hamcrest.CoreMatchers.not;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
@@ -260,17 +258,17 @@ public class LogTracerTest {
         assertNull(context.getService(TurboFilter.class));
 
         List<String> logs = logCollector.getLogs();
-        assertThat(logs, hasItem("a-info"));
-        assertThat(logs, not(hasItem("a-debug")));
+        assertTrue(logs.contains("a-info"));
+        assertFalse(logs.contains("a-debug"));
 
-        assertThat(logs, hasItem("a.b-info"));
-        assertThat(logs, hasItem("a.b-debug"));
-        assertThat(logs, not(hasItem("a.b-trace")));
+        assertTrue(logs.contains("a.b-info"));
+        assertTrue(logs.contains("a.b-debug"));
+        assertFalse(logs.contains("a.b-trace"));
 
-        assertThat(logs, hasItem("a.b.c-debug"));
-        assertThat(logs, hasItem("a.b.c-trace"));
-        assertThat(logs, hasItem("a.b.c-trace2"));
-        assertThat(logs, hasItem("a.b.c.d-trace"));
+        assertTrue(logs.contains("a.b.c-debug"));
+        assertTrue(logs.contains("a.b.c-trace"));
+        assertTrue(logs.contains("a.b.c-trace2"));
+        assertTrue(logs.contains("a.b.c.d-trace"));
 
         rootLogger().setLevel(oldLevel);
     }
diff --git 
a/src/test/java/org/apache/sling/tracer/internal/TracerLogServletTest.java 
b/src/test/java/org/apache/sling/tracer/internal/TracerLogServletTest.java
index 60983f6..d0b2738 100644
--- a/src/test/java/org/apache/sling/tracer/internal/TracerLogServletTest.java
+++ b/src/test/java/org/apache/sling/tracer/internal/TracerLogServletTest.java
@@ -46,11 +46,10 @@ import org.mockito.junit.MockitoJUnit;
 import org.mockito.junit.MockitoRule;
 
 import static org.apache.sling.tracer.internal.TestUtil.createTracker;
-import static org.hamcrest.CoreMatchers.containsString;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -164,7 +163,7 @@ public class TracerLogServletTest {
         when(response.getWriter()).thenReturn(new PrintWriter(sw));
         logServlet.renderContent(request, response);
 
-        assertThat(sw.toString(), containsString("Log Tracer"));
+        assertTrue(sw.toString().contains("Log Tracer"));
     }
 
     private static class ByteArrayServletOutputStream extends 
ServletOutputStream {

Reply via email to