package dr.evolution.tree;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* An interface for objects that can provide TreeTraits (i.e., information about the nodes and
* branches of a tree).
*
* @author Andrew Rambaut
* @version $Id$
*/
public interface TreeTraitProvider {
/**
* Returns an array of all the available traits
* @return the array
*/
TreeTrait[] getTreeTraits();
/**
* Returns a trait that is stored using a specific key. This will often be the same
* as the 'name' of the trait but may not be depending on the application.
* @param key a unique key
* @return the trait
*/
TreeTrait getTreeTrait(String key);
/**
* This is a concrete helper class that can be used either as a mix in base to another
* class or as a delegate. It is itself a TreeTraitProvider so can be instantiated and
* passed as is.
*/
public class Helper implements TreeTraitProvider {
/**
* Default constructor
*/
public Helper() {
}
/**
* Constructor taking a single initial trait
* @param trait the TreeTrait
*/
public Helper(TreeTrait trait) {
addTrait(trait);
}
/**
* Constructor taking a single initial trait
* @param trait the TreeTrait
*/
public Helper(String key, TreeTrait trait) {
addTrait(key, trait);
}
/**
* Constructor taking an array of initial traits
* @param traits the array of TreeTraits
*/
public Helper(TreeTrait[] traits) {
addTraits(traits);
}
/**
* Constructor taking a collection of initial traits
* @param traits the collection of TreeTraits
*/
public Helper(Collection<TreeTrait> traits) {
addTraits(traits);
}
/**
* Add a single trait to the list keyed by its name
* @param trait the TreeTrait
*/
public void addTrait(TreeTrait trait) {
traits.put(trait.getTraitName(), trait);
}
/**
* Add a single trait to the list using a given key
* @param key the key
* @param trait the TreeTrait
*/
public void addTrait(String key, TreeTrait trait) {
if (traits.containsKey(key)) {
throw new RuntimeException("All traits must have unique names");
}
traits.put(key, trait);
}
/**
* Add an array of traits to the list, keying each with its
* respective name
* @param traits the array of TreeTraits
*/
public void addTraits(TreeTrait[] traits) {
for (TreeTrait trait : traits) {
this.traits.put(trait.getTraitName(), trait);
}
}
/**
* Add a collection of traits to the list, keying each with its
* respective name
* @param traits the collection of TreeTraits
*/
public void addTraits(Collection<TreeTrait> traits) {
for (TreeTrait trait : traits) {
this.traits.put(trait.getTraitName(), trait);
}
}
// Implementation of TreeTraitProvider interface
public TreeTrait[] getTreeTraits() {
TreeTrait[] traitArray = new TreeTrait[traits.values().size()];
return traits.values().toArray(traitArray);
}
public TreeTrait getTreeTrait(String key) {
return traits.get(key);
}
// Private members
private Map<String, TreeTrait> traits = new HashMap<String, TreeTrait>();
}
}