30 września 2007

Elementy programowania aspektowego w EJB 3.0 - część 2: Interceptory biznesowe

0 komentarzy
W poprzedniej części o programowaniu aspektowym w EJB 3.0 - Elementy programowania aspektowego w EJB 3.0 - część 1 - stworzyłem interceptor TracingInterceptor, który przechwytywał wywołania metod biznesowych i wyświetlał informacje z nimi związane.

Tym razem stworzę nowe ziarno EchoBean, które udostępni metodę biznesową echo(String). Jej wywołanie będzie poprzedzone wywołaniem interceptora biznesowego TracingInterceptor zdefiniowanego w poprzedniej notatce o interceptorach oraz całkiem nowego interceptora biznesowego, który będzie niebiznesową metodą ziarna odnotujWykorzystanieUslugi, którego celem będzie gromadzenie informacji o wykorzystaniu usługi dostarczanej przez ziarno. Jako warstwę kliencką do uruchomienia ziarna wykorzystam mechanizm usługi sieciowej (ang. web service).

Najpierw kilka faktów ze specyfikacji EJB 3.0 rozdział 12: Interceptors.

Dowolna liczba klas interceptorów może być zdefiniowanych dla pojedyńczej klasy ziarna.

Interceptor biznesowy może być metodą dedykowanej klasy interceptora bądź metodą niebiznesową ziarna. Związanie klasy interceptora z ziarnem następuje poprzez adnotację @Interceptors natomiast wskazanie metody interceptora poprzez @AroundInvoke (oczywiście istnieją odpowiedniki w postaci znaczników XML w deskryptorze rozmieszczenia, o czym później).

Metody AroundInvoke mogą być zdefiniowane na klasie macierzystej (nadklasie) klasy ziarna lub interceptora. Jednakże, jedynie pojedyńcza metoda AroundInvoke może być zdefiniowana dla danej klasy. Metoda AroundInvoke nie może być metodą biznesową ziarna.

Metody AroundInvoke mogą być dowolnego kwalifikatora dostępu (widoczności) - public, private, protected lub "package protected". Metody AroundInvoke nie mogą być final oraz static.

Metoda AroundInvoke może wywoływać dowolny komponent lub zasób, który może być wywoływany przez ziarno, np skorzystać z zarządcy trwałego, aby odnotować wykonanie metody do bazy danych.

Wykonanie metod AroundInvoke następuje w ramach tego samego kontekstu transakcyjnego i bezpieczeństwa jak metoda biznesowa, z którą jest związana.

Metoda interceptora AroundInvoke może być przypisywana per metoda biznesowa ziarna lub dla wszystkich metod biznesowych klasy ziarna w zależności od umiejscowienia adnotacji @Interceptors (bądź analogicznie wykorzystania znacznika <interceptor-binding> w deskryptorze rozmieszczenia)

Metody AroundInvoke wykonywane są w tym samym stosie wywołań Java jak metoda biznesowa ziarna, z którym są związane.

Sprawdźmy to w działaniu.

W poprzedniej części zaprezentowałem interceptor zdefiniowany w dedykowanej dla niego klasie - TracingInterceptor - tym razem metoda interceptora AroundInvoke będzie częścią ziarna.

Tworzymy ziarno bezstanowe EchoBean, które jest jednocześnie usługą sieciową EchoService.

package pl.jaceklaskowski.ejb3.interceptors;

import java.util.logging.Logger;
import javax.ejb.Stateless;
import javax.interceptor.AroundInvoke;
import javax.interceptor.Interceptors;
import javax.interceptor.InvocationContext;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;

@WebService(serviceName = "EchoService")
@Stateless
@Interceptors(value = TracingInterceptor.class)
public class EchoBean implements EchoLocal {

Logger logger = Logger.getLogger(EchoBean.class.getName());

@WebMethod(operationName = "echo")
public String echo(@WebParam(name = "message") String message) {
String response = message + "..." + message + "..." + message;
logger.info("echo: " + response);
return response;
}

@AroundInvoke
Object odnotujWykorzystanieUslugi(InvocationContext ctx) throws Exception {
logger.info("@AroundInvoke odnotujWykorzystanieUslugi: Odnotowano wykonanie metody biznesowej " +
ctx.getTarget().getClass().getSimpleName() + "." + ctx.getMethod().getName() + "()");
return ctx.proceed();
}
}

z następującym, bardzo skromnym interfejsem lokalnym EchoLocal:

package pl.jaceklaskowski.ejb3.interceptors;

import javax.ejb.Local;

@Local
public interface EchoLocal {

String echo(String message);

}

Dla przypomnienia zaprezentuję interceptor TracingInterceptor:

package pl.jaceklaskowski.ejb3.interceptors;

import java.util.logging.Logger;
import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;

public class TracingInterceptor {

Logger logger = Logger.getLogger(TracingInterceptor.class.toString());

@AroundInvoke
public Object trace(InvocationContext ctx) throws Exception {
logger.info("TracingInterceptor: Wykonywana metoda biznesowa " +
ctx.getTarget().getClass().getSimpleName() + "." + ctx.getMethod().getName() + "()");
return ctx.proceed();
}
}

Uruchamiamy ziarno na serwerze aplikacyjnym Java EE 5, np. Glassfish v2 bądź Apache Geronimo 2.0.1 i wykonujemy usługę sieciową EchoService. Uruchamiam ziarno z poziomu NetBeans IDE 6.0 - menu Test Web Service.


Automatycznie otwiera się strona wskazująca na usługę sieciową EchoService.


Wpisuję dowolny ciąg znaków, np. jacek (ot tak całkowicie przypadkiem padło na moje imię ;-)) i zatwierdzam wybierając przycisk echo.


W dzienniku zdarzeń serwera (w tym przypadku Glassfish v2) pojawiają się następujące wpisy:

TracingInterceptor: Wykonywana metoda biznesowa EchoBean.echo()
@AroundInvoke odnotujWykorzystanieUslugi: Odnotowano wykonanie metody biznesowej EchoBean.echo()
echo: jacek...jacek...jacek

