package br.edu.estacio; import java.io.*; import javax.microedition.rms.*; /** * Classe abstrata para armazenamento de dados persistentes. * @author Estácio (Prof. Michel Masiero de Aquino). */ public abstract class Persistencia { /** * Armazena o objeto de banco de dados. */ private RecordStore recordStore; /** * Armazena o objeto de navegação do banco de dados. */ private RecordEnumeration recordEnumeration; /** * Construtor. */ public Persistencia() { this.recordStore = null; this.recordEnumeration = null; } /** * Abre o banco de dados. * @param nome <code>String</code> - Nome do RecordStore. * @param criar <code>boolean</code> - Quando <code>true</code> cria o banco de dados se o mesmo não existir. * @throws RecordStoreException Se algum erro ocorrer. */ protected void abrirRecordStore(String nome, boolean criar) throws RecordStoreException { this.recordStore = RecordStore.openRecordStore(nome, criar); } /** * Retorna o banco de dados. * @return <code>RecordStore</code> - Banco de dados. */ public RecordStore getRecordStore() { return this.recordStore; } /** * Fecha o banco de dados. */ public void fecharRecordStore() { if (null != this.getRecordStore()) { try { this.getRecordStore().closeRecordStore(); } catch (RecordStoreException ex) { } this.recordStore = null; } } /** * Evento que ocorre ao ler os dados de um registro. * @param id <code>int</code> - Identificador do registro. * @param dados <code>DataInputStream</code> - Objeto par ler dados. * @throws IOException Se algum erro ocorrer. */ public abstract void leituraRegistroEvent(int id, DataInputStream dados) throws IOException; /** * Evento que ocorre ao salvar os dados de um registro. * @param dados <code>DataOutputStream</code> - Objeto para salvar dados. * @throws IOException Se algum erro ocorrer. */ public abstract void salvamentoRegistroEvent(DataOutputStream dados) throws IOException; /** * Lê um registro salvo. * @param id <code>int</code> - Código de identificação do registro. * @return <code>boolean</code> - Se <code>true</code> indica sucesso. */ public boolean lerRegistro(int id) { boolean retorno = false; if (null != this.getRecordStore()) { try { byte[] registro = this.getRecordStore().getRecord(id); if (null != registro) { ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(registro); DataInputStream dataInputStream = new DataInputStream(byteArrayInputStream); this.leituraRegistroEvent(id, dataInputStream); dataInputStream.close(); byteArrayInputStream.close(); retorno = true; } } catch (Exception ex) {} } return retorno; } /** * Salva um registro. * @param id <code>Integer</code> - Identificador do registro ou <code>null</code> para incluir um novo. * @return <code>boolean</code> - Se <code>true</code> indica sucesso. */ public boolean salvarRegistro(Integer id) { boolean retorno = false; if (null != this.getRecordStore()) { try { ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); DataOutputStream dataOutputStream = new DataOutputStream(byteArrayOutputStream); this.salvamentoRegistroEvent(dataOutputStream); byte[] registro = byteArrayOutputStream.toByteArray(); if (null == id) { this.getRecordStore().addRecord(registro, 0, registro.length); } else { this.getRecordStore().setRecord(id.intValue(), registro, 0, registro.length); } dataOutputStream.close(); byteArrayOutputStream.close(); retorno = true; } catch (Exception ex) { } } return retorno; } /** * Permite a utilização dos métodos de navegação entre registros no banco de dados. * @param filter <code>RecordFilter</code> - Objeto para filtrar dados. * @param comparator <code>RecordComparator</code> - Objeto para ordenar os registros. * @param keepUpdated <code>boolean</code> - Se <code>true</code>, a navegação exibirá qualquer alteração nos registros. * @return <code>boolean</code> - Se <code>true</code> indica sucesso. */ protected boolean iniciarNavagacao(RecordFilter filter, RecordComparator comparator, boolean keepUpdated) { boolean retorno = false; if (null != this.getRecordStore()) { try { this.recordEnumeration = this.recordStore.enumerateRecords(filter, comparator, keepUpdated); retorno = true; } catch (RecordStoreNotOpenException ex) { } } return retorno; } /** * Reinicia a navegação. */ public void reiniciarNavegacao() { if (null != this.recordEnumeration) { this.recordEnumeration.reset(); } } /** * Retorna * @return */ public int return o total de registros navegáveis. <code>int</code> - Total de registros navegáveis. getNumeroNavegaveis() { (null != this.recordEnumeration) ? this.recordEnumeration.numRecords() : 0; } /** * Vai para o próximo registro. * @return <code>boolean</code> - Se <code>true</code> indica sucesso. */ public boolean irParaProximoNavegavel() { boolean retorno = false; if ((null != this.recordEnumeration) && (true == this.recordEnumeration.hasNextElement())) { try { retorno = this.lerRegistro(this.recordEnumeration.nextRecordId()); } catch (InvalidRecordIDException ex) { } } return retorno; } /** * Vai para o registro anterior. * @return <code>boolean</code> - Se <code>true</code> indica sucesso. */ public boolean irParaAnteriorNavegavel() { boolean retorno = false; if ((null != this.recordEnumeration) && (true == this.recordEnumeration.hasPreviousElement())) { try { retorno = this.lerRegistro(this.recordEnumeration.previousRecordId()); } catch (InvalidRecordIDException ex) { } } return retorno; } }