26 czerwca 2007

SCAlanie z JAX-WS

0 komentarzy
Podczas ostatniej konferencji Integracja Systemów Informatycznych (ISI) organizowanej przez Software-Konferencje miałem okazję prezentować technologię Service Component Architecture (SCA). W poprzednich artykułach - SCAlenie (kompozyt) z Apache Tuscany i Apache Maven oraz SCA z językami skryptowymi w wykonaniu Apache Tuscany, Jetty i Maven 2 - korzystałem z języka silnie-typowanego Java i języka skryptowego Groovy do integrowania usług w postaci SCAleń. Tematem mojej prezentacji na ISI było przedstawienie SCA do tworzenia SCAleń w oparciu o usługę zdalną zbudowaną za pomocą JAX-WS. Prezentacja przyczyniła się do napisania kolejnego artykułu o SCA z JAX-WS - SCAlanie z JAX-WS.

Poprzednie artykuły o SCA dotyczyły łączenia usług, które działały w ramach pojedyńczej wirtualnej maszyny Java (JVM). Rozproszenie usług było pozorne i często spotykałem się z uwagami, że nie prezentują niczego nowatorskiego, czego nie możnaby osiągnąć korzystając z tradycyjnych metod integracji. Artykuły skupiały się raczej na prostocie tworzenia usług korzystając z SCA oraz języków skryptowych niż na prostocie integracji usług rozproszonych.

W kolejnym artykule o SCA wychodzę poza ramy pojedyńczej wirtualnej maszyny i prezentuję integrację usług rozproszonych. Zestawiłem środowisko z dwoma serwerami aplikacyjnymi Jetty oraz GlassFish, w którym uruchamiam SCAlenie na jednym serwerze, składające się z usługi będącej usługą sieciową (ang. web service) uruchomioną na drugim. Istotą artykułu będzie zaprezentowanie deklaratywnego konstruowania SCAlenia poprzez definiowanie elementów składowych w deskryptorze XML w celu udostępnienia kolejnej, bardziej specjalizowanej funkcjonalności.

Na uwagę zasługuje prostota integracji zdalnej usługi podczas konstruowania SCAlenia. Jakby tego było mało - wciąż nie wyczerpałem możliwości oferowanych przez specyfikację SCA, a realizowanej przez Apache Tuscany. Szykuję się do skorzystania z EJB3, Spring Framework i JMS, a mówi się, że SCA to inne JBI, więc niedługo i tam trzeba będzie zajrzeć. Zastanawiam się, kiedy przyjdzie pora na Service Data Objects (SDO) - partnera technologicznego SCA.

24 czerwca 2007

Relacja z konferencji JAVArsovia - 1. konferencji Warszawa JUG

1 komentarzy

Impreza była świetna! A wszystko zaczęło się dokładnie 4 tygodni temu, kiedy podczas rozmowy w pizzerni w przerwie Java Technology Conference 2007 w Krakowie, Piotr Maj, na moje pytanie o konieczne sprawy do zorganizowania konferencji powiedział: Jeśli masz miejsce i prelegentów, to masz wszystko. To był dokładnie ten moment, kiedy zorientowałem się, że...jesteśmy gotowi. Po chwili zgłosili się Andrzej Szczodrak, Krzysiek Miśkiewicz i Jacek Lis, i to właśnie oni sprawili, że nie miałem wątpliwości, że Warszawa JUG zorganizuje konferencję. Po chwili pomysł podjął Waldi (= Waldemar Kot) i kiedy powiedział, że mógłby wystąpić, ale jedynie, kiedy konferencja odbędzie się pod koniec czerwca, miałem już i termin (nie pamiętam jednak dokładnie jak wyszło, że zdecydowaliśmy się na sobotę, a nie dni robocze). Następnego dnia wysłałem informacje o organizacji konferencji Warszawa JUG - JAVArsovia - Przygotowania do Konferencji dnia 23.06.2007 (sobota) - rozpoczynamy!.

Teraz z perspektywy czasu widzę, jak nie zdawałem sobie sprawy z bardzo krótkiego czasu na przygotowanie konferencji, ale jednego się nauczyłem i doświadczyłem na własnej skórze (i wierzę, że inni uczestniczący również - ukłony dla Michała Margiela) - jak się czegoś bardzo pragnie i wierzy się w to, to na pewno się uda. Bardzo oklepane stwierdzenie, ale przykład JAVArsovi pokazuje, że coś w tym jest.


1 czerwca na pokład organizatorów wszedł, jak się wkrótce okazało, głównodowodący całym przedsięwzięciem - Łukasz Świerczyński. W rozmowie Przygotowania do Konferencji dnia 23.06.2007 (sobota) - rozpoczynamy! wspomniał o temacie sponsorów. Jak widać po godzinie wysłania wiadomości 21:20 była to godzina, która przypominała o ilości dni jakie zostały na przygotowywanie konferencji - zostało 21 dni, 20, i tak kolejno, aż do 23.06.


9 czerwca mieliśmy już zaintrygowanego konferencją Szimano (= Tomek Szymański), więc nie było wątpliwości, że się uda. Jak się później okazało i Tomek i Michał wygodnie rozsiadli się w Loży Szyderców i mimo, że wydaje się to być sprawą trywialną, ich pomoc okazała się nieoceniona. Uwagi odnośnie projektu plakatu i innych gadżetów około-konferencyjnych były nieocenione.


