Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPierre Guilet2018-10-10 13:20:19 +0000
committerLaurent Fasani2018-10-12 10:09:43 +0000
commitdc769b8fc3c4438b8578b4ad95c71b3b9964afbf (patch)
tree8fc4a90f9e2db80c358c5e178d99d61b42c5c31e
parenta325e533a8f9e155784b4ffcb874546375dc7288 (diff)
downloadorg.eclipse.sirius-dc769b8fc3c4438b8578b4ad95c71b3b9964afbf.tar.gz
org.eclipse.sirius-dc769b8fc3c4438b8578b4ad95c71b3b9964afbf.tar.xz
org.eclipse.sirius-dc769b8fc3c4438b8578b4ad95c71b3b9964afbf.zip
[536995] Fix migration saving asked after saving
* Reopening the aird editor after saving the automatic migration does not ask anymore user to save again. * same thing for VSM editor Bug: 536995 Change-Id: I40db07e81005d2bef4e9a988543c00f0c56c53df Signed-off-by: Pierre Guilet <pierre.guilet@obeo.fr>
-rw-r--r--plugins/org.eclipse.sirius.common.ui/src/org/eclipse/sirius/common/ui/tools/internal/util/MigrationUIUtil.java68
-rw-r--r--plugins/org.eclipse.sirius.editor/src/org/eclipse/sirius/editor/tools/internal/presentation/CustomSiriusEditor.java62
-rw-r--r--plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/api/command/AbstractSWTCallback.java33
3 files changed, 84 insertions, 79 deletions
diff --git a/plugins/org.eclipse.sirius.common.ui/src/org/eclipse/sirius/common/ui/tools/internal/util/MigrationUIUtil.java b/plugins/org.eclipse.sirius.common.ui/src/org/eclipse/sirius/common/ui/tools/internal/util/MigrationUIUtil.java
index 4fed456fa7..4ccfc8ddaa 100644
--- a/plugins/org.eclipse.sirius.common.ui/src/org/eclipse/sirius/common/ui/tools/internal/util/MigrationUIUtil.java
+++ b/plugins/org.eclipse.sirius.common.ui/src/org/eclipse/sirius/common/ui/tools/internal/util/MigrationUIUtil.java
@@ -12,17 +12,11 @@
*******************************************************************************/
package org.eclipse.sirius.common.ui.tools.internal.util;
-import java.text.MessageFormat;
-
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.eclipse.sirius.business.api.session.Session;
import org.eclipse.sirius.business.internal.migration.AbstractSiriusMigrationService;
import org.eclipse.sirius.common.tools.api.constant.CommonPreferencesConstants;
-import org.eclipse.sirius.common.ui.Messages;
import org.eclipse.sirius.common.ui.SiriusTransPlugin;
-import org.eclipse.sirius.common.ui.tools.api.util.SWTUtil;
-import org.eclipse.ui.ISaveablePart2;
/**
* Utility class used for displaying UI elements about resource migration.
@@ -37,67 +31,13 @@ public final class MigrationUIUtil {
}
/**
- * Test if the resource has been automatically migrated. If it is the case and this is due to a direct user action,
- * ask user if he want to save the resource
- *
- * @param resource
- * The resource to test
- * @return <code>true</code> if the user want to save the session, <code>false</code> otherwise
- */
- public static boolean shouldMigratedElementBeSaved(Resource resource) {
- String migrateFrom = hasBeenMigratedFrom(resource);
- if (migrateFrom != null && shouldUserBeWarnedAboutMigration(resource)) {
- String message = MessageFormat.format(Messages.MigrationUIUtil_askToSaveChanges, resource.getURI().lastSegment());
- return SWTUtil.showSaveDialogWithMessage(resource, message, false) == ISaveablePart2.YES;
- }
- return false;
- }
-
- /**
- * Test if the session resource has been automatically migrated. If it is the case and this is due to a direct user
- * action, ask user if he wants to save the session
- *
- * @param session
- * The session to test
- * @param sessionLabel
- * the session label to use when interacting with user if needed.
- * @return <code>true</code> if the user want to save the session, <code>false</code> otherwise
- */
- public static boolean shouldMigratedElementBeSaved(Session session, String sessionLabel) {
- for (Resource resource : session.getAllSessionResources()) {
- String migrateFrom = hasBeenMigratedFrom(resource);
- if (migrateFrom != null && shouldUserBeWarnedAboutMigration(resource)) {
- String message = MessageFormat.format(Messages.MigrationUIUtil_askToSaveChanges, sessionLabel);
- return SWTUtil.showSaveDialogWithMessage(resource, message, false) == ISaveablePart2.YES;
- }
- }
- return false;
- }
-
- /**
- * Test if the given resource has been migrated due to a direct user action.
+ * Returns true if the user should be warned about migration. False otherwise.
*
* @param resource
- * The given resource
- * @return <code>true</code> if the resource as been migrated because of a direct user action, <code>false</code>
- * otherwise
+ * resource containing the VSM that is potentially migrated.
+ * @return true if the user should be warned about migration. False otherwise.
*/
- public static boolean hasBeenMigratedAndUserShouldBeWarned(Resource resource) {
- return hasBeenMigratedFrom(resource) != null && shouldUserBeWarnedAboutMigration(resource);
- }
-
- private static String hasBeenMigratedFrom(Resource resource) {
- String migrateFrom = null;
- if (resource instanceof XMLResource) {
- Object result = ((XMLResource) resource).getDefaultLoadOptions().get(AbstractSiriusMigrationService.OPTION_RESOURCE_MIGRATION_LOADEDVERSION);
- if (result instanceof String) {
- migrateFrom = (String) result;
- }
- }
- return migrateFrom;
- }
-
- private static boolean shouldUserBeWarnedAboutMigration(Resource resource) {
+ public static boolean shouldUserBeWarnedAboutMigration(Resource resource) {
boolean prefAskToSave = SiriusTransPlugin.getPlugin().getPreferenceStore().getBoolean(CommonPreferencesConstants.PREF_ASK_TO_SAVE_RESOURCE_AFTER_MIGRATION);
boolean directUserAction = false;
if (resource instanceof XMLResource) {
diff --git a/plugins/org.eclipse.sirius.editor/src/org/eclipse/sirius/editor/tools/internal/presentation/CustomSiriusEditor.java b/plugins/org.eclipse.sirius.editor/src/org/eclipse/sirius/editor/tools/internal/presentation/CustomSiriusEditor.java
index 9258b0b310..8a2f2f3aeb 100644
--- a/plugins/org.eclipse.sirius.editor/src/org/eclipse/sirius/editor/tools/internal/presentation/CustomSiriusEditor.java
+++ b/plugins/org.eclipse.sirius.editor/src/org/eclipse/sirius/editor/tools/internal/presentation/CustomSiriusEditor.java
@@ -69,6 +69,7 @@ import org.eclipse.sirius.business.internal.migration.description.VSMMigrationSe
import org.eclipse.sirius.business.internal.migration.description.VSMResourceHandler;
import org.eclipse.sirius.business.internal.migration.description.VSMVersionSAXParser;
import org.eclipse.sirius.common.ui.tools.api.editor.IEObjectNavigable;
+import org.eclipse.sirius.common.ui.tools.api.util.SWTUtil;
import org.eclipse.sirius.common.ui.tools.internal.util.MigrationUIUtil;
import org.eclipse.sirius.editor.Messages;
import org.eclipse.sirius.editor.editorPlugin.SiriusEditor;
@@ -86,6 +87,7 @@ import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IPathEditorInput;
+import org.eclipse.ui.ISaveablePart2;
import org.eclipse.ui.IURIEditorInput;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.actions.WorkspaceModifyOperation;
@@ -429,7 +431,7 @@ public class CustomSiriusEditor extends SiriusEditor implements IEObjectNavigabl
((XMLResource) resource).getDefaultLoadOptions().put(AbstractSiriusMigrationService.OPTION_RESOURCE_NON_BATCH_MIGRATION, true);
}
- if (MigrationUIUtil.shouldMigratedElementBeSaved(resource)) {
+ if (isVSMMigrated(resource, getURIFromInput(getEditorInput())) && askUserToSaveMigration(resource)) {
doSave(new NullProgressMonitor());
}
@@ -484,21 +486,21 @@ public class CustomSiriusEditor extends SiriusEditor implements IEObjectNavigabl
boolean first = true;
for (Resource resource : editingDomain.getResourceSet().getResources()) {
if ((first || !resource.getContents().isEmpty() || isPersisted(resource)) && !editingDomain.isReadOnly(resource)) {
- if (!MigrationUIUtil.hasBeenMigratedAndUserShouldBeWarned(resource) && resource.isTrackingModification() && !resource.isModified()) {
- continue;
- }
- try {
- savedResources.add(resource);
- if (resource instanceof XMLResource) {
- ((XMLResource) resource).getDefaultSaveOptions().put(XMLResource.OPTION_URI_HANDLER, vsmURIHandler);
+ boolean vsmMigrated = isVSMMigrated(resource, getURIFromInput(getEditorInput()));
+ if (vsmMigrated || !resource.isTrackingModification() || resource.isModified()) {
+ try {
+ savedResources.add(resource);
+ if (resource instanceof XMLResource) {
+ ((XMLResource) resource).getDefaultSaveOptions().put(XMLResource.OPTION_URI_HANDLER, vsmURIHandler);
+ }
+ resource.save(Collections.emptyMap());
+ // CHECKSTYLE:OFF
+ } catch (Exception exception) {
+ // CHECKSTYLE:ON
+ resourceToDiagnosticMap.put(resource, analyzeResourceProblems(resource, exception));
}
- resource.save(Collections.emptyMap());
- // CHECKSTYLE:OFF
- } catch (Exception exception) {
- // CHECKSTYLE:ON
- resourceToDiagnosticMap.put(resource, analyzeResourceProblems(resource, exception));
+ first = false;
}
- first = false;
}
}
}
@@ -520,6 +522,38 @@ public class CustomSiriusEditor extends SiriusEditor implements IEObjectNavigabl
}
/**
+ * Asks the user if the automatic migration must be save.
+ *
+ * @param resource
+ * The resource to test
+ * @return <code>true</code> if the user want to save the session, <code>false</code> otherwise
+ */
+ public boolean askUserToSaveMigration(Resource resource) {
+ if (MigrationUIUtil.shouldUserBeWarnedAboutMigration(resource)) {
+ String message = MessageFormat.format(org.eclipse.sirius.common.ui.Messages.MigrationUIUtil_askToSaveChanges, resource.getURI().lastSegment());
+ return SWTUtil.showSaveDialogWithMessage(resource, message, false) == ISaveablePart2.YES;
+ }
+ return false;
+ }
+
+ /**
+ * Returns true if the VSM has been migrated. False otherwise.
+ *
+ * @param resource
+ * resource containing the VSM instance potentially migrated.
+ * @param uri
+ * URI of the VSM to check against the instance.
+ * @return true if the VSM has been migrated. False otherwise.
+ */
+ private boolean isVSMMigrated(Resource resource, URI uri) {
+ VSMVersionSAXParser vsmVersionSAXParser = new VSMVersionSAXParser(uri);
+ if (!VSMMigrationService.getInstance().getLastMigrationVersion().equals(Version.parseVersion(vsmVersionSAXParser.getVersion(new NullProgressMonitor())))) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
* {@inheritDoc}
*
* Trigger migration if required.
diff --git a/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/api/command/AbstractSWTCallback.java b/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/api/command/AbstractSWTCallback.java
index f57b27e2e4..9cfc7f3a60 100644
--- a/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/api/command/AbstractSWTCallback.java
+++ b/plugins/org.eclipse.sirius.ui/src/org/eclipse/sirius/ui/tools/api/command/AbstractSWTCallback.java
@@ -45,6 +45,8 @@ import org.eclipse.sirius.business.api.helper.SiriusUtil;
import org.eclipse.sirius.business.api.migration.AirdResourceVersionMismatchException;
import org.eclipse.sirius.business.api.query.URIQuery;
import org.eclipse.sirius.business.api.session.Session;
+import org.eclipse.sirius.business.internal.migration.RepresentationsFileMigrationService;
+import org.eclipse.sirius.business.internal.migration.RepresentationsFileVersionSAXParser;
import org.eclipse.sirius.common.tools.api.interpreter.IInterpreter;
import org.eclipse.sirius.common.tools.api.resource.ResourceSetSync;
import org.eclipse.sirius.common.tools.api.resource.ResourceSetSync.ResourceStatus;
@@ -53,6 +55,7 @@ import org.eclipse.sirius.common.ui.SiriusTransPlugin;
import org.eclipse.sirius.common.ui.tools.api.selection.EMFMessageDialog;
import org.eclipse.sirius.common.ui.tools.api.selection.EObjectSelectionWizard;
import org.eclipse.sirius.common.ui.tools.api.util.EclipseUIUtil;
+import org.eclipse.sirius.common.ui.tools.api.util.SWTUtil;
import org.eclipse.sirius.common.ui.tools.internal.util.MigrationUIUtil;
import org.eclipse.sirius.tools.api.command.ui.UICallBack;
import org.eclipse.sirius.ui.business.api.dialect.DialectUIManager;
@@ -70,8 +73,10 @@ import org.eclipse.sirius.viewpoint.description.tool.SelectModelElementVariable;
import org.eclipse.sirius.viewpoint.provider.SiriusEditPlugin;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.ISaveablePart2;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.WorkspaceModifyOperation;
+import org.osgi.framework.Version;
import com.google.common.collect.Iterables;
@@ -386,7 +391,7 @@ public abstract class AbstractSWTCallback implements UICallBack {
@Override
public void askUserAndSaveMigratedSession(Session session) {
- if (MigrationUIUtil.shouldMigratedElementBeSaved(session, getSessionNameToDisplayWhileSaving(session))) {
+ if (askUserToSaveAutomaticMigration(session, getSessionNameToDisplayWhileSaving(session))) {
PlatformUI.getWorkbench().getDisplay().asyncExec(() -> {
try {
new ProgressMonitorDialog(PlatformUI.getWorkbench().getDisplay().getActiveShell()).run(false, false, new WorkspaceModifyOperation() {
@@ -405,4 +410,30 @@ public abstract class AbstractSWTCallback implements UICallBack {
}
}
+ /**
+ * Test if the session resource has been automatically migrated. If it is the case and this is due to a direct user
+ * action, ask user if he wants to save the session
+ *
+ * @param session
+ * The session to test
+ * @param sessionLabel
+ * the session label to use when interacting with user if needed.
+ * @return <code>true</code> if the user want to save the session, <code>false</code> otherwise
+ */
+ public boolean askUserToSaveAutomaticMigration(Session session, String sessionLabel) {
+ for (Resource resource : session.getAllSessionResources()) {
+ boolean migrated = isSessionMigrated(resource, session.getSessionResource().getURI());
+ if (migrated && MigrationUIUtil.shouldUserBeWarnedAboutMigration(resource)) {
+ String message = MessageFormat.format(org.eclipse.sirius.common.ui.Messages.MigrationUIUtil_askToSaveChanges, sessionLabel);
+ return SWTUtil.showSaveDialogWithMessage(resource, message, false) == ISaveablePart2.YES;
+ }
+ }
+ return false;
+ }
+
+ private boolean isSessionMigrated(Resource resource, URI airdResourceUri) {
+ RepresentationsFileVersionSAXParser representationsFileVersionSAXParser = new RepresentationsFileVersionSAXParser(airdResourceUri);
+ Version lastMigrationVersion = RepresentationsFileMigrationService.getInstance().getLastMigrationVersion();
+ return lastMigrationVersion != null && !lastMigrationVersion.equals(Version.parseVersion(representationsFileVersionSAXParser.getVersion(new NullProgressMonitor())));
+ }
}

Back to the top