/* Programmname: Verwalten eines Index
* Datenhaltungs-Klasse: Direktzugriffsspeicher
* Aufgabe: Verwalten und Lesen/Schreiben einer Indextabelle 
* in einen Direktzugriffsspeicher
*/

import java.util.*;
import java.io.*;

public class Index
{
    //Attribute
    private final int MAX = 1000;
    private String Dateiname = "Indexdatei.txt";
	private int Indextabelle[]; //0..MAX-1
	private RandomAccessFile eineIndexDatei;
    //Konstruktor
    public Index()
    {
        Indextabelle = new int[MAX];
        //Initialisierung der Indextabelle
        for(int i=0; i<MAX; i++)
            Indextabelle[i] = -1; //Kein Datensatz zum Schlüssel vorhanden
	}
    public void erzeugeEintrag(int Schluessel, int index) throws IOException
    {
        //Speichert zu einem Schlüssel den zugehörigen Datensatz-Index in der Indextabelle
        if(Schluessel < MAX) 
            Indextabelle[Schluessel] = index;
        //Aktualisieren der Indexdatei, d.h. abspeichern der Datei
        aktualisiereIndexDatei(Schluessel);
    }
    public int gibIndexZuSchluessel(int Schluessel)
    {
        //Gibt zu dem Schlüssel den gefundenen Datensatz-Index zurück
        if(Schluessel < MAX) 
            return Indextabelle[Schluessel];
        // oder 0, wenn Schlüssel zu groß ist
        else 
            return 0;
    }
    public void ladeIndexDatei() throws IOException
    {
        // Liest die Indextabelle vollständig aus einer Datei
        // Dies geschieht nur beim Start des Programms
        eineIndexDatei = new RandomAccessFile(Dateiname, "r");
        int Index;
        for(int Schluessel = 0; Schluessel < MAX; Schluessel++)
        {
            Index = eineIndexDatei.readInt();
            Indextabelle[Schluessel] = Index;
        }
        eineIndexDatei.close();
    }
    public void speichereIndexDatei()throws IOException
    {
        //Speichert die Indextabelle vollständig in einer Datei
        //Dies geschieht beim Beenden des Programms
        eineIndexDatei = new RandomAccessFile(Dateiname, "rw");
        for(int Schluessel = 0; Schluessel < MAX; Schluessel++)
            eineIndexDatei.writeInt(Indextabelle[Schluessel]);
        eineIndexDatei.close();
    }
    private void aktualisiereIndexDatei(int Schluessel)throws IOException
    {
        // Aktualisiert die Indextabelle in der Indexdatei
        // Dies geschieht beim Hinzufügen eines neuen Indexes oder Ändern
        // eines alten Indexes
        eineIndexDatei = new RandomAccessFile(Dateiname, "rw");
        //Positionieren auf den entsprechenden Eintrag; eine int-Zahl belegt 4 Bytes
        eineIndexDatei.seek((long)(Schluessel*4)); 
        eineIndexDatei.writeInt(Indextabelle[Schluessel]);
        eineIndexDatei.close();
    }
}