/******************************************************************************* * Copyright (c) 2010-2012 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.internal.reporting; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.window.Window; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.PlatformUI; import org.jboss.tools.usage.googleanalytics.GoogleAnalyticsUrlStrategy; import org.jboss.tools.usage.googleanalytics.IJBossToolsEclipseEnvironment; import org.jboss.tools.usage.internal.JBossToolsUsageActivator; import org.jboss.tools.usage.internal.http.HttpGetRequest; import org.jboss.tools.usage.internal.preferences.GlobalUsageSettings; import org.jboss.tools.usage.internal.preferences.UsageReportPreferences; import org.jboss.tools.usage.tracker.IFocusPoint; import org.jboss.tools.usage.tracker.ITracker; import org.jboss.tools.usage.tracker.IURLBuildingStrategy; import org.jboss.tools.usage.tracker.internal.FocusPoint; import org.jboss.tools.usage.tracker.internal.SuffixFocusPoint; import org.jboss.tools.usage.tracker.internal.Tracker; import org.jboss.tools.usage.tracker.internal.UsagePluginLogger; import org.osgi.service.prefs.BackingStoreException; /** * @author Andre Dietisheim */ public class UsageReport { private IFocusPoint focusPoint; private GlobalUsageSettings globalSettings; private IJBossToolsEclipseEnvironment eclipseEnvironment; UsagePluginLogger logger = JBossToolsUsageActivator.getDefault().getLogger(); public UsageReport() { this(JBossToolsUsageActivator.getDefault().getJBossToolsEclipseEnvironment()); } /** * Instantiates a new usage report. * * @param eclipseEnvironment * the eclipse environment */ protected UsageReport(IJBossToolsEclipseEnvironment eclipseEnvironment) { this( new SuffixFocusPoint("tools", eclipseEnvironment.getJBossToolsVersion()) //$NON-NLS-1$ .setChild(new FocusPoint("usage") //$NON-NLS-1$ .setChild(new FocusPoint("action") //$NON-NLS-1$ .setChild(new FocusPoint("wsstartup")))), //$NON-NLS-1$ eclipseEnvironment, new GlobalUsageSettings(JBossToolsUsageActivator.getDefault())); } /** * Instantiates a new usage report. * * @param focusPoint * the focus point * @param eclipseEnvironment * the eclipse environment * @param globalSettings * the global settings */ protected UsageReport(IFocusPoint focusPoint, IJBossToolsEclipseEnvironment eclipseEnvironment, GlobalUsageSettings globalSettings) { this.eclipseEnvironment = eclipseEnvironment; this.focusPoint = focusPoint; this.globalSettings = globalSettings; } /** * Reports the usage of this eclipse/jboss tools instance. */ public void report() { if (!UsageReportPreferences.isEnablementSet() || UsageReportPreferences.isEnabled()) { new ReportingJob().schedule(); } } protected boolean isReportingGloballyEnabled() { return globalSettings.isReportingEnabled(); } /** * Asks the user is he allows us to report usage. Opens a dialog for this * sake. */ private void askUser() { Boolean isEnabled = askUserForEnablement(); if (isEnabled != null) { UsageReportPreferences.setEnabled(isEnabled); UsageReportPreferences.setAskUser(false); flushPreferences(); } } /** * Checks reporting shall ask the user (which is the case if this was never * done before. Asking user shall only be done once per eclipse * installation) * * @return true, if is ask user */ protected boolean isAskUser() { return UsageReportPreferences.isAskUser(); } /** * Asks the user if he allows us to report. * * @return the boolean */ protected Boolean askUserForEnablement() { final Boolean[] userResponse = new Boolean[1]; Display.getDefault().syncExec(new Runnable() { public void run() { Shell shell = PlatformUI.getWorkbench().getModalDialogShellProvider().getShell(); UsageReportEnablementDialog dialog = new UsageReportEnablementDialog( shell, JBossToolsUsageActivator.getDefault().getUsageBranding()); if (dialog.open() == Window.OK) { userResponse[0] = dialog.isReportEnabled(); } else { userResponse[0] = false; } } }); return userResponse[0]; } private void flushPreferences() { try { UsageReportPreferences.flush(); } catch (BackingStoreException e) { logger.error(ReportingMessages.UsageReport_Error_SavePreferences); } } /** * Reports the usage of the current JBoss Tools / JBoss Developer Studio * installation. */ protected void doReport() { if (UsageReportPreferences.isEnabled()) { IURLBuildingStrategy urlBuildingStrategy = new GoogleAnalyticsUrlStrategy(eclipseEnvironment); ITracker tracker = new Tracker( urlBuildingStrategy , new HttpGetRequest(eclipseEnvironment.getUserAgent(), logger) , logger); tracker.trackAsynchronously(focusPoint); } } private class ReportingJob extends Job { private ReportingJob() { super(ReportingMessages.UsageReport_Reporting_Usage); } @Override protected IStatus run(IProgressMonitor monitor) { if (monitor.isCanceled()) { return Status.CANCEL_STATUS; } monitor.beginTask(ReportingMessages.UsageReport_Querying_Enablement, 2); if (isReportingGloballyEnabled()) { if (monitor.isCanceled()) { return Status.CANCEL_STATUS; } monitor.worked(1); if (isAskUser()) { if (monitor.isCanceled()) { return Status.CANCEL_STATUS; } askUser(); } doReport(); monitor.worked(2); monitor.done(); } return Status.OK_STATUS; } } }