package org.geowebcache.georss; import static javax.xml.stream.XMLStreamConstants.END_DOCUMENT; import static javax.xml.stream.XMLStreamConstants.END_ELEMENT; import static javax.xml.stream.XMLStreamConstants.START_ELEMENT; import java.util.Date; import javax.xml.namespace.QName; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import org.geotools.feature.type.DateUtil; class GeoRSSParsingUtils { public static Date date(final String dateTimeStr) { Date dateTime = DateUtil.deserializeDateTime(dateTimeStr); return dateTime; } /** * Being at a start element tag, returns its coalesced text value * * @param reader * @return * @throws XMLStreamException */ public static String text(XMLStreamReader reader) throws XMLStreamException { reader.require(START_ELEMENT, null, null); StringBuilder sb = new StringBuilder(); while (true) { reader.next(); if (reader.isCharacters() || reader.isWhiteSpace()) { sb.append(reader.getText()); } else if (reader.isEndElement()) { break; } } return sb.toString(); } /** * Consumes the current element (given by tagName) until it's end element is fount (assuming * there's no nested element called the same) * * @param reader * @param tagName * @throws XMLStreamException */ public static void consume(XMLStreamReader reader, QName tagName) throws XMLStreamException { if (reader.getEventType() == END_ELEMENT && tagName.equals(reader.getName())) { return;// already consumed } while (reader.next() != END_DOCUMENT) { if (reader.isEndElement() && tagName.equals(reader.getName())) { return; } } } /** * Safely advances until the next tag element (either start or end element) and returns its * name, or {@code null} in case the end of document is reached before any tag * * @param reader * @return * @throws XMLStreamException */ public static QName nextTag(XMLStreamReader reader) throws XMLStreamException { while (reader.next() != END_DOCUMENT) { if (reader.isStartElement() || reader.isEndElement()) { return reader.getName(); } } return null; } }