package org.odata4j.format.xml;
import java.util.ArrayList;
import java.util.List;
import org.odata4j.stax2.StartElement2;
import org.odata4j.stax2.XMLEvent2;
import org.odata4j.stax2.XMLEventReader2;
public class AtomServiceDocumentFormatParser extends XmlFormatParser {
public static Iterable<AtomWorkspaceInfo> parseWorkspaces(XMLEventReader2 reader) {
List<AtomWorkspaceInfo> workspaces = new ArrayList<AtomWorkspaceInfo>();
String baseUrl = null;
while (reader.hasNext()) {
XMLEvent2 event = reader.nextEvent();
if (isStartElement(event, APP_SERVICE)) {
baseUrl = event.asStartElement().getAttributeByName(XML_BASE).getValue();
} else if (isStartElement(event, APP_WORKSPACE)) {
workspaces.add(parseWorkspace(baseUrl, reader, event.asStartElement()));
} else if (isEndElement(event, APP_SERVICE)) {
return workspaces;
}
}
throw new IllegalStateException("Closing service tag not found");
}
private static AtomWorkspaceInfo parseWorkspace(String baseUrl, XMLEventReader2 reader, StartElement2 startElement) {
String title = null;
List<AtomCollectionInfo> collections = new ArrayList<AtomCollectionInfo>();
while (reader.hasNext()) {
XMLEvent2 event = reader.nextEvent();
if (isStartElement(event, ATOM_TITLE)) {
title = reader.getElementText();
} else if (event.isEndElement() && event.asEndElement().getName().equals(startElement.getName())) {
return new AtomWorkspaceInfo(title, collections);
} else if (isStartElement(event, APP_COLLECTION)) {
collections.add(parseCollection(baseUrl, reader, event.asStartElement()));
}
}
return new AtomWorkspaceInfo(title, collections);
}
private static AtomCollectionInfo parseCollection(String baseUrl, XMLEventReader2 reader, StartElement2 startElement) {
String href = getAttributeValueIfExists(startElement, "href");
String url = urlCombine(baseUrl, href);
String title = null;
String accept = null;
while (reader.hasNext()) {
XMLEvent2 event = reader.nextEvent();
if (event.isEndElement() && event.asEndElement().getName().equals(startElement.getName())) {
return new AtomCollectionInfo(href, url, title, accept);
} else if (isStartElement(event, ATOM_TITLE)) {
title = reader.getElementText();
} else if (isStartElement(event, APP_ACCEPT)) {
accept = reader.getElementText();
}
}
return new AtomCollectionInfo(href, url, title, accept);
}
}