Projeto PLPPersistência em OO1
Equipe:Ana Paula CavalcantiClelio FeitosaZildomar Felix
Professor:Augusto Sampaio
Índice
Escopo e Objetivo BNF Parser Projeto Estratégia Adotada Persistência de Variável Persistência de Classe Persistência de Objeto
Escopo e Objetivo
Declarações de variáveis, classes e objetos Persistentes ou Transiente
O armazenamento deve ser de forma explícita para o programador, porém de forma transparente
Transiente Declaração na memória
Persistente Cópia do Contexto de Execução para um
arquivo
BNF - Alterações
Programa ::= "{" DecClasse "," Comando "}" | "{" Comando "}“DecClasse ::= "classe" Id "{" DecVariavel ";“ DecProcedimento "}" | "persistente" "classe" Id "{" DecVariavel ";" DecProcedimento "}" | DecClasse "," DecClasse
DecVariavel ::= Tipo Id "=" Expressao | Tipo Id ":=" "new" Id | "persistente" Tipo Id "=" Expressao | "persistente" Tipo Id ":=" "new" Id | DecVariavel "," DecVariavel
Parser
Inclusão to token <PERSISTENTE: "persistente">
Reconhecer de forma transparente para o desenvolvedor o que vai ser armazenado em arquivo
Produções para declarações Persistentes Declaração de Variável Declaração de Classes Objetos
Parser
Programa PPrograma() :{DecClasse decClasse = null;Comando comando = null;}{<LBRACE> (decClasse = PDecClasse() <SEMICOLON>)* comando = PComando() <RBRACE>{if (decClasse!=null) {System.out.println("defClasse...");return new Programa(decClasse, comando);}else return new Programa(comando);}}
Parser – Declaração de Classes
DecClasse PDecClasse():{DecClasse retorno;}{( LOOKAHEAD(PDecClasseAtomica() <COMMA>)retorno = PDecClasseComposta() | LOOKAHEAD(PDecClasseAtomicaPersistente() <COMMA>) retorno = PDecClasseCompostaPersistente() | LOOKAHEAD(PDecClasseAtomica())retorno = PDecClasseAtomica() | LOOKAHEAD(PDecClasseAtomicaPersistente())retorno = PDecClasseAtomicaPersistente() )
Parser – Declaração Atômica{inclusão}
DecClasse PDecClasseAtomicaPersistente():{Id nomeClasse;DecVariavel atributos;DecProcedimento metodos;}{<PERSISTENTE> <CLASSE> nomeClasse = PId() <LBRACE> atributos = PDecVariavel() <SEMICOLON> metodos = PDecProcedimento() <RBRACE>{return new DecClasseSimples(nomeClasse, atributos, metodos, true);}}
Parser – Declaração Composta{inclusão}
DecClasseComposta PDecClasseCompostaPersistente():{DecClasse d1;DecClasse d2;}{d1 = PDecClasseAtomicaPersistente() <COMMA> d2 = PDecClasse(){return new DecClasseComposta(d1, d2);}}
ParserDecVariavel PDecVariavelAtomica():{DecVariavel retorno;}{( LOOKAHEAD(<PERSISTENTE> PTipo() PId() <ASSIGN> PExpressao()) retorno = PSimplesDecVariavelPersistente() | LOOKAHEAD(<PERSISTENTE> PTipo() PId() <ATTRIB> <NEW>)retorno = PDecVariavelObjetoPersistente() |LOOKAHEAD(PTipo() PId() <ATTRIB> <NEW>)retorno = PDecVariavelObjeto() | LOOKAHEAD(<LPAREN> PDecVariavel() <RPAREN>) <LPAREN> retorno = PDecVariavel() <RPAREN> | LOOKAHEAD(PTipo() PId() <ASSIGN> PExpressao()) retorno = PSimplesDecVariavel()){return retorno;}}
Parser – Declaração Objeto
DecVariavelObjeto PDecVariavelObjetoPersistente() :{Id id, idClasse;Tipo tipo;}{<PERSISTENTE> tipo = PTipo() id = PId() <ATTRIB> <NEW> idClasse = PId(){return new DecVariavelObjeto(tipo, id, idClasse, true);}}
Parser…
SimplesDecVariavel PSimplesDecVariavelPersistente() :{Id id;Expressao exp;SimplesDecVariavel retorno;Tipo tipo;}{( <PERSISTENTE> tipo = PTipo() id = PId() <ASSIGN> exp = PExpressao() { retorno = new SimplesDecVariavel(tipo, id, exp, true); }){return retorno;}}
Projeto - Ambiente
ContextoCompilacao ContextoExecucao
AmbienteExecucaoAmbienteCompilacao
Ambiente
incrementa()restaura()
ContextoExecucaoPersistente(from persistencia)
Contexto Execução Persistente
-pilhaIdValor
-pilhaDefClasse
-pilhaObjeto
-Pilhas de entrada e saídas
-Registros Persistentes
Projeto – Contexto de Execução Persistente
RegDefClassePersistente
fileName : Logical View::java::lang::String
(from persistencia)
RegIdValorPersistente
fileName : Logical View::java::lang::String
(from persistencia)
RegObjetoPersistente
fileName : Logical View::java::lang::String
(from persistencia)
RegValorRefPersistente
fileName : Logical View::java::lang::String
(from persistencia)
ContextoExecucaoPersistente
fileIdValor : Logical View::java::lang::StringfileDefClasse : Logical View::java::lang::StringfileObjeto : Logical View::java::lang::StringfileValorRef : Logical View::java::lang::String
(from persistencia)
-regDefClasseP
-regIdValorP
-regObjetoP
-regValorRefP
ContextoExecucao
Alterações de Classes
Muitas classes tiveram que implementar a interface Serializable do java (Expressao, Declaracao, Comando, etc.)
Em todas as chamadas de "new ContextoExecucao(ambiente)" foitrocado por "new ContextoExecucaoPersistente(ambiente)";
Projeto – Classes Alteradas
expressao.leftExpression AcessoAtributiID.java Substituição da chamada de
getValorObjeto(Id) ao invés de getValor(Id) expressao.valor
ValorRef.java Removido o método getNextRef para o contexto persistente e correção do bug do "equals(Object)";
memoria AmbienteExecucao.java Adicionado métodos
auxiliares para persitência de objetos (getValorObjeto) Objeto.java Adicionado o método
alterarEstado(Objeto novoEstado); Imperative1.command
Atribuicao.java Adicionado no método executar as condições para persistência;
Projeto – Classes Criadas
memoria.persistencia ContextoExecucaoPersistente RegDefinicaoClassePersistente RegIdValorPersistente RegistroPersistente RegObjetoPersistente RegValorPersistente StackPersistente
Estratégia Adotada para Persistir
Usar Stream Um stream é uma sequência ordenada
de dados com uma fonte e um destino
Estratégia Adotada para Persistir
Montagem de Stream Leitura/gravação de bytes – read() Leitura/gravação de objetos inteiros –
readObject();
Direção: Ler
Tipo: Objeto
Fonte: Arquivo
Processamento: Serialização
Estratégia Adotada para Persistir
Serialização de Objetos Um objeto possui atributos que definem seu
estado Objetos não sobrevivem à morte do programa; O que fazer se quisermos gravar uma cópia dos
objetos e recuperar a cópia depois? ; Uma forma é de gravar os objetos em arquivo, se
forma serial ; A serialização significa gravar, sequencialmente e
byte-por-byte, os atributos de um objeto; Utilidade: colocar objetos num lugar que só pode
ser acessado sequencialmente Exemplo: guardar/ler objetos em arquivos .
Estratégia Adotada para Persistir
O que fazer para serializar os objetos?
Usar a Interface Serializable Interface de marcação Classe que implementa é marcada como objeto
Serializable
Persistência de Variável
Exemplo
Execução do programa
{
Persistente int x=4;
write(x)
}
Novo Programa
{
write(x)
}
Persistência de Variável
O que acontece agora?
Novo Construtor da SimplesDecVariavel
1. public SimplesDecVariavel(Tipo tipo, Id id, Expressao expressao, boolean b)
2. public AmbienteExecucao elabora(AmbienteExecucao ambiente)
if (isPersistente)
((ContextoExecucaoPersistente)ambiente).mapValorP(id, expressao.avaliar(ambiente));
else
ambiente.mapValor(id , expressao.avaliar(ambiente));
Persistência de Variável
public void mapValorP(Id idArg, Valor valorId)
throws VariavelJaDeclaradaException {
StackHashIdValor pilha = (StackHashIdValor)lerPersistencia(regIdValorP);
HashIdValor aux = pilha.peek();
if (aux.put(idArg, valorId) != null) {
throw new VariavelJaDeclaradaException(idArg, "persitente");
} else {
persistirDados(regIdValorP, pilha);
}
}
AmbienteExecucaoPesistente
Persistência de ClasseNovo Construtor
1. public DecClasseSimples(Id nomeClasse, DecVariavel atributos, DecProcedimento metodos, boolean b)
2. public AmbienteExecucao elabora(AmbienteExecucao ambiente)
throws ClasseJaDeclaradaException, ClasseNaoDeclaradaException {
.....
if (isPersistente)
. ....
((ContextoExecucaoPersistente)ambiente).mapDefClasseP(nomeClasse, new DefClasse(atributos,metodos));
elseambiente.mapDefClasse(nomeClasse, new DefClasse(atributos,metodos));
return ambiente;
}
Persistência de ClasseContextoExecucaoPesistente
public void mapDefClasseP(Id idArg, DefClasse defClasse)
throws ClasseJaDeclaradaException {
StackHashIdDefClasse stackTmp = (StackHashIdDefClasse)lerPersistencia(regDefClasseP);
HashIdDefClasse aux = (HashIdDefClasse)stackTmp.peek();
if (aux.put(idArg, defClasse) != null) {
throw new ClasseJaDeclaradaException(idArg, "persistente");
} else {
persistirDados(regDefClasseP, stackTmp);
}
}
Persistência de Objeto
Objeto Serializado => “RegObjetoPersistente”
Persistir um objeto é persistir o próprio + seu estado (recursivamente)
Elemento chave foi definir uma “chave primária” (RegValorRef) cada objeto criado (chamada em “new”)
Persistência de Objeto
Para persistir é usado o método “mapObjetoP(ValorRef, Objeto)” em seguida, “alterarEstado(getPilhaObjeto())” em ContextoExecucaoPersistente para permitir persistir o estado (recursivamente) dos objetos
Persistência de Objeto
Na atribuição de um valor do objeto (seu estado) chamada de “changeValorObjeto(ValRef, Objeto)” para ler da persistencia e depois com o seu estado, chama, recursivamente, os demais para buscar o objeto certo
Top Related