Dzisiejszym zadaniem jest zorganizowanie struktury repozytorium pod główny projekt w repozytorium subversion. Podstawowe informacje jak uruchomić svn można przeczytać w wpisie Mariusza Lipińskiego. Dobra a teraz do dzieła tworzymy trzy główne katalogi:
- trunk
- branches
- tags
W trunk trzymamy główną część projektu (najbardziej rozwojowa gałąź), branches przeznaczamy na poprawianie błędów i na eksperymentowanie developerów, jako ostatni został nam katalog tags gdzie zamrażamy konkretne wydania naszego projektu, jakieś ważne wydarzenie z cyklu życia naszego projektu (z reguły koresponduje on do konkretnego podkatalogu branches). Dobrze jest zrobić katalog tags jak katalog tylko do odczytu. Hmm chyba wszystko na początek jakieś uwagi?
piątek, 25 kwietnia 2008
poniedziałek, 7 kwietnia 2008
Eclipse Mule IDE
Dodajemy teraz możliwość tworzenia Mule projektów w Eclipse postępujemy z godnie z instrukcja Mule IDE 2.0 Pre-release User Guide Instalujemy niezbędne komponenty do Eclipse 3.3
No i na koniec sama wtyczka z Mule IDE. Dodajemy nowe URL do Software Updates http://dist.muleforge.org/mule-ide/updates-2.0.0/ . Restartujemy Eclipse i tworzymy nowy Mule Project.
Potem musimy jeszcze skonfigurować domyślne ustawienia dla Mule.
Teraz jeszcze tworzymy plik konfiguracyjny za pomocą IDE
Nasz Eclipse IDE zostało przystosowane do pracy z Mule:) W następnym wpisie stworzymy najprostszy działający projekt z użyciem Mule, FTP i mavena.
No i na koniec sama wtyczka z Mule IDE. Dodajemy nowe URL do Software Updates http://dist.muleforge.org/mule-ide/updates-2.0.0/ . Restartujemy Eclipse i tworzymy nowy Mule Project.
Potem musimy jeszcze skonfigurować domyślne ustawienia dla Mule.
Teraz jeszcze tworzymy plik konfiguracyjny za pomocą IDE
Nasz Eclipse IDE zostało przystosowane do pracy z Mule:) W następnym wpisie stworzymy najprostszy działający projekt z użyciem Mule, FTP i mavena.Apache ActiveMQ instalacja
Instalacja ApacheMQ tak zwanego Message Broker sprowadza się do ściągnięcia źródeł i ich rozpakowania, korzystamy z ActiveMQ 5.0.0 Release. Uruchomianie samego serwisu bez jakiej kol wiek konfiguracji z naszej strony, sprowadza się do przejścia do rozpakowanego katalogu, później podkatalog bin i uruchomienie skryptu uruchamiającego.
lukasz-lipkas-computer:~/Library/apache-activemq-5.0.0/bin lipka$ ./activemq
Na kosoli po chwili można zobaczyć następujące logi:
Loading message broker from: xbean:activemq.xml
INFO BrokerService - Using Persistence Adapter: AMQPersistenceAdapter(/Users/lipka/Library/apache-activemq-5.0.0/data/localhost)
INFO BrokerService - ActiveMQ 5.0.0 JMS Message Broker (localhost) is starting
INFO BrokerService - For help or more information please see: http://activemq.apache.org/
INFO AMQPersistenceAdapter - AMQStore starting using directory: /Users/lipka/Library/apache-activemq-5.0.0/data/localhost
INFO KahaStore - Kaha Store using data directory /Users/lipka/Library/apache-activemq-5.0.0/data/localhost/kr-store/state
INFO ManagementContext - JMX consoles can connect to service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi
INFO AMQPersistenceAdapter - Active data files: []
INFO KahaStore - Kaha Store using data directory /Users/lipka/Library/apache-activemq-5.0.0/data/localhost/kr-store/data
INFO TransportServerThreadSupport - Listening for connections at: tcp://lukasz-lipkas-computer.local:61616
INFO TransportConnector - Connector openwire Started
INFO TransportServerThreadSupport - Listening for connections at: ssl://lukasz-lipkas-computer.local:61617
INFO TransportConnector - Connector ssl Started
INFO TransportServerThreadSupport - Listening for connections at: stomp://lukasz-lipkas-computer.local:61613
INFO TransportConnector - Connector stomp Started
INFO TransportServerThreadSupport - Listening for connections at: xmpp://lukasz-lipkas-computer.local:61222
INFO TransportConnector - Connector xmpp Started
INFO NetworkConnector - Network Connector org.apache.activemq.transport.discovery.multicast.MulticastDiscoveryAgent@28bdf4 Started
INFO BrokerService - ActiveMQ JMS Message Broker (localhost, ID:lukasz-lipkas-computer.local-50886-1207581085279-0:0) started
INFO TransportConnector - Connector vm://localhost Started
INFO log - Logging to org.slf4j.impl.JCLLoggerAdapter(org.mortbay.log) via org.mortbay.log.Slf4jLog
INFO log - jetty-6.1.4
INFO WebConsoleStarter - ActiveMQ WebConsole initialized.
INFO /admin - Initializing Spring FrameworkServlet 'dispatcher'
INFO log - ActiveMQ Console at http://0.0.0.0:8161/admin
INFO log - ActiveMQ Web Demos at http://0.0.0.0:8161/demo
INFO log - Started SelectChannelConnector@0.0.0.0:8161
Żeby sprawdzić czy działa otwieramy przeglądarkę i sprawdzamy adres http://0.0.0.0:8161/admin
Ostatni test czy wszystko działa poprawnie uruchamiamy przykład dostarczony przez dystrybutora (typowy przykład klient (czeka na 10 wiadomość) producent (produkuje 10 wiadomości)). Do uruchomienia przykładu musimy mieć zainstalowanego Anta. W katalogu gdzie rozpakowaliśmy źródła przechodzimy do pod katalogu examples i w jednej konsoli uruchamiamy klienta w drugiej producenta.
Klient:
lukasz-lipkas-computer:~/Library/apache-activemq-5.0.0/example lipka$ ant consumer
Producent:
lukasz-lipkas-computer:~/Library/apache-activemq-5.0.0/example lipka$ ant producer
Wszystko działa:) Teraz już tylko połączyć to z Mule:)
lukasz-lipkas-computer:~/Library/apache-activemq-5.0.0/bin lipka$ ./activemq
Na kosoli po chwili można zobaczyć następujące logi:
Loading message broker from: xbean:activemq.xml
INFO BrokerService - Using Persistence Adapter: AMQPersistenceAdapter(/Users/lipka/Library/apache-activemq-5.0.0/data/localhost)
INFO BrokerService - ActiveMQ 5.0.0 JMS Message Broker (localhost) is starting
INFO BrokerService - For help or more information please see: http://activemq.apache.org/
INFO AMQPersistenceAdapter - AMQStore starting using directory: /Users/lipka/Library/apache-activemq-5.0.0/data/localhost
INFO KahaStore - Kaha Store using data directory /Users/lipka/Library/apache-activemq-5.0.0/data/localhost/kr-store/state
INFO ManagementContext - JMX consoles can connect to service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi
INFO AMQPersistenceAdapter - Active data files: []
INFO KahaStore - Kaha Store using data directory /Users/lipka/Library/apache-activemq-5.0.0/data/localhost/kr-store/data
INFO TransportServerThreadSupport - Listening for connections at: tcp://lukasz-lipkas-computer.local:61616
INFO TransportConnector - Connector openwire Started
INFO TransportServerThreadSupport - Listening for connections at: ssl://lukasz-lipkas-computer.local:61617
INFO TransportConnector - Connector ssl Started
INFO TransportServerThreadSupport - Listening for connections at: stomp://lukasz-lipkas-computer.local:61613
INFO TransportConnector - Connector stomp Started
INFO TransportServerThreadSupport - Listening for connections at: xmpp://lukasz-lipkas-computer.local:61222
INFO TransportConnector - Connector xmpp Started
INFO NetworkConnector - Network Connector org.apache.activemq.transport.discovery.multicast.MulticastDiscoveryAgent@28bdf4 Started
INFO BrokerService - ActiveMQ JMS Message Broker (localhost, ID:lukasz-lipkas-computer.local-50886-1207581085279-0:0) started
INFO TransportConnector - Connector vm://localhost Started
INFO log - Logging to org.slf4j.impl.JCLLoggerAdapter(org.mortbay.log) via org.mortbay.log.Slf4jLog
INFO log - jetty-6.1.4
INFO WebConsoleStarter - ActiveMQ WebConsole initialized.
INFO /admin - Initializing Spring FrameworkServlet 'dispatcher'
INFO log - ActiveMQ Console at http://0.0.0.0:8161/admin
INFO log - ActiveMQ Web Demos at http://0.0.0.0:8161/demo
INFO log - Started SelectChannelConnector@0.0.0.0:8161
Żeby sprawdzić czy działa otwieramy przeglądarkę i sprawdzamy adres http://0.0.0.0:8161/admin
Ostatni test czy wszystko działa poprawnie uruchamiamy przykład dostarczony przez dystrybutora (typowy przykład klient (czeka na 10 wiadomość) producent (produkuje 10 wiadomości)). Do uruchomienia przykładu musimy mieć zainstalowanego Anta. W katalogu gdzie rozpakowaliśmy źródła przechodzimy do pod katalogu examples i w jednej konsoli uruchamiamy klienta w drugiej producenta.Klient:
lukasz-lipkas-computer:~/Library/apache-activemq-5.0.0/example lipka$ ant consumer
Producent:
lukasz-lipkas-computer:~/Library/apache-activemq-5.0.0/example lipka$ ant producer
Wszystko działa:) Teraz już tylko połączyć to z Mule:)Mule instalacja
Dzisiaj czas zacząć przygodę z jednym z najbardziej popularnych, darmowych ESB MULE. Nie będę robił wprowadzenia do ESB, napiszę w skrócie do czego może się przydać.
Moja definicja ESB to:
- szyna umożliwiająca komunikacje pomiędzy różnymi serwisami, jej główne założenie to uproszczenie tworzenia architektury SOA(Service Oriented Architecture) (architektura zorientowana na usługi).
Dobra zobaczymy jak to działa w praktyce, pojawiła się nowa wersja Mule 2.o.o idziemy do Download ściągamy źródła i je rozpakowujemy. Zerkamy jeszcze co nowego w wersji 2.0.0 z ciekawych rzeczy widzę, że w następnych wersjach ma być wsparcie dla OSGi.
The Registry architecture will continue to evolve a bit in future releases and will form the basis of OSGi support in Mule.
Wracając do Mule przed rozpoczęciem całej zabawy należy zainstalować niezbędne oprogramowanie(jvm, maven, ...). Po ściągnięciu i rozpakowaniu , czytamy INSTALL.txt, i wykonujemy następujące polecenia (w zależności od systemu operacyjnego, u mnie mac):
export MULE_HOME=/Users/lipka/Library/mule-2.0.0
export PATH=$PATH:$MULE_HOME/bin
Potem w konsoli piszemy:
mule
podczas pierwszego uruchomienia musimy zaakceptować licencje.
Do you accept the terms and conditions of this license agreement [y/n]?
y
i potem widzimy (maven ściągą niezbędne jary) i na końcu:
Starting the Mule Server...
Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
Copyright 1999-2006 Tanuki Software, Inc. All Rights Reserved.
WARN 2008-04-07 13:57:39,559 [WrapperListener_start_runner] org.mule.MuleServer: A configuration file was not set, using default: mule-config.xml
*******************************************************************************
No config file specified and no config by the name of mule-config.xml
found on the classpath.
Usage: mule -config [-builder ] [-debug] [-version]
mule-configuration - a URL for the Mule Config XML to use,
if not specified the config will be loaded from
the classpath
config-builder - a fully qualified class name of the builder to use
to configure Mule.
debug - configure Mule for JPDA remote debugging.
Customize settings by editing a JPDA_OPTS variable
in the mule startup script
version - print full product information
*******************************************************************************
INFO 2008-04-07 13:57:39,594 [Thread-0] org.mule.MuleServer: Mule server shutting down due to normal shutdown request
INFO 2008-04-07 13:57:39,603 [Thread-0] org.mule.MuleServer:
**************************************************************************************
* The server is shutting down due to normal shutdown request *
* Server shutdown: 07.04.08 13:57 *
**************************************************************************************
<-- Wrapper Stopped
Teraz jak już wszystko działa, można uruchomić najprostszy przykład, dostarczony z dystrybucją, w naszym wypadku to będzie Echo Example.
lukasz-lipkas-computer:~/Library/mule-2.0.0 lipka$ cd examples/echo/
lukasz-lipkas-computer:~/Library/mule-2.0.0/examples/echo lipka$ mule -config conf/echo-config.xml
Na konsoli powinna się pokazać możliwość wpisania jakiegoś przykładowego teksty (potem ENTER) i jeszcze raz go wyświetlenie, takie systemowe echo tylko za pomocą UMOComponentu:
**********************************************************************
* Mule ESB and Integration Platform *
* Version: 2.0.0 Build: 11521 *
* MuleSource, Inc. *
* For more information go to http://mule.mulesource.org *
* *
* Server started: 01.01.70 01:00 *
* Server ID: 8e67013c-049b-11dd-b60e-f34003987973 *
* JDK: 1.5.0_13 (mixed mode) *
* OS: Mac OS X (10.4.11, i386) *
* Host: lukasz-lipkas-computer.local (192.168.123.3) *
* *
* Agents Running: None *
**********************************************************************
Please enter something:
helloWorld :)
INFO 2008-04-07 14:10:17,896 [EchoUMO.2] org.mule.component.simple.LogComponent:
********************************************************************************
* Message received in service: EchoUMO. Content is: 'helloWorld :)' *
********************************************************************************
INFO 2008-04-07 14:10:17,911 [SystemStreamConnector.dispatcher.1] org.mule.transport.stdio.StdioMessageDispatcher: Connected: StdioMessageDispatcher{this=185633, endpoint=stdio://system.out, disposed=false}
helloWorld :)
Please enter something:
Mule już działa więc teraz trzeba będzie się przyjrzeć jak można go zastosować w projektach informatycznych.
PS. dla tych co mają maci, krótkie wprowadzenie do shella pod mac OS.
Moja definicja ESB to:
- szyna umożliwiająca komunikacje pomiędzy różnymi serwisami, jej główne założenie to uproszczenie tworzenia architektury SOA(Service Oriented Architecture) (architektura zorientowana na usługi).
Dobra zobaczymy jak to działa w praktyce, pojawiła się nowa wersja Mule 2.o.o idziemy do Download ściągamy źródła i je rozpakowujemy. Zerkamy jeszcze co nowego w wersji 2.0.0 z ciekawych rzeczy widzę, że w następnych wersjach ma być wsparcie dla OSGi.
The Registry architecture will continue to evolve a bit in future releases and will form the basis of OSGi support in Mule.
Wracając do Mule przed rozpoczęciem całej zabawy należy zainstalować niezbędne oprogramowanie(jvm, maven, ...). Po ściągnięciu i rozpakowaniu , czytamy INSTALL.txt, i wykonujemy następujące polecenia (w zależności od systemu operacyjnego, u mnie mac):
export MULE_HOME=/Users/lipka/Library/mule-2.0.0
export PATH=$PATH:$MULE_HOME/bin
Potem w konsoli piszemy:
mule
podczas pierwszego uruchomienia musimy zaakceptować licencje.
Do you accept the terms and conditions of this license agreement [y/n]?
y
i potem widzimy (maven ściągą niezbędne jary) i na końcu:
Starting the Mule Server...
Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
Copyright 1999-2006 Tanuki Software, Inc. All Rights Reserved.
WARN 2008-04-07 13:57:39,559 [WrapperListener_start_runner] org.mule.MuleServer: A configuration file was not set, using default: mule-config.xml
*******************************************************************************
No config file specified and no config by the name of mule-config.xml
found on the classpath.
Usage: mule -config
mule-configuration - a URL for the Mule Config XML to use,
if not specified the config will be loaded from
the classpath
config-builder - a fully qualified class name of the builder to use
to configure Mule.
debug - configure Mule for JPDA remote debugging.
Customize settings by editing a JPDA_OPTS variable
in the mule startup script
version - print full product information
*******************************************************************************
INFO 2008-04-07 13:57:39,594 [Thread-0] org.mule.MuleServer: Mule server shutting down due to normal shutdown request
INFO 2008-04-07 13:57:39,603 [Thread-0] org.mule.MuleServer:
**************************************************************************************
* The server is shutting down due to normal shutdown request *
* Server shutdown: 07.04.08 13:57 *
**************************************************************************************
<-- Wrapper Stopped
Teraz jak już wszystko działa, można uruchomić najprostszy przykład, dostarczony z dystrybucją, w naszym wypadku to będzie Echo Example.
lukasz-lipkas-computer:~/Library/mule-2.0.0 lipka$ cd examples/echo/
lukasz-lipkas-computer:~/Library/mule-2.0.0/examples/echo lipka$ mule -config conf/echo-config.xml
Na konsoli powinna się pokazać możliwość wpisania jakiegoś przykładowego teksty (potem ENTER) i jeszcze raz go wyświetlenie, takie systemowe echo tylko za pomocą UMOComponentu:
**********************************************************************
* Mule ESB and Integration Platform *
* Version: 2.0.0 Build: 11521 *
* MuleSource, Inc. *
* For more information go to http://mule.mulesource.org *
* *
* Server started: 01.01.70 01:00 *
* Server ID: 8e67013c-049b-11dd-b60e-f34003987973 *
* JDK: 1.5.0_13 (mixed mode) *
* OS: Mac OS X (10.4.11, i386) *
* Host: lukasz-lipkas-computer.local (192.168.123.3) *
* *
* Agents Running: None *
**********************************************************************
Please enter something:
helloWorld :)
INFO 2008-04-07 14:10:17,896 [EchoUMO.2] org.mule.component.simple.LogComponent:
********************************************************************************
* Message received in service: EchoUMO. Content is: 'helloWorld :)' *
********************************************************************************
INFO 2008-04-07 14:10:17,911 [SystemStreamConnector.dispatcher.1] org.mule.transport.stdio.StdioMessageDispatcher: Connected: StdioMessageDispatcher{this=185633, endpoint=stdio://system.out, disposed=false}
helloWorld :)
Please enter something:
Mule już działa więc teraz trzeba będzie się przyjrzeć jak można go zastosować w projektach informatycznych.
PS. dla tych co mają maci, krótkie wprowadzenie do shella pod mac OS.
wtorek, 1 kwietnia 2008
Zarządzanie grupą rozproszonych programistów
Rozpoczynam temat z myślą, że jakieś bardziej doświadczone osoby pomogą mi w doborze jak najlepszych praktyk pracy zdalnej grupy programistów.
Z tego co mi się wydaje jedną z ważniejszych rzeczy w udanym projekcie informatycznym jest komunikacja w zespole. Do jak najlepszej komunikacji jak na razie został wybrany skype (nie ma problemu z tworzeniem konferencji paro osobowych).
Skype w praktyce (jeśli zespół jest rozproszony wtedy może zastępować codziennie spotkania w pracy):
- codziennie ta sama godzina konferencji, na której każdy z programistów opisuje co zrobił wczoraj i co planuje na dzisiaj (maksymalny czas na osobę nie powinien przekroczyć 3 -4 min).
Jak jest zaleta tej technologi ? Każdy z programistów wie co dzieje się w projekcie i do kogo się można zwrócić w razie wystąpienia jakiegoś problemu.
W jaki sposób zorganizować programowanie w parach (XP)? W tym wypadku przychodzi nam z pomocą NX dzięki któremu możemy współdzielić ekran, myszkę i klawiaturę z osobą po drugiej stronie globu.
Co do innych narzędzi usprawniających pracę programistów to zastanawiam się nad:
- cruise control (zautomatyzowane budowanie całego projektu uwzględniające junit i generujące raporty o aktualnym stanie projektu)
- trac + mylyn (jako w tyczka do Eclipse) (organizacja zadań z priorytetami)
- do tworzenia dokumentacji jakieś wiki (osobiście polecam jedno z prostszych dokuwiki)
- maven + svn (tutaj chyba nic nie muszę pisać:))
Jeżeli już ktoś pracował w rozproszonym środowisku programistów, proszę o wskazówki jak można usprawnić pracę i komunikację w takim zespole (i jakie narzędzia, praktyki były stosowane).
Z tego co mi się wydaje jedną z ważniejszych rzeczy w udanym projekcie informatycznym jest komunikacja w zespole. Do jak najlepszej komunikacji jak na razie został wybrany skype (nie ma problemu z tworzeniem konferencji paro osobowych).
Skype w praktyce (jeśli zespół jest rozproszony wtedy może zastępować codziennie spotkania w pracy):
- codziennie ta sama godzina konferencji, na której każdy z programistów opisuje co zrobił wczoraj i co planuje na dzisiaj (maksymalny czas na osobę nie powinien przekroczyć 3 -4 min).
Jak jest zaleta tej technologi ? Każdy z programistów wie co dzieje się w projekcie i do kogo się można zwrócić w razie wystąpienia jakiegoś problemu.
W jaki sposób zorganizować programowanie w parach (XP)? W tym wypadku przychodzi nam z pomocą NX dzięki któremu możemy współdzielić ekran, myszkę i klawiaturę z osobą po drugiej stronie globu.
Co do innych narzędzi usprawniających pracę programistów to zastanawiam się nad:
- cruise control (zautomatyzowane budowanie całego projektu uwzględniające junit i generujące raporty o aktualnym stanie projektu)
- trac + mylyn (jako w tyczka do Eclipse) (organizacja zadań z priorytetami)
- do tworzenia dokumentacji jakieś wiki (osobiście polecam jedno z prostszych dokuwiki)
- maven + svn (tutaj chyba nic nie muszę pisać:))
Jeżeli już ktoś pracował w rozproszonym środowisku programistów, proszę o wskazówki jak można usprawnić pracę i komunikację w takim zespole (i jakie narzędzia, praktyki były stosowane).
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:

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:)
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:)
wtorek, 25 marca 2008
AspectJ wprowadzenie
Szybki start z AspectJ najpierw ściągamy wtyczkę do Eclipse 3.3 za pomocą Help->Software Updates->Find and Install.. dodajemy nowy adres http://download.eclipse.org/tools/ajdt/33/update . Potem jeszcze zapoznanie się z wprowadzającym artykułem do The AspectJ Development Tools (AJDT). W Eclipse tworzymy projekt aspektowy i klikamy Finish:
Teraz stworzymy nową klasę(ctrl + n) Graphic.java
package com.itsilesia;
public class Graphic {
public void draw(){
System.out.println("Painting");
}
public static void main(String[] args) {
Graphic graphic = new Graphic();
graphic.draw();
}
}
Teraz piszemy nasz pierwszy aspekt(ctrl +n AspectJ-> Aspect):
package com.itsilesia.aspects;
public aspect Secure {
pointcut checkSecure():execution(* com.itsilesia.Graphic.draw());
before() : checkSecure() {
System.out.println("Checking dependencies before painting");
}
after() returning : checkSecure() {
System.out.println("Exiting painting");
}
}
Najpierw zdefiniowałem punkt przecięcia (pointcut) która ma zostać użyty podczas wywołania metody draw() z klasy Graphic, później stworzyłem radę(advice) która ma się wykonać przed(before) i po(after) trafieniu na punkt przecięcia.
Teraz uruchamiamy nasz program (Run as -> AspectJ/Java Application):
Checking dependencies before painting
Painting
Exiting painting
Program zadzialal wedlug naszych oczekiwań:)
Zobaczmy co jeszcze oferuje nam Eclipse w przypadku AOP, Cross References:
można zobaczyć gdzie w naszej klasie jest użyte programowanie aspektowe i jakie rady są wywoływane. Istnieje też, cała perspektywa w Eclipse do AOP (Aspect Visualization) pokazująca powiązanie pomiędzy naszymi klasami a aspektami:
A teraz co mi daje zastosowanie AOP w tym przypadku:
- przede wszystkim odizolowanie różnych modułów (budowanie aplikacji graficznej od jej zabezpieczenia)
- bez problemowa wymiana systemu zabezpieczeń, gdyż nigdzie nie jest ona uwzględniona w kodzie obsługi obiektów graficznych
- z punktu widzenia programisty jeden drugiemu nie uprzykrza pracy dopisując jakiś niepotrzebnych linii kodu

