package parser;
import application.editor.Stage;
import com.mxgraph.model.mxCell;
import com.mxgraph.model.mxGeometry;
import com.mxgraph.model.mxIGraphModel;
import com.mxgraph.view.mxCellState;
import com.mxgraph.view.mxGraph;
import com.mxgraph.view.mxGraphView;
import models.dataFlowModel.DataTransferModel;
import parser.exceptions.*;
import java.io.BufferedReader;
public class ParserDTRAM extends Parser {
private static final String MODEL_GROUP = "model";
private static final String GEOMETRY_GROUP = "geometry";
private static final String GEOMETORY_NODE = "node";
private static final String RESOURCE_NODE = "r";
private static final String CHANNEL_NODE = "c";
private static final String FORMULA_CHANNEL_NODE = "fc";
private static final String IO_CHANNEL_NODE = "ioc";
/**
* --------------------------------------------------------------------------------
* [Constructor]
* /**--------------------------------------------------------------------------------
*
* @param stream
*/
public ParserDTRAM(final TokenStream stream) {
super(stream);
}
/**
* --------------------------------------------------------------------------------
*
* @param reader
*/
public ParserDTRAM(final BufferedReader reader) {
super(reader);
}
/**
* --------------------------------------------------------------------------------
* [public]
* /**--------------------------------------------------------------------------------
*
* @param reader
* @throws WrongJsonExpression
* @throws ExpectedColon
* @throws ExpectedDoubleQuotation
*/
public DataTransferModel doParseModel()
throws ExpectedRightBracket, ExpectedChannel, ExpectedChannelName, ExpectedLeftCurlyBracket, ExpectedInOrOutOrRefOrSubKeyword, ExpectedStateTransition, ExpectedEquals, ExpectedRHSExpression, WrongLHSExpression, WrongRHSExpression, ExpectedAssignment, ExpectedModel, ExpectedGeometry, ExpectedRightCurlyBracket, WrongPathExpression, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation {
DataTransferModel model = getParsedModel();
return model;
}
/**
* --------------------------------------------------------------------------------
*
* @param graph
*/
public void doParseGeometry(mxGraph graph)
throws ExpectedRightBracket, ExpectedChannel, ExpectedChannelName, ExpectedLeftCurlyBracket, ExpectedInOrOutOrRefOrSubKeyword, ExpectedStateTransition, ExpectedEquals, ExpectedRHSExpression, WrongLHSExpression, WrongRHSExpression, ExpectedAssignment, ExpectedModel, ExpectedGeometry, ExpectedNode, ExpectedResource, ExpectedFormulaChannel, ExpectedIoChannel {
parseGeometry(graph);
}
/**
* --------------------------------------------------------------------------------
* [private]
* /**--------------------------------------------------------------------------------
*
* @param stream
* @throws WrongJsonExpression
* @throws ExpectedColon
* @throws ExpectedDoubleQuotation
*/
private DataTransferModel getParsedModel()
throws ExpectedRightBracket, ExpectedChannel, ExpectedChannelName, ExpectedLeftCurlyBracket, ExpectedInOrOutOrRefOrSubKeyword, ExpectedStateTransition, ExpectedEquals, ExpectedRHSExpression, WrongLHSExpression, WrongRHSExpression, ExpectedAssignment, ExpectedModel, ExpectedGeometry, ExpectedRightCurlyBracket, WrongPathExpression, WrongJsonExpression, ExpectedColon, ExpectedDoubleQuotation {
if (!stream.hasNext()) throw new NullPointerException();
String modelKeyword = stream.next();
if (!modelKeyword.equals(MODEL_GROUP)) throw new ExpectedModel(stream.getLine());
if (!stream.hasNext()) throw new ExpectedModel(stream.getLine());
String leftBracket = stream.next();
if (!leftBracket.equals(LEFT_CURLY_BRACKET)) throw new ExpectedLeftCurlyBracket(stream.getLine());
DataTransferModel model = parseDataFlowModel();
String rightBracket = stream.next();
if (!rightBracket.equals(RIGHT_CURLY_BRACKET)) throw new ExpectedRightBracket(stream.getLine());
return model;
}
/**
* --------------------------------------------------------------------------------
* change graph's geometries from "DTRAM" file.
*
* @param stream
* @param graph
*/
private void parseGeometry(mxGraph graph)
throws ExpectedRightBracket, ExpectedChannel, ExpectedChannelName, ExpectedLeftCurlyBracket, ExpectedInOrOutOrRefOrSubKeyword, ExpectedStateTransition, ExpectedEquals, ExpectedRHSExpression, WrongLHSExpression, WrongRHSExpression, ExpectedAssignment, ExpectedModel, ExpectedGeometry, ExpectedNode, ExpectedResource, ExpectedFormulaChannel, ExpectedIoChannel {
if (!doesMatchToKeyword(stream.next(), GEOMETRY_GROUP)) throw new ExpectedGeometry(stream.getLine());
if (!doesMatchToKeyword(stream.next(), LEFT_CURLY_BRACKET))
throw new ExpectedLeftCurlyBracket(stream.getLine());
String node = stream.next();
while (node.equals(GEOMETORY_NODE)) {
String rOrFcOrIocOrC = stream.next();
if (!rOrFcOrIocOrC.equals(RESOURCE_NODE)
&& !rOrFcOrIocOrC.equals(FORMULA_CHANNEL_NODE)
&& !rOrFcOrIocOrC.equals(CHANNEL_NODE)
&& !rOrFcOrIocOrC.equals(IO_CHANNEL_NODE))
throw new ExpectedNode(stream.getLine());
String name = stream.next();
if (!doesMatchToKeyword(stream.next(), COLON)) throw new ExpectedAssignment(stream.getLine());
String x = stream.next();
int xC = Integer.parseInt(x); // C = Coordinate(x,y,w,h)
if (!doesMatchToKeyword(stream.next(), COMMA)) throw new ExpectedAssignment(stream.getLine());
String y = stream.next();
int yC = Integer.parseInt(y);
if (!doesMatchToKeyword(stream.next(), COMMA)) throw new ExpectedAssignment(stream.getLine());
String w = stream.next();
int wC = Integer.parseInt(w);
if (!doesMatchToKeyword(stream.next(), COMMA)) throw new ExpectedAssignment(stream.getLine());
String h = stream.next();
int hC = Integer.parseInt(h);
Object root = graph.getDefaultParent();
mxCell nodeLayer = (mxCell) ((mxCell) root).getChildAt(Stage.NODE_LAYER);
mxCell dataFlowLayer = (mxCell) ((mxCell) root).getChildAt(Stage.DATA_FLOW_LAYER);
mxIGraphModel graphModel = graph.getModel();
for (int i = 0; i < graph.getModel().getChildCount(nodeLayer); i++) {
Object cell = graph.getModel().getChildAt(nodeLayer, i);
if (!graph.getModel().isVertex(cell)) continue;
mxGeometry geom = (mxGeometry) ((mxCell) cell).getGeometry().clone();
mxGraphView view = graph.getView();
mxCellState state = view.getState(cell);
if (!name.equals(state.getLabel())) continue;
geom.setX(xC);
geom.setY(yC);
graphModel.setGeometry(cell, geom);
}
for (int i = 0; i < graph.getModel().getChildCount(dataFlowLayer); i++) {
Object cell = graph.getModel().getChildAt(dataFlowLayer, i);
if (!graph.getModel().isVertex(cell)) continue;
mxGeometry geom = (mxGeometry) ((mxCell) cell).getGeometry().clone();
mxGraphView view = graph.getView();
mxCellState state = view.getState(cell);
if (!name.equals(state.getLabel())) continue;
geom.setX(xC);
geom.setY(yC);
graphModel.setGeometry(cell, geom);
}
node = stream.next();
}
if (!node.equals(RIGHT_CURLY_BRACKET)) throw new ExpectedRightBracket(stream.getLine());
}
}