/**
* 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.z3.mavo;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.acceleo.engine.event.AcceleoTextGenerationEvent;
import org.eclipse.acceleo.engine.event.IAcceleoTextGenerationListener;
import org.eclipse.jdt.annotation.NonNull;
import edu.toronto.cs.se.mavo.MAVOElement;
public class EcoreMAVOToSMTLIBListener implements IAcceleoTextGenerationListener {
private static final @NonNull String NODE_MARKER = "Node";
private static final @NonNull String EDGE_MARKER = "Edge";
private static final @NonNull String MODEL_START_MARKER = ";Model";
private static final @NonNull String MODEL_END_MARKER = ";End Model";
private static final int MODEL_NUM_TOKENS = 4;
private static final @NonNull String MACROS_START_MARKER = ";Macros";
private static final @NonNull String MACROS_END_MARKER = ";End Macros";
private Map<String, MAVOElement> mavoModelObjs;
private boolean isMayOnly;
private StringBuilder smtEncoding;
private Map<Integer, String> smtNodes;
private Map<Integer, String> smtEdges;
private Map<Integer, String> smtCurrentElems;
private boolean checkModel;
private String[] smtTokens;
private int smtTokenCounter;
private boolean checkMacros;
private StringBuilder smtMacros;
private String smtEncodingUri;
private Z3MAVOModelParser z3ModelParser;
public EcoreMAVOToSMTLIBListener(@NonNull Map<String, MAVOElement> mavoModelObjs, boolean isMayOnly) {
this.mavoModelObjs = mavoModelObjs;
this.isMayOnly = isMayOnly;
smtEncoding = new StringBuilder();
smtNodes = new HashMap<>();
smtEdges = new HashMap<>();
checkModel = false;
smtTokens = new String[MODEL_NUM_TOKENS];
smtTokenCounter = MODEL_NUM_TOKENS;
checkMacros = false;
smtMacros = new StringBuilder();
}
@Override
public void textGenerated(AcceleoTextGenerationEvent event) {
String smtText = event.getText();
smtEncoding.append(smtText);
if (smtText.trim().endsWith(MODEL_START_MARKER)) {
checkModel = true;
return;
}
else if (smtText.trim().endsWith(MACROS_START_MARKER)) {
checkMacros = true;
return;
}
if (!checkModel && !checkMacros) {
return;
}
if (smtText.trim().endsWith(MODEL_END_MARKER)) {
checkModel = false;
return;
}
else if (smtText.trim().endsWith(MACROS_END_MARKER)) {
checkMacros = false;
return;
}
if (checkModel) {
if (smtTokenCounter < MODEL_NUM_TOKENS) {
smtTokens[smtTokenCounter] = smtText;
smtTokenCounter++;
if (smtTokenCounter == (MODEL_NUM_TOKENS)) {
smtCurrentElems.put(new Integer(smtTokens[MODEL_NUM_TOKENS-1]), smtTokens[MODEL_NUM_TOKENS-3]);
}
}
else if (smtText.equals(NODE_MARKER) || smtText.equals(EDGE_MARKER)) {
smtTokenCounter = 0;
smtCurrentElems = (smtText.equals(NODE_MARKER)) ? smtNodes : smtEdges;
}
}
else if (checkMacros) {
smtMacros.append(smtText);
}
}
@Override
public void filePathComputed(AcceleoTextGenerationEvent event) {
smtEncodingUri = event.getText();
}
@Override
public void fileGenerated(AcceleoTextGenerationEvent event) {
z3ModelParser = new Z3MAVOModelParser(smtEncoding.toString(), smtEncodingUri, smtNodes, smtEdges, smtMacros.toString(), mavoModelObjs, isMayOnly);
}
@Override
public void generationEnd(AcceleoTextGenerationEvent event) {
// do nothing
}
@Override
public boolean listensToGenerationEnd() {
return false;
}
public @NonNull Z3MAVOModelParser getZ3MAVOModelParser() {
return z3ModelParser;
}
}