czwartek, 25 marca 2010

Seam-gen + DB2

Udało mi się w końcu połączyć działanie seam-gen z DB2, co nie było takim prostym zadaniem jak myślałem. Ogólnie DB2, jak na komercyjne rozwiązanie, sprawia wiele problemów dla użytkownika, który ma pierwszy raz z nim styczność. Żeby wygenerować projekt używając seam-gen na podstawie bazy danych w DB2 (v. 9.7), musimy zmienić kilka rzeczy:

1. Potrzebujemy odpowiedni sterownik JDBC, który możeby znaleźć standardowo w: "C:\Program Files\IBM\SQLLIB\java\db2jcc.jar"
2. W pliku konfiguracyjnym seam-gen musimy nanieść kilka zmian:
2.1. hibernate.connection.driver_class=com.ibm.db2.jcc.DB2Driver
2.2. hibernate.default_schema=ANDRZEJ
//oczywiście powinien być to odpowiednia wartość dla danej bazy
2.3. użytkownika i hasło pozostawić puste, ponieważ nie są wymagane przy łączeniu się z localhost'a
2.4. hibernate.connection.url=jdbc\:db2\:NAZWA_BAZY //jeśli używamy kreatora, podajemy oczywiście: jdbc:db2:NAZWA_BAZY
2.5. driver.jar=c\:/java_libs/db2jcc.jar
3. Po uruchomieniu polecenia: seam generate, posypie się jeden błąd, który niema znaczenia i cała operacja powinna zakończyć się sukcesem
4. Co mnie najbardziej zdziwiło, to fakt, że tak wygenerowany projekt w moim przypadku nie chciał się deployować na serwerze z powodu błędu:
2010-03-25 11:45:27,781 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/DB2Test3]] Exception sending context initialized event to listener instance of class org.jboss.seam.servlet.SeamListener
org.jboss.seam.InstantiationException: Could not instantiate Seam component: DB2Test3EntityManagerFactory
Powodowanego przez:
Caused by: org.hibernate.HibernateException: Wrong column type: CO_CD, expected: varchar(3)
Rozwiązaniem problemu była zmiana typu kolumn w bazie z CHARACTER na VARCHAR, przypuszczam, że wiąże się to z jakimiś niepasującymi dialektami, i bardzo możliwe, że istnieje lepsze rozwiązanie, aczkolwiek na chwilę obecną nie jest mi ono znane.

Seam-gen w akcji

Od 2 tygodniu tonę w dokumentacji/artykułach dotyczących Seam'a, ciężko by było to wszystko przyswajać bez motywacji. Dla tych, którzy jeszcze nie przekonali się do tego, że warto poczytać trochę o tym Seam'ie, proponuje mały tutorial o seam-gen – coś co w moim wypadku przeważyło szalę: warto, czy nie warto czytać o Seam'ie.

Seam-gen ogólnie przywrócił moją wiarę w JaveEE, w której od zawsze widziałem ogromny potencjał, ale nie mogłem pojąć, dlaczego tworzenie w niej czegokolwiek jest tak trudne, a przede wszystkim czasochłonne? Ktoś kto używał np. cakePHP wie o czym mówię, ponieważ używając caka, możemy zrobić w pełni działającego CRUD'a w kilka minut. I tą lukę w Javie wypełnia Seam-gen – narzędzie do tworzenia CRUD'a na podstawie bazy danych. Koniec gadania, przejdźmy do rzeczy.

Co potrzebujemy:

