Bug 514634 General Improvement
diff --git a/codegen/org.eclipse.efm.modeling.codegen.xlia.sdf.polygraph/src/org/eclipse/efm/modeling/codegen/xlia/sdf/polygraph/mocc/xlia/MoCC2XLIA.java b/codegen/org.eclipse.efm.modeling.codegen.xlia.sdf.polygraph/src/org/eclipse/efm/modeling/codegen/xlia/sdf/polygraph/mocc/xlia/MoCC2XLIA.java
index e1d174b..b823125 100644
--- a/codegen/org.eclipse.efm.modeling.codegen.xlia.sdf.polygraph/src/org/eclipse/efm/modeling/codegen/xlia/sdf/polygraph/mocc/xlia/MoCC2XLIA.java
+++ b/codegen/org.eclipse.efm.modeling.codegen.xlia.sdf.polygraph/src/org/eclipse/efm/modeling/codegen/xlia/sdf/polygraph/mocc/xlia/MoCC2XLIA.java
@@ -1678,7 +1678,8 @@
 					helperPort.varReceivedTokenCount,
 					helperPort.rateExpression());
 
-			if( ALWAYS_USING_MODE || moccPort.isDeciding() )

+			if( (ALWAYS_USING_MODE || moccPort.isDeciding())

+				&& (helperPort.varReceivedMode != null) )

 			{
 				assert (helperPort.varReceivedMode != null) :
 					"Unexpected a null varReceivedMode for port " +
diff --git a/execution/org.eclipse.efm.execution.configuration.common.ui/src/org/eclipse/efm/execution/configuration/common/ui/editors/table/TraceElementTableConfigProvider.java b/execution/org.eclipse.efm.execution.configuration.common.ui/src/org/eclipse/efm/execution/configuration/common/ui/editors/table/TraceElementTableConfigProvider.java
index f86f8a9..a56064e 100644
--- a/execution/org.eclipse.efm.execution.configuration.common.ui/src/org/eclipse/efm/execution/configuration/common/ui/editors/table/TraceElementTableConfigProvider.java
+++ b/execution/org.eclipse.efm.execution.configuration.common.ui/src/org/eclipse/efm/execution/configuration/common/ui/editors/table/TraceElementTableConfigProvider.java
@@ -36,7 +36,8 @@
 	public final String NATURE_TITLE;

 	public final String VALUE_TITLE;

 

-	public final int SELECTION_WIDTH = 20;

+	public final int ROW_NUMBER_WIDTH = 40;

+	public final int SELECTION_WIDTH  = 20;

 	public final int NATURE_WIDTH;

 	public final int VALUE_WIDTH;

 

@@ -52,12 +53,15 @@
 

 	public final String[] VALID_NATURES;

 

+	public final boolean SHOW_ROW_NUMBER;

+

 	public TraceElementTableConfigProvider(

 			final String storeKey, final List<String> defaultAttributeValue,

 			final String title, final String toolTipText, final boolean checkedBoxForColumnZero,

 			final boolean isNatureUniqueSet, final String natureTitle, final int natureWidth,

 			final String valueTitle, final int valueWidth, final int heightHint,

-			final TraceElementKind[] validTraces, final TraceElementKind deafaultTrace) {

+			final TraceElementKind[] validTraces, final TraceElementKind defaultTrace,

+			final boolean showRowNumber) {

 

 		STORE_KEY = storeKey;

 		DEFAULT_ATTRIBUTE_VALUE = defaultAttributeValue;

@@ -84,19 +88,22 @@
 			VALID_NATURES[offset] = validTraces[offset].getLiteral();

 		}

 

-		DEFAULT_TRACE_NATURE = deafaultTrace;

+		DEFAULT_TRACE_NATURE = defaultTrace;

+

+		SHOW_ROW_NUMBER = showRowNumber;

 	}

 

 	public TraceElementTableConfigProvider(final String storeKey,

 			final List<String> defaultAttributeValue, final String title, final String toolTipText,

 			final boolean checkedBoxForColumnZero, final String natureTitle, final int natureWidth,

 			final String valueTitle, final int valueWidth, final int heightHint,

-			final TraceElementKind[] validTraces, final TraceElementKind deafaultTrace)

+			final TraceElementKind[] validTraces, final TraceElementKind defaultTrace,

+			final boolean showRowNumber)

 	{

 		this(storeKey, defaultAttributeValue, title, toolTipText,

 				checkedBoxForColumnZero, false, natureTitle,

 				natureWidth, valueTitle, valueWidth, heightHint,

-				validTraces, TraceElementKind.TRANSITION);

+				validTraces, defaultTrace, showRowNumber);

 	}

 

 

@@ -109,7 +116,7 @@
 		this(storeKey, defaultAttributeValue, title, toolTipText,

 				checkedBoxForColumnZero, false, natureTitle,

 				natureWidth, valueTitle, valueWidth, heightHint,

-				validTraces, TraceElementKind.TRANSITION);

+				validTraces, TraceElementKind.TRANSITION, false);

 	}

 

 

@@ -362,7 +369,7 @@
 				"Nature" , pixelConverter.convertWidthInCharsToPixels(16),

 				"Element", pixelConverter.convertWidthInCharsToPixels(48),

 				pixelConverter.convertHeightInCharsToPixels(7),//HEIGHT_HINT_ROW_7,

-				TRANSITION_TRACE_ELEMENT, TraceElementKind.TRANSITION);

+				TRANSITION_TRACE_ELEMENT, TraceElementKind.TRANSITION, true);

 	}

 

 

@@ -379,7 +386,7 @@
 				"Nature" , pixelConverter.convertWidthInCharsToPixels(16),

 				"Element", pixelConverter.convertWidthInCharsToPixels(48),

 				pixelConverter.convertHeightInCharsToPixels(7),//HEIGHT_HINT_ROW_7,

-				BEHAVIOR_SELECTION_TRACE_ELEMENT, TraceElementKind.TRANSITION);

+				BEHAVIOR_SELECTION_TRACE_ELEMENT, TraceElementKind.TRANSITION, true);

 	}

 

 

@@ -397,7 +404,7 @@
 				"Nature" , pixelConverter.convertWidthInCharsToPixels(16),

 				"Element", pixelConverter.convertWidthInCharsToPixels(48),

 				pixelConverter.convertHeightInCharsToPixels(5),//HEIGHT_HINT_ROW_5,

-				BEHAVIOR_SELECTION_TRACE_ELEMENT, TraceElementKind.VARIABLE);

+				BEHAVIOR_SELECTION_TRACE_ELEMENT, TraceElementKind.VARIABLE, false);

 	}

 

 	public static TraceElementTableConfigProvider getControllableTrace(final Font font) {

@@ -410,7 +417,7 @@
 				"Nature" , pixelConverter.convertWidthInCharsToPixels(16),

 				"Element", pixelConverter.convertWidthInCharsToPixels(48),

 				pixelConverter.convertHeightInCharsToPixels(5),//HEIGHT_HINT_ROW_5,

-				BEHAVIOR_SELECTION_TRACE_ELEMENT, TraceElementKind.VARIABLE);

+				BEHAVIOR_SELECTION_TRACE_ELEMENT, TraceElementKind.VARIABLE, false);

 	}

 

 

@@ -427,7 +434,7 @@
 				"Nature" , pixelConverter.convertWidthInCharsToPixels(16),

 				"Element", pixelConverter.convertWidthInCharsToPixels(48),

 				pixelConverter.convertHeightInCharsToPixels(7),//HEIGHT_HINT_ROW_7,

-				BEHAVIOR_SELECTION_TRACE_ELEMENT, TraceElementKind.TRANSITION);

+				BEHAVIOR_SELECTION_TRACE_ELEMENT, TraceElementKind.TRANSITION, false);

 	}

 

 

@@ -444,7 +451,7 @@
 				"Nature" , pixelConverter.convertWidthInCharsToPixels(16),

 				"Element", pixelConverter.convertWidthInCharsToPixels(48),

 				pixelConverter.convertHeightInCharsToPixels(5),//HEIGHT_HINT_ROW_5,

-				BEHAVIOR_SELECTION_TRACE_ELEMENT, TraceElementKind.TRANSITION);

