You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by bd...@apache.org on 2009/06/09 18:13:20 UTC
svn commit: r783056 - in /incubator/sling/trunk/bundles/engine: ./
src/main/java/org/apache/sling/engine/impl/
src/main/java/org/apache/sling/engine/impl/request/
Author: bdelacretaz
Date: Tue Jun 9 16:13:20 2009
New Revision: 783056
URL: http://svn.apache.org/viewvc?rev=783056&view=rev
Log:
SLING-1000 - Web console plugin to display recent requests
Added:
incubator/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/request/RequestHistoryConsolePlugin.java (with props)
Modified:
incubator/sling/trunk/bundles/engine/pom.xml
incubator/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/EngineBundleActivator.java
incubator/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/SlingHttpServletRequestImpl.java
incubator/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/request/RequestData.java
Modified: incubator/sling/trunk/bundles/engine/pom.xml
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/bundles/engine/pom.xml?rev=783056&r1=783055&r2=783056&view=diff
==============================================================================
--- incubator/sling/trunk/bundles/engine/pom.xml (original)
+++ incubator/sling/trunk/bundles/engine/pom.xml Tue Jun 9 16:13:20 2009
@@ -68,6 +68,9 @@
javax.portlet;resolution:=optional,
*
</Import-Package>
+ <DynamicImport-Package>
+ org.apache.felix.webconsole
+ </DynamicImport-Package>
<Bundle-Activator>
org.apache.sling.engine.impl.EngineBundleActivator
</Bundle-Activator>
@@ -136,6 +139,11 @@
<artifactId>org.osgi.compendium</artifactId>
</dependency>
<dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.webconsole</artifactId>
+ <version>1.2.0</version>
+ </dependency>
+ <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
Modified: incubator/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/EngineBundleActivator.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/EngineBundleActivator.java?rev=783056&r1=783055&r2=783056&view=diff
==============================================================================
--- incubator/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/EngineBundleActivator.java (original)
+++ incubator/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/EngineBundleActivator.java Tue Jun 9 16:13:20 2009
@@ -22,6 +22,7 @@
import java.util.Hashtable;
import org.apache.sling.engine.SlingSettingsService;
+import org.apache.sling.engine.impl.request.RequestHistoryConsolePlugin;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
@@ -50,6 +51,7 @@
serviceRegistration = context.registerService(SlingSettingsService.class.getName(),
service,
props);
+ RequestHistoryConsolePlugin.initPlugin(context);
}
/**
@@ -60,5 +62,6 @@
serviceRegistration.unregister();
serviceRegistration = null;
}
+ RequestHistoryConsolePlugin.destroyPlugin();
}
}
Modified: incubator/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/SlingHttpServletRequestImpl.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/SlingHttpServletRequestImpl.java?rev=783056&r1=783055&r2=783056&view=diff
==============================================================================
--- incubator/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/SlingHttpServletRequestImpl.java (original)
+++ incubator/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/SlingHttpServletRequestImpl.java Tue Jun 9 16:13:20 2009
@@ -49,6 +49,7 @@
import org.apache.sling.engine.impl.helper.NullResourceBundle;
import org.apache.sling.engine.impl.parameters.ParameterSupport;
import org.apache.sling.engine.impl.request.RequestData;
+import org.apache.sling.engine.impl.request.RequestHistoryConsolePlugin;
import org.apache.sling.engine.impl.request.SlingRequestDispatcher;
import org.osgi.service.http.HttpContext;
import org.osgi.service.useradmin.Authorization;
@@ -74,6 +75,7 @@
pathInfo = pathInfo.concat(servletRequest.getPathInfo());
}
this.pathInfo = pathInfo;
+ RequestHistoryConsolePlugin.recordRequest(this);
}
/**
Modified: incubator/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/request/RequestData.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/request/RequestData.java?rev=783056&r1=783055&r2=783056&view=diff
==============================================================================
--- incubator/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/request/RequestData.java (original)
+++ incubator/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/request/RequestData.java Tue Jun 9 16:13:20 2009
@@ -182,6 +182,10 @@
servletResponse);
this.requestProgressTracker = new SlingRequestProgressTracker();
+ this.requestProgressTracker.log(
+ "Method=" + this.slingRequest.getMethod()
+ + ", PathInfo=" + this.slingRequest.getPathInfo()
+ );
}
public Resource initResource(ResourceResolver resourceResolver) {
Added: incubator/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/request/RequestHistoryConsolePlugin.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/request/RequestHistoryConsolePlugin.java?rev=783056&view=auto
==============================================================================
--- incubator/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/request/RequestHistoryConsolePlugin.java (added)
+++ incubator/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/request/RequestHistoryConsolePlugin.java Tue Jun 9 16:13:20 2009
@@ -0,0 +1,196 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.engine.impl.request;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.Iterator;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.felix.webconsole.AbstractWebConsolePlugin;
+import org.apache.felix.webconsole.WebConsoleConstants;
+import org.apache.sling.api.SlingHttpServletRequest;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceRegistration;
+
+/**
+ * Felix OSGi console plugin that displays info about recent requests processed
+ * by Sling. Info about all requests can be found in the logs, but this is
+ * useful when testing or explaining things.
+ */
+@SuppressWarnings("serial")
+public class RequestHistoryConsolePlugin extends AbstractWebConsolePlugin {
+
+ public static final String LABEL = "requests";
+ public static final String INDEX = "index";
+ private static RequestHistoryConsolePlugin instance;
+ private ServiceRegistration serviceRegistration;
+
+ public static final int STORED_REQUESTS_COUNT = 20;
+ private final SlingHttpServletRequest[] requests = new SlingHttpServletRequest[STORED_REQUESTS_COUNT];
+ private int lastRequestIndex = -1;
+
+ private RequestHistoryConsolePlugin() {
+ }
+
+ public static void recordRequest(SlingHttpServletRequest r) {
+ if (instance == null) {
+ return;
+ }
+ instance.addRequest(r);
+ }
+
+ private synchronized void addRequest(SlingHttpServletRequest r) {
+ int index = lastRequestIndex + 1;
+ if (index >= requests.length) {
+ index = 0;
+ }
+ requests[index] = r;
+ lastRequestIndex = index;
+ }
+
+ public static void initPlugin(BundleContext context) {
+ if (instance == null) {
+ RequestHistoryConsolePlugin tmp = new RequestHistoryConsolePlugin();
+ tmp.activate(context);
+ instance = tmp;
+ }
+ }
+
+ public static void destroyPlugin() {
+ if (instance != null) {
+ try {
+ instance.deactivate();
+ } finally {
+ instance = null;
+ }
+ }
+ }
+
+ public void activate(BundleContext context) {
+ super.activate(context);
+
+ Dictionary<String, Object> props = new Hashtable<String, Object>();
+ props
+ .put(Constants.SERVICE_DESCRIPTION,
+ "Web Console Plugin to display information about recent Sling requests");
+ props.put(Constants.SERVICE_VENDOR, "The Apache Software Foundation");
+ props.put(Constants.SERVICE_PID, getClass().getName());
+ props.put(WebConsoleConstants.PLUGIN_LABEL, LABEL);
+
+ serviceRegistration = context.registerService(
+ WebConsoleConstants.SERVICE_NAME, this, props);
+ }
+
+ public void deactivate() {
+ if (serviceRegistration != null) {
+ serviceRegistration.unregister();
+ serviceRegistration = null;
+ }
+ super.deactivate();
+ }
+
+ @Override
+ public String getLabel() {
+ return LABEL;
+ }
+
+ @Override
+ public String getTitle() {
+ return "Recent requests";
+ }
+
+ @Override
+ protected void renderContent(HttpServletRequest req, HttpServletResponse res)
+ throws ServletException, IOException {
+
+ // Select request to display
+ int index = 0;
+ final String tmp = req.getParameter(INDEX);
+ if (tmp != null) {
+ try {
+ index = Integer.parseInt(tmp);
+ } catch (NumberFormatException ignore) {
+ // ignore
+ }
+ }
+
+ // index is relative to lastRequestIndex
+ int arrayIndex = lastRequestIndex - index;
+ if (arrayIndex < 0) {
+ arrayIndex += requests.length;
+ }
+
+ SlingHttpServletRequest r = null;
+ try {
+ r = requests[arrayIndex];
+ } catch (ArrayIndexOutOfBoundsException ignore) {
+ // ignore
+ }
+
+ final PrintWriter pw = res.getWriter();
+
+ pw.println("<table class='content' cellpadding='0' cellspacing='0' width='100%'>");
+
+ // Links to other requests
+ pw.println("<thead>");
+ pw.println("<tr class='content'>");
+ pw.println("<th colspan='2'class='content container'>Recent Requests</th>");
+ pw.println("</thead>");
+ pw.println("<tbody>");
+ pw.println("<tr class='content'><td>");
+ for (int i = 0; i < requests.length; i++) {
+ if (requests[i] != null) {
+ final String info = (i == 0 ? " (latest)" : "");
+ pw.print("<a href='" + LABEL + "?index=" + i + "'>");
+ if (i == index) {
+ pw.print("<b>");
+ }
+ pw.print("Request " + i + info);
+ if (i == index) {
+ pw.print("</b>");
+ }
+ pw.println("</a> ");
+ }
+ }
+ pw.println("</td></tr>");
+
+ if (r != null) {
+ // Request Progress Tracker Info
+ pw.println("<tr class='content'>");
+ pw.println("<th colspan='2'class='content container'>");
+ pw.print("Request " + index + " - RequestProgressTracker Info");
+ pw.println("</th></tr>");
+ pw.println("<tr><td colspan='2'>");
+ final Iterator<String> it = r.getRequestProgressTracker().getMessages();
+ pw.print("<pre>");
+ while (it.hasNext()) {
+ pw.print(it.next());
+ }
+ pw.println("</pre></td></tr>");
+ }
+ pw.println("</tbody></table>");
+ }
+}
\ No newline at end of file
Propchange: incubator/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/request/RequestHistoryConsolePlugin.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/sling/trunk/bundles/engine/src/main/java/org/apache/sling/engine/impl/request/RequestHistoryConsolePlugin.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision Rev URL