/******************************************************************************* * Copyright (c) 2007, 2008 Gregory Jordan * * This file is part of PhyloWidget. * * PhyloWidget is free software: you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation, either version 2 of the License, or (at your option) any later * version. * * PhyloWidget 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 General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * PhyloWidget. If not, see <http://www.gnu.org/licenses/>. */ package org.phylowidget.tree; import java.util.ArrayList; import java.util.HashMap; import java.util.List; public class UniqueLabeler { public static final char sep = '#'; private HashMap<String,Object> vertexLabels = new HashMap<String,Object>(); protected void makeLabelUnique(Object object) { if (!(object instanceof Labelable)) return; Labelable vertex = (Labelable) object; if (vertex.getLabel().length() == 0) { vertex.setLabel(sep + "1"); } while (vertexLabels.containsKey(vertex.getLabel())) { String cur = vertex.getLabel(); /* * Take the current label and increment the suffixed number. */ int i = cur.lastIndexOf(sep); if (i != -1) { String num = cur.substring(i + 1); int curNum = Integer.parseInt(num) + 1; vertex.setLabel(cur.substring(0, i + 1) + curNum); } else { vertex.setLabel(cur + sep + 1); } } } protected void changeLabel(Object o, String label) { if (!(o instanceof Labelable)) return; Labelable v = (Labelable) o; String oldLabel = v.getLabel(); vertexLabels.remove(oldLabel); v.setLabel(label); makeLabelUnique(v); vertexLabels.put(v.getLabel(), v); } protected void addLabel(Object o) { if (!(o instanceof Labelable)) return; Labelable v = (Labelable) o; makeLabelUnique(v); vertexLabels.put(v.getLabel(), v); } protected void removeLabel(Object o) { if (!(o instanceof Labelable)) return; Labelable v = (Labelable) o; vertexLabels.remove(v.getLabel()); } protected void resetVertexLabels(RootedTree t) { vertexLabels.clear(); List nodes = t.getAllNodes(); for (int i = 0; i < nodes.size(); i++) { Object o = nodes.get(i); makeLabelUnique(o); if (o instanceof Labelable) vertexLabels.put(((Labelable) o).getLabel(), o); } } protected void removeDuplicateTags(RootedTree t) { vertexLabels.clear(); ArrayList nodes = new ArrayList(); t.getAll(t.getRoot(), null, nodes); for (int i = 0; i < nodes.size(); i++) { Object o = nodes.get(i); if (o instanceof Labelable) { Labelable l = (Labelable) o; String s = l.getLabel(); int index = s.lastIndexOf(sep); if (index == -1) { continue; } else { l.setLabel(s.substring(0, index)); } } } } public Object getNodeForLabel(String s) { return vertexLabels.get(s); } public boolean isLabelSignificant(String s) { int index = s.lastIndexOf(UniqueLabeler.sep); if (index != 0) { return true; } if (index == 0) { return false; } else if (s.length() == 0) return false; else if (s.startsWith("inode")) return false; else return true; } }