import java.io.*;
import java.net.*;

import javax.xml.bind.*;
import javax.xml.transform.stream.StreamSource;

import config.*;

/********************************************************
 * 
 *******************************************************/

public class configuration
{
  private static String input_path  = "\\input\\";
  private static String output_path = "\\output\\";
  private static String corpus_path = "\\output\\corpus\\";
  private static String terms_path  = "\\output\\terms\\";

  private String path = "";

  private String files_input_MeSH   = "";
  private String files_input_CV     = "";
  private String files_input_filter = "";
  private String files_input_UMLS   = "";

  private String files_output_corpus_MeSH_PubMed_docs = "";
  private String files_output_corpus_MeSH_PubMed_IDs  = "";
  private String files_output_corpus_MeSH_PMC_docs    = "";
  private String files_output_corpus_MeSH_PMC_IDs     = "";
  private String files_output_corpus_CV_PubMed_docs   = "";
  private String files_output_corpus_CV_PubMed_IDs    = "";
  private String files_output_corpus_CV_PMC_docs      = "";
  private String files_output_corpus_CV_PMC_IDs       = "";

  private String files_output_terms_C_value_MeSH_PubMed = "";
  private String files_output_terms_C_value_MeSH_PMC    = "";
  private String files_output_terms_C_value_CV_PubMed   = "";
  private String files_output_terms_C_value_CV_PMC      = "";
  private String files_output_terms_new_MeSH_PubMed     = "";
  private String files_output_terms_new_MeSH_PMC        = "";
  private String files_output_terms_new_CV_PubMed       = "";
  private String files_output_terms_new_CV_PMC          = "";
  private String files_output_terms_final               = "";

  private String files_output_report = "\\output\\";

  private String database_driver   = "";
  private String database_url      = "";
  private String database_username = "";
  private String database_password = "";
  private String database_dump     = "";

  private String server_url  = "";
  private String server_path = "";

  private String Entrez_PubMed_retMax   = "";
  private int    Entrez_PubMed_docs_min = 0;
  private int    Entrez_PubMed_docs_max = 0;
  private int    Entrez_PubMed_terms    = 0;
  private String Entrez_PMC_retMax      = "";
  private int    Entrez_PMC_docs_min    = 0;
  private int    Entrez_PMC_docs_max    = 0;
  private int    Entrez_PMC_terms       = 0;

  private String UMLS_dbYear   = "";
  private String UMLS_language = "";
  private String UMLS_host     = "";

  private String menu_start = "";
  private String menu_end   = "";

  public String path() {return path;}
  public String files_input_MeSH() {return files_input_MeSH;}
  public String files_input_CV() {return files_input_CV;}
  public String files_input_filter() {return files_input_filter;}
  public String files_input_UMLS() {return files_input_UMLS;}
  public String files_output_corpus_MeSH_PubMed_docs() {return files_output_corpus_MeSH_PubMed_docs;}
  public String files_output_corpus_MeSH_PubMed_IDs() {return files_output_corpus_MeSH_PubMed_IDs;}
  public String files_output_corpus_MeSH_PMC_docs() {return files_output_corpus_MeSH_PMC_docs;}
  public String files_output_corpus_MeSH_PMC_IDs() {return files_output_corpus_MeSH_PMC_IDs;}
  public String files_output_corpus_CV_PubMed_docs() {return files_output_corpus_CV_PubMed_docs;}
  public String files_output_corpus_CV_PubMed_IDs() {return files_output_corpus_CV_PubMed_IDs;}
  public String files_output_corpus_CV_PMC_docs() {return files_output_corpus_CV_PMC_docs;}
  public String files_output_corpus_CV_PMC_IDs() {return files_output_corpus_CV_PMC_IDs;}
  public String files_output_terms_C_value_MeSH_PubMed() {return files_output_terms_C_value_MeSH_PubMed;}
  public String files_output_terms_C_value_MeSH_PMC() {return files_output_terms_C_value_MeSH_PMC;}
  public String files_output_terms_C_value_CV_PubMed() {return files_output_terms_C_value_CV_PubMed;}
  public String files_output_terms_C_value_CV_PMC() {return files_output_terms_C_value_CV_PMC;}
  public String files_output_terms_new_MeSH_PubMed() {return files_output_terms_new_MeSH_PubMed;}
  public String files_output_terms_new_MeSH_PMC() {return files_output_terms_new_MeSH_PMC;}
  public String files_output_terms_new_CV_PubMed() {return files_output_terms_new_CV_PubMed;}
  public String files_output_terms_new_CV_PMC() {return files_output_terms_new_CV_PMC;}
  public String files_output_terms_final() {return files_output_terms_final;}
  public String files_output_report() {return files_output_report;}
  public String database_driver() {return database_driver;}
  public String database_url() {return database_url;}
  public String database_username() {return database_username;}
  public String database_password() {return database_password;}
  public String database_dump() {return database_dump;}
  public String server_url() {return server_url;}
  public String server_path() {return server_path;}
  public String Entrez_PubMed_retMax() {return Entrez_PubMed_retMax;}
  public int    Entrez_PubMed_docs_min() {return Entrez_PubMed_docs_min;}
  public int    Entrez_PubMed_docs_max() {return Entrez_PubMed_docs_max;}
  public int    Entrez_PubMed_terms() {return Entrez_PubMed_terms;}
  public String Entrez_PMC_retMax() {return Entrez_PMC_retMax;}
  public int    Entrez_PMC_docs_min() {return Entrez_PMC_docs_min;}
  public int    Entrez_PMC_docs_max() {return Entrez_PMC_docs_max;}
  public int    Entrez_PMC_terms() {return Entrez_PMC_terms;}
  public String UMLS_dbYear() {return UMLS_dbYear;}
  public String UMLS_language() {return UMLS_language;}
  public String UMLS_host() {return UMLS_host;}
  public String menu_start() {return menu_start;}
  public String menu_end() {return menu_end;}


