package rescuecore2.standard.entities;
import static rescuecore2.misc.EncodingTools.readInt32;
import static rescuecore2.misc.EncodingTools.writeInt32;
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.IOException;
import rescuecore2.worldmodel.Property;
import rescuecore2.worldmodel.AbstractProperty;
import rescuecore2.worldmodel.EntityID;
/**
A property that defines a list of Edges.
*/
public class EdgeListProperty extends AbstractProperty {
private List<Edge> edges;
/**
Construct a new EdgeListProperty with no defined value.
@param urn The urn of this property.
*/
public EdgeListProperty(String urn) {
super(urn);
edges = new ArrayList<Edge>();
}
/**
Construct a new EdgeListProperty with no defined value.
@param urn The urn of this property.
*/
public EdgeListProperty(Enum<?> urn) {
super(urn);
edges = new ArrayList<Edge>();
}
/**
Construct a new EdgeListProperty with no defined value.
@param urn The urn of this property.
@param edges The edge list.
*/
public EdgeListProperty(String urn, List<Edge> edges) {
super(urn, true);
this.edges = new ArrayList<Edge>(edges);
}
/**
Construct a new EdgeListProperty with no defined value.
@param urn The urn of this property.
@param edges The edge list.
*/
public EdgeListProperty(Enum<?> urn, List<Edge> edges) {
super(urn, true);
this.edges = new ArrayList<Edge>(edges);
}
/**
EdgeListProperty copy constructor.
@param other The EdgeListProperty to copy.
*/
public EdgeListProperty(EdgeListProperty other) {
super(other);
this.edges = new ArrayList<Edge>(other.edges);
}
@Override
public List<Edge> getValue() {
if (!isDefined()) {
return null;
}
return Collections.unmodifiableList(edges);
}
/**
Set the list of edges. Future calls to {@link #isDefined()} will return true.
@param newEdges The new edge list.
*/
public void setEdges(List<Edge> newEdges) {
edges.clear();
edges.addAll(newEdges);
setDefined();
}
/**
Add an edge to the list.
@param edge The edge to add.
*/
public void addEdge(Edge edge) {
edges.add(edge);
setDefined();
}
/**
Remove all edges from this list but keep it defined.
*/
public void clearEdges() {
edges.clear();
}
@Override
public void takeValue(Property p) {
if (p instanceof EdgeListProperty) {
EdgeListProperty e = (EdgeListProperty)p;
if (e.isDefined()) {
setEdges(e.getValue());
}
else {
undefine();
}
}
else {
throw new IllegalArgumentException(this + " cannot take value from " + p);
}
}
@Override
public void write(OutputStream out) throws IOException {
writeInt32(edges.size(), out);
for (Edge next : edges) {
writeInt32(next.getStartX(), out);
writeInt32(next.getStartY(), out);
writeInt32(next.getEndX(), out);
writeInt32(next.getEndY(), out);
if (next.isPassable()) {
writeInt32(next.getNeighbour().getValue(), out);
}
else {
writeInt32(0, out);
}
}
}
@Override
public void read(InputStream in) throws IOException {
int count = readInt32(in);
edges.clear();
for (int i = 0; i < count; ++i) {
int startX = readInt32(in);
int startY = readInt32(in);
int endX = readInt32(in);
int endY = readInt32(in);
EntityID neighbour = null;
int id = readInt32(in);
if (id != 0) {
neighbour = new EntityID(id);
}
edges.add(new Edge(startX, startY, endX, endY, neighbour));
}
setDefined();
}
/*
@Override
public String toString() {
StringBuilder result = new StringBuilder();
result.append(getURN());
if (isDefined()) {
result.append(" = {");
for (Iterator<Edge> it = ids.iterator(); it.hasNext();) {
result.append(it.next());
if (it.hasNext()) {
result.append(", ");
}
}
result.append("}");
}
else {
result.append(" (undefined)");
}
return result.toString();
}
*/
@Override
public EdgeListProperty copy() {
return new EdgeListProperty(this);
}
}