Projeto PLP Persistência em OO1 Equipe: Ana Paula Cavalcanti Clelio Feitosa Zildomar Felix...

29
Projeto PLP Persistência em OO1 Equipe: Ana Paula Cavalcanti Clelio Feitosa Zildomar Felix Professor: Augusto Sampaio

Transcript of Projeto PLP Persistência em OO1 Equipe: Ana Paula Cavalcanti Clelio Feitosa Zildomar Felix...

Page 1: Projeto PLP Persistência em OO1 Equipe: Ana Paula Cavalcanti Clelio Feitosa Zildomar Felix Professor: Augusto Sampaio.

Projeto PLPPersistência em OO1

Equipe:Ana Paula CavalcantiClelio FeitosaZildomar Felix

Professor:Augusto Sampaio

Page 2: Projeto PLP Persistência em OO1 Equipe: Ana Paula Cavalcanti Clelio Feitosa Zildomar 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

Page 3: Projeto PLP Persistência em OO1 Equipe: Ana Paula Cavalcanti Clelio Feitosa Zildomar Felix Professor: Augusto Sampaio.

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

Page 4: Projeto PLP Persistência em OO1 Equipe: Ana Paula Cavalcanti Clelio Feitosa Zildomar Felix Professor: Augusto Sampaio.

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

Page 5: Projeto PLP Persistência em OO1 Equipe: Ana Paula Cavalcanti Clelio Feitosa Zildomar Felix Professor: Augusto Sampaio.

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

Page 6: Projeto PLP Persistência em OO1 Equipe: Ana Paula Cavalcanti Clelio Feitosa Zildomar Felix Professor: Augusto Sampaio.

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);}}

Page 7: Projeto PLP Persistência em OO1 Equipe: Ana Paula Cavalcanti Clelio Feitosa Zildomar Felix Professor: Augusto Sampaio.

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() )

Page 8: Projeto PLP Persistência em OO1 Equipe: Ana Paula Cavalcanti Clelio Feitosa Zildomar Felix Professor: Augusto Sampaio.

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);}}

Page 9: Projeto PLP Persistência em OO1 Equipe: Ana Paula Cavalcanti Clelio Feitosa Zildomar Felix Professor: Augusto Sampaio.

Parser – Declaração Composta{inclusão}

DecClasseComposta PDecClasseCompostaPersistente():{DecClasse d1;DecClasse d2;}{d1 = PDecClasseAtomicaPersistente() <COMMA> d2 = PDecClasse(){return new DecClasseComposta(d1, d2);}}

Page 10: Projeto PLP Persistência em OO1 Equipe: Ana Paula Cavalcanti Clelio Feitosa Zildomar Felix Professor: Augusto Sampaio.

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;}}

Page 11: Projeto PLP Persistência em OO1 Equipe: Ana Paula Cavalcanti Clelio Feitosa Zildomar Felix Professor: Augusto Sampaio.

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);}}

Page 12: Projeto PLP Persistência em OO1 Equipe: Ana Paula Cavalcanti Clelio Feitosa Zildomar Felix Professor: Augusto Sampaio.

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;}}

Page 13: Projeto PLP Persistência em OO1 Equipe: Ana Paula Cavalcanti Clelio Feitosa Zildomar Felix Professor: Augusto Sampaio.

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

Page 14: Projeto PLP Persistência em OO1 Equipe: Ana Paula Cavalcanti Clelio Feitosa Zildomar Felix Professor: Augusto Sampaio.

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

Page 15: Projeto PLP Persistência em OO1 Equipe: Ana Paula Cavalcanti Clelio Feitosa Zildomar Felix Professor: Augusto Sampaio.

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)";

Page 16: Projeto PLP Persistência em OO1 Equipe: Ana Paula Cavalcanti Clelio Feitosa Zildomar Felix Professor: Augusto Sampaio.

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;

Page 17: Projeto PLP Persistência em OO1 Equipe: Ana Paula Cavalcanti Clelio Feitosa Zildomar Felix Professor: Augusto Sampaio.

Projeto – Classes Criadas

memoria.persistencia ContextoExecucaoPersistente RegDefinicaoClassePersistente RegIdValorPersistente RegistroPersistente RegObjetoPersistente RegValorPersistente StackPersistente

Page 18: Projeto PLP Persistência em OO1 Equipe: Ana Paula Cavalcanti Clelio Feitosa Zildomar Felix Professor: Augusto Sampaio.

Estratégia Adotada para Persistir

Usar Stream Um stream é uma sequência ordenada

de dados com uma fonte e um destino

Page 19: Projeto PLP Persistência em OO1 Equipe: Ana Paula Cavalcanti Clelio Feitosa Zildomar Felix Professor: Augusto Sampaio.

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

Page 20: Projeto PLP Persistência em OO1 Equipe: Ana Paula Cavalcanti Clelio Feitosa Zildomar Felix Professor: Augusto Sampaio.

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 .

Page 21: Projeto PLP Persistência em OO1 Equipe: Ana Paula Cavalcanti Clelio Feitosa Zildomar Felix Professor: Augusto Sampaio.

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

Page 22: Projeto PLP Persistência em OO1 Equipe: Ana Paula Cavalcanti Clelio Feitosa Zildomar Felix Professor: Augusto Sampaio.

Persistência de Variável

Exemplo

Execução do programa

{

Persistente int x=4;

write(x)

}

Novo Programa

{

write(x)

}

Page 23: Projeto PLP Persistência em OO1 Equipe: Ana Paula Cavalcanti Clelio Feitosa Zildomar Felix Professor: Augusto Sampaio.

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));

Page 24: Projeto PLP Persistência em OO1 Equipe: Ana Paula Cavalcanti Clelio Feitosa Zildomar Felix Professor: Augusto Sampaio.

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

Page 25: Projeto PLP Persistência em OO1 Equipe: Ana Paula Cavalcanti Clelio Feitosa Zildomar Felix Professor: Augusto Sampaio.

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;

}

Page 26: Projeto PLP Persistência em OO1 Equipe: Ana Paula Cavalcanti Clelio Feitosa Zildomar Felix Professor: Augusto Sampaio.

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);

}

}

Page 27: Projeto PLP Persistência em OO1 Equipe: Ana Paula Cavalcanti Clelio Feitosa Zildomar Felix Professor: Augusto Sampaio.

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”)

Page 28: Projeto PLP Persistência em OO1 Equipe: Ana Paula Cavalcanti Clelio Feitosa Zildomar Felix Professor: Augusto Sampaio.

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

Page 29: Projeto PLP Persistência em OO1 Equipe: Ana Paula Cavalcanti Clelio Feitosa Zildomar Felix Professor: Augusto Sampaio.

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