package edu.kit.ipd.sdq.vitruvius.framework.change2commandtransformingprovider;

import java.util.Iterator;

import edu.kit.ipd.sdq.vitruvius.framework.contracts.datatypes.TransformationMetamodelPair;
import edu.kit.ipd.sdq.vitruvius.framework.contracts.datatypes.VURI;
import edu.kit.ipd.sdq.vitruvius.framework.contracts.interfaces.Change2CommandTransforming;
import edu.kit.ipd.sdq.vitruvius.framework.contracts.interfaces.Change2CommandTransformingProviding;
import edu.kit.ipd.sdq.vitruvius.framework.util.datatypes.ClaimableHashMap;
import edu.kit.ipd.sdq.vitruvius.framework.util.datatypes.ClaimableMap;

/**
 * This abstract implementation of the {@link Change2CommandTransformingProviding} provides a
 * default implementation for the handling of {@link Change2CommandTransforming}s. A concrete
 * {@link Change2CommandTransformingProviding} can be derived from this class adding the needed
 * transformation executors.
 *
 * @author Heiko Klare
 */
public abstract class AbstractChange2CommandTransformingProviding implements Change2CommandTransformingProviding {
    private ClaimableMap<TransformationMetamodelPair, Change2CommandTransforming> transformationExecuterMap;

    public AbstractChange2CommandTransformingProviding() {
        this.transformationExecuterMap = new ClaimableHashMap<TransformationMetamodelPair, Change2CommandTransforming>();
    }

    public void addChange2CommandTransforming(final Change2CommandTransforming change2CommandTransforming) {
        this.transformationExecuterMap.put(change2CommandTransforming.getTransformableMetamodels(),
                change2CommandTransforming);
    }

    @Override
    public Change2CommandTransforming getChange2CommandTransforming(final VURI mmURI1, final VURI mmURI2) {
        TransformationMetamodelPair vuriPair = new TransformationMetamodelPair(mmURI1, mmURI2);
        return this.transformationExecuterMap.claimValueForKey(vuriPair);
    }

    @Override
    public Iterator<Change2CommandTransforming> iterator() {
        return this.transformationExecuterMap.values().iterator();
    }

}

@@ -103,16 +103,40 @@
 erator;%0D
+%0Aimport java.util.List;%0D
 %0A%0D%0Aimpor
@@ -1402,24 +1402,42 @@
 orming%3E();%0D%0A
+        setup();%0D%0A
     %7D%0D%0A%0D%0A   
@@ -2158,11 +2158,570 @@
    %7D%0D%0A%0D%0A
+    protected abstract void setup();%0D%0A%0D%0A    public static Change2CommandTransformingProviding createChange2CommandTransformingProviding(%0D%0A            final List%3CChange2CommandTransforming%3E change2CommandTransformings) %7B%0D%0A        return new AbstractChange2CommandTransformingProviding() %7B%0D%0A            @Override%0D%0A            public void setup() %7B%0D%0A                for (Change2CommandTransforming transformer : change2CommandTransformings) %7B%0D%0A                    addChange2CommandTransforming(transformer);%0D%0A                %7D%0D%0A            %7D%0D%0A        %7D;%0D%0A    %7D%0D%0A
 %7D%0D%0A

Add a static factory method for the AbstractChange2CommandTransformingProviding.