/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2008 jOpenDocument, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU
* General Public License Version 3 only ("GPL").
* You may not use this file except in compliance with the License.
* You can obtain a copy of the License at http://www.gnu.org/licenses/gpl-3.0.html
* See the License for the specific language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*
*/
package org.jopendocument.dom;
import org.jopendocument.util.JDOMUtils;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import org.jdom.DocType;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.Namespace;
/**
* An OpenDocument manifest included in the package format.
*
* @author Sylvain CUAZ
*/
final class Manifest {
public static final String ENTRY_NAME = "META-INF/manifest.xml";
private static final DocType DOC_TYPE = new DocType("manifest:manifest", "-//OpenOffice.org//DTD Manifest 1.0//EN", "Manifest.dtd");
/**
* Parse an OpenDocument manifest and return a map of path to media type.
*
* @param ins the manifest.
* @return the mapping between path and types.
* @throws JDOMException if the manifest is not valid XML.
* @throws IOException if the stream can't be read.
*/
public static final Map<String, String> parse(final InputStream ins) throws JDOMException, IOException {
final Map<String, String> res = new HashMap<String, String>();
// OOo 1 use the line below, don't load that
// <!DOCTYPE manifest:manifest PUBLIC "-//OpenOffice.org//DTD Manifest 1.0//EN"
// "Manifest.dtd">
final Document manifestDoc = OOUtils.getBuilder().build(ins);
for (final Object child : manifestDoc.getRootElement().getChildren()) {
final Element fileEntry = (Element) child;
final String path = fileEntry.getAttributeValue("full-path", fileEntry.getNamespace("manifest"));
// main mimetype taken from somewhere else see ODPackage#getContentType()
if (!path.equals("/")) {
final String type = fileEntry.getAttributeValue("media-type", fileEntry.getNamespace("manifest"));
res.put(path, type);
}
}
return res;
}
private final XMLVersion version;
private final Document doc;
/**
* Creates a new Manifest.
*
* @param version the version.
* @param mainType the mime type of the document, eg "application/vnd.sun.xml.writer".
*/
public Manifest(XMLVersion version, String mainType) {
this.version = version;
this.doc = new Document(new Element("manifest", this.getNS()), (DocType) DOC_TYPE.clone());
this.addEntry("/", mainType);
}
private Namespace getNS() {
return this.version.getManifest();
}
/**
* Adds an entry.
*
* @param path the path, eg "Pictures/a.png".
* @param type the mime type, eg "image/png"
*/
public void addEntry(String path, String type) {
final Element elem = new Element("file-entry", this.getNS());
elem.setAttribute("media-type", type, this.getNS());
elem.setAttribute("full-path", path, this.getNS());
this.doc.getRootElement().addContent(elem);
}
public String asString() {
return JDOMUtils.output(this.doc);
}
}