/**
* This file is part of Archiv-Editor.
*
* The software Archiv-Editor serves as a client user interface for working with
* the Person Data Repository. See: pdr.bbaw.de
*
* The software Archiv-Editor was developed at the Berlin-Brandenburg Academy
* of Sciences and Humanities, Jägerstr. 22/23, D-10117 Berlin.
* www.bbaw.de
*
* Copyright (C) 2010-2013 Berlin-Brandenburg Academy
* of Sciences and Humanities
*
* The software Archiv-Editor was developed by @author: Christoph Plutte.
*
* Archiv-Editor is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Archiv-Editor is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Archiv-Editor.
* If not, see <http://www.gnu.org/licenses/lgpl-3.0.html>.
*/
package org.bbaw.pdr.dates;
import java.util.ArrayList;
import java.util.Vector;
/**
* Kapselt die Ergebnisse des Versuchs innerhalb eines uebergebenen Strings Datumsinformationen auszuzeichnen.
* Enthält weitere Variablen, die zur Auszeichnung notwendig sind, sowie Methoden zum Lesen und Schreiben
* der Variablen.
* @author Martin Fechner
*/
public class DatesResult{
// VARIABLEN
/** Enthält den Originaltext. Bsp.: "am 3.10.1990" */
private String[] originalText;
/** Enthält den kodierten Text. Bsp.: "sAt_sSPAsD1_sPUNsD2_sPUNsD4_" */
private String[] codedText;
/** Enthält die Arraylänge einer erkannten Datumsangabe. Bsp.: 7 */
private int[] identifiedLength;
/**
* Enthält die Bezeichnungen der Elemente einer erkannten Datumsangabe.
* Bsp.: GRENZE1, LEER, TAG1, TAG1, MONAT1, MONAT1, JAHR1
*/
private DatesSymbol.Label[] identifiedText;
/**
* Enthält die gefundenen Datumsangaben mit Detailangaben.
* Bsp.: start=0 length=12 isotext="when='1990-10-03'" originaltext="am 3.10.1990"
*/
private ArrayList<DateOccurrence> identifiedDates = new ArrayList<DateOccurrence>();
// CONSTRUCTOR
/**
* Konstruktor zerlegt den InputText in ein Array und initialisiert die Variablen.
* @param input Übergebener nach Datumsangaben zu durchsuchender String.
*/
public DatesResult(String input){
String[] txt = input.split("(?=\\p{P}|\\s|\\b)");
originalText = new String[txt.length-1];
codedText = new String[txt.length-1];
identifiedText = new DatesSymbol.Label[txt.length-1];
identifiedLength = new int[txt.length-1];
for (int i=1; i<txt.length; i++){
originalText[i-1] = txt[i];
codedText[i-1] = "s___";
identifiedText[i-1] = DatesSymbol.Label.EMPTY;
identifiedLength[i-1] = 0;
}
}
// AUSGABE/LESEN
/**
* Liefert die Länge des Arrays.
* @return Länge des Arrays.
*/
public int length(){
return originalText.length;
}
/**
* Hilfsfunktion zum Ausgeben von Teilen der Textarrays.
* @param from Position des Startelements.
* @param length Arraylänge des angefragten Strings.
* @param txt Übergebenes Textarray.
* @return Der angeforderte Teiltext.
*/
private String output(int from, int length, String[] txt){
String result = "";
for (int i=from; i<from+length && i<txt.length && i>=0; i++)
result = result+txt[i];
return result;
}
/**
* Gibt den vollständigen Originaltext zurück.
* @return Der vollständige Originaltext.
*/
public String original(){
return output(0, length(), originalText);
}
/**
* Gibt nur Element i des Originaltextes zurück.
* @param i Position des angeforderten Arrayelements.
* @return Arrayelement i des Originaltextes.
*/
public String original(int i){
return output(i, 1, originalText);
}
/**
* Gibt den Originaltext von i bis i+j zurück.
* @param i Startposition des angeforderten Teilarrays.
* @param j Länge des angeforderten Teilarrays.
* @return Teilarray des Originaltextes.
*/
String original(int i, int j){
return output(i, j, originalText);
}
/**
* Gibt den vollständigen kodierten Text zurück.
* @return Der vollständige kodierte Text.
*/
String coded(){
return output(0, length(), codedText);
}
/**
* Gibt Element i des kodierten Textes zurück.
* @param i Position des angefoderten Arrayelements.
* @return Element i des kodierten Textes.
*/
public String coded(int i){
return output(i, 1, codedText);
}
/**
* Gibt Element i des erkannten Textes als EBez zurück.
* @param i Position des angeforderten Arrayelements.
* @return Element i des erkannten Textes als EBez.
*/
public DatesSymbol.Label identified(int i){
DatesSymbol.Label result = DatesSymbol.Label.EMPTY;
if (i>=0 && i<length())
result = identifiedText[i];
return result;
}
/**
* Gibt die Arraylänge der erkannten Datumsangabe bei i zurück.
* @param i Position des Arrayelements.
* @return Die Arraylänge der erkannten Datumsangabe bei i.
*/
public int identifiedLength(int i){
int result = 0;
if (i>=0 && i<length())
result = identifiedLength[i];
return result;
}
/**
* Gibt die erkannten Ergebnisse in der Form
* "offset= .. length= .. iso= .. found= .." zurück.
* @return Eine Liste der erkannten Ergebnisse.
*/
String print(){
String result = "";
result += "pdrws-results\n";
result += "pdrws-service=dates\n";
result += String.format("pdrws-text=%1$s", original());
DateOccurrence[] ea = new DateOccurrence[identifiedDates.size()];
// result += String.format("results: %1$2s\n", ea.length);
ea = identifiedDates.toArray(ea);
for (int i=0; i<ea.length; i++){
result += "\n";
result += String.format(
"pdrws-result={offset=%1$s; length=%2$s; iso={%3$s}; found=%4$s}",
ea[i].start, ea[i].length, ea[i].isoText, ea[i].originalText);
}
return result;
}
/**
* Gibt einen Vektor auf die Ergebnisse zurück.
* @return Ein Vektor auf die Ergebnisse.
*/
public Vector<DateOccurrence> getOccurrences(){
Vector<DateOccurrence> v = new Vector<DateOccurrence>();
DateOccurrence[] ea = new DateOccurrence[identifiedDates.size()];
ea = identifiedDates.toArray(ea);
for (int i=0; i<ea.length; i++){
v.add(ea[i]);
}
return v;
}
/**
* Gibt die Anzahl der erkannten Datumsangaben zurück
* @return Die Anzahl der erkannten Datumsangaben.
*/
int numberOfResults(){
return identifiedDates.size();
}
// SCHREIBEN
/**
* Überschreibt das Element i des kodierten Textes.
* @param i Position des zu überschreibenden Elements.
* @param newCode Der neue Kode.
*/
void writeCodedText(int i, String newCode){
if (i>=0 && i<length())
codedText[i] = newCode;
}
/**
* Überschreibt das Element i des erkannten Textes mit einem
* Element vom Typ EBez.
* @param i Position des zu überschreibenden Elements.
* @param newLabel Der neue Bezeichner.
*/
void writeIdentifiedText(int i, DatesSymbol.Label newLabel){
if (i>=0 && i<length())
identifiedText[i] = newLabel;
}
/**
* Hängt eine erkannte Datumsangabe an die Liste der Ergebnisse an.
* @param newDate Das anzuhängende Ergebnis.
*/
void addIdentifiedDate(DateOccurrence newDate){
identifiedDates.add(newDate);
}
/**
* Schreibt die Arraylänge der gefundenen Datumsangabe bei i in
* erkanntelaenge.
* @param i Die Position des zu überschreibenden Elements.
* @param newLength Die neue Länge.
*/
void writeIdentifiedLength(int i, int newLength){
identifiedLength[i] = newLength;
}
}