/*
* Copyright 2010 The Rabbit Eclipse Plug-in Project
*
* Licensed 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 rabbit.tracking.internal.trackers;
import rabbit.data.handler.DataHandler;
import rabbit.data.store.IStorer;
import rabbit.data.store.model.CommandEvent;
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.ui.PlatformUI;
import org.eclipse.ui.commands.ICommandService;
import org.joda.time.DateTime;
/**
* Tracks command executions.
*/
public class CommandTracker extends AbstractTracker<CommandEvent> implements
IExecutionListener {
/*
* We only record commands that have been successfully executed, therefore we
* only use postExecuteSuccess(String, Object) to record the event.
*
* Note that preExecute(String, ExecutionEvent) will always be called when a
* command is called to be execute, even if the command is non-executable at
* that moment. For example, when there is nothing to undo in an editor, the
* "Undo" menu is disabled, but if the user uses Ctrl+Z, the undo command will
* still be called. Therefore we don't use preExecute(String, ExecutionEvent).
*/
/**
* The last recorded ExecutionEvent, to be updated every time
* {@link #preExecute(String, ExecutionEvent)} is called. We need this because
* {@link #postExecuteSuccess(String, Object)} does not have an
* {@link ExecutionEvent} parameter. This variable is null from the beginning.
*/
private ExecutionEvent lastEvent;
/** Constructor. */
public CommandTracker() {
super();
lastEvent = null;
}
@Override
public void notHandled(String commandId, NotHandledException exception) {
}
@Override
public void postExecuteFailure(String commandId, ExecutionException e) {
}
@Override
public void postExecuteSuccess(String commandId, Object returnValue) {
if (lastEvent != null && lastEvent.getCommand().getId().equals(commandId)) {
addData(new CommandEvent(new DateTime(), lastEvent));
}
}
@Override
public void preExecute(String commandId, ExecutionEvent event) {
lastEvent = event;
}
@Override
protected IStorer<CommandEvent> createDataStorer() {
return DataHandler.getStorer(CommandEvent.class);
}
@Override
protected void doDisable() {
getCommandService().removeExecutionListener(this);
}
@Override
protected void doEnable() {
getCommandService().addExecutionListener(this);
}
private ICommandService getCommandService() {
return (ICommandService) PlatformUI.getWorkbench().getService(
ICommandService.class);
}
}