blob: 87d895f13c6e7e0f69801943ff97fe7ecabfa361 [file] [log] [blame]
package org.eclipse.emf.edapt.declaration.inheritance;
import java.util.List;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.edapt.declaration.EdaptConstraint;
import org.eclipse.emf.edapt.declaration.EdaptOperation;
import org.eclipse.emf.edapt.declaration.EdaptParameter;
import org.eclipse.emf.edapt.declaration.OperationImplementation;
import org.eclipse.emf.edapt.migration.MigrationException;
import org.eclipse.emf.edapt.spi.migration.Metamodel;
import org.eclipse.emf.edapt.spi.migration.Model;
/**
* {@description}
*
* @author herrmama
* @author $Author$
* @version $Rev$
* @levd.rating YELLOW Hash: 1DD5D7BD6B9280DF56B69120623A2E4E
*/
@EdaptOperation(identifier = "useSuperClass", label = "Fold Super Class", description = "In the metamodel, a number of features are replaced by features of a new super class. In the model, the values are moved to these features based on a mapping.", breaking = true)
public class UseSuperClass extends OperationImplementation {
/** {@description} */
@EdaptParameter(main = true, description = "The class to which the super class is added")
public EClass subClass;
/** {@description} */
@EdaptParameter(description = "The new super class")
public EClass superClass;
/** {@description} */
@EdaptParameter(description = "The features to be replaced")
public List<EStructuralFeature> toReplace;
/** {@description} */
@EdaptConstraint(restricts = "toReplace", description = "The features to be replaced must belong to the sub class")
public boolean checkToReplaceInSubClass(EStructuralFeature toReplace) {
return subClass.getEStructuralFeatures().contains(toReplace);
}
/** {@description} */
@EdaptParameter(description = "The features by which they are replaced (in the same order)")
public List<EStructuralFeature> replaceBy;
/** {@description} */
@EdaptConstraint(restricts = "replaceBy", description = "The features to replace must be available in the super class")
public boolean checkReplaceByInSuperClass(EStructuralFeature replaceBy) {
return superClass.getEAllStructuralFeatures().contains(replaceBy);
}
/** {@description} */
@EdaptConstraint(description = "The number of features to be replaced and to replace them must be the same")
public boolean checkFeaturesSameSize() {
return toReplace.size() == replaceBy.size();
}
/** {@description} */
@EdaptConstraint(description = "The features must be of the same multiplicity")
public boolean checkFeaturesSameMultiplicity() {
return hasSameValue(toReplace, replaceBy, EcorePackage.eINSTANCE
.getETypedElement_Many());
}
/** {@description} */
@EdaptConstraint(description = "The features must be of the same type")
public boolean checkFeaturesSameType() {
return hasSameValue(toReplace, replaceBy, EcorePackage.eINSTANCE
.getETypedElement_EType());
}
/** {@inheritDoc} */
@SuppressWarnings("deprecation")
@Override
public void execute(Metamodel metamodel, Model model)
throws MigrationException {
subClass.getESuperTypes().add(superClass);
subClass.getESuperTypes().removeAll(superClass.getEAllSuperTypes());
for (int i = 0; i < toReplace.size(); i++) {
final ReplaceFeature operation = new ReplaceFeature();
operation.replaceBy = replaceBy.get(i);
operation.toReplace = toReplace.get(i);
operation.checkAndExecute(metamodel, model);
}
}
}