Kilka listów do potencjalnych prelegentów i okazało się, że 12 czerwca wiedzieliśmy o pełnym składzie osobowym, a wśród 7-miu Wspaniałych pojawili się (kolejność według godzin prelekcji, najpierw sesja 1., a później 2.): Andrzej Szczodrak, Krzysztof Miśkiewicz, Jacek Lis, Piotr Kobzda, Patrick Linskey, Waldemar Kot i Tomasz Słota. Taa, Piotr i Tomek pojawili się całkiem niespodziewanie. Piotrek namawiany przeze mnie podczas krakowskiego JavaTechConf o prezentację tematu ASM i cglib w końcu uległ moim obietnicom sławy i chwały, a przede wszystkim zapewnieniom, że jest jedyną osobą, która w sposób ciekawy i zrozumiały wytłumaczy społeczności Javy, jak na prawdę działa Java. Zapewne niejeden SCJP-owicz na oczy nie widział bajtkodu, nie wspominając już o jego modyfikacji i zabiegani w technologiach wyższego poziomu zapominamy o podstawach. Wrócimy do Piotra niebawem.
Tomek to inna liga - NetBeans IDE wciąż mocny i mimo wciąż rosnącej popularności Eclipse IDE oraz wsparcia przez komercyjnych dostawców, nie wydaje się odpuszczać. Mimo komentarza Tomka o 6.0M10, która ma być najbardziej niestabilnym wydaniem NetBeans IDE w historii, to pamiętając ostatnie wydarzenia wokół Eclipse IDE 3.3rc, gdzie konieczne było wydanie kolejnej wersji w przeciągu tygodnia, może to oznaczać jedno - więcej funkcjonalności być może początkowo za cenę pewnej niestabilności (co dokładnie oznacza niestabilność w tym kontekście pozostawiam intuicji czytelników). Cena ciągłego wdrażania uproszczeń i innowacji. Eclipse IDE i NetBeans IDE wchodzą w kluczową fazę swego rozwoju - przygotowanie do wydania finalnej wersji, więc zaczyna się ciekawy okres dla korzystających z tych środowisk. Tomek przybył w samą porę, aby zaprezentować możliwości NetBeans i dlaczego w jego opinii tworzenie aplikacji przy użyciu NetBeans RCP jest prostsze niż z wykorzystaniem Eclipse SWT. Okazało się, że przez długi czas Tomek parał się Eclipse SWT, więc wydaje, że wie o czym mówi.


Ciekawa było również historia zaproszenia Patricka Linskey. Kiedy podczas konferencji JAOO'06 w Danii spotkałem się z nim zapytałem go o możliwość przybycia na konferencję do Polski, na co odpowiedział bez wahania, że nie ma sprawy - wystarczy jak napiszę do niego odpowiednio wcześniej (chyba, wtedy nie przypuszczał jeszcze, że kiedykolwiek przyjdzie mu zrealizować swoją obietnicę). Kiedy napisałem do Patricka z zaproszeniem na JAVArsovia, na 3 tygodnie przed konferencją, okazało się, że Patrick planował turnee po Europie, na konferencjach SpringOne w Brukseli oraz TSS w Barcelonie, więc może przyjechać do nas w przerwie między nimi. A JAVArsovia wypadła dokładnie między SpringOne oraz TSS. Nie udało się dokładnie wycelować w termin jednakże, ponieważ od niedzieli zaczyna się Jazoon w Szwajcarii, ale okazało się, że nie przeszkodziło to Patrickowi przybyć do nas. Z Patrickiem konferencja nabrała rumieńców.


W międzyczasie odezwał się Rafał Miłobędzki (mily), który zgodził się wydrukować nam 5-10 sztuk plakatu w formacie A0. Ten format był dla mnie powodem lekkiej palpitacji serca, kiedy go zobaczyłem. Otrzymaliśmy 10 sztuk plakatu do rozwieszenia i kiedy go rozwieszałem uzmysłowiłem sobie jaki on jest wielki. Był równie wielki jak inne, największe plakaty w miejscach, w których je wieszałem - MIMUW, PW, PJWSTK, WAT, IBM.


I nie mógłbym zapomnieć o koszulkach. Tak, dzięki Mariuszowi Wójcikowi, sprawa koszulek doczekała się szczęśliwego końca. Na przeddzień konferencji odebrałem je od producenta i wtedy już nie było wątpliwości - jesteśmy gotowi.

Pozostało potwierdzić gotowość prelegentów i zaczynać zabawę.

Nadszedł dzień próby - 23.06. O 8:15 byłem na MIMUWie. Nie było upalnie, więc brak klimatyzowanych sal, nie stanowił problemu. Tym razem wystąpiłem na konferencji w roli współorganizatora, więc dla mnie temperatura była do zniesienia (chociaż do samego końca nie mogłem pogodzić się, że nie wystąpię, co oczywiście zrekompensowałem sobie przemówieniami w międzyczasie ;-)). Prelegenci byli we wszystkich możliwych stanach uniesienia - niektórzy chcieli nawet czmychnąć (ukłony do Jacka ;-)), ale byli i tacy, którzy, aby ukryć swoje przejęcie postanowili wykładać w innym języku (ukłony dla Patricka).
Okazało się, że byli i tacy zdesperowani uczestnictwem w konferencji, że przybyli na konferencję z dalszych części Polski - Koszalin, Szczecin, Łódź, Skierniewice, Grodzisk (bodajże Mazowiecki) oraz Marki, ale również z Kielc (naszych dwóch prezenterów - Andrzej i Krzysiek - ukłony dla Was Panowie) oraz...właśnie skąd jest Piotr Kobzda...bodajże Opole?


W najbardziej zatłoczonym momencie konferencji naliczyłem 120 osób. Czy to jest dużo? Hmmm, szczerze, to sądziłem, że jesteśmy w stanie zainteresować większą liczbę użytkowników Javy (przyznaję, że marzyło mi się o 200 i nawet zacząłem się martwić o możliwości sal), ale mówi się, że przy takim czasie realizacji pomysłu, powinniśmy być z siebie dumni. Kolejne dni pokażą, co było powodem, czy niewielka reklama konferencji, czy termin - sobota. Wiele głosów było za organizacją konferencji w czasie dni roboczych, zamiast wolnych. Oczywiście wszystko zależy do kogo kierujemy konferencję i będę dopytywał się tu i tam, jaki powinien być ten termin, aby optymalnie dobrać czas realizacji kolejnej edycji. Zaskoczył mnie ostatnio termin Jazoon - od niedzieli do czwartku. Niedziela na pewno nie wchodzi w rachubę u nas (żony bacznie obserwują nasz każdy krok, nieprawdaż?).