Interesującą kwestią, do której wrócę, jest kolejność wykonywania interceptorów, a dokładniej mówiąc metod interceptorów.

26 września 2007

XVI spotkanie Warszawskiej Grupy Użytkowników Technologii Java (Warszawa JUG)

0 komentarzy
Warszawska Grupa Użytkowników Technologii Java (Warszawa JUG) zaprasza na XVI spotkanie, które odbędzie się w nadchodzący wtorek 2.10.2007 o godzinie 18:00 w sali 4420 na Wydziale MIMUW przy ul. Banacha 2 w Warszawie.

Temat prezentacji: Integracja JSF + Facelets + Spring + JPA + Tomahawk
Prowadzący: Wiktor Gworek

JavaServer Faces (JSF), Tomahawk, Facelets, Spring Framework i Java Persistence (JPA) to technologie, o których miło się czyta. Kiedy jednak przychodzi do rzeczywistych zastosowań, nie ma osoby, która by nie miała problemów z ich integracją. Celem prezentacji będzie zbudowanie prostej aplikacji typu CRUD (Create-Read-Update-Delete) łączącej wszystkie te magiczne technologie w atmosferze dobrej zabawy.

Prezentację poprowadzi Wiktor Gworek, student V roku na MIMUW-ie. Jest entuzjastą życia i nowych technologii. Wiktor uwielbia ładne, radosne programowanie, kunsztowną architekturę oprogramowania oraz czytać RSSy ;). Z Javą związany jest od dwóch lat, jednak stroni on od monogamii programistycznej. Prowadzi blog Mocna Kawa.

Planowany czas prezentacji to 1,5 godziny z 20-minutową dyskusją. Na zakończenie (około 10 minut) planowana jest dyskusja dotycząca organizacji konferencji WarsJava organizowanej przez Warszawa JUG.

Wstęp wolny

Zapraszam w imieniu Warszawa JUG!

25 września 2007

Tworzenie aplikacji Java EE z Apache Geronimo 2 na Java Developers Day 2007 w Krakowie

5 komentarzy
Nie pisałem o tym jeszcze, bo wciąż nie było wiadome, czy jakikolwiek z zaproponowanych przeze mnie tematów zostanie wybrany i właśnie dzisiaj na grupie Polskiej....ekhm chyba nigdy się nie przyzwyczaję....Krakowskiej Grupy Użytkowników Javy pojawiła się wiadomość od Adriana Nowaka o opublikowaniu tematów na nadchodzącą konferencję Java Developers Day 2007 w dniu 26 października 2007 w Krakowie. Zapraszam wszystkich na wieczorne pogaduchy o Korporacyjnej Javie w moim wykonaniu we współpracy z Apache Geronimo 2.0.1. Nie obędzie się bez atrakcji, bo 45 minut to niewiele, więc aby nie spalić dnia po występach gwiazd: Billa Burke (JBoss/RedHat) oraz Jonas Boner (Terracotta Inc.) nie pomijając innych prelegentów, postaram się nie zanudzać uczestników slajdami, a poświęcić się tworzeniu aplikacji z wykorzystaniem dostępnego oprogramowania - wszystko w stylu Java EE 5. Będzie trochę Eclipse IDE 3.3 i trochę NetBeans IDE 6.0, zapewne nie zabraknie Apache Maven 2 i jeszcze innych zabawek wszystko okraszone JSF 1.2, EJB 3.0 i JPA 1.0. Marzy mi się zaprezentowanie JBoss Seam 2 uruchomionego na Apache Geronimo, ale jak pamiętam z ostatnich moich bojów to brak wsparcia dla TimerService przez adnotację @Resource było główną przeszkodą dla uruchomienia Seama. Zobaczymy.

Zapraszam na konferencję JDD 2007 z naciskiem na moją prezentację o Korporacyjnej Javie 5 i Geronimo. Z pewnością będzie dużo dobrej zabawy!

20 września 2007

Elementy programowania aspektowego w EJB 3.0 - część 1

2 komentarzy
Zaintrygowany komentarzami na temat (nie)doskonałości EJB 3.0 w dostarczaniu funkcjonalności znanej z programowania aspektowego (ang. AOP - Aspect-Oriented Programming) na ostatnim spotkaniu Warszawa JUG postanowiłem zbadać temat dokładniej, którego celem byłoby przedstawienie tematu na jednym ze spotkań grupy. Rozpocznę od stwierdzenia, że mechanizmy znane z AOP w wykonaniu EJB3 są jedynie namiastką pełnego wachlarza możliwości AOP. Mimo wszystko warto poznać EJB3 z tej perspektywy, aby w pełni docenić zmiany i możliwości nowej wersji specyfikacji EJB3 i nie uciekać się do rozwiązań alternatywnych, jeśli to, czego w danej chwili potrzebujemy jest dostępne pod ręką, w EJB3.

Za Wikipedią - Programowanie aspektowe:

Programowanie aspektowe (aspect-oriented programming, AOP) to paradygmat tworzenia programów komputerowych wspomagający separację zagadnień i rozdzielenie programu na części w jak największym stopniu niezwiązane funkcjonalnie.

Jak można było usłyszeć na ostatniej prezentacji Bartka Szkudlarka podczas XV spotkania Warszawa JUG jest wiele pojęć związanych z AOP i próba ich wytłumaczenia tu i teraz i w dodatku przeze mnie mogłaby nie oddać pełnego kolorytu AOP (niech tracą Ci, którym nie udało się przybyć na spotkanie).

Programowanie aspektowe opiera się na wyodrębnieniu zagadnień, które można określić pobocznymi w stosunku do podstawowych, biznesowych wymagań aplikacji. Takimi zagadnieniami są m.in. mechanizm bezpieczeństwa, śledzenie wykonywania programu, badanie wydajności, itp. Są to zagadnienia istotne dla pełnego działania aplikacji, jednakże ich znaczenie biznesowe jest niewielkie w stosunku do problemu, dla którego powstaje nasza aplikacja.

