From e397ba24c4f618cd1a29b87430b516e1cbc7d73a Mon Sep 17 00:00:00 2001 From: Simon Barner <barner@fortiss.org> Date: Mon, 9 Apr 2018 11:54:12 +0000 Subject: [PATCH] Factorize RemoveDeprecatedArtifactsMigrationProviderBase refs 3120,3368 --- .../tooling/kernel/extension/base/.ratings | 1 + ...recatedArtifactsMigrationProviderBase.java | 96 +++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/extension/base/RemoveDeprecatedArtifactsMigrationProviderBase.java diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/extension/base/.ratings b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/extension/base/.ratings index c2f9ce79b..7ee2b677b 100644 --- a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/extension/base/.ratings +++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/extension/base/.ratings @@ -4,6 +4,7 @@ ConstraintViolationBase.java a5b1fdbdd5ce915789144077ec66b3569142f80c GREEN ElementCompositorBase.java 8667281b2e5988b11390cf77deab5d118f297ab1 GREEN MultiViolationConstraintCheckerBase.java e2f17f02fae75a17e955d48734ed043323f26f04 GREEN PrototypeProviderBase.java 62de3ea391ecb515883490517aa2e94ab812d91b GREEN +RemoveDeprecatedArtifactsMigrationProviderBase.java 91b4433756711d73d0325930a5d57d58f1155837 YELLOW RemoveUnknownFeatureMigrationProviderBase.java 0ffeb1f02a3f7476abcb467ebe07d3c5d5561b86 GREEN TransformationContextChainBase.java b5195a9bde6d50268dda80fed993477d7a4447ee GREEN TransformationProviderBase.java 0c3d114c6a3d854f74630417c05dd889ed02acdf GREEN diff --git a/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/extension/base/RemoveDeprecatedArtifactsMigrationProviderBase.java b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/extension/base/RemoveDeprecatedArtifactsMigrationProviderBase.java new file mode 100644 index 000000000..99634b1f7 --- /dev/null +++ b/org.fortiss.tooling.kernel/trunk/src/org/fortiss/tooling/kernel/extension/base/RemoveDeprecatedArtifactsMigrationProviderBase.java @@ -0,0 +1,96 @@ +/*-------------------------------------------------------------------------+ +| Copyright 2018 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.kernel.extension.base; + +import static org.conqat.lib.commons.reflect.ReflectionUtils.isInstanceOfAny; +import static org.eclipse.emf.ecore.util.EcoreUtil.delete; +import static org.fortiss.tooling.common.util.LambdaUtils.asStream; + +import java.util.Collection; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Stream; + +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; +import org.fortiss.tooling.kernel.model.INamedCommentedElement; + +/** + * Remove artificats related to deprecated use case model. + * + * @author barner + */ +public abstract class RemoveDeprecatedArtifactsMigrationProviderBase implements IMigrationProvider { // NO_UCD + // Migrators are retired after a release, but this base class should be available when needed. + // See https://af3-developer.fortiss.org/projects/autofocus3/wiki/Model_Migration + + /** Returns the {@link Collection} of deprecated artifact types to be removed from the model. */ + protected abstract Collection<Class<? extends EObject>> getDeprecatedArtifacts(); + + /** + * Returns the {@link Collection} of deprecated root artifact types (possibly empty subset of + * {@link #getDeprecatedArtifacts()}) for which a comment is added to the migrated model that + * deprecated artifacts have been removed. + */ + protected abstract Collection<Class<? extends EObject>> getDeprecatedRootArtifacts(); + + /** Returns the {@link Stream} of deprecated model elements to be removed. */ + @SuppressWarnings("unchecked") + private Stream<EObject> getDeprecatedModelElements(ITopLevelElement modelElement) { + Stream<EObject> root = asStream(modelElement.getRootModelElement().eAllContents()); + return root.filter(e -> isInstanceOfAny(e, (Class<EObject>[])getDeprecatedArtifacts() + .toArray())); + } + + /** {@inheritDoc} */ + + @Override + public boolean needMigration(ITopLevelElement modelElement, + Map<EObject, AnyType> unknownFeatures) { + + return getDeprecatedModelElements(modelElement).findAny().isPresent(); + } + + /** {@inheritDoc} */ + @Override + public void migrate(ITopLevelElement modelElement, Map<EObject, AnyType> unknownFeatures) { + EObject object; + do { + object = null; + Stream<EObject> deprecatedModelElements = getDeprecatedModelElements(modelElement); + Optional<EObject> anyObject = deprecatedModelElements.findAny(); + if(anyObject.isPresent()) { + object = anyObject.get(); + if(object.eContainer() instanceof INamedCommentedElement) { + INamedCommentedElement parent = (INamedCommentedElement)object.eContainer(); + if(parent.getComment() == null || parent.getComment().isEmpty()) { + for(Class<? extends EObject> rootType : getDeprecatedRootArtifacts()) { + if(rootType.isAssignableFrom(object.getClass())) { + parent.setComment(rootType.getSimpleName() + + " models are no longer supported. This sub-model has been removed automatically!"); + break; + } + } + } + } + delete(object); + } + } while(object != null); + } + +} -- GitLab