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

Modified Files:
      Tag: b1_4
        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.2.2.1
retrieving revision 1.2.2.2
diff -u -b -r1.2.2.1 -r1.2.2.2
--- GoogleAnalyticsTag.java     24 Jun 2008 19:53:08 -0000      1.2.2.1
+++ GoogleAnalyticsTag.java     12 Feb 2009 13:13:15 -0000      1.2.2.2
@@ -11,48 +11,190 @@
 
 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.isLive() && ServerUtil.isProduction()) {
-         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.isLive() && ServerUtil
+                               .isProduction());
+               if (StringUtils.isNotBlank(accountParameter) && 
isLiveProduction) {
+                       account = accountParameter;
+               } else if (contextAccount != null) {
+                       account = contextAccount;
+               } else if (isLiveProduction) {
             account = PropertiesUtil.getProperty("googleanalytics.account");
          }
 
-         if (!StringUtils.isBlank(account)) {
+               // Include the google analytics code
+               if (StringUtils.isNotBlank(account)) {
+
+                       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");
+                       }
 
-            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";
+                       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("'", "\\'");
+       }
+
+       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();
    }
 
-   public String getAccount() {
-      return account;
+       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