/*******************************************************************************
* Copyright (c) 2009 the CHISEL group and contributors.
* 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:
* Del Myers - initial API and implementation
*******************************************************************************/
package ca.uvic.chisel.javasketch.internal;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.IJobChangeListener;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.debug.core.DebugEvent;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.IDebugEventSetListener;
import ca.uvic.chisel.javasketch.IProgramSketch;
import ca.uvic.chisel.javasketch.ISketchEventListener;
import ca.uvic.chisel.javasketch.SketchAnalysisEvent;
import ca.uvic.chisel.javasketch.SketchDebugEvent;
import ca.uvic.chisel.javasketch.SketchEvent;
import ca.uvic.chisel.javasketch.SketchEvent.SketchEventType;
import ca.uvic.chisel.javasketch.SketchPlugin;
import ca.uvic.chisel.javasketch.launching.ITraceClient;
import ca.uvic.chisel.javasketch.persistence.internal.PersistTraceJob;
/**
* A manager for watching debug and job events in the workspace to fire the appropriate
* sketch events.
* @author Del Myers
*
*/
public class SketchEvents implements IDebugEventSetListener, IJobChangeListener {
private ListenerList listeners;
public SketchEvents() {
this.listeners = new ListenerList();
initialize();
}
/**
* Registers listeners with the debug and job frameworks so that events can be
* promulgated throughout the workbench.
*/
private void initialize() {
DebugPlugin.getDefault().addDebugEventListener(this);
Job.getJobManager().addJobChangeListener(this);
}
/* (non-Javadoc)
* @see org.eclipse.debug.core.IDebugEventSetListener#handleDebugEvents(org.eclipse.debug.core.DebugEvent[])
*/
@Override
public void handleDebugEvents(DebugEvent[] events) {
for (DebugEvent event : events) {
if (event.getSource() instanceof ITraceClient) {
ITraceClient source = (ITraceClient) event.getSource();
IProgramSketch associated = getAssociatedSketch(source);
if (associated != null) {
Job processJob = null;
SketchEventType sketchEvent = SketchEventType.SketchEnded;
if (event.getKind() == DebugEvent.CREATE) {
sketchEvent = SketchEventType.SketchStarted;
if (associated instanceof DBProgramSketch) {
processJob = new PersistTraceJob((DBProgramSketch)associated);
}
}
fireEvent(new SketchDebugEvent(associated, sketchEvent, source));
if (processJob != null) {
processJob.schedule();
}
}
}
}
}
public void fireEvent(SketchEvent event) {
for (Object l : listeners.getListeners()) {
ISketchEventListener listener = (ISketchEventListener) l;
listener.handleSketchEvent(event);
}
}
private IProgramSketch getAssociatedSketch(ITraceClient source) {
IProgramSketch[] sketches = SketchPlugin.getDefault().getStoredSketches();
for (IProgramSketch sketch : sketches) {
if (sketch.getID().equals(source.getID())) {
return sketch;
}
}
return null;
}
/* (non-Javadoc)
* @see org.eclipse.core.runtime.jobs.IJobChangeListener#aboutToRun(org.eclipse.core.runtime.jobs.IJobChangeEvent)
*/
@Override
public void aboutToRun(IJobChangeEvent event) {
//don't need to do anything.
}
/* (non-Javadoc)
* @see org.eclipse.core.runtime.jobs.IJobChangeListener#awake(org.eclipse.core.runtime.jobs.IJobChangeEvent)
*/
@Override
public void awake(IJobChangeEvent event) {
//don't need to do anything
}
/* (non-Javadoc)
* @see org.eclipse.core.runtime.jobs.IJobChangeListener#done(org.eclipse.core.runtime.jobs.IJobChangeEvent)
*/
@Override
public void done(IJobChangeEvent event) {
//fire completed event
if (event.getJob().belongsTo(IProgramSketch.class)) {
if (event.getJob() instanceof PersistTraceJob) {
PersistTraceJob job = (PersistTraceJob) event.getJob();
fireEvent(new SketchAnalysisEvent(job.getSketch(), SketchEventType.SketchAnalysisEnded));
}
}
}
/* (non-Javadoc)
* @see org.eclipse.core.runtime.jobs.IJobChangeListener#running(org.eclipse.core.runtime.jobs.IJobChangeEvent)
*/
@Override
public void running(IJobChangeEvent event) {
//fire running event
if (event.getJob().belongsTo(IProgramSketch.class)) {
if (event.getJob() instanceof PersistTraceJob) {
PersistTraceJob job = (PersistTraceJob) event.getJob();
fireEvent(new SketchAnalysisEvent(job.getSketch(), SketchEventType.SketchAnalysisStarted));
}
}
}
/* (non-Javadoc)
* @see org.eclipse.core.runtime.jobs.IJobChangeListener#scheduled(org.eclipse.core.runtime.jobs.IJobChangeEvent)
*/
@Override
public void scheduled(IJobChangeEvent event) {
//fire scheduling event
if (event.getJob().belongsTo(IProgramSketch.class)) {
if (event.getJob() instanceof PersistTraceJob) {
PersistTraceJob job = (PersistTraceJob) event.getJob();
fireEvent(new SketchAnalysisEvent(job.getSketch(), SketchEventType.SketchAnalysisScheduled));
}
}
}
/* (non-Javadoc)
* @see org.eclipse.core.runtime.jobs.IJobChangeListener#sleeping(org.eclipse.core.runtime.jobs.IJobChangeEvent)
*/
@Override
public void sleeping(IJobChangeEvent event) {
//don't need to do anything
}
/**
* @param listener
*/
public void addListener(ISketchEventListener listener) {
listeners.add(listener);
}
/**
* @param listener
*/
public void removeListener(ISketchEventListener listener) {
listeners.remove(listener);
}
}