Newer
Older
AlgebraicDataflowArchitectureModel / AlgebraicDataflowArchitectureModel / src / parser / ParserDTRAM.java
Shohei Yamagiwa 19 days ago 7 KB Format files
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());
	}
}