A czy ja przypadkiem nie zapomniałem o najważniejszym?! A co ze sponsorami? Właśnie! Dzięki Łukaszowi udało nam się zainteresować konferencją kilku graczy na rynku IT, którzy zechcieli nas wesprzeć. Zacznijmy od głównego sponsora konferencji JAVArsovia - TouK. Dzięki firmie Touk impreza zakończyła się jeszcze huczniejszą imprezą w pobliskim Equilibrium na Niepodległości (nota bene nazwa, która nierozerwalnie kojarzy mi się z załogą z Łodzi). Było kilka kolejek złocistego napoju i kiedy opuszczałem lokal o 20, nie zapowiadało się na szybkie zakończenie. Łukasz dzwonił do mnie koło północy, więc można sobie tylko wyobrazić jakie ważkie tematy Javowe były poruszane ;-) Wszystko dzięki Touk. Ale nie tylko. Na scenie sponsorów można było zobaczyć również firmę Javart oraz Cyberware. Obie przyczyniły się do podniesienia atrakcyjności konferencji przez pokrycie kosztów koszulek, wody oraz projektu graficznego plakatu. Z pewnością nasza współpraca z TouK, Cyberware oraz Javart będzie trwała dalej. Wierzę, że przyniesie to obopólne korzyści.


I na zakończenie, dla podkreślenia znaczenia (zgodnie z angielskim the last but not least), należy wspomnieć o pomocy pracowników wydziału MIMUW w organizacji konferencji - pana dr. Janusza Jabłonowskiego oraz prof. Krzysztofa Diksa. Nie mógłbym nie wspomnieć również o zasłudze najwyższych władz wydziału - pana Dziekana MIMUW - prof. Pawła Strzeleckiego oraz prezesa PTM, poprzedniego dziekana MIM UW - prof. Stefana Jackowskiego, który w ostatnim momencie zgodził się na przeniesienie posiedzenia Polskiego Towarzystwa Matematycznego (PTM) do innej sali pozwalając nam na skorzystanie z dużej sali Rady Wydziału - 2180. Pomoc pracowników MIMUW (tych wymienionych z nazwiska, ale również wielu innych) pozwoliła nam na pomyślne przeprowadzenie konferencji JAVArsovia i sądzę, że będzie przyczynkiem do dalszej owocnej współpracy. W końcu tylko dzięki nim Warszawa JUG może kontynuować co-dwutygodniowe spotkania w sali wydziału i realizować pomysły takie jak organizacja konferencji.


Ukłony dla wszystkich, których nie wymieniłem, a powinienem. W głowie mi jeszcze huczy po wczorajszych uniesieniach, kiedy wspólnie z uczestnikami mogłem cieszyć się integracją społeczności Java w Polsce, więc wybaczcie chwilowe zaniki pamięci. 1 edycja konferencji JAVArsovia wydaje się być wspaniałym rozpoczęciem na stworzenie czegoś na miarę belgijskiego JavaPolis, barcelońskiego TSS, czy zuryskiego Jazoon - 2-3-dniowej konferencji w Warszawie organizowanej przez Warszawa JUG i zaprzyjaźnione JUGi (pozdrawiam filię z Krakowa ;-)). Gdyby udało nam się zewrzeć szyki PWr JUG, Poznań JUG, Kraków JUG i Warszawa JUG, to jesteśmy w stanie zorganizować coś wielodniowego już niebawem. I już mi sie rozmarzyło. Uwaga - choroba o dźwięcznej nazwie konferencjomania szybko się rozprzestrzenia, a biorąc pod uwagę organizację JAVArsovii przez 4 tygodnie, może 2-3-dniową konferencję udałoby się zestawić w 2 (!) Nie, zapewniam, że nie dałoby się. Żartowałem ;-)


Zdjęcia z konferencji znajdują się na stronie JAVArsovia - 23.06.2007.

Do następnej konferencji JAVArsovia! A już niebawem spotkanie Warszawa JUG!

22 czerwca 2007

JAVArsovia już jutro!

1 komentarzy
Zatem JAVArsovia to już nie mit, ale fakt. Jutro, od 9:00 do 17:00, gmach MIMUW na ulicy Banacha 2 zamienia się w centrum konferencyjne, gdzie 7 śmiałków podejmie się wyzwania przedstawienia technologii Java począwszy od Classages i RelJ, Stripes, Pitchfork, JPA, JBoss Seam, ASM i cglib oraz NetBeans IDE. Sale czekają, plakaty rozwieszone, ogłoszenia rozesłane, koszulki się drukują, piwo na wczesnowieczorne dokończenie konferencji już się chłodzi. Pozostaje zebrać wszystkich i rozpocząć. Wszystkie informacje z ostatniej chwili zamieszczane są na stronie konferencji JAVArsovia. Gorąco zachęcam do uczestnictwa!

Motto na dzisiejszy wieczór: Ciekawe o czym zapomnieliśmy przy organizacji konferencji?!

17 czerwca 2007

Tworzenie aplikacji z JavaServer Faces, Apache Maven i Apache Geronimo

3 komentarzy
Długo trwało zanim Apache Geronimo otrzymał certyfikację serwera aplikacyjnego w 100% zgodnego ze specyfikacją Java Enterprise Edition 5. W końcu jednak do tego doszło i pora na trochę reklamy produktu, i przybliżenie go polskiej społeczności Java.

Właśnie ukończonym artykułem Tworzenie aplikacji z JavaServer Faces, Apache Maven i Apache Geronimo rozpoczynam serię artykułów przedstawiających jego możliwości. Rozpoczniemy delikatnie - od stworzenia aplikacji korzystającej z JavaServer Faces 1.2 oraz wtyczki Apache Maven do Apache Geronimo 2.0. Sama aplikacja nie jest niczym oszałamiającym, ale pozwala na przygotowanie punktu wyjściowego do poznawania bardziej zaawansowanych elementów Java EE 5 w wykonaniu Apache Geronimo. Połączyłem tym samym przyjemne z pożytecznym i wierzę, że udało mi się zaprezentować coś dla adeptów Java EE 5 jak i osób zaawansowanych w tej technologii, jednakże nie mających do tej pory okazji popracować z Apache Geronimo. Tak wiele bolesnych doświadczeń przechodzą ostatnio twórcy aplikacji pracujący z bardzo popularnym serwerem aplikacyjnym JBoss AS 4, który nadal nie dostarcza tego, czego jego twórcy byli główną siłą napędową - dobrodziejstw płynących ze stosowania rozwiązań Java EE 5 i dla nich szczególnie dedykuję ten artykuł - dla złagodzenia ich cierpienia ;-) Zobaczmy w praktyce, co ciekawego może nam zaproponować trio Java EE 5, Apache Geronimo 2.0M6 i Apache Maven 2.

