Aspect-oriented programming. Paulo Borba Informatics Center Federal University of Pernambuco

Documentos relacionados
AspectJ - Programação Orientada a Aspectos em Java. Sérgio Soares Centro de Informática Universidade Federal de Pernambuco

Minicurso do Simpósio Brasileiro de Engenharia de Software - SBES Sérgio Soares

Especialização em Engenharia de Software

Introdução à Programação. Interface, Polimorfismo e Dynamic Binding

Recursão. Em Java... Exemplo: Série de Fibonacci. Iteração e recursão. Exercícios. Especialização em Engenharia de Software - CEUT

A ) O cliente terá que implementar uma interface remota. . Definir a interface remota com os métodos que poderão ser acedidos remotamente

Aula 2. Objetivos. Encapsulamento na linguagem Java; Utilizando a referência this.

Computação Paralela. Uma framework para aplicações concorrentes João Luís Ferreira Sobral Departamento do Informática Universidade do Minho

Lista de Contas: Assinatura. Lista de Contas. Listas de Contas: Descrição. Listas de Contas: Descrição. Listas de Contas: Descrição

Organização do sistema em camadas. Projeto

Sintaxe Geral Tipos de Dados. Prof. Angelo Augusto Frozza, M.Sc.

Sistemas Distribuídos

Unidade IV: Ponteiros, Referências e Arrays

Exercícios de Revisão Java Básico

SISTEMAS DISTRIBUÍDOS

2 Desenvolvimento de Software Orientado a Aspectos

!" # # # $ %!" " & ' ( 2

MIDDLEWARE Aplicativos RMI, RPC e eventos Camadas Protocolo Requesição-Respostal Middleware Representação Externa dos Dados Sistemas Operacionais

Encapsulamento de Dados

Análise de Programação

Guia de Fatores de Qualidade de OO e Java

Sistemas Distribuídos

Sistemas Paralelos e Distribuídos /2004 Curso: Matemática /Informática Sistemas Distribuídos /2004 Curso: Ensino da Informática

Programação de Computadores - I. Profª Beatriz Profº Israel

Estrutura em Camadas. Estrutura em Camadas. Alcides Pamplona Alcides Pamplona Linguagem de Programação CESBD 2010

Num sistema de objectos distribuídos, dois conceitos são fundamentais.

Arquitetura de Aplicações JSP/Web. Padrão Arquitetural MVC

Exceções AULA 13. Ricardo Massa F. Lima Sérgio C. B. Soares

Construção de novas Classes em Java. Classes Atributos Métodos Herança...

Uma Introdução à Arquitetura CORBA. O Object Request Broker (ORB)

UFG - Instituto de Informática

insfcanceof new public switch transient while byte continue extends for int null

Especialização em desenvolvimento para web com interfaces ricas. Tratamento de exceções em Java Prof. Fabrízzio A. A. M. N. Soares

Objetos Distribuídos. Nazareno Andrade

AspectJ Programação orientada a aspectos em Java

Padrão Arquitetura em Camadas

POO e suas Limitações Introdução POA AspectJ: Conceitos Básicos Exemplo: Tracing Padrões de Projeto e POA

Programação Orientada a Objetos C ++ 4 Conceitos de OO em Java Classes e Objetos

Tutorial RMI (Remote Method Invocation) por Alabê Duarte

Objetos Distribuídos - Programação Distribuída Orientado a Objetos. Luiz Affonso Guedes

Autor: Ricardo Francisco Minzé Júnior - ricardominze@yahoo.com.br Desenvolvendo aplicações em camadas com PHP 5.

Invocação de Métodos Remotos

Linguagem de Programação JAVA. Técnico em Informática Professora Michelle Nery

Programação Orientada a Aspectos

Exercício programa para MAC5796

Java Básico. Classes Abstratas, Exceções e Interfaces Prof. Fernando Vanini Ic-Unicamp

Invocação de Métodos Remotos RMI (Remote Method Invocation)

Aula 09 Introdução à Java. Disciplina: Fundamentos de Lógica e Algoritmos Prof. Bruno Gomes