1. Wszystko to co było potrzebne w poprzednim tutorialu (wybieramy 1 serwer który bardziej nam odpowiada w tym przypadku będę bazował na JBoss'ie)
2. Serwer bazy danych, proponuje zainstalować MySql, najlepiej z jakimś przyjemnym supportem, żebyśmy nie musieli go obsługiwać z poziomu konsoli. Instalacja wamp'a załatwi sprawę: link
3. Sterownik JDBC do MySql'a, link

Przygotowanie:

- Wszystko co to zostało napisane we wcześniejszym tutorialu.
- Przygotowanie MySql:
- należy utworzyć nową bazę danych, wraz z przykładowymi tabelami – pozostawiam to czytelnikowi.

Odpalenie Seam-gen:

1. Przechodzimy do katalogu głównego Seam'a i edytujemy plik: build.properties, gdzie umieszczamy ścieżkę do katalogu głównego JBoss'a w moim przypadku:
jboss.home=C:\\jboss-4.2.3.GA
2. Uruchamiany kreator konfiguracji seam-gen:
C:\Andrzej\seam\jboss-seam-2.0.2.SP1>seam setup
w tym momencie kreator konfiguracji zada nam serię pytań, których wynikiem będzie plik konfiguracyjny znajdujący się w seam-gen/build.properties. Generalnie możemy edytować go ręcznie lub używać kreatora.

3. W nawiasach kwardatowych znajdują się defaultowe (lub zapamiętane z wcześniejszego użycia) odpowiedzi – możemy je zatwierdzić naciskając po prostu ENTER.

Pyt: [input] Enter your Java project workspace (the directory that contains your Seam projects) [C:/Projects] [C:/Projects]
Odp: c:/eclipse/workspace
//Używam '/' zamiast '\\' - mniej pisania.

Pyt: [input] Enter your JBoss home directory [C:/Program Files/jboss-4.2.2.GA] [C:/Program Files/jboss-4.2.2.GA]
Odp: C:/jboss-4.2.3.GA
//ścieżka do katalogu głównego z JBoss

Pyt: [input] Enter the project name [myproject] [myproject]
Odp: NowyProjekt

//Wybieramy nazwe dla projektu:

Pyt: [input] Do you want to use ICEFaces instead of RichFaces [n](y, [n])
Odp: ENTER

Pyt: [input] Select a RichFaces skin [blueSky] ([blueSky], classic, ruby, wine, deepMarine, emeraldTown, sakura, DEFAULT)
Odp: ENTER

Pyt: [input] Is this project deployed as an EAR (with EJB components) or a WAR (with no EJB support) [ear] ([ear], war)
Odp: war
// wybieramy war, jeśli chcemy korzystać z JavaBeans, zamiast EJB, oraz jeśli chcemy później używać tzn. „hot deployment”

Pyt: [input] Enter the Java package name for your session beans [com.mydomain.NowyProjekt] [com.mydomain.NowyProjekt]
Odp: com.mydomain.NowyProject.action

Pyt: [input] Enter the Java package name for your entity beans [com.mydomain.NowyProject.action] [ com.mydomain.NowyProject.action]
Odp: com.mydomain.NowyProject.model

Pyt: [input] Enter the Java package name for your test cases [com.mydomain.NowyProject.action.test] [com.mydomain.NowyProject.action.test]
Odp: com.mydomain.NowyProject.test

Pyt: [input] What kind of database are you using? [hsql] ([hsql], mysql, oracle,postgres, mssql, db2, sybase, enterprisedb, h2)
Odp: mysql

Pyt: [input] Enter the Hibernate dialect for your database [org.hibernate.dialect.MySQLDialect] [org.hibernate.dialect.MySQLDialect]
Odp: ENTER

Pyt: [input] Enter the filesystem path to the JDBC driver jar [../lib/hsqldb.jar][../lib/hsqldb.jar]
Odp: C:/java_libs/mysql-connector-java-5.1.12-bin.jar

Pyt: [input] Enter JDBC driver class for your database [com.mysql.jdbc.Driver] [com.mysql.jdbc.Driver]
Odp: ENTER

Pyt: [input] Enter the JDBC URL for your database [jdbc:mysql:///test] [jdbc:mysql://test]
Odp: jdbc:mysql://localhost/cms
//url do bazki, w moim przypadku baza ma nazwę „cms”

Pyt: [input] Enter database username [sa] [są]
Odp: root

Pyt: [input] Enter database password [] []
Odp: ENTER //ponieważ nie mam ustawionego hasła

Pyt: [input] Enter the database catalog name (it is OK to leave this blank) [] []
Odp: ENTER

Pyt: [input] Are you working with tables that already exist in the database? [n] (y, [n])
Odp: y

Pyt: [input] Do you want to drop and recreate the database tables and data in import.sql each time you deploy? [n] (y, [n])
Odp: n

Kreator powinien zakończyć swoje działanie poprawnie:
BUILD SUCCESSFUL

Total time: 15 minutes 56 seconds

Możemy podejrzeć jak wygląda plik konfiguracji seam-gen: seam-gen/build.properties.

4. Kolejnym krokiem jest utworzenie bazowej struktury projektu, używając polecenia: seam create-project
C:\Andrzej\seam\jboss-seam-2.0.2.SP1>seam create-project
5. Wykonując polecenie: seam generate dokonujemy inżynierii odwrotnej i na podstawie bazy generowane są odpowiednie widoki oraz klasy.
C:\Andrzej\seam\jboss-seam-2.0.2.SP1>seam generate
6. Ostatnim poleceniem jest: seam explode, które pozwoli nam zdeployować projekt i być oczarowanym tym jak ładnie seam-gen wygenerował nam CRUD'a
C:\Andrzej\seam\jboss-seam-2.0.2.SP1>seam explode
7. Uruchamiamy JBoss'a i sprawdzamy jak wygląda nasz projekt w przeglądarce:
http://localhost:8080/NowyProjekt/

W następnej notce postaram się napisać jak podłączyć tak wygenerowany projekt pod Eclipsa lub NetBeansa

sobota, 20 marca 2010

Seam - pierwsze kroki.

Biorąc pod uwagę swoje własne lenistwo, oraz to, że po prostu lubię jak mi ktoś pewne rzeczy wytłumaczy łopatologicznie, postanowiłem, że napisze krótki tutorial jak uruchomić przykładowe aplikacje z seam'a (mimo wcześniejszego posta, w którym w sumie napisałem gdzie najlepiej szukać pomocy). Tutorial obejmuje 2 rodzaje serwerów Tomcat i JBoss, ale możemy wybrać jeden z nich. Dla wszystkim miłośników Tomcat'a (sam do nich należę) polecałbym jednak spróbowanie JBoss'a.

Co potrzebujemy?
1. Seam w wersji 2.0.2.SP1: link
2. Tomcat w wersji 6.x: link
3. lub JBoss w wersji 4.2.3: link
4. Ant w wersji 1.8: link

Przygotowanie:
należy ściągnąć wyżej wymienione oprogramowanie i rozpakować. Oczywiście zakładamy, że mamy zainstalowane JDK w wersji minimum 5. oraz ustawione są zmienne środowiskowe JRE_HOME i JAVA_HOME w zależności od tego gdzie zainstalowaliśmy Javę. Jak to zrobić można przeczytać m.in. tu. Aby sprawdzić czy zmienna jest prawidłowo ustawiona możemy ją wyświetlić używając komendy set:

C:\Documents and Settings\andrzej>set JRE_HOME
JRE_HOME=C:\Program Files\Java\jre6
Po ustawieniu zmiennej, bardzo często trzeba uruchomić ponownie konsolę, żeby było ją widać - nie mam pojęcia dlaczego.

Przygotowanie Ant'a:
po ściągnięciu Ant'a i rozpakowaniu musimy ustawić zmienną środowiskową ANT_HOME na katalog w którym mamy Ant'a (%ANT_HOME%\bin\ant.bat), w moim przypadku:
C:\Documents and Settings\andrzej>set ant
ANT_HOME=C:\apache-ant-1.8.0
Musimy również dodać do zmiennej PATH (oczywiście po średniku) "%ANT_HOME%\bin", czyli w moim przypadku: "C:\apache-ant-1.8.0\bin".

Przygotowanie Tomcat'a:
Tomcat sam w sobie nie wymaga wielu przygotowań, oprócz prawidłowej instalacji Javy, aczkolwiek jeśli chcemy przetestować przykłady korzystające z EJB, musimy zainstalować Embedded JBoss, bardzo dobrą instrukcję jak to zrobić, możemy znaleźć tutaj. Dla tych którzy mają u siebie Java EE 6, należy nie zapomnieć o dodaniu jednej linii na początku pliku catalina.bat:
set JAVA_OPTS=%JAVA_OPTS% -Dsun.lang.ClassLoader.allowArraySyntax=true
Przygotowanie JBoss'a:
none

Odpalanie przykładowych aplikacji Seam:
1. Przechodzimy do katalogu głównego seam (nie pomylić plików!, ponieważ pliki build są praktycznie w każdym pod katalogu) i edytujemy plik: build.properties dodając w nim wspomniane wcześniej) ścieżki do katalogów głównych JBoss'a i Tomcat'a, w moim przypadku:
jboss.home=C:\\jboss-4.2.3.GA
tomcat.home=C:\\apache-tomcat-6.0.24
2. Przechodzimy do folderu "examples" i wybieramy jeden z przykładów, standardowo niech to będzie: "registration", przychodzimy do folderu wybranego przykładu z poziomu linii komend wykonujemy:

2.A.1. W przypadku JBoss'a polecenie ant explode:
C:\Andrzej\seam\jboss-seam-2.0.2.SP1\examples\registration>ant explode
2.A.2. Następnie uruchamiany JBossa z linii komend:
C:\jboss-4.2.3.GA\bin>run.bat
2.A.3. Odpalamy przeglądarkę i uruchamiamy nasz przykład:
http://localhost:8080/seam-registration/
2.B.1. W przypadku Tomcat'a (jeśli wczęśniej uruchamialiśmy przykład na JBoss'ie to musimy zatrzymać serwer oraz w katalogu przykładu wykonać ant clean):
C:\Andrzej\seam\jboss-seam-2.0.2.SP1\examples\registration>ant tomcat.deploy
2.B.2. Uruchamiamy Tomcat'a:
C:\apache-tomcat-6.0.24\bin>startup.bat
2.B.3. Odpalamy przeglądarkę i uruchamiamy nasz przykład (link jest trochę inny niż w przypadku JBoss'a, należy pamiętać o przedrostku "jboss-"):
http://localhost:8080/jboss-seam-registration/
I to by było na tyle, aby odpalić inne przykłady postępujemy analogicznie, zmieniając odpowiednio nazwę przykładu, tam gdzie jest to potrzebne.
W następnym poście postaram się napisać coś o seam-gen - bardzo przydatne narzędzie.
Tymczasem pozdrawiam.

piątek, 12 marca 2010

ESI - praktyki edukacje w IBM

Od następnego tygodnia (tj. 12.03.2010) zaczynam już na poważnie praktyki w firmie IBM, uczestnicząc w tzw. programie ESI (Educational Students Intership).

Tematyka moich praktyk będzie głównie krążyła wokół aspektów związanych z technologią JavaEE a konkretnie z frameworkiem SEAM.

Moim mentorem podczas praktyk będzie Jacek Laskowski, a najnowsze informacje o postępach będzie można śledzić na twitterze oraz bliperze.

Jeśli chodzi o ten tydzień to głównie przygotowywałem swoją maszynę do pracy, co wymagało ściągnięcia całej masy instalek, bibliotek, tutoriali. Oczywiście nie byłbym sobą gdybym już czegoś nie zaczął robić, więc wstępnie zapoznałem się z frameworkiem SEAM, ustawiłem odpowiednio serwer toccat 6.0, aby mógł współpracować z SEAM. Ogólnie tomcat bez żadnych dodatkowych ustawień może współpracować z SEAM aczkolwiek jeśli chcemy odpalić przykłady korzystające z EJB, to musimy doinstalować do niego Embedded JBoss, instrukcje jak to wykonać możemy znaleźć tu:
http://community.jboss.org/wiki/EmbeddedAndTomcat

W swoich dotychczasowych testach wykorzystywałem SEAM’a w wersji: 2.0.2.SP1, na oficjalnej stronie SEAM’a jest już nowsza wersja aczkolwiek zauważyłem, że większość tutoriali w internecie jest przygotowanych pod tą wersje.
Przed przystąpieniem do odpalania przykładów z SEAM, radziłbym oprócz zapoznania się z oficjalną dokumentacją:
http://docs.jboss.com/seam/latest/reference/en-US/html/index.html
zapoznać się również z plikiem readme.txt – znajdującym się w folderze: seam/examples. Jest tam najlepiej wytłumaczone jak odpalać wszystkie przykłady dla tomcat’a i jboss’a używając ant’a. Jeszcze jeden mały tips z mojej strony dla użytkowników windowsa, plik build.properties (w katalogu seam), powinien być uzupełniony o ścieżki do obu serwerów np. w ten sposób:
jboss.home=C:\\Andrzej\\jboss\\jboss-4.2.3.GA
tomcat.home=C:\\apache-tomcat-6.0.24

“\\” - podwójny ukośnik zajął mi sporą część dnia w poszukiwaniu, co jest nie tak.