Teraz stworzymy nową klasę(ctrl + n) Graphic.java
package com.itsilesia;
public class Graphic {
public void draw(){
System.out.println("Painting");
}
public static void main(String[] args) {
Graphic graphic = new Graphic();
graphic.draw();
}
}
Teraz piszemy nasz pierwszy aspekt(ctrl +n AspectJ-> Aspect):
package com.itsilesia.aspects;
public aspect Secure {
pointcut checkSecure():execution(* com.itsilesia.Graphic.draw());
before() : checkSecure() {
System.out.println("Checking dependencies before painting");
}
after() returning : checkSecure() {
System.out.println("Exiting painting");
}
}
Najpierw zdefiniowałem punkt przecięcia (pointcut) która ma zostać użyty podczas wywołania metody draw() z klasy Graphic, później stworzyłem radę(advice) która ma się wykonać przed(before) i po(after) trafieniu na punkt przecięcia.
Teraz uruchamiamy nasz program (Run as -> AspectJ/Java Application):
Checking dependencies before painting
Painting
Exiting painting
Program zadzialal wedlug naszych oczekiwań:)
Zobaczmy co jeszcze oferuje nam Eclipse w przypadku AOP, Cross References:
można zobaczyć gdzie w naszej klasie jest użyte programowanie aspektowe i jakie rady są wywoływane. Istnieje też, cała perspektywa w Eclipse do AOP (Aspect Visualization) pokazująca powiązanie pomiędzy naszymi klasami a aspektami:A teraz co mi daje zastosowanie AOP w tym przypadku:
- przede wszystkim odizolowanie różnych modułów (budowanie aplikacji graficznej od jej zabezpieczenia)
- bez problemowa wymiana systemu zabezpieczeń, gdyż nigdzie nie jest ona uwzględniona w kodzie obsługi obiektów graficznych
- z punktu widzenia programisty jeden drugiemu nie uprzykrza pracy dopisując jakiś niepotrzebnych linii kodu
Subskrybuj:
Posty (Atom)