+				BEHAVIOR_SELECTION_TRACE_ELEMENT, TraceElementKind.TRANSITION, false);

 	}

 

 	public static TraceElementTableConfigProvider getTestGenerationTraceDetail(final Font font) {

@@ -457,7 +464,7 @@
 				"Nature" , pixelConverter.convertWidthInCharsToPixels(16),

 				"Element", pixelConverter.convertWidthInCharsToPixels(48),

 				pixelConverter.convertHeightInCharsToPixels(5),//HEIGHT_HINT_ROW_5,

-				SERIALIZER_TRACE_ELEMENT, TraceElementKind.TRANSITION);

+				SERIALIZER_TRACE_ELEMENT, TraceElementKind.TRANSITION, false);

 	}

 

 	public static TraceElementTableConfigProvider getTestGenenrationTraceFormat(final Font font) {

@@ -471,7 +478,7 @@
 				"Nature" , pixelConverter.convertWidthInCharsToPixels(32),

 				"Element", pixelConverter.convertWidthInCharsToPixels(48),

 				pixelConverter.convertHeightInCharsToPixels(10),//HEIGHT_HINT_ROW_10,

-				FORMAT_ELEMENT, TraceElementKind.RAW_ATTRIBUTE);

+				FORMAT_ELEMENT, TraceElementKind.RAW_ATTRIBUTE, false);

 	}

 

 

@@ -489,7 +496,7 @@
 				"Nature" , pixelConverter.convertWidthInCharsToPixels(16),

 				"Element", pixelConverter.convertWidthInCharsToPixels(48),

 				pixelConverter.convertHeightInCharsToPixels(7),//HEIGHT_HINT_ROW_7,

-				SERIALIZER_TRACE_ELEMENT, TraceElementKind.VARIABLE);

+				SERIALIZER_TRACE_ELEMENT, TraceElementKind.VARIABLE, false);

 	}

 

 	public static TraceElementTableConfigProvider getFirstSymbexOutputGraphizFormat(final Font font) {

@@ -502,7 +509,7 @@
 				"Nature" , pixelConverter.convertWidthInCharsToPixels(32),

 				"Element", pixelConverter.convertWidthInCharsToPixels(48),

 				pixelConverter.convertHeightInCharsToPixels(10),//HEIGHT_HINT_ROW_10,

-				FORMAT_ELEMENT, TraceElementKind.VARIABLE);

+				FORMAT_ELEMENT, TraceElementKind.VARIABLE, false);

 	}

 

 

@@ -520,7 +527,7 @@
 				"Nature" , pixelConverter.convertWidthInCharsToPixels(16),

 				"Element", pixelConverter.convertWidthInCharsToPixels(48),

 				pixelConverter.convertHeightInCharsToPixels(5),//HEIGHT_HINT_ROW_5,

-				SERIALIZER_TRACE_ELEMENT, TraceElementKind.VARIABLE);

+				SERIALIZER_TRACE_ELEMENT, TraceElementKind.VARIABLE, false);

 	}

 

 

@@ -534,7 +541,7 @@
 				"Nature" , pixelConverter.convertWidthInCharsToPixels(24),

 				"Element", pixelConverter.convertWidthInCharsToPixels(48),

 				pixelConverter.convertHeightInCharsToPixels(10),//HEIGHT_HINT_ROW_10,

-				FORMAT_ELEMENT, TraceElementKind.VARIABLE);

+				FORMAT_ELEMENT, TraceElementKind.VARIABLE, false);

 	}

 

 

diff --git a/execution/org.eclipse.efm.execution.configuration.common.ui/src/org/eclipse/efm/execution/configuration/common/ui/editors/table/TraceElementTableViewer.java b/execution/org.eclipse.efm.execution.configuration.common.ui/src/org/eclipse/efm/execution/configuration/common/ui/editors/table/TraceElementTableViewer.java
index 7a42fd7..1ab77e1 100644
--- a/execution/org.eclipse.efm.execution.configuration.common.ui/src/org/eclipse/efm/execution/configuration/common/ui/editors/table/TraceElementTableViewer.java
+++ b/execution/org.eclipse.efm.execution.configuration.common.ui/src/org/eclipse/efm/execution/configuration/common/ui/editors/table/TraceElementTableViewer.java
@@ -11,6 +11,7 @@
 package org.eclipse.efm.execution.configuration.common.ui.editors.table;

 

 import java.util.ArrayList;

+import java.util.Arrays;

 import java.util.List;

 import java.util.function.Predicate;

 

@@ -27,6 +28,7 @@
 import org.eclipse.jface.action.Separator;

 import org.eclipse.jface.action.ToolBarManager;

 import org.eclipse.jface.viewers.ArrayContentProvider;

+import org.eclipse.jface.viewers.CellLabelProvider;

 import org.eclipse.jface.viewers.ColumnLabelProvider;

 import org.eclipse.jface.viewers.StyledCellLabelProvider;

 import org.eclipse.jface.viewers.TableViewer;

@@ -40,6 +42,7 @@
 import org.eclipse.swt.graphics.Image;

 import org.eclipse.swt.layout.GridData;

 import org.eclipse.swt.widgets.Composite;

+import org.eclipse.swt.widgets.Label;

 import org.eclipse.swt.widgets.Table;

 import org.eclipse.swt.widgets.TableColumn;

 import org.eclipse.swt.widgets.TableItem;

@@ -66,8 +69,11 @@
 

 	private TableViewer fTableViewer;

 

+	private Label fContentDescriptionLabel;

+

 	private final TraceElementTableConfigProvider fTableConfig;

 

+	private int ROW_LINE_COLUMN_INDEX;

 	private int SELECTION_COLUMN_INDEX;

 	private int NATURE_COLUMN_INDEX;

 	private int VALUE_COLUMN_INDEX;

@@ -119,6 +125,8 @@
 		fTableViewer.setInput(traceElements);

 

 		addNewElementItemForDoubleClick();

+

+		updateContentDescriptionLabel();

 	}

 

 	public void removeAll() {

@@ -141,6 +149,19 @@
 		return traceElements;

 	}

 

+	public int getElementCount() {

+		return fTableViewer.getTable().getItems().length;

+	}

+

+	protected void updateContentDescriptionLabel() {

+		fContentDescriptionLabel.setText(fTableConfig.TITLE

+				+ " (Total: " + getElementCount() + ")");

+

+		fContentDescriptionLabel.setToolTipText(

+				"(Total: " + getElementCount() + ")");

+	}

+