EJB3 dostarcza rozwiązanie o nazwie interceptor (alternatywnie metoda przechwytująca), który jest uruchamiany podczas wykonania metody biznesowej ziarna EJB - interceptor metod biznesowych (dalej zwany interceptorem biznesowym) - lub zdarzenia związanego z cyklem rozwojowym ziarna - interceptor zdarzenia rozwojowego (dalej zwany interceptorem rozwojowym).

Interceptor może być zdefiniowany w dedykowanej klasie interceptora bądź może być niebiznesową metodą ziarna EJB (dla przypomnienia: metody biznesowe są zdefiniowane przez interfejs lokalny, zdalny, endpoint oraz w przypadku ziarna sterowanego komunikatami metodzie onMessage bądź adekwatnej dla stosowanego systemu komunikatów).

I tu pojawia się kwestia związana z typem ziarna, dla których można zadeklarować interceptor biznesowy. Interceptory biznesowe są jedynie deklarowane dla ziaren sesyjnych oraz sterowanych komunikatami (kolejne miejsce w specyfikacji EJB3, gdzie można zauważyć inne traktowanie ziaren encyjnych, które w następnej specyfikacji Java EE 6 mają być ustandaryzowane przez dedykowaną specyfikację i wyjść z objęć EJB3).

Klasa interceptora musi definiować bezargumentowy konstruktor.

Metoda interceptora biznesowego posiada następującą składnię:

Object <dowolna-nazwa-metody>(InvocationContext) throws Exception
Wykonanie interceptora wiąże się z przekazaniem egzemplarza javax.interceptor.InvocationContext, który dostarcza informacji o środowisku uruchomieniowym metody interceptora, tj. metodzie, parametrów wejściowych i nazwie klasy ziarna, z którym jest związany. Najczęściej wykorzystywaną metodą InvocationContext jest proceed(), której uruchomienie spowoduje wykonanie kolejnego interceptora w łańcuchu interceptorów związanych z daną metodą biznesową lub samą metodę biznesową.

Skoro wspominałem o łańcuchu interceptorów sugeruje to możliwość deklaracji wielu interceptorów dla pojedyńczej metody biznesowej oraz prowokuje do zadania pytania o ich kolejność wykonania. Istnieje możliwość deklaracji wielu interceptorów biznesowych dla pojedyńczej metody czy klasy. Ich kolejność zostanie omówiona w kolejnej odsłonie na ich temat.

I w końcu informacja, której brakuje do popróbowania się z interceptorami biznesowymi - sposób ich deklaracji oraz miejsce ich uruchomienia. EJB3 dostarcza adnotację @AroundInvoke oraz znacznik <around-invoke>, które definiują metodę interceptora, natomiast adnotacja @Interceptors związuje metody biznesowe z klasami interceptorów. Miejsce wystąpienia adnotacji @Interceptors lub wartości znacznika <around-invoke> określają metody biznesowe związane z interceptorami, których wywołanie spowoduje wywołanie interceptora.

Dla zobrazowania materiału przedstawię przykład interceptora TracingInterceptor, którego zadaniem będzie odnotowywanie wykonania metod biznesowych.

Klasa interceptora TracingInterceptor

package pl.jaceklaskowski.ejbws.interceptors;

import java.util.logging.Logger;
import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;

public class TracingInterceptor {

Logger logger = Logger.getLogger(TracingInterceptor.class.toString());

@AroundInvoke
public Object trace(InvocationContext ctx) throws Exception {
logger.info("Wykonuje metode biznesowa " +
ctx.getTarget().getClass().getSimpleName() +
"." + ctx.getMethod().getName());
return ctx.proceed();
}
}

oraz ziarno MojPierwszyWsEJBBean z poprzedniego wpisu, z zadeklarowanym interceptorem:

package pl.jaceklaskowski.ejbws;

import java.util.logging.Logger;
import javax.ejb.Stateless;
import javax.interceptor.Interceptors;
import pl.jaceklaskowski.ejbws.interceptors.TracingInterceptor;

@Stateless
@Interceptors(TracingInterceptor.class)
public class MojPierwszyWsEJBBean implements MojPierwszyWsEJBLocal {

Logger logger = Logger.getLogger(MojPierwszyWsEJBBean.class.toString());

public void metodaBiznesowa() {
logger.info("Metoda biznesowa metodaBiznesowa wywolana poprawnie");
}
}

Uruchomienie metody metodaBiznesowa zakończy się następującym wpisem w dzienniku zdarzeń serwera aplikacyjnego Korporacyjnej Javy 5 (Java EE 5):

Wykonuje metode biznesowa MojPierwszyWsEJBBean.metodaBiznesowa
Metoda biznesowa metodaBiznesowa wywolana poprawnie

19 września 2007

NetBeans IDE 6.0 Beta 1 oraz GlassFish V2 dostępne, ale czy gotowe?

0 komentarzy
Właśnie pojawiła się nowa wersja beta środowiska programistycznego NetBeans IDE 6.0 Beta 1. Rozpoczął się tym samym program NetCAT 6.0 (NetBeans IDE 6.0 Community Acceptance Testing), w którym zdeklarowałem zweryfikować poprawność działania kolejnych kandydatów na finalną wersję NetBeans IDE 6.0 w obszarach j2ee oraz web services (Participants of NetCAT 6.0 program). Jak się później okazało w wersji Beta 1 jest kilka błędów, które dyskwalifikują ją i konieczne jest pobranie wersji następnej, rozwojowej.

Zabawę czas zacząć!

Rozpocznę od stworzenia bardzo prymitywnej aplikacji Java EE 5 z wykorzystaniem jak najmniejszej liczby kroków, a tym bardziej uderzeń w klawiaturę (coś na wzór poprzedniego testu, którego wynikiem był artykuł - Tworzenie aplikacji EJB 3.0 z GlassFish v2, Apache Maven 2 i NetBeans IDE 6.0).