16 czerwca 2007

f:view beforePhase i wywołanie metody przed wyświetleniem strony w JSF

2 komentarzy
Często przyglądam się dyskusjom na pl.comp.lang.java i są one świetną inspiracją do zgłębiania tajników specyfikacji Java EE 5. Wiele razy można przeczytać ciekawe spostrzeżenia ludzi na codzień zajmujących się tematami, które mnie interesują.

Ostatnio dużo było pytań i dyskusji nt. JPA i EJB 3 i już myślałem, że JSF całkowicie poszedł w odstawkę, kiedy rozgorzała dyskusja na temat możliwości wywoływania metod przed uruchomieniem strony JSF w wątku JSF dynamiczne inicjalizowanie zmiennych autorstwa melona. Początkowo miałem kilka pomysłów na rozwiązanie tematu, ale jak się okazało w JSF 1.2 pojawiła się ciekawsza opcja - wprowadzono nowy atrybut beforePhase do elementu f:view.

Czując słabnącą pozycję JSF w uproszczeniu życia twórcy aplikacji internetowych podczas dyskusji i ostatecznie sprowokowany stwierdzeniem Piotra Nowaka:

W asp.net jest to banalnie rozwiazane, mianowicie callback Page_load jest wywolywany przy kazdym wejsciu na strone, ciekawe dlaczego w jsf nie ma czegos takiego, tylko trzeba stosowac jakies hacki..

, postanowiłem przeszukać specyfikację JSF 1.2 w celu odnalezienia odpowiedzi. Nie chciało mi się wierzyć, że skoro istnieje coś w ASP.Net to nie ma tego w JSF 1.2. Nie długo trwało, kiedy podczas lektury zmian między JSF 1.1 a 1.2 (rozdział What’s Changed Since the Last Release) przeczytałem o nowych metodach klasy javax.faces.component.UIViewRoot. W szczególności jedna z nich wzbudziła moją ciekawość - UIViewRoot.getBeforePhaseListener. Krótki rekonesans po dokumentacji javadoc metody, gdzie mogłem przeczytać:

getBeforePhaseListener

public MethodExpression getBeforePhaseListener()
Returns:
the MethodExpression that will be invoked before this view is rendered.

i już wiedziałem, że jest to dokładnie to, czego szukałem. Klasy nasłuchujące zdarzeń związanych z etapami przetwarzania zlecenia JSF - javax.faces.event.PhaseListener - rejestrowane są m.in. w pliku faces-config.xml. Skoro tak, pomyślałem, to może i znajdę coś związanego ze wspomnianą metodą. Postanowiłem przeszukać specyfikację pod kątem klasy UIViewRoot i po chwili natrafiłem na rozdział 4.1.17 UIViewRoot, a tam na sekcję 4.1.17.2 Properties, gdzie moim oczom ukazała się właściwość beforePhaseListener, która może być również ustawiana per strona w znaczniku <f:view> za pomocą atrybutu beforePhase. Jeśli dodać do tego, że wartością właściwości jest wyrażenie wskazujące na metodę (typu javax.el.MethodExpression) to nie miałem już więcej złudzeń, że znalazłem rozwiązanie. Pozostało jedynie sprawdzić znalezisko w działaniu.

Szybko stworzyłem prostą aplikację JSF w NetBeans IDE 6, którą rozszerzyłem o następujące elementy.

1. Stworzyłem klasę pl.jaceklaskowski.jsf.PageLoadCallback

package pl.jaceklaskowski.jsf;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIOutput;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;

public class PageLoadCallback {

public void beforePhase(PhaseEvent event) {
FacesContext facesContext = event.getFacesContext();
facesContext.addMessage(null, new FacesMessage("Komunikat z PageLoadCallback.beforePhase"));
UIOutput outputText = (UIOutput) facesContext.getViewRoot().findComponent("komunikat");
outputText.setValue(outputText.getValue() + " (zmodyfikowano w PageLoadCallback.beforePhase)");
}

}
2. Zarejestrowałem powyższą klasę jako komponent zarządzany w faces-config.xml

<?xml version='1.0' encoding='UTF-8'?>

<faces-config version="1.2" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">

<managed-bean>
<managed-bean-name>pageLoadCallback</managed-bean-name>
<managed-bean-class>pl.jaceklaskowski.jsf.PageLoadCallback</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
</faces-config>

3. Użyłem atrybutu beforePhase w f:view ze wskazaniem na komponent zarządzany pageLoadCallback

<%@page contentType="text/html"%> <%@page pageEncoding="UTF-8"%>

<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%> <%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<f:view beforePhase="#{pageLoadCallback.beforePhase}">
<h1>
<h:outputText id="komunikat" value="JavaServer Faces" />
</h1>
<hr>
<h:messages layout="list" />
</f:view>
</body>
</html>

4. Uruchomiłem przykład na Apache Geronimo 2.0M6

A to jest właśnie efekt, którego poszukiwał melon. Dzięki za zwrócenie uwagi na tę kwestię!

11 czerwca 2007

JAVArsovia - I Konferencja Java organizowana przez Warszawa JUG

0 komentarzy
Nie wszystko jeszcze zestawione, ale idzie ku dobremu, więc, aby nie odkładać promocji na ostatnią chwilę, pora na publikację pomysłu Warszawa JUG - JAVArsovia.

Czym jest JAVArsovia? Jest to konferencja-warsztaty Java organizowana przez miłośników Javy dla miłośników Javy. Nie można było wyobrazić sobie lepszej konferencji jak tą, która byłaby ogranizowana przez samą społeczność Java. I oto jest - JAVArsovia.

