package com.vaguehope.onosendai.provider.successwhale; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.Stack; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.InputSource; import org.xml.sax.Locator; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import com.vaguehope.onosendai.config.Account; import com.vaguehope.onosendai.config.Column; import com.vaguehope.onosendai.config.ColumnFeed; import com.vaguehope.onosendai.config.InlineMediaStyle; import com.vaguehope.onosendai.util.StringHelper; public class ColumnsXml implements ContentHandler { private static final int DEFAULT_COLUMN_REFRESH_MINS = 30; private final Account account; private final List<Column> columns = new ArrayList<Column>(); public ColumnsXml (final Account account, final InputStream is) throws SAXException { this.account = account; parse(new InputSource(is)); } private void parse (final InputSource source) throws SAXException { final SAXParserFactory spf = SAXParserFactory.newInstance(); try { final SAXParser sp = spf.newSAXParser(); final XMLReader xmlReader = sp.getXMLReader(); xmlReader.setContentHandler(this); try { xmlReader.parse(source); } catch (final IOException e) { throw new SAXException(e); } } catch (final ParserConfigurationException e) { throw new SAXException(e); } } public SuccessWhaleColumns getColumns () { return new SuccessWhaleColumns(this.columns); } private final Stack<String> stack = new Stack<String>(); private StringBuilder currentText; private String stashedFullpath; private String stashedTitle; @Override public void startElement (final String uri, final String localName, final String qName, final Attributes attributes) throws SAXException { this.stack.push(localName); if (this.currentText == null || this.currentText.length() > 0) { this.currentText = new StringBuilder(); } } @Override public void endElement (final String uri, final String localName, final String qName) throws SAXException { final String elementName = !localName.isEmpty() ? localName : qName; if (this.stack.size() == 3) { // NOSONAR not a magic number. if ("column".equals(elementName)) { if (!StringHelper.isEmpty(this.stashedFullpath)) { this.columns.add(new Column(this.columns.size(), this.stashedTitle, new ColumnFeed(this.account.getId(), this.stashedFullpath), DEFAULT_COLUMN_REFRESH_MINS, null, null, InlineMediaStyle.NONE, false)); } this.stashedFullpath = null; this.stashedTitle = null; } } else if (this.stack.size() == 4) { // NOSONAR not a magic number. if ("fullpath".equals(elementName)) { this.stashedFullpath = this.currentText.toString(); } else if ("title".equals(elementName)) { this.stashedTitle = this.currentText.toString(); } } this.stack.pop(); } @Override public void characters (final char[] ch, final int start, final int length) throws SAXException { this.currentText.append(ch, start, length); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @Override public void endDocument () throws SAXException { /* UNUSED */} @Override public void endPrefixMapping (final String prefix) throws SAXException { /* UNUSED */} @Override public void ignorableWhitespace (final char[] ch, final int start, final int length) throws SAXException { /* UNUSED */} @Override public void processingInstruction (final String target, final String data) throws SAXException { /* UNUSED */} @Override public void setDocumentLocator (final Locator locator) { /* UNUSED */} @Override public void skippedEntity (final String name) throws SAXException { /* UNUSED */} @Override public void startDocument () throws SAXException { /* UNUSED */} @Override public void startPrefixMapping (final String prefix, final String uri) throws SAXException { /* UNUSED */} // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - }