/* * XMLModelIdentifiable.java * * Copyright (c) 2002-2015 Alexei Drummond, Andrew Rambaut and Marc Suchard * * This file is part of BEAST. * See the NOTICE file distributed with this work for additional * information regarding copyright ownership and licensing. * * BEAST is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * BEAST is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with BEAST; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301 USA */ package dr.xml; import org.jdom.Element; import org.jdom.output.XMLOutputter; import java.io.IOException; import java.io.OutputStream; import java.util.LinkedList; /** * Package: XMLModelIdentifiable * Description: * <p/> * <p/> * Created by * Alexander V. Alekseyenko (alexander.alekseyenko@gmail.com) * Date: Apr 13, 2009 * Time: 10:38:05 AM */ public class XMLModelIdentifiable { private String name; private Element definition; private Element definitionIdref; private boolean defined; private LinkedList<Element> references; public XMLModelIdentifiable(String name, Element definition) { this.name = name; this.definition = definition; definitionIdref = new Element(definition.getName()); definitionIdref.setAttribute("idref", name); defined = true; references = new LinkedList<Element>(); } public void removeDefinition() { if (defined) { definition.getParentElement().addContent(definitionIdref); definition.detach(); defined = false; } } public void restoreDefinition() { if (!defined) { definitionIdref.getParentElement().addContent(definition); definitionIdref.detach(); defined = true; } } public void rename(String newName) { name = newName; definition.setAttribute("id", newName); definitionIdref.setAttribute("idref", newName); for (Element ref : references) { ref.setAttribute("idref", newName); } } public void addReference(Element newRef) { if (newRef.getAttribute("idref").getValue().equals(name)) { references.addLast(newRef); } } public void print(XMLOutputter outputter, OutputStream ostream) { if (ostream == null) { ostream = System.out; } try { if (defined) { outputter.output(definition, ostream); } else { outputter.output(definitionIdref, ostream); } for (Element ref : references) { outputter.output(ref, ostream); } } catch (IOException e) { System.err.println(e); } } }