// Path: src/treecmp/metric/BaseMetric.java
// public abstract class BaseMetric implements Metric{
// 
//     protected String name;
//     protected String commandLineName;
//     protected String description;
//     protected String unifomFileName;
//     protected String yuleFileName;
//     protected String alnFileSuffix;
// 
//     protected IMetircDistrbHolder unifomRandData;
//     protected IMetircDistrbHolder yuleRandData;
// 
//     protected boolean rooted;
//     protected boolean weighted;
//     protected boolean diffLeafSets;
// 
//     public boolean isDiffLeafSets() {
//         return diffLeafSets;
//     }
// 
//     public void setDiffLeafSets(boolean diffLeafSets) {
//         this.diffLeafSets = diffLeafSets;
//     }
// 
//     public boolean isRooted() {
//         return rooted;
//     }
// 
//     public void setRooted(boolean rooted) {
//         this.rooted = rooted;
//     }
// 
//     public void setWeighted(boolean weighted) {
//         this.weighted = weighted;
//     }
// 
//     public boolean isWeighted() {
//         return weighted;
//     }
//     public String getAlnFileSuffix() {
//         return alnFileSuffix;
//     }
// 
//     public void setAlnFileSuffix(String alnFileSuffix) {
//         this.alnFileSuffix = alnFileSuffix;
//     }
//     
//     public String getUnifomFileName() {
//         return unifomFileName;
//     }
// 
//     public void setUnifomFileName(String unifomFileName) {
//         this.unifomFileName = unifomFileName;
//     }
// 
//     public String getYuleFileName() {
//         return yuleFileName;
//     }
// 
//     public void setYuleFileName(String yuleFileName) {
//         this.yuleFileName = yuleFileName;
//     }
// 
// 
//     public IMetircDistrbHolder getUnifomRandData() {
//         return unifomRandData;
//     }
// 
// 
//     public IMetircDistrbHolder getYuleRandData() {
//         return yuleRandData;
//     }
// 
// 
//     public String getDescription() {
//         return description;
//     }
// 
//     public void setDescription(String description) {
//         this.description = description;
//     }
//     
//     public BaseMetric() {
//         this.rooted = false;
//         this.diffLeafSets = false;
//     }
// 
//     public String getCommandLineName() {
//         return commandLineName;
//     }
// 
//     public void setCommandLineName(String commandLineName) {
//         this.commandLineName = commandLineName;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public void setName(String name) {
//         this.name = name;
//     }
// 
//     public abstract double getDistance(Tree t1, Tree t2, int... indexes) ;
//     public  AlignInfo getAlignment(){
//         return null;
//     }
//     
//     private IMetircDistrbHolder parseData(String dataDir, String dataFileName){
//         
//         MetircDistrbHolder mdh = new MetircDistrbHolder();
// 
//         String fullPath = dataDir + "/" + dataFileName;
// 
//         try {
//         FileReader fr = new FileReader(fullPath);
//         BufferedReader br = new BufferedReader(fr);
//         int cnt = 0;
//         String line;
//         while ((line = br.readLine()) != null){
//           cnt++;
//           if(cnt > 1){
//               MetricDistribution md = new MetricDistribution();
//               md.readData(line);
//               mdh.insertDistribution(md);
//           }
//         }
//         br.close();
//       }
//       catch (IOException e) {
//           Logger.getLogger(ConfigSettings.class.getName()).log(Level.SEVERE, "Error while reading data file:" + fullPath, e);
//           mdh = null;
//       }
//         return mdh;
//     }
// 
//     public void initData(){
//         ConfigSettings config = ConfigSettings.getConfig();
//         String dataDir = config.getDataDir();
//         if (unifomRandData == null){
//             if (unifomFileName != null){
//                 unifomRandData = parseData(dataDir, unifomFileName);
//             }         
//         }
//         
//         if (yuleRandData == null){
//             if (yuleFileName != null){
//                 yuleRandData = parseData(dataDir, yuleFileName);
//             }
//         }
//     }
//       
// }


