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