Project that stores traces is now configurable
This patch adds the ability to configure the project in which
the trace links are stored. If the project name is changed in
the preferences, the trace and artifact models are written to
the new project. The old project remains in the workspace.
To achieve this, this patch also adds a preference text editor
that uses a regex to check if an entry is correct.
Signed-off-by: Mihaela Grubii <laborator2test@gmail.com>
Change-Id: I571c29f434bbde8577647c9d1006b2cb65ee4340
diff --git a/bundles/org.eclipse.capra.core/META-INF/MANIFEST.MF b/bundles/org.eclipse.capra.core/META-INF/MANIFEST.MF
index 6f048d3..ea7b4cb 100644
--- a/bundles/org.eclipse.capra.core/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.capra.core/META-INF/MANIFEST.MF
@@ -13,5 +13,6 @@
Bundle-ActivationPolicy: lazy
Export-Package: org.eclipse.capra.core.adapters,
org.eclipse.capra.core.handlers,
- org.eclipse.capra.core.helpers
+ org.eclipse.capra.core.helpers,
+ org.eclipse.capra.core.preferences
Automatic-Module-Name: org.eclipse.capra.core
diff --git a/bundles/org.eclipse.capra.core/src/org/eclipse/capra/core/preferences/CapraPreferences.java b/bundles/org.eclipse.capra.core/src/org/eclipse/capra/core/preferences/CapraPreferences.java
new file mode 100644
index 0000000..35887ee
--- /dev/null
+++ b/bundles/org.eclipse.capra.core/src/org/eclipse/capra/core/preferences/CapraPreferences.java
@@ -0,0 +1,26 @@
+package org.eclipse.capra.core.preferences;
+
+import org.eclipse.core.runtime.preferences.IEclipsePreferences;
+import org.eclipse.core.runtime.preferences.InstanceScope;
+
+/**
+ * Core package class that is used for giving bundles access to Eclipse Capra
+ * User Preferences.
+ *
+ * @author Mihaela Grubii
+ *
+ */
+public class CapraPreferences {
+ public static final String CAPRA_PREFERENCE_PAGE_ID = "org.eclipse.capra.ui";
+ public static final String CAPRA_PERSISTENCE_PROJECT_NAME = "org.eclipse.capra.persistence.projectName";
+
+ /**
+ * Provides access to the preferences of Eclipse Capra.
+ *
+ * @return the preferences of Eclipse Capra
+ */
+ public static IEclipsePreferences getPreferences() {
+ return InstanceScope.INSTANCE.getNode(CAPRA_PREFERENCE_PAGE_ID);
+ }
+
+}
diff --git a/bundles/org.eclipse.capra.generic.persistence/src/org/eclipse/capra/generic/persistance/TracePersistenceAdapter.java b/bundles/org.eclipse.capra.generic.persistence/src/org/eclipse/capra/generic/persistance/TracePersistenceAdapter.java
index 4b65e73..856e98c 100644
--- a/bundles/org.eclipse.capra.generic.persistence/src/org/eclipse/capra/generic/persistance/TracePersistenceAdapter.java
+++ b/bundles/org.eclipse.capra.generic.persistence/src/org/eclipse/capra/generic/persistance/TracePersistenceAdapter.java
@@ -20,10 +20,12 @@
import org.eclipse.capra.core.adapters.TraceMetaModelAdapter;
import org.eclipse.capra.core.helpers.EditingDomainHelper;
import org.eclipse.capra.core.helpers.ExtensionPointHelper;
+import org.eclipse.capra.core.preferences.CapraPreferences;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.emf.common.command.Command;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
@@ -49,16 +51,17 @@
private static final Logger LOG = LoggerFactory.getLogger(TracePersistenceAdapter.class);
- private static final String DEFAULT_PROJECT_NAME = "__WorkspaceTraceModels";
+ private static String DEFAULT_PROJECT_NAME = "__WorkspaceTraceModels";
private static final String DEFAULT_TRACE_MODEL_NAME = "traceModel.xmi";
private static final String DEFAULT_ARTIFACT_WRAPPER_MODEL_NAME = "artifactWrappers.xmi";
- private static final URI DEFAULT_TRACE_MODEL_URI = URI
- .createPlatformResourceURI(DEFAULT_PROJECT_NAME + "/" + DEFAULT_TRACE_MODEL_NAME, true);
- private static final URI DEFAULT_ARTIFACT_MODEL_URI = URI
- .createPlatformResourceURI(DEFAULT_PROJECT_NAME + "/" + DEFAULT_ARTIFACT_WRAPPER_MODEL_NAME, true);
private Optional<EObject> loadModel(ResourceSet resourceSet, String modelName) {
- URI uri = URI.createPlatformResourceURI(DEFAULT_PROJECT_NAME + "/" + modelName, true);
+
+ return this.loadModel(this.getProjectNamePreference(), resourceSet, modelName);
+ }
+
+ private Optional<EObject> loadModel(String projectName, ResourceSet resourceSet, String modelName) {
+ URI uri = URI.createPlatformResourceURI(projectName + "/" + modelName, true);
Resource resource = resourceSet.getResource(uri, false) != null ? resourceSet.getResource(uri, false)
: resourceSet.createResource(uri);
@@ -101,25 +104,29 @@
project.create(new NullProgressMonitor());
project.open(new NullProgressMonitor());
}
-
return project;
}
@Override
public void saveTracesAndArtifacts(EObject traceModel, EObject artifactModel) {
try {
+ ensureProjectExists(this.getProjectNamePreference());
ResourceSet resourceSet = EditingDomainHelper.getResourceSet();
- ensureProjectExists(DEFAULT_PROJECT_NAME);
- Resource resourceForTraces = resourceSet.getResource(DEFAULT_TRACE_MODEL_URI, false) != null
- ? resourceSet.getResource(DEFAULT_TRACE_MODEL_URI, false)
- : resourceSet.createResource(DEFAULT_TRACE_MODEL_URI);
+ URI traceURI = URI.createPlatformResourceURI(getProjectNamePreference() + "/" + DEFAULT_TRACE_MODEL_NAME,
+ true);
+ URI artifactURI = URI.createPlatformResourceURI(
+ getProjectNamePreference() + "/" + DEFAULT_ARTIFACT_WRAPPER_MODEL_NAME, true);
- Resource resourceForArtifacts = resourceSet.getResource(DEFAULT_ARTIFACT_MODEL_URI, false) != null
- ? resourceSet.getResource(DEFAULT_ARTIFACT_MODEL_URI, false)
- : resourceSet.createResource(DEFAULT_ARTIFACT_MODEL_URI);
+ Resource resourceForTraces = resourceSet.getResource(traceURI, false) != null
+ ? resourceSet.getResource(traceURI, false)
+ : resourceSet.createResource(traceURI);
- if (resourceForTraces.getContents().isEmpty() || resourceForTraces.getContents().isEmpty()) {
+ Resource resourceForArtifacts = resourceSet.getResource(artifactURI, false) != null
+ ? resourceSet.getResource(artifactURI, false)
+ : resourceSet.createResource(artifactURI);
+
+ if (resourceForTraces.getContents().isEmpty() || resourceForArtifacts.getContents().isEmpty()) {
// The trace model or the artifact model have never been saved before and we
// need to add it to the resource set.
TransactionalEditingDomain editingDomain = EditingDomainHelper.getEditingDomain();
@@ -155,4 +162,14 @@
ArtifactMetaModelAdapter adapter = ExtensionPointHelper.getArtifactWrapperMetaModelAdapter().orElseThrow();
return loadModel(resourceSet, DEFAULT_ARTIFACT_WRAPPER_MODEL_NAME).orElse(adapter.createModel());
}
+
+ // get preference for project name
+ private String getProjectNamePreference() {
+ IEclipsePreferences pref = CapraPreferences.getPreferences();
+ String projectName = pref.get(CapraPreferences.CAPRA_PERSISTENCE_PROJECT_NAME, DEFAULT_PROJECT_NAME);
+ if (projectName.isBlank() || projectName.isEmpty()) {
+ projectName = DEFAULT_PROJECT_NAME;
+ }
+ return projectName;
+ }
}
diff --git a/bundles/org.eclipse.capra.ui/src/org/eclipse/capra/ui/editors/StringIdentifierEditor.java b/bundles/org.eclipse.capra.ui/src/org/eclipse/capra/ui/editors/StringIdentifierEditor.java
new file mode 100644
index 0000000..bcf0571
--- /dev/null
+++ b/bundles/org.eclipse.capra.ui/src/org/eclipse/capra/ui/editors/StringIdentifierEditor.java
@@ -0,0 +1,55 @@
+package org.eclipse.capra.ui.editors;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.jface.preference.StringFieldEditor;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * Implementation of StringFieldEditor that overrides the doCheckState() method
+ * and checks if the input matches a specific pattern. The implementation
+ * restricts empty string input.
+ *
+ * @author Mihaela Grubii
+ *
+ */
+public class StringIdentifierEditor extends StringFieldEditor {
+ private static final String ERROR_MESSAGE = "Given input is not valid!";
+
+ private String matchingPattern = "";
+
+ public StringIdentifierEditor(String name, String labelText, int width, Composite parent, String matchingPattern,
+ boolean isEnabled) {
+ super(name, labelText, width, VALIDATE_ON_KEY_STROKE, parent);
+ setEmptyStringAllowed(false);
+ setEnabled(isEnabled, parent);
+ setErrorMessage(ERROR_MESSAGE);
+ this.matchingPattern = matchingPattern;
+ }
+
+ /**
+ * Hook for string identifier validity status check.
+ *
+ * @return <code>true</code> if the field value is matching the pattern that is
+ * stored in MATCHING_PATTERN after the object of StringIdentifierEditor
+ * type is being constructed, and <code>false</code> for
+ */
+ @Override
+ protected boolean doCheckState() {
+ // textField;
+ String textField = getStringValue();
+ if (textField.equals(getPreferenceStore().getString(getPreferenceName()))) {
+ return true;
+ } else {
+ Matcher matchedString = Pattern.compile(matchingPattern).matcher(textField);
+ if (matchedString.find()) {
+ return true;
+ } else {
+ return false;
+ }
+
+ }
+ }
+
+}
diff --git a/bundles/org.eclipse.capra.ui/src/org/eclipse/capra/ui/preferences/CapraPreferences.java b/bundles/org.eclipse.capra.ui/src/org/eclipse/capra/ui/preferences/CapraPreferences.java
index 749d705..c142ef8 100644
--- a/bundles/org.eclipse.capra.ui/src/org/eclipse/capra/ui/preferences/CapraPreferences.java
+++ b/bundles/org.eclipse.capra.ui/src/org/eclipse/capra/ui/preferences/CapraPreferences.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2016, 2019 Chalmers | University of Gothenburg, rt-labs and others.
+ * Copyright (c) 2016, 2021 Chalmers | University of Gothenburg, rt-labs and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
@@ -13,7 +13,13 @@
*******************************************************************************/
package org.eclipse.capra.ui.preferences;
+import org.eclipse.capra.core.adapters.TracePersistenceAdapter;
+import org.eclipse.capra.core.helpers.EditingDomainHelper;
+import org.eclipse.capra.core.helpers.ExtensionPointHelper;
+import org.eclipse.capra.ui.editors.StringIdentifierEditor;
import org.eclipse.core.runtime.preferences.InstanceScope;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.jface.preference.BooleanFieldEditor;
import org.eclipse.jface.preference.FieldEditorPreferencePage;
import org.eclipse.jface.preference.IPreferenceStore;
@@ -21,27 +27,65 @@
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.preferences.ScopedPreferenceStore;
+/**
+ * The main preferences page for Eclipse Capra.
+ *
+ * @author Jan-Philipp Steghöfer
+ *
+ */
public class CapraPreferences extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {
- public static final String CAPRA_PREFERENCE_PAGE_ID = "org.eclipse.capra.ui";
- public static final String SHOW_TRACE_CREATED_CONFIRMATION_DIALOG = "Show confirmation after a trace link has been created";
+ public static final String SHOW_TRACE_CREATED_CONFIRMATION_DIALOG = "org.eclipse.capra.preferences.showTraceCreatedConfirmationDialog";
public static final String SHOW_TRACE_CREATED_CONFIRMATION_DIALOG_LABEL = "Show confirmation after a trace link has been created";
private static final String PREFERENCE_PAGE_DESCRIPTION = "Eclipse Capra UI Preferences";
+ public static final String CAPRA_PERSISTENCE_PROJECT_NAME_LABEL = "Input new project name for stored traces: ";
+ public static final String PROJECT_IDENTIFIER_PATTERN = "^([a-zA-Z_$][a-zA-Z\\d_$]*)$";
+
+ private TracePersistenceAdapter persistenceAdapter;
+ private EObject traceModel;
+ private EObject artifactModel;
@Override
public void init(IWorkbench workbench) {
setDescription(PREFERENCE_PAGE_DESCRIPTION);
- setPreferenceStore(new ScopedPreferenceStore(InstanceScope.INSTANCE, CAPRA_PREFERENCE_PAGE_ID));
+ setPreferenceStore(getPreferenceStore());
+
+ this.persistenceAdapter = ExtensionPointHelper.getTracePersistenceAdapter().orElseThrow();
+
+ ResourceSet resourceSet = EditingDomainHelper.getResourceSet();
+ // add trace model to resource set
+ this.traceModel = this.persistenceAdapter.getTraceModel(resourceSet);
+ // add artifact model to resource set
+ this.artifactModel = this.persistenceAdapter.getArtifactWrappers(resourceSet);
}
@Override
protected void createFieldEditors() {
BooleanFieldEditor booleanEditor = new BooleanFieldEditor(SHOW_TRACE_CREATED_CONFIRMATION_DIALOG,
SHOW_TRACE_CREATED_CONFIRMATION_DIALOG_LABEL, getFieldEditorParent());
+ StringIdentifierEditor stringEditor = new StringIdentifierEditor(
+ org.eclipse.capra.core.preferences.CapraPreferences.CAPRA_PERSISTENCE_PROJECT_NAME,
+ CAPRA_PERSISTENCE_PROJECT_NAME_LABEL, 20, getFieldEditorParent(), PROJECT_IDENTIFIER_PATTERN, true);
addField(booleanEditor);
+ addField(stringEditor);
}
- public static IPreferenceStore getPreferences() {
- return new ScopedPreferenceStore(InstanceScope.INSTANCE, CAPRA_PREFERENCE_PAGE_ID);
+ @Override
+ public boolean performOk() {
+ boolean isOk = super.performOk();
+ this.persistenceAdapter.saveTracesAndArtifacts(traceModel, artifactModel);
+ return isOk;
}
+
+ /**
+ * Provides access to the preferences store. All clients should use
+ * {@link org.eclipse.capra.core.CapraPreferences} instead.
+ *
+ * @return the preference store used by Eclipse Capra
+ */
+ public static IPreferenceStore getPreferences() {
+ return new ScopedPreferenceStore(InstanceScope.INSTANCE,
+ org.eclipse.capra.core.preferences.CapraPreferences.CAPRA_PREFERENCE_PAGE_ID);
+ }
+
}
diff --git a/tests/org.eclipse.capra.testsuite/src/org/eclipse/capra/testsuite/TestTraceHelper.java b/tests/org.eclipse.capra.testsuite/src/org/eclipse/capra/testsuite/TestTraceHelper.java
index 21abe8d..72a424a 100644
--- a/tests/org.eclipse.capra.testsuite/src/org/eclipse/capra/testsuite/TestTraceHelper.java
+++ b/tests/org.eclipse.capra.testsuite/src/org/eclipse/capra/testsuite/TestTraceHelper.java
@@ -17,6 +17,7 @@
import static org.eclipse.capra.testsupport.TestHelper.createEmptyFileInProject;
import static org.eclipse.capra.testsupport.TestHelper.createSimpleProject;
import static org.eclipse.capra.testsupport.TestHelper.createTraceForCurrentSelectionOfType;
+import static org.eclipse.capra.testsupport.TestHelper.purgeModels;
import static org.eclipse.capra.testsupport.TestHelper.resetSelectionView;
import static org.eclipse.capra.testsupport.TestHelper.thereIsATraceBetween;
import static org.junit.Assert.assertEquals;
@@ -62,6 +63,7 @@
public void init() throws CoreException {
clearWorkspace();
resetSelectionView();
+ purgeModels();
}
/**
diff --git a/tests/org.eclipse.capra.testsuite/src/org/eclipse/capra/testsuite/TestTraceProjectRename.java b/tests/org.eclipse.capra.testsuite/src/org/eclipse/capra/testsuite/TestTraceProjectRename.java
new file mode 100644
index 0000000..b7972fc
--- /dev/null
+++ b/tests/org.eclipse.capra.testsuite/src/org/eclipse/capra/testsuite/TestTraceProjectRename.java
@@ -0,0 +1,196 @@
+/*******************************************************************************
+ * Copyright (c) 2016, 2019 Chalmers | University of Gothenburg, rt-labs and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Chalmers | University of Gothenburg and rt-labs - initial API and implementation and/or initial documentation
+ * Chalmers | University of Gothenburg - additional features, updated API
+ *******************************************************************************/
+package org.eclipse.capra.testsuite;
+
+import static org.eclipse.capra.testsupport.TestHelper.clearWorkspace;
+import static org.eclipse.capra.testsupport.TestHelper.createEmptyFileInProject;
+import static org.eclipse.capra.testsupport.TestHelper.createSimpleProject;
+import static org.eclipse.capra.testsupport.TestHelper.createTraceForCurrentSelectionOfType;
+import static org.eclipse.capra.testsupport.TestHelper.purgeModels;
+import static org.eclipse.capra.testsupport.TestHelper.resetSelectionView;
+import static org.eclipse.capra.testsupport.TestHelper.thereIsATraceBetween;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.List;
+
+import org.eclipse.capra.core.adapters.TracePersistenceAdapter;
+import org.eclipse.capra.core.helpers.EditingDomainHelper;
+import org.eclipse.capra.core.helpers.ExtensionPointHelper;
+import org.eclipse.capra.generic.tracemodel.TracemodelPackage;
+import org.eclipse.capra.ui.preferences.CapraPreferences;
+import org.eclipse.capra.ui.views.SelectionView;
+import org.eclipse.cdt.managedbuilder.core.BuildException;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.PlatformUI;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * A class to test the traces project renaming functionality through capra
+ * preferences.
+ *
+ * @author Mihaela Grubii
+ *
+ */
+
+public class TestTraceProjectRename {
+
+ private static final String PROJECT_NAME = "TestProject";
+ private static final String FILE_A = "FILE_A";
+ private static final String FILE_B = "FILE_B";
+ private static final String FILE_C = "FILE_C";
+ private static final String PREFERENCE_NAME = org.eclipse.capra.core.preferences.CapraPreferences.CAPRA_PERSISTENCE_PROJECT_NAME;
+ private static final String OLD_VALID_PROJECT_NAME = "_TraceProjectTest";
+ private static final String NEW_VALID_PROJECT_NAME = "ProjectWithNewName1";
+
+ @Before
+ public void init() throws CoreException {
+ clearWorkspace();
+ resetSelectionView();
+ purgeModels();
+ }
+
+ @After
+ public void destroy() {
+ CapraPreferences.getPreferences().setValue(PREFERENCE_NAME, "");
+ }
+
+ /**
+ * Test valid input for Persistence Project Name preference.
+ *
+ * @throws CoreException
+ * @throws BuildException
+ */
+ @Test
+ public void testRenameTraceProject() throws CoreException, BuildException {
+
+ // set a value for the project name capra preferences
+ CapraPreferences pref = new CapraPreferences();
+ IWorkbench workbench = PlatformUI.getWorkbench();
+ pref.init(workbench);
+ // input new value for the project name preference
+ CapraPreferences.getPreferences().setValue(PREFERENCE_NAME, OLD_VALID_PROJECT_NAME);
+
+ // verify if project and traces should be saved successfully
+ assertTrue("Saving traces and artifacts successfully ", pref.performOk());
+
+ // create a simple project
+ createSimpleProject(PROJECT_NAME);
+ // create some files in the project
+ IFile fileA = createEmptyFileInProject(FILE_A, PROJECT_NAME);
+ IFile fileB = createEmptyFileInProject(FILE_B, PROJECT_NAME);
+ IFile fileC = createEmptyFileInProject(FILE_C, PROJECT_NAME);
+
+ // drop files File A and B in the selection view
+ SelectionView.getOpenedView().dropToSelection(fileA);
+ SelectionView.getOpenedView().dropToSelection(fileB);
+
+ // create a trace link
+ assertFalse(thereIsATraceBetween(fileA, fileB));
+ createTraceForCurrentSelectionOfType(TracemodelPackage.eINSTANCE.getRelatedTo());
+ assertTrue(thereIsATraceBetween(fileA, fileB));
+
+ // get the project with the inputed value
+ IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(OLD_VALID_PROJECT_NAME);
+
+ // verify that project with expected name is created
+ assertTrue("Newly renamed project exists", project.exists());
+
+ // verify that resourceSet traceModel and artifactModel are not empty
+ TracePersistenceAdapter persistenceAdapter = ExtensionPointHelper.getTracePersistenceAdapter().orElseThrow();
+ ResourceSet resourceSet = EditingDomainHelper.getResourceSet();
+ // get trace model of the resource set
+ EObject traceModel = persistenceAdapter.getTraceModel(resourceSet);
+ // get artifact model of the resource set
+ EObject artifactModel = persistenceAdapter.getArtifactWrappers(resourceSet);
+ List<EObject> traceModelContentsList = traceModel.eContents();
+ List<EObject> traceModelArtifactList = artifactModel.eContents();
+
+ // verifying contents of the traceModel and artifactMoodel
+ assertFalse("Trace model contents is not an empty list", traceModelContentsList.isEmpty());
+ assertFalse("Artifact model contents is not an empty list", traceModelArtifactList.isEmpty());
+
+ // verify expected files exist
+ assertTrue(project.getFile("traceModel.xmi").exists());
+ assertTrue(project.getFile("artifactWrappers.xmi").exists());
+
+ // clear selection
+ SelectionView.getOpenedView().clearSelection();
+
+ // input new value for the project name preference
+ CapraPreferences.getPreferences().setValue(PREFERENCE_NAME, NEW_VALID_PROJECT_NAME);
+
+ // the project and traces should be saved successfully
+ assertTrue("Saving traces and artifacts successfully", pref.performOk());
+
+ workbench = PlatformUI.getWorkbench();
+ pref.init(workbench);
+
+ // get the project with the inputed value
+ IProject projectNew = ResourcesPlugin.getWorkspace().getRoot().getProject(NEW_VALID_PROJECT_NAME);
+
+ // the project and traces should be saved successfully
+ assertTrue("Saving traces and artifacts successfully", pref.performOk());
+
+ // verify that project with expected name is created
+ assertTrue("Newly renamed project exists", projectNew.exists());
+
+ List<EObject> traceModelContentsList_New1 = traceModel.eContents();
+ List<EObject> traceModelArtifactList_New1 = artifactModel.eContents();
+
+ // verifying contents of the traceModel and artifactMoodel are not empty
+ assertFalse("Trace model contents is not an empty list", traceModelContentsList_New1.isEmpty());
+ assertFalse("Artifact model contents is not an empty list", traceModelArtifactList_New1.isEmpty());
+
+ // create a trace link between File B and C
+ SelectionView.getOpenedView().dropToSelection(fileB);
+ SelectionView.getOpenedView().dropToSelection(fileC);
+ assertFalse(thereIsATraceBetween(fileB, fileC));
+ createTraceForCurrentSelectionOfType(TracemodelPackage.eINSTANCE.getRelatedTo());
+ assertTrue(thereIsATraceBetween(fileB, fileC));
+
+ workbench = PlatformUI.getWorkbench();
+ pref.init(workbench);
+
+ // the project and traces should be saved successfully
+ assertTrue("Saving traces and artifacts successfully", pref.performOk());
+
+ // get the project with the NEW inputed value
+ projectNew = ResourcesPlugin.getWorkspace().getRoot().getProject(NEW_VALID_PROJECT_NAME);
+
+ // verify that project with expected name is created and exists
+ assertTrue("Newly renamed project exists", projectNew.exists());
+
+ List<EObject> traceModelContentsList_New2 = traceModel.eContents();
+ List<EObject> traceModelArtifactList_New2 = artifactModel.eContents();
+
+ // verify that new artifact and trace model contents size increased and the list
+ // contains the old contents
+ assertTrue(traceModelContentsList_New2.containsAll(traceModelContentsList));
+ assertTrue(traceModelArtifactList_New2.containsAll(traceModelArtifactList));
+
+ // verify expected files exist
+ assertTrue(projectNew.getFile("traceModel.xmi").exists());
+ assertTrue(projectNew.getFile("artifactWrappers.xmi").exists());
+ }
+
+}