import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
import treecmp.metric.BaseMetric;
                String uniformFileName = "";
                String yuleFileName = "";
                String alnFileSuffix = "";
                String rooted = "";
                String weighted = "";
                String diff_leaves = "";
                /**
                 * Update defined metric set
                 *
                 */

                NodeList list = doc.getElementsByTagName("metric");
                for (int i = 0; i < list.getLength(); i++) {
                    // Get element
                    Element element = (Element) list.item(i);
                    //System.out.println(getTextValue(element, "class"));
                    className = getTextValue(element, "class");
                    metricName = getTextValue(element, "name");
                    commandLineName = getTextValue(element, "command_name");
                    metricDesc = getTextValue(element, "description");
                    uniformFileName = getTextValue(element, "unif_data");
                    yuleFileName = getTextValue(element, "yule_data");
                    alnFileSuffix = getTextValue(element, "aln_file_suffix");
                    rooted = getTextValue(element, "rooted");
                    weighted = getTextValue(element, "weighted");
                    diff_leaves = getTextValue(element, "diff_leaves");

                    if (className != null) {
                        Class cl = Class.forName(className);
                        //Metric m=(Metric) cl.newInstance();
// Path: src/treecmp/metric/BaseMetric.java
// public abstract class BaseMetric implements Metric{
// 
//     protected String name;
//     protected String commandLineName;
//     protected String description;
//     protected String unifomFileName;
//     protected String yuleFileName;
//     protected String alnFileSuffix;
// 
//     protected IMetircDistrbHolder unifomRandData;
//     protected IMetircDistrbHolder yuleRandData;
// 
//     protected boolean rooted;
//     protected boolean weighted;
//     protected boolean diffLeafSets;
// 
//     public boolean isDiffLeafSets() {
//         return diffLeafSets;
//     }
// 
//     public void setDiffLeafSets(boolean diffLeafSets) {
//         this.diffLeafSets = diffLeafSets;
//     }
// 
//     public boolean isRooted() {
//         return rooted;
//     }
// 
//     public void setRooted(boolean rooted) {
//         this.rooted = rooted;
//     }
// 
//     public void setWeighted(boolean weighted) {
//         this.weighted = weighted;
//     }
// 
//     public boolean isWeighted() {
//         return weighted;
//     }
//     public String getAlnFileSuffix() {
//         return alnFileSuffix;
//     }
// 
//     public void setAlnFileSuffix(String alnFileSuffix) {
//         this.alnFileSuffix = alnFileSuffix;
//     }
//     
//     public String getUnifomFileName() {
//         return unifomFileName;
//     }
// 
//     public void setUnifomFileName(String unifomFileName) {
//         this.unifomFileName = unifomFileName;
//     }
// 
//     public String getYuleFileName() {
//         return yuleFileName;
//     }
// 
//     public void setYuleFileName(String yuleFileName) {
//         this.yuleFileName = yuleFileName;
//     }
// 
// 
//     public IMetircDistrbHolder getUnifomRandData() {
//         return unifomRandData;
//     }
// 
// 
//     public IMetircDistrbHolder getYuleRandData() {
//         return yuleRandData;
//     }
// 
// 
//     public String getDescription() {
//         return description;
//     }
// 
//     public void setDescription(String description) {
//         this.description = description;
//     }
//     
//     public BaseMetric() {
//         this.rooted = false;
//         this.diffLeafSets = false;
//     }
// 
//     public String getCommandLineName() {
//         return commandLineName;
//     }
// 
//     public void setCommandLineName(String commandLineName) {
//         this.commandLineName = commandLineName;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public void setName(String name) {
//         this.name = name;
//     }
// 
//     public abstract double getDistance(Tree t1, Tree t2, int... indexes) ;
//     public  AlignInfo getAlignment(){
//         return null;
//     }
//     
//     private IMetircDistrbHolder parseData(String dataDir, String dataFileName){
//         
//         MetircDistrbHolder mdh = new MetircDistrbHolder();
// 
//         String fullPath = dataDir + "/" + dataFileName;
// 
//         try {
//         FileReader fr = new FileReader(fullPath);
//         BufferedReader br = new BufferedReader(fr);
//         int cnt = 0;
//         String line;
//         while ((line = br.readLine()) != null){
//           cnt++;
//           if(cnt > 1){
//               MetricDistribution md = new MetricDistribution();
//               md.readData(line);
//               mdh.insertDistribution(md);
//           }
//         }
//         br.close();
//       }
//       catch (IOException e) {
//           Logger.getLogger(ConfigSettings.class.getName()).log(Level.SEVERE, "Error while reading data file:" + fullPath, e);
//           mdh = null;
//       }
//         return mdh;
//     }
// 
//     public void initData(){
//         ConfigSettings config = ConfigSettings.getConfig();
//         String dataDir = config.getDataDir();
//         if (unifomRandData == null){
//             if (unifomFileName != null){
//                 unifomRandData = parseData(dataDir, unifomFileName);
//             }         
//         }
//         
//         if (yuleRandData == null){
//             if (yuleFileName != null){
//                 yuleRandData = parseData(dataDir, yuleFileName);
//             }
//         }
//     }
//       
// }


// Path: src/treecmp/config/ConfigSettings.java
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
import treecmp.metric.BaseMetric;

                String uniformFileName = "";
                String yuleFileName = "";
                String alnFileSuffix = "";
                String rooted = "";
                String weighted = "";
                String diff_leaves = "";
                /**
                 * Update defined metric set
                 *
                 */

                NodeList list = doc.getElementsByTagName("metric");
                for (int i = 0; i < list.getLength(); i++) {
                    // Get element
                    Element element = (Element) list.item(i);
                    //System.out.println(getTextValue(element, "class"));
                    className = getTextValue(element, "class");
                    metricName = getTextValue(element, "name");
                    commandLineName = getTextValue(element, "command_name");
                    metricDesc = getTextValue(element, "description");
                    uniformFileName = getTextValue(element, "unif_data");
                    yuleFileName = getTextValue(element, "yule_data");
                    alnFileSuffix = getTextValue(element, "aln_file_suffix");
                    rooted = getTextValue(element, "rooted");
                    weighted = getTextValue(element, "weighted");
                    diff_leaves = getTextValue(element, "diff_leaves");

                    if (className != null) {
                        Class cl = Class.forName(className);
                        //Metric m=(Metric) cl.newInstance();
                        BaseMetric m = (BaseMetric) cl.newInstance();