/* Datenhaltung: Indizierte Organisation mit physisch sortiertem Index
*/

import java.util.*;
import java.io.*;

public class Direktzugriffsspeicher
{
	//Attribut
	private int aktuelleSatznr = 0;
	private final int SATZNR_MAX = 1000;
	//Attribute für die Datenhaltung
	private Index derIndex; //Verwendung der Indexverwaltung
	private Datei dieDatei; //Verwendung der Dateiverwaltung

	private Direktzugriffsspeicher()
	{
	   oeffneDateien();
	}

	//Operationen
	public void insertSatz(int satzNr, String einSatz)
	{
	    schreibeSatz(einSatz, satzNr);
	}
	public String getSatz(int satzNr)
	{
	    String einSatz = "";
	    int Index = derIndex.gibIndexZuSchluessel(satzNr);
	    if (Index != -1)//Ein Datensatz-Index ist vorhanden
	    {
	        try
	        {
	            einSatz = dieDatei.leseSatz(Index);
	        }
	        catch (IOException e)
	        {
	            System.out.println("Direktzugriffsspeicher:getSatz: Kein Satz vorhanden: Index = " + Index);
	        }

	        return einSatz;
	    }
	    else
	        return null;
	}

    public void endeAnwendung()
    {
        schliesseDateien();
    }
    //Private Operationen für die Datenhaltung
    //Nehmen die Operationen der Klassen Datei und Index in Anspruch
    private void oeffneDateien()
    {
        derIndex = new Index();
        try
        {
            //Indexdatei öffnen und Indextabelle laden
            derIndex.ladeIndexDatei();
        }
        catch (IOException e)
        {
            try
            {
                derIndex.speichereIndexDatei();
            }
             catch (IOException e1)
             {
             }
            System.out.println("Indexdatei nicht vorhanden \n");
        }
        //Datei öffnen
        dieDatei = new Datei();
    }
    private void schliesseDateien()
    {
        if(derIndex != null)
        {
            try
            {
                //Indexdatei speichern
                derIndex.speichereIndexDatei();
            }
            catch(IOException e)
            {
                System.out.println("Probleme beim Schließen der Indexdatei " + e + "\n");
            }
            //Schließen der Datei
            if (dieDatei != null)
                dieDatei.schliesseDatei();
        }
    }
    private void schreibeSatz(String einSatz, int satzNr)
    {
        //Anzahl Datensätze holen, daraus neuen Index berechnen
        int index = dieDatei.gibAnzahlDatensaetze();
        System.out.println("schreibeSatz: AnzahlDatensätze= Index: " + index + "\n");
        //Schreibt einen Datensatz in die Indexdatei
        //Die Satznummer dient der Indizierung
        try
        {
        derIndex.erzeugeEintrag(satzNr, index);
        }
        catch (IOException e)
        {
            System.out.println("Direktzugriffsspeicher: Fehler bei erzeugeEintrag: " + e + "\n");
        }
        //Speichert einen Satz in der Datei
        
        try
        {
            dieDatei.speichereSatz(einSatz, index);
        }
        catch (IOException e)
        {
        }
    }
    
    public static void main(String args[])
    {
    	Direktzugriffsspeicher dzs = new Direktzugriffsspeicher();
    	
    	dzs.insertSatz(3, "Der dritte Satz");
    	dzs.insertSatz(1, "Der erste Satz");
    	dzs.insertSatz(2, "Der zweite Satz");
    	
    	System.out.println(dzs.getSatz(1));
    	System.out.println(dzs.getSatz(2));
    	System.out.println(dzs.getSatz(3));
    	
    	dzs.endeAnwendung();
    }
}
