/* * 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. * */ /* * Créé le 28 oct. 2004 */ package org.jopendocument.dom; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.jdom.Document; import org.jdom.Element; import org.jdom.Namespace; /** * An OpenDocument XML document, like content.xml ou styles.xml. * * @author Sylvain CUAZ */ public class ODXMLDocument { /** * All top-level elements that an office document may contain. Note that only the single xml * representation (office:document) contains all of them. */ private static final Map<XMLVersion, List<Element>> ELEMS_ORDER; static { ELEMS_ORDER = new HashMap<>(2); ELEMS_ORDER.put(XMLVersion.getOOo(), createChildren(XMLVersion.getOOo())); ELEMS_ORDER.put(XMLVersion.getOD(), createChildren(XMLVersion.getOD())); } private static final List<Element> createChildren(XMLVersion ins) { final Namespace ns = ins.getOFFICE(); final List<Element> res = new ArrayList<>(8); res.add(new Element("meta", ns)); res.add(new Element("settings", ns)); res.add(new Element("script", ns)); res.add(new Element("font-decls", ns)); res.add(new Element("styles", ns)); res.add(new Element("automatic-styles", ns)); res.add(new Element("master-styles", ns)); res.add(new Element("body", ns)); return res; } // namespaces for the name attributes static private final Map<String, String> namePrefixes; static { namePrefixes = new HashMap<>(); namePrefixes.put("table:table", "table"); namePrefixes.put("text:a", "office"); namePrefixes.put("draw:text-box", "draw"); namePrefixes.put("draw:image", "draw"); namePrefixes.put("draw:frame", "draw"); } private final Document content; private final XMLVersion version; private final ChildCreator childCreator; // before making it public, assure that content is really of version "version" // eg by checking some namespace protected ODXMLDocument(final Document content, final XMLVersion version) { if (content == null) throw new NullPointerException("null document"); this.content = content; this.version = version; this.childCreator = new ChildCreator(this.content.getRootElement(), ELEMS_ORDER.get(this.getVersion())); } public ODXMLDocument(Document content) { this(content, XMLVersion.getVersion(content.getRootElement())); } public ODXMLDocument(ODXMLDocument doc) { this((Document) doc.content.clone(), doc.version); } public Document getDocument() { return this.content; } public final XMLVersion getVersion() { return this.version; } // *** children public final Element getChild(String childName) { return this.getChild(childName, false); } /** * Return the asked child, optionally creating it. * * @param childName the name of the child. * @param create whether it should be created in case it doesn't exist. * @return the asked child or <code>null</code> if it doesn't exist and create is * <code>false</code> */ public Element getChild(String childName, boolean create) { return this.childCreator.getChild(this.getVersion().getOFFICE(), childName, create); } }