piątek, 28 marca 2008

AspectJ wprowadzenie część 2

Po przeczytaniu artykułu Jacka Laskowskiego postanowiłem raz jeszcze przetestować Eclipse 3.4M na Mac OS (niestety już nie pamiętam dlaczego, ale jakiś czas temu zainstalowałem, ale coś mi nie działało tak jak miało i wróciłem do 3.3). Więc zaczynamy Eclipse 3.4M się już ściągnęło teraz Help->Software Updates dodajemy http://download.eclipse.org/tools/ajdt/34/dev/update . I podczas ściągania wtyczki jeszcze szybkie zerknięcie na Help->Tips and Tricks... tam zawsze warto zerknąć choćby żeby przypomnieć sobie skróty:) Refactor > Rename (Alt+Shift+R) i dla tych co pracują nad więcej niż jednym projektem, bardzo miłe udogodnienie Assign working sets.
Od razu stworzyłem sobie working set dla projektów aspektowych:

Dobra czas teraz wrócić do programowania aspektowego, przypuśćmy, że nasza klasa Graphic będzie tworzona przez jakąś fabrykę (która będzie pobierać dane z jakiegoś CMS). Każdy obiekt Graphic będzie zawierał informacje, czy można nim poruszać czy nie. Nasze zdanie polega na tym, żeby tak zdefiniować aspekt, że jeżeli obiekt będzie miał możliwość poruszania się to należy wykonać ciało metody move() w innym wypadku je pominąć. Rady przed (before) i po (after) metodzie były zawsze wykorzystywane przed i po wywołaniu metody, którą przecinały. Szybkie spojrzenie do dokumentacji i kogoś nam jeszcze brakuje :) rady dookoła (around), która umożliwia sprawdzenie czegoś przed wykonaniem i po, ale ma ten plus, że można w niej zdefiniować czy punkt przecięcia ma pozwolić na wykonanie ciała metody, którą przecina. Dobra zobaczmy jak to teraz wygląda w kodzie, najpierw klasa Graphic.java
public class Graphic{
private boolean isMovable = false;

public void move(){
System.out.println("Moving");
}

public static void main(String[] args) {
Graphic graphic = new Graphic();
System.out.println("Before moving");
graphic.move();
System.out.println("Change graphic to movable true");
graphic.setMovable(true);
graphic.move();

System.out.println("End");
}

void setMovable(boolean isMovable) {
this.isMovable = isMovable;
}

public boolean isMovable() {
return isMovable;
}

}


Teraz definiujemy nasz aspekt Secure.aj:
package com.itsilesia.aspects;

public aspect Secure {
pointcut checkSecure(com.itsilesia.Graphic graphic):target(graphic) && execution(* com.itsilesia.Graphic.mo*(..));

void around(com.itsilesia.Graphic graphic) : checkSecure(graphic) {
if(graphic.isMovable()){
proceed(graphic);
}else{
System.out.println("Can't move graphic");
}
}
}

Co tutaj mamy, najpierw definiujemy punkt przecięcia, który będzie uwzględniał wszystkie metody klasy Graphic które są (* com.itsilesia.Graphic.mo*(..))
- * oznacza zasięg, w naszym przypadku możemy mieć (public, private, protected i paczkowy)
- com.itsilesia.Graphic.mo*(..) punkt przecięcia nastąpi podczas uruchamiania obiektów klasy Graphic których metody zaczynają się od mo, i mogą ale nie muszą pobierać parametry
- target(graphic) definiuje, że nasz obiekt docelowy ma być typu Graphic.
Później jest nasza rada (advice) dookoła (around) która sprawdza czy dany obiekt graficzny może być poruszony. Jeśli tak to wtedy pozwala na wykonanie ciała metody którą przecina, za pomocą proceed(obiekt), w przeciwnym wypadku wypisuje komunikat o nie możliwości poruszanie obiektu. W Eclipse 3.4M uruchamiamy naszą aplikacje za pomocą Run us->Java Application rezultat poniżej:
Before moving
Can't move graphic
Change graphic to movable true
Moving
End
Teraz można sobie jeszcze wyświetlić Visualiser - AspectJ Provider Window->Open Perspective->Other...->Aspect Visualization.
Na koniec skoro jak już używa Eclipse 3.4M to dorzucam moją ulubioną wtyczkę Mylyn (download.eclipse.org/tools/mylyn/update/e3.4 )(na pewno poświecę jej jeden wpis:) )

Plan przygotowany:)

2 komentarze:

Steve Ballmer pisze...

I love your pictures, good blog!

GDR! pisze...

Dzięki za tego tutoriala, powiedział mi o AOP więcej niż Wikipedia i pierdyliarad PDF-ów z których próbowałem się dowiedzieć o co chodzi.