package com.venky.swf.db.model.io.xml;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import com.venky.core.string.StringUtil;
import com.venky.swf.db.model.Model;
import com.venky.swf.db.model.io.AbstractModelReader;
import com.venky.xml.XMLDocument;
import com.venky.xml.XMLElement;
public class XMLModelReader<M extends Model> extends AbstractModelReader<M,XMLElement> {
public XMLModelReader(Class<M> modelClass){
super(modelClass);
}
@Override
public List<M> read(InputStream in) {
return read(in,getBeanClass().getSimpleName());
}
@Override
public List<M> read(InputStream in,String rootElementName) {
List<M> ret = new ArrayList<M>();
XMLDocument doc = XMLDocument.getDocumentFor(in);
XMLElement root = doc.getDocumentRoot();
if (root.getNodeName().equals(rootElementName)){
ret.add(read(root));
}else {
Iterator<XMLElement> pluralRootElementIterator = root.getChildElements(StringUtil.pluralize(rootElementName));
if (pluralRootElementIterator.hasNext()){
root = pluralRootElementIterator.next();
}
if (pluralRootElementIterator.hasNext()){
throw new RuntimeException("Don't know how to read document with multiple pluralized elements" + StringUtil.pluralize(rootElementName) );
}
for (Iterator<XMLElement> elemIterator = root.getChildElements(rootElementName) ; elemIterator.hasNext() ; ){
XMLElement e = elemIterator.next();
if (e.getNodeName().equals(rootElementName)) {
ret.add(read(e));
}
}
}
return ret;
}
}