Important packaging changes.

1. Update to 0.5.0!
2. We're moving build back down to 0.7.2 for Xpand, etc.. because of performance issues with XPand 0.8.0 == up to 40x slowdown.
3. We're forcing use of 0.7.x for AMf for same reasons.
4. Rebuilt all xtext stuff for xtext 0.7.2.
diff --git a/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.testing.ide/META-INF/MANIFEST.MF b/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.testing.ide/META-INF/MANIFEST.MF
index 7b37a72..111a2f8 100644
--- a/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.testing.ide/META-INF/MANIFEST.MF
+++ b/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.testing.ide/META-INF/MANIFEST.MF
@@ -6,18 +6,18 @@
 Bundle-Activator: org.eclipse.amp.amf.testing.ide.Activator
 Require-Bundle: org.eclipse.ui,
  org.eclipse.core.runtime,
- org.eclipse.amp.amf.acore;bundle-version="0.2.0",
- org.eclipse.amp.amf.parameters;bundle-version="0.2.0",
- org.eclipse.amp.amf.testing;bundle-version="0.2.0",
+ org.eclipse.amp.amf.acore;bundle-version="0.5.0",
+ org.eclipse.amp.amf.parameters;bundle-version="0.5.0",
+ org.eclipse.amp.amf.testing;bundle-version="0.5.0",
  org.eclipse.emf.ecore;bundle-version="2.5.0",
  org.eclipse.core.resources;bundle-version="3.5.0",
  org.ascape.core;bundle-version="5.2.0",
- org.eclipse.amp.escape.ide;bundle-version="0.2.0",
- org.eclipse.amp.axf.core;bundle-version="0.2.0",
- org.eclipse.amp.escape.ascape;bundle-version="0.2.0",
- org.eclipse.amp.axf.ide;bundle-version="0.2.0",
+ org.eclipse.amp.escape.ide;bundle-version="0.5.0",
+ org.eclipse.amp.axf.core;bundle-version="0.5.0",
+ org.eclipse.amp.escape.ascape;bundle-version="0.5.0",
+ org.eclipse.amp.axf.ide;bundle-version="0.5.0",
  org.eclipse.emf.ecore.xmi;bundle-version="2.5.0",
- org.eclipse.amp.amf.abase;bundle-version="0.2.0"
+ org.eclipse.amp.amf.abase;bundle-version="0.5.0"
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
 Import-Package: org.apache.commons.lang,
diff --git a/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.testing.ide/src/org/eclipse/amp/amf/testing/ide/ExecuteTestHandler.java b/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.testing.ide/src/org/eclipse/amp/amf/testing/ide/ExecuteTestHandler.java
index 8029fb9..fbc252f 100644
--- a/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.testing.ide/src/org/eclipse/amp/amf/testing/ide/ExecuteTestHandler.java
+++ b/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.testing.ide/src/org/eclipse/amp/amf/testing/ide/ExecuteTestHandler.java
@@ -18,7 +18,6 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.commons.lang.time.DateFormatUtils;
 import org.ascape.runtime.Runner;
 import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;
@@ -63,27 +62,12 @@
             }
             Runner.setDisplayGraphics(false);
 
-            String name = getName(selList);
-            name += "-" + DateFormatUtils.format(System.currentTimeMillis(), "yyMMddHHmm-SSSS");
 
-            new TestRunSet(project, testResources, name, getRunsPerTest()).run();
+            new TestRunSet(project, testResources, getRunsPerTest()).run();
         }
         return null;
     }
 
