package provider.nx;
import provider.MapleData;
import provider.MapleDataEntity;
import provider.wz.MapleDataType;
import provider.pkgnx.format.NXNode;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import provider.pkgnx.format.nodes.NXAudioNode;
import provider.pkgnx.format.nodes.NXBitmapNode;
import provider.pkgnx.format.nodes.NXDoubleNode;
import provider.pkgnx.format.nodes.NXLongNode;
import provider.pkgnx.format.nodes.NXNullNode;
import provider.pkgnx.format.nodes.NXPointNode;
import provider.pkgnx.format.nodes.NXStringNode;
/**
* @author Aaron
* @version 1.0
* @since 6/8/13
*/
public class NXData implements MapleData {
private final NXNode node;
private final NXData parent;
public NXData(NXNode node, NXData parent) {
this.node = node;
this.parent = parent;
}
public NXNode getNode() {
return node;
}
public NXData getParentAsNX() {
return new NXData(parent.getNode(), parent.getParentAsNX());
}
@Override
public String getName() {
return node.getName();
}
@Override
public MapleDataEntity getParent() {
return new NXDataEntity(node, parent);
}
@Override
public MapleDataType getType() {
if (node instanceof NXBitmapNode) {
return MapleDataType.CANVAS;
} else if (node instanceof NXPointNode) {
return MapleDataType.VECTOR;
} else if (node instanceof NXNullNode) {
return MapleDataType.NONE;
} else if (node instanceof NXAudioNode) {
return MapleDataType.SOUND;
} else if (node instanceof NXLongNode) {
return MapleDataType.INT;
} else if (node instanceof NXDoubleNode) {
return MapleDataType.DOUBLE;
} else if (node instanceof NXStringNode) {
return MapleDataType.STRING;
} else {
return MapleDataType.UNKNOWN_TYPE;
}
}
@Override
public List<MapleData> getChildren() {
List<MapleData> md = new ArrayList<MapleData>();
for (NXNode child : node) {
md.add(new NXData(child, new NXData(node, parent)));
}
return md;
}
@Override
public MapleData getChildByPath(String path) {
NXNode cursor = node;
NXData parent = null;
for (String child : path.split("/")) {
if (cursor == null)
return null;
parent = new NXData(cursor, parent);
cursor = cursor.getChild(child);
}
return new NXData(cursor, parent);
}
@Override
public Object getData() {
return node.get();
}
@Override
public Iterator<MapleData> iterator() {
return new Iterator<MapleData>() {
@Override
public boolean hasNext() {
return node.iterator().hasNext();
}
@Override
public MapleData next() {
return new NXData(node.iterator().next(), new NXData(node, parent));
}
@Override
public void remove() {
node.iterator().remove();
}
};
}
}