This is an automated email from the ASF dual-hosted git repository. rombert pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-tracer.git
commit faade90deb4a1f7200f65debb2efac733baf42b6 Author: Chetan Mehrotra <[email protected]> AuthorDate: Wed Feb 10 05:52:55 2016 +0000 SLING-5459 - Recording of tracer logs Changed the storage to byte[] instead of string. This would further reduce the memory footprint of the recording git-svn-id: https://svn.apache.org/repos/asf/sling/trunk@1729532 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 6 ++++ .../sling/tracer/internal/JSONRecording.java | 37 ++++++++++++++++++---- .../sling/tracer/internal/TracerLogServlet.java | 5 +-- .../tracer/internal/TracerLogServletTest.java | 22 +++++++++++-- 4 files changed, 58 insertions(+), 12 deletions(-) diff --git a/pom.xml b/pom.xml index 2918dd9..1a0bf46 100644 --- a/pom.xml +++ b/pom.xml @@ -121,6 +121,12 @@ <version>4.2.0</version> </dependency> <dependency> + <groupId>commons-io</groupId> + <artifactId>commons-io</artifactId> + <version>1.4</version> + <scope>provided</scope> + </dependency> + <dependency> <groupId>org.apache.sling</groupId> <artifactId>org.apache.sling.commons.json</artifactId> <version>2.0.8</version> 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 cf1cea3..a7b29d9 100644 --- a/src/main/java/org/apache/sling/tracer/internal/JSONRecording.java +++ b/src/main/java/org/apache/sling/tracer/internal/JSONRecording.java @@ -19,9 +19,16 @@ package org.apache.sling.tracer.internal; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.OutputStreamWriter; import java.io.PrintWriter; +import java.io.Reader; import java.io.StringWriter; +import java.io.UnsupportedEncodingException; import java.io.Writer; import java.util.ArrayList; import java.util.Iterator; @@ -30,6 +37,7 @@ import java.util.List; import javax.servlet.http.HttpServletRequest; import ch.qos.logback.classic.Level; +import org.apache.commons.io.IOUtils; import org.apache.sling.api.request.RequestProgressTracker; import org.apache.sling.commons.json.JSONException; import org.apache.sling.commons.json.io.JSONWriter; @@ -45,16 +53,25 @@ class JSONRecording implements Recording { private final List<String> queries = new ArrayList<String>(); private final List<LogEntry> logs = new ArrayList<LogEntry>(); private RequestProgressTracker tracker; - private String json; + private byte[] json; public JSONRecording(String requestId, HttpServletRequest r) { this.requestId = requestId; this.method = r.getMethod(); } - public boolean render(Writer pw) throws IOException { + public boolean render(Writer w) throws IOException { if (json != null) { - pw.write(json); + Reader r = new InputStreamReader(new ByteArrayInputStream(json), "UTF-8"); + IOUtils.copy(r, w); + return true; + } + return false; + } + + public boolean render(OutputStream os) throws IOException { + if (json != null) { + os.write(json); return true; } return false; @@ -91,12 +108,17 @@ class JSONRecording implements Recording { } } catch (JSONException e) { log.warn("Error occurred while converting the log data for request {} to JSON", requestId, e); + } catch (UnsupportedEncodingException e) { + log.warn("Error occurred while converting the log data for request {} to JSON", requestId, e); + } catch (IOException e) { + log.warn("Error occurred while converting the log data for request {} to JSON", requestId, e); } } - private String toJSON() throws JSONException { - StringWriter sw = new StringWriter(); - JSONWriter jw = new JSONWriter(sw); + private byte[] toJSON() throws JSONException, IOException { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + OutputStreamWriter osw = new OutputStreamWriter(baos, "UTF-8"); + JSONWriter jw = new JSONWriter(osw); jw.setTidy(true); jw.object(); jw.key("method").value(method); @@ -121,7 +143,8 @@ class JSONRecording implements Recording { addJson(jw, "logs", logs); jw.endObject(); - return sw.toString(); + osw.flush(); + return baos.toByteArray(); } private void addJson(JSONWriter jw, String name, List<? extends JsonEntry> entries) throws JSONException { 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 2684f40..ae9d1b8 100644 --- a/src/main/java/org/apache/sling/tracer/internal/TracerLogServlet.java +++ b/src/main/java/org/apache/sling/tracer/internal/TracerLogServlet.java @@ -67,8 +67,8 @@ class TracerLogServlet extends SimpleWebConsolePlugin implements TraceLogRecorde @Override protected void renderContent(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - final PrintWriter pw = response.getWriter(); if (isHtmlRequest(request)){ + PrintWriter pw = response.getWriter(); renderStatus(pw); renderRequests(pw); } else { @@ -79,11 +79,12 @@ class TracerLogServlet extends SimpleWebConsolePlugin implements TraceLogRecorde if (requestId != null) { JSONRecording recording = cache.getIfPresent(requestId); if (recording != null){ - responseDone = recording.render(pw); + responseDone = recording.render(response.getOutputStream()); } } if (!responseDone) { + PrintWriter pw = response.getWriter(); JSONWriter jw = new JSONWriter(pw); jw.object(); jw.key("error").value("Not found"); 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 5514dd1..7866544 100644 --- a/src/test/java/org/apache/sling/tracer/internal/TracerLogServletTest.java +++ b/src/test/java/org/apache/sling/tracer/internal/TracerLogServletTest.java @@ -19,9 +19,12 @@ package org.apache.sling.tracer.internal; +import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; +import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -102,12 +105,12 @@ public class TracerLogServletTest { verify(response).setHeader(TracerLogServlet.HEADER_TRACER_PROTOCOL_VERSION, String.valueOf(TracerLogServlet.TRACER_PROTOCOL_VERSION)); - StringWriter sw = new StringWriter(); - when(response.getWriter()).thenReturn(new PrintWriter(sw)); + ByteArrayServletOutputStream sos = new ByteArrayServletOutputStream(); + when(response.getOutputStream()).thenReturn(sos); when(request.getRequestURI()).thenReturn("/system/console/" + requestIdCaptor.getValue() + ".json" ); logServlet.renderContent(request, response); - JSONObject json = new JSONObject(sw.toString()); + JSONObject json = new JSONObject(sos.baos.toString("UTF-8")); assertEquals("GET", json.getString("method")); assertEquals(2, json.getJSONArray("requestProgressLogs").length()); } @@ -123,4 +126,17 @@ public class TracerLogServletTest { assertThat(sw.toString(), containsString("Log Tracer")); } + + private static class ByteArrayServletOutputStream extends ServletOutputStream { + final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + @Override + public void write(int b) throws IOException { + baos.write(b); + } + + @Override + public void write(byte[] b, int off, int len) throws IOException { + baos.write(b, off, len); + } + } } -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
