package org.jactr.eclipse.runtime.probe3.extract; /* * default logging */ import javolution.util.FastSet; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.Path; import org.eclipse.debug.core.DebugEvent; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.IDebugEventSetListener; import org.jactr.core.utils.collections.FastSetFactory; import org.jactr.eclipse.runtime.RuntimePlugin; import org.jactr.eclipse.runtime.playback.SessionArchive; import org.jactr.eclipse.runtime.probe3.IProbeData; import org.jactr.eclipse.runtime.probe3.ModelProbeData2; import org.jactr.eclipse.runtime.probe3.ModelProbeDataStream; import org.jactr.eclipse.runtime.session.data.ISessionData; import org.jactr.eclipse.runtime.session.stream.ISessionDataStream; /** * @author harrison */ public class ProbeDataExtractor { /** * Logger definition */ static private final transient Log LOGGER = LogFactory .getLog(ProbeDataExtractor.class); private final SessionArchive _archive; private IFolder _outputDirectory; private SessionSpecificModelProbeRuntimeListener _probeListener; private final IDebugEventSetListener _debugListener = new IDebugEventSetListener() { @Override public void handleDebugEvents( DebugEvent[] events) { for (DebugEvent event : events) if (event .getSource() == _archive && event .getKind() == DebugEvent.SUSPEND) cleanUp(); } }; public ProbeDataExtractor(SessionArchive archive) { _archive = archive; _outputDirectory = createFolder(archive); _probeListener = new SessionSpecificModelProbeRuntimeListener(archive, _outputDirectory); // attach the listener RuntimePlugin.getDefault().getRuntimeTraceManager() .addListener(_probeListener); } public void extract() { /* * we use Eclipse's debug events to listen for the state of the session, in * particular the resume, suspend events. Since we are running fully, we can * just listen for the suspend, which will arrive after all the events are * pumped out. */ DebugPlugin.getDefault().addDebugEventListener(_debugListener); // playback & save to file try { _archive.getController().runFully(); } catch (Exception e) { // TODO Auto-generated catch block LOGGER.error("ProbeDataExtractor.extract threw Exception : ", e); } } protected void cleanUp() { DebugPlugin.getDefault().removeDebugEventListener(_debugListener); FastSet<String> dataKeys = FastSetFactory.newInstance(); _archive.getKeys(dataKeys); for (String key : dataKeys) { ISessionData sessionData = _archive.getData(key); for (String stream : sessionData.getAvailableStreams()) { ISessionDataStream sds = sessionData.getDataStream(stream); if (sds instanceof ModelProbeDataStream) flush(((ModelProbeDataStream) sds).getRoot()); } } FastSetFactory.recycle(dataKeys); _archive.close(); _archive.destroy(); } private void flush(ModelProbeData2 root) { FastSet<String> probeNames = FastSetFactory.newInstance(); root.getProbeNames(probeNames); for (String probeName : probeNames) { IProbeData pd = root.getProbeData(probeName); if (pd instanceof OutputProbeData) { OutputProbeData opd = (OutputProbeData) pd; opd.close(); } } FastSetFactory.recycle(probeNames); } protected IFolder createFolder(SessionArchive sa) { // index file IResource resource = sa.getIndex().getIndexFile(); // sessionNamed folder, containing index file IContainer container = resource.getParent(); // sessionData folder IContainer sessionDataFolder = container.getParent(); // runtime folder IContainer rtFolder = sessionDataFolder.getParent(); IFolder probesFolder = rtFolder.getFolder(new Path("probes/")); IFolder extractedFolder = probesFolder.getFolder(new Path(container .getName() + "/")); extractedFolder.getFullPath().toFile().mkdirs(); return extractedFolder; } }