package parser; import java.io.BufferedReader; import java.io.IOException; 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.DataFlowModel; import parser.exceptions.ExpectedAssignment; import parser.exceptions.ExpectedChannel; import parser.exceptions.ExpectedChannelName; import parser.exceptions.ExpectedEquals; import parser.exceptions.ExpectedFormulaChannel; import parser.exceptions.ExpectedGeometry; import parser.exceptions.ExpectedInOrOutOrRefKeyword; import parser.exceptions.ExpectedIoChannel; import parser.exceptions.ExpectedLeftCurlyBracket; import parser.exceptions.ExpectedModel; import parser.exceptions.ExpectedNode; import parser.exceptions.ExpectedRHSExpression; import parser.exceptions.ExpectedResource; import parser.exceptions.ExpectedRightBracket; import parser.exceptions.ExpectedStateTransition; import parser.exceptions.WrongLHSExpression; import parser.exceptions.WrongRHSExpression; public class ParserDTRAM extends Parser { private final String MODEL = "model"; private final String GEOMETRY = "geometry"; private final String NODE = "node"; private final String RESOURCE = "r"; private final String CHANNEL = "c"; private final String FORMULA_CHANNEL = "fc"; private final String IO_CHANNEL = "ioc"; /**-------------------------------------------------------------------------------- * [Constructor] /**-------------------------------------------------------------------------------- * * @param stream */ public ParserDTRAM(final TokenStream stream) { super(stream); } /**-------------------------------------------------------------------------------- * * @param reader */ public ParserDTRAM(final BufferedReader reader) { super(reader); } /**-------------------------------------------------------------------------------- * [public] /**-------------------------------------------------------------------------------- * * @param reader */ public DataFlowModel doParseModel() throws ExpectedRightBracket, ExpectedChannel, ExpectedChannelName, ExpectedLeftCurlyBracket, ExpectedInOrOutOrRefKeyword, ExpectedStateTransition, ExpectedEquals, ExpectedRHSExpression, WrongLHSExpression, WrongRHSExpression, ExpectedAssignment, ExpectedModel, ExpectedGeometry { DataFlowModel model = getParsedModel(); return model; } /**-------------------------------------------------------------------------------- * * @param graph */ public void doParseGeometry(final mxGraph graph) throws ExpectedRightBracket, ExpectedChannel, ExpectedChannelName, ExpectedLeftCurlyBracket, ExpectedInOrOutOrRefKeyword, ExpectedStateTransition, ExpectedEquals, ExpectedRHSExpression, WrongLHSExpression, WrongRHSExpression, ExpectedAssignment, ExpectedModel, ExpectedGeometry, ExpectedNode, ExpectedResource, ExpectedFormulaChannel, ExpectedIoChannel{ parseGeometry(graph); } /**-------------------------------------------------------------------------------- * [private] /**-------------------------------------------------------------------------------- * * @param stream */ private DataFlowModel getParsedModel() throws ExpectedRightBracket, ExpectedChannel, ExpectedChannelName, ExpectedLeftCurlyBracket, ExpectedInOrOutOrRefKeyword, ExpectedStateTransition, ExpectedEquals, ExpectedRHSExpression, WrongLHSExpression, WrongRHSExpression, ExpectedAssignment, ExpectedModel, ExpectedGeometry { if (!stream.hasNext()) throw new NullPointerException(); String modelKeyword = stream.next(); if (!modelKeyword.equals(MODEL)) 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()); DataFlowModel 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(final mxGraph graph) throws ExpectedRightBracket, ExpectedChannel, ExpectedChannelName, ExpectedLeftCurlyBracket, ExpectedInOrOutOrRefKeyword, ExpectedStateTransition, ExpectedEquals, ExpectedRHSExpression, WrongLHSExpression, WrongRHSExpression, ExpectedAssignment,ExpectedModel, ExpectedGeometry, ExpectedNode, ExpectedResource, ExpectedFormulaChannel, ExpectedIoChannel { String geometoryToken = stream.next(); if(!geometoryToken.equals(GEOMETRY)) throw new ExpectedGeometry(stream.getLine()); String leftCurlyBracketToken = stream.next(); if(!leftCurlyBracketToken.equals(LEFT_CURLY_BRACKET)) throw new ExpectedLeftCurlyBracket(stream.getLine()); String node = stream.next(); while (node.equals(NODE)) { String rOrFcOrIocOrC = stream.next(); if(!rOrFcOrIocOrC.equals(RESOURCE) && !rOrFcOrIocOrC.equals(FORMULA_CHANNEL) && !rOrFcOrIocOrC.equals(CHANNEL) && !rOrFcOrIocOrC.equals(IO_CHANNEL)) throw new ExpectedNode(stream.getLine()); String name = stream.next(); String colonToken = stream.next(); if(!colonToken.equals(COLON)) throw new ExpectedAssignment(stream.getLine()); String x = stream.next(); int xC = Integer.parseInt(x); // C = Coordinate(x,y,w,h) String commaToken = stream.next(); if(!commaToken.equals(COMMA))throw new ExpectedAssignment(stream.getLine()); String y = stream.next(); int yC = Integer.parseInt(y); commaToken = stream.next(); if(!commaToken.equals(COMMA))throw new ExpectedAssignment(stream.getLine()); String w = stream.next(); int wC = Integer.parseInt(w); commaToken = stream.next(); if(!commaToken.equals(COMMA))throw new ExpectedAssignment(stream.getLine()); String h = stream.next(); int hC = Integer.parseInt(h); Object root = graph.getDefaultParent(); mxIGraphModel graphModel = graph.getModel(); for (int i = 0; i < graph.getModel().getChildCount(root); i++) { Object cell = graph.getModel().getChildAt(root, 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()); } }