Tym razem zbuduję bezstanowe ziarno sesyjne EJB, które udostępnia wyłącznie interfejs usługi sieciowej (WS) oraz klienta korzystającego z niej (jakiż inny mógłbym wybrać przykład łączący EJB3 (obecne zainteresowanie) z Web Services w ramach NetBeans IDE 6 tak, aby kontynuować poznawanie EJB3 i sprawdzić działanie NetBeans IDE?!)

Przez serwer rozumiem serwer aplikacyjny zgodny ze specyfikacją Korporacyjnej Javy 5 (Java EE 5).
Przez aplikację korporacyjną rozumiem aplikację tworzoną przy wykorzystaniu elementów Korporacyjnej Javy.

Definiuję nowy serwer, który będzie wymagany przy tworzeniu aplikacji korporacyjnej. Jak miało to miejsce poprzednio wybieram GlassFish'a (ech, jak mi się marzy przedstawienie Apache Geronimo 2.0.1 z wtyczką dla NetBeans IDE 6.0, ale to jeszcze musi trochę poczekać). Serwer pobieram w ramach paczki dystrybucyjnej NetBeans IDE 6.0 Beta 1 bądź jako osobny projekt ze strony GlassFish Project - V2 Final Build (aka b58g Promoted Build). Instrukcje tworzenia nowego serwera można znaleźć we wspomnianym wcześniej artykule.


Zaczynam od stworzenia projektu ziarna - MojPierwszyWsEJB - menu Enterprise > EJB Module, wskazuję na serwer GlassFish (jeśli jest jedynym serwerem to będzie automatycznie wybrany) i zatwierdzam formatkę definiowania projektu.

Tworzę nowy pakiet (menu New > Java Package) - pl.jaceklaskowski.ejbws.

W menu kontekstowym nowego pakietu wybieram New > Session Bean... podaję EJB Name jako MojPierwszyWsEJB i zatwierdzam formatkę.

Jakkolwiek zgodnie z komentarzem w klasie ziarna możnaby skorzystać z menu kontekstowego Web Service > Add Operation to faktycznie takie menu nie istnieje. Zgłosiłem błąd [60cat] No Web Service > Add Operation menu yet the comment in EJB points to it.

Wybieramy Add Business Method i definiujemy bezparametrową metodą metodaBiznesowa. Ostatecznie ziarno wygląda następująco:

package pl.jaceklaskowski.ejbws;

import java.util.logging.Logger;
import javax.ejb.Stateless;

@Stateless
public class MojPierwszyWsEJBBean implements MojPierwszyWsEJBLocal {

Logger logger = Logger.getLogger(MojPierwszyWsEJBBean.class.toString());

public void metodaBiznesowa() {
logger.info("Metoda biznesowa metodaBiznesowa wywołana poprawnie");
}
}

gdzie lokalny interfejs biznesowy wygląda tak:

package pl.jaceklaskowski.ejbws;

import javax.ejb.Local;

@Local
public interface MojPierwszyWsEJBLocal {

void metodaBiznesowa();

}

New > Web Service... z domyślną nazwą NewWebService, w pakiecie pl.jaceklaskowski.ejbws (pole Package) i wybieram opcję Delegate to Existing Session Enterprise Bean ze wskazaniem na wcześniej stworzone ziarno. Finish. Niestety, w tym momencie pojawi się NPE, który zgłosiłem jako [60cat] NPE upon finishing New > Web Service in EJB project. Zamykam okno z komunikatem błędu (przycisk Close). Po pewnym czasie wszystko wraca do normy, tj. pojawia się pozycja MojPierwszyWsEJBBean w węźle Enterprise Beans, chociaż nie potrafię odtworzyć ścieżki poleceń, aby do tego momentu dojść. Tak, czy owak, zamknięcie okna z błędem kończy temat do momentu kolejnego rozwinięcia węzła Enterprise Beans, czego nie planuję zrobić ponownie.

package pl.jaceklaskowski.ejbws;

import javax.ejb.EJB;
import javax.jws.Oneway;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.ejb.Stateless;

@WebService
@Stateless
public class NewWebService {

@EJB
private MojPierwszyWsEJBLocal ejbRef;

@WebMethod(operationName = "metodaBiznesowa")
@Oneway
public void metodaBiznesowa() {
ejbRef.metodaBiznesowa();
}
}

Zanim wywołam usługę sieciową, instaluję paczkę EJB na serwerze przez wywołanie menu Run. Próba wcześniejszego uruchomienia usługi kończy się komunikatem o niedostępności usługi na serwerze.

Wybieram menu Test Web Service z menu kontekstowego węzła MojPierwszyWsEJB/Web Services/NewWebService.

Wciskam przycisk metodaBiznesowa, która spowoduje wywołanie metody metodaBiznesowa ziarna MojPierwszyWsEJB, o czym można się przekonać w dzienniku zdarzeń GlassFish'a:

Invoking wsimport with http://localhost:8080/NewWebServiceService/NewWebService?WSDL
wsimport successful
Metoda biznesowa metodaBiznesowa wywolana poprawnie

Pomijając 2 błędy znalezione w międzyczasie tworzenie usługi sieciowej na bazie ziarna EJB można uznać za zakończone. Ze względu na błędy zmuszony byłem do zainstalowania wersji rozwojowej NetBeans IDE 6.0 z dnia 18.09.2007 (uwaga: odnośnik wskazuje na ostatnią wersję NetBeans IDE 6.0, więc w trakcie czytania wersja może być już nowsza).

W międzyczasie natrafiłem na artykuł zbliżone do tematu opublikowany na stronach netbeans.org - Getting Started with JAX-WS Web Services in NetBeans IDE 6.0. Zresztą jest ich więcej, m.in. na stronie Web Application Learning Trail oraz Java EE Applications Learning Trail w sekcji NetBeans IDE 6.0 Beta Tutorials.

