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 {