Java 2 Standard Edition. Fundamentos de. Objetos Remotos. Helder da Rocha

Programação OO em Java. Profa Andréa Schwertner Charão DELC/CT/UFSM

Técnicas de Programação II

Programação Orientada a Aspectos

Computação II - Java Prof. Adriano Joaquim de Oliveira Cruz Aula Prática - Herança, Polimorfismo e Construtores

Programação por Objectos. Java

Comandos de repetição For (inicialização; condição de execução; incremento/decremento) { //Código }

Gerador de código JSP baseado em projeto de banco de dados MySQL

Laboratório de Computação VI JAVA IDL. Fabricio Aparecido Breve

Como criar um EJB. Criando um projeto EJB com um cliente WEB no Eclipse

Implementar um exemplo de relacionamento entre classes um para muitos (1:N) e um para um (1:1). Sistema para uma Promotora de Evento Agenda Anual

Programação Na Web. Servlets: Como usar as Servlets. Agenda. Template genérico para criar Servlets Servlet 2.4 API

Programação Concorrente/Paralela em Java

Prática em Laboratório N.02 Criando um serviço Web via NetBeans

Programação OO em Java. Profa Andréa Schwertner Charão DELC/CT/UFSM

Programação Orientada a Objetos em Java

Módulo 07 Características Avançadas de Classes

Membros de classe e de instância. PARTE III: Java e OO - detalhes. Exemplo 1: método. Exercício. Exemplo 1 corrigido

Programação Concorrente em Java. Profa Andréa Schwertner Charão DLSC/CT/UFSM

Java Server Pages. Arquitectura de uma aplicação distribuída em Internet. Figura 1 Modelo 2

DEFINIÇÃO DE MÉTODOS

Programação por Objectos. Java

Multithreading. Programação Orientada por Objectos com Java. Ademar Aguiar. MRSC - Programação em Comunicações

Aplicações, durante a execução, podem incorrer em muitas espécies de erros de vários graus de severidade Quando métodos são invocados sobre um objeto:

Um objeto é uma instância de uma 'classe'. Você define uma classe utilizando o trecho de código abaixo;

Influenciam nossa percepção; ajudam-nos a organizar e a coordenar a Classes estimulam projeto centrado em dados:

Curso Adonai QUESTÕES Disciplina Linguagem JAVA

THREADS EM JAVA. George Gomes Cabral

JDBC. Siga as instruções para instalar o banco de dados H2 e criar a tabela Alunos.

Algoritmos e Programação II. Sobrecarga

Universidade da Beira Interior. Sistemas Distribuídos

Middleware de Aplicações Paralelas/Distribuídas

Reuso com Herança a e Composiçã

Invocação Remota MC704

Programação com Acesso a BD. Programação com OO Acesso em Java

JavaScript 2.0X X

Paradigmas da Programação PPROG. Linguagem JAVA. Interfaces. (Livro Big Java, Late Objects Capítulo 9) Nelson Freire (ISEP DEI-PPROG 2013/14) 1/33

JPA: Persistência padronizada em Java

Prova de Java. 1) Copie o programa abaixo no eclipse e complete-o, utilizando os conceitos aprendidos durante o curso. (4 pontos)

Desenvolvimento OO com Java Orientação a objetos básica

INSTALAÇÃO E USO DO GOOGLE APP ENGINE PLUGIN utilizando o Eclipse Galileo

Autenticação e Autorização

Relevância e Motivação. Programação Orientada a Objetos Utilizando Java. Qualidade do Software. Objetivos. Cancelamentos.

