/** * */ package net.sourceforge.dita4publishers.word2dita; import java.io.IOException; import java.util.Collection; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import net.sourceforge.dita4publishers.impl.bos.BosConstructionOptions; import net.sourceforge.dita4publishers.util.DomUtil; import org.w3c.dom.Document; import org.xml.sax.InputSource; /** * A set of ZipComponents allowing in-memory read and write to * a Zip file. */ public class ZipComponents { Map<String, ZipComponent> zipComponents = new HashMap<String, ZipComponent>(); private ZipFile zipFile; // Original Zip file read to initialize the ZipComponents /** * @param zipFile */ public ZipComponents(ZipFile zipFile) { this.zipFile = zipFile; loadZipComponents(zipFile, zipComponents); } /** * @param zipFile * @param zipComponents */ public void loadZipComponents(ZipFile zipFile, Map<String, ZipComponent> zipComponents) { Enumeration<? extends ZipEntry> entries = zipFile.entries(); while (entries.hasMoreElements()) { ZipEntry entry = entries.nextElement(); ZipComponent comp = new ZipComponent(zipFile, entry); zipComponents.put(entry.getName(), comp); } } /** * @param componentName * @return */ public ZipComponent getEntry(String componentName) { ZipComponent comp = zipComponents.get(componentName); if (comp == null && componentName.startsWith("/")) { // Strip leading "/" to accommodate DOCX naming conventions. comp = zipComponents.get(componentName.substring(1)); } return comp; } /** * @param bosOptions * @param zipComponent * @return * @throws Exception */ public Document getDomForZipComponent(BosConstructionOptions bosOptions, ZipComponent zipComponent) throws Exception { if (zipComponent == null) { throw new IOException("ZIP component is null"); } Document doc = zipComponent.getDom(); if (doc == null) { InputSource source = new InputSource(zipComponent.getInputStream()); source.setSystemId(zipComponent.getName()); doc = DomUtil.getDomForSource(source, bosOptions, false, false); zipComponent.setDom(doc); } return doc; } /** * @param bosOptions * @param documentXmlPath * @return * @throws Exception */ public Document getDomForZipComponent(BosConstructionOptions bosOptions, String documentXmlPath) throws Exception { ZipComponent zipComponent = getEntry(documentXmlPath); return getDomForZipComponent(bosOptions, zipComponent); } /** * @param componentName * @return */ public ZipComponent createZipComponent(String componentName) { ZipComponent comp = new ZipComponent(this.zipFile, componentName); this.zipComponents.put(componentName, comp); return comp; } /** * @param componentName * @param dom * @throws Exception */ public void createZipComponent(String componentName, Document dom) throws Exception { ZipComponent comp = createZipComponent(componentName); comp.setDom(dom); } /** * @return */ public Collection<ZipComponent> getComponents() { return this.zipComponents.values(); } }