package com.t3.xstreamversioned.marshalling;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map.Entry;
import com.t3.xstreamversioned.model.GenericObject;
import com.thoughtworks.xstream.converters.ErrorWriter;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
public class GenericObjectReader implements HierarchicalStreamReader {
LinkedList<GenericObject> objectStack=new LinkedList<>();
LinkedList<Integer> childIdStack=new LinkedList<>();
public GenericObjectReader(GenericObject ser) {
objectStack.push(ser);
childIdStack.push(0);
}
@Override
public boolean hasMoreChildren() {
return childIdStack.getFirst()<objectStack.getFirst().getChildren().size();
}
public GenericObject getCurrentObject() {
return objectStack.peek();
}
@Override
public void moveDown() {
int id=childIdStack.poll();
childIdStack.push(id+1);
objectStack.push(objectStack.getFirst().getChildren().get(id));
childIdStack.push(0);
}
@Override
public void moveUp() {
childIdStack.poll();
objectStack.poll();
}
@Override
public String getNodeName() {
return objectStack.getFirst().getName();
}
@Override
public String getValue() {
return objectStack.getFirst().getContent();
}
@Override
public String getAttribute(String name) {
return objectStack.getFirst().getXStreamAttributes().get(name);
}
@Override
public String getAttribute(int index) {
Iterator<Entry<String, String>> it=objectStack.getFirst().getXStreamAttributes().entrySet().iterator();
for(int i=0;i<index-1;i++)
it.next();
return it.next().getValue();
}
@Override
public int getAttributeCount() {
return objectStack.getFirst().getXStreamAttributes().size();
}
@Override
public String getAttributeName(int index) {
Iterator<Entry<String, String>> it=objectStack.getFirst().getXStreamAttributes().entrySet().iterator();
for(int i=0;i<index-1;i++)
it.next();
return it.next().getKey();
}
@SuppressWarnings("rawtypes")
@Override
public Iterator getAttributeNames() {
return objectStack.getFirst().getXStreamAttributes().keySet().iterator();
}
@Override
public void appendErrors(ErrorWriter errorWriter) {
}
@Override
public void close() {}
@Override
public HierarchicalStreamReader underlyingReader() {
return this;
}
}