Skip to content
Snippets Groups Projects
Commit e397ba24 authored by Simon Barner's avatar Simon Barner
Browse files

Factorize RemoveDeprecatedArtifactsMigrationProviderBase

refs 3120,3368
parent 0878ec3a
No related branches found
No related tags found
No related merge requests found
......@@ -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
/*-------------------------------------------------------------------------+
| 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);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment