package org.robolectric.res;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import java.util.ArrayList;
import java.util.List;
public class StaxAttrLoader extends StaxLoader {
private String name;
private String format;
private final List<AttrData.Pair> pairs = new ArrayList<>();
public StaxAttrLoader(PackageResourceTable resourceTable, String attrType, ResType resType) {
super(resourceTable, attrType, resType);
addHandler("*", new NodeHandler() {
private String value;
private String name;
@Override
public void onStart(XMLStreamReader xml, XmlContext xmlContext) throws XMLStreamException {
String type = xml.getLocalName();
if (pairs.isEmpty()) {
if (format == null) {
format = type;
} else {
format = format + "|" + type;
}
}
name = xml.getAttributeValue(null, "name");
value = xml.getAttributeValue(null, "value");
pairs.add(new AttrData.Pair(name, value));
}
@Override
public void onCharacters(XMLStreamReader xml, XmlContext xmlContext) throws XMLStreamException {
}
@Override
public void onEnd(XMLStreamReader xml, XmlContext xmlContext) throws XMLStreamException {
}
});
}
@Override
public void onStart(XMLStreamReader xml, XmlContext xmlContext) throws XMLStreamException {
name = xml.getAttributeValue(null, "name");
format = xml.getAttributeValue(null, "format");
}
@Override
public void onEnd(XMLStreamReader xml, XmlContext xmlContext) throws XMLStreamException {
AttrData attrData = new AttrData(name, format, new ArrayList<>(pairs));
pairs.clear();
// xmlContext = xmlContext.withLineNumber(xml.getLocation().getLineNumber());
if (attrData.getFormat() != null) {
resourceTable.addResource(attrType, name, new TypedResource<>(attrData, resType, xmlContext));
}
}
}