+

 	/**

 	 * Create the TableViewer Control

 	 * @param parent

@@ -161,7 +182,8 @@
 

 		final Composite labelContainer = widgetToolkit.createComposite(

 				viewForm, font, 1, 1, GridData.FILL_BOTH, 5, 5);

-        widgetToolkit.createLabel(labelContainer, fTableConfig.TITLE, 1);

+		fContentDescriptionLabel =

+				widgetToolkit.createLabel(labelContainer, fTableConfig.TITLE, 1);

         viewForm.setTopLeft(labelContainer);

 

         final ToolBarManager toolBarManager= new ToolBarManager(SWT.FLAT);

@@ -245,6 +267,8 @@
 			@Override

 			public void inputChanged(final Viewer viewer, final Object oldInput, final Object newInput) {

 				super.inputChanged(viewer, oldInput, newInput);

+

+				updateContentDescriptionLabel();

 			}

 		} );

 //		fTableViewer.setLabelProvider(new TraceElementLabelProvider());

@@ -256,7 +280,6 @@
 //			}

 //		});

 

-

 //!!		// Double click for edit TraceElement value column

 //		TableViewerFocusCellManager focusCellManager =

 //				new TableViewerFocusCellManager(fTableViewer,

@@ -315,19 +338,52 @@
 

 	// create the columns for the table

 	private void createColumns(final Composite tableComposite, final Font font) {

+		ROW_LINE_COLUMN_INDEX  = -1;

 		SELECTION_COLUMN_INDEX = -1;

-		NATURE_COLUMN_INDEX = 0;

-		VALUE_COLUMN_INDEX = 1;

+		NATURE_COLUMN_INDEX    = 0;

+		VALUE_COLUMN_INDEX     = 1;

 

-		if( fTableConfig.CHECKED_BOX_FOR_COLUMN_ZERO ) {

-			SELECTION_COLUMN_INDEX = 0;

-			NATURE_COLUMN_INDEX = 1;

-			VALUE_COLUMN_INDEX = 2;

+		if( fTableConfig.SHOW_ROW_NUMBER ) {

+			ROW_LINE_COLUMN_INDEX  = 0;

+			SELECTION_COLUMN_INDEX = -1;

+			NATURE_COLUMN_INDEX    = 1;

+			VALUE_COLUMN_INDEX     = 2;

 

 			// column for the TraceElement Selection

-			final TableViewerColumn viewerColumn = createTableViewerColumn(

-					fTableConfig.SELECTION_TITLE, fTableConfig.SELECTION_WIDTH,

-					false, SELECTION_COLUMN_INDEX);

+			final TableViewerColumn viewerColumn =

+					createTableViewerColumn("",

+							fTableConfig.ROW_NUMBER_WIDTH,

+							true, ROW_LINE_COLUMN_INDEX, SWT.RIGHT);

+

+			viewerColumn.setEditingSupport(

+					new TraceElementSelectionEditingSupport(this));

+

+			viewerColumn.setLabelProvider( new CellLabelProvider() {

+

+				@Override

+				public void update(final ViewerCell cell) {

+					if( fTableViewer != null ) {

+						final int index =

+								Arrays.asList(fTableViewer.getTable().getItems())

+								.indexOf(cell.getItem());

+						cell.setText("" + (index + 1));

+					}

+				}

+			});

+		}

+

+		if( fTableConfig.CHECKED_BOX_FOR_COLUMN_ZERO ) {

+			SELECTION_COLUMN_INDEX = ROW_LINE_COLUMN_INDEX + 1;

+			NATURE_COLUMN_INDEX    = ROW_LINE_COLUMN_INDEX + 2;

+			VALUE_COLUMN_INDEX     = ROW_LINE_COLUMN_INDEX + 3;

+

+

+			// column for the TraceElement Selection

+			final TableViewerColumn viewerColumn =

+					createTableViewerColumn(

+							fTableConfig.SELECTION_TITLE,

+							fTableConfig.SELECTION_WIDTH,

+							false, SELECTION_COLUMN_INDEX, SWT.CENTER);

 

 			viewerColumn.setEditingSupport(

 					new TraceElementSelectionEditingSupport(this));

@@ -360,10 +416,13 @@
 		}

 

 

+

 		// first column is for the TraceElement Nature

 		TableViewerColumn viewerColumn =

-				createTableViewerColumn(fTableConfig.NATURE_TITLE,

-						fTableConfig.NATURE_WIDTH, true, NATURE_COLUMN_INDEX);

+				createTableViewerColumn(

+						fTableConfig.NATURE_TITLE,

+						fTableConfig.NATURE_WIDTH,

+						true, NATURE_COLUMN_INDEX, SWT.LEFT);

 

 		viewerColumn.setEditingSupport(

 				new TraceElementNatureEditingSupport(this));

@@ -385,7 +444,7 @@
 

 		// second column is for the TraceElement Value

 		viewerColumn = createTableViewerColumn(fTableConfig.VALUE_TITLE,

-				fTableConfig.VALUE_WIDTH, true, VALUE_COLUMN_INDEX);

+				fTableConfig.VALUE_WIDTH, true, VALUE_COLUMN_INDEX, SWT.LEFT);

 

 		viewerColumn.setEditingSupport(new TraceElementValueEditingSupport(this));

 

@@ -425,9 +484,11 @@
 

 

 	private TableViewerColumn createTableViewerColumn(

-			final String title, final int bound, final boolean resizable, final int colNumber) {

+			final String title, final int bound,

+			final boolean resizable, final int colNumber,  final int style)

+	{

 		final TableViewerColumn viewerColumn =

-				new TableViewerColumn(fTableViewer, SWT.NONE);

+				new TableViewerColumn(fTableViewer, style);

 

 		final TableColumn column = viewerColumn.getColumn();

 

@@ -618,7 +679,9 @@
 				new TraceElementAddingDialog(this, null, null);

 

 		if( addingDialog.open() == Window.OK ) {

-	        updateLaunchConfigurationDialog();

+			updateContentDescriptionLabel();

+

+			updateLaunchConfigurationDialog();

 		}

 	}

 

@@ -670,6 +733,8 @@
 						TraceElementKind.UNDEFINED, ADD_NEW_ELEMENT));

 			}

 

+			updateContentDescriptionLabel();

+

 	        updateLaunchConfigurationDialog();

 		}

 	}

@@ -720,6 +785,8 @@
 							(selectionIndex + 1));

 				}

 

+				updateContentDescriptionLabel();

+

 		        updateLaunchConfigurationDialog();

 			}

 		}

@@ -762,6 +829,8 @@
 			if( selTraceElement.getNature() != TraceElementKind.UNDEFINED ) {

 				fTableViewer.editElement(selTraceElement, VALUE_COLUMN_INDEX);

 

+//				updateContentDescriptionLabel();

+

 		        updateLaunchConfigurationDialog();

 			}

 		}

@@ -800,6 +869,8 @@
 				fTableViewer.remove( selection.getData() );

 			}

 

+			updateContentDescriptionLabel();

+

 	        updateLaunchConfigurationDialog();

 		}

 	}

@@ -833,6 +904,8 @@
 		fTableViewer.getTable().removeAll();

 		addNewElementItemForDoubleClick();

 

+		updateContentDescriptionLabel();

+

         updateLaunchConfigurationDialog();

 	}

 

diff --git a/execution/org.eclipse.efm.execution.core/src/org/eclipse/efm/execution/core/IWorkflowConfigurationConstants.java b/execution/org.eclipse.efm.execution.core/src/org/eclipse/efm/execution/core/IWorkflowConfigurationConstants.java
index ed46eeb..bb9305e 100644
--- a/execution/org.eclipse.efm.execution.core/src/org/eclipse/efm/execution/core/IWorkflowConfigurationConstants.java
+++ b/execution/org.eclipse.efm.execution.core/src/org/eclipse/efm/execution/core/IWorkflowConfigurationConstants.java
@@ -1021,20 +1021,18 @@
 			PLUGIN_LAUNCH_ID + ".ATTR_SYMBEX_OPTION_TEXTUAL_CONFIGURATION"; //$NON-NLS-1$

 

 	String DEFAULT_SYMBEX_OPTION_TEXTUAL_CONFIGURATION

-			= "symbex 'option' [\n"

-			+ "\tname_id_separator = \"_\"   // default \"#\"\n"

-			+ "\tnewfresh_param_name_pid = false\n"

-			+ "\tpretty_printer_var_name = true   // default false\n"

-			+ "\ttime_name_id = '$time'\n"

-			+ "\ttime_initial_value = 0\n"

-			+ "\tdelta_name_id = '$delay'\n"

-			+ "\tdelta_initial_value = 0\n"

-			+ "\tnode_condition_enabled = false   // default false\n"

-			+ "\tseparation_of_pc_disjunction = false\n"

-			+ "\tcheck_pathcondition_satisfiability = true\n"

-			+ "\t//strongly_check_pathcondition_satisfiability = true\n"

-			+ "\tconstraint_solver = 'CVC4'  // Z3\n"

-			+ "] // end symbex\n";  //$NON-NLS-1$

+			= "name_id_separator = \"_\"   // default \"#\"\n"

+			+ "newfresh_param_name_pid = false\n"

+			+ "pretty_printer_var_name = true   // default false\n"

+			+ "time_name_id = '$time'\n"

+			+ "time_initial_value = 0\n"

+			+ "delta_name_id = '$delay'\n"

+			+ "delta_initial_value = 0\n"

+			+ "node_condition_enabled = false   // default false\n"

+			+ "separation_of_pc_disjunction = false\n"

+			+ "check_pathcondition_satisfiability = true\n"

+			+ "//strongly_check_pathcondition_satisfiability = true\n"

+			+ "constraint_solver = 'CVC4'  // Z3\n"; //$NON-NLS-1$

 

 	////////////////////////////////////////////////////////////////////////////

 	// DEVELOPER:  a.k.a. DEVELOPER DEBUG TUNING OPTION

diff --git a/execution/org.eclipse.efm.execution.core/src/org/eclipse/efm/execution/core/IWorkflowSpiderConfigurationUtils.java b/execution/org.eclipse.efm.execution.core/src/org/eclipse/efm/execution/core/IWorkflowSpiderConfigurationUtils.java
index f2ea03a..70edd45 100644
--- a/execution/org.eclipse.efm.execution.core/src/org/eclipse/efm/execution/core/IWorkflowSpiderConfigurationUtils.java
+++ b/execution/org.eclipse.efm.execution.core/src/org/eclipse/efm/execution/core/IWorkflowSpiderConfigurationUtils.java
@@ -12,6 +12,9 @@
  *******************************************************************************/
 package org.eclipse.efm.execution.core;
 
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
 public interface IWorkflowSpiderConfigurationUtils {
 
 	///////////////////////////////////////////////////////////////////////////
@@ -122,6 +125,100 @@
 	///////////////////////////////////////////////////////////////////////////
 	///////////////////////////////////////////////////////////////////////////
 
+    Pattern PATTERN_EXECUTION_SPIDER_INIT_POSITIONS = Pattern.compile(
+    		SPIDER_TRACE_INIT_PREFIX + "[(](\\d+):(\\d+):(\\d+):(\\d+)[)]"
+    		+ "(" + SPIDER_COVERAGE_PREFIX + "[(](\\d+):(\\d+)[)])?");
+
+    Pattern PATTERN_EXECUTION_SPIDER_STEP_POSITIONS = Pattern.compile(
+    		SPIDER_TRACE_STEP_PREFIX + "\\((\\d+):(\\d+):(\\d+):(\\d+)\\)"
+    		+ "(" + SPIDER_COVERAGE_PREFIX + "\\((\\d+):(\\d+)\\))?");
+
+    Pattern PATTERN_EXECUTION_SPIDER_STOP_POSITIONS = Pattern.compile(
+    		SPIDER_TRACE_INIT_PREFIX + "\\((\\d+):(\\d+):(\\d+):(\\d+)\\)"
+    		+ "(" + SPIDER_COVERAGE_PREFIX + "\\((\\d+):(\\d+)\\))?");
+
+
+	default int[] matcherSpiderPositions(final String spiderInformations) {
+		if( spiderInformations.length() < 2 ) {
+			return RESCUE_POSITIONS;
+		}
+		else {
+	        Matcher matcher = null;
+
+			final char firstChar = spiderInformations.charAt(0);
+			if( firstChar == '$' ) {
+				if( (matcher = PATTERN_EXECUTION_SPIDER_STEP_POSITIONS.matcher(
+						spiderInformations)).find() )
+				{
+					final int[] positions = new int[matcher.groupCount() + 1];
+					for (int i = 1; i <= positions.length; i++) {
+						positions[i] = Integer.parseUnsignedInt(matcher.group(i));
+					}
+					return( positions );
+				}
+			}
+			else if( firstChar == '<' ) {
+				if( (matcher = PATTERN_EXECUTION_SPIDER_INIT_POSITIONS.matcher(
+						spiderInformations)).find() )
+				{
+					final int[] positions = new int[matcher.groupCount() + 1];
+					for (int i = 1; i <= positions.length; i++) {
+						positions[i] = Integer.parseUnsignedInt(matcher.group(i));
+					}
+					return( positions );
+				}
+			}
+			else if( firstChar == '>' ) {
+				if( (matcher = PATTERN_EXECUTION_SPIDER_STOP_POSITIONS.matcher(
+						spiderInformations)).find() )
+				{
+					final int[] positions = new int[matcher.groupCount() + 1];
+					for (int i = 1; i <= positions.length; i++) {
+						positions[i] = Integer.parseUnsignedInt(matcher.group(i));
+					}
+					return( positions );
+				}
+			}
+
+//			else
+			{
+				return( splitSpiderPositions(spiderInformations) );
+			}
+		}
+	}
+
+	default int[] splitSpiderPositions(final String spiderInformations) {
+		String[] strPositions;
+
+		final char firstChar = spiderInformations.charAt(0);
+		if( (firstChar == '$') || (firstChar == '<') || (firstChar == '>') ) {
+			strPositions = spiderInformations.split(SPIDER_POSITIONS_SEPARATOR);
+		}
+		else { //if (firstChar == 's')
+			strPositions = spiderInformations.split(OLD_POSITIONS_SEPARATOR);
+		}
+
+		final int[] positions = new int[strPositions.length - 1];
+
+		for (int i = 1; i < strPositions.length; i++) {
+			try {
+				positions[i - 1] = Integer.parseInt(strPositions[i]);
+			} catch(final NumberFormatException e) {
+				//!! NOTHING ELSE !!
+				positions[i - 1] = 0;
+
+				System.out.print( "spiderPosition< unexpected as number > : " );
+				System.out.print( strPositions[i] );
+				System.out.print( " FROM " );
+				System.out.println( spiderInformations );
+			}
+		}
+
+		return( positions );
+	}
+
+
+
 	String SPIDER_POSITIONS_SEPARATOR = "\\D+";
 	String OLD_POSITIONS_SEPARATOR = "[, ]*\\w+[:][ ]*|[,/ ]+";
 
@@ -132,31 +229,11 @@
 			return RESCUE_POSITIONS;
 		}
 		else {
-			String[] strPositions;
+//			final int[] positions = matcherSpiderPositions(spiderInformations);
+//			System.out.print( "MATCHER " + spiderInformations + " --> " );
+//			System.out.println( Arrays.toString(positions) );
 
-			final char firstChar = spiderInformations.charAt(0);
-			if( (firstChar == '$') || (firstChar == '<') || (firstChar == '>') ) {
-				strPositions = spiderInformations.split(SPIDER_POSITIONS_SEPARATOR);
-			}
-			else { //if (firstChar == 's')
-				strPositions = spiderInformations.split(OLD_POSITIONS_SEPARATOR);
-			}
-
-			final int[] positions = new int[strPositions.length - 1];
-
-			for (int i = 1; i < strPositions.length; i++) {
-				try {
-					positions[i - 1] = Integer.parseInt(strPositions[i]);
-				} catch(final NumberFormatException e) {
-					//!! NOTHING ELSE !!
-					positions[i - 1] = 0;
-
-					System.out.print( "spiderPosition< unexpected as number > : " );
-					System.out.println( strPositions[i] );
-				}
-			}
-
-			return( positions );
+			return( splitSpiderPositions(spiderInformations) );
 		}
 	}
 