public Agenda() { compromissos = null; } public int getnumerodecompromissos() { if (compromissos==null) return 0; else return compromissos.

Java TM e o Modelo de Objetos

J550 Integração com Bancos de Dados

Java para WEB. Servlets

Modificador static e Pacotes. Alberto Costa Neto DComp - UFS

Java RMI. Alcides Calsavara

Java Threads. Introdução

8 Classes Internas. Desenvolvimento OO com Java. Vítor E. Silva Souza

JDBC Tópicos avançados de acesso a base de dados relacional

Transcrição:

Aspect-oriented programming Paulo Borba Informatics Center Federal University of Pernambuco

Advanced AspectJ concepts Paulo Borba Informatics Center Federal University of Pernambuco

Banco remoto com RMI ou.net Remoting Distribuição Interface Negócio public class Programa { [STAThread] public static void Main(string[] args) { Banco fachada; try { TcpChannel chan = new TcpChannel(); (Banco)Activator.GetObject(typeof(Fachada.Banco), System.Console.WriteLine("Could not locate server"); else { Programa.menu(fachada); catch (Exception e) { System.Console.WriteLine("The error was: " + e.message); public static void menu(banco fachada) { string numero = null; while (opcao!= 0) { try { System.Console.Out.WriteLine("Aperte <Enter> para continuar"); Util.Util.waitEnter(); System.Console.Out.WriteLine("\n\n\n\n\n\n\n"); System.Console.Out.WriteLine("2 - Creditar"); catch (Exception exception) { System.Console.Out.WriteLine(exception.Message); public class ServerInit { public static void Main(string[] args) { try { TcpChannel chan = new TcpChannel(8085); ChannelServices.RegisterChannel(chan); RemotingConfiguration.RegisterWellKnownServiceType (Type.GetType("Fachada.Banco"), catch (Exception e) { Console.WriteLine("An error has happened:"); Console.WriteLine(e.Message); Dados public class Banco: System.MarshalByRefObject { private CadastroContas contas; private Banco() { contas = new CadastroConta (new RepositorioContasAccess()); public void Cadastrar(Conta conta) { contas.cadastrar(conta); public void Transferir(string numerode, string n umeropara, double valor) { contas.transferir(numerode, numeropara, valor); public class CadastroContas { private RepositorioContas contas; public void Debitar(string numero, double valor) { Conta c = contas.procurar(numero); c.debitar(valor); contas.atualizar(c); public void Transferir(string numerode, string n umeropara, double valor) { Conta de = contas.procurar(numerode); Conta para = contas.procurar(numeropara); de.debitar(valor); para.creditar(valor); contas.atualizar(de); contas.atualizar(para); public double Saldo(string numero) { Conta c = contas.procurar(numero); return c.saldo; public class RepositorioContasArray : RepositorioContas { private Conta[] contas; private int indice; public RepositorioContasArray() { contas = new Conta[100]; indice = 0; public void Inserir(Conta conta) { contas[indice] = conta; indice = indice + 1; public void Atualizar(Conta conta) { int i = GetIndice(conta.Numero); if (i == indice) { throw new ContaNaoEncontradaException(conta.Numero); else { contas[i].atualizar(conta); [System.Serializable()]public class Conta { private string numero; private double saldo; public void Creditar(double valor) { this.saldo = this.saldo + valor; public void Debitar(double valor) { if (valor > saldo) { throw new SaldoInsuficienteException)); else { this.saldo = this.saldo - valor; public void Atualizar(Conta c) { this.numero = c.numero; this.saldo = c.saldo; [System.Serializable()] public class ContaJaCadastradaException : System.Exception { public string Numero { get { return numero; private string numero; public ContaJaCadastradaException(numero; public ContaJaCadastradaExceptionnumero = info.getstring("numero"); public override void GetObjectData(base. GetObjectData(info,context); info.addvalue("numero", numero,typeo f(string));

Distribuição na interface com o usuário public static void Main(string[] args) { Banco fachada; try {... fachada = (Banco) Activator.GetObject( typeof(fachada.banco), "tcp://localhost:8085/bancoremoto");... Programa.menu(fachada); catch... serviço de lookup

Distribuição na fachada public class Banco: System.MarshalByRefObject { private CadastroContas contas; private static Banco banco; Manipulação de objetos por valor versus por referência Supertipo de qualquer servidor

Distribuição na coleção de negócio public class CadastroContas { private RepositorioContas contas; public void Creditar(string numero, double valor) { Conta c = contas.procurar(numero); c.creditar(valor); contas.atualizar(c);... Sincronização de estados entre objetos remotos e locais

Persistência na coleção de negócio public class CadastroContas { private RepositorioContas contas; public void Creditar(string numero, double valor) { Conta c = contas.procurar(numero); c.creditar(valor); contas.atualizar(c);... Interferência entre aspectos! deve ser identificado durante o projeto

Distribuição na classe básica e exceções [System.Serializable()] public class Conta { private double saldo;... [System.Serializable()] public class ContaNaoEncontradaException : System.Exception {... Possibilita a passagem de objetos por valor

Health Watcher GUI ServletLogin ServletUpdateComplaint ServletSearchHealthUnit Business HealthWatcherFacade Complaint ComplaintRecord HealthUnitRecord HealthUnit Business-Data interface ComplaintRepository HealthUnitRepository Data management ComplRepositoryBDR ComplRepositoryArray HUnitRepositoryArray HURepositoryBDR

Local Health Watcher

Disque Saúde distribuído com RMI public class Complaint implements java.io.serializable { private String description; private Person complainer;... public Complaint(String description, Person complainer,...) { {... public String getdescription() { return this.description; public Person getcomplainer() { return this.complainer; public void setdescription(string desc) this.description = desc; public void setcomplainer(person complainer) {... this.complainer = complainer; public class HealthWatcherFacade implements IFacade { public void update(complaint complaint) throws TransactionException, RepositoryException, ObjectNotFoundException, ObjectNotValidException {... public static void main(string[] args) { try { HealthWatcherFacade facade = HealthWatcherFacade.getInstance(); ready."); System.out.println("Creating RMI server..."); UnicastRemoteObject.exportObject(facade); java.rmi.naming.rebind("/healthwatcher"); System.out.println("Server created and catch (RemoteException rmiex) {... catch (MalformedURLException rmiex) {... catch(exception ex) {... public class ServletUpdateComplaintData extends HttpServlet { private IFacade facade; public void init(servletconfig config) throws ServletException { try { facade = (IFacade) java.rmi.naming.lookup("//healthwatcher"); catch (java.rmi.remoteexception rmiex) {... catch (java.rmi.notboundexception rmiex) {... catch (java.net.malformedurlexception rmiex) {... public void dopost(httpservletrequest request, HttpServletResponse response)...... throws ServletException, IOException { facade.update(complaint);... public class Person implements java.io.serializable { private String nome;... public Person(String nome, ) { this.nome = nome; public String getnome() { return nome; public interface IFacade extends java.rmi.remote { public void updatecomplaint complaint) throws TransactionException, RepositoryException, ObjectNotFoundException, ObjectNotValidException,... RemoteException; Código RMI é vermelho

Disque Saúde com AOP public class Complaint { private String description; private Person complainer;... public Complaint(String description, Person complainer,...) {... public String getdescription() { return this.description; public Person getcomplainer() { return this.complainer; public void setdescription(string desc) { this.description = desc; public void setcomplainer(person complainer) { this.complainer = complainer; public class Person { public class HealthWatcherFacade { public void update(complaint complaint) throws TransactionException, RepositoryException, ObjectNotFoundException, ObjectNotValidException { private String nome;... public Person(String nome,...) { this.matricula = matricula;... public String getnome() {... return nome;... public class ServletUpdateComplaintData extends HttpServlet { private HealthWatcherFacade facade; public void init(servletconfig config) throws ServletException { try { public interface IFacade extends java.rmi.remote { public void updatecomplaint complaint) throws TransactionException, RepositoryException, ObjectNotFoundException, ObjectNotValidException, facade = HealthWatcherFacade.getInstance(); catch (Exception ex) {... public void dopost(httpservletrequest request, HttpServletResponse response)...... throws ServletException, IOException { Sistema local... Aspectos de Distribuição para RMI RemoteException; aspect DistributionAspect { declare parents: HealthWatcherFacade implements IFacade; declare parents: Complaint Person implements java.io.serializable; public static void HealthWatcherFacade.main(String[] args) { try { HealthWatcherFacade facade = HealthWatcherFacade.getInstance(); System.out.println("Creating RMI server..."); UnicastRemoteObject.exportObject(facade); java.rmi.naming.rebind("/healthwatcher"); System.out.println("Server created and ready."); catch (RemoteException rmiex) {... catch (MalformedURLException rmiex) {... catch(exception ex) {... private IFacade remotefacade; pointcut facademethodsexecution(): within(httpservlet+) && HealthWatcherFacade.*(..)) && this(healthwatcherfacade); execution(* before(): facademethodsexecution() { preparefacade(); private synchronized void preparefacade() { if (healthwatcher == null) { try { remotefacade = (IFacade) java.rmi.naming.lookup("//healthwatcher"); catch (java.rmi.remoteexception rmiex) {... catch (java.rmi.notboundexception rmiex) {... catch (java.net.malformedurlexception rmiex) {... void around(complaint complaint) throws TransactionException, RepositoryException try { ObjectNotFoundException,ObjectNotValidException: facaderemoteexecutions() && args(complaint) call(void update(complaint)) { remotefacade.update(complaint); catch (RemoteException rmiex) {... &&

Disque Saúde com AOP

Identificando chamadas de métodos da fachada (servidor)... pointcut facademethodscall(): within(httpservlet+) && call(* IFacade+.*(..)); identifica código dentro da

inicializando fachada remota... private IFacade remotefacade; before(): facademethodscall() { getremoteinstance(); synchronized void getremoteinstance() {... remotefacade = (IFacade) java.rmi.naming.lookup(...);... Locais ao aspecto

transformando chamadas locais em remotas... void around(complaint c) throws Ex1, : { facademethodscall() && args(c) && call(void update(complaint)) try { remotefacade.update(c); catch (RemoteException rmiex) {... usando argumento de um join point

e alterando estrutura das classes declare parents: HealthWatcherFacade implements IFacade; declare parents: Complaint Person implements java.io.serializable; public static void HealthWatcherFacade.main(String[] args){ try {... java.rmi.naming.rebind("/hw"); catch... Adicionando método na fachada

Distribution aspect public aspect DistributionAspect { declare parents:... private IFacade remotefacade; public static void HealthWatcherFacade.main(String[] as)... pointcut facademethodscall():... before(): facademethodscall()... private synchronized void getremoteinstance()... void around(complaint complaint)...

Aspecto de distribuição, servidor public aspect DistributionAspectServer { declare parents: Banco:System.MarshalByRefObject; Na prática, temos dois aspectos apenas por questões de implantação

Aspecto de distribuição, cliente Acrescenta atributos a uma classe aspect DistributionAspectClient { declare class attributes: (Conta SaldoInsuficienteException) [System.Serializable()];...

Aspecto de distribuição void around(): execution(...void Programa.Main(string[])) { Banco fachada; try {... fachada = (Banco) Activator.GetObject( typeof(fachada.banco), "tcp://localhost:8085/bancoremoto");...programa.menu(fachada); catch...

O aspecto de sincronização de estado é... Útil tanto para persistência quanto para distribuição Dividido em duas partes: registro de objetos modificados (sujos) atualização dos objetos modificados

Registro de objetos modificados... pointcut localupdate(conta c): this(cadcontas) && target(c) && (call(* Conta.creditar(..))...; private ArrayList dirtyobjects =...; after(conta c) returning(): localupdate(c) { dirtyobjects.add(c);

e atualização dos objetos modificados Todo join point onde condição é true pointcut localexecution(cadcontas cad): if(hasdirtyobjects()) && this(cad) && execution(public * *(..)); after(cadcontas cad) returning(): localexecution(cad) { foreach (Conta c : dirtyobjects) { cad.contas.atualizar(c);

Instâncias de aspectos default, apenas uma instância, aspecto estático percflow, uma instância para cada fluxo de um joint point pertarget, uma instância para cada alvo de um joint point pertthis, percflowbelow pertypewithin, uma instância para cada tipo de um type pattern

publics omitidos... Aspecto de sincronização de estado Para evitar interferências no atributo do aspecto privileged aspect StateSynchronization percflow(execution(* Banco.*(..))) { RepositorioContas CadastroContas.Contas { get { return this.contas;

Acesso às instâncias do aspecto NomeAspecto.aspectOf() retorna a instância de um determinado aspecto, útil para acesso a membros do aspecto dependendo da per clause, só disponível dentro de alguns join points NomeAspecto.aspectOf(Object)

Acessando mais informações dos join points Além das informações expostas pelos pointcuts, é possível acessar mais sobre os join points usando referências especiais: thisjoinpoint thisjoinpointstaticpart...

Métodos das referências especiais thisjoinpoint getargs() gettarget() getreturnvalue() thisjoinpointstaticpart getsignature()

Debugging simples... public aspect DatabaseDebugging { pointcut queryexecution(string sql): call(* Statement.*(String)) && args(sql); before(string sql): queryexecution(sql) { System.out.println(sql);

e um pouco mais refinado public aspect LoggingAspect { before(): execution(public * *.*(..)) { System.out.println("A method from..." + thisjoinpoint.gettarget() + " is about" + to be executed. Its signature is " + thisjoinpointstaticpart.getsignature());

Aspecto de desenvolvimento versus produção after(): execution(public * *.*(..)) { System.out.print("Now the method" +... + " has finished");... System.out.print("The return value was + thisjoinpoint.getreturnvalue());

Reuso e extensibilidade de aspectos via padrões e frameworks Tag interface como na interface Trans do aspecto de transações Glue aspects advices invocando serviços auxiliares Template pointcut com aspectos abstratos

Aspecto abstrato para persistência public abstract aspect APersistenceAspect { abstract pointcut transmethods(); abstract PM getpm(); before(): transmethods() { getpm().starttransaction();...

Aspecto concreto para persistência public aspect PersistenceAspect extends APersistenceAspect { private interface Trans { public void Cadastrar(Conta conta);... declare parents: Banco implements Trans; pointcut transmethods(): execution(public * Trans.*(..)); PM getpm(){...

Relembrando pointcut designators target(<nome do tipo>) Identifica join points onde o objeto alvo é uma instância de <nome do tipo> this(<nome do tipo>) Identifica join points cujo objeto em execução é uma instância de <nome do tipo> withincode(<assinatura de método>) Identifica join points cujo código em execução pertence ao corpo do método ou construtor especificado por <assinatura de método>

Outros pointcut designators initialization(<constructor>) todos os join points de inicialização com uma dada assinatura args(<type or Id,...>) todos os join points com argumentos dos tipos especificados handler(typepattern) every exception handler for any throwable type in TypePattern

Mais pointcut designators cflow(<pointcut>) Identifica join points que estejam no fluxo de execução identificado por <pointcut> cflowbelow(<pointcut>) Identifica todos os join points no fluxo de controle do <pointcut>, exceto o inicial get(<assinatura>) / set(<assinatura>) Leitura/atribuição a atributos

Mais intertypes declare soft: <nome do tipo>:<pointcut>; A exceção <nome do tipo> será encapsulada em uma exceção não checada em tempo de compilação (runtime) em qualquer join point definido por <pointcut> declare precedence: <typepatternlist>; at any join point where multiple pieces of advice apply, the advice precedence at that join point is in typepatternlist order.

Verifying design rules aspect ArchitecturalRules { pointcut complaintrecord(): within(complaintrecord); pointcut complaintrepositories(): within(complaintrepository+); declare warning: call(* ComplaintRepository+.*(..)) &&!(complaintrepositories()) &&!(complaintrecord()): Breaking design rule! ;

Orientação a aspectos é... Quantificação (quantification) uma parte do programa tem efeito em várias outras o aspecto afeta várias classes e outros aspectos Mudanças não invasivas (obliviouness) uma parte A do programa tem efeito sobre uma B sem precisar alterar o

Advanced AspectJ concepts Paulo Borba Informatics Center Federal University of Pernambuco