import java.util.*;
import java.io.*;
import java.net.*;

import javax.xml.bind.*;
import javax.xml.transform.stream.StreamSource;

import config.*;

/********************************************************
 * 
 *******************************************************/

public class Configuration
{
  private String organism                       = "";
  private String path                           = "";
  private String input_SBO                      = "";
  private String input_GO                       = "";
  private String input_EC                       = "";
  private String input_PubMed                   = "";
  private String input_PMC                      = "";
  private String output_SBO                     = "";
  private String output_GO                      = "";
  private String output_PubMed                  = "";
  private String output_PMC                     = "";
  private String enzyme                         = "";
  private String compound                       = "";
  private String gene                           = "";
  private String enzyme_name                    = "";
  private String compound_name                  = "";
  private String gene_name                      = "";
  private String enzyme2compound                = "";
  private String enzyme2gene                    = "";
  private String output_UMLS                    = "";
  private String output_HTML_PubMed             = "";
  private String output_HTML_PMC                = "";
  private int    output_HTML_items              = 10;
  private int    output_HTML_max                = 300;
  private String output_bibtex_PubMed           = "";
  private String output_bibtex_PMC              = "";
  private String tmp_GO                         = "";
  private String tmp_UMLS                       = "";
  private String tmp_terms                      = "";
  private String tmp_PubMed                     = "";
  private String tmp_PMC                        = "";
  private String template_UMLS                  = "";
  private String driver                         = "";
  private String url                            = "";
  private String username                       = "";
  private String password                       = "";
  private String pc_driver                      = "";
  private String pc_url                         = "";
  private String pc_username                    = "";
  private String pc_password                    = "";
  private String umls_dbYear                    = "";
  private String umls_language                  = "";
  private String umls_host                      = "";
  private String options_database               = "";
  private String options_search                 = "";
  private String options_export_HTML            = "";
  private String options_export_bibtex          = "";
  private String options_export_fullText        = "";
  private List<String> options_export_tags_list = new ArrayList<String>();
  private String options_menu_start             = "";
  private String options_menu_end               = "";
  private String keywords                       = "";
  private double weight_EC                      = 0;
  private double weight_CPD                     = 0;
  private double weight_SCE                     = 0;
  private double weight_RN                      = 0;
  private double weight_GO                      = 0;
  private double weight_PATH                    = 0;
  private double weight_SBO                     = 0;