diff --git a/execution/org.eclipse.efm.execution.core/src/org/eclipse/efm/execution/core/workflow/common/TraceElementCustomImpl.java b/execution/org.eclipse.efm.execution.core/src/org/eclipse/efm/execution/core/workflow/common/TraceElementCustomImpl.java
index e0a86ce..aa37b8c 100644
--- a/execution/org.eclipse.efm.execution.core/src/org/eclipse/efm/execution/core/workflow/common/TraceElementCustomImpl.java
+++ b/execution/org.eclipse.efm.execution.core/src/org/eclipse/efm/execution/core/workflow/common/TraceElementCustomImpl.java
@@ -66,7 +66,7 @@
 			final Matcher matcher = pattern.matcher(element);

 

 			if( matcher.find() ) {

-				String kind = matcher.group(1).trim();

+				final String kind = matcher.group(1).trim();

 				nature = TraceElementKind.get(kind);

 

 				if( nature != null ) {

@@ -177,26 +177,33 @@
 	public void toWriter(final PrettyPrintWriter writer) {

 		final Object value = getValue();

 

-		writer.appendTab( isSelected() ? "" : UNSELECTION_MARKER );

-

 		switch( getNature() ) {

 			case UNDEFINED: {

-				writer.commentLine( value );

+//				if( (value instanceof String)

+//					&& (((String) value).indexOf('=') > 0) )

+//				{

+//					writer.appendTabEol( value.toString() );

+//				}

+//				else {

+					writer.commentLine( value );

+//				}

 				break;

 			}

 			case TIPS: {

-				writer.append("//").appendEol( value.toString() );

+				writer.appendTab("//").appendEol( value.toString() );

 				break;

 			}

 			case RAW_ATTRIBUTE: {

-				writer.appendEol( value.toString() );

+				writer.appendTab( isSelected() ? "" : UNSELECTION_MARKER )

+						.appendEol( value.toString() );

 				break;

 			}

 

 			case CONDITION:

 			case DECISION:

 			case FORMULA: {

-				writer.append( getNature().getLiteral() ).append( " = " );

+				writer.appendTab( isSelected() ? "" : UNSELECTION_MARKER )

+						.append( getNature().getLiteral() ).append( " = " );

 

 				if( value instanceof String ) {

 					final String str = value.toString();

@@ -214,7 +221,8 @@
 			}

 

 			default: {

-				writer.append( getNature().getLiteral() ).append( " = " );

+				writer.appendTab( isSelected() ? "" : UNSELECTION_MARKER )

+						.append( getNature().getLiteral() ).append( " = " );

 

 				if( value instanceof String ) {

 					final String str = value.toString();

diff --git a/execution/org.eclipse.efm.execution.core/src/org/eclipse/efm/execution/core/workflow/serializer/SequenceDiagramTraceSerializerWorkerCustomImpl.java b/execution/org.eclipse.efm.execution.core/src/org/eclipse/efm/execution/core/workflow/serializer/SequenceDiagramTraceSerializerWorkerCustomImpl.java
index 8d4d5e5..2ae2f28 100644
--- a/execution/org.eclipse.efm.execution.core/src/org/eclipse/efm/execution/core/workflow/serializer/SequenceDiagramTraceSerializerWorkerCustomImpl.java
+++ b/execution/org.eclipse.efm.execution.core/src/org/eclipse/efm/execution/core/workflow/serializer/SequenceDiagramTraceSerializerWorkerCustomImpl.java
@@ -124,7 +124,7 @@
 						"format", configuration,

 						ATTR_SEQUENCE_DIAGRAM_TRACE_FORMAT_ELEMENT_LIST,

 						DEFAULT_SEQUENCE_DIAGRAM_TRACE_FORMAT_ELEMENT_LIST,

-						TraceElementKind.UNDEFINED);

+						TraceElementKind.RAW_ATTRIBUTE);

 

 		serializerWorker.setFormat( format );

 

@@ -173,7 +173,7 @@
 				TraceSpecificationCustomImpl.create(

 						"trace", configuration,

 						ATTR_BASIC_TRACE_DETAILS_ELEMENT_LIST,

-						TraceElementKind.UNDEFINED);

+						TraceElementKind.RAW_ATTRIBUTE);

 

 		boolean enabled;

 

diff --git a/execution/org.eclipse.efm.execution.core/src/org/eclipse/efm/execution/core/workflow/serializer/SymbexGraphicSerializerWorkerCustomImpl.java b/execution/org.eclipse.efm.execution.core/src/org/eclipse/efm/execution/core/workflow/serializer/SymbexGraphicSerializerWorkerCustomImpl.java
index f53ed43..df8faaf 100644
--- a/execution/org.eclipse.efm.execution.core/src/org/eclipse/efm/execution/core/workflow/serializer/SymbexGraphicSerializerWorkerCustomImpl.java
+++ b/execution/org.eclipse.efm.execution.core/src/org/eclipse/efm/execution/core/workflow/serializer/SymbexGraphicSerializerWorkerCustomImpl.java
@@ -82,7 +82,7 @@
 						"format", configuration,

 						ATTR_FIRST_SYMBEX_OUTPUT_GRAPHVIZ_FORMAT_SPEC,

 						DEFAULT_SYMBEX_OUTPUT_GRAPHVIZ_FORMAT_SPEC,

-						TraceElementKind.UNDEFINED);

+						TraceElementKind.RAW_ATTRIBUTE);

 

 		serializerWorker.setFormat( format );

 

@@ -138,7 +138,7 @@
 						"format", configuration,

 						ATTR_SECOND_SYMBEX_OUTPUT_GRAPHVIZ_FORMAT_SPEC,

 						DEFAULT_SYMBEX_OUTPUT_GRAPHVIZ_FORMAT_SPEC,

-						TraceElementKind.UNDEFINED);

+						TraceElementKind.RAW_ATTRIBUTE);

 

 		serializerWorker.setFormat( format );

 

