DefaultConfig.java 6.45 KB
package LIA_topic_seg;

import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.*;
import java.io.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
import javax.xml.transform.*;
import java.util.*;
import org.apache.commons.cli.*;

/**
 * Cette classe regroupe des paramtres de configuration
 *
 * This product includes software developed by the
 * Apache Software Foundation (http://www.apache.org/)."
 */
public class DefaultConfig
{
  private class CmdLine extends PosixParser
  {
    final private boolean NEED_ARG = true;
    final private boolean DO_NOT_NEED_ARG = false;
    CmdLine(String args[]) throws ParseException
    {
      super();
      // documentation : http://jakarta.apache.org/commons/cli/apidocs/index.html
      _cl = parse(new Options()
       .addOption("", "inputDataSentenceXmlTag", NEED_ARG, "")
       .addOption("", "inputDataWordsXmlTag", NEED_ARG, "")
       .addOption("", "inputDataLemmaWeightXmlTag", NEED_ARG, "")
       .addOption("", "inputDataSentenceXmlTag", NEED_ARG, "")
       .addOption("", "lexicalChainsHiatus", NEED_ARG, "")
       .addOption("", "computeChains", NEED_ARG, "")
       .addOption("", "file", NEED_ARG, "")
       .addOption("", "n", NEED_ARG, "")
        .addOption("", "s", NEED_ARG, "")
       .addOption("", "config", NEED_ARG, ""),
        args);
    }
  }
  //--------------------------------------------------------------------------
  private CommandLine _cl;
  private HashMap<String, String> _map = new HashMap<String, String>();
  //--------------------------------------------------------------------------
  public DefaultConfig() throws Exception
  {
    init();
  }
  //--------------------------------------------------------------------------
  public DefaultConfig(String fileName) throws Exception
  {
    init();
    load(fileName);
  }
  //--------------------------------------------------------------------------
  private void init() throws Exception
  {
    // tag "phrase" dans le fichier d'entrée
    setParam("inputDataSentenceXmlTag","phr");
    // tag "lemme d'une phrase" dans le fichier d'entrée
    setParam("inputDataWordsXmlTag", "wd");
    // tag "poids d'un lemme dans une phrase" dans le fichier d'entrée
    setParam("inputDataLemmaXmlTag", "lem");
    // tag "poids d'un lemme dans une phrase" dans le fichier d'entrée
    setParam("inputDataLemmaWeightXmlTag", "poids");
    // mode de calcul du hiatus et de sa prise en compte
    // rien = pas de prise en compte du hiatus
    // un nombre = valeur du hiatus
    // ADAPTIV = valeur du hiatus à calculer localement
    setParam("lexicalChainsHiatus", "11");
    setParam("computeChains", "weight");
  }
  //--------------------------------------------------------------------------
  public void load(String fileName) throws Exception
  {
    try
    {
      Document doc = DocumentBuilderFactory.newInstance()
                  .newDocumentBuilder().parse(new File(fileName));
      Element nn = doc.getDocumentElement();
      if (nn.getTagName() != "Config")
        throw new Exception("Unexpected tag : "+nn.getTagName());
      String configVersion = "1.0"; // default version
      Attr a = nn.getAttributeNode("version");
      if (a != null)
        configVersion = a.getTextContent();
      if (configVersion.equals("1.0"))
      {
        NodeList paramNodeList = doc.getElementsByTagName("Param");
        for (int i=0; i<paramNodeList.getLength(); i++)
        {
          Node n = paramNodeList.item(i);
          setParam(n.getAttributes().getNamedItem("name").getTextContent(),
                   n.getTextContent());
        }
      }
      else
        throw new Exception("Unsupported version : "+configVersion);
    }
    catch(Exception e) { throw e; }
  }
  //--------------------------------------------------------------------------
  /**
   * @param n name of parameter
   * @param c content of parameter
  */
  public void setParam(String n, String c) throws Exception
  {
    if (n.equals("lexicalChainsHiatus"))
    {
      if (!c.equals("") && !c.equals("ADAPTIVE"))
        Integer.parseInt(c); // throws exception if cannot convert to integer
    }
    else if (n.equals("computeChains"))
    {
      if (!c.equals("yes") && !c.equals("no") && !c.equals("weight"))
        throw new Exception("invalid parameter 'computeWeight'. Must be 'yes' or 'no'");
    }
    _map.put(n, c);
  }
  //--------------------------------------------------------------------------
  /**
   * @param n name of parameter
   * @return true if parameter exists; false otherwise
  */
  public boolean containsParam(String n)
  {
    return _map.containsKey(n);
  }
  //--------------------------------------------------------------------------
  /**
   * Cette fonction permet d'accŽder aux paramtres, qu'ils aient ŽtŽ mis par dŽfaut, ou passŽs par le fichier de configuration, 
   * ou encore passŽs en ligne de commande.
   * @param n name of parameter
   * @return content of parameter or null if the parameter does not exist
  */
  public String getParam(String n)
  {
    return _map.get(n);
  }
  //--------------------------------------------------------------------------
  /**
   * Cette fonction permet de rŽcupŽrer les paramtres passŽs en ligne de commande
   * les valeurs sont prioritaires sur le fichier de configuration en cas de conflit.
  */
  public String[] setParamsFromCmdLine(String[] args) throws Exception
  {
    new CmdLine(args);
    Option[] t = _cl.getOptions();
    for (int i=0; i<t.length; i++)
      setParam(t[i].getLongOpt(), t[i].getValue(""));
    return _cl.getArgs(); // returns unrecognized args (file list for example)
  }
  //--------------------------------------------------------------------------
  public void save(String fileName) throws Exception
  {
    FileWriter w = new FileWriter(new File(fileName));
    w.write("<?xml version=\"1.0\"?>");
    w.write("\n<Config version=\"1.0\">");
    Set<String> set = _map.keySet();
    for (Iterator<String> i = set.iterator(); i.hasNext();)
    {
      String name = i.next();
      w.write("\n  <Param name=\""+name+"\">"+getParam(name)+"</Param>");
    }
    w.write("\n</Config>");
    w.close();
  }
  //--------------------------------------------------------------------------
  public String toString()
  {
    StringWriter w = new StringWriter();
    w.write(super.toString()+"\n");
    Set<String> set = _map.keySet();
    for (Iterator<String> i = set.iterator(); i.hasNext();)
    {
      String name = i.next();
      w.write("  "+name+"("+getParam(name)+")\n");
    }
    return w.toString();
  }
}