  public Configuration() throws Exception
  {
    // --- read the config file in the following XML format:

    // ---------------------------------------------------------------------------
    // <data>
    //   <path>...</path>
    //   <files>
    //     <input>
    //       <SBO>...</SBO>
    //       <GO>...</GO>
    //       <EC>...</EC>
    //       <PubMed>...</PubMed>
    //       <PMC>...</PMC>
    //     </input>
    //     <output>
    //       <GO>...</GO>
    //       <SBO>...</SBO>
    //       <KEGG>
    //         <enzyme>...</enzyme>
    //         <compound>...</compound>
    //         <gene>...</gene>
    //         <enzyme_name>...</enzyme_name>
    //         <compound_name>...</compound_name>
    //         <gene_name>...</gene_name>
    //         <enzyme2compound>...</enzyme2compound>
    //         <enzyme2gene>...</enzyme2gene>
    //       </KEGG>
    //       <UMLS>...</UMLS>
    //       <HTML>
    //         <PubMed>...</PubMed>
    //         <PMC>...</PMC>
    //         <items>...</items>
    //         <max>...</max>
    //       </HTML>
    //       <bibtex>
    //         <PubMed>...</PubMed>
    //         <PMC>...</PMC>
    //       </bibtex>
    //     </output>
    //     <tmp>
    //       <GO>...</GO>
    //       <UMLS>...</UMLS>
    //       <terms>...</terms>
    //     </tmp>
    //     <template>
    //       <UMLS>...</UMLS>
    //     </template>
    //   </files>
    //   <database>
    //     <driver>...</driver>
    //     <url>...</url>
    //     <username>...</username>
    //     <password>...</password>
    //   </database>
    //   <pubchem>
    //     <driver>...</driver>
    //     <url>...</url>
    //     <username>...</username>
    //     <password>...</password>
    //   </pubchem>
    //   <UMLS>
    //     <dbYear>...</dbYear>
    //     <language>..</language>
    //     <host>...</host>
    //   </UMLS>
    //   <params>
    //     <keywords>...</keywords>
    //     <weights>
    //       <EC>...</EC>
    //       <CPD>...</CPD>
    //       <SCE>...</SCE>
    //       <RN>...</RN>
    //       <GO>...</GO>
    //       <PATH>...</PATH>
    //       <SBO>...</SBO>
    //     </weights>
    //   </params>
    //   <options>
    //     <database>...</database>
    //     <search>...</search>
    //     <export>
    //       <HTML>...</HTML>
    //       <bibtex>...</bibtex>
    //       <fullText>...</fullText>
    //       <tags>
    //         <tag>...</tag>
    //         <tag>...</tag>
    //       </tags>
    //     </export>
    //     <menu>
    //       <start>...</start>
    //       <end>...</end>
    //     </menu>
    //   </options>
    // </data>
    // ---------------------------------------------------------------------------

    // --- prepare for XML unmarshalling
    JAXBContext jc;            // --- JAXBContext object to provide entry point to JAXB API
    Unmarshaller unmarshaller; // --- Unmarshaller object to control the process of unmarshalling

    jc = JAXBContext.newInstance("config");
    unmarshaller = jc.createUnmarshaller();

    config.Data data = (config.Data) unmarshaller.unmarshal(new File("config.xml"));

    organism = data.getOrganism();

    path = data.getPath();

    Data.Files files = data.getFiles();
    Data.Files.Input    input    = files.getInput();
    Data.Files.Output   output   = files.getOutput();
    Data.Files.Tmp      tmp      = files.getTmp();
    Data.Files.Template template = files.getTemplate();

    input_SBO    = input.getSBO();
    input_GO     = input.getGO();
    input_EC     = input.getEC();
    input_PubMed = input.getPubMed();
    input_PMC    = input.getPMC();

    output_SBO    = output.getSBO();
    output_GO     = output.getGO();
    output_UMLS   = output.getUMLS();
    output_PubMed = output.getPubMed();
    output_PMC    = output.getPMC();


    Data.Files.Output.KEGG kegg = output.getKEGG();

    enzyme          = kegg.getEnzyme();
    compound        = kegg.getCompound();
    gene            = kegg.getGene();
    enzyme_name     = kegg.getEnzymeName();
    compound_name   = kegg.getCompoundName();
    gene_name       = kegg.getGeneName();
    enzyme2compound = kegg.getEnzyme2Compound();
    enzyme2gene     = kegg.getEnzyme2Gene();

    Data.Files.Output.HTML html = output.getHTML();
    output_HTML_PubMed = html.getPubMed();
    output_HTML_PMC    = html.getPMC();
    output_HTML_items  = html.getItems();
    output_HTML_max    = html.getMax();

    Data.Files.Output.Bibtex bibtex = output.getBibtex();
    output_bibtex_PubMed = bibtex.getPubMed();
    output_bibtex_PMC    = bibtex.getPMC();

    tmp_GO     = tmp.getGO();
    tmp_UMLS   = tmp.getUMLS();
    tmp_terms  = tmp.getTerms();
    tmp_PubMed = tmp.getPubMed();
    tmp_PMC    = tmp.getPMC();

    template_UMLS = template.getUMLS();

    Data.Database database = data.getDatabase();

    driver   = database.getDriver();
    url      = database.getUrl();
    username = database.getUsername();
    password = database.getPassword();

    Data.Pubchem pubchem = data.getPubchem();

    pc_driver   = pubchem.getDriver();
    pc_url      = pubchem.getUrl();
    pc_username = pubchem.getUsername();
    pc_password = pubchem.getPassword();

    Data.UMLS umls = data.getUMLS();

    umls_dbYear   = umls.getDbYear();
    umls_language = umls.getLanguage();
    umls_host     = umls.getHost();

    Data.Params params = data.getParams();
    keywords = params.getKeywords();
    Data.Params.Weights weights = params.getWeights();

    weight_EC   = weights.getEC();
    weight_CPD  = weights.getCPD();
    weight_SCE  = weights.getSCE();
    weight_RN   = weights.getRN();
    weight_GO   = weights.getGO();
    weight_PATH = weights.getPATH();
    weight_SBO  = weights.getSBO();

    Data.Options options = data.getOptions();

    options_database = options.getDatabase();
    options_search   = options.getSearch().value();

    Data.Options.Export export = options.getExport();
    options_export_HTML     = export.getHTML().value();
    options_export_bibtex   = export.getBibtex().value();
    options_export_fullText = export.getFullText().value();

    Data.Options.Export.Tags options_export_tags = export.getTags();
    List tagList = options_export_tags.getTag();
    int n = tagList.size();
    for (int i = 0; i < n; i++)
    {
      String tag = ((String) tagList.get(i)).trim();
      options_export_tags_list.add(tag);
    }

    Data.Options.Menu menu = options.getMenu();

    options_menu_start = menu.getStart();
    options_menu_end   = menu.getEnd();
  }