diff --git a/execution/org.eclipse.efm.execution.core/src/org/eclipse/efm/execution/core/workflow/serializer/SymbexGraphvizSerializerWorkerCustomImpl.java b/execution/org.eclipse.efm.execution.core/src/org/eclipse/efm/execution/core/workflow/serializer/SymbexGraphvizSerializerWorkerCustomImpl.java
index c9ae222..2aa36b7 100644
--- a/execution/org.eclipse.efm.execution.core/src/org/eclipse/efm/execution/core/workflow/serializer/SymbexGraphvizSerializerWorkerCustomImpl.java
+++ b/execution/org.eclipse.efm.execution.core/src/org/eclipse/efm/execution/core/workflow/serializer/SymbexGraphvizSerializerWorkerCustomImpl.java
@@ -82,7 +82,7 @@
 						"format", configuration,

 						ATTR_FIRST_SYMBEX_OUTPUT_GRAPHVIZ_FORMAT_SPEC,

 						DEFAULT_SYMBEX_OUTPUT_GRAPHVIZ_FORMAT_SPEC,

-						TraceElementKind.UNDEFINED);

+						TraceElementKind.RAW_ATTRIBUTE);

 

 		serializerWorker.setFormat( format );

 

@@ -138,7 +138,7 @@
 						"format", configuration,

 						ATTR_SECOND_SYMBEX_OUTPUT_GRAPHVIZ_FORMAT_SPEC,

 						DEFAULT_SYMBEX_OUTPUT_GRAPHVIZ_FORMAT_SPEC,

-						TraceElementKind.UNDEFINED);

+						TraceElementKind.RAW_ATTRIBUTE);

 

 		serializerWorker.setFormat( format );

 

