blob: 3f02d2a4452ade0f4a50f45aad98e26b68cda633 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007 The Eclipse Foundation.
* All rights reserved. This program and the accompanying materials
* are 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:
* The Eclipse Foundation - initial API and implementation
*******************************************************************************/
package org.eclipse.epp.usagedata.internal.gathering.monitors;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.IExecutionListener;
import org.eclipse.core.commands.NotHandledException;
import org.eclipse.epp.usagedata.internal.gathering.services.UsageDataService;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.commands.ICommandService;
/**
* Instances of this class monitor invocations of commands in the workbench.
*
* @author Wayne Beaton
*/
public class CommandUsageMonitor implements UsageMonitor {
private static final String COMMANDS_EXTENSION_POINT = "org.eclipse.ui.commands"; //$NON-NLS-1$
private static final String COMMAND = "command"; //$NON-NLS-1$
private static final String EXECUTED = "executed"; //$NON-NLS-1$
private static final String FAILED = "failed"; //$NON-NLS-1$
private static final String NO_HANDLER = "no handler"; //$NON-NLS-1$
/**
* The {@link #executionListener} is installed into the {@link ICommandService}
* so that it can be notified when a command is invoked.
*/
private IExecutionListener executionListener;
private ExtensionIdToBundleMapper commandToBundleIdMapper;
public void startMonitoring(final UsageDataService usageDataService) {
executionListener = new IExecutionListener() {
public void notHandled(String commandId, NotHandledException exception) {
recordEvent(NO_HANDLER, usageDataService, commandId);
}
public void postExecuteFailure(String commandId, ExecutionException exception) {
recordEvent(FAILED, usageDataService, commandId);
}
public void postExecuteSuccess(String commandId, Object returnValue) {
recordEvent(EXECUTED, usageDataService, commandId);
}
public void preExecute(String commandId, ExecutionEvent event) {
}
};
getCommandService().addExecutionListener(executionListener);
commandToBundleIdMapper = new ExtensionIdToBundleMapper(COMMANDS_EXTENSION_POINT);
}
private ICommandService getCommandService() {
return (ICommandService) PlatformUI.getWorkbench().getAdapter(ICommandService.class);
}
public void stopMonitoring() {
ICommandService commandService = getCommandService();
if (commandService != null) commandService.removeExecutionListener(executionListener);
commandToBundleIdMapper.dispose();
}
private void recordEvent(String what,
final UsageDataService usageDataService, String commandId) {
usageDataService.recordEvent(what, COMMAND, commandId, getBundleId(commandId));
}
/**
* This method fetches the bundle id (symbolic name) of the bundle that defines
* the command, commandId.
*
* @param commandId
* @return
*/
protected synchronized String getBundleId(String commandId) {
return commandToBundleIdMapper.getBundleId(commandId);
}
}