package com.ojn.gexf4j.core.impl;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkState;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import com.ojn.gexf4j.core.Edge;
import com.ojn.gexf4j.core.Node;
import com.ojn.gexf4j.core.impl.viz.NodeShapeImpl;
import com.ojn.gexf4j.core.viz.Color;
import com.ojn.gexf4j.core.viz.NodeShape;
import com.ojn.gexf4j.core.viz.NodeShapeEntity;
import com.ojn.gexf4j.core.viz.Position;
public class NodeImpl extends SliceableDatumBase<Node> implements Node {
private String id = "";
private String label = "";
private Color color = null;
private String pid = null;
private Position position = null;
private NodeShapeEntity shape = null;
private float size = Float.MIN_VALUE;
private List<Node> nodes = null;
private List<Edge> edges = null;
private List<Node> parentForList = null;
public NodeImpl() {
this(UUID.randomUUID().toString());
}
public NodeImpl(String id) {
checkArgument(id != null, "ID cannot be null.");
checkArgument(!id.trim().isEmpty(), "ID cannot be empty or blank.");
this.id = id;
this.nodes = new ArrayList<Node>();
this.edges = new ArrayList<Edge>();
this.parentForList = new ArrayList<Node>();
this.shape = new NodeShapeImpl();
}
@Override
protected Node getSelf() {
return this;
}
@Override
public Node clearColor() {
color = null;
return this;
}
@Override
public Color getColor() {
checkState(hasColor(), "Color has not been set.");
return color;
}
@Override
public boolean hasColor() {
return (color != null);
}
@Override
public Node setColor(Color color) {
checkArgument(color != null, "Color cannot be null.");
this.color = color;
return this;
}
@Override
public Node clearPID() {
pid = null;
return this;
}
@Override
public Node clearPosition() {
position = null;
return this;
}
@Override
public Node clearShape() {
shape = null;
return this;
}
@Override
public Node clearSize() {
size = Float.MIN_VALUE;
return this;
}
@Override
public List<Edge> getEdges() {
return edges;
}
@Override
public String getId() {
return id;
}
@Override
public String getLabel() {
return label;
}
@Override
public String getPID() {
checkState(hasPID(), "PID has not been set.");
return pid;
}
@Override
public List<Node> getParentForList() {
return parentForList;
}
@Override
public Position getPosition() {
checkState(hasPosition(), "Position has not been set.");
return position;
}
@Override
public NodeShapeEntity getShapeEntity() {
return shape;
}
@Override
public float getSize() {
checkState(hasSize(), "Size has not been set.");
return size;
}
@Override
public boolean hasPID() {
return (pid != null);
}
@Override
public boolean hasPosition() {
return (position != null);
}
@Override
public boolean hasShape() {
return (shape.getNodeShape() != NodeShape.NOTSET);
}
@Override
public boolean hasSize() {
return (size != Float.MIN_VALUE);
}
@Override
public Node setLabel(String label) {
checkArgument(label != null, "Label cannot be null.");
this.label = label;
return this;
}
@Override
public Node setPID(String pid) {
checkArgument(pid != null, "PID cannot be null.");
checkArgument(!pid.trim().isEmpty(), "PID cannot be empty or blank.");
this.pid = pid;
return this;
}
@Override
public Node setPosition(Position position) {
checkArgument(position != null, "Position cannot be null.");
this.position = position;
return this;
}
@Override
public Node setSize(float size) {
this.size = size;
return this;
}
@Override
public Edge connectTo(Node target) {
return connectTo(UUID.randomUUID().toString(), target);
}
@Override
public Edge connectTo(String id, Node target) {
checkArgument(id != null, "ID cannot be null.");
checkArgument(!id.trim().isEmpty(), "ID cannot be empty or blank.");
checkArgument(target != null, "Target cannot be null.");
checkArgument(!hasEdgeTo(target.getId()), "Edge already exists.");
Edge rv = new EdgeImpl(id, this, target);
edges.add(rv);
return rv;
}
@Override
public boolean hasEdgeTo(String id) {
checkArgument(id != null, "ID cannot be null.");
checkArgument(!id.trim().isEmpty(), "ID cannot be empty or blank.");
for (Edge e : edges) {
if (e.getTarget().getId().equals(id)) {
return true;
}
}
return false;
}
@Override
public Node createNode() {
return createNode(UUID.randomUUID().toString());
}
@Override
public Node createNode(String id) {
checkArgument(id != null, "ID cannot be null.");
checkArgument(!id.trim().isEmpty(), "ID cannot be empty or blank.");
Node rv = new NodeImpl(id);
nodes.add(rv);
return rv;
}
@Override
public List<Node> getNodes() {
return nodes;
}
@Override
public List<Edge> getAllEdges() {
List<Edge> rv = new ArrayList<Edge>();
for (Node n : getNodes()) {
_getEdges(rv, n);
}
return rv;
}
private List<Edge> _getEdges(List<Edge> soFar, Node n) {
// add the nodes' edges
soFar.addAll(n.getEdges());
// call this function on all of the sub nodes
for (Node subNode : n.getNodes()) {
_getEdges(soFar, subNode);
}
return soFar;
}
}