diff --git a/intrace.ecl.plugin/META-INF/MANIFEST.MF b/intrace.ecl.plugin/META-INF/MANIFEST.MF index 8c7c35d..9b2ccfa 100644 --- a/intrace.ecl.plugin/META-INF/MANIFEST.MF +++ b/intrace.ecl.plugin/META-INF/MANIFEST.MF @@ -10,7 +10,9 @@ Require-Bundle: org.eclipse.ui, org.eclipse.debug.ui, org.eclipse.jdt.debug.ui;bundle-version="3.5.2", org.eclipse.jdt.launching;bundle-version="3.5.200", - org.eclipse.ui.ide;bundle-version="3.6.2" + org.eclipse.ui.ide;bundle-version="3.6.2", + org.eclipse.jdt.junit;bundle-version="3.6.1", + org.eclipse.jdt.core;bundle-version="3.6.2" Bundle-ActivationPolicy: lazy Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Bundle-ClassPath: lib/miglayout-3.7.3.1-swt.jar, diff --git a/intrace.ecl.plugin/icons/java_launch.gif b/intrace.ecl.plugin/icons/java_launch.gif new file mode 100644 index 0000000..a42a7c8 Binary files /dev/null and b/intrace.ecl.plugin/icons/java_launch.gif differ diff --git a/intrace.ecl.plugin/icons/junit_launch.gif b/intrace.ecl.plugin/icons/junit_launch.gif new file mode 100644 index 0000000..ec4885d Binary files /dev/null and b/intrace.ecl.plugin/icons/junit_launch.gif differ diff --git a/intrace.ecl.plugin/icons/runcoverage.gif b/intrace.ecl.plugin/icons/runcoverage.gif deleted file mode 100644 index 502ef38..0000000 Binary files a/intrace.ecl.plugin/icons/runcoverage.gif and /dev/null differ diff --git a/intrace.ecl.plugin/icons/runintrace.gif b/intrace.ecl.plugin/icons/runintrace.gif new file mode 100644 index 0000000..a2c20b0 Binary files /dev/null and b/intrace.ecl.plugin/icons/runintrace.gif differ diff --git a/intrace.ecl.plugin/lib/intrace-agent.jar b/intrace.ecl.plugin/lib/intrace-agent.jar index 685fd3f..b6fabbc 100644 Binary files a/intrace.ecl.plugin/lib/intrace-agent.jar and b/intrace.ecl.plugin/lib/intrace-agent.jar differ diff --git a/intrace.ecl.plugin/lib/intrace-ui-helper.jar b/intrace.ecl.plugin/lib/intrace-ui-helper.jar index 1799242..3bb1c86 100644 Binary files a/intrace.ecl.plugin/lib/intrace-ui-helper.jar and b/intrace.ecl.plugin/lib/intrace-ui-helper.jar differ diff --git a/intrace.ecl.plugin/plugin.xml b/intrace.ecl.plugin/plugin.xml index fc87fac..dd374db 100644 --- a/intrace.ecl.plugin/plugin.xml +++ b/intrace.ecl.plugin/plugin.xml @@ -13,18 +13,25 @@ point="org.eclipse.debug.core.launchDelegates"> + + @@ -37,9 +44,9 @@ visible="false"> @@ -81,6 +88,27 @@ + + + + + + + + + + + + + + + + @@ -89,15 +117,20 @@ id="intrace.ecl.JavaAppTabGroup" type="org.eclipse.jdt.launching.localJavaApplication"> + + + name="InTrace"> diff --git a/intrace.ecl.plugin/src/intrace/ecl/plugin/ui/output/InTraceEditor.java b/intrace.ecl.plugin/src/intrace/ecl/plugin/ui/output/InTraceEditor.java index 7bb07c6..c1e7597 100644 --- a/intrace.ecl.plugin/src/intrace/ecl/plugin/ui/output/InTraceEditor.java +++ b/intrace.ecl.plugin/src/intrace/ecl/plugin/ui/output/InTraceEditor.java @@ -13,6 +13,8 @@ import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.part.EditorPart; import org.intrace.client.gui.helper.InTraceUI; +import org.intrace.client.gui.helper.Connection.ConnectState; +import org.intrace.client.gui.helper.InTraceUI.IConnectionStateCallback; public class InTraceEditor extends EditorPart { @@ -24,29 +26,38 @@ public class InTraceEditor extends EditorPart } @Override - public void createPartControl(Composite parent) + public void createPartControl(final Composite parent) { IWorkbench workbench = PlatformUI.getWorkbench(); - Display display = workbench.getDisplay(); + final Display display = workbench.getDisplay(); Shell window = display.getActiveShell(); - inTraceUI = new InTraceUI(window, parent); - } - - @Override - public void init(IEditorSite site, - IEditorInput input) - throws PartInitException - { - setSite(site); - setInput(input); - final EditorInput intraceInput = (EditorInput)input; + inTraceUI = new InTraceUI(window, parent, false); + inTraceUI.setConnCallback(new IConnectionStateCallback() + { + @Override + public void setConnectionState(final ConnectState state) + { + if (!parent.isDisposed()) + { + display.syncExec(new Runnable() + { + @Override + public void run() + { + setPartName("InTrace: " + state.str); + } + }); + } + } + }); + final EditorInput intraceInput = (EditorInput)getEditorInput(); new Thread(new Runnable() { @Override public void run() { try - { + { Socket connection = intraceInput.callback.getClientConnection(); inTraceUI.setFixedLocalConnection(connection); } @@ -55,7 +66,16 @@ public class InTraceEditor extends EditorPart e.printStackTrace(); } } - }).start(); + }).start(); + } + + @Override + public void init(IEditorSite site, + IEditorInput input) + throws PartInitException + { + setSite(site); + setInput(input); } @Override diff --git a/intrace.ecl.plugin/src/intrace/ecl/ui/launching/ConfigurationDelegate.java b/intrace.ecl.plugin/src/intrace/ecl/ui/launching/ConfigurationDelegate.java index 09c6619..9013fc4 100644 --- a/intrace.ecl.plugin/src/intrace/ecl/ui/launching/ConfigurationDelegate.java +++ b/intrace.ecl.plugin/src/intrace/ecl/ui/launching/ConfigurationDelegate.java @@ -78,6 +78,7 @@ public class ConfigurationDelegate extends AbstractJavaLaunchConfigurationDelega vmArgs += Activator.getDefault().agentArg; vmArgs += "=[callbackport-"; vmArgs += Integer.toString(callbackServer.getLocalPort()); + vmArgs += "[startwait"; } wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_VM_ARGUMENTS, vmArgs); diff --git a/intrace.ecl.plugin/src/intrace/ecl/ui/launching/JavaAppShortcut.java b/intrace.ecl.plugin/src/intrace/ecl/ui/launching/JavaAppShortcut.java new file mode 100644 index 0000000..7104aaa --- /dev/null +++ b/intrace.ecl.plugin/src/intrace/ecl/ui/launching/JavaAppShortcut.java @@ -0,0 +1,9 @@ +package intrace.ecl.ui.launching; + +public class JavaAppShortcut extends Shortcut +{ + public JavaAppShortcut() + { + super("org.eclipse.jdt.debug.ui.localJavaShortcut"); + } +} diff --git a/intrace.ecl.plugin/src/intrace/ecl/ui/launching/JunitTestShortcut.java b/intrace.ecl.plugin/src/intrace/ecl/ui/launching/JunitTestShortcut.java new file mode 100644 index 0000000..1c56d81 --- /dev/null +++ b/intrace.ecl.plugin/src/intrace/ecl/ui/launching/JunitTestShortcut.java @@ -0,0 +1,9 @@ +package intrace.ecl.ui.launching; + +public class JunitTestShortcut extends Shortcut +{ + public JunitTestShortcut() + { + super("org.eclipse.jdt.junit.junitShortcut"); + } +} diff --git a/intrace.ecl.plugin/src/intrace/ecl/ui/launching/Shortcut.java b/intrace.ecl.plugin/src/intrace/ecl/ui/launching/Shortcut.java index f2a762e..d6c310c 100644 --- a/intrace.ecl.plugin/src/intrace/ecl/ui/launching/Shortcut.java +++ b/intrace.ecl.plugin/src/intrace/ecl/ui/launching/Shortcut.java @@ -12,9 +12,15 @@ import org.eclipse.debug.ui.ILaunchShortcut; import org.eclipse.jface.viewers.ISelection; import org.eclipse.ui.IEditorPart; -public class Shortcut implements ILaunchShortcut +public abstract class Shortcut implements ILaunchShortcut { - private final String delegateId = "org.eclipse.jdt.debug.ui.localJavaShortcut"; + private final String delegateId; + + public Shortcut(String xiDelegateId) + { + delegateId = xiDelegateId; + } + private ILaunchShortcut delegate; private ILaunchShortcut getDelegate() diff --git a/org.intrace/src/org/intrace/agent/Agent.java b/org.intrace/src/org/intrace/agent/Agent.java index 97122cb..bdf29f6 100644 --- a/org.intrace/src/org/intrace/agent/Agent.java +++ b/org.intrace/src/org/intrace/agent/Agent.java @@ -84,6 +84,7 @@ public class Agent waitForServerPort(); args.setActualServerPort(serverPort); + // Return updated settings try { Map settingsMap = new HashMap(); @@ -95,6 +96,20 @@ public class Agent { e.printStackTrace(); } + + // Wait for startup + if (args.isWaitStart()) + { + try + { + System.out.println("## Waiting to continue"); + AgentServer.waitForStartSignal(); + } + catch (InterruptedException e) + { + e.printStackTrace(); + } + } } private static int serverPort = -1; diff --git a/org.intrace/src/org/intrace/agent/AgentSettings.java b/org.intrace/src/org/intrace/agent/AgentSettings.java index 0299de8..e18c46f 100644 --- a/org.intrace/src/org/intrace/agent/AgentSettings.java +++ b/org.intrace/src/org/intrace/agent/AgentSettings.java @@ -13,14 +13,21 @@ import org.intrace.shared.AgentConfigConstants; */ public class AgentSettings { - private Pattern classRegex = Pattern.compile(".*"); + private Pattern classRegex = Pattern.compile("^$"); private Pattern excludeClassRegex = Pattern.compile("^$"); - private boolean instruEnabled = false; + private boolean instruEnabled = true; private boolean saveTracedClassfiles = false; private boolean verboseMode = false; private int serverPort = 9123; private int callbackPort = -1; private int actualServerPort = -1; + + private boolean waitStart = false; + + public boolean isWaitStart() + { + return waitStart; + } public int getActualServerPort() { @@ -54,6 +61,7 @@ public class AgentSettings instruEnabled = oldInstance.isInstrumentationEnabled(); saveTracedClassfiles = oldInstance.saveTracedClassfiles(); verboseMode = oldInstance.isVerboseMode(); + waitStart = oldInstance.isWaitStart(); } public void parseArgs(String args) @@ -77,9 +85,9 @@ public class AgentSettings { verboseMode = false; } - else if (arg.toLowerCase().startsWith(AgentConfigConstants.SERVER_PORT)) + else if (arg.toLowerCase().startsWith(AgentConfigConstants.OPT_SERVER_PORT)) { - String serverPortStr = arg.replace(AgentConfigConstants.SERVER_PORT, ""); + String serverPortStr = arg.replace(AgentConfigConstants.OPT_SERVER_PORT, ""); serverPort = Integer.parseInt(serverPortStr); } else if (arg.toLowerCase().startsWith(AgentConfigConstants.CALLBACK_PORT)) @@ -109,6 +117,15 @@ public class AgentSettings { saveTracedClassfiles = false; } + else if (arg.toLowerCase() + .equals(AgentConfigConstants.START_WAIT)) + { + waitStart = true; + } + else if (arg.toLowerCase().equals(AgentConfigConstants.START_ACTIVATE)) + { + waitStart = false; + } else if (arg.startsWith(AgentConfigConstants.CLASS_REGEX)) { String classRegexStr = arg.replace(AgentConfigConstants.CLASS_REGEX, ""); @@ -172,7 +189,8 @@ public class AgentSettings Boolean.toString(verboseMode)); settingsMap.put(AgentConfigConstants.SAVE_TRACED_CLASSFILES, Boolean.toString(saveTracedClassfiles)); - settingsMap.put(AgentConfigConstants.ACTUAL_SERVER_PORT, Integer.toString(actualServerPort)); + settingsMap.put(AgentConfigConstants.SERVER_PORT, Integer.toString(actualServerPort)); + settingsMap.put(AgentConfigConstants.START_WAIT, Boolean.toString(waitStart)); return settingsMap; } } diff --git a/org.intrace/src/org/intrace/agent/ClassTransformer.java b/org.intrace/src/org/intrace/agent/ClassTransformer.java index 472d8b4..135e5bb 100644 --- a/org.intrace/src/org/intrace/agent/ClassTransformer.java +++ b/org.intrace/src/org/intrace/agent/ClassTransformer.java @@ -134,12 +134,15 @@ public class ClassTransformer implements ClassFileTransformer ComparableClassName compklass = new ComparableClassName(className, klassloader); + // Record all class names which get this far + allClasses.add(compklass); + // Don't modify anything if tracing is disabled if (!settings.isInstrumentationEnabled()) { return false; } - + // Don't sensitive classes if (isSensitiveClass(className)) { @@ -159,10 +162,7 @@ public class ClassTransformer implements ClassFileTransformer } return false; } - - // Record all class names which get this far - allClasses.add(compklass); - + // Don't modify classes which match the exclude regex if ((settings.getExcludeClassRegex() == null) || settings.getExcludeClassRegex().matcher(className).matches()) @@ -350,9 +350,9 @@ public class ClassTransformer implements ClassFileTransformer public Map getSettings() { Map settingsMap = settings.getSettingsMap(); - settingsMap.put(AgentConfigConstants.NUM_TOTAL_CLASSES, + settingsMap.put(AgentConfigConstants.STCLS, Integer.toString(allClasses.size())); - settingsMap.put(AgentConfigConstants.NUM_INSTR_CLASSES, + settingsMap.put(AgentConfigConstants.STINST, Integer.toString(modifiedClasses.size())); return settingsMap; } @@ -559,11 +559,11 @@ public class ClassTransformer implements ClassFileTransformer private void broadcastStatus(int count, int total) { Map progressMap = new HashMap(); - progressMap.put(AgentConfigConstants.NUM_STATUS_ID, - AgentConfigConstants.NUM_STATUS_ID); - progressMap.put(AgentConfigConstants.NUM_INSTR_CLASSES, + progressMap.put(AgentConfigConstants.STID, + AgentConfigConstants.STID); + progressMap.put(AgentConfigConstants.STINST, Integer.toString(count)); - progressMap.put(AgentConfigConstants.NUM_TOTAL_CLASSES, + progressMap.put(AgentConfigConstants.STCLS, Integer.toString(total)); try { diff --git a/org.intrace/src/org/intrace/agent/server/AgentClientConnection.java b/org.intrace/src/org/intrace/agent/server/AgentClientConnection.java index 172e14a..137a475 100644 --- a/org.intrace/src/org/intrace/agent/server/AgentClientConnection.java +++ b/org.intrace/src/org/intrace/agent/server/AgentClientConnection.java @@ -88,7 +88,6 @@ public class AgentClientConnection implements Runnable { while (true) { - String message = receiveMessage(); if (message.equals("getsettings")) { @@ -104,6 +103,11 @@ public class AgentClientConnection implements Runnable commandSet.addAll(TraceConfigConstants.COMMANDS); sendMessage(commandSet); } + else if (message.equalsIgnoreCase(AgentConfigConstants.START_ACTIVATE)) + { + transformer.getResponse(this, message); + AgentServer.setStartSignalled(); + } else { List responses = transformer.getResponse(this, message); @@ -151,7 +155,7 @@ public class AgentClientConnection implements Runnable try { String lRet = (String) objIn.readObject(); - System.out.println("Received Message: " + lRet); + System.out.println("## Received Message: " + lRet); return lRet; } catch (ClassNotFoundException e) @@ -168,10 +172,13 @@ public class AgentClientConnection implements Runnable */ public void sendMessage(Object xiObject) throws IOException { - OutputStream out = connectedClient.getOutputStream(); - ObjectOutputStream objOut = new ObjectOutputStream(out); - objOut.writeObject(xiObject); - objOut.flush(); + synchronized (connectedClient) + { + OutputStream out = connectedClient.getOutputStream(); + ObjectOutputStream objOut = new ObjectOutputStream(out); + objOut.writeObject(xiObject); + objOut.flush(); + } } /** diff --git a/org.intrace/src/org/intrace/agent/server/AgentServer.java b/org.intrace/src/org/intrace/agent/server/AgentServer.java index 047a2dc..f00518a 100644 --- a/org.intrace/src/org/intrace/agent/server/AgentServer.java +++ b/org.intrace/src/org/intrace/agent/server/AgentServer.java @@ -23,7 +23,24 @@ public class AgentServer implements Runnable // Target server port private final int serverPort; + + // Start signalled + private static boolean startSignaled = false; + public static synchronized void setStartSignalled() + { + startSignaled = true; + AgentServer.class.notifyAll(); + } + + public static synchronized void waitForStartSignal() throws InterruptedException + { + if (!startSignaled) + { + AgentServer.class.wait(); + } + } + /** * cTor * diff --git a/org.intrace/src/org/intrace/client/gui/InTraceStandaloneUI.java b/org.intrace/src/org/intrace/client/gui/InTraceStandaloneUI.java index 075ef88..24cdb1d 100644 --- a/org.intrace/src/org/intrace/client/gui/InTraceStandaloneUI.java +++ b/org.intrace/src/org/intrace/client/gui/InTraceStandaloneUI.java @@ -3,6 +3,8 @@ package org.intrace.client.gui; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Shell; import org.intrace.client.gui.helper.InTraceUI; +import org.intrace.client.gui.helper.Connection.ConnectState; +import org.intrace.client.gui.helper.InTraceUI.IConnectionStateCallback; public class InTraceStandaloneUI { @@ -12,13 +14,35 @@ public class InTraceStandaloneUI public static void main(String[] args) { // Prepare window - Shell window = new Shell(); - window.setText("InTrace UI"); + final Shell window = new Shell(); window.setSize(new Point(800, 800)); window.setMinimumSize(new Point(800, 480)); // Fill in UI - new InTraceUI(window, window).open(); + InTraceUI ui = new InTraceUI(window, window, true); + + // Register title callback + ui.setConnCallback(new IConnectionStateCallback() + { + @Override + public void setConnectionState(final ConnectState state) + { + if (!window.isDisposed()) + { + window.getDisplay().syncExec(new Runnable() + { + @Override + public void run() + { + window.setText("InTrace UI: " + state.str); + } + }); + } + } + }); + + // Open UI + ui.open(); } } diff --git a/org.intrace/src/org/intrace/client/gui/helper/ClientStrings.java b/org.intrace/src/org/intrace/client/gui/helper/ClientStrings.java index ca59d30..2e76635 100644 --- a/org.intrace/src/org/intrace/client/gui/helper/ClientStrings.java +++ b/org.intrace/src/org/intrace/client/gui/helper/ClientStrings.java @@ -2,10 +2,6 @@ package org.intrace.client.gui.helper; public class ClientStrings { - public static final String ENABLE_INSTR = "Add Instrumentation"; - public static final String ENABLING_INSTR = "Adding Instrumenting..."; - public static final String DISABLING_INSTR = "Removing Instrumentation..."; - public static final String DISABLE_INSTR = "Remove Instrumentation"; public static final String SET_CLASSREGEX = "Select Classes ..."; public static final String ENABLE_ALLOWJARS = "Instru JARs"; public static final String ENABLE_SAVECLASSES = "Save Instrumented Classes"; diff --git a/org.intrace/src/org/intrace/client/gui/helper/Connection.java b/org.intrace/src/org/intrace/client/gui/helper/Connection.java index 4fed017..89360e6 100644 --- a/org.intrace/src/org/intrace/client/gui/helper/Connection.java +++ b/org.intrace/src/org/intrace/client/gui/helper/Connection.java @@ -12,7 +12,15 @@ public class Connection // State public enum ConnectState { - DISCONNECTED_ERR, DISCONNECTED, CONNECTING, CONNECTED + DISCONNECTED_ERR("Disconnected"), + DISCONNECTED("Disconnected"), + CONNECTING("Connecting"), + CONNECTED("Connected"); + public final String str; + private ConnectState(String xiStr) + { + str = xiStr; + } } public static interface ISocketCallback diff --git a/org.intrace/src/org/intrace/client/gui/helper/ControlConnectionThread.java b/org.intrace/src/org/intrace/client/gui/helper/ControlConnectionThread.java index 3f8dedb..d013692 100644 --- a/org.intrace/src/org/intrace/client/gui/helper/ControlConnectionThread.java +++ b/org.intrace/src/org/intrace/client/gui/helper/ControlConnectionThread.java @@ -76,7 +76,7 @@ public class ControlConnectionThread implements Runnable { listener.setProgress(map); } - else if (map.containsKey(AgentConfigConstants.NUM_STATUS_ID)) + else if (map.containsKey(AgentConfigConstants.STID)) { listener.setStatus(map); } @@ -97,7 +97,11 @@ public class ControlConnectionThread implements Runnable } catch (Exception ex) { - ex.printStackTrace(); + if (!ex.getMessage().contains("socket closed") && + !ex.getMessage().contains("onnection reset")) + { + ex.printStackTrace(); + } listener.disconnect(); } } diff --git a/org.intrace/src/org/intrace/client/gui/helper/InTraceUI.java b/org.intrace/src/org/intrace/client/gui/helper/InTraceUI.java index 2f720f0..d2ba412 100644 --- a/org.intrace/src/org/intrace/client/gui/helper/InTraceUI.java +++ b/org.intrace/src/org/intrace/client/gui/helper/InTraceUI.java @@ -14,6 +14,8 @@ import java.util.regex.Pattern; import net.miginfocom.swt.MigLayout; import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.CTabFolder; +import org.eclipse.swt.custom.CTabItem; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.events.MenuDetectEvent; import org.eclipse.swt.events.MenuDetectListener; @@ -22,6 +24,7 @@ import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.program.Program; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; @@ -29,6 +32,7 @@ import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Link; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; @@ -49,6 +53,11 @@ import org.intrace.shared.AgentConfigConstants; public class InTraceUI implements ISocketCallback, IControlConnectionListener { + public static interface IConnectionStateCallback + { + public void setConnectionState(ConnectState state); + } + public static String NEWLINE = System.getProperty("line.separator"); public void open() @@ -65,27 +74,69 @@ public class InTraceUI implements ISocketCallback, IControlConnectionListener display.dispose(); } - private Shell sWindow = null; - final TabFolder outputTabs; - private TabFolder buttonTabs; + private final Shell sWindow; private final Composite sRoot; + + private final TabFolder outputTabs; + private final TabFolder buttonTabs; + private final CTabFolder buttonCTabs; + private final CTabFolder outputCTabs; + private final boolean standalone; + + private IConnectionStateCallback connCallback = null; + private MigLayout rootLayout; - public InTraceUI(Shell xiWindow, Composite xiRoot) + public void setConnCallback(IConnectionStateCallback connCallback) + { + this.connCallback = connCallback; + if (connCallback != null) + { + connCallback.setConnectionState(connectionState); + } + } + + public InTraceUI(Shell xiWindow, Composite xiRoot, boolean xiStandalone) { sWindow = xiWindow; sRoot = xiRoot; + standalone = xiStandalone; - MigLayout rootLayout = new MigLayout("fill", "", "[][grow]"); + rootLayout = new MigLayout("fill", "[]", "[][][grow]"); xiRoot.setLayout(rootLayout); - buttonTabs = new TabFolder(xiRoot, SWT.NONE); - buttonTabs.setLayoutData("grow,wrap,wmin 0"); - - outputTabs = new TabFolder(xiRoot, SWT.NONE); - outputTabs.setLayoutData("grow,wmin 0,hmin 0"); - - fillButtonTabs(buttonTabs); - fillOutputTabs(outputTabs); + if (xiStandalone) + { + buttonCTabs = null; + buttonTabs = new TabFolder(xiRoot, SWT.NONE); + buttonTabs.setLayoutData("grow,wrap,wmin 0"); + fillButtonTabs(buttonTabs); + } + else + { + buttonTabs = null; + buttonCTabs = new CTabFolder(xiRoot, SWT.TOP | SWT.BORDER); + buttonCTabs.setSimple(false); + buttonCTabs.setLayoutData("grow,wrap,wmin 0"); + fillButtonCTabs(buttonCTabs); + buttonCTabs.setSelection(0); + } + + if (xiStandalone) + { + outputCTabs = null; + outputTabs = new TabFolder(xiRoot, SWT.NONE); + outputTabs.setLayoutData("grow,wmin 0,hmin 0,cell 0 2"); + fillOutputTabs(outputTabs); + } + else + { + outputTabs = null; + outputCTabs = new CTabFolder(xiRoot, SWT.TOP | SWT.BORDER); + outputCTabs.setSimple(false); + outputCTabs.setLayoutData("grow,wmin 0,hmin 0,cell 0 2"); + fillOutputCTabs(outputCTabs); + outputCTabs.setSelection(0); + } updateUIStateSameThread(); @@ -115,9 +166,20 @@ public class InTraceUI implements ISocketCallback, IControlConnectionListener @Override public void run() { + if (standalone) + { + buttonTabs.getItem(0).dispose(); + } + else + { + buttonCTabs.getItem(0).dispose(); + } connTab.addressInput.setText("localhost"); connTab.portInput.setText("detecting..."); - buttonTabs.setSelection(instruTab.tabItem); + textOutputTab.filterThread.addSystemTraceLine("Instructions"); + textOutputTab.filterThread.addSystemTraceLine(" - Select Classes you want to Trace"); + textOutputTab.filterThread.addSystemTraceLine("Full help available on the Help tab"); + textOutputTab.filterThread.addSystemTraceLine(""); } }); } @@ -128,24 +190,99 @@ public class InTraceUI implements ISocketCallback, IControlConnectionListener private InstruTab instruTab; private TraceTab traceTab; private ExtrasTab extraTab; + private Composite startPanel; private void fillButtonTabs(TabFolder tabFolder) { TabItem connTabItem = new TabItem(tabFolder, SWT.NONE); connTabItem.setText("Connection"); - connTab = new ConnectionTab(tabFolder, connTabItem); + connTab = new ConnectionTab(tabFolder); + connTabItem.setControl(connTab.composite); TabItem instrTabItem = new TabItem(tabFolder, SWT.NONE); instrTabItem.setText("Instrumentation"); - instruTab = new InstruTab(tabFolder, instrTabItem); + instruTab = new InstruTab(tabFolder); + instrTabItem.setControl(instruTab.composite); TabItem traceTabItem = new TabItem(tabFolder, SWT.NONE); traceTabItem.setText("Trace"); - traceTab = new TraceTab(tabFolder, traceTabItem); + traceTab = new TraceTab(tabFolder); + traceTabItem.setControl(traceTab.composite); TabItem extraTabItem = new TabItem(tabFolder, SWT.NONE); extraTabItem.setText("Advanced"); - extraTab = new ExtrasTab(tabFolder, extraTabItem); + extraTab = new ExtrasTab(tabFolder); + extraTabItem.setControl(extraTab.composite); + } + + private void fillButtonCTabs(CTabFolder tabFolder) + { + CTabItem connTabItem = new CTabItem(tabFolder, SWT.NONE); + connTabItem.setText("Connection"); + connTab = new ConnectionTab(tabFolder); + connTabItem.setControl(connTab.composite); + + CTabItem instrTabItem = new CTabItem(tabFolder, SWT.NONE); + instrTabItem.setText("Instrumentation"); + instruTab = new InstruTab(tabFolder); + instrTabItem.setControl(instruTab.composite); + + CTabItem traceTabItem = new CTabItem(tabFolder, SWT.NONE); + traceTabItem.setText("Trace"); + traceTab = new TraceTab(tabFolder); + traceTabItem.setControl(traceTab.composite); + + CTabItem extraTabItem = new CTabItem(tabFolder, SWT.NONE); + extraTabItem.setText("Advanced"); + extraTab = new ExtrasTab(tabFolder); + extraTabItem.setControl(extraTab.composite); + } + + private boolean waitStartUIShown = false; + + private void addWaitStartUI() + { + if (!waitStartUIShown) + { + startPanel = new Composite(sRoot, SWT.NONE); + startPanel.setLayoutData("grow,wrap,cell 0 1"); + MigLayout startLayout = new MigLayout("fillx", "[align center]", "[]"); + startPanel.setLayout(startLayout); + + Label startLabel = new Label(startPanel, SWT.NONE); + startLabel.setText("Program has been paused."); + startLabel.setLayoutData("split"); + + final Button startButton = new Button(startPanel, SWT.PUSH); + startButton.setText("Start Program"); + + startButton.addSelectionListener(new SelectionAdapter() + { + @Override + public void widgetSelected(SelectionEvent arg0) + { + controlThread.sendMessage(AgentConfigConstants.START_ACTIVATE); + controlThread.sendMessage("getsettings"); + startButton.setEnabled(false); + } + }); + + sRoot.layout(); + + waitStartUIShown = true; + } + } + + private void removeWaitStartUI() + { + if (waitStartUIShown) + { + startPanel.dispose(); + + sRoot.layout(); + + waitStartUIShown = false; + } } private class ConnectionTab @@ -153,15 +290,15 @@ public class InTraceUI implements ISocketCallback, IControlConnectionListener final Button connectButton; final Text addressInput; final Text portInput; - private Label statusLabel; + final Label statusLabel; + final Composite composite; - private ConnectionTab(TabFolder tabFolder, TabItem connTab) + private ConnectionTab(Composite parent) { MigLayout windowLayout = new MigLayout("fill", "[380][grow]"); - Composite composite = new Composite(tabFolder, SWT.NONE); + composite = new Composite(parent, SWT.NONE); composite.setLayout(windowLayout); - connTab.setControl(composite); Group connectionGroup = new Group(composite, SWT.SHADOW_ETCHED_IN); MigLayout connGroupLayout = new MigLayout("fill", "[40][200][grow]"); @@ -217,7 +354,7 @@ public class InTraceUI implements ISocketCallback, IControlConnectionListener if ((connectionState == ConnectState.DISCONNECTED) || (connectionState == ConnectState.DISCONNECTED_ERR)) { - connectionState = ConnectState.CONNECTING; + setConnectionState(ConnectState.CONNECTING); updateUIStateSameThread(); Connection.connectToAgent(thisWindow, sWindow, addressInput .getText(), portInput.getText()); @@ -236,24 +373,21 @@ public class InTraceUI implements ISocketCallback, IControlConnectionListener private class InstruTab { - final Button togInstru; final Button classRegex; final Button listClasses; final Label instrStatusLabel; - private final TabItem tabItem; + final Composite composite; - private InstruTab(TabFolder tabFolder, TabItem instrTab) + private InstruTab(Composite parent) { - this.tabItem = instrTab; MigLayout windowLayout = new MigLayout("fill", "[][300][grow]", "[]"); - Composite composite = new Composite(tabFolder, SWT.NONE); + composite = new Composite(parent, SWT.NONE); composite.setLayout(windowLayout); - instrTab.setControl(composite); composite.setLayoutData("hmin 0"); Group mainControlGroup = new Group(composite, SWT.SHADOW_ETCHED_IN); - MigLayout mainControlGroupLayout = new MigLayout("filly", "[150][150]"); + MigLayout mainControlGroupLayout = new MigLayout("filly", "[150]"); mainControlGroup.setLayout(mainControlGroupLayout); mainControlGroup.setLayoutData("hmin 0, grow"); mainControlGroup.setText("Instrumentation Settings"); @@ -262,11 +396,6 @@ public class InTraceUI implements ISocketCallback, IControlConnectionListener classRegex.setText(ClientStrings.SET_CLASSREGEX); classRegex.setLayoutData("grow"); - togInstru = new Button(mainControlGroup, SWT.PUSH); - togInstru.setText(ClientStrings.ENABLE_INSTR); - togInstru.setAlignment(SWT.CENTER); - togInstru.setLayoutData("grow"); - Group statusGroup = new Group(composite, SWT.SHADOW_IN); MigLayout statusGroupLayout = new MigLayout("fillx", "[][]"); statusGroup.setLayout(statusGroupLayout); @@ -283,27 +412,6 @@ public class InTraceUI implements ISocketCallback, IControlConnectionListener listClasses.setAlignment(SWT.CENTER); listClasses.setLayoutData("gapy 5px"); - togInstru - .addSelectionListener(new org.eclipse.swt.events.SelectionAdapter() - { - @Override - public void widgetSelected(SelectionEvent arg0) - { - if (!settingsData.instrEnabled) - { - togInstru.setText(ClientStrings.ENABLING_INSTR); - } - else - { - togInstru.setText(ClientStrings.DISABLE_INSTR); - } - togInstru.setEnabled(false); - toggleSetting(settingsData.instrEnabled, "[instru-true", - "[instru-false"); - settingsData.instrEnabled = !settingsData.instrEnabled; - } - }); - final String helpText = "Enter pattern in the form " + "\"mypack.mysubpack.MyClass\" or using wildcards " + "\"mypack.*.MyClass\" or \"*MyClass\" etc"; @@ -366,17 +474,6 @@ public class InTraceUI implements ISocketCallback, IControlConnectionListener { instrStatusLabel.setText("Progress: " + progressClasses + "/" + totalClasses); - if (done) - { - if (settingsData.instrEnabled) - { - togInstru.setText(ClientStrings.DISABLE_INSTR); - } else - { - togInstru.setText(ClientStrings.ENABLE_INSTR); - } - togInstru.setEnabled(true); - } } } @@ -388,14 +485,14 @@ public class InTraceUI implements ISocketCallback, IControlConnectionListener final Button stdOutOutput; final Button fileOutput; + final Composite composite; - private TraceTab(TabFolder tabFolder, TabItem traceTab) + private TraceTab(Composite parent) { MigLayout windowLayout = new MigLayout("fill", "[][][grow]"); - Composite composite = new Composite(tabFolder, SWT.NONE); + composite = new Composite(parent, SWT.NONE); composite.setLayout(windowLayout); - traceTab.setControl(composite); Group traceTypesGroup = new Group(composite, SWT.SHADOW_ETCHED_IN); MigLayout traceTypesGroupLayout = new MigLayout("fill", "[150]"); @@ -492,17 +589,17 @@ public class InTraceUI implements ISocketCallback, IControlConnectionListener private class ExtrasTab { - private Button togSaveClasses; - private Button togVerbose; - private Button printSettings; + final Button togSaveClasses; + final Button togVerbose; + final Button printSettings; + final Composite composite; - private ExtrasTab(TabFolder tabFolder, TabItem traceTab) + private ExtrasTab(Composite parent) { MigLayout windowLayout = new MigLayout("fill", "[200][grow]"); - Composite composite = new Composite(tabFolder, SWT.NONE); + composite = new Composite(parent, SWT.NONE); composite.setLayout(windowLayout); - traceTab.setControl(composite); togSaveClasses = new Button(composite, SWT.CHECK); togSaveClasses.setText(ClientStrings.ENABLE_SAVECLASSES); @@ -555,12 +652,32 @@ public class InTraceUI implements ISocketCallback, IControlConnectionListener } TextOutputTab textOutputTab; + HelpOutputTab helpOutputTab; private void fillOutputTabs(TabFolder tabFolder) { TabItem textOutputTabItem = new TabItem(tabFolder, SWT.NONE); textOutputTabItem.setText("Output"); - textOutputTab = new TextOutputTab(tabFolder, textOutputTabItem); + textOutputTab = new TextOutputTab(tabFolder); + textOutputTabItem.setControl(textOutputTab.composite); + + TabItem helpOutputTabItem = new TabItem(tabFolder, SWT.NONE); + helpOutputTabItem.setText("Help"); + helpOutputTab = new HelpOutputTab(tabFolder); + helpOutputTabItem.setControl(helpOutputTab.composite); + } + + private void fillOutputCTabs(CTabFolder tabFolder) + { + CTabItem textOutputTabItem = new CTabItem(tabFolder, SWT.NONE); + textOutputTabItem.setText("Output"); + textOutputTab = new TextOutputTab(tabFolder); + textOutputTabItem.setControl(textOutputTab.composite); + + CTabItem helpOutputTabItem = new CTabItem(tabFolder, SWT.NONE); + helpOutputTabItem.setText("Help"); + helpOutputTab = new HelpOutputTab(tabFolder); + helpOutputTabItem.setControl(helpOutputTab.composite); } private class TextOutputTab @@ -576,15 +693,15 @@ public class InTraceUI implements ISocketCallback, IControlConnectionListener final Button downButton; final Button upButton; final Text findInput; + final Composite composite; - private TextOutputTab(TabFolder tabFolder, TabItem textOutputTab) + private TextOutputTab(Composite parent) { MigLayout windowLayout = new MigLayout("fill,wmin 0,hmin 0", "[100][100][100][150][100][grow]", "[20][20][grow][]"); - final Composite composite = new Composite(tabFolder, SWT.NONE); + composite = new Composite(parent, SWT.NONE); composite.setLayout(windowLayout); - textOutputTab.setControl(composite); Button saveText = new Button(composite, SWT.PUSH); saveText.setText(ClientStrings.SAVE_TEXT); @@ -890,7 +1007,8 @@ public class InTraceUI implements ISocketCallback, IControlConnectionListener } }); - filterThread = new TraceFilterThread(new TraceTextHandler() + filterThread = new TraceFilterThread(standalone, + new TraceTextHandler() { // Re-usable class to avoid object allocations class SetTextRunnable implements Runnable @@ -956,26 +1074,15 @@ public class InTraceUI implements ISocketCallback, IControlConnectionListener setOutputStatus(displayed, total); } }); - filterThread.addSystemTraceLine("Help is available online: https://github.com/mchr3k/org.intrace/wiki"); - filterThread.addSystemTraceLine("Here is some example trace:"); - filterThread.addTraceLine("[10/05/27 14:14:30]:[1]:example.ExampleClass:multiplyMethod: {:100"); - filterThread.addTraceLine("[10/05/27 14:14:30]:[1]:example.ExampleClass:multiplyMethod: Arg: 2"); - filterThread.addTraceLine("[10/05/27 14:14:30]:[1]:example.ExampleClass:multiplyMethod: Arg: 4"); - filterThread.addTraceLine("[10/05/27 14:14:30]:[1]:example.ExampleClass:multiplyMethod: /:101"); - filterThread.addTraceLine("[10/05/27 14:14:30]:[1]:example.ExampleClass:multiplyMethod: Return: 8"); - filterThread.addTraceLine("[10/05/27 14:14:30]:[1]:example.ExampleClass:multiplyMethod: }:105"); - filterThread.addSystemTraceLine(""); - filterThread.addSystemTraceLine("This means the following:"); - filterThread.addSystemTraceLine("[10/05/27 14:14:30] is a date/timestamp - the date is in the format yy/mm/dd"); - filterThread.addSystemTraceLine("[1] - the thread ID"); - filterThread.addSystemTraceLine("example.ExampleClass:multiplyMethod - the Class and Method being traced"); - filterThread.addSystemTraceLine("{:100 - The method was entered on source line 100"); - filterThread.addSystemTraceLine("Arg: 2 - The first argument had value 2"); - filterThread.addSystemTraceLine("Arg: 2 - The second argument had value 4"); - filterThread.addSystemTraceLine("/:101 - An optional block of code was executed starting at source line 101 (e.g. an if statement)"); - filterThread.addSystemTraceLine("Return: 8 - The method returned value 8"); - filterThread.addSystemTraceLine("}:105 - The method returned on source line 105"); - filterThread.addSystemTraceLine(""); + + if (standalone) + { + filterThread.addSystemTraceLine("Instructions"); + filterThread.addSystemTraceLine("(1) Connect to Agent"); + filterThread.addSystemTraceLine("(2) Select Classes you want to Trace"); + filterThread.addSystemTraceLine("Full help available on the Help tab"); + filterThread.addSystemTraceLine(""); + } } private String getDisplayPatternFromText(String text) @@ -1173,12 +1280,79 @@ public class InTraceUI implements ISocketCallback, IControlConnectionListener }); } } + + private class HelpOutputTab + { + final StyledText textOutput; + final Composite composite; + final Link helpLink; + + private HelpOutputTab(Composite parent) + { + MigLayout windowLayout = new MigLayout("fill,wmin 0,hmin 0", + "[grow]", "[20][grow]"); + + composite = new Composite(parent, SWT.NONE); + composite.setLayout(windowLayout); + + helpLink = new Link(composite, SWT.NONE); + helpLink.setLayoutData("growx,wrap"); + helpLink.setText("Online Help"); + + textOutput = new StyledText(composite, SWT.MULTI | SWT.V_SCROLL + | SWT.H_SCROLL | SWT.BORDER); + textOutput.setEditable(false); + textOutput.setLayoutData("spanx,grow,wmin 0,hmin 0"); + textOutput.setBackground(Display.getCurrent().getSystemColor( + SWT.COLOR_WHITE)); + + helpLink.addSelectionListener(new SelectionAdapter() + { + @Override + public void widgetSelected(SelectionEvent event) + { + Program.launch(event.text); + } + }); + + StringBuilder helpStr = new StringBuilder(); + helpStr.append("Here is some example trace:\n"); + helpStr.append("[14:14:30]:[1]:example.ExampleClass:multiplyMethod: {:100\n"); + helpStr.append("[14:14:30]:[1]:example.ExampleClass:multiplyMethod: Arg: 2\n"); + helpStr.append("[14:14:30]:[1]:example.ExampleClass:multiplyMethod: Arg: 4\n"); + helpStr.append("[14:14:30]:[1]:example.ExampleClass:multiplyMethod: /:101\n"); + helpStr.append("[14:14:30]:[1]:example.ExampleClass:multiplyMethod: Return: 8\n"); + helpStr.append("[14:14:30]:[1]:example.ExampleClass:multiplyMethod: }:105\n"); + helpStr.append("\n"); + helpStr.append("This means the following:\n"); + helpStr.append("[14:14:30] is a timestamp"); + helpStr.append("[1] - the thread ID\n"); + helpStr.append("example.ExampleClass:multiplyMethod - the Class and Method being traced\n"); + helpStr.append("{:100 - The method was entered on source line 100\n"); + helpStr.append("Arg: 2 - The first argument had value 2\n"); + helpStr.append("Arg: 2 - The second argument had value 4\n"); + helpStr.append("/:101 - An optional block of code was executed starting at source line 101 (e.g. an if statement)\n"); + helpStr.append("Return: 8 - The method returned value 8\n"); + helpStr.append("}:105 - The method returned on source line 105\n"); + textOutput.setText(helpStr.toString()); + } + } // Window ref private final InTraceUI thisWindow = this; private ConnectState connectionState = ConnectState.DISCONNECTED; + public void setConnectionState(ConnectState connectionState) + { + this.connectionState = connectionState; + IConnectionStateCallback callback = connCallback; + if (callback != null) + { + callback.setConnectionState(connectionState); + } + } + // Network details private InetAddress remoteAddress; @@ -1189,12 +1363,15 @@ public class InTraceUI implements ISocketCallback, IControlConnectionListener // Settings private ParsedSettingsData settingsData = new ParsedSettingsData( new HashMap()); - private Pattern lastEnteredIncludeFilterPattern = TraceFilterThread.MATCH_ALL; + + private Pattern lastEnteredIncludeFilterPattern = TraceFilterThread.MATCH_NONE; + private Pattern activeIncludeFilterPattern = TraceFilterThread.MATCH_NONE; + private Pattern oldIncludeFilterPattern = TraceFilterThread.MATCH_NONE; + private Pattern lastEnteredExcludeFilterPattern = TraceFilterThread.MATCH_NONE; - private Pattern activeIncludeFilterPattern = TraceFilterThread.MATCH_ALL; - private Pattern oldIncludeFilterPattern = TraceFilterThread.MATCH_ALL; private Pattern activeExcludeFilterPattern = TraceFilterThread.MATCH_NONE; private Pattern oldExcludeFilterPattern = TraceFilterThread.MATCH_NONE; + private boolean autoScroll = true; private boolean fixedConnection = false; @@ -1207,7 +1384,7 @@ public class InTraceUI implements ISocketCallback, IControlConnectionListener controlThread = new ControlConnectionThread(socket, this); controlThread.start(); controlThread.sendMessage("getsettings"); - connectionState = ConnectState.CONNECTED; + setConnectionState(ConnectState.CONNECTED); controlThread.sendMessage("[out-network"); String networkTracePortStr = controlThread.getMessage(); @@ -1233,7 +1410,7 @@ public class InTraceUI implements ISocketCallback, IControlConnectionListener } } else { - connectionState = ConnectState.DISCONNECTED_ERR; + setConnectionState(ConnectState.DISCONNECTED_ERR); } updateUIState(); } @@ -1248,7 +1425,7 @@ public class InTraceUI implements ISocketCallback, IControlConnectionListener { networkTraceThread.disconnect(); } - connectionState = ConnectState.DISCONNECTED; + setConnectionState(ConnectState.DISCONNECTED); updateUIState(); } @@ -1361,6 +1538,15 @@ public class InTraceUI implements ISocketCallback, IControlConnectionListener connTab.portInput.setText(Integer.toString(settingsData.actualServerPort)); } + if (settingsData.waitStart) + { + addWaitStartUI(); + } + else + { + removeWaitStartUI(); + } + if (connectionState == ConnectState.CONNECTING) { connTab.connectButton.setText(ClientStrings.CONNECTING); @@ -1372,9 +1558,6 @@ public class InTraceUI implements ISocketCallback, IControlConnectionListener chooseText(connTab.connectButton, (connectionState == ConnectState.CONNECTED), ClientStrings.CONNECT, ClientStrings.DISCONNECT); - chooseText(instruTab.togInstru, - settingsData.instrEnabled, ClientStrings.ENABLE_INSTR, - ClientStrings.DISABLE_INSTR); if (connectionState == ConnectState.CONNECTED) { @@ -1385,7 +1568,6 @@ public class InTraceUI implements ISocketCallback, IControlConnectionListener // Enable all buttons instruTab.classRegex.setEnabled(true); instruTab.listClasses.setEnabled(true); - instruTab.togInstru.setEnabled(true); traceTab.argsTrace.setEnabled(true); traceTab.branchTrace.setEnabled(true); @@ -1400,7 +1582,6 @@ public class InTraceUI implements ISocketCallback, IControlConnectionListener textOutputTab.networkOutput.setEnabled(true); // Update the button pressed/unpressed state - instruTab.togInstru.setSelection(settingsData.instrEnabled); traceTab.argsTrace.setSelection(settingsData.argsEnabled); traceTab.branchTrace.setSelection(settingsData.branchEnabled); traceTab.entryExitTrace.setSelection(settingsData.entryExitEnabled); @@ -1435,7 +1616,6 @@ public class InTraceUI implements ISocketCallback, IControlConnectionListener instruTab.classRegex.setEnabled(false); instruTab.listClasses.setEnabled(false); - instruTab.togInstru.setEnabled(false); traceTab.argsTrace.setEnabled(false); traceTab.branchTrace.setEnabled(false); @@ -1498,9 +1678,9 @@ public class InTraceUI implements ISocketCallback, IControlConnectionListener public void run() { int numInstr = Integer.parseInt(statusMap - .get(AgentConfigConstants.NUM_INSTR_CLASSES)); + .get(AgentConfigConstants.STINST)); int numTotal = Integer.parseInt(statusMap - .get(AgentConfigConstants.NUM_TOTAL_CLASSES)); + .get(AgentConfigConstants.STCLS)); instruTab.setStatus(numInstr, numTotal); } }); @@ -1519,7 +1699,7 @@ public class InTraceUI implements ISocketCallback, IControlConnectionListener textOutputTab.filterThread .addSystemTraceLine("Latest Settings Received"); settingsData = new ParsedSettingsData(settingsMap); - connectionState = ConnectState.CONNECTED; + setConnectionState(ConnectState.CONNECTED); updateUIStateSameThread(); } }); diff --git a/org.intrace/src/org/intrace/client/gui/helper/ParsedSettingsData.java b/org.intrace/src/org/intrace/client/gui/helper/ParsedSettingsData.java index 4cd3286..aeddb32 100644 --- a/org.intrace/src/org/intrace/client/gui/helper/ParsedSettingsData.java +++ b/org.intrace/src/org/intrace/client/gui/helper/ParsedSettingsData.java @@ -25,6 +25,8 @@ public class ParsedSettingsData public final int totalClasses; public final int actualServerPort; + + public final boolean waitStart; private final Map settingsMap; @@ -120,7 +122,7 @@ public class ParsedSettingsData } String numInstrStr = settingsMap - .get(AgentConfigConstants.NUM_INSTR_CLASSES); + .get(AgentConfigConstants.STINST); if (numInstrStr != null) { instruClasses = Integer.parseInt(numInstrStr); @@ -131,7 +133,7 @@ public class ParsedSettingsData } String numTotalStr = settingsMap - .get(AgentConfigConstants.NUM_TOTAL_CLASSES); + .get(AgentConfigConstants.STCLS); if (numTotalStr != null) { totalClasses = Integer.parseInt(numTotalStr); @@ -141,7 +143,7 @@ public class ParsedSettingsData totalClasses = 0; } - String actualServerPortStr = settingsMap.get(AgentConfigConstants.ACTUAL_SERVER_PORT); + String actualServerPortStr = settingsMap.get(AgentConfigConstants.SERVER_PORT); if (actualServerPortStr != null) { actualServerPort = Integer.parseInt(actualServerPortStr); @@ -150,6 +152,15 @@ public class ParsedSettingsData { actualServerPort = 9123; } + + if ("true".equals(settingsMap.get(AgentConfigConstants.START_WAIT))) + { + waitStart = true; + } + else + { + waitStart = false; + } } @Override diff --git a/org.intrace/src/org/intrace/client/gui/helper/TraceFilterThread.java b/org.intrace/src/org/intrace/client/gui/helper/TraceFilterThread.java index 2164879..8a094e9 100644 --- a/org.intrace/src/org/intrace/client/gui/helper/TraceFilterThread.java +++ b/org.intrace/src/org/intrace/client/gui/helper/TraceFilterThread.java @@ -107,14 +107,18 @@ public class TraceFilterThread implements Runnable */ private boolean clearTrace = false; + private final boolean standalone; + /** * cTor + * @param standalone * * @param callback * @param progressCallback */ - public TraceFilterThread(TraceTextHandler callback) + public TraceFilterThread(boolean standalone, TraceTextHandler callback) { + this.standalone = standalone; this.callback = callback; thisThread = new Thread(this); @@ -219,11 +223,19 @@ public class TraceFilterThread implements Runnable { lowMemorySignalled = false; - // I expected a factor of 2 due to trace strings being held by this - // thread along with another copy held by the UI. However, profiling - // shows a factor of 18 is necessary. This is because we need to be able - // to handle entire copies of the active data when adding new strings. - numChars += (18 * newTraceLine.length()); + if (standalone) + { + // I expected a factor of 2 due to trace strings being held by this + // thread along with another copy held by the UI. However, profiling + // shows a factor of 18 is necessary. This is because we need to be able + // to handle entire copies of the active data when adding new strings. + numChars += (18 * newTraceLine.length()); + } + else + { + // Running within eclipse so better be really conservative + numChars += (40 * newTraceLine.length()); + } traceLines.add(newTraceLine); totalLines.incrementAndGet(); diff --git a/org.intrace/src/org/intrace/output/trace/TraceHandler.java b/org.intrace/src/org/intrace/output/trace/TraceHandler.java index 7a49281..a35e2b5 100644 --- a/org.intrace/src/org/intrace/output/trace/TraceHandler.java +++ b/org.intrace/src/org/intrace/output/trace/TraceHandler.java @@ -372,7 +372,7 @@ public class TraceHandler implements IInstrumentationHandler */ public void writeTraceOutput(String xiOutput) { - SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd HH:mm:ss.SSS"); + SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss.SSS"); long threadID = Thread.currentThread().getId(); String traceString = "[" + dateFormat.format(new Date()) + "]:[" + threadID + "]:" + xiOutput; diff --git a/org.intrace/src/org/intrace/shared/AgentConfigConstants.java b/org.intrace/src/org/intrace/shared/AgentConfigConstants.java index 74521fb..bea1b1e 100644 --- a/org.intrace/src/org/intrace/shared/AgentConfigConstants.java +++ b/org.intrace/src/org/intrace/shared/AgentConfigConstants.java @@ -5,24 +5,28 @@ import java.util.Set; public class AgentConfigConstants { - public static final String NUM_STATUS_ID = "NUM_STATUS_ID"; - public static final String NUM_TOTAL_CLASSES = "NUM_TOTAL_CLASSES"; - public static final String NUM_INSTR_CLASSES = "NUM_INSTR_CLASSES"; + public static final String STID = "STID"; + public static final String STCLS = "STCLS"; + public static final String STINST = "STINST"; public static final String NUM_PROGRESS_ID = "NUM_PROGRESS_ID"; public static final String NUM_PROGRESS_COUNT = "NUM_PROGRESS_COUNT"; public static final String NUM_PROGRESS_TOTAL = "NUM_PROGRESS_TOTAL"; public static final String NUM_PROGRESS_DONE = "NUM_PROGRESS_DONE"; - public static final String ACTUAL_SERVER_PORT = "ACTUAL_SERVER_PORT"; + public static final String SERVER_PORT = "SERVER_PORT"; public static final String CLASS_REGEX = "[regex-"; public static final String EXCLUDE_CLASS_REGEX = "[exclude-regex-"; public static final String INSTRU_ENABLED = "[instru-"; public static final String SAVE_TRACED_CLASSFILES = "[saveinstru-"; public static final String VERBOSE_MODE = "[verbose-"; - public static final String SERVER_PORT = "[serverport-"; + public static final String OPT_SERVER_PORT = "[serverport-"; public static final String CALLBACK_PORT = "[callbackport-"; + + public static final String START_WAIT = "[startwait"; + public static final String START_ACTIVATE = "[startactivate"; + public static final Set COMMANDS = new HashSet(); static { @@ -31,7 +35,7 @@ public class AgentConfigConstants COMMANDS.add(INSTRU_ENABLED + ""); COMMANDS.add(SAVE_TRACED_CLASSFILES + ""); COMMANDS.add(VERBOSE_MODE + ""); - COMMANDS.add(SERVER_PORT + ""); + COMMANDS.add(OPT_SERVER_PORT + ""); COMMANDS.add(CALLBACK_PORT + ""); } }