import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;

import javax.microedition.rms.RecordComparator;
import javax.microedition.rms.RecordEnumeration;
import javax.microedition.rms.RecordFilter;
import javax.microedition.rms.RecordStore;


public class Storage implements RecordFilter, RecordComparator {

	// Řetězec, na který musí jméno začínat, aby prošlo filtrem	
    private String prefix = "";

    private RecordStore store;

	/**
	 *  přidání záznamu
	 */
    public boolean add(ByteArrayOutputStream data) {
        if (store != null) {
            try {
                byte[] bytes = data.toByteArray();
                store.addRecord(bytes, 0, bytes.length);
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
        }
        return false;
    }

	/**
	 *  přečtení záznamu
	 */
    public DataInputStream get(int i) {
        if (store != null) {
            try {
                byte[] bytes = store.getRecord(i);
                return new DataInputStream(
                    new ByteArrayInputStream(bytes));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return null;
    }

	/**
	 *  získání celého přefiltrovaného setřízeného seznamu
	 */
    public RecordEnumeration getEnumeration() {
        if (store != null) {
            try {
                return store.enumerateRecords(this, this, false);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return null;
    }

	/**
	 *  otevření databáze
	 */
    protected RecordStore openStore(String storeName) {
        try {
            store = RecordStore.openRecordStore(storeName, true);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return store;
    }

	/**
	 *  zavření databáze
	 */
    protected void closeStore() {
        try {
            store.closeRecordStore();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

	/** 
	 * metoda rozhraní RecordComparator - porovnává záznamy podle jména
	 */ 
    public int compare(byte[] b1, byte[] b2) {
        try {
            String s1 =
                new DataInputStream(
                    new ByteArrayInputStream(b1))
                    .readUTF();
            String s2 =
                new DataInputStream(
                    new ByteArrayInputStream(b2))
                    .readUTF();

            int i = s1.compareTo(s2);
            if (i == 0) {
                return RecordComparator.EQUIVALENT;
            } else if (i < 0) {
                return RecordComparator.PRECEDES;
            } else {
                return RecordComparator.FOLLOWS;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return RecordComparator.EQUIVALENT;
    }
	
	/**
	 *  nastavení řetězce pro filtr
	 */
    public void setPrefix(String prefix) {
        this.prefix = prefix.toLowerCase();
    }

	/**
	 *  metoda rozhraní RecordFilter, vrací true, pokud jméno začíná na prefix
	 */ 
    public boolean matches(byte[] b) {
        try {
            String s =
                new DataInputStream(new ByteArrayInputStream(b))
                    .readUTF();
            if (s.toLowerCase().startsWith(prefix)) {
                return true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

}