18 września 2007

Wrażenia po otwierającym sezon spotkań, XV spotkaniu Warszawa JUG

0 komentarzy
W planach miałem opublikowanie informacji o nowym NetBeans IDE 6.0, jednakże postanowiłem zmienić plany na rzecz wypromowania spotkań Warszawa JUG. Przyznaję, że liczba uczestników, która mam wrażenie, że na dzisiejszym spotkaniu przekroczyła 50 osób ,pozwala przypuszczać, że występ Bartosza Szkudlarka o Aspect-Oriented Programming (AOP) był najbardziej obleganym spotkaniem w tegorocznych spotkaniach Warszawa JUG. Nie dowiem się zapewne, czy to żądza wiedzy o AOP, czy chęć spotkań u uczestników, czy wreszcie sama osoba Bartka sprawiła, że pojawiło się tak wiele osób i to wielu, którzy po raz pierwszy uczestniczyli w spotkaniu Warszawa JUG. Sądzę, że 35% uczestników (chociaż niektórzy byli nawet zdania, że około 50%) podniosła rękę po moim pytaniu o pierwsze ich uczestnictwo w spotkaniach. Wniosek z tego płynie jeden - grupa ma dużą rotację i biorąc pod uwagę, że na każdym spotkaniu oscylujemy wokół 40 słuchaczy grupa cieszy się wciąż dużym powodzeniem. Dodając do tego, że obecnie ilość zarejestrowanych członków grupy Warszawa JUG przekroczyła 130 osób, grupa stanowi ciekawą platformę do wymiany wiedzy z zakresu technologii Java. Okazało się dzisiaj, że w zasadzie nie tylko z zakresu Java. Na spotkaniu pojawiło się kilka osób zaabsorbowanych na codzień pracą z platformą .Net i dziejsza wizyta miała być porównaniem rozwiązań AOP względem rozwiązań AOP w .Net. Komentarz wskazywał, że rozwiązanie javowe zostało bardzo dobrze przyjęte i Eclipse, AspectJ oraz ich integracja via Spring się podobała.

Nie byłbym sobą, gdybym nie nadmienił, że brawa należą się przede wszystkim dzisiejszemu prowadzącemu - Bartkowi Szkudlarkowi, który dzielnie bronił prostoty tworzenia aplikacji z wykorzystaniem Spring Framework, AspectJ i Eclipse mimo ciągłych problemów z uruchomieniem aplikacji z ich wykorzystaniem, a którą sam określił jako...prosta i działająca (!) Coż, tylko Ci, którzy doświadczyli przyjemności wystąpienia przed społecznością Warszawa JUG wiedzą, że nawet najbardziej trywialne kwestie dorastają do rangi problemu nie do rozwiązania, kiedy 40-50 osób ze zniecierpliwieniem oczekuje kontynuacji prezentacji, kiedy to właśnie w tym momencie oprogramowanie przypomina sobie o możliwości nieuruchomienia się. A publika się niecierpliwi. Nie, nie jest tak źle jak opisuję, bo uczucie stresu prezentacyjnego jest bardzo budujące, a radość z ukończonej prezentacji jest ogromna (i nie ma tak na prawdę znaczenia, czy udała się, czy nie, bo nigdy nie zdarzyło się tak, żeby w końcu przykład, choć prostszy, nie został uruchomiony ku uciesze publiczności, co zawsze kończy się oklaskami za...odwagę, upór i cierpliwość). Należy pamiętać, że radość po prezentacji jest wprost proporcjonalna do ilości trudu włożonego w przygotowanie i poprowadzenie jej, więc nie ma tego złego, co by na dobre nie wyszło i potencjalne wpadki szybko zostają wspólnymi siłami opanowane. Brawo Bartku za dobrze poprowadzone XV spotkanie rozpoczynające kolejny sezon spotkań Warszawa JUG!

Zapraszam do zapisywania się do grupy i dzielenia się własnymi spostrzeżeniami dotyczącymi kolejnych spotkań na liście dyskusyjnej. Jeśli czujesz się na siłach, bądź wręcz przeciwnie, nie czujesz się na siłach, ale czujesz, że mógłbyś podzielić się swoją wiedzą, zapraszam do zgłoszenia się jako prelegent. Możliwe są wystąpienia grupowe - jeden tłumaczy technologię podczas, gdy drugi pisze aplikacje jak i wystąpienia łączone - pierwsza godzina o technologii X, a druga technologii Y.

Kolejne spotkanie już za 2 tygodnie. Zapraszam!

16 września 2007

Maven 2 Remote Resources Plugin oraz Project Group w NetBeans IDE 6

