[Yanel-commits] rev 58896 - public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet

michi at wyona.com michi at wyona.com
Fri Jun 24 14:32:00 CEST 2011


Author: michi
Date: 2011-06-24 14:32:00 +0200 (Fri, 24 Jun 2011)
New Revision: 58896

Modified:
   public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/YanelServlet.java
Log:
trackable interface implemented

Modified: public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/YanelServlet.java
===================================================================
--- public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/YanelServlet.java	2011-06-24 12:29:38 UTC (rev 58895)
+++ public/yanel/trunk/src/webapp/src/java/org/wyona/yanel/servlet/YanelServlet.java	2011-06-24 12:32:00 UTC (rev 58896)
@@ -54,6 +54,7 @@
 import org.wyona.yanel.core.attributes.versionable.RevisionInformation;
 import org.wyona.yanel.core.attributes.viewable.View;
 import org.wyona.yanel.core.attributes.viewable.ViewDescriptor;
+import org.wyona.yanel.core.attributes.tracking.TrackingInformationV1;
 import org.wyona.yanel.core.navigation.Node;
 import org.wyona.yanel.core.navigation.Sitetree;
 import org.wyona.yanel.core.serialization.SerializerFactory;
@@ -447,6 +448,7 @@
 
         String usecase = request.getParameter(YANEL_RESOURCE_USECASE);
         Resource res = null;
+        TrackingInformationV1 trackInfo = null;
         long lastModified = -1;
         long size = -1;
 
@@ -455,7 +457,15 @@
             Environment environment = getEnvironment(request, response);
             res = getResource(request, response);
             if (res != null) {
+                if (ResourceAttributeHelper.hasAttributeImplemented(res, "Trackable", "1")) {
+                    //log.debug("Do track: " + res.getPath());
+                    trackInfo = new TrackingInformationV1();
+                    ((org.wyona.yanel.core.api.attributes.TrackableV1) res).doTrack(trackInfo);
+                //} else {
+                //    log.debug("Resource '" + res.getPath() + "' is not trackable.");
+                }
 
+
                 // START introspection generation
                 if (usecase != null && usecase.equals("introspection")) {
                     sendIntrospectionAsResponse(res, doc, rootElement, request, response);
@@ -661,7 +671,7 @@
 
 
         if (view != null) {
-            if (generateResponse(view, res, request, response, doc, size, lastModified) != null) return;
+            if (generateResponse(view, res, request, response, doc, size, lastModified, trackInfo) != null) return;
         } else {
             String message = "View is null!";
             Element exceptionElement = (Element) rootElement.appendChild(doc.createElementNS(NAMESPACE, "exception"));
@@ -1148,7 +1158,7 @@
                     if (usecase!= null && !usecase.equals("introspection")) {
                         log.debug("Ignore introspection requests ...");
                     } else {
-                        doLogAccess(request, response, null);
+                        doLogAccess(request, response, null, null);
                     }
                 }
 
@@ -1806,7 +1816,9 @@
         }
         View view = ((ViewableV2) resource).getView(viewId);
         if (view != null) {
-            if (generateResponse(view, resource, request, response, getDocument(NAMESPACE, "yanel"), -1, -1) != null) return true;
+            log.warn("TODO: Tracking not implemented yet: " + resource.getPath());
+            TrackingInformationV1 trackInfo = null;
+            if (generateResponse(view, resource, request, response, getDocument(NAMESPACE, "yanel"), -1, -1, trackInfo) != null) return true;
         }
         return false;
     }
@@ -1966,19 +1978,20 @@
     /**
      * Generate response from a resource view, whereas it will be checked first if the resource already wrote the response (if so, then just return)
      * @param res Resource which handles the request in order to generate a response
+     * @param trackInfo Tracking information bean which might be updated by resource if resource is implementing trackable
      */