Kiedy: 23 czerwca 2007 (sobota)
Gdzie: Warszawa, MIMUW, ul. Banacha 2

Wszystkie prelekcje będą czymś w rodzaju szkoleń-warsztatów prowadzonymi z otwartym IDE z niedużą dawką slajdów. Zakłada się, że prelegent będzie większość czasu siedział przez komputerem tworząc aplikację na żywo, która ma sprowokować do pytań i dyskusji. Każdy z prelegentów to osoba na codzień parająca się Javą, więc będzie ciekawie.

Jeśli są osoby, które byłyby zainteresowane zaprezentowaniem tematu związanego z Javą i zgadza się na charakter prezentacji (mało slajdów, dużo programowania na żywo) zapraszam do kontaktu. Chętnie poszukamy miejsca na kolejną prezentację w dotychczasowych sesjach, albo stworzymy nową. Wszystko da się zrobić. Oczywiście zgłoszenia na ostatnią chwilę są obłożone ryzykiem niepojawienia się na plakacie ;-)

Wszystkie informacje (albo ich zdecydowana większość) można znaleźć na stronie konferencji - http://www.JAVArsovia.org.pl.

Zapraszam w imieniu Warszawa JUG!

07 czerwca 2007

Java Persistence - 8.3 Adnotacje zapytań oraz elementy deskryptora XML

0 komentarzy
Na grupie pl.comp.lang.java od czasu do czasu podnoszona jest dyskusja o stosowaniu Hibernate bezpośrednio a JPA (niekoniecznie z Hibernate jako dostawcą JPA). Ostatnia taka dyskusja Pytanko o Java Persistence API, gdzie 0x28and0x4 napisał:

W szczególności w OpenJPA nie mogę znaleźć mechanizmu "16.1.4. Returning multiple entities":
http://www.hibernate.org/hib_docs/v3/reference/en/html_single/#d0e13126

szczególnie mnie zaintrygowała. Odnotowałem sobie ten wątek do zbadania i tak to trwało, aż do dzisiaj, kiedy natrafiłem na bardzo podobne pytanie o adnotację @SqlResultSetMapping i zwracanie wielu encji przy jednym zapytaniu. Zacząłem czytać specyfikację i po chwili okazało się, że właśnie tego potrzebowałem na odpowiedź na wyżej postawione pytanie. Przyjrzyjmy się rozdziałowi 8.3 Adnotacje zapytań.

Na bazie lektury specyfikacji JPA utworzyłem dokument (ściągę) o adnotacjach JPA - Adnotacje Java Persistence.

Adnotacja @NamedQuery służy do określenia mianowanego zapytania JPQL (język zapytań Java Persistence). Adnotacja posiada element name, który przypisuje unikatowy identyfikator, który służy jako argument dla metody EntityManager.createNamedQuery(java.lang.String).

Adnotacja @NamedNativeQuery służy do określenia mianowanego zapytania SQL. Adnotacja posiada element name, który przypisuje unikatowy identyfikator, który służy jako argument dla metody EntityManager.createNamedQuery(java.lang.String).

Warto zauważyć, że metoda EntityManager.createNamedQuery(java.lang.String) przeznaczona jest do uruchomienia mianowanego zapytania JPQL oraz SQL.

Adnotacje @NamedQuery i @NamedQueries oraz @NamedNativeQuery i @NamedNativeQueries mogą być używane przy klasach encji lub zmapowanych nadklas.

Poza samą konstrukcją zapytania należy pamiętać, że nazwa zapytania (wartość parametru name) musi być unikatowa w całej jednostce trwałości (PU).

Rozdział 8.3.3 Adnotacje dla mapowania wyniku zapytania SQL specyfikacji JPA przedstawia adnotację @SqlResultSetMapping. Adnotacja @SqlResultSetMapping definiuje mapowanie wyniku zapytania SQL.

W rozdziale 10 Deskryptor XML znajduje się informacja, której potrzebowałem do odpowiedzi. W przypadku zapytania SQL, które zwraca wiele encji (rozłącznych w naszym przypadku) dobrym podejściem wydaje się być zastosowanie dekryptora XML - orm.xml do definicji globalnego zapytania (zamiast specyficznego dla danej encji).

Element sql-result-set-mapping jest opisany w specyfikacji JPA w sekcji 10.1.2.9 sql-result-set-mapping. Element sql-result-set-mapping jest globalny dla całej jednostki trwałości i nie ogranicza się wyłącznie dla pojedyńczej encji. Specyfikacja nie określa zachowania dostawcy JPA w przypadku wystąpienia kilku sql-result-set-mapping o tej samej nazwie w pojedyńczej jednostce trwałości.

Definicja sql-result-set-mapping rozszerza zbiór mapowań pobranych z adnotacji. Jeśli zdefiniowano mapowanie poprzez mechanizm adnotacji, to sql-result-set-mapping z deskryptora XML nadpisuje (przesłania) definicję.

Wracamy do rozdziału 3.6.6 Zapytania SQL, gdzie możemy rozszerzyć wiedzę o zapytaniach SQL. Najważniejsze jest, aby pamiętać, że encje zwrócone jako wynik zapytania mogą być różnego typu. Jeśli wiele encji jest zwracanych przez zapytanie, encje muszą być wymienione i zmapowane do wartości kolumn w zapytaniu poprzez adnotację @SqlResultSetMapping. Mapowanie jest wykorzystywane przez dostawcę JPA do odwzorowania wyników JDBC na odpowiadające im obiekty.

Stworzyłem przykład, który zobrazował mi treść specyfikacji. Utworzyłem dwie encje - DanePodstawowe oraz DaneRozszerzone, które reprezentowały informacje o pracowniku. Definicja tabeli, na którą mapowane były encje wygląda następująco:

CREATE TABLE PRACOWNICY (
NUMER integer PRIMARY KEY DEFAULT nextval('serial'),
IMIE varchar(20) NOT NULL,
NAZWISKO varchar(50) NOT NULL,
STANOWISKO varchar(50),
PENSJA NUMERIC(20, 2),
);

Pierwsza encja DanePodstawowe prezentuje się zwyczajnie:

