pl.edu.pjwstk.yaod.store.defaultstore.blocks
Class DataBlock

java.lang.Object
  |
  +--pl.edu.pjwstk.yaod.store.AbstractBlock
        |
        +--pl.edu.pjwstk.yaod.store.defaultstore.blocks.DataBlock
All Implemented Interfaces:
Bufferable

public class DataBlock
extends AbstractBlock

Klasa zapewnia logike zwiazana z wewnetrznym funkcjonowaniem blokow danych. Blok danych jest struktura umozliwiajaca rejestrowanie w niej rekordow. Rekord jest zserializowanym atomem. Blok danych sklada sie z sekcji:

Sekcja slotow i sekcja danych przyrastaja kosztem sekcji pustej - sekcja slotow od gory w dol, sekcja danych od dolu do gory. Struktura rekordu jest nastepujaca:

Author:
M. Lentner, raist@ertel.com.pl

Field Summary
static short DATABLOCK_HEADER_LENGTH
           
static short NEXT_RECORD_LENGTH
           
static short RECORD_HEADER_LENGTH
           
static short SLOT_LENGTH
           
 
Fields inherited from class pl.edu.pjwstk.yaod.store.AbstractBlock
m_blockID
 
Constructor Summary
DataBlock(byte[] rawBlock, BlockID blockID)
          Tworzy blok danych na podstawie podanej tablicy, zawierajacej jego zserializowana zawartosc.
DataBlock(short size, BlockID blockID)
          Tworzy pusty blok danych podanej wielkosci.
 
Method Summary
 short createRecord(byte[] record, boolean chained)
          Tworzy rekord.
 void deleteRecord(short slot)
          Usuwa rekord identyfikowany podanym slotem.
 short getDataSize()
          Zwraca wielkosc zapisanej przestrzeni w ramach bloku, jako rozmiar sekcji danych.
 short getFreeSpaceSize()
          Zwraca wielkosc dostepnej wolnej przestrzeni w ramach bloku, jako rozmiar sekcji pustej.
 byte[] getNextPart(short slot)
          Zwraca wskaznik kolejnego rekordu dla danego rekordu lancuchowanego.
static int getRawRecordLength(byte[] rec)
          Zwraca rzeczywista dlugosc, jaka przyjelyby dane, gdyby zostaly zapisane w bloku jako rekord.
 byte[] getRecord(short slot)
          Zwraca rekord identyfikowany podanym slotem.
 short getRecordLength(short slot)
          Zwraca dlugosc rekordu.
 short getSize()
          Zwraca wielkosc bloku (suma wszystkich sekcji).
 boolean isChainedRecord(short slot)
          Sprawdza, czy dany rekord jest lancuchowany, czyli czy zawiera dalszy ciag w innym bloku.
 void setNextPart(short slot, byte[] rawPartPtr)
          Ustawia wskaznik kolejnego rekordu dla danego rekordu lancuchowanego.
 byte[] toByteArray()
          Serializuje blok (w celu pozniejszego zapisania go np. na dysku).
 void updateRecord(short slot, byte[] record, boolean chained)
          Aktualizuje rekord identyfikowany podanym slotem.
 
Methods inherited from class pl.edu.pjwstk.yaod.store.AbstractBlock
getBlockID, isModified, setBlockID, setModified
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

SLOT_LENGTH

public static final short SLOT_LENGTH

RECORD_HEADER_LENGTH

public static final short RECORD_HEADER_LENGTH

NEXT_RECORD_LENGTH

public static final short NEXT_RECORD_LENGTH

DATABLOCK_HEADER_LENGTH

public static final short DATABLOCK_HEADER_LENGTH
Constructor Detail

DataBlock

public DataBlock(short size,
                 BlockID blockID)
          throws BlockFormatException
Tworzy pusty blok danych podanej wielkosci.
Parameters:
size - wielkosc tworzonego bloku.
Throws:
BlockFormatException - blad niespodziewany (prawdopodobnie zbyt maly rozmiar bloku)

DataBlock

public DataBlock(byte[] rawBlock,
                 BlockID blockID)
          throws BlockFormatException
Tworzy blok danych na podstawie podanej tablicy, zawierajacej jego zserializowana zawartosc.
Parameters:
rawBlock - zserializowany blok.
Throws:
BlockFormatException - podnoszony, jesli podana tablica nie zawiera wlasciwie sformatowanego bloku danych.
java.lang.Exception - podnoszony w przypadku awarii nieznanego pochodzenia.
Method Detail

toByteArray

public byte[] toByteArray()
Serializuje blok (w celu pozniejszego zapisania go np. na dysku).
Overrides:
toByteArray in class AbstractBlock
Returns:
zserializowany blok.
Throws:
podnoszony - w razie awarii nieznanego pochodzenia.