0 komentarzy
Przyszło mi się zmagać z opublikowaniem Apache OpenEJB 3.0 i podczas budowania wersji dystrybucyjnej zwrócono uwagę, że każdy plik będący w dystrybucji musi posiadać nagłówek z odpowiednią licencją ASLv2, a pliki typu jar czy zip pliki LICENSE oraz NOTICE. OpenEJB jest projektem rządzącym się prawami Apache Software Foundation, więc obowiązują go zasady opisane w dokumencie ASF Source Header and Copyright Notice Policy. Projekt OpenEJB zarządzany jest przez Apache Maven 2, więc do obsługi wspomnianych plików wykorzystywane są odpowiednie wtyczki - typowe rozwiązanie to kopiowanie ich z katalogu projektu. Nie byłoby w tym nic wyjątkowego, gdyby nie fakt, że plik NOTICE jest zbiorem licencji zależności wykorzystywanych przez projekt OpenEJB. Do dzisiejszej nocy konieczne było umieszczanie informacji o licencjach manualnie - każdorazowe dodanie zależności oraz co najbardziej bolesne zależności przechodnich, tj. takich, które były zależnościami pochodnymi zależności, którą deklaruje projekt, musiało wiązać się z odpowiednią adnotacją w pliku NOTICE. Można sobie wyobrazić, że nie było to przyjemne i podczas tworzenia wersji dystrybucyjnej konieczne było ponowne przeanalizowanie wszystkich zależności i ich licencji oraz dodanie brakujących do NOTICE. Bolesne. Aż do dzisiejszego wieczora, kiedy wykorzystałem wtyczkę Maven 2 Remote Resources Plugin (MRRP). Jej zadaniem jest automatyczne zarządzanie informacjami, które projekty i tak zobowiązane są umieszczać we własnym pliku pom.xml (serce projektu kontrolowanego przez Apache Maven 2). Wtyczka działa w ten sposób, że pobiera zdalny zestaw plików (parametr konfiguracyjny wtyczki resourceBundles), które umieszczane są w paczce dystrybucyjnej. Dodatkowo włączany plik może być szablonem Velocity, co daje możliwość modyfikacji jego zawartości na bazie konfiguracji wtyczki. Pozostaje jedynie zapewnić, że wymagane informacje o projekcie ów projekt udostępnia, co sprowadza się do poprawienia ich plików pom.xml albo samodzielne zarządzanie informacjami w pliku supplemental-models.xml (w katalogu src/main/appended-resources). Jeśli nawet wtyczka wymaga pewnych kroków konfiguracyjnych, to proces zarządzania dołączanymi plikami (wliczając w to również ich dynamiczną modyfikację) sprowadziła do minimum. Istnieje również możliwość budowania własnych zestawów plików do dołączenia, co przy wielu projektach pozwala na zbudowanie pojedyńczego repozytorium dołączanych dokumentów, a nie wyłącznie plików typu jar, zip, war, ear, itp.

Podczas rozpoznawania jak działa wtyczka MRRP postanowiłem pobrać jej źródła. Nie było ich wiele, więc lektura nie zabrała więcej niż kwadrans. Po ostatnich pozytywnych wrażeniach z pracą NetBeans IDE 6 i wtyczką NetBeans do obsługi projektów zarządzanych przez Maven 2 postanowiłem skorzystać z NetBeans IDE. Nie chciałem jednak zaśmiecać sobie widoku projektów modułów OpenEJB z projektem wtyczki i przypomniałem sobie o funkcjonalności, której nie miałem jeszcze sposobności wykorzystać - Project Group. Jest to bardzo podobne do przestrzeni roboczych (ang. workspaces) w Eclipse, czy grupowania projektów w Eclipse w widoku projektów. Zawsze mi tego brakowało w NetBeans, więc teraz przyszła pora na sprawdzenie, czy to jest właśnie to. Zdefiniowałem sobie grupę dla projektu OpenEJB, a drugą dla wtyczki MRRP. Pamiętam podobną funkcjonalność z IntelliJ IDEA, gdzie bodajże już w wersji 4 było to ciekawie rozwiązane, gdzie przełączenie to było jedynie ukrycie projektów, które de facto cały czas były otwarte, albo podobnie. W przypadku NetBeans Project Group działa podobnie. Chciałbym mieć możliwość otwarcia grupy w osobnym oknie NetBeans, więc nie do końca byłem zachwycony, ale ogólnie ocena 4+.

14 września 2007

XV spotkanie Warszawskiej Grupy Użytkowników Technologii Java (Warszawa JUG)

2 komentarzy
Warszawska Grupa Użytkowników Technologii Java (Warszawa JUG) zaprasza na XV spotkanie, które odbędzie się w nadchodzący wtorek 18.09.2007 o godzinie 18:00 w sali 4420 na Wydziale MIMUW przy ul. Banacha 2 w Warszawie.

Temat prezentacji: Wykorzystanie siły Aspect-Oriented Programming (AOP) w projektach komercyjnych
Prowadzący: Bartosz Szkudlarek

Tematem prezentacji będą zagadnienia związane z Aspect-Oriented Programming (AOP). Paradygmat ten, coraz bardziej popularny, powoli asymilowany jest przez rozwiązania korporacyjne. Celem prezentacji będzie wprowadzenie słuchaczy w główne pojęcia AOP, przedstawienie kluczowych koncepcji i głównych implementacji. Oprócz teorii będzie też kilka przykładów wykorzystania paradygmatu AOP w powiązaniu ze Spring Framework.

Prezentację poprowadzi Bartosz Szkudlarek. Bartek pracuje dla korporacji mocno powiązanej z Ryszardem K. i jest tam głównym architektem. W chwili obecnej realizuje projekt dla dużej firmy ubezpieczeniowej. Z Java EE związany jest od siedmiu lat.

Planowany czas prezentacji to 1,5 godziny z 30-minutową dyskusją. Na zakończenie planowana jest dyskusja dotycząca organizacji konferencji WarsJava organizowanej przez Warszawa JUG.

Zapraszam w imieniu Warszawa JUG!

06 września 2007

Tworzenie aplikacji Java EE 5 z NetBeans IDE 6.0 i GlassFish v2

0 komentarzy
Poprzedni artykuł Tworzenie aplikacji EJB 3.0 z GlassFish v2, Apache Maven 2 i NetBeans IDE 6.0 przedstawił proces tworzenia aplikacji EJB 3.0 z kilkoma narzędziami wspierającymi tworzenie oprogramowania zgodnego ze specyfikacją Korporacyjnej Javy (Java EE 5). Artykuł uzmysłowił mi potrzebę skrócenia czasu tworzenia aplikacji korporacyjnej do niezbędnego minimum. Postanowiłem iść dalej i spróbować stworzyć aplikację Java EE korzystając wyłącznie z pomocników (ang. wizards) dostarczanych przez NetBeans IDE 6.0. Jako aplikację do utworzenia wybrałem książkę telefoniczną bazując na przykładzie zaczerpniętym z dokumentacji serwera aplikacyjnego Apache Geronimo - Very simple Entity EJB example. Celem było zminimalizowanie koniecznych modyfikacji wykonywanych manualnie na rzecz wykorzystania możliwości środowiska graficznego NetBeans IDE 6.0 oraz technologiczne uatrakcyjnienie przykładu opisanego na wspomnianej stronie (co powinno zostać odzwierciedlone również na niej samej w kontekście użycia Apache Geronimo).