package pl.jaceklaskowski.jpa.entity;

import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class DanePodstawowe implements Serializable {

private static final long serialVersionUID = 1L;

private int numer;
private String imie;
private String nazwisko;

@Id
public int getNumer() {
return numer;
}

public void setNumer(int numer) {
this.numer = numer;
}

public String getImie() {
return imie;
}

public void setImie(String imie) {
this.imie = imie;
}

public String getNazwisko() {
return nazwisko;
}

public void setNazwisko(String nazwisko) {
this.nazwisko = nazwisko;
}

}

Kolejna encja DaneRozszerzone wygląda tak:

package pl.jaceklaskowski.jpa.entity;

import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class DaneRozszerzone implements Serializable {
private static final long serialVersionUID = 1L;

private int numer;
private String stanowisko;
private double pensja;

@Id
public int getNumer() {
return numer;
}

public void setNumer(int numer) {
this.numer = numer;
}

public String getStanowisko() {
return stanowisko;
}

public void setStanowisko(String stanowisko) {
this.stanowisko = stanowisko;
}

public double getPensja() {
return pensja;
}

public void setPensja(double pensja) {
this.pensja = pensja;
}
}

Do encji dołączyłem deskryptor XML - orm.xml:

<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm" version="1.0">
<named-native-query name="pobierzDanePracownika" result-set-mapping="mapowanieDanychPracownikaPerTyp">
<query>SELECT numer AS n1, numer AS n2 FROM Pracownicy</query>
</named-native-query>
<sql-result-set-mapping name="mapowanieDanychPracownikaPerTyp">
<entity-result entity-class="pl.jaceklaskowski.jpa.entity.DanePodstawowe">
<field-result name="numer" column="n1"/>
</entity-result>
<entity-result entity-class="pl.jaceklaskowski.jpa.entity.DaneRozszerzone">
<field-result name="numer" column="n2"/>
</entity-result>
</sql-result-set-mapping>
</entity-mappings>

Na zakończenie sama klasa testu, która weryfikuje poprawność konfiguracji - SqlResultSetMappingTest.

package pl.jaceklaskowski.jpa.sqlresultsetmapping;

import java.util.List;

import javax.persistence.Query;

import org.testng.annotations.Test;

import pl.jaceklaskowski.jpa.BaseTest;
import pl.jaceklaskowski.jpa.entity.DanePodstawowe;
import pl.jaceklaskowski.jpa.entity.DaneRozszerzone;

public class SqlResultSetMappingTest extends BaseTest {
@Test(dependsOnMethods = { "utworzPracownikow" })
public void testNamedQuery() {
Query query = em.createNamedQuery("pobierzDanePracownika");
List dane = (List) query.getResultList();
assert dane.size() > 0;
final Object[] pierwszyWiersz = dane.get(0);
final Class clazz1 = pierwszyWiersz[0].getClass();
final Class clazz2 = pierwszyWiersz[1].getClass();
assert clazz1 == DanePodstawowe.class : clazz1;
assert clazz2 == DaneRozszerzone.class : clazz2;
}
}

Wykonanie testu nie pozostawia złudzeń, że wszystko jest w należytym porządku i temat został zrozumiany. Pozostaje jedynie nauczyć się adnotacji i elementów desktyptora XML na egzamin SCBCD 5 ;-)

jlaskowski@dev /cygdrive/c/projs/jpa
$ mvn -Popenjpa-postgres -Dtest=SqlResultSetMappingTest clean test
[INFO] Scanning for projects...
[INFO] ----------------------------------------------------------------------------
[INFO] Building jpa-query
[INFO] task-segment: [clean, test]
[INFO] ----------------------------------------------------------------------------
...
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running pl.jaceklaskowski.jpa.sqlresultsetmapping.SqlResultSetMappingTest
...
47 testPU INFO [main] openjpa.Runtime - Starting OpenJPA 1.0.0-SNAPSHOT
...
databaseProductName: PostgreSQL
databaseProductVersion: 8.2.3
driverName: PostgreSQL Native Driver
driverVersion: PostgreSQL 8.2 JDBC3 with SSL (build 504)
...
1313 testPU TRACE [main] openjpa.Query - Executing query: SELECT numer AS n1, numer AS n2 FROM Pracownicy
1344 testPU TRACE [main] openjpa.jdbc.SQL - executing prepstmnt 25567987 SELECT numer AS n1, numer AS n2 FROM Pracownicy
1344 testPU TRACE [main] openjpa.jdbc.SQL - [0 ms] spent
1359 testPU TRACE [main] openjpa.jdbc.JDBC - [0 ms] close
1375 testPU TRACE [main] openjpa.MetaData - Clearing metadata repository "org.apache.openjpa.jdbc.meta.MappingRepository@3ac93e".
1375 testPU TRACE [main] openjpa.MetaData - Clearing cache of parsed files in "org.apache.openjpa.persistence.jdbc.XMLPersistenceMappingParser@1722456".
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.703 sec

Results :

Tests run: 2, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 6 seconds
[INFO] Finished at: Thu Jun 07 15:45:36 CEST 2007
[INFO] Final Memory: 11M/254M
[INFO] ------------------------------------------------------------------------

05 czerwca 2007

Apache Geronimo 2.0-M6-rc1 w pełni zgodny z Java EE 5.0

6 komentarzy
Nie mogłem uwierzyć, kiedy członkowie grupy Apache Geronimo, którzy zajmowali się Java EE 5 TCK (Test Compatibility Kit) ogłosili, że wersja 2.0-M6-rc1 przeszła testy w 100%! Wersja do certyfikacji składa się z Apache Tomcat 6.0.13, Apache OpenJPA 1.0.0-SNAPSHOT i Apache CXF. Właśnie weryfikujemy jej zgodność z wymaganiami projektów pod parasolem ASF i rozpocznie się jego promocja. Nie tak dawno Apache MyFaces 1.2 ogłosiła zgodność z JSF TCK, później Apache OpenJPA 1.0.0 z JPA TCK, a teraz Apache Geronimo 2.0, które korzysta ze wspomnianych projektów do realizacji specyficznych części specyfikacji Java EE 5. Jak się można domyślać następne dni zamierzam spędzić właśnie nad przedstawieniem Geronimo polskiej społeczności Java. Kilka słów wprowadzenia w postaci przykładów dobrze zrobi na przypomnienie roli Apache Geronimo w świecie rozwiązań korporacyjnych Java. A JBoss AS jeszcze w tyle...