  public void print()
  {
    System.out.println("Organism: " + organism);

    System.out.println("\nPath to the input/output files: " + path);

    System.out.println("\nInput files:");
    System.out.println("     SBO: " + path + "\\input\\" + input_SBO);
    System.out.println("      GO: " + path + "\\input\\" + input_GO);
    System.out.println("      EC: " + path + "\\input\\" + input_EC);
    System.out.println("  PubMed: " + path + "\\input\\" + input_PubMed);
    System.out.println("     PMC: " + path + "\\input\\" + input_PMC);

    System.out.println("\nOutput files:");
    System.out.println("    SBO: " + path + "\\output\\" + output_SBO);
    System.out.println("     GO: " + path + "\\output\\" + output_GO);
    System.out.println("   UMLS: " + path + "\\output\\" + output_UMLS);
    System.out.println(" PubMed: " + path + "\\output\\" + output_PubMed);
    System.out.println("    PMC: " + path + "\\output\\" + output_PMC);
    System.out.println(" KEGG:");
    System.out.println("   enzyme         : " + path + "\\output\\KEGG\\" + enzyme);
    System.out.println("   compound       : " + path + "\\output\\KEGG\\" + compound);
    System.out.println("   gene           : " + path + "\\output\\KEGG\\" + gene);
    System.out.println("   enzyme_name    : " + path + "\\output\\KEGG\\" + enzyme_name);
    System.out.println("   compound_name  : " + path + "\\output\\KEGG\\" + compound_name);
    System.out.println("   gene_name      : " + path + "\\output\\KEGG\\" + gene_name);
    System.out.println("   enzyme2compound: " + path + "\\output\\KEGG\\" + enzyme2compound);
    System.out.println("   enzyme2gene    : " + path + "\\output\\KEGG\\" + enzyme2gene);
    System.out.println(" HTML (max of " + output_HTML_max + " items: " + output_HTML_items + " items per page):");
    System.out.println("   PubMed: " + path + "\\output\\html\\" + output_HTML_PubMed);
    System.out.println("      PMC: " + path + "\\output\\html\\" + output_HTML_PMC);
    System.out.println(" bibtex:");
    System.out.println("   PubMed: " + path + "\\output\\bibtex\\" + output_bibtex_PubMed);
    System.out.println("      PMC: " + path + "\\output\\bibtex\\" + output_bibtex_PMC);

    System.out.println("\nTMP files:");
    System.out.println("    GO: " + path + "\\tmp\\" + tmp_GO);
    System.out.println("  UMLS: " + path + "\\tmp\\" + tmp_UMLS);
    System.out.println(" terms: " + path + "\\tmp\\" + tmp_terms);

    System.out.println("\ntemplate files:");
    System.out.println("  UMLS: " + path + "\\template\\" + template_UMLS);

    System.out.println("\nDatabase:");
    System.out.println("    driver: " + driver);
    System.out.println("       URL: " + url);
    System.out.println("  username: " + username);
    System.out.println("  password: ********");

    System.out.println("\nPubChem:");
    System.out.println("    driver: " + pc_driver);
    System.out.println("       URL: " + pc_url);
    System.out.println("  username: " + pc_username);
    System.out.println("  password: ********");

    System.out.println("\nUMLS:");
    System.out.println("   dbYear: " + umls_dbYear);
    System.out.println(" language: " + umls_language);
    System.out.println("     host: " + umls_host);

    System.out.println("\nParameters:");
    System.out.println("\n  Keywords: " + keywords + "\n");
    System.out.println("\n  Weights:\n");
    System.out.println("     EC: " + weight_EC);
    System.out.println("    CPD: " + weight_CPD);
    System.out.println("    SCE: " + weight_SCE);
    System.out.println("     RN: " + weight_RN);
    System.out.println("     GO: " + weight_GO);
    System.out.println("   PATH: " + weight_PATH);
    System.out.println("    SBO: " + weight_SBO);

    System.out.println("\nOptions:\n");
    System.out.println("   database: " + options_database);
    System.out.println("     search: " + options_search);
    System.out.println("\n     Export:");
    System.out.println("       HTML: " + options_export_HTML);
    System.out.println("     bibtex: " + options_export_bibtex);
    System.out.println("   fullText: " + options_export_fullText);
    System.out.print("       tags: ");
    int n = options_export_tags_list.size();
    for (int i = 0; i < n; i++)
    {
      String tag = options_export_tags_list.get(i);
      System.out.print(tag + "; ");
    }
    System.out.println();
    System.out.println("\n       Menu:");
    System.out.println("      start: " + options_menu_start);
    System.out.println("        end: " + options_menu_end);
  }

