Author: mgrigorov
Date: Mon Jul 19 15:09:22 2010
New Revision: 965527

URL: http://svn.apache.org/viewvc?rev=965527&view=rev
Log:
Implement IRequestLogger by copy/pasting the code from Wicket 1.4 RequestLogger 
and "translate" the usage of IRequestTarget to IRequestHandler


Modified:
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/DummyRequestLogger.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/IRequestLogger.java

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/DummyRequestLogger.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/DummyRequestLogger.java?rev=965527&r1=965526&r2=965527&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/DummyRequestLogger.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/DummyRequestLogger.java
 Mon Jul 19 15:09:22 2010
@@ -16,73 +16,404 @@
  */
 package org.apache.wicket.protocol.http;
 
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.LinkedList;
 import java.util.List;
-
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.wicket.Application;
+import org.apache.wicket.MetaDataKey;
+import org.apache.wicket.Page;
+import org.apache.wicket.Session;
 import org.apache.wicket.request.IRequestHandler;
-
-// TODO (NG) DO something useful here
+import org.apache.wicket.request.cycle.RequestCycle;
+import org.apache.wicket.request.handler.BookmarkablePageRequestHandler;
+import org.apache.wicket.request.handler.IPageRequestHandler;
+import org.apache.wicket.request.handler.ListenerInterfaceRequestHandler;
+import 
org.apache.wicket.request.handler.resource.ResourceReferenceRequestHandler;
+import org.apache.wicket.util.lang.Classes;
+import org.apache.wicket.util.string.AppendingStringBuffer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * This is the logger class that can be set in the
+ * {...@link 
org.apache.wicket.protocol.http.WebApplication#getRequestLogger()} method. If 
this class
+ * is set all request and live sessions will be recorded and displayed From 
the total created
+ * sessions, to the peak session count and the current live sessions. For the 
live sessions the
+ * request logger will record what request are happening what kind of 
{...@link IRequestHandler} was
+ * the event target and what {...@link IRequestHandler} was the response 
target. It also records what
+ * session data was touched for this and how long the request did take.
+ * 
+ * To view this information live see the {...@link InspectorBug} that shows 
the {...@link InspectorPage}
+ * with the {...@link LiveSessionsPage}
+ * 
+ * @author jcompagner
+ * 
+ * @since 1.2
+ */
 public class DummyRequestLogger implements IRequestLogger
 {
+       /** log. */
+       protected static Logger log = 
LoggerFactory.getLogger(DummyRequestLogger.class);
+
+       private static MetaDataKey<RequestData> REQUEST_DATA = new 
MetaDataKey<RequestData>()
+       {
+               private static final long serialVersionUID = 1L;
+       };
+
+       private final AtomicInteger totalCreatedSessions = new AtomicInteger();
+
+       private final AtomicInteger peakSessions = new AtomicInteger();
+
+       private final List<RequestData> requests;
+
+       private final Map<String, SessionData> liveSessions;
 
+       private final ThreadLocal<RequestData> currentRequest = new 
ThreadLocal<RequestData>();
+
+       private final AtomicInteger activeRequests = new AtomicInteger();
+
+       /**
+        * Construct.
+        */
        public DummyRequestLogger()
        {
+               requests = Collections.synchronizedList(new 
LinkedList<RequestData>()
+               {
+                       private static final long serialVersionUID = 1L;
+
+                       /**
+                        * @see java.util.LinkedList#add(java.lang.Object)
+                        */
+                       @Override
+                       public void add(int index, RequestData o)
+                       {
+                               super.add(index, o);
+                               if (size() > 
Application.get().getRequestLoggerSettings().getRequestsWindowSize())
+                               {
+                                       removeLast();
+                               }
+                       }
+               });
+               liveSessions = new ConcurrentHashMap<String, SessionData>();
+
        }
 
        public int getCurrentActiveRequestCount()
        {
-               return 0;
+               return activeRequests.get();
        }
 
        public SessionData[] getLiveSessions()
        {
-               return null;
+               final SessionData[] sessions = 
liveSessions.values().toArray(new SessionData[0]);
+               Arrays.sort(sessions);
+               return sessions;
        }
 
        public int getPeakSessions()
        {
-               return 0;
+               return peakSessions.get();
        }
 
        public List<RequestData> getRequests()
        {
-               return null;
+               return Collections.unmodifiableList(requests);
        }
 
        public int getTotalCreatedSessions()
        {
-               return 0;
+               return totalCreatedSessions.get();
        }
 
-       public void logEventTarget(IRequestHandler target)
+       public void logEventTarget(IRequestHandler requestHandler)
        {
+               
getCurrentRequest().addEventTarget(getRequestHandlerString(requestHandler));
        }
 
-       public void logResponseTarget(IRequestHandler target)
-       {
+       public void logResponseTarget(IRequestHandler requestHandler)
+       {
+               
getCurrentRequest().addResponseTarget(getRequestHandlerString(requestHandler));
+       }
+
+       /**
+        * @param requestHandler
+        * @return The request target nice display string
+        */
+       private String getRequestHandlerString(final IRequestHandler 
requestHandler)
+       {
+               AppendingStringBuffer sb = new AppendingStringBuffer(128);
+               if (requestHandler instanceof ListenerInterfaceRequestHandler)
+               {
+                       ListenerInterfaceRequestHandler listener = 
(ListenerInterfaceRequestHandler)requestHandler;
+                       sb.append("Interface[component: ");
+                       
sb.append(Classes.simpleName(listener.getComponent().getClass()));
+                       sb.append("(");
+                       
sb.append(listener.getComponent().getPageRelativePath());
+                       sb.append("), page: ");
+                       sb.append(listener.getPage().getClass().getName());
+                       sb.append("(");
+                       sb.append(listener.getPage().getId());
+                       sb.append("), interface: ");
+                       sb.append(listener.getListenerInterface().getName());
+                       sb.append(".");
+                       
sb.append(listener.getListenerInterface().getMethod().getName());
+                       sb.append("]");
+               }
+               else if (requestHandler instanceof 
BookmarkablePageRequestHandler)
+               {
+                       BookmarkablePageRequestHandler pageRequestHandler = 
(BookmarkablePageRequestHandler)requestHandler;
+                       sb.append("BookmarkablePage[");
+                       sb.append(pageRequestHandler.getPageClass().getName());
+                       
sb.append("(").append(pageRequestHandler.getPageParameters()).append(")");
+                       sb.append("]");
+               }
+               else if (requestHandler instanceof IPageRequestHandler)
+               {
+                       IPageRequestHandler pageRequestHandler = 
(IPageRequestHandler)requestHandler;
+                       sb.append("PageRequest[");
+                       
sb.append(pageRequestHandler.getPage().getClass().getName());
+                       sb.append("(");
+                       sb.append(pageRequestHandler.getPage().getId());
+                       sb.append(")]");
+               }
+               else if (requestHandler instanceof 
ResourceReferenceRequestHandler)
+               {
+                       ResourceReferenceRequestHandler resourceRefenceHandler 
= (ResourceReferenceRequestHandler)requestHandler;
+                       sb.append("ResourceReference[");
+                       
sb.append(resourceRefenceHandler.getResourceReference());
+                       sb.append("]");
+               }
+               else
+               {
+                       sb.append(requestHandler.toString());
+               }
+               return sb.toString();
        }
 
+
        public void objectCreated(Object value)
        {
+               RequestData rd = getCurrentRequest();
+
+               if (value instanceof Session)
+               {
+                       rd.addEntry("Session created");
+               }
+               else if (value instanceof Page)
+               {
+                       Page page = (Page)value;
+                       rd.addEntry("Page created, id: " + page.getId() + ", 
class:" + page.getClass());
+               }
+               else
+               {
+                       rd.addEntry("Custom object created: " + value);
+               }
+
        }
 
        public void objectRemoved(Object value)
        {
+               RequestData rd = getCurrentRequest();
+               if (value instanceof Page)
+               {
+                       Page page = (Page)value;
+                       rd.addEntry("Page removed, id: " + page.getId() + ", 
class:" + page.getClass());
+               }
+               else if (value instanceof WebSession)
+               {
+                       rd.addEntry("Session removed");
+               }
+               else
+               {
+                       rd.addEntry("Custom object removed: " + value);
+               }
        }
 
        public void objectUpdated(Object value)
        {
+               RequestData rd = getCurrentRequest();
+               if (value instanceof Page)
+               {
+                       Page page = (Page)value;
+                       rd.addEntry("Page updated, id: " + page.getId() + ", 
class:" + page.getClass());
+               }
+               else if (value instanceof Session)
+               {
+                       rd.addEntry("Session updated");
+               }
+               else
+               {
+                       rd.addEntry("Custom object updated: " + value);
+               }
        }
 
        public void requestTime(long timeTaken)
        {
+               RequestData rd = RequestCycle.get().getMetaData(REQUEST_DATA);
+               if (rd != null)
+               {
+                       if (activeRequests.get() > 0)
+                       {
+                               
rd.setActiveRequest(activeRequests.decrementAndGet());
+                       }
+                       Session session = Session.get();
+                       String sessionId = session.getId();
+                       rd.setSessionId(sessionId);
+
+                       Object sessionInfo = getSessionInfo(session);
+                       rd.setSessionInfo(sessionInfo);
+
+                       long sizeInBytes = -1;
+                       if 
(Application.get().getRequestLoggerSettings().getRecordSessionSize())
+                       {
+                               try
+                               {
+                                       sizeInBytes = session.getSizeInBytes();
+                               }
+                               catch (Exception e)
+                               {
+                                       // log the error and let the request 
logging continue (this is what happens in
+                                       // the
+                                       // detach phase of the request cycle 
anyway. This provides better diagnostics).
+                                       log.error(
+                                               "Exception while determining 
the size of the session in the request logger: " +
+                                                       e.getMessage(), e);
+                               }
+                       }
+                       rd.setSessionSize(sizeInBytes);
+                       rd.setTimeTaken(timeTaken);
+
+                       requests.add(0, rd);
+                       if (sessionId != null)
+                       {
+                               SessionData sd = liveSessions.get(sessionId);
+                               if (sd == null)
+                               {
+                                       // passivated session or logger only 
started after it.
+                                       sessionCreated(sessionId);
+                                       sd = liveSessions.get(sessionId);
+                               }
+                               if (sd != null)
+                               {
+                                       sd.setSessionInfo(sessionInfo);
+                                       sd.setSessionSize(sizeInBytes);
+                                       sd.addTimeTaken(timeTaken);
+                                       log(rd, sd);
+                               }
+                               else
+                               {
+                                       log(rd, null);
+                               }
+                       }
+                       else
+                       {
+                               log(rd, null);
+                       }
+               }
+       }
+
+       public void sessionCreated(String sessionId)
+       {
+               liveSessions.put(sessionId, new SessionData(sessionId));
+               if (liveSessions.size() > peakSessions.get())
+               {
+                       peakSessions.set(liveSessions.size());
+               }
+               totalCreatedSessions.incrementAndGet();
        }
 
-       public void sessionCreated(String id)
+       public void sessionDestroyed(String sessionId)
        {
+               liveSessions.remove(sessionId);
        }
 
-       public void sessionDestroyed(String sessionId)
+       RequestData getCurrentRequest()
        {
+               RequestCycle requestCycle = RequestCycle.get();
+               RequestData rd = requestCycle.getMetaData(REQUEST_DATA);
+               if (rd == null)
+               {
+                       rd = new RequestData();
+                       requestCycle.setMetaData(REQUEST_DATA, rd);
+                       activeRequests.incrementAndGet();
+               }
+               return rd;
+       }
+
+       /**
+        * @param rd
+        * @param sd
+        */
+       protected void log(RequestData rd, SessionData sd)
+       {
+               if (log.isInfoEnabled())
+               {
+                       log.info(createLogString(rd, sd, true).toString());
+               }
+       }
+
+       protected final AppendingStringBuffer createLogString(RequestData rd, 
SessionData sd,
+               boolean includeRuntimeInfo)
+       {
+               AppendingStringBuffer asb = new AppendingStringBuffer(150);
+               asb.append("time=");
+               asb.append(rd.getTimeTaken());
+               asb.append(",event=");
+               asb.append(rd.getEventTarget());
+               asb.append(",response=");
+               asb.append(rd.getResponseTarget());
+               if (rd.getSessionInfo() != null && 
!rd.getSessionInfo().equals(""))
+               {
+                       asb.append(",sessioninfo=");
+                       asb.append(rd.getSessionInfo());
+               }
+               else
+               {
+                       asb.append(",sessionid=");
+                       asb.append(rd.getSessionId());
+               }
+               asb.append(",sessionsize=");
+               asb.append(rd.getSessionSize());
+               if (sd != null)
+               {
+                       asb.append(",sessionstart=");
+                       asb.append(sd.getStartDate());
+                       asb.append(",requests=");
+                       asb.append(sd.getNumberOfRequests());
+                       asb.append(",totaltime=");
+                       asb.append(sd.getTotalTimeTaken());
+               }
+               asb.append(",activerequests=");
+               asb.append(rd.getActiveRequest());
+               if (includeRuntimeInfo)
+               {
+                       Runtime runtime = Runtime.getRuntime();
+                       long max = runtime.maxMemory() / 1000000;
+                       long total = runtime.totalMemory() / 1000000;
+                       long used = total - runtime.freeMemory() / 1000000;
+                       asb.append(",maxmem=");
+                       asb.append(max);
+                       asb.append("M,total=");
+                       asb.append(total);
+                       asb.append("M,used=");
+                       asb.append(used);
+                       asb.append("M");
+               }
+               return asb;
+       }
+
+       private Object getSessionInfo(Session session)
+       {
+               if (session instanceof ISessionLogInfo)
+               {
+                       return ((ISessionLogInfo)session).getSessionInfo();
+               }
+               return "";
        }
 
 }

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/IRequestLogger.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/IRequestLogger.java?rev=965527&r1=965526&r2=965527&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/IRequestLogger.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/IRequestLogger.java
 Mon Jul 19 15:09:22 2010
@@ -424,4 +424,24 @@ public interface IRequestLogger
                }
        }
 
+       /**
+        * This interface can be implemented in a custom session object. to 
give an object that has more
+        * information for the current session (state of session).
+        * 
+        * @author jcompagner
+        */
+       public interface ISessionLogInfo
+       {
+
+               /**
+                * If you use the request logger log functionality then this 
object should have a nice
+                * String representation. So make sure that the toString() is 
implemented for the returned
+                * object.
+                * 
+                * @return The custom object stored in the request loggers 
current request.
+                */
+               Object getSessionInfo();
+       }
+
+
 }
\ No newline at end of file


Reply via email to