03 czerwca 2007

Tworzenie usługi sieciowej z JAX-WS

0 komentarzy
W zasadzie tyle rzeczy przyczyniło się do utworzenia kolejnego artykułu nt. JAX-WS - Tworzenie usługi sieciowej z JAX-WS, że nie wiem od czego zacząć. Może niech będzie od najważniejszej - zaproszenie na prezentację podczas konferencji Integracja systemów informatycznych GigaCon 19 czerwca 2007.

Było to jeszcze w maju, kiedy pani Maria Bombała z Software-Konferencje napisała do mnie z propozycją wystąpienia na konferencji, a kiedy ja po raz pierwszy zabrałem się za specyfikację Service Component Architecture (SCA) i projekt Apache Tuscany. W wyniku ewaluacji udało mi się napisać 2 artykuły o SCA - SCAlenie (kompozyt) z Apache Tuscany i Apache Maven oraz SCA z językami skryptowymi w wykonaniu Apache Tuscany, Jetty i Maven 2 i jako niespodzianka wystąpiłem na zajęciach Jacka Sroki na MIMUW, więc miałem wszystko na prezentację o SCA (slajdy, aplikację, wystarczającą ilość wiedzy). Bez wahania przyjąłem zaproszenie. Trochę mnie zmroziło, kiedy zobaczyłem do kogo adresowana jest konferencja - szefów działów IT, kierowników projektów wdrożeniowych, analityków i inżynierów systemowych, projektantów systemów i programistów, ale nie ma to jak próbować się z technologią i przedstawiać ją osobom, które mogą odpowiadać za jej wdrożenie w projektach, więc jeśli ma być więcej SCA w projektach, to właśnie ich należy przekonać do jej stosowania. Zaproszenie zostało przyjęte i przygotowania trwają. Temat prezentacji - SCAlanie w SOA, czyli integracja według Service Component Architecure (SCA). Wszystkich serdecznie zapraszam do udziału i przygotowania zestawu pytań, które wystawią moją wiedzę na próbę. W zanadrzu mam odpowiedzi w stylu Nie wiem, Chyba tak, itp., więc się nie lękam ;-)

Od kilku tygodni zabierałem się za ewaluację Apache CXF i właśnie wczoraj, a może i przedwczoraj, natrafiłem na odnośnik do dokumentacji CXF - Developing a Service using JAX-WS, a tam na uwagę For new development the preferred path is to design your services in WSDL and then generate the code to implement them, czyli nowicjusze zaczynają od WSDL, a to dokładnie o mnie. Hmm, pomyślałem, potrzebuję edytora do WSDL i najlepiej, aby był dostępny w Eclipse IDE (o NetBeans IDE nie myślałem wtedy). Nic nie znalazłem dostępnego jako projekt otwarty, jednakże w trakcie szukania natrafiłem na informacje o specyfikacji The Java API for XML-Based Web Services (JAX-WS). Jako, że specyfikacja była również na mojej liście do poznania i wiedziałem, że sprowadza się do kilku adnotacji, więc pomyślałem, że WSDL mogę stworzyć innym sposobem - utworzę usługę za pomocą JAX-WS. Trochę na około, ale wiedziałem, że zabierze mi to chwilę, więc wcale się nie zmartwiłem, a wręcz przeciwnie. Przypomniałem sobie o konferencji i o potrzebie integracji różnych usług w SCAleniu, które mam tymczasowo oparte o referencje w Javie i skrypt Groovy, więc z zapałem zabrałem się za utworzenie przykładu. Prostota tworzenia usługi z JAX-WS tak mi się spodobała, że napisałem artykuł Tworzenie usługi sieciowej z JAX-WS. Mam teraz i WSDL i usługę do uatrakcyjnienia SCAlenia. Najpierw skończę lekturę wprowadzenia do Apache CXF, a później skończę przykład na prezentację SCA na konferencję Integracja systemów informatycznych GigaCon.

02 czerwca 2007

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

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

Temat prezentacji: Tworzenie aplikacji graficznych z SWT i JFace
Prowadzący: Łukasz Dywicki

Tematem prezentacji jest użycie SWT w połączeniu z JFace do tworzenia grubych aplikacji. Prelegent zaprezentuje prostotę budowania graficznego interfejsu użytkownika (GUI) z użyciem SWT i JFace oraz rewolucyjnego zarządcy układu (ang. layout manager) jakim bez wątpienia jest Form Layout wspierany przez JFace Viewers.
Nie zabraknie również (bardzo) krótkiego rysu historycznego o SWT i miejsc na porównania z AWT i Swingiem. Ponadto wszyscy będziemy mieli okazję przyjrzeć się wydajności SWT i podyskutować na temat problemów, jakich może nastręczyć budowa aplikacji desktopowych.

Prezentację poprowadzi Łukasz Dywicki, student I roku Informatyki na Wyższej Szkole Informatyki Stosowanej i Zarządzania. Łukasz zajmuje się programowaniem od 5 lat. Początkowo były to języki skryptowe, od jakiegoś czasu Java. Łukasz jest pasjonatem SWT i platformy Eclipse, a obecnie stawia pierwsze kroki w świecie JEE i wystąpień publicznych. Pomysł prezentacji dotychczasowej wiedzy o SWT i JFace wydał się równie karkołomny, co niezwykle motywujący do dalszego wgłębiania się w tajniki bibliotek Eclipse dla aplikacji graficznych i stąd decyzja o wystąpieniu na spotkaniu Warszawa JUG.

Planowany czas prezentacji to 1,5 godziny z 15 minutową dyskusją.

Zapraszam w imieniu Warszawa-JUG!

01 czerwca 2007

Mój prezent z okazji święta - Aplikacja korporacyjna z JPA w trybie JTA z GlassFish i PostgreSQL

