package org.rr.jeborker.metadata.comicbook; import java.io.IOException; import javax.xml.parsers.ParserConfigurationException; import org.rr.commons.mufs.IResourceHandler; import org.rr.commons.xml.XMLUtils; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; public class ComicBookReader { private ComicBookDocument doc; private IArchiveHandler archiveHandler; public ComicBookReader(IResourceHandler resource) { this.archiveHandler = ArchiveHandlerFactory.getHandler(resource); } public ComicBookDocument getDocument() throws IOException { if(doc == null) { doc = read(); } return doc; } private ComicBookDocument read() throws IOException { archiveHandler.readArchive(); //needs to be sorted because the entries will be shown in it's sorted order. ComicBookDocument doc = buildDocument(archiveHandler); return doc; } private ComicBookDocument buildDocument(IArchiveHandler archiveHandler) throws IOException { final ComicBookDocument doc = new ComicBookDocument(archiveHandler); byte[] comicXmlData = archiveHandler.getComicXmlData(); if(comicXmlData != null && comicXmlData.length > 0) { try { Document document = XMLUtils.getDocument(comicXmlData); Element comicInfoElement = document.getDocumentElement(); NodeList childNodes = comicInfoElement.getChildNodes(); for(int i = 0; i < childNodes.getLength(); i++) { if(childNodes.item(i) instanceof Element) { Element item = (Element) childNodes.item(i); if(item.getNodeName().equalsIgnoreCase("Pages")) { setupPages(item, doc); } else { setupComicItem(item, doc); } } } } catch (ParserConfigurationException e) { throw new IOException(e); } catch (SAXException e) { throw new IOException(e); } } else { doc.setCount(archiveHandler.getArchiveEntries().size()); } return doc; } private void setupComicItem(Element item, ComicBookDocument doc) { doc.getInfo().put(item.getNodeName(), item.getTextContent()); } private void setupPages(Element pagesElement, ComicBookDocument doc) throws IOException { NodeList pageNodes = pagesElement.getChildNodes(); for(int i = 0; i < pageNodes.getLength(); i++) { if(pageNodes.item(i) instanceof Element) { final ComicBookPageInfo page = new ComicBookPageInfo(); final Element pageElement = (Element) pageNodes.item(i); final NamedNodeMap attributes = pageElement.getAttributes(); for(int j = 0; j < attributes.getLength(); j++) { Node item = attributes.item(j); String attributeName = item.getNodeName(); String attributeValue = item.getNodeValue(); page.getInfo().put(attributeName, attributeValue); } doc.getPages().add(page); } } } public IArchiveHandler getArchiveHandler() { return archiveHandler; } }