package sk.stuba.fiit.perconik.activity.listeners.ui; import java.util.concurrent.atomic.AtomicBoolean; import com.google.common.collect.ImmutableMap.Builder; import org.eclipse.ui.IWorkbench; import sk.stuba.fiit.perconik.activity.events.LocalEvent; import sk.stuba.fiit.perconik.activity.listeners.ActivityListener; import sk.stuba.fiit.perconik.activity.serializers.ui.WorkbenchSerializer; import sk.stuba.fiit.perconik.core.annotations.Version; import sk.stuba.fiit.perconik.data.events.Event; import sk.stuba.fiit.perconik.eclipse.swt.widgets.DisplayTask; import sk.stuba.fiit.perconik.utilities.configuration.MapOptions; import sk.stuba.fiit.perconik.utilities.configuration.Options; import static com.google.common.collect.ImmutableMap.builder; import static sk.stuba.fiit.perconik.activity.listeners.ActivityListener.ProbingOptions.Schema.monitorCore; import static sk.stuba.fiit.perconik.activity.listeners.ActivityListener.ProbingOptions.Schema.monitorPlatform; import static sk.stuba.fiit.perconik.activity.listeners.ActivityListener.ProbingOptions.Schema.monitorProcess; import static sk.stuba.fiit.perconik.activity.listeners.ActivityListener.ProbingOptions.Schema.monitorSystem; import static sk.stuba.fiit.perconik.activity.listeners.ui.WorkbenchListener.Action.SHUTDOWN; import static sk.stuba.fiit.perconik.activity.listeners.ui.WorkbenchListener.Action.STARTUP; import static sk.stuba.fiit.perconik.activity.serializers.ConfigurableSerializer.StandardOption.TREE; import static sk.stuba.fiit.perconik.data.content.StructuredContents.key; /** * TODO * * @author Pavol Zbell * @since 1.0 */ @Version("0.0.9.alpha") public final class WorkbenchListener extends ActivityListener implements sk.stuba.fiit.perconik.core.listeners.WorkbenchListener { private static final Options defaults; static { Builder<String, Object> builder = builder(); builder.put(monitorCore.getKey(), true); builder.put(monitorPlatform.getKey(), true); builder.put(monitorProcess.getKey(), true); builder.put(monitorSystem.getKey(), true); defaults = MapOptions.from(builder.build()); } public WorkbenchListener() {} @Override protected Options adjustDefaultOptions() { return defaults; } enum Action implements ActivityListener.Action { STARTUP, SHUTDOWN; private final String name; private final String path; private final AtomicBoolean done; private Action() { this.name = actionName("eclipse", "workbench", this); this.path = actionPath(this.name); this.done = new AtomicBoolean(false); } public boolean canProcess() { return this.done.compareAndSet(false, true); } public String getName() { return this.name; } public String getPath() { return this.path; } public boolean isProcessed() { return this.done.get(); } } static Event build(final long time, final Action action, final IWorkbench workbench) { Event data = LocalEvent.of(time, action.getName()); data.put(key("workbench"), new WorkbenchSerializer(TREE).serialize(workbench)); return data; } void process(final long time, final Action action, final IWorkbench workbench) { this.send(action.getPath(), build(time, action, workbench)); } void execute(final long time, final Action action, final IWorkbench workbench) { // execute in display task as soon as possible, // otherwise some widgets may be disposed this.execute(DisplayTask.of(new Runnable() { public void run() { process(time, action, workbench); } })); } public void postStartup(final IWorkbench workbench) { final long time = this.currentTime(); if (STARTUP.canProcess()) { this.execute(time, STARTUP, workbench); } } public boolean preShutdown(final IWorkbench workbench, final boolean forced) { // ignore return true; } public void postShutdown(final IWorkbench workbench) { final long time = this.currentTime(); if (SHUTDOWN.canProcess()) { this.execute(time, SHUTDOWN, workbench); } } public static boolean isStartupProcessed() { return STARTUP.isProcessed(); } public static boolean isShutdownProcessed() { return SHUTDOWN.isProcessed(); } }