/*
 * $Id: Analyser_es.java,v 1.8 2006/07/18 11:42:11 lawern Exp $
 *
 * Copyright (c) Siemens AG 2008 
 *           (c) Universität Paderborn 2008 
 * Licensed under EUPL 1.1. 
 *
 * $Log: Analyser_es.java,v $
 * Revision 1.8  2006/07/18 11:42:11  lawern
 * Stoppwörter aus den Testvektoren für die Optimierung rausgeschmissen.
 *
 * Revision 1.7  2006/07/17 14:45:29  lawern
 * Korrektur der Analyser.
 *
 * Revision 1.6  2005/04/13 06:37:26  lawern
 * Analyser mit Typografiegewichtung
 *
 * Revision 1.5  2003/12/24 10:12:04  bigmac
 * Projektweite Import-Optimierung
 *
 * Revision 1.4  2003/08/27 09:44:16  lawern
 * LangPackId hinzugefügt
 *
 * Revision 1.3  2003/06/30 06:50:22  lawern
 * Keywords in Gross-/Kleinschreibung werden jetzt richtig behandelt.
 *
 * Revision 1.2  2003/04/25 17:36:28  lawern
 * Überarbeitung der Satzendeerkennung
 *
 * Revision 1.1  2003/04/25 13:46:36  lawern
 * initiale Version
 *
 */
package vkc.analyse;

import cern.colt.list.DoubleArrayList;

import vkc.misc.VKCLogManager;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;


/**
 * Klasse zum Analysieren von spanischen Texten.
 *
 * @author lawern
 */
public final class Analyser_es extends Analyser {
    static HashSet abbreviations = null;
    static HashSet stopWords = null;
    private static Integer langPackId;
    private BufferedString tmpWord = new BufferedString("");

    public void init_Analyser(ArrayList wordList, DoubleArrayList weights) {
        //Datenstrukturen initialisieren
        words = new HashMap(1000);
        sentences = new ArrayList();
        tokens = new ArrayList(1000);

        //Standart Sentence Builder verwenden
        rebuildSentences(wordList, weights);
    }

    /**
     * Initialisiert die statischen Objekte.
     */
    private static void loadTables(String languageDir) {
        String line;
        BufferedReader f;

        //Abkürzungsliste laden
        try {
            abbreviations = new HashSet();
            f = new BufferedReader(new FileReader(languageDir +
                        "/abbreviations_es.lst"));

            while ((line = f.readLine()) != null) {
                abbreviations.add(line.trim().toLowerCase());
            }

            f.close();
        } catch (IOException ioe) {
            VKCLogManager.errorLog("vkc.analyse.Analyser_es", "1",
                "Can't find file: " + languageDir + "/abbreviations_es.lst", ioe);
        }

        //Stoppwortliste laden
        stopWords = new HashSet();

        if (stopwords) {
            try {
                f = new BufferedReader(new FileReader(languageDir +
                            "/stopwords_es.lst"));

                while ((line = f.readLine()) != null) {
                    stopWords.add(line.trim().toLowerCase());
                }

                f.close();
            } catch (IOException ioe) {
                VKCLogManager.errorLog("vkc.analyse.Analyser_es", "2",
                    "Can't find file: " + languageDir + "/stopwords_es.lst", ioe);
            }
        }
    }

    /**
     * Fügt den übergebenen Satz mit seiner Schlagwortliste dem Ergebnis hinzu.
     *
     * @param sentence Satztext
     * @param keyWords Liste der im Satz vorkommenden Schlagwörter in Form von
     *        SummaryEntries
     *
     * @return Verweis auf den Ergebniseintrag, anderenfalls <code>null</code>
     */
    protected SummaryEntry setSentence(String sentence, ArrayList keywords) {
        SummaryEntry newEntry = new SummaryEntry(sentence, keywords);

        sentences.add(newEntry);

        //System.out.println(sentence);
        return newEntry;
    }

    /**
     * Fügt das übergebene Wort mit seinem Gewicht in die Ergebnisliste ein,
     * falls es sich um ein Schlagwort handelt und liefert in diesem Fall den
     * Verweis auf den Eintrag zurück, anderenfalls wird null zurückgeliefert.
     *
     * @param word Wort welches hinzugefügt werden soll
     * @param weigt Gewicht des hinzuzufügenden Wortes
     *
     * @return Verweis auf den Ergebniseintrag, anderenfalls <code>null</code>
     */
    protected SummaryEntry setWord(String word, double relevance) {
        //relevance = 1;
        SummaryEntry tmpWeight = null;
        String lowerWord = word.toLowerCase();

        if (!isStopWord(lowerWord)) {
            //Keyword ist nicht in der Stoppwortliste
            tmpWord.set(word);
            tmpWeight = (SummaryEntry) words.get(tmpWord);

            //existiert das Wort schon in der words-Liste?
            if (tmpWeight != null) {
                //Ja, dann Wert nur erhöhen.
                tmpWeight.inc(relevance);
            } else {
                //Nein, dann neues Wort anlegen.
                tmpWeight = new SummaryEntry(word, relevance);
                words.put(tmpWord, tmpWeight);
                tmpWord = new BufferedString("");
            }

            //Gewicht des Gesamtdokumentes erhöhen
            documentWeight += relevance;
        }

        //Verweis auf HashMap-Eintrag zurückgeben
        return tmpWeight;
    }

    /**
     * Tested ob das übergebene Wort eine Abkürzung ist.
     */
    boolean isAbbreviation(String word) {
        return abbreviations.contains(word);
    }

    /**
     * Tested ob das übergebene Wort eine Stoppwort ist.
     */
    public static boolean isStopWord(String word) {
        return stopWords.contains(word);
    }

    /**
     * Liefert einen HashSet mit den Stoppwörtern zurück.
     */
    public static HashSet getStopWords(String languageDir) {
        if (stopWords == null) {
            loadTables(languageDir);
        }

        return stopWords;
    }

    /**
     * Setz die ID des Language Pack.
     */
    public static void setLangPackId(Integer id) {
        langPackId = id;
    }

    /**
     * Liest die ID des Language Pack.
     */
    public Integer getLangPackId() {
        return langPackId;
    }
}