8 komentarzy
A co! Każdemu należy się prezent z okazji święta Dnia Dziecka bez względu na wiek, więc moim prezentem jest spisanie moich przemyśleń nt. tworzeniu aplikacji korporacyjnej z JPA w trybie JTA z GlassFish i PostgreSQL w postaci artykułu Aplikacja korporacyjna z JPA w trybie JTA z GlassFish i PostgreSQL. Jest tam również użycie mechanizmu DataModel wspierającego działanie h:dataTable w JSF, więc dużo dobrego do analizy.

Po powrocie z Ukrainy, gdzie miałem możliwość spotkać się z wykładowcami Kijowskiej Politechniki i w wolnych chwilach podczas przelotów naczytałem się i postanowiłem popróbować się z konfiguracją JPA z transaction-type="JTA" oraz PostgreSQL. W zasadzie to zależało mi na utworzeniu aplikacji, która byłaby przyczółkiem dla utworzenia bardziej zaawansowanej aplikacji korporacyjnej, dzięki której będę mógł rozpocząć poznawać szczegóły specyfikacji Java EE. W kolejnych odsłonach aplikacji będzie można oczekiwać kolejnych usprawnień, jak wykorzystanie komponentu sesyjnego EJB 3.0 jako fasady dla encji i zniwelowania konieczności użycia mechanizmów obsługi transakcji bezpośrednio w kodzie komponentu zarządzanego JSF. Chciałbym uniezależnić się również o środowiska programistycznego IDE, czyli pojawiłby się również Apache Maven 2 czy alternatywni dostawcy JPA. Pora rozpocząć podsumowanie wiedzy odnośnie EJB 3.0 i JPA 1.0 i wreszcie zaspokoić swoje ego certyfikatem Sun Certified Business Component Developer (SCBCD) 5.0. Pamiętam ile mogłem nauczyć się podczas egzaminu SCJP 5 i jak wiele wyszło braków. Sądzę, że SCBCD może spełnić podobną funkcję - pogłębienie wiedzy odnośnie specyfikacji. Jeśli przy tym zdobędę certyfikat, to i dobrze (jest on potrzebny do podejścia do Sun Certified Enterprise Architect (SCEA), a o tym to jeszcze nawet nie myślałem, więc z SCBCD mogłoby być ciekawie. Przy okazji, czy ktoś z czytających rozważa SCEA, albo już posiada to cudeńko?).

Nie mógłbym nie wspomnieć o innej przyczynie spisania przemyśleń odnośnie wykorzystania usług serwera aplikacyjnego Java EE 5. Kilka dni temu otrzymałem list od Piotra Kochańskiego, który zwrócił mi uwagę na pewien niuans w wykorzystaniu JPA i mechanizmu wstrzeliwania zależności. Chodzi o wykorzystanie adnotacji @PersistenceUnit i @PersistenceContext. W zasadzie obie dotyczą tej samej funkcjonalności (tak w wielkim skrócie), ale pierwszy z nich jest stosowany dla przekazania referencji do fabryki PU podczas, gdy drugi jest przekazaniem kontekstu PU. I kiedy dopiszę, że pierwszy jest odporny na wielowątkowość, a drugi nie i że użycie drugiego było w servlecie wszystko powinno być jasne - moja aplikacja nie była odporna na wielowątkowość (!) W dodatku sam o tym niedawno wspominałem w kontekście komponentów zarządzanych JSF, które działają w zasięgu (ang. scope) session oraz application, więc z wielkim zadowoleniem przyjąłem uwagę Piotra. Jakby jeszcze było mało, właśnie dzisiaj natrafiłem na ciekawą wzmiankę o tym w artykule Using Java Persistence with JavaServer Faces Technology. Podsumowaniem mogłoby być stwierdzenie, że z prostotą w Java EE 5 idzie również większa odpowiedzialność i jest to przykład czułego miejsca w naszych aplikacjach korzystających z Korporacyjnej 5-tki. Wielkie dzięki Piotr za wychwycenie błędu! Jak zauważyłem, Piotr również spisuje swoje doświadczenia na stronie Xoft.pl, więc może odwdzięczę mu się tym samym?! ;-)

Wracając do artykułu to wspomnę, że natrafiłem na kilka miejsc, których nie miałem świadomości istnienia.

Jednym z nich był mechanizm DI w przypadku komponentu zarządzanego JSF z serwera aplikacyjnego (adnotacja @PersistenceContext) oraz samego środowiska JSF - plik faces-config.xml. Jeśli w konstruktorze korzystamy z obu elementów to z oczywistych względów DI z serwera nie będzie jeszcze wykonane i możemy być zaskoczeni nieprzyjemnym NullPointerException. Więcej o tym w kolejnych notatkach albo nawet i artykule.

Inną kwestią, która mnie zaskoczyła, było wykorzystanie JPA z JTA i uruchomienie EntityManager.merge po wywołaniu EntityManager.getTransaction. Jest to niemożliwe w konfiguracji JTA i kończy się wyjątkiem Exception Description: Cannot use an EntityTransaction while using JTA. W zasadzie jest to bardzo logiczne, że to monitor transakcyjny serwera aplikacyjnego Java EE zarządza transakcjami, ale możnaby oczekiwać, że...zostawiam dywagacje na później.

I na koniec coś, co oczekuje właściwego nagłośnienia, ale przy święcie nie mógłbym o tym nie wspomnieć - JAVArsovia. Grupa Warszawa JUG przygotowuje się do swojego debiutu jako organizator pierwszej konferencji-warsztatów technologii Java, która odbędzie się na Wydziale MIMUW. Więcej w kolejnej notatce...niebawem. Czas pozbierać wszystkie dane i rozpocząć promocję imprezki. Chciałbym, aby podsumowaniem sobotniej konferencji JAVArsovia był toast na Polach Mokotowskich, ale jak będzie zobaczymy. Prelegenci są, sala jest, chętni również, więc poza plakatem i promocją na forach jest wszystko. Dobrze byłoby rozpoczać promocję właśnie dzisiaj - 1 czerwca 2007. Jeszcze jest kilka godzin ;-)