-    private HttpServletResponse generateResponse(View view, Resource res, HttpServletRequest request, HttpServletResponse response, Document doc, long size, long lastModified) throws ServletException, IOException {
+    private HttpServletResponse generateResponse(View view, Resource res, HttpServletRequest request, HttpServletResponse response, Document doc, long size, long lastModified, TrackingInformationV1 trackInfo) throws ServletException, IOException {
+        //log.debug("Generate response: " + res.getPath());
+
         // TODO: There seem like no header fields are being set (e.g. Content-Length, ...). Please see below ...
 
-        //log.debug("Generate response: " + res.getPath());
-
-        // Check if viewable resource has already created a response
+        // INFO: Check if viewable resource has already created a response
         if (!view.isResponse()) {
             if(logAccessEnabled) {
                 if (view.getMimeType() != null) {
                     if (isMimeTypeOk(view.getMimeType())) {
                         //log.debug("Mime type '" + view.getMimeType() + "' of request: " + request.getServletPath() + "?" + request.getQueryString());
-                        doLogAccess(request, response, res);
+                        doLogAccess(request, response, res, trackInfo);
                     }
                 }
             }
@@ -2010,12 +2023,11 @@
             }
         }
 
-
         if(logAccessEnabled) {
             if (mimeType != null) {
                 if (isMimeTypeOk(mimeType)) {
                     //log.debug("Mime type '" + mimeType + "' of request: " + request.getServletPath() + "?" + request.getQueryString());
-                    doLogAccess(request, response, res);
+                    doLogAccess(request, response, res, trackInfo);
                 }
             }
         }
@@ -2486,8 +2498,9 @@
     /**
      * Log browser history of each user
      * @param resource Resource which handles the request
+     * @param trackInfo Tracking information bean
      */
-    private void doLogAccess(HttpServletRequest request, HttpServletResponse response, Resource resource) {
+    private void doLogAccess(HttpServletRequest request, HttpServletResponse response, Resource resource, TrackingInformationV1 trackInfo) {
         // TBD: What about a cluster, performance/scalability? See for example http://www.oreillynet.com/cs/user/view/cs_msg/17399 (also see Tomcat conf/server.xml <Valve className="AccessLogValve" and className="FastCommonAccessLogValve")
         // See apache-tomcat-5.5.33/logs/localhost_access_log.2009-11-07.txt
         // 127.0.0.1 - - [07/Nov/2009:01:24:09 +0100] "GET /yanel/from-scratch-realm/de/index.html HTTP/1.1" 200 4464
@@ -2523,7 +2536,34 @@
                 log.debug("Resource is null because access was probably denied: " + request.getServletPath());
             }
 
-            String accessLogMessage = AccessLog.getLogMessage(request, response, realm.getID(), tags);
+            String accessLogMessage;
+            if (trackInfo != null) {
+                String[] trackingTags = trackInfo.getTags();
+                if (trackingTags != null && trackingTags.length > 0) {
+                    accessLogMessage = AccessLog.getLogMessage(request, response, realm.getID(), trackingTags);
+                } else {
+                    accessLogMessage = AccessLog.getLogMessage(request, response, realm.getID(), tags);
+                }
+
+                String pageType = trackInfo.getPageType();
+                if (pageType != null) {
+                    accessLogMessage = accessLogMessage + AccessLog.encodeLogField("pt", pageType);
+                }
+
+                String requestAction = trackInfo.getRequestAction();
+                if (requestAction != null) {
+                    accessLogMessage = accessLogMessage + AccessLog.encodeLogField("ra", requestAction);
+                }
+
+                HashMap<String, String> customFields = trackInfo.getCustomFields();
+                if (customFields != null) {
+                    for (java.util.Map.Entry field : customFields.entrySet()) {
+                        accessLogMessage = accessLogMessage + AccessLog.encodeLogField((String) field.getKey(), (String) field.getValue());
+                    }
+                }
+            } else {
+                accessLogMessage = AccessLog.getLogMessage(request, response, realm.getID(), tags);
+            }
             
             // TBD/TODO: What if user has logged out, but still has a persistent cookie?!
             Identity identity = getIdentity(request, map);



More information about the Yanel-commits mailing list