  // --- read the config file in the XML format ---
  public configuration() throws Exception
  {
    // --- 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"));

      path = data.getPath();

      Data.Files files = data.getFiles();

        Data.Files.Input input = files.getInput();
          files_input_MeSH   = path + input_path + input.getMeSH();
          files_input_CV     = path + input_path + input.getCV();
          files_input_filter = path + input_path + input.getFilter();
          files_input_UMLS   = path + input_path + input.getUMLS();

        Data.Files.Output output = files.getOutput();
          Data.Files.Output.Corpus corpus = output.getCorpus();
            MixedCorpus corpus_MeSH = corpus.getMeSH();
              Corpus corpus_MeSH_PubMed = corpus_MeSH.getPubMed();
                files_output_corpus_MeSH_PubMed_docs = path + corpus_path + corpus_MeSH_PubMed.getDocs();
                files_output_corpus_MeSH_PubMed_IDs  = path + corpus_path + corpus_MeSH_PubMed.getIDs();
              Corpus corpus_MeSH_PMC = corpus_MeSH.getPMC();
                files_output_corpus_MeSH_PMC_docs = path + corpus_path + corpus_MeSH_PMC.getDocs();
                files_output_corpus_MeSH_PMC_IDs  = path + corpus_path + corpus_MeSH_PMC.getIDs();
            MixedCorpus corpus_CV = corpus.getCV();
              Corpus corpus_CV_PubMed = corpus_CV.getPubMed();
                files_output_corpus_CV_PubMed_docs = path + corpus_path + corpus_CV_PubMed.getDocs();
                files_output_corpus_CV_PubMed_IDs  = path + corpus_path + corpus_CV_PubMed.getIDs();
              Corpus corpus_CV_PMC = corpus_CV.getPMC();
                files_output_corpus_CV_PMC_docs = path + corpus_path + corpus_CV_PMC.getDocs();
                files_output_corpus_CV_PMC_IDs  = path + corpus_path + corpus_CV_PMC.getIDs();
          Data.Files.Output.Terms terms = output.getTerms();
            Data.Files.Output.Terms.CValue C_value = terms.getCValue();
              Terms C_value_MeSH = C_value.getMeSH();
                files_output_terms_C_value_MeSH_PubMed = path + terms_path + C_value_MeSH.getPubMed();
                files_output_terms_C_value_MeSH_PMC    = path + terms_path + C_value_MeSH.getPMC();;
              Terms C_value_CV = C_value.getCV();
                files_output_terms_C_value_CV_PubMed = path + terms_path + C_value_CV.getPubMed();
                files_output_terms_C_value_CV_PMC    = path + terms_path + C_value_CV.getPMC();
            Data.Files.Output.Terms.New NEW = terms.getNew();
              Terms new_MeSH = NEW.getMeSH();
                files_output_terms_new_MeSH_PubMed = path + terms_path + new_MeSH.getPubMed();
                files_output_terms_new_MeSH_PMC    = path + terms_path + new_MeSH.getPMC();
              Terms new_CV = NEW.getCV();
                files_output_terms_new_CV_PubMed = path + terms_path + new_CV.getPubMed();
                files_output_terms_new_CV_PMC    = path + terms_path + new_CV.getPMC();
            files_output_terms_final = path + terms_path + terms.getFinal();
          files_output_report = path + output_path + output.getReport();

      Data.Database database = data.getDatabase();
        database_driver = database.getDriver();
        database_url = database.getUrl();
        database_username = database.getUsername();
        database_password = database.getPassword();
        database_dump = path + output_path + database.getDump();

      Data.Server server = data.getServer();
        server_url = server.getUrl();
        server_path = server.getPath();

      Data.Entrez entrez = data.getEntrez();
        IR pubmed = entrez.getPubMed();
          Entrez_PubMed_retMax = pubmed.getMaxRet();
          IR.Docs pubmed_docs = pubmed.getDocs();
            Entrez_PubMed_docs_min = pubmed_docs.getMin();
            Entrez_PubMed_docs_max = pubmed_docs.getMax();
          Entrez_PubMed_terms = pubmed.getTerms();
        IR pmc = entrez.getPMC();
          Entrez_PMC_retMax = pmc.getMaxRet();
          IR.Docs pmc_docs = pmc.getDocs();
          Entrez_PMC_docs_min = pmc_docs.getMin();
          Entrez_PMC_docs_max = pmc_docs.getMax();
          Entrez_PMC_terms = pmc.getTerms();

     Data.UMLS umls = data.getUMLS();
       UMLS_dbYear = umls.getDbYear();
       UMLS_language = umls.getLanguage();
       UMLS_host = umls.getHost();

     Data.Menu menu = data.getMenu();
       menu_start = menu.getStart();
       menu_end = menu.getEnd();
  }