getSize

public short getSize()
Zwraca wielkosc bloku (suma wszystkich sekcji).
Overrides:
getSize in class AbstractBlock
Returns:
wielkosc bloku.

getFreeSpaceSize

public short getFreeSpaceSize()
Zwraca wielkosc dostepnej wolnej przestrzeni w ramach bloku, jako rozmiar sekcji pustej.
Returns:
wielkosc wolnej przestrzeni.

getDataSize

public short getDataSize()
Zwraca wielkosc zapisanej przestrzeni w ramach bloku, jako rozmiar sekcji danych.
Returns:
wielkosc sekcji danych.

createRecord

public short createRecord(byte[] record,
                          boolean chained)
                   throws BlockFreeSpaceException
Tworzy rekord. Powieksza sekcje danych, tworzy slot i ustawia naglowek.
Parameters:
record - tresc rekordu jako ciag bajtow.
type - czy rekord posiada dalszy ciag w innym bloku.
Returns:
numer slotu.
Throws:
NoFreeSpaceException - za malo wolnego miejsca na stworzenie rekordu.
-  

getRecord

public byte[] getRecord(short slot)
                 throws NoSuchSlotException
Zwraca rekord identyfikowany podanym slotem.
Parameters:
slot - numer slotu przypisanego danemu rekordowi.
Returns:
tresc rekordu.
Throws:
NoSuchRecordException - rekord o podanym slocie nie istnieje.

updateRecord

public void updateRecord(short slot,
                         byte[] record,
                         boolean chained)
                  throws BlockFreeSpaceException,
                         NoSuchSlotException
Aktualizuje rekord identyfikowany podanym slotem. Operacja ta polega na usunieciu danych (i wypelnieniu powstalej ewentualnie dziury + aktualizacja slotow na nowe wartosci) oraz wprowadzeniu nowych danych + aktualizacja wartosci slotu modyfikowanego rekordu. Metoda nie akceptuje rekordow wiekszych niz moze zapisac w bloku - ustalenie odpowiedniej wielkosci musi zapewnic modul wywolujacy.
Parameters:
slot - numer slotu przypisanego danemu rekordowi.
record - nowa tresc rekordu.
chained - czy rekord ma dalszy ciag w innym bloku.
Throws:
NoFreeSpaceException - nie ma miejsca na zaktualizowanie danych.
NoSuchSlotException - blad nieznanego pochodzenia.

deleteRecord

public void deleteRecord(short slot)
                  throws NoSuchSlotException
Usuwa rekord identyfikowany podanym slotem.
Parameters:
slot - numer slotu przypisanego danemu rekordowi.
Throws:
NoSuchRecordException - rekord zwiazany ze slotem nie istnieje.

isChainedRecord

public boolean isChainedRecord(short slot)
                        throws NoSuchSlotException
Sprawdza, czy dany rekord jest lancuchowany, czyli czy zawiera dalszy ciag w innym bloku. Jesli rekord jest lancuchowany, wowczas bezposrednio za nim wystepuje identyfikator kolejnego rekordu.
Parameters:
slot - numer slotu przypisanego danemu rekordowi.
Throws:
NoSuchRecordException - podany rekord bazowy nie istnieje.

setNextPart

public void setNextPart(short slot,
                        byte[] rawPartPtr)
                 throws NoSuchSlotException,
                        RecordNotChainedException
Ustawia wskaznik kolejnego rekordu dla danego rekordu lancuchowanego.
Parameters:
slot - numer slotu przypisanego danemu rekordowi.
ptr - wskaznik do nastepnego rekordu.
Throws:
NoSuchRecordException - podany rekord bazowy nie istnieje.
RecordNotChained - rekord nie jest lancuchowany.

getNextPart

public byte[] getNextPart(short slot)
                   throws NoSuchSlotException
Zwraca wskaznik kolejnego rekordu dla danego rekordu lancuchowanego.
Parameters:
slot - numer slotu przypisanego danemu rekordowi.
Returns:
wskaznik do kolejnego rekordu.
Throws:
NoSuchRecordException - podany rekord bazowy nie istnieje.

getRecordLength

public short getRecordLength(short slot)
                      throws NoSuchSlotException
Zwraca dlugosc rekordu.
Parameters:
slot - numer slotu przypisanego danemu rekordowi.
Returns:
dlugosc rekordu.
Throws:
NoSuchRecordException - rekord z podanym slotem nie istnieje.

getRawRecordLength

public static int getRawRecordLength(byte[] rec)
Zwraca rzeczywista dlugosc, jaka przyjelyby dane, gdyby zostaly zapisane w bloku jako rekord.
Parameters:
rec - dane majace utworzyc rekord.
Returns:
dlugosc potencjalnego rekordu.