A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

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

Apresentações semelhantes


Apresentação em tema: "Projeto PLP Persistência em OO1 Equipe: Ana Paula Cavalcanti Clelio Feitosa Zildomar Felix Professor: Augusto Sampaio."— Transcrição da apresentação:

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

2 Índice  Escopo e Objetivo  BNF  Parser  Projeto  Estratégia Adotada  Persistência de Variável  Persistência de Classe  Persistência de Objeto

3 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

4 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

5 Parser  Inclusão to token  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

6 Parser Programa PPrograma() : { DecClasse decClasse = null; Comando comando = null; } { (decClasse = PDecClasse() )* comando = PComando() { if (decClasse!=null) { System.out.println("defClasse..."); return new Programa(decClasse, comando); } else return new Programa(comando); }

7 Parser – Declaração de Classes DecClasse PDecClasse(): { DecClasse retorno; } { ( LOOKAHEAD(PDecClasseAtomica() ) retorno = PDecClasseComposta() | LOOKAHEAD(PDecClasseAtomicaPersistente() ) retorno = PDecClasseCompostaPersistente() | LOOKAHEAD(PDecClasseAtomica()) retorno = PDecClasseAtomica() | LOOKAHEAD(PDecClasseAtomicaPersistente()) retorno = PDecClasseAtomicaPersistente() )

8 Parser – Declaração Atômica {inclusão} DecClasse PDecClasseAtomicaPersistente(): { Id nomeClasse; DecVariavel atributos; DecProcedimento metodos; } { nomeClasse = PId() atributos = PDecVariavel() metodos = PDecProcedimento() { return new DecClasseSimples(nomeClasse, atributos, metodos, true); }

9 Parser – Declaração Composta {inclusão} DecClasseComposta PDecClasseCompostaPersistente(): { DecClasse d1; DecClasse d2; } { d1 = PDecClasseAtomicaPersistente() d2 = PDecClasse() { return new DecClasseComposta(d1, d2); }

10 Parser DecVariavel PDecVariavelAtomica(): { DecVariavel retorno; } {( LOOKAHEAD( PTipo() PId() PExpressao()) retorno = PSimplesDecVariavelPersistente() | LOOKAHEAD( PTipo() PId() ) retorno = PDecVariavelObjetoPersistente() |LOOKAHEAD(PTipo() PId() ) retorno = PDecVariavelObjeto() | LOOKAHEAD( PDecVariavel() ) retorno = PDecVariavel() | LOOKAHEAD(PTipo() PId() PExpressao()) retorno = PSimplesDecVariavel() ){ return retorno; }

11 Parser – Declaração Objeto DecVariavelObjeto PDecVariavelObjetoPersistente() : { Id id, idClasse; Tipo tipo; } { tipo = PTipo() id = PId() idClasse = PId() { return new DecVariavelObjeto(tipo, id, idClasse, true); }

12 Parser… SimplesDecVariavel PSimplesDecVariavelPersistente() : { Id id; Expressao exp; SimplesDecVariavel retorno; Tipo tipo; } { ( tipo = PTipo() id = PId() exp = PExpressao() { retorno = new SimplesDecVariavel(tipo, id, exp, true); } ) { return retorno; }

13 Projeto - Ambiente Contexto Execução Persistente -pilhaIdValor -pilhaDefClasse -pilhaObjeto -Pilhas de entrada e saídas -Registros Persistentes

14 Projeto – Contexto de Execução Persistente

15 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)" foi trocado por "new ContextoExecucaoPersistente(ambiente)";

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

17 Projeto – Classes Criadas  memoria.persistencia ContextoExecucaoPersistente RegDefinicaoClassePersistente RegIdValorPersistente RegistroPersistente RegObjetoPersistente RegValorPersistente StackPersistente

18 Estratégia Adotada para Persistir  Usar Stream Um stream é uma sequência ordenada de dados com uma fonte e um destino

19 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

20 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.

21 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

22 Persistência de Variável  Exemplo Execução do programa { Persistente int x=4; write(x) } Novo Programa { write(x) }

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

24 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

25 Persistência de Classe Novo 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(nomeClass e, new DefClasse(atributos,metodos)); else ambiente.mapDefClasse(nomeClasse, new DefClasse(atributos,metodos)); return ambiente; }

26 Persistência de Classe ContextoExecucaoPesistente 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); } }

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

28 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

29 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


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

Apresentações semelhantes


Anúncios Google