Skip to content
Snippets Groups Projects
Commit 3b32306c authored by Sebastian Bergemann's avatar Sebastian Bergemann
Browse files

GREEN (+ small text fixes, etc.)

Issue-ref: 4240
Issue-URL: af3#4240



Signed-off-by: default avatarSebastian Bergemann <bergemann@fortiss.org>
parent ac82aba9
No related branches found
No related tags found
1 merge request!1784240
Pipeline #39330 passed
Pipeline: maven-releng

#39331

    BucketSetMap.java 665a28c80a9693b9b9e31b7ebe59f2de4195d56c GREEN BucketSetMap.java 665a28c80a9693b9b9e31b7ebe59f2de4195d56c GREEN
    DualKeyMap.java 75fbe85a54e5a655aaf67108ae004f98ed2879d8 GREEN DualKeyMap.java 75fbe85a54e5a655aaf67108ae004f98ed2879d8 GREEN
    EMFProductLineTranslation.java a62c588bd806fdf98d1e2fb4138c359528edcaad YELLOW EMFProductLineTranslation.java b590fbf053c21d9e6b0ee6d0818779e4adb1fe0b GREEN
    GenericProductLineAnalysis.java 859b58aef54101734de849db293de79e16054098 GREEN GenericProductLineAnalysis.java 1026cd6d7d0286c0f2402c5918d83cf7dc84407b GREEN
    GenericProductLineTranslation.java 2df1a1c1363cb93b6f498308e575833cf705e2fd GREEN GenericProductLineTranslation.java 2df1a1c1363cb93b6f498308e575833cf705e2fd GREEN
    IProductLineConstraint.java 1b0e1231cc578a6e7e544441ac33533b4feafeb1 GREEN IProductLineConstraint.java 1b0e1231cc578a6e7e544441ac33533b4feafeb1 GREEN
    IProductLineTranslation.java 733dae03e2baae237b6f0b33f0dd618a4f47cf73 GREEN IProductLineTranslation.java 733dae03e2baae237b6f0b33f0dd618a4f47cf73 GREEN
    ......
    ...@@ -169,19 +169,15 @@ public class EMFProductLineTranslation implements IProductLineTranslation { ...@@ -169,19 +169,15 @@ public class EMFProductLineTranslation implements IProductLineTranslation {
    /** Mapping of classes to the selection function for this type. */ /** Mapping of classes to the selection function for this type. */
    private Map<EClass, FuncDecl<?>> eClass2SelectionFunction; private Map<EClass, FuncDecl<?>> eClass2SelectionFunction;
    /** /** Constructor. */
    * Constructor.
    */
    public EMFProductLineTranslation() { public EMFProductLineTranslation() {
    // Fields which should not change between individual translations are initialized only once // Fields which should not change between individual translations are initialized only once.
    translatedClasses = new HashSet<EClass>(); translatedClasses = new HashSet<EClass>();
    translatedReferences = new HashSet<EReference>(); translatedReferences = new HashSet<EReference>();
    translatedAttributes = new HashSet<EAttribute>(); translatedAttributes = new HashSet<EAttribute>();
    } }
    /** /** Initialization of analysis and base types. */
    * Initialization of analysis and base types.
    */
    private void initialize() { private void initialize() {
    ctx = new Context(); ctx = new Context();
    ...@@ -205,6 +201,9 @@ public class EMFProductLineTranslation implements IProductLineTranslation { ...@@ -205,6 +201,9 @@ public class EMFProductLineTranslation implements IProductLineTranslation {
    z3Expr2EObject = new HashMap<Expr<?>, EObject>(); z3Expr2EObject = new HashMap<Expr<?>, EObject>();
    eObject2referencingEObjects = new HashMap<EObject, BucketSetMap<EReference, EObject>>() { eObject2referencingEObjects = new HashMap<EObject, BucketSetMap<EReference, EObject>>() {
    /** ISerializable */
    private static final long serialVersionUID = -4436109358184535028L;
    /** {@inheritDoc} */ /** {@inheritDoc} */
    @Override @Override
    public BucketSetMap<EReference, EObject> get(Object key1) { public BucketSetMap<EReference, EObject> get(Object key1) {
    ...@@ -220,7 +219,7 @@ public class EMFProductLineTranslation implements IProductLineTranslation { ...@@ -220,7 +219,7 @@ public class EMFProductLineTranslation implements IProductLineTranslation {
    } }
    }; };
    // Initialize model independent base types // Initialize model independent base types.
    intSort = ctx.mkIntSort(); intSort = ctx.mkIntSort();
    stringSort = ctx.mkStringSort(); stringSort = ctx.mkStringSort();
    boolSort = ctx.mkBoolSort(); boolSort = ctx.mkBoolSort();
    ...@@ -233,10 +232,10 @@ public class EMFProductLineTranslation implements IProductLineTranslation { ...@@ -233,10 +232,10 @@ public class EMFProductLineTranslation implements IProductLineTranslation {
    /** {@inheritDoc} */ /** {@inheritDoc} */
    @Override @Override
    public final void translateModel(EObject model) { public final void translateModel(EObject model) {
    // Initialize and reset local fields // Initialize and reset local fields.
    initialize(); initialize();
    // Reference types need to be collected first, since they are required by optimizations in // Reference types need to be collected first, since they are required by optimizations.
    collectReferenceTypes(); collectReferenceTypes();
    collectTranslatedObjects(model, null); collectTranslatedObjects(model, null);
    ...@@ -244,14 +243,14 @@ public class EMFProductLineTranslation implements IProductLineTranslation { ...@@ -244,14 +243,14 @@ public class EMFProductLineTranslation implements IProductLineTranslation {
    collectReferencedIslandObjects(); collectReferencedIslandObjects();
    } }
    // Metamodel translation // Metamodel translation.
    translateClassesMetamodel(); translateClassesMetamodel();
    translateAttributesAndReferencesMetamodel(); translateAttributesAndReferencesMetamodel();
    // Model translation // Model translation.
    translateObjects(); translateObjects();
    // Translate variability // Translate variability.
    translateFeatureModel(); translateFeatureModel();
    translatePresenceConditions(); translatePresenceConditions();
    } }
    ...@@ -261,7 +260,7 @@ public class EMFProductLineTranslation implements IProductLineTranslation { ...@@ -261,7 +260,7 @@ public class EMFProductLineTranslation implements IProductLineTranslation {
    for(EReference ref : translatedReferences) { for(EReference ref : translatedReferences) {
    EClass refType = ref.getEReferenceType(); EClass refType = ref.getEReferenceType();
    // Check if reference type is translated or is a subclass of a translated class // Check if reference type is translated or is a subclass of a translated class.
    EClass translatedRefType = getTranslatedClass(refType); EClass translatedRefType = getTranslatedClass(refType);
    if(translatedRefType != null) { if(translatedRefType != null) {
    reference2TranslatedEClass.put(ref, translatedRefType); reference2TranslatedEClass.put(ref, translatedRefType);
    ...@@ -273,11 +272,11 @@ public class EMFProductLineTranslation implements IProductLineTranslation { ...@@ -273,11 +272,11 @@ public class EMFProductLineTranslation implements IProductLineTranslation {
    logInfo(LOG_PREFIX + "The reference \"" + ref.getName() + "\" of type " + logInfo(LOG_PREFIX + "The reference \"" + ref.getName() + "\" of type " +
    refType.getName() + refType.getName() +
    " is supposed to be transletd for a prodct-line analysis. Since this type is not specified to be translated, the translated sub-class " + " is supposed to be translated for a product-line analysis. Since this type is not specified to be translated, the translated sub-class " +
    ecls.getName() + " will be used."); ecls.getName() + " will be used.");
    } }
    } }
    // Check if any super type was found // Check if any super type was found.
    if(reference2TranslatedEClass.get(ref) == null) { if(reference2TranslatedEClass.get(ref) == null) {
    String errMsg = LOG_PREFIX + "ERefernce \"" + ref.getName() + "\" is of type " + String errMsg = LOG_PREFIX + "ERefernce \"" + ref.getName() + "\" is of type " +
    ref.getEReferenceType().getName() + " which is not translated."; ref.getEReferenceType().getName() + " which is not translated.";
    ...@@ -320,7 +319,7 @@ public class EMFProductLineTranslation implements IProductLineTranslation { ...@@ -320,7 +319,7 @@ public class EMFProductLineTranslation implements IProductLineTranslation {
    } }
    } }
    // For the island optimization all references (also non-variable) need to be collected // For the island optimization, all references (also non-variable) need to be collected.
    if(isIslandOptimizationEnabled) { if(isIslandOptimizationEnabled) {
    collectIncomingReferences(model); collectIncomingReferences(model);
    } }
    ...@@ -369,7 +368,7 @@ public class EMFProductLineTranslation implements IProductLineTranslation { ...@@ -369,7 +368,7 @@ public class EMFProductLineTranslation implements IProductLineTranslation {
    return; return;
    } }
    // Collect outgoing references // Collect outgoing references.
    for(EReference ref : model.eClass().getEAllReferences()) { for(EReference ref : model.eClass().getEAllReferences()) {
    if(translatedReferences.contains(ref)) { if(translatedReferences.contains(ref)) {
    EObject refObj = (EObject)model.eGet(ref); EObject refObj = (EObject)model.eGet(ref);
    ...@@ -380,7 +379,7 @@ public class EMFProductLineTranslation implements IProductLineTranslation { ...@@ -380,7 +379,7 @@ public class EMFProductLineTranslation implements IProductLineTranslation {
    } }
    } }
    // Collect incoming references // Collect incoming references.
    BucketSetMap<EReference, EObject> incomingReferences = BucketSetMap<EReference, EObject> incomingReferences =
    eObject2referencingEObjects.get(model); eObject2referencingEObjects.get(model);
    for(EReference ref : incomingReferences.keySet()) { for(EReference ref : incomingReferences.keySet()) {
    ...@@ -468,7 +467,7 @@ public class EMFProductLineTranslation implements IProductLineTranslation { ...@@ -468,7 +467,7 @@ public class EMFProductLineTranslation implements IProductLineTranslation {
    featureModelAssertions.add(fmExpr); featureModelAssertions.add(fmExpr);
    // Translate all features (including alternatives) // Translate all features (including alternatives).
    for(AbstractFeature f : getChildrenWithType(featureModel, AbstractFeature.class)) { for(AbstractFeature f : getChildrenWithType(featureModel, AbstractFeature.class)) {
    String name = f.getName(); String name = f.getName();
    String constName = "FEATURE_" + name; String constName = "FEATURE_" + name;
    ...@@ -491,7 +490,7 @@ public class EMFProductLineTranslation implements IProductLineTranslation { ...@@ -491,7 +490,7 @@ public class EMFProductLineTranslation implements IProductLineTranslation {
    } }
    } }
    // For alternatives also translate the alternative selection criteria // For alternatives also translate the alternative selection criteria.
    for(AbstractAlternativeFeature af : getChildrenWithType(featureModel, for(AbstractAlternativeFeature af : getChildrenWithType(featureModel,
    AbstractAlternativeFeature.class)) { AbstractAlternativeFeature.class)) {
    BoolExpr afExpr = feature2BoolExpr.get(af); BoolExpr afExpr = feature2BoolExpr.get(af);
    ...@@ -563,7 +562,7 @@ public class EMFProductLineTranslation implements IProductLineTranslation { ...@@ -563,7 +562,7 @@ public class EMFProductLineTranslation implements IProductLineTranslation {
    modelAssertions.add(rafValAssertion); modelAssertions.add(rafValAssertion);
    } }
    // Null must always only point to null.... // Null must always only point to null.
    EClass refType = reference2TranslatedEClass.get(er); EClass refType = reference2TranslatedEClass.get(er);
    Expr<?> nullElement = eClass2NullElement.get(ec); Expr<?> nullElement = eClass2NullElement.get(ec);
    if(er.getUpperBound() > 0) { if(er.getUpperBound() > 0) {
    ...@@ -589,7 +588,7 @@ public class EMFProductLineTranslation implements IProductLineTranslation { ...@@ -589,7 +588,7 @@ public class EMFProductLineTranslation implements IProductLineTranslation {
    FuncDecl<?> refSelFun = eClass2SelectionFunction.get(refType); FuncDecl<?> refSelFun = eClass2SelectionFunction.get(refType);
    if(er.getUpperBound() < 0) { if(er.getUpperBound() < 0) {
    // Case for lists // Case for lists.
    List<?> values = (List<?>)value; List<?> values = (List<?>)value;
    if(values.size() == 0) { if(values.size() == 0) {
    ...@@ -628,7 +627,7 @@ public class EMFProductLineTranslation implements IProductLineTranslation { ...@@ -628,7 +627,7 @@ public class EMFProductLineTranslation implements IProductLineTranslation {
    Expr singleValExpr = eObject2z3Expr.get((EObject)value, refType); Expr singleValExpr = eObject2z3Expr.get((EObject)value, refType);
    if(refSelFun != null) { if(refSelFun != null) {
    // Case with variable target // Case with variable target.
    BoolExpr eoSel = (BoolExpr)ctx.mkApp(refSelFun, singleValExpr); BoolExpr eoSel = (BoolExpr)ctx.mkApp(refSelFun, singleValExpr);
    return ctx.mkITE(eoSel, singleValExpr, refNullValue); return ctx.mkITE(eoSel, singleValExpr, refNullValue);
    ...@@ -664,7 +663,7 @@ public class EMFProductLineTranslation implements IProductLineTranslation { ...@@ -664,7 +663,7 @@ public class EMFProductLineTranslation implements IProductLineTranslation {
    /** Translates the given object for a primitive type (Enums, Integer, String, Boolean) to Z3. */ /** Translates the given object for a primitive type (Enums, Integer, String, Boolean) to Z3. */
    private Expr<?> translatePrimitiveObject(Object value, EDataType attType) { private Expr<?> translatePrimitiveObject(Object value, EDataType attType) {
    // Single value // Single value.
    if(attType.equals(EcorePackage.Literals.EINT)) { if(attType.equals(EcorePackage.Literals.EINT)) {
    if(value == null) { if(value == null) {
    logError(LOG_PREFIX + "null int found"); logError(LOG_PREFIX + "null int found");
    ...@@ -739,7 +738,7 @@ public class EMFProductLineTranslation implements IProductLineTranslation { ...@@ -739,7 +738,7 @@ public class EMFProductLineTranslation implements IProductLineTranslation {
    logInfo(LOG_PREFIX + "The reference \"" + er.getName() + logInfo(LOG_PREFIX + "The reference \"" + er.getName() +
    "\" of type " + refType.getName() + "\" of type " + refType.getName() +
    " is supposed to be transletd for a prodct-line analysis. Since this type is not specified to be translated, the translated sub-class " + " is supposed to be translated for a product-line analysis. Since this type is not specified to be translated, the translated sub-class " +
    ecls.getName() + " will be used."); ecls.getName() + " will be used.");
    } }
    } }
    ...@@ -755,7 +754,7 @@ public class EMFProductLineTranslation implements IProductLineTranslation { ...@@ -755,7 +754,7 @@ public class EMFProductLineTranslation implements IProductLineTranslation {
    } }
    if(er.getUpperBound() < 0) { if(er.getUpperBound() < 0) {
    // This is the case of unlimited multiplicity, i.e. lists // This is the case of unlimited multiplicity, i.e., lists.
    refSort = ctx.mkSeqSort(refSort); refSort = ctx.mkSeqSort(refSort);
    } }
    ...@@ -767,12 +766,12 @@ public class EMFProductLineTranslation implements IProductLineTranslation { ...@@ -767,12 +766,12 @@ public class EMFProductLineTranslation implements IProductLineTranslation {
    } }
    } }
    /** Translates the give enumeration */ /** Translates the give enumeration. */
    private Sort translateEnum(EEnum en) { private Sort translateEnum(EEnum en) {
    String name = en.getName(); String name = en.getName();
    EList<EEnumLiteral> enumLiterals = en.getELiterals(); EList<EEnumLiteral> enumLiterals = en.getELiterals();
    // Null needs to be encoded as a dedicated literal // Null needs to be encoded as a dedicated literal.
    int numLiterals = enumLiterals.size(); int numLiterals = enumLiterals.size();
    String[] literals = new String[numLiterals + 1]; String[] literals = new String[numLiterals + 1];
    for(int i = 0; i < numLiterals; i++) { for(int i = 0; i < numLiterals; i++) {
    ...@@ -807,11 +806,11 @@ public class EMFProductLineTranslation implements IProductLineTranslation { ...@@ -807,11 +806,11 @@ public class EMFProductLineTranslation implements IProductLineTranslation {
    } }
    objSymbols[objs.size()] = ctx.mkSymbol(clsName + "NONE"); objSymbols[objs.size()] = ctx.mkSymbol(clsName + "NONE");
    // Create EnumSort for class // Create EnumSort for class.
    EnumSort<?> enumSort = ctx.mkEnumSort(ctx.mkSymbol(clsName), objSymbols); EnumSort<?> enumSort = ctx.mkEnumSort(ctx.mkSymbol(clsName), objSymbols);
    eClass2z3Sort.put(cls, enumSort); eClass2z3Sort.put(cls, enumSort);
    // Map objects to z3 enum literals // Map objects to z3 enum literals.
    Expr<?>[] consts = enumSort.getConsts(); Expr<?>[] consts = enumSort.getConsts();
    for(int i = 0; i < objs.size(); i++) { for(int i = 0; i < objs.size(); i++) {
    eObject2z3Expr.put(objs.get(i), cls, consts[i]); eObject2z3Expr.put(objs.get(i), cls, consts[i]);
    ...@@ -831,7 +830,6 @@ public class EMFProductLineTranslation implements IProductLineTranslation { ...@@ -831,7 +830,6 @@ public class EMFProductLineTranslation implements IProductLineTranslation {
    solver.add(presenceConditionAssertions solver.add(presenceConditionAssertions
    .toArray(new BoolExpr[presenceConditionAssertions.size()])); .toArray(new BoolExpr[presenceConditionAssertions.size()]));
    solver.add(modelAssertions.toArray(new BoolExpr[modelAssertions.size()])); solver.add(modelAssertions.toArray(new BoolExpr[modelAssertions.size()]));
    solver.add(constraintAssertions.toArray(new BoolExpr[constraintAssertions.size()])); solver.add(constraintAssertions.toArray(new BoolExpr[constraintAssertions.size()]));
    return solver; return solver;
    ...@@ -910,7 +908,7 @@ public class EMFProductLineTranslation implements IProductLineTranslation { ...@@ -910,7 +908,7 @@ public class EMFProductLineTranslation implements IProductLineTranslation {
    return constraintTracker2Constraint; return constraintTracker2Constraint;
    } }
    /** Automatically lifts the given constraint */ /** Automatically lifts the given constraint. */
    protected BoolExpr createLiftedConstraint(Expr<?>[] quantifierValiables, protected BoolExpr createLiftedConstraint(Expr<?>[] quantifierValiables,
    EClass[] variableClasses, BoolExpr[] containmentExprs, BoolExpr body, EClass[] variableClasses, BoolExpr[] containmentExprs, BoolExpr body,
    boolean isForAll) { boolean isForAll) {
    ...@@ -927,7 +925,7 @@ public class EMFProductLineTranslation implements IProductLineTranslation { ...@@ -927,7 +925,7 @@ public class EMFProductLineTranslation implements IProductLineTranslation {
    selExprs[i] = ctx.mkAnd(selected, notNull); selExprs[i] = ctx.mkAnd(selected, notNull);
    } }
    // Add containment expressions // Add containment expressions.
    int j = 0; int j = 0;
    for(int i = quantifierValiables.length; i < quantifierValiables.length + for(int i = quantifierValiables.length; i < quantifierValiables.length +
    containmentExprs.length; i++) { containmentExprs.length; i++) {
    ...@@ -999,7 +997,7 @@ public class EMFProductLineTranslation implements IProductLineTranslation { ...@@ -999,7 +997,7 @@ public class EMFProductLineTranslation implements IProductLineTranslation {
    /** /**
    * Enables or disables the "island optimization" for which only optional parts of the model are * Enables or disables the "island optimization" for which only optional parts of the model are
    * translated. * translated.
    * This optimization is disbaled by default. * This optimization is disabled by default.
    * *
    * Via the method {@code setIslandOptimizationStepNum()} it is possible to specify a range of * Via the method {@code setIslandOptimizationStepNum()} it is possible to specify a range of
    * transitive references to be guaranteed to be translated for all optional elements. * transitive references to be guaranteed to be translated for all optional elements.
    ...@@ -1007,7 +1005,7 @@ public class EMFProductLineTranslation implements IProductLineTranslation { ...@@ -1007,7 +1005,7 @@ public class EMFProductLineTranslation implements IProductLineTranslation {
    * interactions between optional and non-optional elements. * interactions between optional and non-optional elements.
    * *
    * @param setEnabled * @param setEnabled
    * 'true' will enable the island optimization; 'false' will disbale. * 'true' will enable the island optimization; 'false' will disable.
    */ */
    public void setIslandOptimizationEnabled(boolean setEnabled) { public void setIslandOptimizationEnabled(boolean setEnabled) {
    this.isIslandOptimizationEnabled = setEnabled; this.isIslandOptimizationEnabled = setEnabled;
    ...@@ -1021,7 +1019,7 @@ public class EMFProductLineTranslation implements IProductLineTranslation { ...@@ -1021,7 +1019,7 @@ public class EMFProductLineTranslation implements IProductLineTranslation {
    * interactions between optional and non-optional elements. * interactions between optional and non-optional elements.
    * *
    * @param stepNum * @param stepNum
    * The number of trabnsitive references to be guaranteed to be translated for all * The number of transitive references to be guaranteed to be translated for all
    * optional elements. * optional elements.
    */ */
    public void setIslandOptimizationStepNum(int stepNum) { public void setIslandOptimizationStepNum(int stepNum) {
    ......
    ...@@ -45,10 +45,8 @@ public abstract class GenericProductLineAnalysis { ...@@ -45,10 +45,8 @@ public abstract class GenericProductLineAnalysis {
    this.translation = translation; this.translation = translation;
    } }
    /** /** Creates the {@link IProductLineConstraint}s to be checked by this analysis. */
    * Creates the {@link IProductLineConstraint}s to be checked by this analysis. protected abstract Collection<IProductLineConstraint> createConstraints();
    */
    protected abstract Collection<IProductLineConstraint> createConstriants();
    /** /**
    * Performs a product-line analysis for the given model. * Performs a product-line analysis for the given model.
    ...@@ -57,7 +55,7 @@ public abstract class GenericProductLineAnalysis { ...@@ -57,7 +55,7 @@ public abstract class GenericProductLineAnalysis {
    * analysis. 'false' otherwise. * analysis. 'false' otherwise.
    */ */
    public List<ProductLineConstraintViolation> doCheck() { public List<ProductLineConstraintViolation> doCheck() {
    plConstraints = createConstriants(); plConstraints = createConstraints();
    setTranslatedMetamodelElements(); setTranslatedMetamodelElements();
    ......
    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