-    private String getName(List selList) {
-        String name = "";
-        if (selList.size() == 1 && selList.get(0) instanceof IFolder) {
-            IFolder folder = (IFolder) selList.get(0);
-            name = folder.getProjectRelativePath().toPortableString().replace("/", "_");
-            return name;
-        }
-        for (IResource res : testResources) {
-            name += res.getName().substring(0, Math.min(5, res.getName().length() - 1)) + "_";
-        }
-        name = name.substring(0, name.length() - 2);
-        return name;
-    }
 
     private void addResource(IResource res) {
         if (res instanceof IFile) {
diff --git a/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.testing.ide/src/org/eclipse/amp/amf/testing/ide/TestRunSet.java b/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.testing.ide/src/org/eclipse/amp/amf/testing/ide/TestRunSet.java
index 53504a8..5336299 100644
--- a/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.testing.ide/src/org/eclipse/amp/amf/testing/ide/TestRunSet.java
+++ b/org.eclipse.amp.escape/plugins/org.eclipse.amp.escape.testing.ide/src/org/eclipse/amp/amf/testing/ide/TestRunSet.java
@@ -12,257 +12,277 @@
  *
  * </copyright>
  *
-*/
-package org.eclipse.amp.amf.testing.ide;

-

-import java.io.IOException;

-import java.util.ArrayList;

-import java.util.Collections;

-import java.util.HashMap;

-import java.util.List;

-import java.util.Map;

-

-import org.eclipse.amp.amf.abase.IInterpreterProvider;

-import org.eclipse.amp.amf.parameters.AParFactory;

-import org.eclipse.amp.amf.testing.ATestInterpreter;

-import org.eclipse.amp.amf.testing.aTest.Model;

-import org.eclipse.amp.amf.testing.aTest.TestMember;

-import org.eclipse.amp.amf.testing.ares.ResultType;

-import org.eclipse.amp.amf.testing.ares.RunSet;

-import org.eclipse.amp.amf.testing.ares.impl.AresFactoryImpl;

-import org.eclipse.core.resources.IFile;

-import org.eclipse.core.resources.IFolder;

-import org.eclipse.core.resources.IProject;

-import org.eclipse.core.resources.IResource;

-import org.eclipse.core.runtime.IPath;

-import org.eclipse.core.runtime.IProgressMonitor;

-import org.eclipse.core.runtime.IStatus;

-import org.eclipse.core.runtime.MultiStatus;

-import org.eclipse.core.runtime.Status;

-import org.eclipse.core.runtime.jobs.Job;

-import org.eclipse.emf.common.util.URI;

-import org.eclipse.emf.ecore.resource.Resource;

-import org.eclipse.emf.ecore.resource.ResourceSet;

-import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;

-import org.eclipse.emf.ecore.xmi.XMLParserPool;

-import org.eclipse.emf.ecore.xmi.XMLResource;

-import org.eclipse.emf.ecore.xmi.impl.XMLParserPoolImpl;

-

-public class TestRunSet {

-

+ */
+package org.eclipse.amp.amf.testing.ide;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang.time.DateFormatUtils;
+import org.eclipse.amp.amf.abase.IInterpreterProvider;
+import org.eclipse.amp.amf.parameters.AParFactory;
+import org.eclipse.amp.amf.testing.ATestInterpreter;
+import org.eclipse.amp.amf.testing.aTest.Model;
+import org.eclipse.amp.amf.testing.aTest.TestMember;
+import org.eclipse.amp.amf.testing.ares.ResultType;
+import org.eclipse.amp.amf.testing.ares.RunSet;
+import org.eclipse.amp.amf.testing.ares.impl.AresFactoryImpl;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+import org.eclipse.emf.ecore.xmi.XMLParserPool;
+import org.eclipse.emf.ecore.xmi.XMLResource;
+import org.eclipse.emf.ecore.xmi.impl.XMLParserPoolImpl;
+
+public class TestRunSet {
+
     // TODO allow maximum threads to be preferences

-    private static final int MAX_THREADS = 8;

-

-    String name;

-

-    private Resource aResResource;

-

-    RunSet runSet;

-

-    int testRunCount;

-    int testInFlightCount;

-    int testCompleteCount;

-    int testSuccessCount;

-

-    List<IResource> uniqueTests;

-

-    private List lookupTable = new ArrayList();

-

-    private IProgressMonitor monitor;

-

-    private MultiStatus status;

-

-    private IInterpreterProvider aParPool;

-

-    /**

-     * The total number of tests waiting including multiple runs per resource

-     */

-    private List<Resource> testsWaiting;

-

-    IProject project;

-

-    int runsPerTest;

-

-    private XMLParserPool parserPool = new XMLParserPoolImpl();

-

-    private Map nameToFeatureMap = new HashMap();

-

-    private ResourceSet resourceSet;

-

-    public TestRunSet(IProject project, List<IResource> testResources, String name, int runsPerTest) {

-        super();

-        this.uniqueTests = testResources;

-        this.name = name;

+    private static final int MAX_THREADS = 8;
+
+    String name;
+
+    private Resource aResResource;
+
+    RunSet runSet;
+
+    int testRunCount;
+    int testInFlightCount;
+    int testCompleteCount;
+    int testSuccessCount;
+
+    List<IResource> uniqueTests;
+
+    private List lookupTable = new ArrayList();
+
+    private IProgressMonitor monitor;
+
+    private MultiStatus status;
+
+    private IInterpreterProvider aParPool;
+
+    /**
+     * The total number of tests waiting including multiple runs per resource
+     */
+    private List<Resource> testsWaiting;
+
+    IProject project;
+
+    int runsPerTest;
+
+    private XMLParserPool parserPool = new XMLParserPoolImpl();
+
+    private Map nameToFeatureMap = new HashMap();
+
+    private ResourceSet resourceSet;
+
+    public TestRunSet(IProject project, List<IResource> testResources, int runsPerTest) {
+        super();
+        this.uniqueTests = testResources;
         // use first test location for project

-        this.project = project;

-        this.runsPerTest = runsPerTest;

-    }

-

-    protected void initialize() {

-        monitor.subTask("Creating Test Resource");

-        resourceSet = new ResourceSetImpl();

-

-        resourceSet.getLoadOptions().put(XMLResource.OPTION_DEFER_ATTACHMENT, Boolean.TRUE);

-        resourceSet.getLoadOptions().put(XMLResource.OPTION_DEFER_IDREF_RESOLUTION, Boolean.TRUE);

-        resourceSet.getLoadOptions().put(XMLResource.OPTION_USE_DEPRECATED_METHODS, Boolean.TRUE);

-        resourceSet.getLoadOptions().put(XMLResource.OPTION_USE_PARSER_POOL, parserPool);

-        resourceSet.getLoadOptions().put(XMLResource.OPTION_USE_XML_NAME_TO_FEATURE_MAP, nameToFeatureMap);

-

-        aParPool = AParFactory.createPooled(resourceSet);

-

-        monitor.subTask("Creating Results");

-        IFolder resultsFolder = project.getFolder("results");

-        IFile resultsFile = resultsFolder.getFile(name + ".ares");

-        URI fileURI = URI.createPlatformResourceURI(project.getName() + "/" + resultsFile.getProjectRelativePath(),

-                                                    true);

-        aResResource = resourceSet.createResource(fileURI);

-

-        runSet = AresFactoryImpl.eINSTANCE.createRunSet();

-

-        if (runSet != null) {

-            aResResource.getContents().add(runSet);

-        } else {

-            throw new RuntimeException("Couldn't create resource.");

-        }

-        if (monitor.isCanceled()) {

-            return;

-        }

-        saveResults();

-    }

-

-

-    private synchronized void saveResults() {

-        Map<Object, Object> saveOptions = new HashMap<Object, Object>();

-        saveOptions.put(XMLResource.OPTION_CONFIGURATION_CACHE, Boolean.TRUE);

-        saveOptions.put(XMLResource.OPTION_USE_CACHED_LOOKUP_TABLE, lookupTable);

-        monitor.subTask("Saving Results");

-        try {

-            aResResource.save(saveOptions);

-        } catch (IOException e) {

-            throw new RuntimeException(e);

-        }

-    }

-

-    public void runTests(final IProgressMonitor monitor, final MultiStatus status) {

-        this.monitor = monitor;

-        this.status = status;

-        monitor.beginTask("Executing Escape Tests: " + name, uniqueTests.size());

-

-        initialize();

-        monitor.subTask("Preparing Tests");

-        testsWaiting = Collections.synchronizedList(new ArrayList<Resource>());

-        for (IResource resource : uniqueTests) {

-

-            IPath modelPath = ((IFile) resource).getFullPath();

-            URI aTestURI = URI.createPlatformResourceURI(modelPath.toString(), true);

-            Resource atestResource = resourceSet.getResource(aTestURI, true);

-            Model testmodel = (Model) atestResource.getContents().get(0);

-            if (testmodel.getContains().size() == 0) {

-                for (int i = 0; i < runsPerTest; i++) {

-                    testsWaiting.add(atestResource);

-                }

-            } else {

-                for (TestMember member : testmodel.getContains()) {

-                    Resource emfResource = resourceSet.getResource(URI.createURI(ATestInterpreter.convertURI(member)),

-                                                                   true);

-                    for (int i = 0; i < runsPerTest; i++) {

-                        testsWaiting.add(emfResource);

-                    }

-                }

-            }

-        }

+        this.project = project;
+        this.runsPerTest = runsPerTest;
+    }
+
+    private String getName() {
+        String name = "";
+        if (uniqueTests.size() < 3) {
+            for (IResource res : uniqueTests) {
+                name += res.getProjectRelativePath().removeFileExtension().lastSegment() + "_";
+            }
+        } else {
+            for (IResource res : uniqueTests) {
+                name += res.getName().substring(0, Math.min(5, res.getName().length() - 1)) + "_";
+            }
+        }
+        name += DateFormatUtils.format(System.currentTimeMillis(), "MM-dd-yy_HH-mm-S");
+        return name;
+    }
+
+    protected void initialize() {
+        monitor.subTask("Creating Test Resource");
+        resourceSet = new ResourceSetImpl();
+
+        resourceSet.getLoadOptions().put(XMLResource.OPTION_DEFER_ATTACHMENT, Boolean.TRUE);
+        resourceSet.getLoadOptions().put(XMLResource.OPTION_DEFER_IDREF_RESOLUTION, Boolean.TRUE);
+        resourceSet.getLoadOptions().put(XMLResource.OPTION_USE_DEPRECATED_METHODS, Boolean.TRUE);
+        resourceSet.getLoadOptions().put(XMLResource.OPTION_USE_PARSER_POOL, parserPool);
+        resourceSet.getLoadOptions().put(XMLResource.OPTION_USE_XML_NAME_TO_FEATURE_MAP, nameToFeatureMap);
+
+        aParPool = AParFactory.createPooled(resourceSet);
+
+        monitor.subTask("Creating Results");
+
+        String name = getName();
+
+        IResource firstResource = uniqueTests.get(0);
+        // Get rid of test folder
+        IPath projectPath = new Path("results").append(
+                                                       firstResource.getProjectRelativePath().removeFirstSegments(1)
+                                                       .removeLastSegments(1)).append(name + ".ares");
+
+        URI fileURI = URI.createPlatformResourceURI(project.getName() + "/" + projectPath, true);
+        aResResource = resourceSet.createResource(fileURI);
+
+        runSet = AresFactoryImpl.eINSTANCE.createRunSet();
+
+        if (runSet != null) {
+            aResResource.getContents().add(runSet);
+        } else {
+            throw new RuntimeException("Couldn't create resource.");
+        }
+        if (monitor.isCanceled()) {
+            return;
+        }
+        saveResults();
+    }
+
+    private synchronized void saveResults() {
+        Map<Object, Object> saveOptions = new HashMap<Object, Object>();
+        saveOptions.put(XMLResource.OPTION_CONFIGURATION_CACHE, Boolean.TRUE);
+        saveOptions.put(XMLResource.OPTION_USE_CACHED_LOOKUP_TABLE, lookupTable);
+        monitor.subTask("Saving Results");
+        try {
+            aResResource.save(saveOptions);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public void runTests(final IProgressMonitor monitor, final MultiStatus status) {
+        this.monitor = monitor;
+        this.status = status;
+        monitor.beginTask("Executing Escape Tests: " + name, uniqueTests.size());
+
+        initialize();
+        monitor.subTask("Preparing Tests");
+        testsWaiting = Collections.synchronizedList(new ArrayList<Resource>());
+        for (IResource resource : uniqueTests) {
+
+            IPath modelPath = ((IFile) resource).getFullPath();
+            URI aTestURI = URI.createPlatformResourceURI(modelPath.toString(), true);
+            Resource atestResource = resourceSet.getResource(aTestURI, true);
+            Model testmodel = (Model) atestResource.getContents().get(0);
+            if (testmodel.getContains().size() == 0) {
+                for (int i = 0; i < runsPerTest; i++) {
+                    testsWaiting.add(atestResource);
+                }
+            } else {
+                for (TestMember member : testmodel.getContains()) {
+                    Resource emfResource = resourceSet.getResource(URI.createURI(ATestInterpreter.convertURI(member)),
+                                                                   true);
+                    for (int i = 0; i < runsPerTest; i++) {
+                        testsWaiting.add(emfResource);
+                    }
+                }
+            }
+        }
         // Release the unique tests so that the underlying resources can be gc'd when individual tests are removed.

-        uniqueTests = null;

-        testRunCount = testsWaiting.size();

-        testCompleteCount = 0;

-        testSuccessCount = 0;

-

-        fillThreads();

-        while (testCompleteCount < testRunCount && !monitor.isCanceled()) {

-            try {

-                Thread.sleep(100);

-            } catch (InterruptedException e) {

-            }

-        }

-        if (!monitor.isCanceled()) {

-            if (testSuccessCount == testRunCount) {

-                runSet.setResult(ResultType.SUCCESS);

-            } else {

-                runSet.setResult(ResultType.FAILURE);

-            }

-            saveResults();

-        }

-        monitor.done();

-    }

-

-    private synchronized void fillThreads() {

-        monitor.subTask("(Filling Threads)");

-        while (testsWaiting.size() > 0 && testInFlightCount < MAX_THREADS && !monitor.isCanceled()) {

-            final Resource nextATest = testsWaiting.remove(0);

-            testInFlightCount++;

+        uniqueTests = null;
+        testRunCount = testsWaiting.size();
+        testCompleteCount = 0;
+        testSuccessCount = 0;
+
+        fillThreads();
+        while (testCompleteCount < testRunCount && !monitor.isCanceled()) {
+            try {
+                Thread.sleep(100);
+            } catch (InterruptedException e) {
+            }
+        }
+        if (!monitor.isCanceled()) {
+            if (testSuccessCount == testRunCount) {
+                runSet.setResult(ResultType.SUCCESS);
+            } else {
+                runSet.setResult(ResultType.FAILURE);
+            }
+            saveResults();
+        }
+        monitor.done();
+    }
+
+    private synchronized void fillThreads() {
+        monitor.subTask("(Filling Threads)");
+        while (testsWaiting.size() > 0 && testInFlightCount < MAX_THREADS && !monitor.isCanceled()) {
+            final Resource nextATest = testsWaiting.remove(0);
+            testInFlightCount++;
             // We don't want to block on load interpreter

-            new Thread() {

-                public void run() {

-                    TestRun nextRun = new TestRun(TestRunSet.this, runSet, project, nextATest, aParPool);

-                    nextRun.runTest(monitor, status, false);

-                };

-            }.start();

-            updateMonitor();

-        }

-    }

-

-    public void run() {

-        Job escapeRun = new Job("Run " + name) {

-            protected IStatus run(IProgressMonitor monitor) {

-                final MultiStatus status = new MultiStatus("org.eclipse.amp.amf.testing.ide", Status.OK,

-                                                           "Executing Tests", null);

-                runTests(monitor, status);

-                return status;

-            }

-        };

-        escapeRun.setPriority(Job.LONG);

-        escapeRun.schedule();

-    }

-

-    /**

-     * @param thread

-     */

-    public void testComplete(TestRun run, Throwable failureCondition) {

-        synchronized (this) {

-            if (run.getRun() != null && run.getRun().getResult() == ResultType.SUCCESS) {

-                testSuccessCount++;

-            }

-            testCompleteCount++;

-            testInFlightCount--;

-            if (failureCondition == null) {

-                runSet.getRuns().add(run.getRun());

-            }

-            fillThreads();

-        }

-        saveResults();

-        updateMonitor();

-        monitor.worked(1);

-    }

-

-    private void updateMonitor() {

+            new Thread() {
+                public void run() {
+                    TestRun nextRun = new TestRun(TestRunSet.this, runSet, project, nextATest, aParPool);
+                    nextRun.runTest(monitor, status, false);
+                };
+            }.start();
+            updateMonitor();
+        }
+    }
+
+    public void run() {
+        Job escapeRun = new Job("Run " + name) {
+            protected IStatus run(IProgressMonitor monitor) {
+                final MultiStatus status = new MultiStatus("org.eclipse.amp.amf.testing.ide", Status.OK,
+                                                           "Executing Tests", null);
+                runTests(monitor, status);
+                return status;
+            }
+        };
+        escapeRun.setPriority(Job.LONG);
+        escapeRun.schedule();
+    }
+
+    /**
+     * @param thread
+     */
+    public void testComplete(TestRun run, Throwable failureCondition) {
+        synchronized (this) {
+            if (run.getRun() != null && run.getRun().getResult() == ResultType.SUCCESS) {
+                testSuccessCount++;
+            }
+            testCompleteCount++;
+            testInFlightCount--;
+            if (failureCondition == null) {
+                runSet.getRuns().add(run.getRun());
+            }
+            fillThreads();
+        }
+        saveResults();
+        updateMonitor();
+        monitor.worked(1);
+    }
+
+    private void updateMonitor() {
         // Don't block on ui monitor update

-        monitor.subTask("Completed " + testCompleteCount + " of " + testRunCount + " ("

-                        + (testCompleteCount - testSuccessCount) + " failures)");

-    }

-

-    public RunSet getRunSet() {

-        return runSet;

-    }

-

-    public XMLParserPool getParserPool() {

-        return parserPool;

-    }

-

-    public Map getNameToFeatureMap() {

-        return nameToFeatureMap;

-    }

-

-    public ResourceSet getResourceSet() {

-        return resourceSet;

-    }

-}

+        monitor.subTask("Completed " + testCompleteCount + " of " + testRunCount + " ("
+                        + (testCompleteCount - testSuccessCount) + " failures)");
+    }
+
+    public RunSet getRunSet() {
+        return runSet;
+    }
+
+    public XMLParserPool getParserPool() {
+        return parserPool;
+    }
+
+    public Map getNameToFeatureMap() {
+        return nameToFeatureMap;
+    }
+
+    public ResourceSet getResourceSet() {
+        return resourceSet;
+    }
+}