Update of 
/var/cvs/contributions/CMSContainer/cmsc/taglib/src/java/com/finalist/cmsc/taglib/stats
In directory 
james.mmbase.org:/tmp/cvs-serv23704/cmsc/taglib/src/java/com/finalist/cmsc/taglib/stats

Modified Files:
      Tag: b1_5
        GoogleAnalyticsTag.java 
Log Message:
CMSC-1392 Upgraded Google Analytics tag to make it possible to count event and 
configure the account in the context.xml file


See also: 
http://cvs.mmbase.org/viewcvs/contributions/CMSContainer/cmsc/taglib/src/java/com/finalist/cmsc/taglib/stats
See also: http://www.mmbase.org/jira/browse/CMSC-1392


Index: GoogleAnalyticsTag.java
===================================================================
RCS file: 
/var/cvs/contributions/CMSContainer/cmsc/taglib/src/java/com/finalist/cmsc/taglib/stats/GoogleAnalyticsTag.java,v
retrieving revision 1.5
retrieving revision 1.5.2.1
diff -u -b -r1.5 -r1.5.2.1
--- GoogleAnalyticsTag.java     24 Jun 2008 19:53:20 -0000      1.5
+++ GoogleAnalyticsTag.java     12 Feb 2009 13:17:34 -0000      1.5.2.1
@@ -11,47 +11,189 @@
 
 import java.io.IOException;
 
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
 import javax.servlet.jsp.PageContext;
 import javax.servlet.jsp.tagext.SimpleTagSupport;
 
+import net.sf.mmapps.commons.util.EncodingUtil;
+import net.sf.mmapps.modules.cloudprovider.CloudProviderFactory;
+
 import org.apache.commons.lang.StringUtils;
+import org.mmbase.bridge.Cloud;
+import org.mmbase.bridge.Node;
+import org.mmbase.util.logging.Logger;
+import org.mmbase.util.logging.Logging;
 
 import com.finalist.cmsc.mmbase.PropertiesUtil;
 import com.finalist.cmsc.navigation.ServerUtil;
