package fr.inria.diversify.persistence.json.input;
import fr.inria.diversify.codeFragment.CodeFragment;
import fr.inria.diversify.diversification.InputProgram;
import fr.inria.diversify.transformation.Transformation;
import fr.inria.diversify.transformation.ast.ASTReplace;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.Map;
import java.util.UUID;
import static fr.inria.diversify.persistence.json.output.JsonSectionOutput.*;
/**
* Created by marodrig on 12/01/2015.
*/
public class JsonAstReplaceInput extends JsonTransformationInput {
public JsonAstReplaceInput(InputProgram inputProgram, JSONObject jsonObject) {
super(inputProgram, jsonObject);
}
public JsonAstReplaceInput(InputProgram inputProgram) {
super(inputProgram);
}
@Override
protected Transformation build() {
return new ASTReplace();
}
@Override
public void read(Map<UUID, Transformation> transformations) {
ASTReplace transf = null;
try {
transf = (ASTReplace) get(transformations); //add the transformation to the transformations map if not present
JSONObject cfJson = getJsonObject().getJSONObject(TRANSPLANT_POINT);
CodeFragment cf = getCodeFragment(cfJson.getString(POSITION), cfJson.getString(SOURCE_CODE));
logCfStatus(transf, cf, cfJson.getString(POSITION), cfJson.getString(SOURCE_CODE));
transf.setTransplantationPoint(cf);
cfJson = getJsonObject().getJSONObject(TRANSPLANT);
cf = getCodeFragment(cfJson.getString(POSITION), cfJson.getString(SOURCE_CODE));
logCfStatus(transf, cf, cfJson.getString(POSITION), cfJson.getString(SOURCE_CODE));
transf.setTransplant(cf);
transf.setVarMapping(getVarMap(getJsonObject().getJSONObject(VARIABLE_MAP)));
//Add transformation if all went OK
addTransformation(transformations, transf);
} catch (JSONException e) {
String s = "JsonAstReplaceInput::read Unable to parse replace transformation from json object";
throwError(getTransformationErrorString(transf, s), e, true);
}
}
/**
* Indicate if can handle a section within the file
*
* @param s Section name
* @return True if can handle
*/
@Override
public boolean canRead(String s) {
String[] r = s.split("\\.");
if ( r.length != 2 ) return false;
return r[0].equals(TRANSFORMATIONS) && r[1].toLowerCase().contains("replace");
}
}