/*******************************************************************************
* 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.jboss.tools.usage.googleanalytics;
import java.io.UnsupportedEncodingException;
import java.text.MessageFormat;
import org.jboss.tools.usage.googleanalytics.AbstractGoogleAnalyticsParameters.GoogleAnalyticsEvent;
import org.jboss.tools.usage.tracker.IFocusPoint;
import org.jboss.tools.usage.tracker.IURLBuildingStrategy;
import org.jboss.tools.usage.util.HttpEncodingUtils;
/**
* Class that builds an URL that passes given parameters to google analytics
*
* example:
* <p>
* <code>
* http://www.google-analytics.com/__utm.gif?
* utmwv=5.2.4
* &utms=10
* &utmn=583355747
* &utmhn=devstudio.jboss.com
* &utmcs=UTF-8
* &utmsr=2560x1440
* &utmvp=1265x393
* &utmsc=24-bit
* &utmul=en-us
* &utmje=1
* &utmfl=10.1 r102
* &utmdt=JBoss Developer Studio - Early Access
* &utmhid=1589877876
* &utmr=-
* &utmp=/earlyaccess/
* &utmac=UA-xxxxxx-x
* &utmcc=
* __utma=136910373.1786599479.1328002257.1328002257.1328216095.2;
* +__utmz=136910373.1328002257.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none);
* +__utmv=136910373.wonka;
* &utmu=rAAQ~
* </code>
*
* @author Andre Dietisheim
* @author Siddique Hameed
*
* @see based on <a
* href="http://jgoogleAnalytics.googlecode.com">http://jgoogleAnalytics
* .googlecode.com</a>
*
* @see <a
* href="http://code.google.com/apis/analytics/docs/tracking/gaTrackingTroubleshooting.html#gifParameters">GIF
* Request Parameters</a>
* @see <a
* href="http://code.google.com/apis/analytics/docs/concepts/gaConceptsCookies.html#cookiesSet">Cookies
* Set By Google Analytics</a>
*
* @see <a
* href="http://www.morevisibility.com/analyticsblog/from-__utma-to-__utmz-google-analytics-cookies.html">From
* __utma to __utmz (Google Analytics Cookies)</a>
*/
public class GoogleAnalyticsUrlStrategy implements IURLBuildingStrategy {
private static final String TRACKING_URL = "http://www.google-analytics.com/__utm.gif";
private IGoogleAnalyticsParameters googleParameters;
public GoogleAnalyticsUrlStrategy(IGoogleAnalyticsParameters googleAnalyticsParameters) {
this.googleParameters = googleAnalyticsParameters;
}
public String build(IFocusPoint focusPoint) throws UnsupportedEncodingException {
StringBuilder builder = new StringBuilder(TRACKING_URL)
.append(IGoogleAnalyticsParameters.URL_PARAM_DELIMITER);
appendParameter(IGoogleAnalyticsParameters.PARAM_TRACKING_CODE_VERSION,
IGoogleAnalyticsParameters.VALUE_TRACKING_CODE_VERSION, builder);
appendParameter(IGoogleAnalyticsParameters.PARAM_UNIQUE_TRACKING_NUMBER, getRandomNumber(), builder);
appendParameter(IGoogleAnalyticsParameters.PARAM_HOST_NAME, googleParameters.getHostname(), builder);
appendParameter(IGoogleAnalyticsParameters.PARAM_LANGUAGE_ENCODING,
IGoogleAnalyticsParameters.VALUE_ENCODING_UTF8, builder);
appendParameter(IGoogleAnalyticsParameters.PARAM_SCREEN_RESOLUTION, googleParameters.getScreenResolution(),
builder);
appendParameter(IGoogleAnalyticsParameters.PARAM_SCREEN_COLOR_DEPTH, googleParameters.getScreenColorDepth(),
builder);
appendParameter(IGoogleAnalyticsParameters.PARAM_BROWSER_LANGUAGE, googleParameters.getBrowserLanguage(),
builder);
appendParameter(IGoogleAnalyticsParameters.PARAM_PAGE_TITLE, focusPoint.getTitle(), builder);
// appendParameter(IGoogleAnalyticsParameters.PARAM_HID,
// getRandomNumber(), builder);
appendParameter(IGoogleAnalyticsParameters.PARAM_FLASH_VERSION, googleParameters.getFlashVersion(), builder);
/**
* TODO: support multiple events. Obviously these would just get appended to the very same string
*/
appendParameter(IGoogleAnalyticsParameters.PARAM_EVENT_TRACKING, googleParameters.getEvent(), builder);
appendParameter(IGoogleAnalyticsParameters.PARAM_REFERRAL, googleParameters.getReferral(), builder);
appendParameter(IGoogleAnalyticsParameters.PARAM_PAGE_REQUEST, focusPoint.getURI(), builder);
appendParameter(IGoogleAnalyticsParameters.PARAM_ACCOUNT_NAME, googleParameters.getAccountName(), builder);
appendParameter(IGoogleAnalyticsParameters.PARAM_COOKIES, getCookies(), builder);
appendParameter(IGoogleAnalyticsParameters.PARAM_GAQ, "1", false, builder);
googleParameters.visit(); // update visit timestamps and count
return builder.toString();
}
/**
* Returns the google analytics cookies. These cookies determines user
* identity, session identity etc.
*
* @return the cookies
*
* @see <a
* href="http://www.analyticsexperts.com/google-analytics/information-about-the-utmlinker-and-the-__utma-__utmb-and-__utmc-cookies/">Information
* about the utmLinker and the __utma, __utmb and __utmc cookies</a>
* @see <a
* href="http://www.martynj.com/google-analytics-cookies-tracking-multiple-domains-filters">cookie
* values and formats</a>
*/
private String getCookies() {
StringBuilder builder = new StringBuilder();
/**
* unique visitor id cookie has to be unique per eclipse installation
*/
// String timeStamp = "-1";
// //String.valueOf(System.currentTimeMillis());
new GoogleAnalyticsCookie(IGoogleAnalyticsParameters.PARAM_COOKIES_UNIQUE_VISITOR_ID,
new StringBuilder().append("999.")
.append(googleParameters.getUserId()).append(IGoogleAnalyticsParameters.DOT)
.append(googleParameters.getFirstVisit()).append(IGoogleAnalyticsParameters.DOT)
.append(googleParameters.getLastVisit()).append(IGoogleAnalyticsParameters.DOT)
.append(googleParameters.getCurrentVisit()).append(IGoogleAnalyticsParameters.DOT)
.append(googleParameters.getVisitCount()))
.appendTo(builder);
builder.append(IGoogleAnalyticsParameters.SEMICOLON)
.append(IGoogleAnalyticsParameters.PLUS_SIGN);
new GoogleAnalyticsCookie(IGoogleAnalyticsParameters.PARAM_COOKIES_REFERRAL_TYPE,
new StringBuilder()
.append("999.")
.append(googleParameters.getFirstVisit())
.append(IGoogleAnalyticsParameters.DOT)
.append("1.1."))
.appendTo(builder);
// new
// GoogleAnalyticsCookie(IGoogleAnalyticsParameters.PARAM_COOKIES_SESSION,
// new StringBuilder()
// .append("1"),
// IGoogleAnalyticsParameters.SEMICOLON
// , IGoogleAnalyticsParameters.PLUS_SIGN)
// .appendTo(builder);
//
// new
// GoogleAnalyticsCookie(IGoogleAnalyticsParameters.PARAM_COOKIES_BROWSERSESSION,
// new StringBuilder()
// .append("1"),
// IGoogleAnalyticsParameters.SEMICOLON
// , IGoogleAnalyticsParameters.PLUS_SIGN)
// .appendTo(builder);
new GoogleAnalyticsCookie(IGoogleAnalyticsParameters.PARAM_COOKIES_UTMCSR,
"(direct)",
IGoogleAnalyticsParameters.PIPE)
.appendTo(builder);
new GoogleAnalyticsCookie(IGoogleAnalyticsParameters.PARAM_COOKIES_UTMCCN,
"(direct)",
IGoogleAnalyticsParameters.PIPE)
.appendTo(builder);
new GoogleAnalyticsCookie(IGoogleAnalyticsParameters.PARAM_COOKIES_UTMCMD,
"(none)",
IGoogleAnalyticsParameters.PIPE)
.appendTo(builder);
new GoogleAnalyticsCookie(IGoogleAnalyticsParameters.PARAM_COOKIES_KEYWORD,
googleParameters.getKeyword())
.appendTo(builder);
builder.append(IGoogleAnalyticsParameters.SEMICOLON)
.append(IGoogleAnalyticsParameters.PLUS_SIGN);
/**
* <tt>User defined Value<tt> cookie format: (domain hash).(setvar value)
*
* @see <a
* href="http://www.martynj.com/google-analytics-cookies-tracking-multiple-domains-filters">__utmv,
* __utmb, __utmc cookies formats and more</a>
*/
new GoogleAnalyticsCookie(IGoogleAnalyticsParameters.PARAM_COOKIES_USERDEFINED,
getRandomNumber()
+ IGoogleAnalyticsParameters.DOT
+ googleParameters.getUserDefined(),
IGoogleAnalyticsParameters.SEMICOLON)
.appendTo(builder);
return HttpEncodingUtils.checkedEncodeUtf8(builder.toString());
}
private String getRandomNumber() {
return Integer.toString((int) (Math.random() * 0x7fffffff));
}
private void appendParameter(String name, GoogleAnalyticsEvent event, StringBuilder builder) {
appendParameter(name,
MessageFormat.format("5({0}*{1}*{2})", event.getName(), event.getLabel(), event.getValue()),
true,
builder);
}
private void appendParameter(String name, String value, StringBuilder builder) {
appendParameter(name, value, true, builder);
}
private void appendParameter(String name, String value, boolean appendAmpersand, StringBuilder builder) {
builder.append(name)
.append(IGoogleAnalyticsParameters.EQUALS_SIGN)
.append(value);
if (appendAmpersand) {
builder.append(IGoogleAnalyticsParameters.AMPERSAND);
}
}
}