W takim klimacie przyszło mi napisać nowy artykuł Tworzenie aplikacji Java EE 5 z NetBeans IDE 6.0 i GlassFish v2, w którym krok po kroku przedstawiłem proces tworzenia aplikacji Java EE 5 z minimalnym użyciem klawiatury. Jest to pełna aplikacja korzystająca z JSF, EJB3 oraz JPA. Czekam na sugestię rozszerzenia przykładu. Dodatkowo mile widziane podpowiedzi jeszcze bardziej skrócające czas niezbędny do zbudowania aplikacji Java EE 5 z NetBeans IDE 6.0. Chętnie usłyszę o doświadczeniach z innymi IDE.

Pora na zestawienie podobnego 10-minutowego przykładu z Eclipse IDE 3.3 albo jakimś rozszerzeniem Eclipse'a, np. RedHat Developer Studio. Przykład z pewnością uruchomię na Apache Geronimo v2 z wtyczką Geronimo Eclipse Plugin.

03 września 2007

Tworzenie aplikacji EJB 3.0 z GlassFish v2, Apache Maven 2 i NetBeans IDE 6.0

2 komentarzy
Podczas rozpracowywania tematu potencjalnego błędu w Apache OpenEJB postanowiłem rozpoznać możliwości zestawienia środowiska uruchomieniowego do przeprowadzenia testów z wykorzystaniem jakiegoś IDE oraz Apache Maven 2. Eclipse IDE z wtyczką do m2 nie wspierał projektów złożonych, tj. projekt macierzysty projektu wielomodułowego nie był możliwy do zarządzania z poziomu IDE, więc odpadł na starcie. Postanowiłem spróbować się z IntelliJ IDEA 7.0M2. Po kilku próbach z IntelliJ IDEA jego możliwości również nie przypadły mi do gustu - coś nie tak z zarządzaniem katalogami źródłowymi. Został mi NetBeans IDE 6.0, który mimo początkowej niechęci pamiętając możliwości jego wtyczki Mevenide-NetBeans, okazał się być najlepszym wyborem. A i elementy graficzne zmieniły się na lepsze.

Przemyślenia i poszczególne kroki w zestawieniu środowiska opisałem w artykule Tworzenie aplikacji EJB 3.0 z GlassFish v2, Apache Maven 2 i NetBeans IDE 6.0. Nie jest to doskonałe rozwiązanie, ale jego prostota (mimo pewnej niedoskonałości) bardzo mnie urzekła i postanowiłem je opisać. Na zakończenie artykułu zostawiłem pytanie do rozwiązania. Jeśli są osoby skłonne podzielić się ze mną potencjalnym rozwiązaniem zapraszam do kontaktu.

p.s. Dzięki uprzejmości Marcina Molaka mam możliwość dokończenia lektury artykułów w ostatnim wrześniowym Software Developer's Journal. Już nie mogę doczekać się, aby przeczytać o ASM i JBoss Seam.

I tak stałem się NetCAT 6.0 applicant!

1 komentarzy
Właśnie przed momentem przeglądając skrzynkę pocztową natrafiłem na długooczekiwaną wiadomość:

Dear NetCAT 6.0 applicant,

Congratulations! You have been selected to participate in the NetBeans 6.0 Community Acceptance Testing program. The response to the program announcement was very high so the selection process was difficult at best, but your experience and testing offer met our selection criteria.

i tak dalej. Fajnie! Zamierzam skorzystać z okazji i przetestować wsparcie dla Java EE oraz tworzenia wtyczek i tym samym zakończyć tworzenie wtyczki NetBeans dla Geronimo.

01 września 2007

Powrót - zestaw ciekawostek z serii "Co się działo w Sieci, kiedy plażowałem"

1 komentarzy
I jestem z powrotem! Wiele się wydarzyło w międzyczasie. Przede wszystkim doczekałem się wydania Apache Geronimo 2.0.1 - serwera aplikacyjnego w 100% zgodnego ze specyfikacją Korporacyjnej 5-tki (Java EE 5) na licencji ASF 2.0 (lista dostępnych certyfikowanych implementacji znajduje się na stronie Java EE 5 Compatible Implementations). Zauważam brak przykładów z wykorzystaniem Geronimo i zamierzam tę sytuację wkrótce zmienić. Pytania o konfigurację Geronimo na pl.comp.lang.java dodatkowo mnie w tym utwierdziły.

W czasie mojej przerwy znalazłem czas na lekturę zaległych książek, m.in. Enterprise JavaBeans 3.0 wydanie 5. autorstwa Bill Burke oraz Richard Monson-Haefel. Autorzy to weterani rynku rozwiązań EJB począwszy od wersji 1.0, więc dobra zabawa gwarantowana. Pierwszy z nich - Bill to głównodowodzący projektem JBoss AS, w tym i kontenera EJB, a Richard był założycielem projektu Apache OpenEJB (jeszcze zanim ktokolwiek myślał o przystąpieniu do Apache Software Foundation), który jest implementacją specyfikacji EJB3. Odzwyczaiłem się od czytania książek informatycznych bez dostępu do komputera, więc jest to dla mnie nie lada wyzwanie. Książka wciąga, wyjaśnia zawiłości EJB3, jednakże nie uchroniła się od wielu merytorycznych błędów, w których prym wiedzie wykorzystanie konwencji zapytania JPQL (aka EJBQL) bazując na uproszczonej notacji dostępnej w Hibernate, czyli zapytania bez obowiązkowej klauzuli SELECT, np. FROM Employee e. W EJBQL jest to niedopuszczalne, podczas gdy Hibernate EntityManager pozwala na takie uproszczenia. Uwag jest wiele, ale nie zamierzam ich publikować zanim nie zakończę lektury książki i planuję przedstawić je w postaci recenzji (w ten sposób jako grupa Warszawa JUG mamy prawo o ubieganie się o kolejne pozycje całkowicie za darmo. Zapraszam do Biblioteki Warszawskiego JUGa). A na zakończenie promocji książki dodam, że wyszło jej polskie tłumaczenie - Enterprise JavaBeans 3.0. Wydanie V wydawnictwa Helion. Patrząc na oceny polskiego tłumaczenia książki - jedna trójka - zastanawiam się, czy głosowano na jakość tłumaczenia, czy samej merytorycznej zawartości książki? W/g mnie ocena nieadekwatna względem wydania angielskojęzycznego. Książkę widziałem w piątek w Traffic Club na Brackiej (Warszawa).