  public String organism()                       {return organism;                 }
  public String path()                           {return path;                     }
  public String input_SBO()                      {return input_SBO;                }
  public String input_GO()                       {return input_GO;                 }
  public String input_EC()                       {return input_EC;                 }
  public String input_PubMed()                   {return input_PubMed;             }
  public String input_PMC()                      {return input_PMC;                }
  public String output_SBO()                     {return output_SBO;               }
  public String output_GO()                      {return output_GO;                }
  public String output_UMLS()                    {return output_UMLS;              }
  public String output_PubMed()                  {return output_PubMed;            }
  public String output_PMC()                     {return output_PMC;               }
  public String enzyme()                         {return enzyme;                   }
  public String compound()                       {return compound;                 }
  public String gene()                           {return gene;                     }
  public String enzyme_name()                    {return enzyme_name;              }
  public String compound_name()                  {return compound_name;            }
  public String gene_name()                      {return gene_name;                }
  public String enzyme2compound()                {return enzyme2compound;          }
  public String enzyme2gene()                    {return enzyme2gene;              }
  public String output_HTML_PubMed()             {return output_HTML_PubMed;       }
  public String output_HTML_PMC()                {return output_HTML_PMC;          }
  public int    output_HTML_items()              {return output_HTML_items;        }
  public int    output_HTML_max()                {return output_HTML_max;          }
  public String output_bibtex_PubMed()           {return output_bibtex_PubMed;     }
  public String output_bibtex_PMC()              {return output_bibtex_PMC;        }
  public String tmp_GO()                         {return tmp_GO;                   }
  public String tmp_UMLS()                       {return tmp_UMLS;                 }
  public String tmp_terms()                      {return tmp_terms;                }
  public String tmp_PubMed()                     {return tmp_PubMed;               }
  public String tmp_PMC()                        {return tmp_PMC;                  }
  public String template_UMLS()                  {return template_UMLS;            }
  public String driver()                         {return driver;                   }
  public String url()                            {return url;                      }
  public String username()                       {return username;                 }
  public String password()                       {return password;                 }
  public String pc_driver()                      {return pc_driver;                }
  public String pc_url()                         {return pc_url;                   }
  public String pc_username()                    {return pc_username;              }
  public String pc_password()                    {return pc_password;              }
  public String umls_dbYear()                    {return umls_dbYear;              }
  public String umls_language()                  {return umls_language;            }
  public String umls_host()                      {return umls_host;                }
  public String options_database()               {return options_database;         }
  public String options_search()                 {return options_search;           }
  public String options_export_HTML()            {return options_export_HTML;      }
  public String options_export_bibtex()          {return options_export_bibtex;    }
  public String options_export_fullText()        {return options_export_fullText;  }
  public List<String> options_export_tags_list() {return options_export_tags_list; }
  public String options_menu_start()             {return options_menu_start;       }
  public String options_menu_end()               {return options_menu_end;         }
  public String keywords()                       {return keywords;                 }
  public double weight_EC()                      {return weight_EC;                }
  public double weight_CPD()                     {return weight_CPD;               }
  public double weight_SCE()                     {return weight_SCE;               }
  public double weight_RN()                      {return weight_RN;                }
  public double weight_GO()                      {return weight_GO;                }
  public double weight_PATH()                    {return weight_PATH;              }
  public double weight_SBO()                     {return weight_SBO;               }
}