  public void print()
  {
    System.out.println("\nInput files:\n");
    System.out.println("  MeSH   terms: " + files_input_MeSH);
    System.out.println("  CV     terms: " + files_input_CV);
    System.out.println("  filter terms: " + files_input_filter);
    System.out.println("  UMLS classes: " + files_input_UMLS);

    System.out.println("\nOutput files:\n");
    System.out.println("\n  Corpus:\n");
    System.out.println("    MeSH abstracts: " + files_output_corpus_MeSH_PubMed_docs);
    System.out.println("    MeSH PMIDs:     " + files_output_corpus_MeSH_PubMed_IDs);
    System.out.println("    MeSH papers:    " + files_output_corpus_MeSH_PMC_docs);
    System.out.println("    MeSH PMCIDs:    " + files_output_corpus_MeSH_PMC_IDs);
    System.out.println("    CV   abstracts: " + files_output_corpus_CV_PubMed_docs);
    System.out.println("    CV   PMIDs:     " + files_output_corpus_CV_PubMed_IDs);
    System.out.println("    CV   papers:    " + files_output_corpus_CV_PMC_docs);
    System.out.println("    CV   PMCIDs:    " + files_output_corpus_CV_PMC_IDs);
    System.out.println("\n  C-value terms from...\n");
    System.out.println("    MeSH abstracts: " + files_output_terms_C_value_MeSH_PubMed);
    System.out.println("    MeSH papers:    " + files_output_terms_C_value_MeSH_PMC);
    System.out.println("    CV   abstracts: " + files_output_terms_C_value_CV_PubMed);
    System.out.println("    CV   papers:    " + files_output_terms_C_value_CV_PMC);
    System.out.println("\n  New terms from...\n");
    System.out.println("    MeSH abstracts: " + files_output_terms_new_MeSH_PubMed);
    System.out.println("    MeSH papers:    " + files_output_terms_new_MeSH_PMC);
    System.out.println("    CV   abstracts: " + files_output_terms_new_CV_PubMed);
    System.out.println("    CV   papers:    " + files_output_terms_new_CV_PMC);
    System.out.println("\n  Final list of new terms: " + files_output_terms_final);
    System.out.println("\n  Report on the term acquisition results: " + files_output_report);

    System.out.println("\nDatabase:\n");
    System.out.println("  driver:   " + database_driver);
    System.out.println("  URL:      " + database_url);
    System.out.println("  username: " + database_username);
    System.out.println("  password: ********");
    System.out.println("  dump:     " + database_dump);

    System.out.println("\nEntrez:\n");
    System.out.println("  PubMed");
    System.out.println("    retMax:   " + Entrez_PubMed_retMax);
    System.out.println("    docs_min: " + Entrez_PubMed_docs_min);
    System.out.println("    docs_max: " + Entrez_PubMed_docs_max);
    System.out.println("    terms:    " + Entrez_PubMed_terms);
    System.out.println("  PMC");
    System.out.println("    retMax:   " + Entrez_PMC_retMax);
    System.out.println("    docs_min: " + Entrez_PMC_docs_min);
    System.out.println("    docs_max: " + Entrez_PMC_docs_max);
    System.out.println("    terms:    " + Entrez_PMC_terms);

    System.out.println("\nUMLS:\n");
    System.out.println("  dbYear:   " + UMLS_dbYear);
    System.out.println("  language: " + UMLS_language);
    System.out.println("  host:     " + UMLS_host);

    System.out.println("\nMenu:\n");
    System.out.println("  start: " + menu_start);
    System.out.println("  end:   " + menu_end);
  }
}

