diff options
| author | Pierre Guilet | 2018-10-10 13:20:19 +0000 |
|---|---|---|
| committer | Laurent Fasani | 2018-10-12 10:09:43 +0000 |
| commit | dc769b8fc3c4438b8578b4ad95c71b3b9964afbf (patch) | |
| tree | 8fc4a90f9e2db80c358c5e178d99d61b42c5c31e | |
| parent | a325e533a8f9e155784b4ffcb874546375dc7288 (diff) | |
| download | org.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>
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()))); + } } |
