/*******************************************************************************
* Copyright (c) 2010 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.preferences;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.preference.BooleanFieldEditor;
import org.eclipse.jface.preference.FieldEditorPreferencePage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyleRange;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.jboss.tools.usage.branding.IUsageBranding;
import org.jboss.tools.usage.event.UsageEventType;
import org.jboss.tools.usage.googleanalytics.IJBossToolsEclipseEnvironment;
import org.jboss.tools.usage.googleanalytics.eclipse.IEclipseUserAgent;
import org.jboss.tools.usage.internal.JBossToolsUsageActivator;
import org.jboss.tools.usage.internal.event.EventRegister;
import org.jboss.tools.usage.util.StatusUtils;
import org.jboss.tools.usage.util.StringUtils;
import org.osgi.service.prefs.BackingStoreException;
/**
* @author Andre Dietisheim
*/
public class UsageReportPreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {
private static final DateFormat DATE_FORMAT = SimpleDateFormat.getDateTimeInstance(DateFormat.MEDIUM,
DateFormat.SHORT);
private IUsageBranding branding;
public UsageReportPreferencePage() {
super(GRID);
this.branding = JBossToolsUsageActivator.getDefault().getUsageBranding();
}
@Override
protected Control createContents(Composite parent) {
Control control = super.createContents(parent);
createReportingData((Composite) control);
return control;
}
private void createReportingData(Composite parent) {
Group group = new Group(parent, SWT.NONE);
group.setText(PreferencesMessages.UsageReportPreferencePage_ReportedValues);
GridDataFactory.fillDefaults().grab(true, true).hint(SWT.FILL, SWT.FILL).applyTo(group);
FillLayout fillLayout = new FillLayout();
fillLayout.marginHeight = 4;
fillLayout.marginWidth = 8;
group.setLayout(fillLayout);
StyledText text = new StyledText(group, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
text.setEditable(false);
IJBossToolsEclipseEnvironment eclipseEnvironment = JBossToolsUsageActivator.getDefault()
.getJBossToolsEclipseEnvironment();
if (eclipseEnvironment == null) {
text.setText("usage reporting facility is disabled");
} else {
createText(eclipseEnvironment, text);
}
}
private void createText(IJBossToolsEclipseEnvironment eclipseEnvironment, StyledText text) {
List<StyleRange> styles = new ArrayList<StyleRange>();
StringBuilder builder = new StringBuilder();
appendLabeledValue(PreferencesMessages.UsageReportPreferencePage_JBossToolsVersion,
eclipseEnvironment.getJBossToolsVersion(), builder, styles);
appendLabeledValue(PreferencesMessages.UsageReportPreferencePage_JBossToolsComponents,
eclipseEnvironment.getKeyword(), builder, styles);
builder.append(StringUtils.getLineSeparator());
IEclipseUserAgent eclipseUserAgent = eclipseEnvironment.getEclipseUserAgent();
String appName[] = eclipseUserAgent.getApplicationName().split("\\|", 2);
appendLabeledValue(PreferencesMessages.UsageReportPreferencePage_ProductId,
appName[0], builder, styles);
appendLabeledValue(PreferencesMessages.UsageReportPreferencePage_ProductVersion,
eclipseUserAgent.getApplicationVersion(), builder, styles);
builder.append(StringUtils.getLineSeparator());
appendLabeledValue(PreferencesMessages.UsageReportPreferencePage_OperatingSystem, eclipseUserAgent.getOS(),
builder, styles);
appendLabeledValue(PreferencesMessages.UsageReportPreferencePage_OperatingSystemVersion,
eclipseUserAgent.getOSVersion(), builder, styles);
if (eclipseEnvironment.isLinuxDistro()) {
appendLabeledValue(PreferencesMessages.UsageReportPreferencePage_LinuxDistro,
eclipseEnvironment.getUserDefined(), builder, styles);
}
if (appName.length > 1) {
appendLabeledValue(PreferencesMessages.UsageReportPreferencePage_InstalledPkgs,
appName[1], builder, styles);
}
builder.append(StringUtils.getLineSeparator());
// JVM
appendLabeledValue(PreferencesMessages.UsageReportPreferencePage_JvmName, eclipseEnvironment.getJavaVmName(),
builder, styles);
appendLabeledValue(PreferencesMessages.UsageReportPreferencePage_JvmArchitecture, eclipseEnvironment.getJavaBitVersion(),
builder, styles);
appendLabeledValue(PreferencesMessages.UsageReportPreferencePage_JvmVersion, eclipseEnvironment.getFlashVersion(),
builder, styles);
builder.append(StringUtils.getLineSeparator());
//
appendLabeledValue(PreferencesMessages.UsageReportPreferencePage_Locale, eclipseUserAgent.getBrowserLanguage(),
builder, styles);
appendLabeledValue(PreferencesMessages.UsageReportPreferencePage_ScreenColors,
eclipseEnvironment.getScreenColorDepth(), builder, styles);
appendLabeledValue(PreferencesMessages.UsageReportPreferencePage_ScreenResolution,
eclipseEnvironment.getScreenResolution(), builder, styles);
builder.append(StringUtils.getLineSeparator());
appendLabeledValue(PreferencesMessages.UsageReportPreferencePage_ProductOwner,
eclipseEnvironment.getHostname(), builder, styles);
builder.append(StringUtils.getLineSeparator());
appendLabeledValue(PreferencesMessages.UsageReportPreferencePage_NumberOfUsageHits,
String.valueOf(eclipseEnvironment.getVisitCount()), builder,
styles);
appendLabeledValue(PreferencesMessages.UsageReportPreferencePage_FirstUsageHit,
getFormattedDate(eclipseEnvironment.getFirstVisit()), builder, styles);
appendLabeledValue(PreferencesMessages.UsageReportPreferencePage_LastUsageHit,
getFormattedDate(eclipseEnvironment.getLastVisit()), builder, styles);
appendLabeledValue(PreferencesMessages.UsageReportPreferencePage_CurrentUsageHit,
getFormattedDate(eclipseEnvironment.getCurrentVisit()), builder,
styles);
appendLabeledValue(PreferencesMessages.UsageReportPreferencePage_JBossCentralEnabled,
eclipseEnvironment.getCentralEnabledValue(), builder,
styles);
builder.append(StringUtils.getLineSeparator());
appendEvents(builder, styles);
text.setText(builder.toString());
for (StyleRange style : styles) {
text.setStyleRange(style);
}
}
private void appendEvents(StringBuilder builder, List<StyleRange> styles) {
UsageEventType[] events = EventRegister.getInstance().getRegisteredEventTypes();
if(events.length>0) {
appendLabeledValue(PreferencesMessages.UsageReportPreferencePage_Events, "", builder, styles);
builder.append(StringUtils.getLineSeparator());
for (UsageEventType event : events) {
appendLabeledValue(PreferencesMessages.UsageReportPreferencePage_EventComponent, event.getComponentName(), builder, styles);
appendLabeledValue(PreferencesMessages.UsageReportPreferencePage_EventVersion, event.getComponentVersion(), builder, styles);
appendLabeledValue(PreferencesMessages.UsageReportPreferencePage_EventCategory, event.getCategoryName(), builder, styles);
appendLabeledValue(PreferencesMessages.UsageReportPreferencePage_EventAction, event.getActionName(), builder, styles);
if(event.getLabelDescription()!=null) {
appendLabeledValue(PreferencesMessages.UsageReportPreferencePage_EventLabel, event.getLabelDescription(), builder, styles);
if(event.getValueDescription()!=null) {
appendLabeledValue(PreferencesMessages.UsageReportPreferencePage_EventValue, event.getValueDescription(), builder, styles);
}
}
builder.append(StringUtils.getLineSeparator());
}
}
}
/**
* Appends a labeled value to the given string builder and adds a bold font
* style range to the given styles.
*
* @param label
* the label to append
* @param value
* the value to append
* @param builder
* the builder to append the strings (label, value) to
* @param styles
* the styles list to add the style range to
*/
private void appendLabeledValue(String label, String value, StringBuilder builder, List<StyleRange> styles) {
StyleRange styleRange = startLabelStyleRange(builder);
builder.append(label);
finishLabelStyleRange(builder, styleRange);
builder.append(value)
.append(StringUtils.getLineSeparator());
styles.add(styleRange);
}
private StyleRange startLabelStyleRange(StringBuilder builder) {
StyleRange styleRange = new StyleRange();
styleRange.start = builder.length();
styleRange.fontStyle = SWT.BOLD;
return styleRange;
}
private StyleRange finishLabelStyleRange(StringBuilder builder, StyleRange styleRange) {
styleRange.length = builder.length() - styleRange.start;
return styleRange;
}
public void createFieldEditors() {
addField(new BooleanFieldEditor(
IUsageReportPreferenceConstants.USAGEREPORT_ENABLED_ID
, branding.getPreferencesAllowReportingCheckboxLabel()
, getFieldEditorParent()));
}
public void init(IWorkbench workbench) {
setPreferenceStore(UsageReportPreferences.createPreferenceStore());
setDescription(branding.getPreferencesDescription());
}
@Override
public boolean performOk() {
try {
UsageReportPreferences.flush();
} catch (BackingStoreException e) {
IStatus status = StatusUtils.getErrorStatus(JBossToolsUsageActivator.PLUGIN_ID,
PreferencesMessages.UsageReportPreferencePage_Error_Saving, e);
JBossToolsUsageActivator.getDefault().getLog().log(status);
}
return super.performOk();
}
private String getFormattedDate(String timeStamp) {
try {
Date date = new Date(Long.parseLong(timeStamp));
if (date != null) {
return DATE_FORMAT.format(date);
}
} catch (NumberFormatException e) {
}
return ""; //$NON-NLS-1$
}
}