/*******************************************************************************
* Copyright (c) 2010-2014 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.usage.googleanalytics.eclipse;
import java.util.Random;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.PlatformUI;
import org.jboss.tools.usage.googleanalytics.AbstractGoogleAnalyticsParameters;
import org.jboss.tools.usage.googleanalytics.IGoogleAnalyticsParameters;
import org.jboss.tools.usage.internal.JBossToolsUsageActivator;
import org.jboss.tools.usage.internal.preferences.IUsageReportPreferenceConstants;
import org.jboss.tools.usage.internal.preferences.UsageReportPreferencesUtils;
/**
* @author Andre Dietisheim
*/
public abstract class AbstractEclipseEnvironment extends AbstractGoogleAnalyticsParameters implements
IEclipseEnvironment {
private static final String SYSPROP_JAVA_VERSION = "java.version";
private static final String SYSPROP_JAVA_NAME = "java.vm.name";
private static final String SYSPROP_JAVA_VENDOR = "java.vendor";
private static final String SYSPROP_JAVA_BIT_VERSION = "sun.arch.data.model";
private static final String UNKNOWN_JAVA_BIT_VERSION = "unknown";
private volatile String screenResolution;
private volatile String screenColorDepth;
private Random random;
private IEclipsePreferences preferences;
private String firstVisit;
private String lastVisit;
private String currentVisit;
private long visitCount;
protected IEclipseUserAgent eclipseUserAgent;
protected AbstractEclipseEnvironment(String accountName, String hostName, IEclipsePreferences preferences) {
this(accountName, hostName, IGoogleAnalyticsParameters.VALUE_NO_REFERRAL, preferences);
}
protected AbstractEclipseEnvironment(String accountName, String hostName, IEclipsePreferences preferences, IEclipseUserAgent userAgent) {
this(accountName, hostName, IGoogleAnalyticsParameters.VALUE_NO_REFERRAL, preferences, userAgent);
}
protected AbstractEclipseEnvironment(String accountName, String hostName, String referral,
IEclipsePreferences preferences) {
this(accountName, hostName, referral, preferences, new EclipseUserAgent());
}
protected AbstractEclipseEnvironment(String accountName, String hostName, String referral,
IEclipsePreferences preferences, IEclipseUserAgent eclipseUserAgent) {
super(accountName, hostName, referral);
this.random = new Random();
this.preferences = preferences;
this.eclipseUserAgent = eclipseUserAgent;
initScreenSettings();
initVisits();
}
protected void initScreenSettings() {
final Display display = getDisplay();
display.asyncExec(new Runnable() {
@Override
public void run() {
screenColorDepth = display.getDepth() + SCREENCOLORDEPTH_POSTFIX;
Rectangle bounds = display.getBounds();
screenResolution = bounds.width + SCREERESOLUTION_DELIMITER + bounds.height;
}
});
}
private void initVisits() {
String currentTime = String.valueOf(System.currentTimeMillis());
this.currentVisit = currentTime;
this.firstVisit = preferences.get(IUsageReportPreferenceConstants.FIRST_VISIT, null);
if (firstVisit == null) {
this.firstVisit = currentTime;
preferences.put(IUsageReportPreferenceConstants.FIRST_VISIT, firstVisit);
}
lastVisit = preferences.get(IUsageReportPreferenceConstants.LAST_VISIT, currentTime);
visitCount = preferences.getLong(IUsageReportPreferenceConstants.VISIT_COUNT, 1);
preferences.put(IUsageReportPreferenceConstants.LAST_VISIT, currentTime);
preferences.putLong(IUsageReportPreferenceConstants.VISIT_COUNT, visitCount+1);
UsageReportPreferencesUtils.checkedSavePreferences(preferences, JBossToolsUsageActivator.getDefault(),
GoogleAnalyticsEclipseMessages.EclipseEnvironment_Error_SavePreferences);
}
@Override
public String getBrowserLanguage() {
return eclipseUserAgent.getBrowserLanguage();
}
@Override
public String getScreenResolution() {
if(screenResolution==null) {
return "notInitialized";
}
return screenResolution;
}
@Override
public String getScreenColorDepth() {
if(screenColorDepth==null) {
return "notInitialized";
}
return screenColorDepth;
}
protected Display getDisplay() {
if (PlatformUI.isWorkbenchRunning()) {
return PlatformUI.getWorkbench().getDisplay();
}
Display display = Display.getCurrent();
if (display == null) {
display = Display.getDefault();
}
return display;
}
@Override
public String getUserAgent() {
return eclipseUserAgent.toString();
}
@Override
public String getUserId() {
String userId = preferences.get(IUsageReportPreferenceConstants.ECLIPSE_INSTANCE_ID, null);
if (userId == null) {
userId = createIdentifier();
preferences.put(IUsageReportPreferenceConstants.ECLIPSE_INSTANCE_ID, userId);
UsageReportPreferencesUtils.checkedSavePreferences(preferences, JBossToolsUsageActivator.getDefault(),
GoogleAnalyticsEclipseMessages.EclipseEnvironment_Error_SavePreferences);
}
return userId;
}
/**
* Creates an unique identifier.
*
* @return the identifier
*/
private String createIdentifier() {
StringBuilder builder = new StringBuilder();
builder.append(Math.abs(random.nextLong()));
builder.append(System.currentTimeMillis());
return builder.toString();
}
@Override
public abstract String getKeyword();
@Override
synchronized public String getCurrentVisit() {
return currentVisit;
}
@Override
synchronized public String getFirstVisit() {
return firstVisit;
}
@Override
synchronized public String getLastVisit() {
return lastVisit;
}
@Override
synchronized public long getVisitCount() {
return visitCount;
}
@Override
synchronized public void visit() {
lastVisit = currentVisit;
preferences.put(IUsageReportPreferenceConstants.LAST_VISIT, lastVisit);
currentVisit = String.valueOf(System.currentTimeMillis());
visitCount++;
preferences.putLong(IUsageReportPreferenceConstants.VISIT_COUNT, visitCount);
UsageReportPreferencesUtils.checkedSavePreferences(preferences, JBossToolsUsageActivator.getDefault(),
GoogleAnalyticsEclipseMessages.EclipseEnvironment_Error_SavePreferences);
}
private boolean justInitialized = true;
@Override
synchronized public void startNewVisitSession() {
// Check if we need to start a new visit session since it might have already been started during initialization
if(!justInitialized) {
initVisits();
}
justInitialized = false;
}
@Override
public String getFlashVersion() {
return getJavaVersion();
}
private String getJavaVersion() {
return System.getProperty(SYSPROP_JAVA_VERSION);
}
@Override
public String getJavaVmName() {
return System.getProperty(SYSPROP_JAVA_NAME);
}
@Override
public String getJavaVendor() {
return System.getProperty(SYSPROP_JAVA_VENDOR);
}
@Override
public String getJavaBitVersion() {
String version = System.getProperty(SYSPROP_JAVA_BIT_VERSION);
return version!=null?version:UNKNOWN_JAVA_BIT_VERSION;
}
@Override
public IEclipseUserAgent getEclipseUserAgent() {
return eclipseUserAgent;
}
@Override
public String getUserDefined() {
return getLinuxDistroNameAndVersion();
}
protected String getLinuxDistroNameAndVersion() {
return LinuxSystem.INSTANCE.getDistroNameAndVersion();
}
}