/**
* 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.operator.merge;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.jdt.annotation.NonNull;
import edu.toronto.cs.se.mmint.MMINTException;
import edu.toronto.cs.se.mmint.java.reasoning.IJavaOperatorInputConstraint;
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.operator.impl.OperatorImpl;
import edu.toronto.cs.se.mmint.mid.utils.FileUtils;
import edu.toronto.cs.se.modelepedia.primitive.int_.Int;
import edu.toronto.cs.se.modelepedia.primitive.int_.IntFactory;
public class Sum extends OperatorImpl {
public static class InputConstraint implements IJavaOperatorInputConstraint {
@Override
public boolean isAllowedInput(Map<String, Model> inputsByName) {
Model intModel1 = inputsByName.get(IN_INT1);
Model intModel2 = inputsByName.get(IN_INT2);
if (intModel1 == intModel2) {
return false;
}
return true;
}
}
// input-output
private final static @NonNull String IN_INT1 = "int1";
private final static @NonNull String IN_INT2 = "int2";
private final static @NonNull String OUT_INT = "sum";
// constants
private final static @NonNull String SUM_SEPARATOR = "+";
private @NonNull Int sum(@NonNull Model intModel1, @NonNull Model intModel2) throws MMINTException {
int sum = ((Int) intModel1.getEMFInstanceRoot()).getValue() + ((Int) intModel2.getEMFInstanceRoot()).getValue();
Int sumModelObj = IntFactory.eINSTANCE.createInt();
sumModelObj.setValue(sum);
return sumModelObj;
}
@Override
public java.util.Map<String, Model> run(
java.util.Map<String, Model> inputsByName, java.util.Map<String, GenericElement> genericsByName,
java.util.Map<String, MID> outputMIDsByName) throws Exception {
// input
Model intModel1 = inputsByName.get(IN_INT1);
Model intModel2 = inputsByName.get(IN_INT2);
// sum the inputs
Int sumModelObj = sum(intModel1, intModel2);
// output
String sumModelUri = FileUtils.replaceFileNameInUri(
intModel1.getUri(),
intModel1.getName() + SUM_SEPARATOR + intModel2.getName());
FileUtils.writeModelFile(sumModelObj, sumModelUri, true);
Model sumModel = intModel1.getMetatype().createInstanceAndEditor(sumModelUri, outputMIDsByName.get(OUT_INT));
Map<String, Model> outputsByName = new HashMap<>();
outputsByName.put(OUT_INT, sumModel);
return outputsByName;
}
}