Właśnie dzisiaj zgłoszono problem z implementacją EJB 3.0 w wykonaniu Apache Geronimo 2.0.1, a właściwie Apache OpenEJB, który jest kontenerem EJB 3.0 w Geronimo - Stateless Session EJBs cannot contain a remove() method. Postanowiłem tym samym upiec dwie pieczenie na jednym ogniu (dla dociekliwych wersja angielska tego powiedzenia nie dotyczy pieczeni a ptaków i rzucania w nich kamieniami: kill two birds with one stone) - doszukać się informacji o metodzie remove() i napisać poprawkę. Padło na rozdział 3 zatytułowany Strona kliencka ziarna sesyjnego specyfikacji EJB Core Contracts and Requirements. Specyfikacja EJB Core Contracts and Requirements jest podstawowym źródłem wiedzy nt. EJB3, a w razie niejasności wyjaśnieniem służy implementacja referencyjna (ang. reference implementation) w postaci serwera GlassFish. Nim się również zajmę, aby przygotować przykład demonstrujący użycie, bądź jego braku, metody remove() jako metody biznesowej (wciąż nie wiem, czy użycie remove w tym trybie jest możliwe). Zacznę od specyfikacji, ale już nie dzisiaj (urlop rozleniwia).

Natrafiłem dzisiaj w Empiku na gazetę Software Developer's Journal wydanie wrześniowe i nie ukrywam, że zawarte tematy wydały mi się warte jej zakupienia, przede wszystkim ASM i JBoss Seam (nie, nie kupiłem ostatecznie jej, ale to inna historia). Zacząłem czytać o ASMie i przypomniała mi się prezentacja Piotra Kobzdy na JAVArsovi (wciąż czekam na trochę czasu, aby poważniej przyjrzeć się ASM, a Piotrek przedstawił temat w bardzo przystępny sposób). Pozostałe artykuły z dużym zainteresowaniem przejrzałem. Ech, gdyby nie córka, która mnie wygnała z Empiku, przeczytałbym gazetę od deski do deski. Piotr Maj zwykł przedstawiać recenzję gazety na Java Developer's Network, więc tylko czekać na jego powrót z wakacji i zapoznać się z jego spojrzeniem na zawartą tematykę.

Nadeszła pora, aby pomyśleć o kolejnych spotkaniach Warszawa JUG i przyszłej jesiennej konferencji. Jest już nazwa, więc pozostaje zarezerwować domenę i ogłosić przygotowania. Niebawem więcej informacji.

Skoro przy konferencjach, to nadchodzi Java Developers Day 2007 - 26. października w Krakowie. Po powrocie z urlopu znalazłem zaproszenie na konferencję od organizatorów i to w roli prelegenta!

Słyszeliśmy o Pana świetnym wystąpieniu na SFI w Krakowie i w związku z tym zastanawiamy się, czy nie ma Pan ciekawego pomysłu na prezentację podczas naszej konferencji. Gdyby był Pan zainteresowany, proszę o kontakt.

Zabawny jest fakt, że dzień wcześniej dowiedziałem się o organizacji JDD 2007 i zastanawiałem się jakby tu przekonać organizatorów o moim udziale i jakie tematy zaprezentować. Szczęśliwie nie musiałem długo myśleć o wymyślnych technikach perswazji i ostatecznie zaproponowałem 3 tematy:
  • Tworzenie aplikacji Java EE z Apache Geronimo 2
  • Technologiczna strona SOA - Service Component Architecture w wykonaniu Apache Tuscany
  • Tworzenie wtyczek Apache Maven 2 w języku Groovy
Co będzie prezentowane jeszcze nie wiem, ale pracuję nad prezentacją wszystkich 3 tematów. Właśnie! Powinienem wysłać abstrakty do akceptacji. A może jest potrzeba innych tematów zaprezentowanych na żywo? Zamieniam się w słuch.

I na koniec - na prośbę Adama Czyściaka - pojawił się egzamin Sun Certified Enterprise Architect (SCEA) 5 i to całkowicie za darmo - FREE: SCEA 5 Beta Certification Exam (Three Parts). Na razie w wersji BETA, ale podobnie jak miało to miejsce podczas bety SCBCD5 zaliczenie egzaminu to zaliczenie jego wersji finalnej. Warto rozważyć uczestnictwo w egzaminie, skoro jest za darmo, nieprawdaż? Pisze się ktoś? Ja na pewno!

I mimo, że raz już zadeklarowałem koniec tym razem temat na koniec - NetCAT 6.0, czyli NetBeans 6.0 Community Acceptance Testing (NetCAT). Uczestniczyłem w NetCAT 5.0, 5.5, więc i tym razem nie mogłem odmówić sobie przyjemności zgłoszenia swojej kandydatury do programu. Ogłoszenie nominowanych odbędzie się w nadchodzący poniedziałek. Czekam z niecierpliwością, choć nie z założonymi rękoma.

Wyszła również wersja finalna GWT 1.4, ale skoro miał być koniec to kończę. O pozostałych ciekawostkach później - będzie jeszcze sporo czasu.

Tym samym kończę swoje urlopowanie. Zakasuję rękawy - zabieram się za kontynuowanie rozpoznania EJB3 i wzbudzenie Warszawa JUG z wakacyjnego letargu.