/**
* Global Sensor Networks (GSN) Source Code
* Copyright (c) 2006-2016, Ecole Polytechnique Federale de Lausanne (EPFL)
*
* This file is part of GSN.
*
* GSN is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* GSN is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GSN. If not, see <http://www.gnu.org/licenses/>.
*
* File: src/ch/epfl/gsn/utils/graph/Node.java
*
* @author Mehdi Riahi
* @author Timotee Maret
*
*/
package ch.epfl.gsn.utils.graph;
import java.io.Serializable;
import java.util.ArrayList;
public class Node<T> implements Serializable{
private static final long serialVersionUID = -62301155506174334L;
private ArrayList<Edge<T>> inputEdges;
private ArrayList<Edge<T>> outputEdges;
private T object;
private boolean root;
private boolean visited;
private boolean removed;
public Node() {
this(null);
}
public Node(T object) {
inputEdges = new ArrayList<Edge<T>>();
outputEdges = new ArrayList<Edge<T>>();
root = false;
visited = false;
removed = false;
this.object = object;
}
public Edge<T> addEdge(Node<T> node) throws EdgeExistsException {
if (edgeExists(node))
throw new EdgeExistsException();
Edge<T> edge = new Edge<T>(this, node);
outputEdges.add(edge);
node.getInputEdges().add(edge);
return edge;
}
public boolean removeEdge(Node<T> node) {
boolean removed = false;
Edge<T> edge = getEdge(node);
if (edge != null) {
outputEdges.remove(edge);
edge.getEndNode().getInputEdges().remove(edge);
removed = true;
}
return removed;
}
private boolean edgeExists(Node<T> node) {
for (Edge<T> edge : outputEdges) {
if (edge.getEndNode().equals(node))
return true;
}
return false;
}
private Edge<T> getEdge(Node<T> node) {
for (Edge<T> edge : outputEdges) {
if (edge.getEndNode().equals(node))
return edge;
}
return null;
}
public ArrayList<Edge<T>> getInputEdges() {
return inputEdges;
}
public void setInputEdges(ArrayList<Edge<T>> inputEdges) {
this.inputEdges = inputEdges;
}
public ArrayList<Edge<T>> getOutputEdges() {
return outputEdges;
}
public void setOutputEdges(ArrayList<Edge<T>> outputEdges) {
this.outputEdges = outputEdges;
}
public T getObject() {
return object;
}
public void setObject(T object) {
this.object = object;
}
public boolean isRoot() {
return root;
}
public void setRoot(boolean root) {
this.root = root;
}
public boolean isVisited() {
return visited;
}
public void setVisited(boolean visited) {
this.visited = visited;
}
public boolean equals(Object obj) {
if (this.object == obj)
return true;
if (obj instanceof Node && this.object != null){
Node node = (Node) obj;
return this.object.equals(node.getObject());
}
return false;
}
public String toString(){
return new StringBuilder("Node[").append(object != null ? object.toString() : null).append("]").toString();
}
public boolean isRemoved() {
return removed;
}
public void setRemoved(boolean removed) {
this.removed = removed;
}
}