- Polecenia grupa 12.15:
- 1. Aspekt który blokuje wywołania metod statycznych
- z wszystkich klas wewnątrz pakietu model, albo wewnątrz podpakietu. Poprzez wyrzucenie wyjątku RuntimeExeption
- 2. Dodać do klas których nazwa kończy się słowem model, dodać funkcjonalność:
- czy obiekt został zmodyfikowany(dwie metody)
- setChanged(boolean)
- boolean isChanged()
- zmieniony jak wykonala sie jakakolwiek metoda która zaczyna się od set
- public aspect TrudnyAspect {
- declare parents: *.*model implements ChangeTracked;
- private boolean ChangeTracked.changed = false;
- public boolean ChangeTracked.isChanged() {
- return changed;
- }
- public void ChangeTracked.setChanged(boolean changed) {
- this.changed = changed;
- }
- before(ChangeTracked changeTracked)
- : execution(* ChangeTracked+.set*(..))
- && !execution(* ChangeTracked.*(..))
- && this(changeTracked) {
- changeTracked.setChanged(true);
- }
- }
- interface ChangeTracked {
- }
- Polecenia grupa 14.15:
- 1) we wszystkich klasach z pakietu service przechwycic wywolania metod,
- które zwracają obiekt typu java.util.List. Jeśli metoda zwraca null,
- to aspekt powinien zastąpić zwracaną wartość Collections.EmptyList.
- 2) Do wszystkich klas z pakeitu service dodać z użyciem aspektu poniższe składowe:
- - getLastCallTime - zwraca obiekt typu date - powinno zwrocic czas ostatnio wywolanej metody
- - getLastReturnTime - czas powrotu z ostatnio wywolanej metody
- Polecenia 17.40
- 1) przechwytywać wszystkie metody pakietu pack1 i jego podpakietów,
- które mają jeden parametr double. Sprawdzić, czy przekazany argument jest dodatni,
- jeśli ujemny, to wyrzucić wyj IllegalArgumentException
- 2) do wszystkich klas pakietu pack1 dodać możliwość
- włączania bądź wyłączania logiki 1 aspektu poprzez dodanie dwóch metod:
- - enableCheck - włącza logikę 1 aspektu
- - disableCheck -wyłącza logikę 1 aspektu
- Kontrolowanie osobno dla każdego obiektu
- Domyślnie logika wyłączona
- package pak1;
- public aspect Aspekt {
- declare parents : pak1..* implements EnableDisable;
- pointcut getReturningDouble(EnableDisable enableDisable, double liczba) : execution(* pak1..*.*(double)) && args(liczba) && this(enableDisable);
- private boolean EnableDisable.enableCheck = false;
- public void EnableDisable.enableCheck() {
- this.enableCheck = true;
- }
- public void EnableDisable.disableCheck() {
- this.enableCheck = false;
- }
- before(EnableDisable enableDisable, double liczba) : getReturningDouble(enableDisable, liczba) {
- if(liczba < 0 && enableDisable.enableCheck) {
- throw new IllegalArgumentException("Nie moze byc ujemna!");
- }
- }
- }
- interface EnableDisable {
- }