diff --git a/execution/org.eclipse.efm.execution.core/src/org/eclipse/efm/execution/core/workflow/serializer/TTCNTraceSerializerWorkerCustomImpl.java b/execution/org.eclipse.efm.execution.core/src/org/eclipse/efm/execution/core/workflow/serializer/TTCNTraceSerializerWorkerCustomImpl.java
index 7de28a7..ea96aa6 100644
--- a/execution/org.eclipse.efm.execution.core/src/org/eclipse/efm/execution/core/workflow/serializer/TTCNTraceSerializerWorkerCustomImpl.java
+++ b/execution/org.eclipse.efm.execution.core/src/org/eclipse/efm/execution/core/workflow/serializer/TTCNTraceSerializerWorkerCustomImpl.java
@@ -28,7 +28,7 @@
 		implements IWorkflowConfigurationConstants {

 

 	protected TTCNTraceSerializerWorkerCustomImpl(

-			Director director, String name) {

+			final Director director, final String name) {

 		super();

 

 		setDirector(director);

@@ -36,7 +36,7 @@
 	}

 

 	protected TTCNTraceSerializerWorkerCustomImpl(

-			Director director, String name, String description) {

+			final Director director, final String name, final String description) {

 		super();

 

 		setDirector(director);

@@ -46,9 +46,9 @@
 

 

 	public static TTCNTraceSerializerWorkerCustomImpl create(

-			Director director, ILaunchConfiguration configuration) {

+			final Director director, final ILaunchConfiguration configuration) {

 

-		TTCNTraceSerializerWorkerCustomImpl serializerWorker =

+		final TTCNTraceSerializerWorkerCustomImpl serializerWorker =

 				new TTCNTraceSerializerWorkerCustomImpl(

 						director, "TTCN_trace_generator");

 

@@ -62,17 +62,17 @@
 //		serializerWorker.setFormat( format );

 //

 //

-		List<String> specification = DEFAULT_TTCN_TRACE_SPECIFICATION;

+		final List<String> specification = DEFAULT_TTCN_TRACE_SPECIFICATION;

 

-		TraceSpecificationCustomImpl trace =

+		final TraceSpecificationCustomImpl trace =

 				TraceSpecificationCustomImpl.create("trace",

-						specification, TraceElementKind.UNDEFINED);

+						specification, TraceElementKind.RAW_ATTRIBUTE);

 //		TraceSpecificationCustomImpl trace =

 //				TraceSpecificationCustomImpl.create(

 //						"trace", configuration,

 //						ATTR_TTCN_TRACE_SPECIFICATION,

 //						DEFAULT_TTCN_TRACE_SPECIFICATION,

-//						TraceElementKind.UNDEFINED);

+//						TraceElementKind.RAW_ATTRIBUTE);

 

 		serializerWorker.setTrace( trace );

 

@@ -81,7 +81,7 @@
 		try {

 			str = configuration.getAttribute(

 					ATTR_TTCN_FOLDER_NAME, DEFAULT_TTCN_FOLDER_NAME);

-		} catch( CoreException e ) {

+		} catch( final CoreException e ) {

 			e.printStackTrace();

 

 			str = DEFAULT_TTCN_FOLDER_NAME;

@@ -93,7 +93,7 @@
 			enabledCustomization = configuration.getAttribute(

 					ATTR_TTCN_ENABLED_CUSTOMIZATION,

 					DEFAULT_TTCN_ENABLED_CUSTOMIZATION);

-		} catch( CoreException e ) {

+		} catch( final CoreException e ) {

 			e.printStackTrace();

 

 			enabledCustomization = DEFAULT_TTCN_ENABLED_CUSTOMIZATION;

@@ -108,7 +108,7 @@
 				str = configuration.getAttribute(

 						ATTR_TTCN_CONTROL_MODULE_NAME,

 						DEFAULT_TTCN_CONTROL_MODULE_NAME);

-			} catch( CoreException e ) {

+			} catch( final CoreException e ) {

 				e.printStackTrace();

 

 				str = DEFAULT_TTCN_CONTROL_MODULE_NAME;

@@ -120,7 +120,7 @@
 				str = configuration.getAttribute(

 						ATTR_TTCN_DECLARATIONS_MODULE_NAME,

 						DEFAULT_TTCN_DECLARATIONS_MODULE_NAME);

-			} catch( CoreException e ) {

+			} catch( final CoreException e ) {

 				e.printStackTrace();

 

 				str = DEFAULT_TTCN_DECLARATIONS_MODULE_NAME;

@@ -132,7 +132,7 @@
 				str = configuration.getAttribute(

 						ATTR_TTCN_TEMPLATES_MODULE_NAME,

 						DEFAULT_TTCN_TEMPLATE_MODULE_NAME);

-			} catch( CoreException e ) {

+			} catch( final CoreException e ) {

 				e.printStackTrace();

 

 				str = DEFAULT_TTCN_TEMPLATE_MODULE_NAME;

@@ -145,7 +145,7 @@
 				str = configuration.getAttribute(

 						ATTR_TTCN_TESTCASES_MODULE_NAME,

 						DEFAULT_TTCN_TESTCASES_MODULE_NAME);

-			} catch( CoreException e ) {

+			} catch( final CoreException e ) {

 				e.printStackTrace();

 

 				str = DEFAULT_TTCN_TESTCASES_MODULE_NAME;

@@ -156,7 +156,7 @@
 				str = configuration.getAttribute(

 						ATTR_TTCN_TESTCASES_STARTING_WRAPPER,

 						DEFAULT_TTCN_TESTCASES_STARTING_WRAPPER);

-			} catch( CoreException e ) {

+			} catch( final CoreException e ) {

 				e.printStackTrace();

 

 				str = DEFAULT_TTCN_TESTCASES_STARTING_WRAPPER;

@@ -167,7 +167,7 @@
 				str = configuration.getAttribute(

 						ATTR_TTCN_TESTCASES_ENDING_WRAPPER,

 						DEFAULT_TTCN_TESTCASES_ENDING_WRAPPER);

-			} catch( CoreException e ) {

+			} catch( final CoreException e ) {

 				e.printStackTrace();

 

 				str = DEFAULT_TTCN_TESTCASES_ENDING_WRAPPER;

@@ -178,7 +178,7 @@
 				str = configuration.getAttribute(

 						ATTR_TTCN_TESTCASES_SENDING_WRAPPER,

 						DEFAULT_TTCN_TESTCASES_SENDING_WRAPPER);

-			} catch( CoreException e ) {

+			} catch( final CoreException e ) {

 				e.printStackTrace();

 

 				str = DEFAULT_TTCN_TESTCASES_SENDING_WRAPPER;

@@ -189,7 +189,7 @@
 				str = configuration.getAttribute(

 						ATTR_TTCN_TESTCASES_RECEIVING_WRAPPER,

 						DEFAULT_TTCN_TESTCASES_RECEIVING_WRAPPER);

-			} catch( CoreException e ) {

+			} catch( final CoreException e ) {

 				e.printStackTrace();

 

 				str = DEFAULT_TTCN_TESTCASES_RECEIVING_WRAPPER;

@@ -202,7 +202,7 @@
 				str = configuration.getAttribute(

 						ATTR_TTCN_ADAPTATION_MODULE_NAME,

 						DEFAULT_TTCN_ADAPTATION_MODULE_NAME);

-			} catch( CoreException e ) {

+			} catch( final CoreException e ) {

 				e.printStackTrace();

 

 				str = DEFAULT_TTCN_ADAPTATION_MODULE_NAME;

@@ -213,7 +213,7 @@
 				str = configuration.getAttribute(

 						ATTR_TTCN_ADAPTATION_UTILS_IMPL,

 						DEFAULT_TTCN_ADAPTATION_UTILS_IMPL);

-			} catch( CoreException e ) {

+			} catch( final CoreException e ) {

 				e.printStackTrace();

 

 				str = DEFAULT_TTCN_ADAPTATION_UTILS_IMPL;

@@ -224,7 +224,7 @@
 				str = configuration.getAttribute(

 						ATTR_TTCN_TESTCASES_STARTING_ENDING_IMPL,

 						DEFAULT_TTCN_TESTCASES_STARTING_ENDING_IMPL);

-			} catch( CoreException e ) {

+			} catch( final CoreException e ) {

 				e.printStackTrace();

 

 				str = DEFAULT_TTCN_TESTCASES_STARTING_ENDING_IMPL;

@@ -235,7 +235,7 @@
 				str = configuration.getAttribute(

 						ATTR_TTCN_TESTCASES_SENDING_IMPL,

 						DEFAULT_TTCN_TESTCASES_SENDING_IMPL);

-			} catch( CoreException e ) {

+			} catch( final CoreException e ) {

 				e.printStackTrace();

 

 				str = DEFAULT_TTCN_TESTCASES_SENDING_IMPL;

@@ -246,7 +246,7 @@
 				str = configuration.getAttribute(

 						ATTR_TTCN_TESTCASES_RECEIVING_IMPL,

 						DEFAULT_TTCN_TESTCASES_RECEIVING_IMPL);

-			} catch( CoreException e ) {

+			} catch( final CoreException e ) {

 				e.printStackTrace();

 

 				str = DEFAULT_TTCN_TESTCASES_RECEIVING_IMPL;

@@ -258,7 +258,7 @@
 	}

 

 

-	public void toWriter(PrettyPrintWriter writer) {

+	public void toWriter(final PrettyPrintWriter writer) {

 		writer.commentLine( getComment() );

 

 		writer.appendTab( "serializer#symbex#trace#ttcn" );

@@ -274,9 +274,9 @@
 

 		writer.appendEol( " {" );

 

-		PrettyPrintWriter writer2 = writer.itab2();

+		final PrettyPrintWriter writer2 = writer.itab2();

 

-		ManifestCustomImpl manifest = (ManifestCustomImpl) getManifest();

+		final ManifestCustomImpl manifest = (ManifestCustomImpl) getManifest();

 		if( manifest != null ) {

 			manifest.toWriter(writer2);

 		}

@@ -379,13 +379,13 @@
 		writer2.appendTabEol( "] // end implementation" );

 

 

-		TraceSpecificationCustomImpl format =

+		final TraceSpecificationCustomImpl format =

 				(TraceSpecificationCustomImpl) getFormat();

 		if( format != null ) {

 			format.toWriter( writer2 );

 		}

 

-		TraceSpecificationCustomImpl trace =

+		final TraceSpecificationCustomImpl trace =

 				(TraceSpecificationCustomImpl) getTrace();

 		if( trace != null ) {

 			trace.toWriter(writer2);

diff --git a/execution/org.eclipse.efm.execution.core/src/org/eclipse/efm/execution/core/workflow/test/OfflineTestWorkerCustomImpl.java b/execution/org.eclipse.efm.execution.core/src/org/eclipse/efm/execution/core/workflow/test/OfflineTestWorkerCustomImpl.java
index a7f8744..eab633b 100644
--- a/execution/org.eclipse.efm.execution.core/src/org/eclipse/efm/execution/core/workflow/test/OfflineTestWorkerCustomImpl.java
+++ b/execution/org.eclipse.efm.execution.core/src/org/eclipse/efm/execution/core/workflow/test/OfflineTestWorkerCustomImpl.java
@@ -150,6 +150,7 @@
 

 		writer.appendTab2Eol( "property [" )

 			.appendTab3Eol( "format = \"BASIC#XLIA\"" )

+			.appendTab3Eol( "slice  = true" )

 			.appendTab3Eol( "trace#folding  = true" )

 			.appendTab3Eol( "step#scheduler = '|i|'" )

 			.appendTab3Eol( "trace#reporting#size = 7" )

diff --git a/execution/org.eclipse.efm.execution.launchconfiguration/.gitignore b/execution/org.eclipse.efm.execution.launchconfiguration/.gitignore
index bbdfc34..35139e0 100644
--- a/execution/org.eclipse.efm.execution.launchconfiguration/.gitignore
+++ b/execution/org.eclipse.efm.execution.launchconfiguration/.gitignore
@@ -1,2 +1,4 @@
 /bin/
 *.md.html
+/plugin-orig.xml
+/plugin_menu_test.xml
diff --git a/execution/org.eclipse.efm.execution.launchconfiguration/src/org/eclipse/efm/execution/launchconfiguration/job/action/ProfileExecutionAction.java b/execution/org.eclipse.efm.execution.launchconfiguration/src/org/eclipse/efm/execution/launchconfiguration/job/action/ProfileExecutionAction.java
index 9f46695..404f6b0 100644
--- a/execution/org.eclipse.efm.execution.launchconfiguration/src/org/eclipse/efm/execution/launchconfiguration/job/action/ProfileExecutionAction.java
+++ b/execution/org.eclipse.efm.execution.launchconfiguration/src/org/eclipse/efm/execution/launchconfiguration/job/action/ProfileExecutionAction.java
@@ -158,6 +158,10 @@
 		addActionToMenu(fMenu, new ProfileExecutionCountAction(
 				"Profile Execution until Terminate Action", Integer.MAX_VALUE),
 				accel++);
+
+		addActionToMenu(fMenu, new ProfileExecutionCountAction(
+				"Profile Execution up to FULL-Coverage", -1),
+				accel++);
 		new Separator("Profile_N_Executions").fill(fMenu, -1); //$NON-NLS-1$
 
 		addActionToMenu(fMenu, new ProfileExecutionCountAction(10), accel++);
diff --git a/execution/org.eclipse.efm.execution.launchconfiguration/src/org/eclipse/efm/execution/launchconfiguration/job/console/SymbexSpiderConsolePage.java b/execution/org.eclipse.efm.execution.launchconfiguration/src/org/eclipse/efm/execution/launchconfiguration/job/console/SymbexSpiderConsolePage.java
index 1bb4b8e..f28328f 100644
--- a/execution/org.eclipse.efm.execution.launchconfiguration/src/org/eclipse/efm/execution/launchconfiguration/job/console/SymbexSpiderConsolePage.java
+++ b/execution/org.eclipse.efm.execution.launchconfiguration/src/org/eclipse/efm/execution/launchconfiguration/job/console/SymbexSpiderConsolePage.java
@@ -698,11 +698,11 @@
 							fSpider.resetSpider(

 									fSymbexWorkflowProvider

 											.getSymbexlAnalysisProfileName(),

-									(bounds.length == 6)

+									(bounds.length >= 6)

 											? SPIDER_GEOMETRY.PENTAGON

 											: SPIDER_GEOMETRY.TETRAGON );

 

-							initSpider( spiderPositions(traceLine) );

+							initSpider( bounds );

 

 							disabledSpiderTrace = false;

 

diff --git a/execution/org.eclipse.efm.execution.launchconfiguration/src/org/eclipse/efm/execution/launchconfiguration/job/sew/ProfileSymbexWorkflow.java b/execution/org.eclipse.efm.execution.launchconfiguration/src/org/eclipse/efm/execution/launchconfiguration/job/sew/ProfileSymbexWorkflow.java
index 168e85e..9c4409c 100644
--- a/execution/org.eclipse.efm.execution.launchconfiguration/src/org/eclipse/efm/execution/launchconfiguration/job/sew/ProfileSymbexWorkflow.java
+++ b/execution/org.eclipse.efm.execution.launchconfiguration/src/org/eclipse/efm/execution/launchconfiguration/job/sew/ProfileSymbexWorkflow.java
@@ -15,6 +15,7 @@
 import java.io.FileWriter;

 import java.io.IOException;

 import java.io.PrintWriter;

+import java.util.Calendar;

 

 import org.eclipse.core.runtime.IPath;

 import org.eclipse.efm.execution.core.IWorkflowSpiderConfigurationUtils;

@@ -30,9 +31,16 @@
 

 	protected int fExecutionCount;

 

+	protected boolean fStopWhenFullyCoverage;

+

 	protected long fTotalExecutionTime_COV;

 	protected long fTotalExecutionTime_NOT;

 

+	protected long fTotalExecutionStepCount;

+	protected long fTotalExecutionContextCount;

+	protected long fTotalExecutionHeightMax;

+	protected long fTotalExecutionWidthMax;

+

 	protected boolean fFullyCoverageFlag;

 	protected int fFullyCoverageCount;

 

@@ -41,15 +49,31 @@
 			final SymbexWorkflowProvider symbexWorkflow, final int executionCount) {

 		super(symbexWorkflow);

 

+		final Calendar CALENDAR = Calendar.getInstance();

 		this.fReportFilePath  = symbexWorkflow.getSymbexWorkflowPath()

-				.removeFileExtension().addFileExtension("profile.csv");

+				.removeFileExtension().addFileExtension(

+						"profile_" + CALENDAR.get(Calendar.HOUR_OF_DAY)

+						+ "_" + CALENDAR.get(Calendar.MINUTE) + ".csv");

 

 		this.fLoggerWriter = null;

 

-		this.fExecutionCount = executionCount;

+		if( executionCount > 0 ) {

+			this.fExecutionCount = executionCount;

+			this.fStopWhenFullyCoverage = false;

+		}

+		else {

+			this.fExecutionCount = Integer.MAX_VALUE;

+			this.fStopWhenFullyCoverage = true;

+		}

 

-		this.fTotalExecutionTime_COV = 0;

-		this.fTotalExecutionTime_NOT = 0;

+

+		this.fTotalExecutionTime_COV     = 0;

+		this.fTotalExecutionTime_NOT     = 0;

+

+		this.fTotalExecutionStepCount    = 0;

+		this.fTotalExecutionContextCount = 0;

+		this.fTotalExecutionHeightMax    = 0;

+		this.fTotalExecutionWidthMax     = 0;

 

 		this.fFullyCoverageFlag = false;

 		this.fFullyCoverageCount = 0;

@@ -65,7 +89,7 @@
 	 */

 	@Override

 	public String getSymbexlAnalysisProfileName() {

-		return "PROFILE EXECUTION: " + super.fIndex + " / " + this.fExecutionCount;

+		return "PROFILING EXECUTION: " + super.fIndex + " / " + this.fExecutionCount;

 	}

 

 	/*

@@ -97,7 +121,10 @@
 

 	@Override

 	public boolean hasNext() {

-		return (super.fIndex <= this.fExecutionCount) ;

+		if( this.fStopWhenFullyCoverage && fFullyCoverageFlag) {

+			return false;

+		}

+		return (super.fIndex <= this.fExecutionCount);

 	}

 

 	@Override

@@ -135,38 +162,122 @@
 	public void logHeader(final PrintWriter logger) {

 		logger.print( "Index" );

 		logger.print( CSV_SEPARATOR );

+

 		logger.print( "Coverage" );

 		logger.print( CSV_SEPARATOR );

+

 		logger.print( "Step" );

 		logger.print( CSV_SEPARATOR );

+		logger.print( "Context" );

+		logger.print( CSV_SEPARATOR );

+		logger.print( "Height" );

+		logger.print( CSV_SEPARATOR );

 

 		logger.print( "Execution Time" );

 

 		logger.println();

 		logger.flush();

-		logger.flush();

+	}

+

+	public void reportStatistic(final PrintWriter logger) {

+		logger.println();

+

+		logger.print( "Average Step" );

+		logger.print( CSV_SEPARATOR );

+

+		logger.print( "Context" );

+		logger.print( CSV_SEPARATOR );

+

+		logger.print( "Height" );

+		logger.print( CSV_SEPARATOR );

+

+		logger.print( " Width" );

+		logger.print( CSV_SEPARATOR );

+

+		logger.print( "100% Time" );

+		logger.print( CSV_SEPARATOR );

+

+		logger.print( "@->Date" );

+

+		logger.println();

+

+		logger.format( "%12.1f",

+				(double)this.fTotalExecutionStepCount / this.fFullyCoverageCount );

+		logger.print( CSV_SEPARATOR );

+

+		logger.format( "%7.1f",

+				(double)this.fTotalExecutionContextCount / this.fFullyCoverageCount );

+		logger.print( CSV_SEPARATOR );

+

+		logger.format( "%6.1f",

+				(double)this.fTotalExecutionHeightMax / this.fFullyCoverageCount );

+		logger.print( CSV_SEPARATOR );

+

+		logger.format( "%6.1f",

+				(double)this.fTotalExecutionWidthMax / this.fFullyCoverageCount );

+		logger.print( CSV_SEPARATOR );

+

+

+		logger.format( "%9.1f",

+				(double)this.fTotalExecutionTime_COV / this.fFullyCoverageCount );

+		logger.print( CSV_SEPARATOR );

+

+		logger.format( "%tT", Calendar.getInstance().getTime() );

+

+		logger.println();

+

 	}

 

 	@Override

 	public void finalize() {

+		reportStatistic(fLoggerWriter);

+

 		fLoggerWriter.println();

 

 		fLoggerWriter.print( "Total : " );

-		fLoggerWriter.println( this.fExecutionCount );

+		fLoggerWriter.println( super.fIndex - 1 );//Math.min(this.fExecutionCount, super.fIndex) );

 		fLoggerWriter.print( "100 % : " );

 		fLoggerWriter.println( this.fFullyCoverageCount );

 

+

+		fLoggerWriter.print( "Average Execution Step Count   : " );

+		fLoggerWriter.println(

+				(double)this.fTotalExecutionStepCount / this.fFullyCoverageCount );

+

+		fLoggerWriter.println();

+

+		fLoggerWriter.print( "Average Execution Context Count: " );

+		fLoggerWriter.println(

+				(double)this.fTotalExecutionContextCount / this.fFullyCoverageCount );

+

+		fLoggerWriter.println();

+

+		fLoggerWriter.print( "Average Execution Height: " );

+		fLoggerWriter.println(

+				(double)this.fTotalExecutionHeightMax / this.fFullyCoverageCount );

+

+		fLoggerWriter.print( "Average Execution Width : " );

+		fLoggerWriter.println(

+				(double)this.fTotalExecutionWidthMax / this.fFullyCoverageCount );

+

+		fLoggerWriter.println();

+

 		fLoggerWriter.print( "Average Fully Coverage Time: " );

-		fLoggerWriter.println( (double)fTotalExecutionTime_COV / this.fFullyCoverageCount );

+		fLoggerWriter.println(

+				(double)this.fTotalExecutionTime_COV / this.fFullyCoverageCount );

 

 		fLoggerWriter.print( "Average Non Coverage Time  : " );

-		fLoggerWriter.println( (double)fTotalExecutionTime_NOT /

+		fLoggerWriter.println( (double)this.fTotalExecutionTime_NOT /

 				(this.fExecutionCount - this.fFullyCoverageCount) );

 

+		fLoggerWriter.println();

+

+		fLoggerWriter.println( Calendar.getInstance().getTime() );

+

+

 		fLoggerWriter.close();

 	}

 

-

 	/*

 	 * LOGGING

 	 */

@@ -193,6 +304,11 @@
 			++this.fFullyCoverageCount;

 			this.fTotalExecutionTime_COV += super.fExecutionTime;

 

+			this.fTotalExecutionStepCount    += fExecutionStepCount;

+			this.fTotalExecutionContextCount += fExecutionContextCount;

+			this.fTotalExecutionHeightMax    += fExecutionHeightMax;

+			this.fTotalExecutionWidthMax     += fExecutionWidthMax;

+

 			// Force l'arrêt avec hasNext() --> return (super.fIndex < this.fExecutionCount) ;

 //			super.fIndex = this.fExecutionCount;

 		}

@@ -207,15 +323,37 @@
 	public void logSymbex(final PrintWriter logger) {

 		logger.format( "%5d" , super.fIndex );

 		logger.print( CSV_SEPARATOR );

-		logger.format( "%8s" , (this.fFullyCoverageFlag ? "YES" : "NO") );

+

+		logger.format( "%8s" , (this.fFullyCoverageFlag ? "100 %"

+				: super.fCoverageCount + " / " + super.fCoverageTotal) );

 		logger.print( CSV_SEPARATOR );

-		logger.format( "%4d" , super.fExecutionStepCount - 1 );

+

+		logger.format( "%4d" , super.fExecutionStepCount );

+		logger.print( CSV_SEPARATOR );

+

+		logger.format( "%7d" , super.fExecutionContextCount );

+		logger.print( CSV_SEPARATOR );

+

+		logger.format( "%6d" , super.fExecutionHeightMax );

 		logger.print( CSV_SEPARATOR );

 

 		logger.format( "%11d" , super.fExecutionTime );

 		logger.print( " ms" );

 

-		logger.println();

+		if( ((super.fIndex % 5) == 0) && ((super.fIndex < this.fExecutionCount)) ) {

+			logger.println();

+

+			reportStatistic(logger);

+			logger.flush();

+

+			logger.println();

+			logHeader(fLoggerWriter);

+		}

+		else {

+			logger.println();

+		}

+

+		logger.flush();

 		logger.flush();

 	}

 

diff --git a/execution/org.eclipse.efm.execution.launchconfiguration/src/org/eclipse/efm/execution/launchconfiguration/job/sew/SymbexWorkflowProvider.java b/execution/org.eclipse.efm.execution.launchconfiguration/src/org/eclipse/efm/execution/launchconfiguration/job/sew/SymbexWorkflowProvider.java
index 968bf1d..30b26f8 100644
--- a/execution/org.eclipse.efm.execution.launchconfiguration/src/org/eclipse/efm/execution/launchconfiguration/job/sew/SymbexWorkflowProvider.java
+++ b/execution/org.eclipse.efm.execution.launchconfiguration/src/org/eclipse/efm/execution/launchconfiguration/job/sew/SymbexWorkflowProvider.java
@@ -55,6 +55,9 @@
 	protected long fExecutionHeightMax;

 	protected long fExecutionWidthMax;

 

+	protected long fCoverageCount;

+	protected long fCoverageTotal;

+

 	protected long fExecutionTime;

 

 	protected long fDeadlockCount;

@@ -262,6 +265,9 @@
 		this.fExecutionHeightMax    = 0;

 		this.fExecutionWidthMax     = 0;

 

+		this.fCoverageCount = 0;

+		this.fCoverageTotal = 0;

+

 		this.fExecutionTime = 0;

 

 		this.fDeadlockCount = 0;

@@ -406,7 +412,10 @@
 	 */

     final static Pattern PATTERN_EXECUTION_STOP_STATS = Pattern.compile(

     		"stop:\\s*(\\d+)\\s*,\\s*context:\\s*(\\d+)\\s*,"

-    		+ "\\s*height:\\s*(\\d+)\\s*,\\s*width:\\s*(\\d+).*");

+    		+ "\\s*height:\\s*(\\d+)\\s*,\\s*width:\\s*(\\d+)(.*)");

+

+    final static Pattern PATTERN_EXECUTION_COVERAGE_STOP_STATS = Pattern.compile(

+    		".+coverage:\\s*(\\d+)\\s*/\\s*(\\d+)\\s*");

 

     final static Pattern PATTERN_EXECUTION_TIME = Pattern.compile(

     		"\\$time<\\s*(\\d+)\\s*ms.+");

@@ -458,6 +467,12 @@
 			this.fExecutionContextCount = Integer.parseUnsignedInt( matcher.group(2) );

 			this.fExecutionHeightMax = Integer.parseUnsignedInt( matcher.group(3) );

 			this.fExecutionWidthMax = Integer.parseUnsignedInt( matcher.group(4) );

+

+			final String rest = matcher.group(5);

+			if( (matcher = PATTERN_EXECUTION_COVERAGE_STOP_STATS.matcher(rest)).find() ) {

+				this.fCoverageCount = Integer.parseUnsignedInt( matcher.group(1) );

+				this.fCoverageTotal = Integer.parseUnsignedInt( matcher.group(2) );

+			}

 		}

 

 		else if( (matcher = PATTERN_EXECUTION_TIME.matcher(line)).find() ) {

diff --git a/execution/org.eclipse.efm.execution.launchconfiguration/src/org/eclipse/efm/execution/launchconfiguration/ui/tabs/SymbexOptionTab.java b/execution/org.eclipse.efm.execution.launchconfiguration/src/org/eclipse/efm/execution/launchconfiguration/ui/tabs/SymbexOptionTab.java
index 8d89de1..5821673 100644
--- a/execution/org.eclipse.efm.execution.launchconfiguration/src/org/eclipse/efm/execution/launchconfiguration/ui/tabs/SymbexOptionTab.java
+++ b/execution/org.eclipse.efm.execution.launchconfiguration/src/org/eclipse/efm/execution/launchconfiguration/ui/tabs/SymbexOptionTab.java
@@ -28,6 +28,6 @@
 

 	@Override

 	public String getName() {

-		return "SymbEx << INCUBATION >>";

+		return "SymbEx";

 	}

 }