+import com.finalist.cmsc.repository.RepositoryUtil;
 
 public class GoogleAnalyticsTag extends SimpleTagSupport {
-
-   private String account;
+   /** MMbase logging system */
+   private static Logger log = Logging
+         .getLoggerInstance(GoogleAnalyticsTag.class.getName());
+
+   private final static String TYPE_BASIC = "basic"; // init and page counter 
code (default)
+   private final static String TYPE_EVENT = "event"; // event code, category 
and action are required
+
+   private String accountParameter;
+   private String categoryParameter;
+   private String actionParameter;
+   private String nodeNumberParameter;
+   private String labelParameter;
+   private String valueParameter;
+   private String typeParameter = TYPE_BASIC;
+
+   private static String contextAccount;
+   static {
+      InitialContext context;
+      try {
+         context = new InitialContext();
+         Context env = (Context) context.lookup("java:comp/env");
+         contextAccount = (String) env.lookup("googleAnalytics/account");
+      } catch (NamingException e) {
+         log.error("problems getting google context account", e);
+      }
+   }
 
    @Override
    public void doTag() throws IOException {
-      if (ServerUtil.isProduction() && (ServerUtil.isLive() || 
ServerUtil.isSingle())) {
-         if (StringUtils.isBlank(account)) {
+
+      /*
+       * Find out where to get our account from, search order: 1) The
+       * "account"-parameter passed to the tag (only when available, live and
+       * production) 2) The "googleAnalytics/account" setting in the context
+       * XML (only when available) 3) The "googleanalytics.account" system
+       * property, from the system properties (only when available, live and
+       * production)
+       */
+      String account = null;
+      boolean isLiveProduction = (ServerUtil.isProduction() && 
(ServerUtil.isLive() || ServerUtil.isSingle()));
+      if (StringUtils.isNotBlank(accountParameter) && isLiveProduction) {
+         account = accountParameter;
+      } else if (contextAccount != null) {
+         account = contextAccount;
+      } else if (isLiveProduction) {
             account = PropertiesUtil.getProperty("googleanalytics.account");
          }
 
+      // Include the google analytics code
          if (StringUtils.isNotBlank(account)) {
-            String javascript = "<script type=\"text/javascript\">\r\n"
-                  + "var gaJsHost = ((\"https:\" == 
document.location.protocol) ? \"https://ssl.\"; : \"http://www.\";);\r\n"
-                  + "document.write(unescape(\"%3Cscript src='\" + gaJsHost + 
\"google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E\"));\r\n"
-                  + "</script>\r\n" 
-                  + "<script type=\"text/javascript\">\r\n" + "var pageTracker 
= _gat._getTracker(\"" + account + "\");\r\n" 
-                  + "pageTracker._initData();\r\n" 
-                  + "pageTracker._trackPageview();\r\n"
-                  + "</script>\r\n";
+
+         StringBuilder javascript = new StringBuilder();
+         javascript.append("<script type=\"text/javascript\">");
+         if (typeParameter.equals(TYPE_BASIC)) {
+            javascript.append("\r\nvar gaJsHost = ((\"https:\" == 
document.location.protocol) ? \"https://ssl.\"; : \"http://www.\";);\r\n");
+            javascript.append("document.write(unescape(\"%3Cscript src='\" + 
gaJsHost + \"google-analytics.com/ga.js' 
type='text/javascript'%3E%3C/script%3E\"));\r\n");
+            javascript.append("</script>\r\n");
+            javascript.append("<script type=\"text/javascript\">\r\n");
+            javascript.append("try{\r\n");
+            javascript.append("var pageTracker = _gat._getTracker(\"");
+            javascript.append(account);
+            javascript.append("\");\r\n");
+            javascript.append("pageTracker._trackPageview();\r\n");
+            javascript.append("} catch(err) {}\r\n");
+         }
+
+         if (typeParameter.equals(TYPE_EVENT)) {
+            if (StringUtils.isNotBlank(nodeNumberParameter)) {
+               actionParameter = getActionFromNodeNumber(nodeNumberParameter);
+            }
+
+            if (StringUtils.isBlank(categoryParameter)
+                  || StringUtils.isBlank(actionParameter)) {
+               throw new IllegalArgumentException(
+                     "Both category and (action or nodeNumber) parameters are 
required when using type "
+                           + TYPE_EVENT);
+            }
+            javascript.append("pageTracker._trackEvent('");
+            javascript.append(escapeParameter(categoryParameter));
+            javascript.append("','");
+            javascript.append(escapeParameter(actionParameter));
+            if (StringUtils.isNotBlank(labelParameter)) {
+               javascript.append("','");
+               javascript.append(escapeParameter(labelParameter));
+               if (StringUtils.isNotBlank(valueParameter)) {
+                  javascript.append("','");
+                  javascript.append(valueParameter);
+               }
+            }
+            javascript.append("');\r\n");
+         }
+
+         javascript.append("</script>\r\n");
 
             PageContext ctx = (PageContext) getJspContext();
-            ctx.getOut().write(javascript);
+         ctx.getOut().write(javascript.toString());
          }
       }
+
+   private String escapeParameter(String parameter) {
+      return parameter.replace("'", "\\'");
    }
 
-   public String getAccount() {
-      return account;
+   private String getActionFromNodeNumber(String nodeNumber) {
+        Cloud cloud = 
CloudProviderFactory.getCloudProvider().getAnonymousCloud();
+        Node node = cloud.getNode(nodeNumber);
+      Node creationchannel = RepositoryUtil.getCreationChannel(node);
+
+      String prefix = node.getNodeManager().getName();
+
+      String fullpath = creationchannel.getStringValue("path");
+      String path = StringUtils.removeStart(fullpath, "Repository/");
+      String title = 
EncodingUtil.convertNonAscii(node.getStringValue("title"));
+      title = filterTitle(title);
+
+      StringBuilder contentCounterName = new StringBuilder();
+      contentCounterName.append(prefix);
+      contentCounterName.append("/");
+      contentCounterName.append(path);
+      contentCounterName.append("/");
+      contentCounterName.append(nodeNumber);
+      contentCounterName.append("_");
+      contentCounterName.append(title);
+      return contentCounterName.toString();
+   }
+
+   private String filterTitle(String title) {
+      // make sure the title will not break into different path nodes
+      return title.replace('/', '_');
    }
 
    public void setAccount(String account) {
-      this.account = account;
+      this.accountParameter = account;
+   }
+
+   public void setType(String type) {
+      if (type.equals(TYPE_BASIC) || type.equals(TYPE_EVENT)) {
+         this.typeParameter = type;
+      } else {
+         throw new IllegalArgumentException(
+               "type parameter should be empty, \"" + TYPE_BASIC
+                     + "\", \"" + TYPE_EVENT + "\"");
+      }
+   }
+
+   public void setCategory(String categoryParameter) {
+      this.categoryParameter = categoryParameter;
+   }
+
+   public void setNodeNumber(String nodeNumberParameter) {
+      this.nodeNumberParameter = nodeNumberParameter;
+   }
+
+   public void setAction(String actionParameter) {
+      this.actionParameter = actionParameter;
+   }
+
+   public void setLabel(String labelParameter) {
+      this.labelParameter = labelParameter;
+   }
+
+   public void setValue(String valueParameter) {
+      this.valueParameter = valueParameter;
    }
 
 }
_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs

Reply via email to