/**
* Copyright (c) 2012-2016 Marsha Chechik, Alessio Di Sandro, Michalis Famelis,
* Rick Salay.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Alessio Di Sandro - Implementation.
*/
package edu.toronto.cs.se.modelepedia.kleisli.transformation;
import java.util.Map;
import edu.toronto.cs.se.mmint.mid.GenericElement;
import edu.toronto.cs.se.mmint.mid.MID;
import edu.toronto.cs.se.mmint.mid.Model;
import edu.toronto.cs.se.mmint.mid.ModelEndpoint;
import edu.toronto.cs.se.mmint.mid.relationship.BinaryMappingReference;
import edu.toronto.cs.se.mmint.mid.relationship.BinaryModelRel;
import edu.toronto.cs.se.mmint.mid.relationship.Mapping;
import edu.toronto.cs.se.mmint.mid.relationship.MappingReference;
import edu.toronto.cs.se.mmint.mid.relationship.ModelElementReference;
import edu.toronto.cs.se.modelepedia.kleisli.BinaryKleisliModelRel;
import edu.toronto.cs.se.modelepedia.kleisli.KleisliModelEndpoint;
import edu.toronto.cs.se.modelepedia.operator.patch.ModelRelTypeTransformation;
public class KleisliModelRelTypeTransformation extends ModelRelTypeTransformation {
@Override
protected void transform(BinaryModelRel traceModelRel, Model srcModel, int srcIndex, int tgtIndex) throws Exception {
ModelEndpoint srcModelEndpoint = traceModelRel.getModelEndpoints().get(0);
if (srcModelEndpoint instanceof KleisliModelEndpoint) {
traceModelRel.openInstance();
srcModel = ((KleisliModelEndpoint) srcModelEndpoint).getExtendedTarget();
}
super.transform(traceModelRel, srcModel, srcIndex, tgtIndex);
}
@Override
public Map<String, Model> run(Map<String, Model> inputsByName,
java.util.Map<String, GenericElement> genericsByName, Map<String, MID> outputMIDsByName)
throws Exception {
Map<String, Model> outputsByName = super.run(inputsByName, genericsByName, outputMIDsByName);
BinaryKleisliModelRel kTraceModelRel = (BinaryKleisliModelRel) outputsByName.get(OUT_MODELREL);
Model modelPivot = kTraceModelRel.getSourceModel();
kTraceModelRel.setSourceModel(kTraceModelRel.getTargetModel());
kTraceModelRel.setTargetModel(modelPivot);
kTraceModelRel.getModelEndpoints().move(1, 0);
kTraceModelRel.getModelEndpointRefs().move(1, 0);
for (Mapping kMapping : kTraceModelRel.getMappings()) {
kMapping.getModelElemEndpoints().move(1, 0);
kMapping.getModelElemEndpointRefs().move(1, 0);
}
for (MappingReference kMappingRef : kTraceModelRel.getMappingRefs()) {
kMappingRef.getModelElemEndpointRefs().move(1, 0);
ModelElementReference modelElemRefPivot = ((BinaryMappingReference) kMappingRef).getSourceModelElemRef();
((BinaryMappingReference) kMappingRef).setSourceModelElemRef(((BinaryMappingReference) kMappingRef).getTargetModelElemRef());
((BinaryMappingReference) kMappingRef).setTargetModelElemRef(modelElemRefPivot);
}
return outputsByName;
}
}