/** Reference matching a chunk id defined earlier **/
public String ref;
}
public static List<TaggingPreset> readAll(Reader in, boolean validate) throws SAXException {
XmlObjectParser parser = new XmlObjectParser();
parser.mapOnStart("item", TaggingPreset.class);
parser.mapOnStart("separator", TaggingPresetSeparator.class);
parser.mapBoth("group", TaggingPresetMenu.class);
parser.map("text", TaggingPresetItems.Text.class);
parser.map("link", TaggingPresetItems.Link.class);
parser.map("preset_link", TaggingPresetItems.PresetLink.class);
parser.mapOnStart("optional", TaggingPresetItems.Optional.class);
parser.mapOnStart("roles", TaggingPresetItems.Roles.class);
parser.map("role", TaggingPresetItems.Role.class);
parser.map("checkgroup", TaggingPresetItems.CheckGroup.class);
parser.map("check", TaggingPresetItems.Check.class);
parser.map("combo", TaggingPresetItems.Combo.class);
parser.map("multiselect", TaggingPresetItems.MultiSelect.class);
parser.map("label", TaggingPresetItems.Label.class);
parser.map("space", TaggingPresetItems.Space.class);
parser.map("key", TaggingPresetItems.Key.class);
parser.map("list_entry", TaggingPresetItems.PresetListEntry.class);
parser.map("item_separator", TaggingPresetItems.ItemSeparator.class);
parser.mapBoth("chunk", Chunk.class);
parser.map("reference", Reference.class);
LinkedList<TaggingPreset> all = new LinkedList<>();
TaggingPresetMenu lastmenu = null;
TaggingPresetItems.Roles lastrole = null;
final List<TaggingPresetItems.Check> checks = new LinkedList<>();
List<TaggingPresetItems.PresetListEntry> listEntries = new LinkedList<>();
final Map<String, List<Object>> byId = new HashMap<>();
final Stack<String> lastIds = new Stack<>();
/** lastIdIterators contains non empty iterators of items to be handled before obtaining the next item from the XML parser */
final Stack<Iterator<Object>> lastIdIterators = new Stack<>();
if (validate) {
parser.startWithValidation(in, Main.getXMLBase()+"/tagging-preset-1.0", "resource://data/tagging-preset.xsd");
} else {
parser.start(in);
}
while (parser.hasNext() || !lastIdIterators.isEmpty()) {
final Object o;
if (!lastIdIterators.isEmpty()) {
// obtain elements from lastIdIterators with higher priority
o = lastIdIterators.peek().next();
if (!lastIdIterators.peek().hasNext()) {
// remove iterator is is empty
lastIdIterators.pop();
}
} else {
o = parser.next();
}
if (o instanceof Chunk) {
if (!lastIds.isEmpty() && ((Chunk) o).id.equals(lastIds.peek())) {
// pop last id on end of object, don't process further
lastIds.pop();