This is an automated email from the ASF dual-hosted git repository. cziegeler pushed a commit to branch refactor/upgrade-to-java-17 in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-tracer.git
commit cfc3d13e6a578e2964d7c362b4f9733476424f45 Author: Carsten Ziegeler <[email protected]> AuthorDate: Tue May 12 16:14:30 2026 +0200 Update to latest parent pom --- pom.xml | 278 ++++++++++----------- .../apache/sling/tracer/internal/CallerFilter.java | 1 - .../apache/sling/tracer/internal/CallerFinder.java | 5 +- .../sling/tracer/internal/CallerStackReporter.java | 20 +- .../sling/tracer/internal/Configuration.java | 35 ++- .../sling/tracer/internal/JSONRecording.java | 83 +++--- .../apache/sling/tracer/internal/LogTracer.java | 98 ++++---- .../sling/tracer/internal/PrefixExcludeFilter.java | 9 +- .../apache/sling/tracer/internal/Recording.java | 13 +- .../sling/tracer/internal/TraceLogRecorder.java | 5 +- .../apache/sling/tracer/internal/TracerConfig.java | 6 +- .../sling/tracer/internal/TracerContext.java | 20 +- .../sling/tracer/internal/TracerLogServlet.java | 75 +++--- .../apache/sling/tracer/internal/TracerSet.java | 17 +- .../org/apache/sling/tracer/internal/Util.java | 9 +- .../sling/tracer/internal/BoundedCacheTest.java | 18 +- .../sling/tracer/internal/CallerFinderTest.java | 56 +---- .../tracer/internal/CallerStackReporterTest.java | 22 +- .../sling/tracer/internal/JSONRecordingTest.java | 59 +++-- .../sling/tracer/internal/LogTracerModelTest.java | 16 +- .../sling/tracer/internal/LogTracerTest.java | 88 +++---- .../org/apache/sling/tracer/internal/TestUtil.java | 5 +- .../tracer/internal/TracerLogServletTest.java | 70 +++--- .../sling/tracer/internal/TracerSetTest.java | 16 +- .../org/apache/sling/tracer/internal/UtilTest.java | 12 +- 25 files changed, 487 insertions(+), 549 deletions(-) diff --git a/pom.xml b/pom.xml index ecfa19f..6e98812 100644 --- a/pom.xml +++ b/pom.xml @@ -1,4 +1,4 @@ -<?xml version="1.0"?> +<?xml version="1.0" encoding="UTF-8"?> <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file @@ -19,154 +19,152 @@ --> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> - <modelVersion>4.0.0</modelVersion> + <parent> + <groupId>org.apache.sling</groupId> + <artifactId>sling-bundle-parent</artifactId> + <version>66</version> + </parent> - <parent> - <groupId>org.apache.sling</groupId> - <artifactId>sling-bundle-parent</artifactId> - <version>47</version> - </parent> + <artifactId>org.apache.sling.tracer</artifactId> + <version>1.0.9-SNAPSHOT</version> - <artifactId>org.apache.sling.tracer</artifactId> - <version>1.0.9-SNAPSHOT</version> - - <name>Apache Sling Log Tracer</name> - <description> - Tracer provides support for enabling the logs for specific category at specific level and + <name>Apache Sling Log Tracer</name> + <description>Tracer provides support for enabling the logs for specific category at specific level and only for specific request. It provides a very fine level of control via config provided as part of HTTP request around how the logging should be performed for given category. - Refer to http://sling.apache.org/documentation/bundles/log-tracers.html - </description> + Refer to http://sling.apache.org/documentation/bundles/log-tracers.html</description> - <scm> - <connection>scm:git:https://gitbox.apache.org/repos/asf/sling-org-apache-sling-tracer.git</connection> - <developerConnection>scm:git:https://gitbox.apache.org/repos/asf/sling-org-apache-sling-tracer.git</developerConnection> - <url>https://github.com/apache/sling-org-apache-sling-tracer.git</url> - <tag>HEAD</tag> - </scm> + <scm> + <connection>scm:git:https://gitbox.apache.org/repos/asf/sling-org-apache-sling-tracer.git</connection> + <developerConnection>scm:git:https://gitbox.apache.org/repos/asf/sling-org-apache-sling-tracer.git</developerConnection> + <tag>HEAD</tag> + <url>https://github.com/apache/sling-org-apache-sling-tracer.git</url> + </scm> - <properties> - <project.build.outputTimestamp>1691038226</project.build.outputTimestamp> - </properties> + <properties> + <sling.java.version>11</sling.java.version> + <project.build.outputTimestamp>1691038226</project.build.outputTimestamp> + </properties> - <build> - <plugins> - <plugin> - <groupId>biz.aQute.bnd</groupId> - <artifactId>bnd-maven-plugin</artifactId> - </plugin> - </plugins> - </build> + <dependencies> + <dependency> + <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.2.10</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.osgi</groupId> + <artifactId>org.osgi.framework</artifactId> + <version>1.10.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.4.2</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.apache.sling</groupId> + <artifactId>org.apache.sling.api</artifactId> + <version>2.27.2</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.apache.felix</groupId> + <artifactId>org.apache.felix.utils</artifactId> + <version>1.11.8</version> + <scope>provided</scope> + </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>2.13.0</version> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.jetbrains</groupId> + <artifactId>annotations</artifactId> + <scope>provided</scope> + </dependency> + <dependency> + <groupId>org.osgi</groupId> + <artifactId>org.osgi.service.http.whiteboard</artifactId> + <version>1.0.0</version> + <scope>provided</scope> + </dependency> + <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.junit4</artifactId> + <version>3.3.8</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.apache.sling</groupId> + <artifactId>org.apache.sling.testing.sling-mock.junit4</artifactId> + <version>3.4.10</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.mockito</groupId> + <artifactId>mockito-core</artifactId> + <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.16</version> + <scope>test</scope> + </dependency> - <dependencies> - <dependency> - <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.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.4.2</version> - <scope>provided</scope> - </dependency> - <dependency> - <groupId>org.apache.sling</groupId> - <artifactId>org.apache.sling.api</artifactId> - <version>2.27.2</version> - <scope>provided</scope> - </dependency> - <dependency> - <groupId>org.apache.felix</groupId> - <artifactId>org.apache.felix.utils</artifactId> - <version>1.11.8</version> - <scope>provided</scope> - </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>2.13.0</version> - <scope>provided</scope> - </dependency> - <dependency> - <groupId>org.jetbrains</groupId> - <artifactId>annotations</artifactId> - <scope>provided</scope> - </dependency> - <dependency> - <groupId>org.osgi</groupId> - <artifactId>org.osgi.service.http.whiteboard</artifactId> - <version>1.0.0</version> - <scope>provided</scope> - </dependency> - <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.junit4</artifactId> - <version>3.3.8</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.apache.sling</groupId> - <artifactId>org.apache.sling.testing.sling-mock.junit4</artifactId> - <version>3.4.10</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.mockito</groupId> - <artifactId>mockito-core</artifactId> - <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.16</version> - <scope>test</scope> - </dependency> + </dependencies> - </dependencies> + <build> + <plugins> + <plugin> + <groupId>biz.aQute.bnd</groupId> + <artifactId>bnd-maven-plugin</artifactId> + </plugin> + </plugins> + </build> </project> diff --git a/src/main/java/org/apache/sling/tracer/internal/CallerFilter.java b/src/main/java/org/apache/sling/tracer/internal/CallerFilter.java index 56d8ca7..77905e0 100644 --- a/src/main/java/org/apache/sling/tracer/internal/CallerFilter.java +++ b/src/main/java/org/apache/sling/tracer/internal/CallerFilter.java @@ -16,7 +16,6 @@ * specific language governing permissions and limitations * under the License. */ - package org.apache.sling.tracer.internal; interface CallerFilter { diff --git a/src/main/java/org/apache/sling/tracer/internal/CallerFinder.java b/src/main/java/org/apache/sling/tracer/internal/CallerFinder.java index 13d7ba1..f772e02 100644 --- a/src/main/java/org/apache/sling/tracer/internal/CallerFinder.java +++ b/src/main/java/org/apache/sling/tracer/internal/CallerFinder.java @@ -16,7 +16,6 @@ * specific language governing permissions and limitations * under the License. */ - package org.apache.sling.tracer.internal; import org.jetbrains.annotations.Nullable; @@ -49,8 +48,8 @@ class CallerFinder { if (i > 0) { StackTraceElement next = stack[i - 1]; - //now scan each element and check if the *next* stack element belongs to any - //api package. If yes then current stack would be the caller + // now scan each element and check if the *next* stack element belongs to any + // api package. If yes then current stack would be the caller for (String pkg : apiPkgs) { if (next.getClassName().startsWith(pkg)) { return current; diff --git a/src/main/java/org/apache/sling/tracer/internal/CallerStackReporter.java b/src/main/java/org/apache/sling/tracer/internal/CallerStackReporter.java index 59006bb..646a7e9 100644 --- a/src/main/java/org/apache/sling/tracer/internal/CallerStackReporter.java +++ b/src/main/java/org/apache/sling/tracer/internal/CallerStackReporter.java @@ -16,7 +16,6 @@ * specific language governing permissions and limitations * under the License. */ - package org.apache.sling.tracer.internal; import java.util.ArrayList; @@ -34,35 +33,34 @@ class CallerStackReporter { "org.apache.sling.tracer.internal", "ch.qos.logback.classic", "sun.reflect", - "java.lang.reflect" - )); + "java.lang.reflect")); + private final CallerFilter callerFilter; private final int start; private final int depth; - public CallerStackReporter(int depth){ + public CallerStackReporter(int depth) { this(0, depth, CallerFilter.ALL); } - public CallerStackReporter(int start, int depth, CallerFilter filter){ + public CallerStackReporter(int start, int depth, CallerFilter filter) { this.start = start; this.depth = depth; this.callerFilter = filter; } - public List<StackTraceElement> report(){ + public List<StackTraceElement> report() { return report(Thread.currentThread().getStackTrace()); } - public List<StackTraceElement> report(StackTraceElement[] stack){ + public List<StackTraceElement> report(StackTraceElement[] stack) { List<StackTraceElement> filteredStack = fwkExcludedStack(stack); List<StackTraceElement> result = new ArrayList<StackTraceElement>(filteredStack.size()); - //Iterate over the filtered stack with limits applicable on that not on actual stack + // Iterate over the filtered stack with limits applicable on that not on actual stack for (int i = 0; i < filteredStack.size(); i++) { StackTraceElement ste = filteredStack.get(i); - if (i >= start && i < depth - && callerFilter.include(ste)){ + if (i >= start && i < depth && callerFilter.include(ste)) { result.add(ste); } } @@ -72,7 +70,7 @@ class CallerStackReporter { private List<StackTraceElement> fwkExcludedStack(StackTraceElement[] stack) { List<StackTraceElement> filteredStack = new ArrayList<StackTraceElement>(stack.length); for (StackTraceElement ste : stack) { - if (FWK_EXCLUDE_FILTER.include(ste)){ + if (FWK_EXCLUDE_FILTER.include(ste)) { filteredStack.add(ste); } } diff --git a/src/main/java/org/apache/sling/tracer/internal/Configuration.java b/src/main/java/org/apache/sling/tracer/internal/Configuration.java index c2fb956..decb0c1 100644 --- a/src/main/java/org/apache/sling/tracer/internal/Configuration.java +++ b/src/main/java/org/apache/sling/tracer/internal/Configuration.java @@ -16,36 +16,34 @@ * specific language governing permissions and limitations * under the License. */ - package org.apache.sling.tracer.internal; import org.osgi.service.metatype.annotations.AttributeDefinition; import org.osgi.service.metatype.annotations.ObjectClassDefinition; -@ObjectClassDefinition(name = "Apache Sling Log Tracer", - description = "Provides support for enabling log for specific loggers on per request basis. " + - "Refer to http://sling.apache.org/documentation/bundles/log-tracers.html for " + - "more details") +@ObjectClassDefinition( + name = "Apache Sling Log Tracer", + description = "Provides support for enabling log for specific loggers on per request basis. " + + "Refer to http://sling.apache.org/documentation/bundles/log-tracers.html for " + + "more details") public @interface Configuration { @AttributeDefinition( name = "Tracer Sets", - description = "Default list of tracer sets configured. Tracer Set config confirms " + - "to following format. <set name> : <logger name>;level=<level name>, other loggers") + description = "Default list of tracer sets configured. Tracer Set config confirms " + + "to following format. <set name> : <logger name>;level=<level name>, other loggers") String[] tracerSets() default { - "oak-query : org.apache.jackrabbit.oak.query.QueryEngineImpl;level=debug", - "oak-writes : org.apache.jackrabbit.oak.jcr.operations.writes;level=trace" + "oak-query : org.apache.jackrabbit.oak.query.QueryEngineImpl;level=debug", + "oak-writes : org.apache.jackrabbit.oak.jcr.operations.writes;level=trace" }; - @AttributeDefinition( - name = "Enabled", - description = "Enable the Tracer") + @AttributeDefinition(name = "Enabled", description = "Enable the Tracer") boolean enabled(); @AttributeDefinition( name = "Recording Servlet Enabled", - description = "Enable the Tracer Servlet. This servlet is required for the tracer recording feature " + - "to work and provides access to the json dump of the recording performed") + description = "Enable the Tracer Servlet. This servlet is required for the tracer recording feature " + + "to work and provides access to the json dump of the recording performed") boolean servletEnabled(); @AttributeDefinition( @@ -58,14 +56,9 @@ public @interface Configuration { description = "Time in seconds upto which the recording data would be held in memory before expiry") long recordingCacheDurationInSecs() default 60 * 15; - @AttributeDefinition( - name = "Compress Recording", - description = "Enable compression for recoding held in memory") + @AttributeDefinition(name = "Compress Recording", description = "Enable compression for recoding held in memory") boolean recordingCompressionEnabled() default true; - @AttributeDefinition( - name = "GZip Response", - description = "If enabled the response sent would be compressed") + @AttributeDefinition(name = "GZip Response", description = "If enabled the response sent would be compressed") boolean gzipResponse() default true; - } 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 f1b868e..4f18fbd 100644 --- a/src/main/java/org/apache/sling/tracer/internal/JSONRecording.java +++ b/src/main/java/org/apache/sling/tracer/internal/JSONRecording.java @@ -16,9 +16,10 @@ * specific language governing permissions and limitations * under the License. */ - package org.apache.sling.tracer.internal; +import javax.servlet.http.HttpServletRequest; + import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -40,8 +41,6 @@ import java.util.Set; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; -import javax.servlet.http.HttpServletRequest; - import ch.qos.logback.classic.Level; import org.apache.commons.io.IOUtils; import org.apache.felix.utils.json.JSONWriter; @@ -58,8 +57,8 @@ import static org.apache.sling.tracer.internal.Util.nullSafeTrim; class JSONRecording implements Recording, Comparable<JSONRecording> { private static final String[] QUERY_API_PKGS = { - "org.apache.sling.resourceresolver", //Sling package would come first in stack so listed first - "org.apache.jackrabbit.oak" + "org.apache.sling.resourceresolver", // Sling package would come first in stack so listed first + "org.apache.jackrabbit.oak" }; private static final Object[] EMPTY = new Object[0]; private static final Logger log = LoggerFactory.getLogger(JSONRecording.class); @@ -103,7 +102,7 @@ class JSONRecording implements Recording, Comparable<JSONRecording> { } public int size() { - if (json != null){ + if (json != null) { return json.length; } return 0; @@ -125,7 +124,7 @@ class JSONRecording implements Recording, Comparable<JSONRecording> { return start; } - //~---------------------------------------< Recording > + // ~---------------------------------------< Recording > @Override public void log(TracerConfig tc, Level level, String logger, FormattingTuple tuple) { @@ -150,8 +149,8 @@ class JSONRecording implements Recording, Comparable<JSONRecording> { if (json == null) { json = toJSON(); - //Let the tracker and other references go to - //not occupy memory + // Let the tracker and other references go to + // not occupy memory tracker = null; queries.clear(); logs.clear(); @@ -207,10 +206,10 @@ class JSONRecording implements Recording, Comparable<JSONRecording> { jw.key("requestProgressLogs"); jw.array(); Iterator<String> it = tracker.getMessages(); - //Per docs iterator can be null + // Per docs iterator can be null while (it != null && it.hasNext()) { String entry = it.next(); - if (entry != null){ + if (entry != null) { jw.value(entry.trim()); } } @@ -271,18 +270,18 @@ class JSONRecording implements Recording, Comparable<JSONRecording> { } private static List<StackTraceElement> getCallerData(TracerConfig tc) { - if (tc.isReportCallerStack()){ + if (tc.isReportCallerStack()) { return tc.getCallerReporter().report(); } return Collections.emptyList(); } private static String[] getParams(FormattingTuple tuple) { - //Eagerly convert arg to string so that if arg is bound by context like - //session then it gets evaluated when that is valid i.e. at time of call itself + // Eagerly convert arg to string so that if arg is bound by context like + // session then it gets evaluated when that is valid i.e. at time of call itself Object[] params = tuple.getArgArray(); String[] strParams = null; - if (params != null){ + if (params != null) { strParams = new String[params.length]; for (int i = 0; i < params.length; i++) { strParams[i] = toString(params[i]); @@ -292,7 +291,7 @@ class JSONRecording implements Recording, Comparable<JSONRecording> { } private static String toString(Object o) { - //Make use of Slf4j null safe toString support! + // Make use of Slf4j null safe toString support! return MessageFormatter.format("{}", o).getMessage(); } @@ -320,12 +319,11 @@ class JSONRecording implements Recording, Comparable<JSONRecording> { Throwable t = tuple.getThrowable(); if (t != null) { - //Later we can look into using Logback Throwable handling + // Later we can look into using Logback Throwable handling jw.key("exception").value(getStackTraceAsString(t)); - } - if (!caller.isEmpty()){ + if (!caller.isEmpty()) { jw.key("caller"); jw.array(); for (StackTraceElement o : caller) { @@ -362,40 +360,41 @@ class JSONRecording implements Recording, Comparable<JSONRecording> { int subPlans = 0; public void record(Level level, String logger, FormattingTuple tuple) { - //Assuming in a series of log statement from query package we see 'query' - //and then 'plan' then once both are not null then it means that one query - //execution is complete and we push the entry and reset the state - //This is done as we do not have a definitive way to determine when - //a given query processing is done + // Assuming in a series of log statement from query package we see 'query' + // and then 'plan' then once both are not null then it means that one query + // execution is complete and we push the entry and reset the state + // This is done as we do not have a definitive way to determine when + // a given query processing is done attemptQueryEntry(); - //TODO Query time. Change Oak to provide this information via some - //dedicated Audit logging such that below reliance on impl details - //can be avoided + // TODO Query time. Change Oak to provide this information via some + // dedicated Audit logging such that below reliance on impl details + // can be avoided String msg = tuple.getMessage(); if (Level.DEBUG == level && msg != null) { Object[] args = tuple.getArgArray() == null ? EMPTY : tuple.getArgArray(); - if (query == null){ + if (query == null) { if ("org.apache.jackrabbit.oak.query.QueryEngineImpl".equals(logger) - && msg.contains("Parsing") && args.length == 2){ - //LOG.debug("Parsing {} statement: {}", language, statement); + && msg.contains("Parsing") + && args.length == 2) { + // LOG.debug("Parsing {} statement: {}", language, statement); query = nullSafeString(args[1]); caller = determineCaller(); } } - //Plan for union query are logged separately - if (plan == null){ - if ("org.apache.jackrabbit.oak.query.QueryImpl".equals(logger) - && msg.startsWith("query plan ")){ - //logDebug("query execute " + statement); + // Plan for union query are logged separately + if (plan == null) { + if ("org.apache.jackrabbit.oak.query.QueryImpl".equals(logger) && msg.startsWith("query plan ")) { + // logDebug("query execute " + statement); if (subPlans == 0) { plan = msg.substring("query plan ".length()); } else { subPlans--; } } else if ("org.apache.jackrabbit.oak.query.UnionQueryImpl".equals(logger) - && msg.contains("query union plan") && args.length > 0){ + && msg.contains("query union plan") + && args.length > 0) { // LOG.debug("query union plan {}", getPlan()); plan = nullSafeString(args[0]); @@ -410,7 +409,8 @@ class JSONRecording implements Recording, Comparable<JSONRecording> { } private String determineCaller() { - StackTraceElement caller = queryCallerFinder.determineCaller(Thread.currentThread().getStackTrace()); + StackTraceElement caller = + queryCallerFinder.determineCaller(Thread.currentThread().getStackTrace()); if (caller != null) { return caller.toString(); } @@ -421,17 +421,16 @@ class JSONRecording implements Recording, Comparable<JSONRecording> { * Checks if both plan and query are determined. If yes then pushes them to list * and resets the state. */ - public void attemptQueryEntry(){ - if (query != null && plan != null){ + public void attemptQueryEntry() { + if (query != null && plan != null) { queries.add(new QueryEntry(nullSafeTrim(query), nullSafeTrim(plan), caller)); plan = query = null; } } - public void done(){ - //Push any last pending entry i.e. last query + public void done() { + // Push any last pending entry i.e. last query attemptQueryEntry(); } } - } diff --git a/src/main/java/org/apache/sling/tracer/internal/LogTracer.java b/src/main/java/org/apache/sling/tracer/internal/LogTracer.java index 2df93e3..d36a4e1 100644 --- a/src/main/java/org/apache/sling/tracer/internal/LogTracer.java +++ b/src/main/java/org/apache/sling/tracer/internal/LogTracer.java @@ -18,6 +18,15 @@ */ package org.apache.sling.tracer.internal; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + import java.io.IOException; import java.util.ArrayList; import java.util.Dictionary; @@ -29,15 +38,6 @@ import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.turbo.TurboFilter; @@ -86,8 +86,6 @@ public class LogTracer { public static final String HEADER_TRACER = "Sling-Tracers"; - - private static final org.slf4j.Logger LOG = LoggerFactory.getLogger(LogTracer.class); private final Map<String, TracerSet> tracers = new HashMap<String, TracerSet>(); @@ -98,8 +96,7 @@ public class LogTracer { private ServiceRegistration filterRegistration; - private final AtomicReference<ServiceRegistration> logCollectorReg - = new AtomicReference<ServiceRegistration>(); + private final AtomicReference<ServiceRegistration> logCollectorReg = new AtomicReference<ServiceRegistration>(); private final AtomicInteger logCollectorRegCount = new AtomicInteger(); @@ -125,10 +122,15 @@ public class LogTracer { boolean compressionEnabled = config.recordingCompressionEnabled(); boolean gzipResponse = config.gzipResponse(); - this.logServlet = new TracerLogServlet(context, cacheSize, cacheDuration, compressionEnabled, gzipResponse); + this.logServlet = + new TracerLogServlet(context, cacheSize, cacheDuration, compressionEnabled, gzipResponse); recorder = logServlet; - LOG.info("Tracer recoding enabled with cacheSize {} MB, expiry {} secs, compression {}, gzip response {}", - cacheSize, cacheDuration, compressionEnabled, gzipResponse); + LOG.info( + "Tracer recoding enabled with cacheSize {} MB, expiry {} secs, compression {}, gzip response {}", + cacheSize, + cacheDuration, + compressionEnabled, + gzipResponse); } LOG.info("Log tracer enabled. Required filters registered. Tracer servlet enabled {}", servletEnabled); } @@ -159,7 +161,7 @@ public class LogTracer { } TracerContext getTracerContext(String tracerSetNames, String tracerConfig, Recording recording) { - //No config or tracer set name provided. So tracing not required + // No config or tracer set name provided. So tracing not required tracerConfig = trimToNull(tracerConfig); tracerSetNames = trimToNull(tracerSetNames); @@ -204,19 +206,19 @@ public class LogTracer { Dictionary<String, Object> slingFilterProps = new Hashtable<String, Object>(); slingFilterProps.put("sling.filter.scope", "REQUEST"); slingFilterProps.put(Constants.SERVICE_DESCRIPTION, "Sling Filter required for Log Tracer"); - slingFilterRegistration = context.registerService(Filter.class.getName(), - new SlingTracerFilter(), slingFilterProps); + slingFilterRegistration = + context.registerService(Filter.class.getName(), new SlingTracerFilter(), slingFilterProps); Dictionary<String, Object> filterProps = new Hashtable<String, Object>(); filterProps.put("pattern", "/.*"); filterProps.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_FILTER_PATTERN, "/"); - filterProps.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, + filterProps.put( + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=*)"); filterProps.put(Constants.SERVICE_DESCRIPTION, "Servlet Filter required for Log Tracer"); - filterRegistration = context.registerService(Filter.class.getName(), - new TracerFilter(), filterProps); + filterRegistration = context.registerService(Filter.class.getName(), new TracerFilter(), filterProps); } /** @@ -232,8 +234,8 @@ public class LogTracer { synchronized (logCollectorRegCount) { int count = logCollectorRegCount.getAndIncrement(); if (count == 0) { - ServiceRegistration reg = bundleContext.registerService(TurboFilter.class.getName(), - new LogCollector(), null); + ServiceRegistration reg = + bundleContext.registerService(TurboFilter.class.getName(), new LogCollector(), null); logCollectorReg.set(reg); } } @@ -251,13 +253,10 @@ public class LogTracer { private abstract class AbstractFilter implements Filter { @Override - public void init(FilterConfig filterConfig) throws ServletException { - } + public void init(FilterConfig filterConfig) throws ServletException {} @Override - public void destroy() { - - } + public void destroy() {} protected void enableCollector(TracerContext tracerContext) { requestContextHolder.set(tracerContext); @@ -277,21 +276,21 @@ public class LogTracer { private class TracerFilter extends AbstractFilter { @Override - public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, - FilterChain filterChain) throws IOException, ServletException { + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) + throws IOException, ServletException { - //At generic filter level we just check for tracer hint via Header (later Cookie) - //and not touch the request parameter to avoid eager initialization of request - //parameter map + // At generic filter level we just check for tracer hint via Header (later Cookie) + // and not touch the request parameter to avoid eager initialization of request + // parameter map HttpServletRequest httpRequest = (HttpServletRequest) servletRequest; - //Invoke at start so that header can be set. If done at end there is a chance - //that response is committed + // Invoke at start so that header can be set. If done at end there is a chance + // that response is committed Recording recording = recorder.startRecording(httpRequest, (HttpServletResponse) servletResponse); - TracerContext tracerContext = getTracerContext(httpRequest.getHeader(HEADER_TRACER), - httpRequest.getHeader(HEADER_TRACER_CONFIG), recording); + TracerContext tracerContext = getTracerContext( + httpRequest.getHeader(HEADER_TRACER), httpRequest.getHeader(HEADER_TRACER_CONFIG), recording); try { if (tracerContext != null) { enableCollector(tracerContext); @@ -304,8 +303,6 @@ public class LogTracer { recorder.endRecording(httpRequest, recording); } } - - } /** @@ -314,19 +311,21 @@ public class LogTracer { */ private class SlingTracerFilter extends AbstractFilter { @Override - public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, - FilterChain filterChain) throws IOException, ServletException { + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) + throws IOException, ServletException { SlingHttpServletRequest slingRequest = (SlingHttpServletRequest) servletRequest; TracerContext tracerContext = requestContextHolder.get(); Recording recording = recorder.getRecordingForRequest(slingRequest); recording.registerTracker(slingRequest.getRequestProgressTracker()); boolean createdContext = false; - //Check if the global filter created context based on HTTP headers. If not - //then check from request params + // Check if the global filter created context based on HTTP headers. If not + // then check from request params if (tracerContext == null) { - tracerContext = getTracerContext(slingRequest.getParameter(PARAM_TRACER), - slingRequest.getParameter(PARAM_TRACER_CONFIG), recording); + tracerContext = getTracerContext( + slingRequest.getParameter(PARAM_TRACER), + slingRequest.getParameter(PARAM_TRACER_CONFIG), + recording); if (tracerContext != null) { createdContext = true; } @@ -336,7 +335,7 @@ public class LogTracer { if (tracerContext != null) { tracerContext.registerProgressTracker(slingRequest.getRequestProgressTracker()); - //if context created in this filter then enable the collector + // if context created in this filter then enable the collector if (createdContext) { enableCollector(tracerContext); } @@ -356,8 +355,8 @@ public class LogTracer { private static class LogCollector extends TurboFilter { @Override - public FilterReply decide(Marker marker, Logger logger, Level level, - String format, Object[] params, Throwable t) { + public FilterReply decide( + Marker marker, Logger logger, Level level, String format, Object[] params, Throwable t) { TracerContext tracer = requestContextHolder.get(); if (tracer == null) { return FilterReply.NEUTRAL; @@ -378,5 +377,4 @@ public class LogTracer { return FilterReply.NEUTRAL; } } - } 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 20f3d2e..1fc8f0e 100644 --- a/src/main/java/org/apache/sling/tracer/internal/PrefixExcludeFilter.java +++ b/src/main/java/org/apache/sling/tracer/internal/PrefixExcludeFilter.java @@ -16,7 +16,6 @@ * specific language governing permissions and limitations * under the License. */ - package org.apache.sling.tracer.internal; import java.util.ArrayList; @@ -27,7 +26,7 @@ import java.util.List; * Filter which returns false if the package of stack trace element * is part of exclude list of prefixes */ -class PrefixExcludeFilter implements CallerFilter{ +class PrefixExcludeFilter implements CallerFilter { private final List<String> prefixesToExclude; public PrefixExcludeFilter(List<String> prefixes) { @@ -36,7 +35,7 @@ class PrefixExcludeFilter implements CallerFilter{ public static PrefixExcludeFilter from(String filter) { final List<String> prefixes = new ArrayList<>(); - for(String v : filter.split("\\|")) { + for (String v : filter.split("\\|")) { v = v.trim(); if (!v.isEmpty()) { prefixes.add(v); @@ -48,8 +47,8 @@ class PrefixExcludeFilter implements CallerFilter{ @Override public boolean include(StackTraceElement ste) { String className = ste.getClassName(); - for (String prefix : prefixesToExclude){ - if (className.startsWith(prefix)){ + for (String prefix : prefixesToExclude) { + if (className.startsWith(prefix)) { return false; } } diff --git a/src/main/java/org/apache/sling/tracer/internal/Recording.java b/src/main/java/org/apache/sling/tracer/internal/Recording.java index 604652a..84f4ffb 100644 --- a/src/main/java/org/apache/sling/tracer/internal/Recording.java +++ b/src/main/java/org/apache/sling/tracer/internal/Recording.java @@ -16,7 +16,6 @@ * specific language governing permissions and limitations * under the License. */ - package org.apache.sling.tracer.internal; import ch.qos.logback.classic.Level; @@ -26,19 +25,13 @@ import org.slf4j.helpers.FormattingTuple; interface Recording { Recording NOOP = new Recording() { @Override - public void log(TracerConfig tc, Level level, String logger, FormattingTuple tuple) { - - } + public void log(TracerConfig tc, Level level, String logger, FormattingTuple tuple) {} @Override - public void registerTracker(RequestProgressTracker tracker) { - - } + public void registerTracker(RequestProgressTracker tracker) {} @Override - public void recordCategory(String loggerName) { - - } + public void recordCategory(String loggerName) {} }; void log(TracerConfig tc, Level level, String logger, FormattingTuple tuple); diff --git a/src/main/java/org/apache/sling/tracer/internal/TraceLogRecorder.java b/src/main/java/org/apache/sling/tracer/internal/TraceLogRecorder.java index 6aeb313..589700a 100644 --- a/src/main/java/org/apache/sling/tracer/internal/TraceLogRecorder.java +++ b/src/main/java/org/apache/sling/tracer/internal/TraceLogRecorder.java @@ -16,7 +16,6 @@ * specific language governing permissions and limitations * under the License. */ - package org.apache.sling.tracer.internal; import javax.servlet.http.HttpServletRequest; @@ -35,9 +34,7 @@ interface TraceLogRecorder { } @Override - public void endRecording(HttpServletRequest httpRequest, Recording recording) { - - } + public void endRecording(HttpServletRequest httpRequest, Recording recording) {} }; Recording startRecording(HttpServletRequest request, HttpServletResponse response); diff --git a/src/main/java/org/apache/sling/tracer/internal/TracerConfig.java b/src/main/java/org/apache/sling/tracer/internal/TracerConfig.java index 2a97fb4..0364f51 100644 --- a/src/main/java/org/apache/sling/tracer/internal/TracerConfig.java +++ b/src/main/java/org/apache/sling/tracer/internal/TracerConfig.java @@ -16,12 +16,10 @@ * specific language governing permissions and limitations * under the License. */ - package org.apache.sling.tracer.internal; import ch.qos.logback.classic.Level; import ch.qos.logback.core.CoreConstants; - import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -46,7 +44,7 @@ class TracerConfig implements Comparable<TracerConfig> { this(loggerName, level, null); } - public TracerConfig(String loggerName, Level level,@Nullable CallerStackReporter reporter) { + public TracerConfig(String loggerName, Level level, @Nullable CallerStackReporter reporter) { this.loggerName = loggerName; this.level = level; this.depth = getDepth(loggerName); @@ -88,7 +86,7 @@ class TracerConfig implements Comparable<TracerConfig> { return level; } - public boolean isReportCallerStack(){ + public boolean isReportCallerStack() { return callerReporter != null; } diff --git a/src/main/java/org/apache/sling/tracer/internal/TracerContext.java b/src/main/java/org/apache/sling/tracer/internal/TracerContext.java index a3e1b3e..1eae476 100644 --- a/src/main/java/org/apache/sling/tracer/internal/TracerContext.java +++ b/src/main/java/org/apache/sling/tracer/internal/TracerContext.java @@ -16,7 +16,6 @@ * specific language governing permissions and limitations * under the License. */ - package org.apache.sling.tracer.internal; import java.util.Arrays; @@ -36,9 +35,9 @@ class TracerContext { * level (OAK-2304) */ private static final String[] IGNORABLE_QUERIES = { - "SELECT * FROM [nt:base] WHERE [jcr:uuid] = $id", - "SELECT * FROM [nt:base] WHERE PROPERTY([rep:members], 'WeakReference') = $uuid", - "SELECT * FROM [rep:Authorizable]WHERE [rep:principalName] = $principalName", + "SELECT * FROM [nt:base] WHERE [jcr:uuid] = $id", + "SELECT * FROM [nt:base] WHERE PROPERTY([rep:members], 'WeakReference') = $uuid", + "SELECT * FROM [rep:Authorizable]WHERE [rep:principalName] = $principalName", }; private static final int LOG_BUFFER_SIZE = 50; @@ -61,11 +60,11 @@ class TracerContext { this.tracers = tracers; this.recording = recording; - //Say if the list is like com.foo;level=trace,com.foo.bar;level=info. + // Say if the list is like com.foo;level=trace,com.foo.bar;level=info. // Then first config would result in a match and later config would // not be able to suppress the logs from a child category - //To handle such cases we sort the config. With having more depth i.e. more specific - //coming first and others later + // To handle such cases we sort the config. With having more depth i.e. more specific + // coming first and others later Arrays.sort(tracers); } @@ -87,10 +86,9 @@ class TracerContext { public boolean log(TracerConfig tc, Level level, String logger, String format, Object[] params) { FormattingTuple tuple = null; - if (QUERY_LOGGER.equals(logger) - && params != null && params.length == 2) { - if (logQuery(String.valueOf(params[1]))){ - //Get original log message + if (QUERY_LOGGER.equals(logger) && params != null && params.length == 2) { + if (logQuery(String.valueOf(params[1]))) { + // Get original log message tuple = logWithLoggerName(logger, format, params); } } else { 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 b7a674f..8687b7f 100644 --- a/src/main/java/org/apache/sling/tracer/internal/TracerLogServlet.java +++ b/src/main/java/org/apache/sling/tracer/internal/TracerLogServlet.java @@ -16,9 +16,12 @@ * specific language governing permissions and limitations * under the License. */ - package org.apache.sling.tracer.internal; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + import java.io.IOException; import java.io.PrintWriter; import java.text.SimpleDateFormat; @@ -33,10 +36,6 @@ import java.util.Set; import java.util.UUID; import java.util.concurrent.TimeUnit; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - import org.apache.felix.utils.json.JSONWriter; import org.apache.felix.webconsole.SimpleWebConsolePlugin; import org.osgi.framework.BundleContext; @@ -66,8 +65,12 @@ class TracerLogServlet extends SimpleWebConsolePlugin implements TraceLogRecorde private final boolean gzipResponse; - public TracerLogServlet(BundleContext context, int cacheSizeInMB, long cacheDurationInSecs, - boolean compressionEnabled, boolean gzipResponse) { + public TracerLogServlet( + BundleContext context, + int cacheSizeInMB, + long cacheDurationInSecs, + boolean compressionEnabled, + boolean gzipResponse) { super(LABEL, "Sling Tracer", "Sling", null); this.compressRecording = compressionEnabled; this.cacheDurationInSecs = cacheDurationInSecs; @@ -142,7 +145,7 @@ class TracerLogServlet extends SimpleWebConsolePlugin implements TraceLogRecorde final Set<String> toRemove = new HashSet<>(); final ArrayList<Entry> list = new ArrayList<>(this.cache.values()); Collections.sort(list); - if ( this.currentSize > this.maxSize ) { + if (this.currentSize > this.maxSize) { while (this.currentSize > this.maxSize && !list.isEmpty()) { final Entry entry = list.remove(0); toRemove.add(entry.recording.getRequestId()); @@ -150,13 +153,13 @@ class TracerLogServlet extends SimpleWebConsolePlugin implements TraceLogRecorde } } final long time = System.currentTimeMillis() - this.cacheDurationInMillis; - for(final Entry entry : list) { - if ( entry.lastAccessed < time ) { + for (final Entry entry : list) { + if (entry.lastAccessed < time) { toRemove.add(entry.recording.getRequestId()); currentSize -= entry.recording.size(); } } - for(final String key : toRemove) { + for (final String key : toRemove) { this.cache.remove(key); } } @@ -179,18 +182,19 @@ class TracerLogServlet extends SimpleWebConsolePlugin implements TraceLogRecorde public synchronized List<JSONRecording> asList() { checkCache(); final List<JSONRecording> result = new ArrayList<>(); - for(final Entry entry : this.cache.values()) { + for (final Entry entry : this.cache.values()) { result.add(entry.recording); } return result; } } - //~-----------------------------------------------< WebConsole Plugin > + // ~-----------------------------------------------< WebConsole Plugin > @Override - protected void renderContent(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - if (isHtmlRequest(request)){ + protected void renderContent(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + if (isHtmlRequest(request)) { PrintWriter pw = response.getWriter(); renderStatus(pw); renderRequests(pw); @@ -201,7 +205,7 @@ class TracerLogServlet extends SimpleWebConsolePlugin implements TraceLogRecorde boolean responseDone = false; if (requestId != null) { JSONRecording recording = cache.get(requestId); - if (recording != null){ + if (recording != null) { boolean shouldGZip = prepareForGZipResponse(request, response); responseDone = recording.render(response.getOutputStream(), shouldGZip); } @@ -221,8 +225,7 @@ class TracerLogServlet extends SimpleWebConsolePlugin implements TraceLogRecorde } @Override - protected void doPost(HttpServletRequest req, HttpServletResponse resp) - throws IOException { + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { if (req.getParameter(CLEAR) != null) { resetCache(); resp.sendRedirect(req.getRequestURI()); @@ -264,13 +267,15 @@ class TracerLogServlet extends SimpleWebConsolePlugin implements TraceLogRecorde } private void renderStatus(PrintWriter pw) { - pw.printf("<p class='statline'>Log Tracer Recordings: %d recordings, %s memory " + - "(Max %dMB, Expired in %d secs)</p>%n", cache.size(), - memorySize(), cacheSizeInMB, cacheDurationInSecs); + pw.printf( + "<p class='statline'>Log Tracer Recordings: %d recordings, %s memory " + + "(Max %dMB, Expired in %d secs)</p>%n", + cache.size(), memorySize(), cacheSizeInMB, cacheDurationInSecs); pw.println("<div class='ui-widget-header ui-corner-top buttonGroup'>"); pw.println("<span style='float: left; margin-left: 1em'>Tracer Recordings</span>"); - pw.println("<form method='POST'><input type='hidden' name='clear' value='clear'><input type='submit' value='Clear' class='ui-state-default ui-corner-all'></form>"); + pw.println( + "<form method='POST'><input type='hidden' name='clear' value='clear'><input type='submit' value='Clear' class='ui-state-default ui-corner-all'></form>"); pw.println("</div>"); } @@ -279,19 +284,17 @@ class TracerLogServlet extends SimpleWebConsolePlugin implements TraceLogRecorde } private void renderRequests(PrintWriter pw) { - if (cache.size() > 0){ + if (cache.size() > 0) { pw.println("<ol>"); List<JSONRecording> recordings = cache.asList(); SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss"); Collections.sort(recordings); - for (JSONRecording r : recordings){ + for (JSONRecording r : recordings) { String id = r.getRequestId(); String date = sdf.format(new Date(r.getStart())); - pw.printf("<li>%s - <a href='%s/%s.json'>%s</a> - %s (%s) (%dms)</li>", - date, LABEL, id, id, - r.getUri(), - humanReadableByteCount(r.size()), - r.getTimeTaken()); + pw.printf( + "<li>%s - <a href='%s/%s.json'>%s</a> - %s (%s) (%dms)</li>", + date, LABEL, id, id, r.getUri(), humanReadableByteCount(r.size()), r.getTimeTaken()); } pw.println("</ol>"); } @@ -301,22 +304,22 @@ class TracerLogServlet extends SimpleWebConsolePlugin implements TraceLogRecorde String requestUri = request.getRequestURI(); int lastSlash = requestUri.lastIndexOf('/'); int lastDot = requestUri.indexOf('.', lastSlash + 1); - if (lastDot > 0){ + if (lastDot > 0) { return requestUri.substring(lastSlash + 1, lastDot); } return null; } - //~-----------------------------------------------< TraceLogRecorder > + // ~-----------------------------------------------< TraceLogRecorder > @Override public Recording startRecording(HttpServletRequest request, HttpServletResponse response) { - if (request.getHeader(HEADER_TRACER_RECORDING) == null){ + if (request.getHeader(HEADER_TRACER_RECORDING) == null) { return Recording.NOOP; } - if (request.getAttribute(ATTR_RECORDING) != null){ - //Already processed + if (request.getAttribute(ATTR_RECORDING) != null) { + // Already processed return getRecordingForRequest(request); } @@ -332,7 +335,7 @@ class TracerLogServlet extends SimpleWebConsolePlugin implements TraceLogRecorde @Override public Recording getRecordingForRequest(HttpServletRequest request) { Recording recording = (Recording) request.getAttribute(ATTR_RECORDING); - if (recording == null){ + if (recording == null) { recording = Recording.NOOP; } return recording; @@ -381,7 +384,7 @@ class TracerLogServlet extends SimpleWebConsolePlugin implements TraceLogRecorde return String.format("%.1f %sB", bytes / Math.pow(unit, exp), pre); } - void resetCache(){ + void resetCache() { cache.clear(); } } diff --git a/src/main/java/org/apache/sling/tracer/internal/TracerSet.java b/src/main/java/org/apache/sling/tracer/internal/TracerSet.java index 9c8139f..62637a1 100644 --- a/src/main/java/org/apache/sling/tracer/internal/TracerSet.java +++ b/src/main/java/org/apache/sling/tracer/internal/TracerSet.java @@ -16,7 +16,6 @@ * specific language governing permissions and limitations * under the License. */ - package org.apache.sling.tracer.internal; import java.util.ArrayList; @@ -37,8 +36,8 @@ class TracerSet { public TracerSet(String config) { int indexOfColon = config.indexOf(':'); if (indexOfColon == -1) { - throw new IllegalArgumentException("Invalid tracer config format. TracerSet " + - "name cannot be determined " + config); + throw new IllegalArgumentException( + "Invalid tracer config format. TracerSet " + "name cannot be determined " + config); } name = config.substring(0, indexOfColon).toLowerCase().trim(); @@ -73,7 +72,7 @@ class TracerSet { for (ManifestHeader.Entry e : parsedConfig.getEntries()) { String category = e.getValue(); - //Defaults to Debug + // Defaults to Debug Level level = Level.valueOf(e.getAttributeValue(LEVEL)); CallerStackReporter reporter = createReporter(e); result.add(new TracerConfig(category, level, reporter)); @@ -83,24 +82,24 @@ class TracerSet { static CallerStackReporter createReporter(ManifestHeader.Entry e) { String caller = e.getAttributeValue(CALLER); - if (caller == null){ + if (caller == null) { return null; } - if ("true".equals(caller)){ + if ("true".equals(caller)) { return new CallerStackReporter(0, Integer.MAX_VALUE, CallerFilter.ALL); } CallerFilter filter = CallerFilter.ALL; int depth; - try{ + try { depth = Integer.parseInt(caller); - } catch (NumberFormatException ignore){ + } catch (NumberFormatException ignore) { return null; } String filterValue = e.getAttributeValue(CALLER_PREFIX_FILTER); - if (filterValue != null){ + if (filterValue != null) { filter = PrefixExcludeFilter.from(filterValue); } diff --git a/src/main/java/org/apache/sling/tracer/internal/Util.java b/src/main/java/org/apache/sling/tracer/internal/Util.java index fd32254..ad4b792 100644 --- a/src/main/java/org/apache/sling/tracer/internal/Util.java +++ b/src/main/java/org/apache/sling/tracer/internal/Util.java @@ -16,7 +16,6 @@ * specific language governing permissions and limitations * under the License. */ - package org.apache.sling.tracer.internal; class Util { @@ -31,15 +30,15 @@ class Util { return s; } - static String nullSafeString(Object o){ - if (o != null){ + static String nullSafeString(Object o) { + if (o != null) { return o.toString(); } return null; } - static String nullSafeTrim(String s){ - if(s == null){ + static String nullSafeTrim(String s) { + if (s == null) { return ""; } return s.trim(); diff --git a/src/test/java/org/apache/sling/tracer/internal/BoundedCacheTest.java b/src/test/java/org/apache/sling/tracer/internal/BoundedCacheTest.java index 8fdb8e2..6cf970f 100644 --- a/src/test/java/org/apache/sling/tracer/internal/BoundedCacheTest.java +++ b/src/test/java/org/apache/sling/tracer/internal/BoundedCacheTest.java @@ -23,14 +23,15 @@ import org.junit.Test; import org.mockito.Mockito; public class BoundedCacheTest { - - @Test public void testMemoryBoundary() { + + @Test + public void testMemoryBoundary() { final TracerLogServlet.BoundedCache cache = new TracerLogServlet.BoundedCache(2, 10); JSONRecording recordingA = Mockito.mock(JSONRecording.class); - Mockito.when(recordingA.size()).thenReturn(1*1024*1024); + Mockito.when(recordingA.size()).thenReturn(1 * 1024 * 1024); Mockito.when(recordingA.getRequestId()).thenReturn("a"); JSONRecording recordingB = Mockito.mock(JSONRecording.class); - Mockito.when(recordingB.size()).thenReturn(1*1000*1000); + Mockito.when(recordingB.size()).thenReturn(1 * 1000 * 1000); Mockito.when(recordingB.getRequestId()).thenReturn("b"); cache.put("a", recordingA); @@ -41,7 +42,7 @@ public class BoundedCacheTest { Assert.assertNotNull(cache.get("b")); JSONRecording recordingC = Mockito.mock(JSONRecording.class); - Mockito.when(recordingC.size()).thenReturn(1*1024*1024); + Mockito.when(recordingC.size()).thenReturn(1 * 1024 * 1024); Mockito.when(recordingC.getRequestId()).thenReturn("c"); cache.put("c", recordingC); @@ -51,13 +52,14 @@ public class BoundedCacheTest { Assert.assertEquals(recordingB.size() + recordingC.size(), cache.memorySize()); } - @Test public void testTimeBoundary() throws InterruptedException { + @Test + public void testTimeBoundary() throws InterruptedException { final TracerLogServlet.BoundedCache cache = new TracerLogServlet.BoundedCache(2, 1); JSONRecording recordingA = Mockito.mock(JSONRecording.class); - Mockito.when(recordingA.size()).thenReturn(1*1024*1024); + Mockito.when(recordingA.size()).thenReturn(1 * 1024 * 1024); Mockito.when(recordingA.getRequestId()).thenReturn("a"); JSONRecording recordingB = Mockito.mock(JSONRecording.class); - Mockito.when(recordingB.size()).thenReturn(1*1000*1000); + Mockito.when(recordingB.size()).thenReturn(1 * 1000 * 1000); Mockito.when(recordingB.getRequestId()).thenReturn("b"); cache.put("a", recordingA); diff --git a/src/test/java/org/apache/sling/tracer/internal/CallerFinderTest.java b/src/test/java/org/apache/sling/tracer/internal/CallerFinderTest.java index fc104f9..f25f3c9 100644 --- a/src/test/java/org/apache/sling/tracer/internal/CallerFinderTest.java +++ b/src/test/java/org/apache/sling/tracer/internal/CallerFinderTest.java @@ -16,7 +16,6 @@ * specific language governing permissions and limitations * under the License. */ - package org.apache.sling.tracer.internal; import org.junit.Test; @@ -28,16 +27,9 @@ import static org.junit.Assert.assertNull; public class CallerFinderTest { @Test - public void determineCallerSingle() throws Exception{ + public void determineCallerSingle() throws Exception { CallerFinder cf = new CallerFinder(new String[] {"o.a.s", "o.a.j.o"}); - StackTraceElement[] stack = asStack( - "o.a.j.o.a", - "o.a.j.o.b", - "c.a.g.w", - "o.e.j", - "o.e.j", - "o.e.j" - ); + StackTraceElement[] stack = asStack("o.a.j.o.a", "o.a.j.o.b", "c.a.g.w", "o.e.j", "o.e.j", "o.e.j"); StackTraceElement caller = cf.determineCaller(stack); assertNotNull(caller); @@ -45,66 +37,40 @@ public class CallerFinderTest { } @Test - public void determineCallerMultipleApi() throws Exception{ + public void determineCallerMultipleApi() throws Exception { CallerFinder cf = new CallerFinder(new String[] {"o.a.s", "o.a.j.o"}); - StackTraceElement[] stack = asStack( - "o.a.j.o.a", - "o.a.j.o.b", - "o.a.s.a", - "o.a.s.b", - "c.a.g.w", - "o.e.j", - "o.e.j", - "o.e.j" - ); + StackTraceElement[] stack = + asStack("o.a.j.o.a", "o.a.j.o.b", "o.a.s.a", "o.a.s.b", "c.a.g.w", "o.e.j", "o.e.j", "o.e.j"); StackTraceElement caller = cf.determineCaller(stack); assertNotNull(caller); assertEquals("c.a.g.w", caller.getClassName()); - stack = asStack( - "o.a.j.o.a", - "o.a.j.o.b", - "o.a.s.a", - "o.a.s.b", - "c.a.g.w", - "o.e.j", - "o.e.j", - "o.e.j" - ); + stack = asStack("o.a.j.o.a", "o.a.j.o.b", "o.a.s.a", "o.a.s.b", "c.a.g.w", "o.e.j", "o.e.j", "o.e.j"); cf = new CallerFinder(new String[] {"o.a.j.o"}); caller = cf.determineCaller(stack); assertNotNull(caller); assertEquals("o.a.s.a", caller.getClassName()); - } @Test - public void nullInput() throws Exception{ + public void nullInput() throws Exception { CallerFinder cf = new CallerFinder(new String[] {"o.a.s", "o.a.j.o"}); assertNull(cf.determineCaller(null)); } @Test - public void nullCaller() throws Exception{ + public void nullCaller() throws Exception { CallerFinder cf = new CallerFinder(new String[] {"o.a1.s", "o.a1.j.o"}); - StackTraceElement[] stack = asStack( - "o.a.j.o.a", - "o.a.j.o.b", - "o.a.s.a", - "o.a.s.b", - "c.a.g.w", - "o.e.j", - "o.e.j", - "o.e.j" - ); + StackTraceElement[] stack = + asStack("o.a.j.o.a", "o.a.j.o.b", "o.a.s.a", "o.a.s.b", "c.a.g.w", "o.e.j", "o.e.j", "o.e.j"); StackTraceElement caller = cf.determineCaller(stack); assertNull(caller); } - static StackTraceElement[] asStack(String ... stack){ + static StackTraceElement[] asStack(String... stack) { StackTraceElement[] result = new StackTraceElement[stack.length]; for (int i = 0; i < stack.length; i++) { result[i] = new StackTraceElement(stack[i], "foo", null, 0); diff --git a/src/test/java/org/apache/sling/tracer/internal/CallerStackReporterTest.java b/src/test/java/org/apache/sling/tracer/internal/CallerStackReporterTest.java index 8ae067e..69b9b7b 100644 --- a/src/test/java/org/apache/sling/tracer/internal/CallerStackReporterTest.java +++ b/src/test/java/org/apache/sling/tracer/internal/CallerStackReporterTest.java @@ -16,7 +16,6 @@ * specific language governing permissions and limitations * under the License. */ - package org.apache.sling.tracer.internal; import java.util.List; @@ -31,13 +30,13 @@ public class CallerStackReporterTest { @Test public void startAndStop() throws Exception { StackTraceElement[] s = asStack("0", "1", "2", "3", "4", "5"); - assertArrayEquals(new String[]{"0", "1", "2", "3"}, arr(new CallerStackReporter(4).report(s))); - assertArrayEquals(new String[]{"0"}, arr(new CallerStackReporter(1).report(s))); - assertArrayEquals(new String[]{"2", "3"}, arr(new CallerStackReporter(2, 4, CallerFilter.ALL).report(s))); + assertArrayEquals(new String[] {"0", "1", "2", "3"}, arr(new CallerStackReporter(4).report(s))); + assertArrayEquals(new String[] {"0"}, arr(new CallerStackReporter(1).report(s))); + assertArrayEquals(new String[] {"2", "3"}, arr(new CallerStackReporter(2, 4, CallerFilter.ALL).report(s))); } @Test - public void filter() throws Exception{ + public void filter() throws Exception { StackTraceElement[] s = asStack("0", "1", "2", "3", "4", "5"); CallerFilter f = new CallerFilter() { @Override @@ -47,18 +46,18 @@ public class CallerStackReporterTest { } }; - assertArrayEquals(new String[]{"1", "2"}, arr(new CallerStackReporter(0, 4, f).report(s))); + assertArrayEquals(new String[] {"1", "2"}, arr(new CallerStackReporter(0, 4, f).report(s))); } @Test - public void prefixFilter() throws Exception{ + public void prefixFilter() throws Exception { StackTraceElement[] s = asStack("a.b.c", "a.b.d", "f.g.h", "m.g.i", "4", "5"); - assertArrayEquals(new String[]{"a.b.c", "a.b.d", "f.g.h", "m.g.i"}, + assertArrayEquals( + new String[] {"a.b.c", "a.b.d", "f.g.h", "m.g.i"}, arr(new CallerStackReporter(0, 4, CallerFilter.ALL).report(s))); CallerFilter f = PrefixExcludeFilter.from("a.b|f.g"); - assertArrayEquals(new String[]{"m.g.i"}, - arr(new CallerStackReporter(0, 4, f).report(s))); + assertArrayEquals(new String[] {"m.g.i"}, arr(new CallerStackReporter(0, 4, f).report(s))); } private static String[] arr(List<StackTraceElement> list) { @@ -68,5 +67,4 @@ public class CallerStackReporterTest { } return result; } - -} \ No newline at end of file +} 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 282ebf2..ffd98c1 100644 --- a/src/test/java/org/apache/sling/tracer/internal/JSONRecordingTest.java +++ b/src/test/java/org/apache/sling/tracer/internal/JSONRecordingTest.java @@ -16,16 +16,15 @@ * specific language governing permissions and limitations * under the License. */ - package org.apache.sling.tracer.internal; -import java.io.StringReader; -import java.io.StringWriter; - import javax.json.Json; import javax.json.JsonObject; import javax.servlet.http.HttpServletRequest; +import java.io.StringReader; +import java.io.StringWriter; + import ch.qos.logback.classic.Level; import org.junit.Test; import org.slf4j.MDC; @@ -48,15 +47,18 @@ public class JSONRecordingTest { private TracerConfig tc = new TracerConfig(TracerContext.QUERY_LOGGER, Level.INFO); @Test - public void logQueries() throws Exception{ + public void logQueries() throws Exception { StringWriter sw = new StringWriter(); when(request.getMethod()).thenReturn("GET"); JSONRecording r = new JSONRecording("abc", request, true); MDC.put(MDC_QUERY_ID, "1"); - r.log(tc, Level.DEBUG, "org.apache.jackrabbit.oak.query.QueryEngineImpl", - tuple("Parsing {} statement: {}", "XPATH", "SELECT FOO")); + r.log( + tc, + Level.DEBUG, + "org.apache.jackrabbit.oak.query.QueryEngineImpl", + tuple("Parsing {} statement: {}", "XPATH", "SELECT FOO")); r.log(tc, Level.DEBUG, QE_LOGGER, tuple("query plan FOO PLAN")); r.done(); @@ -70,24 +72,33 @@ public class JSONRecordingTest { } @Test - public void logUnionQueries() throws Exception{ + public void logUnionQueries() throws Exception { StringWriter sw = new StringWriter(); when(request.getMethod()).thenReturn("GET"); JSONRecording r = new JSONRecording("abc", request, true); MDC.put(MDC_QUERY_ID, "1"); - r.log(tc, Level.DEBUG, "org.apache.jackrabbit.oak.query.QueryEngineImpl", - tuple("Parsing {} statement: {}", "XPATH", "SELECT FOO BAR")); - r.log(tc, Level.DEBUG, UNION_QUERY_LOGGER, tuple("query union plan FOO PLAN */ union BAR PLAN", "FOO PLAN */ union BAR PLAN")); + r.log( + tc, + Level.DEBUG, + "org.apache.jackrabbit.oak.query.QueryEngineImpl", + tuple("Parsing {} statement: {}", "XPATH", "SELECT FOO BAR")); + r.log( + tc, + Level.DEBUG, + UNION_QUERY_LOGGER, + tuple("query union plan FOO PLAN */ union BAR PLAN", "FOO PLAN */ union BAR PLAN")); // Two sub-query plans for the split union r.log(tc, Level.DEBUG, QE_LOGGER, tuple("query plan FOO PLAN", "xpath", "FOO PLAN")); r.log(tc, Level.DEBUG, QE_LOGGER, tuple("query plan BAR PLAN", "xpath", "BAR PLAN")); - MDC.put(MDC_QUERY_ID, "2"); - r.log(tc, Level.DEBUG, "org.apache.jackrabbit.oak.query.QueryEngineImpl", - tuple("Parsing {} statement: {}", "XPATH", "SELECT FOO")); + r.log( + tc, + Level.DEBUG, + "org.apache.jackrabbit.oak.query.QueryEngineImpl", + tuple("Parsing {} statement: {}", "XPATH", "SELECT FOO")); r.log(tc, Level.DEBUG, QE_LOGGER, tuple("query plan FOO PLAN", "xpath", "FOO PLAN")); r.done(); @@ -107,7 +118,7 @@ public class JSONRecordingTest { } @Test - public void requestTrackerLogs() throws Exception{ + public void requestTrackerLogs() throws Exception { StringWriter sw = new StringWriter(); JSONRecording r = new JSONRecording("abc", request, true); @@ -121,15 +132,16 @@ public class JSONRecordingTest { } @Test - public void logs() throws Exception{ + public void logs() throws Exception { StringWriter sw = new StringWriter(); JSONRecording r = new JSONRecording("abc", request, true); - FormattingTuple tp1 = MessageFormatter.arrayFormat("{} is going", new Object[]{"Jack"}); + FormattingTuple tp1 = MessageFormatter.arrayFormat("{} is going", new Object[] {"Jack"}); r.log(tc, Level.INFO, "foo", tp1); r.log(tc, Level.WARN, "foo.bar", MessageFormatter.arrayFormat("Jill is going", null)); - r.log(tc, Level.ERROR, "foo.bar", - MessageFormatter.arrayFormat("Jack and {} is going", new Object[]{"Jill" , new Exception()})); + r.log(tc, Level.ERROR, "foo.bar", MessageFormatter.arrayFormat("Jack and {} is going", new Object[] { + "Jill", new Exception() + })); r.done(); r.render(sw); @@ -151,12 +163,11 @@ public class JSONRecordingTest { } @Test - public void logsWithCaller() throws Exception{ + public void logsWithCaller() throws Exception { StringWriter sw = new StringWriter(); final JSONRecording r = new JSONRecording("abc", request, true); - TracerConfig config = new TracerConfig(TracerContext.QUERY_LOGGER, - Level.INFO, new CallerStackReporter(20)); + TracerConfig config = new TracerConfig(TracerContext.QUERY_LOGGER, Level.INFO, new CallerStackReporter(20)); r.log(config, Level.INFO, "foo", tuple("foo")); r.done(); @@ -168,11 +179,11 @@ public class JSONRecordingTest { assertTrue(l1.getJsonArray("caller").size() > 0); } - private static FormattingTuple tuple(String msg){ + private static FormattingTuple tuple(String msg) { return MessageFormatter.format(msg, null); } - private static FormattingTuple tuple(String msg, String ... params){ + private static FormattingTuple tuple(String msg, String... params) { return MessageFormatter.arrayFormat(msg, params); } } diff --git a/src/test/java/org/apache/sling/tracer/internal/LogTracerModelTest.java b/src/test/java/org/apache/sling/tracer/internal/LogTracerModelTest.java index 96c0bad..cb4732e 100644 --- a/src/test/java/org/apache/sling/tracer/internal/LogTracerModelTest.java +++ b/src/test/java/org/apache/sling/tracer/internal/LogTracerModelTest.java @@ -44,7 +44,6 @@ public class LogTracerModelTest { assertNotNull("Config for parent should match for child", a.getConfig("com.foo.bar")); - TracerConfig tcbar = a.getConfig("com.bar"); assertNotNull(tcbar); assertEquals(Level.INFO, tcbar.getLevel()); @@ -71,21 +70,20 @@ public class LogTracerModelTest { @Test public void tracerConfigSort() throws Exception { - TracerConfig[] configs = new TracerConfig[]{ - new TracerConfig("a.b.c.d", Level.DEBUG), - new TracerConfig("a", Level.DEBUG), - new TracerConfig("a.b.e", Level.DEBUG), + TracerConfig[] configs = new TracerConfig[] { + new TracerConfig("a.b.c.d", Level.DEBUG), + new TracerConfig("a", Level.DEBUG), + new TracerConfig("a.b.e", Level.DEBUG), }; Arrays.sort(configs); assertEquals("a.b.c.d", configs[0].getLoggerName()); assertEquals("a.b.e", configs[1].getLoggerName()); assertEquals("a", configs[2].getLoggerName()); - } private static TracerContext getContext(TracerSet ts) { - return new TracerContext(ts.getConfigs().toArray(new TracerConfig[ts.getConfigs().size()]), Recording.NOOP); + return new TracerContext( + ts.getConfigs().toArray(new TracerConfig[ts.getConfigs().size()]), Recording.NOOP); } - -} \ No newline at end of file +} 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 4cad5fb..e77e715 100644 --- a/src/test/java/org/apache/sling/tracer/internal/LogTracerTest.java +++ b/src/test/java/org/apache/sling/tracer/internal/LogTracerTest.java @@ -16,15 +16,8 @@ * specific language governing permissions and limitations * under the License. */ - package org.apache.sling.tracer.internal; -import java.io.IOException; -import java.io.StringReader; -import java.io.StringWriter; -import java.util.Collection; -import java.util.List; - import javax.json.Json; import javax.json.JsonObject; import javax.servlet.Filter; @@ -36,6 +29,12 @@ import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.StringReader; +import java.io.StringWriter; +import java.util.Collection; +import java.util.List; + import ch.qos.logback.classic.Level; import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.spi.ILoggingEvent; @@ -94,8 +93,8 @@ public class LogTracerTest { @Test public void enableTracer() throws Exception { - LogTracer tracer = context.registerInjectActivateService(new LogTracer(), - ImmutableMap.<String, Object>of("enabled", "true")); + LogTracer tracer = context.registerInjectActivateService( + new LogTracer(), ImmutableMap.<String, Object>of("enabled", "true")); assertEquals(2, context.getServices(Filter.class, null).length); assertNull(context.getService(Servlet.class)); @@ -105,15 +104,15 @@ public class LogTracerTest { @Test public void enableTracerLogServlet() throws Exception { - LogTracer tracer = context.registerInjectActivateService(new LogTracer(), - ImmutableMap.<String, Object>of("enabled", "true", "servletEnabled", "true")); + LogTracer tracer = context.registerInjectActivateService( + new LogTracer(), ImmutableMap.<String, Object>of("enabled", "true", "servletEnabled", "true")); assertEquals(2, context.getServices(Filter.class, null).length); assertNotNull(context.getService(Servlet.class)); TracerLogServlet logServlet = (TracerLogServlet) context.getService(Servlet.class); assertEquals(true, logServlet.isCompressRecording()); assertEquals(50, logServlet.getCacheSizeInMB()); - assertEquals(60*15, logServlet.getCacheDurationInSecs()); + assertEquals(60 * 15, logServlet.getCacheDurationInSecs()); MockOsgi.deactivate(tracer, context.bundleContext()); assertNull(context.getService(Filter.class)); @@ -122,7 +121,8 @@ public class LogTracerTest { @Test public void enableTracerLogServletWithConfig() throws Exception { - LogTracer tracer = context.registerInjectActivateService(new LogTracer(), + LogTracer tracer = context.registerInjectActivateService( + new LogTracer(), ImmutableMap.<String, Object>builder() .put("enabled", "true") .put("servletEnabled", "true") @@ -130,8 +130,7 @@ public class LogTracerTest { .put("recordingCacheDurationInSecs", "100") .put("recordingCompressionEnabled", "false") .put("gzipResponse", "true") - .build() - ); + .build()); assertEquals(2, context.getServices(Filter.class, null).length); assertNotNull(context.getService(Servlet.class)); @@ -144,14 +143,14 @@ public class LogTracerTest { @Test public void enableTracerLogServletWithConfigGzip() throws Exception { - LogTracer tracer = context.registerInjectActivateService(new LogTracer(), + LogTracer tracer = context.registerInjectActivateService( + new LogTracer(), ImmutableMap.<String, Object>builder() .put("enabled", "true") .put("servletEnabled", "true") .put("recordingCompressionEnabled", "true") .put("gzipResponse", "true") - .build() - ); + .build()); assertEquals(2, context.getServices(Filter.class, null).length); assertNotNull(context.getService(Servlet.class)); @@ -160,7 +159,6 @@ public class LogTracerTest { assertEquals(true, logServlet.isGzipResponse()); } - @Test public void noTurboFilterRegisteredUnlessTracingRequested() throws Exception { HttpServletRequest request = mock(HttpServletRequest.class); @@ -196,8 +194,7 @@ public class LogTracerTest { Filter filter = getFilter(false); filter.doFilter(request, response, chain); - assertNull("TurboFilter should get removed once request is done", - context.getService(TurboFilter.class)); + assertNull("TurboFilter should get removed once request is done", context.getService(TurboFilter.class)); } @Test @@ -217,8 +214,7 @@ public class LogTracerTest { Filter filter = getFilter(true); filter.doFilter(request, response, chain); - assertNull("TurboFilter should get removed once request is done", - context.getService(TurboFilter.class)); + assertNull("TurboFilter should get removed once request is done", context.getService(TurboFilter.class)); } @Test @@ -228,7 +224,7 @@ public class LogTracerTest { when(request.getParameter(LogTracer.PARAM_TRACER_CONFIG)).thenReturn("a.b.c;level=trace,a.b;level=debug"); activateTracer(); - Level oldLevel = rootLogger().getLevel(); + Level oldLevel = rootLogger().getLevel(); rootLogger().setLevel(Level.INFO); FilterChain chain = new FilterChain() { @@ -247,7 +243,7 @@ public class LogTracerTest { getLogger("a.b.c").trace("a.b.c-trace"); getLogger("a.b.c.d").trace("a.b.c.d-trace"); - if (getLogger("a.b.c").isTraceEnabled()){ + if (getLogger("a.b.c").isTraceEnabled()) { getLogger("a.b.c").trace("a.b.c-trace2"); } } @@ -274,9 +270,9 @@ public class LogTracerTest { } @Test - public void recordingWithoutTracing() throws Exception{ + public void recordingWithoutTracing() throws Exception { activateTracerAndServlet(); - MockSlingHttpServletRequest request = new MockSlingHttpServletRequest(context.bundleContext()){ + MockSlingHttpServletRequest request = new MockSlingHttpServletRequest(context.bundleContext()) { @Override public RequestProgressTracker getRequestProgressTracker() { return createTracker("x", "y"); @@ -295,7 +291,7 @@ public class LogTracerTest { @Override public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException { - //No TurboFilter should be registered if tracing is not requested + // No TurboFilter should be registered if tracing is not requested assertNull(context.getService(TurboFilter.class)); } }; @@ -304,21 +300,21 @@ public class LogTracerTest { String requestId = getRequestId(response); assertNotNull(requestId); - Recording r = ((TracerLogServlet)context.getService(Servlet.class)).getRecording(requestId); + Recording r = ((TracerLogServlet) context.getService(Servlet.class)).getRecording(requestId); assertTrue(r instanceof JSONRecording); JSONRecording jr = (JSONRecording) r; StringWriter sw = new StringWriter(); jr.render(sw); JsonObject json = Json.createReader(new StringReader(sw.toString())).readObject(); - + assertEquals(2, json.getJsonArray("requestProgressLogs").size()); } @Test - public void recordingWithTracing() throws Exception{ + public void recordingWithTracing() throws Exception { activateTracerAndServlet(); - MockSlingHttpServletRequest request = new MockSlingHttpServletRequest(context.bundleContext()){ + MockSlingHttpServletRequest request = new MockSlingHttpServletRequest(context.bundleContext()) { @Override public RequestProgressTracker getRequestProgressTracker() { return createTracker("x", "y"); @@ -348,27 +344,25 @@ public class LogTracerTest { String requestId = getRequestId(response); assertNotNull(requestId); - Recording r = ((TracerLogServlet)context.getService(Servlet.class)).getRecording(requestId); + Recording r = ((TracerLogServlet) context.getService(Servlet.class)).getRecording(requestId); assertTrue(r instanceof JSONRecording); JSONRecording jr = (JSONRecording) r; StringWriter sw = new StringWriter(); jr.render(sw); JsonObject json = Json.createReader(new StringReader(sw.toString())).readObject(); - + assertEquals(2, json.getJsonArray("requestProgressLogs").size()); assertEquals(1, json.getJsonArray("logs").size()); } - private void activateTracer() { - context.registerInjectActivateService(new LogTracer(), - ImmutableMap.<String, Object>of("enabled", "true")); + context.registerInjectActivateService(new LogTracer(), ImmutableMap.<String, Object>of("enabled", "true")); } private void activateTracerAndServlet() { - context.registerInjectActivateService(new LogTracer(), - ImmutableMap.<String, Object>of("enabled", "true", "servletEnabled", "true")); + context.registerInjectActivateService( + new LogTracer(), ImmutableMap.<String, Object>of("enabled", "true", "servletEnabled", "true")); } private FilterChain prepareChain(FilterChain end) throws InvalidSyntaxException { @@ -378,8 +372,7 @@ public class LogTracerTest { } private Filter getFilter(boolean slingFilter) throws InvalidSyntaxException { - Collection<ServiceReference<Filter>> refs = - context.bundleContext().getServiceReferences(Filter.class, null); + Collection<ServiceReference<Filter>> refs = context.bundleContext().getServiceReferences(Filter.class, null); ServiceReference<Filter> result = null; for (ServiceReference<Filter> ref : refs) { if (slingFilter && ref.getProperty("sling.filter.scope") != null) { @@ -397,8 +390,8 @@ public class LogTracerTest { throw new AssertionError("No filter found"); } - private static LoggerContext getLogContext(){ - return (LoggerContext)LoggerFactory.getILoggerFactory(); + private static LoggerContext getLogContext() { + return (LoggerContext) LoggerFactory.getILoggerFactory(); } private static ch.qos.logback.classic.Logger rootLogger() { @@ -409,7 +402,7 @@ public class LogTracerTest { private List<String> msgs = Lists.newArrayList(); private TestAppender appender = new TestAppender(); - public List<String> getLogs(){ + public List<String> getLogs() { return msgs; } @@ -426,7 +419,7 @@ public class LogTracerTest { rootLogger().detachAppender(appender); } - private class TestAppender extends ListAppender<ILoggingEvent>{ + private class TestAppender extends ListAppender<ILoggingEvent> { @Override protected void append(ILoggingEvent iLoggingEvent) { msgs.add(iLoggingEvent.getFormattedMessage()); @@ -439,19 +432,18 @@ public class LogTracerTest { private final FilterChain delegate; private int pos; - public FilterChainImpl(FilterChain delegate, Filter ... filter){ + public FilterChainImpl(FilterChain delegate, Filter... filter) { this.delegate = delegate; this.filters = filter; } @Override public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException { - if (pos == filters.length){ + if (pos == filters.length) { delegate.doFilter(request, response); } else { filters[pos++].doFilter(request, response, this); } } } - } diff --git a/src/test/java/org/apache/sling/tracer/internal/TestUtil.java b/src/test/java/org/apache/sling/tracer/internal/TestUtil.java index 1db80d2..ba95a81 100644 --- a/src/test/java/org/apache/sling/tracer/internal/TestUtil.java +++ b/src/test/java/org/apache/sling/tracer/internal/TestUtil.java @@ -16,7 +16,6 @@ * specific language governing permissions and limitations * under the License. */ - package org.apache.sling.tracer.internal; import javax.servlet.http.HttpServletResponse; @@ -32,13 +31,13 @@ import static org.mockito.Mockito.when; class TestUtil { - static RequestProgressTracker createTracker(String ... logs){ + static RequestProgressTracker createTracker(String... logs) { RequestProgressTracker tracker = mock(RequestProgressTracker.class); when(tracker.getMessages()).thenReturn(asList(logs).iterator()); return tracker; } - static String getRequestId(HttpServletResponse response){ + static String getRequestId(HttpServletResponse response) { ArgumentCaptor<String> requestIdCaptor = ArgumentCaptor.forClass(String.class); verify(response).setHeader(eq(TracerLogServlet.HEADER_TRACER_REQUEST_ID), requestIdCaptor.capture()); return requestIdCaptor.getValue(); 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 d0b2738..2bc0ef2 100644 --- a/src/test/java/org/apache/sling/tracer/internal/TracerLogServletTest.java +++ b/src/test/java/org/apache/sling/tracer/internal/TracerLogServletTest.java @@ -16,9 +16,15 @@ * specific language governing permissions and limitations * under the License. */ - package org.apache.sling.tracer.internal; +import javax.json.Json; +import javax.json.JsonObject; +import javax.servlet.ServletOutputStream; +import javax.servlet.WriteListener; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -27,13 +33,6 @@ import java.io.StringReader; import java.io.StringWriter; import java.util.zip.GZIPInputStream; -import javax.json.Json; -import javax.json.JsonObject; -import javax.servlet.ServletOutputStream; -import javax.servlet.WriteListener; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - import org.apache.commons.io.IOUtils; import org.apache.sling.testing.mock.osgi.junit.OsgiContext; import org.apache.sling.testing.mock.sling.servlet.MockSlingHttpServletRequest; @@ -58,106 +57,114 @@ public class TracerLogServletTest { @Rule public final OsgiContext context = new OsgiContext(); + @Rule public final MockitoRule mockito = MockitoJUnit.rule(); @Mock private HttpServletRequest request; + @Mock private HttpServletResponse response; @Test - public void noRecordingByDefault() throws Exception{ + public void noRecordingByDefault() throws Exception { TracerLogServlet logServlet = newLogServlet(); assertSame(Recording.NOOP, logServlet.startRecording(request, response)); assertSame(Recording.NOOP, logServlet.getRecordingForRequest(request)); } @Test - public void recordingWhenRequested() throws Exception{ + public void recordingWhenRequested() throws Exception { TracerLogServlet logServlet = newLogServlet(); request = new MockSlingHttpServletRequest(context.bundleContext()); Recording recording = logServlet.startRecording(request, response); assertNotNull(recording); - //Once recording is created then it should be returned + // Once recording is created then it should be returned Recording recording2 = logServlet.getRecordingForRequest(request); assertSame(recording, recording2); - //Repeated call should return same recording instance + // Repeated call should return same recording instance Recording recording3 = logServlet.startRecording(request, response); assertSame(recording, recording3); logServlet.resetCache(); - //If recording gets lost then NOOP must be returned + // If recording gets lost then NOOP must be returned Recording recording4 = logServlet.getRecordingForRequest(request); assertSame(Recording.NOOP, recording4); } @Test - public void jsonRendering() throws Exception{ + public void jsonRendering() throws Exception { TracerLogServlet logServlet = newLogServlet(); when(request.getMethod()).thenReturn("GET"); when(request.getHeader(TracerLogServlet.HEADER_TRACER_RECORDING)).thenReturn("true"); Recording recording = logServlet.startRecording(request, response); - recording.registerTracker(createTracker("x" ,"y")); + recording.registerTracker(createTracker("x", "y")); logServlet.endRecording(request, recording); ArgumentCaptor<String> requestIdCaptor = ArgumentCaptor.forClass(String.class); verify(response).setHeader(eq(TracerLogServlet.HEADER_TRACER_REQUEST_ID), requestIdCaptor.capture()); - verify(response).setHeader(TracerLogServlet.HEADER_TRACER_PROTOCOL_VERSION, - String.valueOf(TracerLogServlet.TRACER_PROTOCOL_VERSION)); + verify(response) + .setHeader( + TracerLogServlet.HEADER_TRACER_PROTOCOL_VERSION, + String.valueOf(TracerLogServlet.TRACER_PROTOCOL_VERSION)); ByteArrayServletOutputStream sos = new ByteArrayServletOutputStream(); when(response.getOutputStream()).thenReturn(sos); - when(request.getRequestURI()).thenReturn("/system/console/" + requestIdCaptor.getValue() + ".json" ); + when(request.getRequestURI()).thenReturn("/system/console/" + requestIdCaptor.getValue() + ".json"); logServlet.renderContent(request, response); - JsonObject json = Json.createReader(new StringReader(sos.baos.toString("UTF-8"))).readObject(); + JsonObject json = + Json.createReader(new StringReader(sos.baos.toString("UTF-8"))).readObject(); assertEquals("GET", json.getString("method")); assertEquals(2, json.getJsonArray("requestProgressLogs").size()); } @Test - public void gzipResponse() throws Exception{ + public void gzipResponse() throws Exception { TracerLogServlet logServlet = newLogServlet(); when(request.getMethod()).thenReturn("GET"); when(request.getHeader(TracerLogServlet.HEADER_TRACER_RECORDING)).thenReturn("true"); when(request.getHeader("Accept-Encoding")).thenReturn("gzip, deflate"); Recording recording = logServlet.startRecording(request, response); - recording.registerTracker(createTracker("x" ,"y")); + recording.registerTracker(createTracker("x", "y")); logServlet.endRecording(request, recording); ArgumentCaptor<String> requestIdCaptor = ArgumentCaptor.forClass(String.class); verify(response).setHeader(eq(TracerLogServlet.HEADER_TRACER_REQUEST_ID), requestIdCaptor.capture()); - verify(response).setHeader(TracerLogServlet.HEADER_TRACER_PROTOCOL_VERSION, - String.valueOf(TracerLogServlet.TRACER_PROTOCOL_VERSION)); + verify(response) + .setHeader( + TracerLogServlet.HEADER_TRACER_PROTOCOL_VERSION, + String.valueOf(TracerLogServlet.TRACER_PROTOCOL_VERSION)); ByteArrayServletOutputStream sos = new ByteArrayServletOutputStream(); when(response.getOutputStream()).thenReturn(sos); - when(request.getRequestURI()).thenReturn("/system/console/" + requestIdCaptor.getValue() + ".json" ); + when(request.getRequestURI()).thenReturn("/system/console/" + requestIdCaptor.getValue() + ".json"); logServlet.renderContent(request, response); byte[] data = IOUtils.toByteArray(new GZIPInputStream(new ByteArrayInputStream(sos.baos.toByteArray()))); - JsonObject json = Json.createReader(new StringReader(new String(data, "UTF-8"))).readObject(); + JsonObject json = + Json.createReader(new StringReader(new String(data, "UTF-8"))).readObject(); assertEquals("GET", json.getString("method")); assertEquals(2, json.getJsonArray("requestProgressLogs").size()); - verify(response).setHeader("Content-Encoding" , "gzip"); + verify(response).setHeader("Content-Encoding", "gzip"); } private TracerLogServlet newLogServlet() { - return new TracerLogServlet(context.bundleContext(), 50, 60*15, true, true); + return new TracerLogServlet(context.bundleContext(), 50, 60 * 15, true, true); } @Test - public void pluginRendering() throws Exception{ + public void pluginRendering() throws Exception { TracerLogServlet logServlet = newLogServlet(); - when(request.getRequestURI()).thenReturn("/system/console/tracer" ); + when(request.getRequestURI()).thenReturn("/system/console/tracer"); StringWriter sw = new StringWriter(); when(response.getWriter()).thenReturn(new PrintWriter(sw)); @@ -168,6 +175,7 @@ public class TracerLogServletTest { private static class ByteArrayServletOutputStream extends ServletOutputStream { final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + @Override public void write(int b) throws IOException { baos.write(b); @@ -184,8 +192,6 @@ public class TracerLogServletTest { } @Override - public void setWriteListener(WriteListener writeListener) { - - } + public void setWriteListener(WriteListener writeListener) {} } } diff --git a/src/test/java/org/apache/sling/tracer/internal/TracerSetTest.java b/src/test/java/org/apache/sling/tracer/internal/TracerSetTest.java index d7d71cd..e51ef70 100644 --- a/src/test/java/org/apache/sling/tracer/internal/TracerSetTest.java +++ b/src/test/java/org/apache/sling/tracer/internal/TracerSetTest.java @@ -16,7 +16,6 @@ * specific language governing permissions and limitations * under the License. */ - package org.apache.sling.tracer.internal; import org.apache.sling.commons.osgi.ManifestHeader; @@ -28,37 +27,36 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; - public class TracerSetTest { - + @Test - public void nullReporter() throws Exception{ + public void nullReporter() throws Exception { CallerStackReporter r = TracerSet.createReporter(createEntry("foo")); assertNull(r); } @Test - public void completeStack() throws Exception{ + public void completeStack() throws Exception { CallerStackReporter r = TracerSet.createReporter(createEntry("foo;caller=true")); assertNotNull(r); assertEquals(Integer.MAX_VALUE, r.getDepth()); } @Test - public void depthSpecified() throws Exception{ + public void depthSpecified() throws Exception { CallerStackReporter r = TracerSet.createReporter(createEntry("foo;caller=28")); assertNotNull(r); assertEquals(28, r.getDepth()); } @Test - public void invalidDepth() throws Exception{ + public void invalidDepth() throws Exception { CallerStackReporter r = TracerSet.createReporter(createEntry("foo;caller=abc")); assertNull(r); } @Test - public void prefixFilter() throws Exception{ + public void prefixFilter() throws Exception { CallerStackReporter r = TracerSet.createReporter(createEntry("foo;caller=28;caller-exclude-filter=\"a|b\"")); assertNotNull(r); assertEquals(28, r.getDepth()); @@ -67,7 +65,7 @@ public class TracerSetTest { assertEquals(asList("a", "b"), f.getPrefixesToExclude()); } - private static ManifestHeader.Entry createEntry(String config){ + private static ManifestHeader.Entry createEntry(String config) { ManifestHeader parsedConfig = ManifestHeader.parse(config); return parsedConfig.getEntries()[0]; } diff --git a/src/test/java/org/apache/sling/tracer/internal/UtilTest.java b/src/test/java/org/apache/sling/tracer/internal/UtilTest.java index 829845e..f110255 100644 --- a/src/test/java/org/apache/sling/tracer/internal/UtilTest.java +++ b/src/test/java/org/apache/sling/tracer/internal/UtilTest.java @@ -16,7 +16,6 @@ * specific language governing permissions and limitations * under the License. */ - package org.apache.sling.tracer.internal; import org.junit.Test; @@ -26,7 +25,7 @@ import static org.junit.Assert.*; public class UtilTest { @Test - public void trimToNull() throws Exception{ + public void trimToNull() throws Exception { assertEquals(null, Util.trimToNull(null)); assertEquals(null, Util.trimToNull("")); assertEquals("foo", Util.trimToNull("foo")); @@ -34,23 +33,22 @@ public class UtilTest { } @Test - public void nullSafeString() throws Exception{ + public void nullSafeString() throws Exception { assertEquals(null, Util.nullSafeString(null)); assertEquals("foo", Util.nullSafeString("foo")); assertEquals("1", Util.nullSafeString(1)); } @Test - public void nullSafeTrim() throws Exception{ + public void nullSafeTrim() throws Exception { assertEquals("", Util.nullSafeTrim(null)); assertEquals("foo", Util.nullSafeTrim(" foo")); } @Test - public void count() throws Exception{ + public void count() throws Exception { assertEquals(2, Util.count("she sell sea shells on the sea shore", "sea")); assertEquals(1, Util.count("she sell sea shells on the sea shore", "shore")); assertEquals(0, Util.count("she sell sea shells on the sea shore", "tiger")); } - -} \ No newline at end of file +}
