/** * Copyright 2015 Santhosh Kumar Tekuri * * The JLibs authors license this file to you under the Apache License, * version 2.0 (the "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ package jlibs.nblr.rules; import jlibs.nblr.actions.Action; import java.util.ArrayList; import java.util.List; /** * @author Santhosh Kumar T */ public class Node{ public String name; public int id; public int stateID; public Answer buffering; public static final String DYNAMIC_STRING_MATCH = "@DYNAMIC_STRING_MATCH"; public Action action; public List<Edge> outgoing = new ArrayList<Edge>(); public List<Edge> incoming = new ArrayList<Edge>(); @Override public String toString(){ StringBuilder buff = new StringBuilder(); if(name!=null) buff.append('[').append(name).append(']'); if(action!=null){ if(buff.length()>0) buff.append("; "); buff.append(action); } return buff.toString(); } public Edge addEdgeTo(Node target){ return new Edge(this, target); } public Edge addEdgeFrom(Node source){ return new Edge(source, this); } public Edge[] incoming(){ return incoming.toArray(new Edge[incoming.size()]); } public Edge[] outgoing(){ return outgoing.toArray(new Edge[outgoing.size()]); } public boolean junction(){ return incoming.size()>1; } /*-------------------------------------------------[ Layout ]---------------------------------------------------*/ public int row; public int col; public boolean conLeft; public boolean conRight; public boolean conTop; public boolean conBottom; public int conLeftTop; public int conLeftBottom; public int conRightTop; public int conRightBottom; public List<List<Node>> coordinates(){ List<List<Node>> coordinates = new ArrayList<List<Node>>(); coordinates(new ArrayList<Node>(), coordinates, this, 0, 0); return coordinates; } private boolean coordinates(List<Node> visited, List<List<Node>> coordinates, Node node, int row, int col){ if(!visited.contains(node)){ node.row = row; node.col = col; visited.add(node); while(coordinates.size()<=node.row) coordinates.add(new ArrayList<Node>()); List<Node> rowList = coordinates.get(node.row); while(rowList.size()<=node.col) rowList.add(null); rowList.set(node.col, node); col++; for(Edge edge: node.outgoing){ if(coordinates(visited, coordinates, edge.target, row, col)) row++; } return true; }else return false; } }