/* * 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.template.engine; import org.jopendocument.dom.XMLVersion; import org.jopendocument.dom.ODPackage; import org.jopendocument.dom.ODXMLDocument; import org.jopendocument.util.CopyUtils; import java.io.File; import org.jdom.Document; import org.jdom.Element; /** * XML material that will be parsed and executed. * * @param <W> the type of this material. * @author Sylvain */ public class Material<W> implements Cloneable { // for cloning @SuppressWarnings("unchecked") private static final <Whole> Material<Whole> from(Whole p) { if (p instanceof Document) return (Material<Whole>) from((Document) p); else if (p instanceof ODXMLDocument) return (Material<Whole>) from((ODXMLDocument) p); else if (p instanceof ODPackage) return (Material<Whole>) from((ODPackage) p); else return (Material<Whole>) from((Element) p); } public static final Material<Document> from(Document doc) { return new Material<Document>(doc, doc.hasRootElement() ? doc.getRootElement() : null); } public static final Material<Element> from(Element elem) { return new Material<Element>(elem, elem); } public static final <E extends ODXMLDocument> Material<E> from(E doc) { return new Material<E>(doc, doc.getDocument().getRootElement()); } public static final <E extends ODPackage> Material<E> from(E doc) { final Material<E> res = new Material<E>(doc, doc.getContent().getDocument().getRootElement()); res.setBase(doc.getFile()); return res; } private final W whole; private final Element root; private File base; private Material(final W whole, final Element root) { this.whole = whole; this.root = root; this.base = null; } public Element getRoot() { return this.root; } public boolean hasRoot() { return this.getRoot() != null; } public W getWhole() { return this.whole; } public XMLVersion getNS() { return XMLVersion.getVersion(this.getRoot()); } @Override public Material<W> clone() { final Material<W> res = Material.from(CopyUtils.copy(this.getWhole())); res.setBase(this.getBase()); return res; } public File getBase() { return this.base; } public void setBase(File base) { this.base = base; } }