diff --git a/org.fortiss.tooling.base/plugin.xml b/org.fortiss.tooling.base/plugin.xml index b647acd9b5be092716c0e0bbc097af31d9aa1284..5ed524a48e46db91e5c8dbf63d06f4c860339046 100644 --- a/org.fortiss.tooling.base/plugin.xml +++ b/org.fortiss.tooling.base/plugin.xml @@ -34,9 +34,6 @@ </extension> <extension point="org.fortiss.tooling.kernel.migrationProvider"> - <migrationProvider migrationProvider="org.fortiss.tooling.base.migration.IDMigrationProvider"> - <objectClass objectClass="org.fortiss.tooling.kernel.extension.data.ITopLevelElement"/> - </migrationProvider> <migrationProvider migrationProvider="org.fortiss.tooling.base.migration.RemoveDuplicatedAnnotationsMigrationProvider"> <objectClass objectClass="org.fortiss.tooling.kernel.extension.data.ITopLevelElement"/> </migrationProvider> diff --git a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/migration/.ratings b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/migration/.ratings index 5a96ad0bc163986a7277379116c12e66e1508388..f6b064d042d5cc0ec5044a33c1ac5c13f551e0fc 100644 --- a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/migration/.ratings +++ b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/migration/.ratings @@ -1,3 +1,2 @@ -IDMigrationProvider.java fa145250ce031ab8e635db290b12cd6be2bda75c GREEN RemoveDuplicatedAnnotationsMigrationProvider.java 5d7689066a577110dbdf84b5c81372b1df2a51c6 GREEN RemoveOutdatedAnnotationInstanceMigrationProvider.java 29c29f2bb7515cad1de45a30ffc185001b47a016 GREEN diff --git a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/migration/IDMigrationProvider.java b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/migration/IDMigrationProvider.java deleted file mode 100644 index fa145250ce031ab8e635db290b12cd6be2bda75c..0000000000000000000000000000000000000000 --- a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/migration/IDMigrationProvider.java +++ /dev/null @@ -1,52 +0,0 @@ -/*-------------------------------------------------------------------------+ -| Copyright 2013 fortiss GmbH | -| | -| Licensed under the Apache License, Version 2.0 (the "License"); | -| you may not use this file except in compliance with the License. | -| You may obtain a copy of the License at | -| | -| http://www.apache.org/licenses/LICENSE-2.0 | -| | -| Unless required by applicable law or agreed to in writing, software | -| distributed under the License is distributed on an "AS IS" BASIS, | -| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | -| See the License for the specific language governing permissions and | -| limitations under the License. | -+--------------------------------------------------------------------------*/ -package org.fortiss.tooling.base.migration; - -import static org.fortiss.tooling.kernel.utils.UniqueIDUtils.fixMissingIDs; -import static org.fortiss.tooling.kernel.utils.UniqueIDUtils.hasMissingIDs; - -import java.util.Map; - -import org.eclipse.emf.ecore.EObject; -import org.eclipse.emf.ecore.xml.type.AnyType; -import org.fortiss.tooling.kernel.extension.IMigrationProvider; -import org.fortiss.tooling.kernel.extension.data.ITopLevelElement; - -/** - * {@link IDMigrationProvider} that - if required - adds missing IDs to a model. - * - * @author Shaka - */ -public class IDMigrationProvider implements IMigrationProvider { - - /** {@inheritDoc} */ - @Override - public boolean needMigration(ITopLevelElement modelElement, - Map<EObject, AnyType> unknownFeatures) { - // if the id of model element is 0 - if(modelElement != null) { - EObject rootElement = modelElement.getRootModelElement(); - return (rootElement != null) && hasMissingIDs(rootElement); - } - return false; - } - - /** {@inheritDoc} */ - @Override - public void migrate(ITopLevelElement modelElement, Map<EObject, AnyType> unknownFeatures) { - fixMissingIDs(modelElement); - } -} diff --git a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/internal/storage/eclipse/.ratings b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/internal/storage/eclipse/.ratings index a01c117e8dacdaa77f42eb452b7283b45715ad44..79965691f84f615b0cba722708810a98539dd0f3 100644 --- a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/internal/storage/eclipse/.ratings +++ b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/internal/storage/eclipse/.ratings @@ -1,5 +1,5 @@ AutoUndoCommandStack.java 6aa645a9ed6e6547539c376fda97284928c4f9d4 GREEN EMFTransactionalCommand.java ba4b5bead9768b6ce6c955b9238cd96cb722533c GREEN EclipseResourceStorageService.java 1b9722e31a5ec33e4c3f7bb171fc2ce587729bf8 GREEN -ModelContext.java 58e41785101a92624e60329b5bf8046466a49d33 GREEN +ModelContext.java 85ede185d4b232221a96d0bf37a4c676b105dc00 GREEN NonDirtyingEMFTransactionalCommand.java ec5f282603891096b09f2628155dd27e3a21c588 GREEN diff --git a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/internal/storage/eclipse/ModelContext.java b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/internal/storage/eclipse/ModelContext.java index 58e41785101a92624e60329b5bf8046466a49d33..85ede185d4b232221a96d0bf37a4c676b105dc00 100644 --- a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/internal/storage/eclipse/ModelContext.java +++ b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/internal/storage/eclipse/ModelContext.java @@ -15,10 +15,13 @@ +--------------------------------------------------------------------------*/ package org.fortiss.tooling.kernel.internal.storage.eclipse; +import static java.lang.Math.max; +import static org.eclipse.emf.common.util.URI.createPlatformResourceURI; import static org.eclipse.emf.ecore.util.EcoreUtil.resolveAll; import static org.fortiss.tooling.kernel.utils.EMFResourceUtils.buildOptionsMap; import static org.fortiss.tooling.kernel.utils.LoggingUtils.error; import static org.fortiss.tooling.kernel.utils.LoggingUtils.warning; +import static org.fortiss.tooling.kernel.utils.UniqueIDUtils.generateMissingIDs; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -36,6 +39,7 @@ import java.util.Set; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.emf.common.command.AbstractCommand; import org.eclipse.emf.common.command.BasicCommandStack; import org.eclipse.emf.common.command.CommandStack; @@ -110,7 +114,7 @@ class ModelContext implements ITopLevelElement, CommandStackListener { editingDomain = TransactionalEditingDomain.Factory.INSTANCE.createEditingDomain(); rset = editingDomain.getResourceSet(); - URI uri = URI.createPlatformResourceURI(file.getFullPath().toString(), true); + URI uri = createPlatformResourceURI(file.getFullPath().toString(), true); resource = getResourceSet().createResource(uri); resource.load(buildOptionsMap()); @@ -201,29 +205,29 @@ class ModelContext implements ITopLevelElement, CommandStackListener { // which is why special care must be taken to ensure uniqueness. if(ids.contains(id)) { hadDuplicates = true; - runAsCommand(new Runnable() { - @Override - public void run() { - element.setId(0); - } + runAsNonDirtyingCommand(() -> { + element.setId(0); }); } else { ids.add(id); } } - maxId = Math.max(maxId, id); + maxId = max(maxId, id); } } - maxId = Math.max(0, maxId); + maxId = max(0, maxId); if(hadMissing || hadDuplicates) { - runAsCommand(new Runnable() { - @Override - public void run() { - maxId = UniqueIDUtils.generateMissingIDs(getRootModelElement(), maxId); - } + runAsNonDirtyingCommand(() -> { + maxId = generateMissingIDs(getRootModelElement(), maxId); }); + try { + doSave(new NullProgressMonitor()); + } catch(IOException | CoreException e) { + error(ToolingKernelActivator.getDefault(), + "Error saving model file when fixing missing/duplicate IDs.", e); + } } if(hadDuplicates) { diff --git a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/utils/.ratings b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/utils/.ratings index 16f03fb58908bb49666d42cc573295bfc90911a5..6df8471a7838d75f2571ae549793d27be8ab1cad 100644 --- a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/utils/.ratings +++ b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/utils/.ratings @@ -11,4 +11,4 @@ LoggingUtils.java a982f7c3371e72feb8658510b5b0358876281a12 GREEN PrototypesUtils.java ec75bed75cfc5103f1f38e3a29df86f729428775 GREEN ResourceUtils.java 5d8f55b3b22a8d963a26ae4a83b4228e2a03d963 GREEN TransformationUtils.java ef1f2346a7e31059fe6a48dff49d247809d38dcd GREEN -UniqueIDUtils.java 99cf0934ee27a95f4b6edbc251e6ff24e5d1d7f7 GREEN +UniqueIDUtils.java c520d053a6530a490431f7acc3cda1a2f8907281 GREEN diff --git a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/utils/UniqueIDUtils.java b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/utils/UniqueIDUtils.java index 99cf0934ee27a95f4b6edbc251e6ff24e5d1d7f7..c520d053a6530a490431f7acc3cda1a2f8907281 100644 --- a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/utils/UniqueIDUtils.java +++ b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/utils/UniqueIDUtils.java @@ -259,42 +259,24 @@ public class UniqueIDUtils { return false; } - /** - * Generates all missing IDs of the given model. - * - * @param modelElement - * top level element - */ - public static void fixMissingIDs(final ITopLevelElement modelElement) { - final int maxID = getLargestID(modelElement.getRootModelElement()); - if(maxID > 0) { - modelElement.runAsCommand(() -> { - generateMissingIDs(modelElement.getRootModelElement(), maxID); - }); - } - } - /** * Generates all missing IDs of the given sub-model. * * @param object - * The sub-model element for which missing IDs should be prepared + * Sub-model element for which missing IDs should be prepared * @param existingModel - * the existing model to be considered for used IDs if object - * already contains IDs > 0 + * Any element in an existing model to be considered for used IDs. + * If this model does not contain any IDs <> 0, this method has no effect. */ public static void fixMissingIDs(EObject object, EObject existingModel) { EObject root = existingModel; while(root.eContainer() != null) { root = root.eContainer(); } - ITopLevelElement topLevelElement = - IPersistencyService.getInstance().getTopLevelElementFor(existingModel); final int maxID = getLargestID(root); + if(maxID > 0) { - topLevelElement.runAsCommand(() -> { - generateMissingIDs(object, maxID); - }); + generateMissingIDs(object, maxID); } } }