wtorek, 27 stycznia 2009

Dzisiejsze spotkanie Poznań JUG przesunięte !

Niestety z powodu choroby prelegenta Jacka Pospychały dzisiejsze spotkanie o AspectJ musi zostać przesunięte.
Znany już jest termin na który zostało przesunięte, jest to 10 lutego, godzina 18:00. Miejsce to samo co zwykle czyli siedziba Cognifide.
Zapraszam na ten termin ! ;-)

Proszę przekazać informację innym uczestnikom aby nie jechali na marne!

poniedziałek, 26 stycznia 2009

Walidacja wielu pól w jednym walidatorze w JSF

Typowa sytuacja - mamy formularz zmiany hasła a w nim pola jak hasło i potwierdź hasło. Jak stworzyć do takich pół klasę walidującą skoro normalnie może ona operować na tylko jednym elemencie formularza ?
To proste:) Musimy przekazać dodatkowo walidatorowi jako atrybut wartość z pierwszego pola.
Posługując się powyższym przykładem mamy formularz:

<h:form id="changepassform">
<tr>
<td>Nowe hasło:</td>
<td>
<h:inputSecret id="password" value="#{userRegistrationBean.password}"
required="true" redisplay="false" />
</td>
</tr>
<tr>
<td>Powtórz:</td>
<td>
<h:inputSecret id="confirm" required="true" redisplay="false">
<f:validator validatorId="passwordValidator" />
<f:attribute name="passwordId" value="changepassform:password" />
</h:inputSecret>
</td>
</tr>
</h:form>
W drugim polu formularza podajemy walidator którym jest passwordValidator - jego implementacja zajmiemy się za chwilę. Jako atrybut o nazwie passwordId podajemy z formularza changepassword (to nazwa aktualnego formularza) pole password, czyli to powyżej.
Teraz czas na klasę walidującą.
PasswordValidator.java
package com.wookasz.blogspot.jsfmultivalidator;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;

public class PasswordValidator implements Validator {

public void validate(FacesContext context, UIComponent component, Object value)
throws ValidatorException {

// pobranie atrybutu przekazanego w formularzu
String passwordId = (String)component.getAttributes().get("passwordId");
// odnalezienie odpowiedniego komponentu o tej nazwie
UIInput passwordInput = (UIInput)context.getViewRoot().findComponent(passwordId);
// pobranie wartości z tego komponentu
String password = (String) passwordInput.getValue();
String confirm = (String) value;

// sprawdzanie poprawnosci i ew. zrzucenie wyjątku
if (!password.equals(confirm)) {
throw new ValidatorException(new FacesMessage("Hasła nie są identyczne"));
}
}
}
Mam nadzięję, że komentarze w kodzie wystarczą by wyjaśnić sprawę ;-)
Pozostaje jeszcze rejestracja walidatora w faces-config.xml:
<validator>
<validator-id>passwordValidator</validator-id>
<validator-class>
com.wookasz.blogspot.jsfmultivalidator.PasswordValidator
</validator-class>
</validator>

Wynik:

sobota, 24 stycznia 2009

NetBeans uznany produktem roku przez Developer.com !


W głosowaniu przeprowadzonym przez serwis www.developer.com produktem roku 2008 został NetBeans! Wygrał w pięciu z dwunastu kategorii! Co więcej w tych kategoriach otrzymał znacząco większą liczbę głosów niż kolejne miejsca.



Zwycięstwo odnotowano w następujących kategoriach:
- Development Tool -> NetBeans Platform
- Development Utilities -> NetBeans Profiler
- Wireless/Mobile -> NetBeans Mobility Pack for Connected Device Configuration (CDC) 5.5
- Java Tool -> NetBeans IDE
- Open Source -> NetBeans

Myślę, że to świetny wynik. W Polsce zauważam, że ze strony firm brakuje jakoś przekonania co do tego IDE. Większość korzysta z Eclipsa (co widać po publice na NetBeans day i Eclipse DemoCamp). Mam nadzieję, że takie nagrody zaczną przekonywać ludzi do korzystania z NetBeansa ;-)

Pełną listę zwycięzców można przeczytać w artykule: Winners of the Developer.com Product of the Year 2009 Are Announced

piątek, 23 stycznia 2009

AspectJ na Poznań Java User Group [27.01.09]

O programowaniu aspektowym w Javie za pomocą AspectJ na najbliższym spotkaniu Poznań Java User Group opowie nam Jacek Pospychała. Spotkanie odbędzie się 27 stycznia (wtorek) w siedzibie firmy Cognifide na ulicy Al. Wielkopolskie 4 - godzina 18:00.

Tak jak ostatnim razem na spotkanie wymagana jest rejestracja [link].
Ja niestety nie dotrę tym razem, ponieważ mam egzamin w tym czasie :-/ Ale wszystkich serdecznie ZAPRASZAM !

Więcej szczegółów na grupie dyskusyjnej Poznań JUG.

EDIT: A jednak udało mi się być zwolnionym z egzaminu to pojawię się na JUGu ^^

czwartek, 22 stycznia 2009

Placebo - Twenty Years, live at Rock Am Ring 06-04-06

Nie wiem czy czytają mnie jacyś fani Placebo, ale uważam, że ten kawałek na tym koncercie zagrali zaj****** ! Końcówka wymiata !

Szkoda tylko, że na YouTube jest taka słaba jakość dźwięku;/

poniedziałek, 12 stycznia 2009

Drobne poprawki w wyglądzie bloga

Usiadłem dziś i poszerzyłem miejsce na posty na blogu. Wyleciały przez to zaokrąglenia ramek, ale mam nadzieje, że to mocno nie popsuło designu. Prosiłbym o komentarze co tu jeszcze psuje czytelność lub szpeci wygląd ;-) Nie mam niestety zdolności plastycznych żeby samemu to ocenić ;-/

piątek, 9 stycznia 2009

Kabaret Neonówka - niebo

Dawno nic śmiesznego nie wrzucałem ;-)

^^

Pierwszy MIDlet v2.0 -> LWUIT incoming!

W czasach średniowiecznych opisałem tutaj jak napisać prosty midlet na urządzenie mobilne. Przedstawiłem to na standardowych kontrolkach z MIDP 2.0. Dziś chciałbym pokazać jak napisać pierwszy MIDLet ale już w dużo bardziej rozbudowanej i wszechstronnej bibliotece - Lightweight UI Toolkit (LWUIT).
Co nam daje ta biblioteka ? Oto główne korzyści:
- model MVC podobny do swingowego
- aplikacja wygląda i działa identycznie na każdym urządzeniu
- dużo większa liczba kontrolek
- layouty jak w swingu (BoxLayout, GridLayout itd...)
- Look and Feel oraz bardzo łatwa ich zmiana nawet podczas działania aplikacji
- różnego rodzaju animacje i efekty przejścia
- wszystkie komponenty UI mogą być w łatwy sposób modyfikowane (nie są oznaczone jako final - można dziedziczyć)
- okienka modalne
- obsługa ekranów dotykowych
- internacjonalizacja
- zmiana czcionek
Hmmm... chciałem tylko kilka wymienić a tu się dość spora lista zrobiła ;P Jak wygląda LWUIT w akcji ? Możecie zobaczyć na filmiku poniżej:

Już się wszystkim podoba ? Mnie bardzo! W połączeniu z licencją GPL jeszcze bardziej ^^
No to czas coś napisać. Najpierw ściągnijmy bibliotekę : link. I tworzymy nowy projekt w ulubionym środowisku. Ja będę korzystać z NetBeans. Dodajemy klasę typu MIDlet do projektu, dodajemy bibliotekę LWUIT.jar oraz katalog resources do którego wrzucamy plik z motywem (link). Motyw pochodzi z przykładowego projektu LWUITDemo rozprowadzanego razem z biblioteką.
Najpierw pokażę cały kod a później omówię najważniejsze elementy.
LWUITDemo.java
package com.blogspot.wookasz.lwuitdemo;

import com.sun.lwuit.Command;
import com.sun.lwuit.Display;
import com.sun.lwuit.Form;
import com.sun.lwuit.Label;
import com.sun.lwuit.animations.CommonTransitions;
import com.sun.lwuit.events.ActionEvent;
import com.sun.lwuit.layouts.BorderLayout;
import com.sun.lwuit.plaf.UIManager;
import com.sun.lwuit.util.Resources;
import javax.microedition.midlet.MIDlet;

public class LWUITDemo extends MIDlet {
private static final String THEME_FILE = "/businessTheme.res";
public void startApp() {
try {
// inicjalizacja ekranu
Display.init(this);

// otwarcie i wczytanie motywu
Resources r = Resources.open(THEME_FILE);
UIManager.getInstance().setThemeProps(r.getTheme(r.getThemeResourceNames()[0]));

// tworzenie formatek
final Form firstForm = new Form("Pierwsza formatka");
firstForm.setLayout(new BorderLayout());
Label label1 = new Label("Hello world!");
label1.getStyle().setBgTransparency(100);
firstForm.addComponent(BorderLayout.CENTER, label1);

final Form secondForm = new Form("Druga Formarka");
secondForm.setLayout(new BorderLayout());
Label label2 = new Label("and Hello LWUIT !!");
label2.getStyle().setBgTransparency(100);
secondForm.addComponent(BorderLayout.CENTER, label2);

// przypisanie animacji przejść
firstForm.setTransitionInAnimator(
CommonTransitions.createSlide(CommonTransitions.SLIDE_HORIZONTAL,
false, 1000));
secondForm.setTransitionInAnimator(
CommonTransitions.createSlide(CommonTransitions.SLIDE_HORIZONTAL,
true, 1000));

// dodawanie przycisków
Command goBtn = new Command("Wciśnij mnie!", 1) {
public void actionPerformed(ActionEvent evt) {
secondForm.show();
}
};
firstForm.addCommand(goBtn);

Command backBtn = new Command("Powrót!", 1) {
public void actionPerformed(ActionEvent evt) {
firstForm.show();
}
};
secondForm.addCommand(backBtn);
// przycisk wyjścia
Command exitCmd = new Command("Wyjście", 2) {
public void actionPerformed(ActionEvent evt) {
destroyApp(true);
notifyDestroyed();
}
};
firstForm.addCommand(exitCmd);
secondForm.addCommand(exitCmd);

// wyświetlenie formatki pierwszej
firstForm.show();
} catch (Exception ex) {
ex.printStackTrace();
}
}

public void pauseApp() {}
public void destroyApp(boolean unconditional) {}
}

Pierwsza instrukcja inicjalizuje ekran, musi być ona wywołana przed wyświetleniem pierwszej formatki. Jako parametr należy podać obiekt dziedziczący po klasie MIDlet.
Następne dwie linie
Resources r = Resources.open(THEME_FILE);
UIManager.getInstance().setThemeProps(r.getTheme(r.getThemeResourceNames()[0]));
Załatwiają za nas całe wystylizowanie aplikacji:) Pierwszy wczytuje zbiór danych w którym znajduje się nasz motyw. W drugim go ustawiamy jako aktualny, szybkie i proste:) W jednym zbiorze może znajdować się wiele motywów dlatego odwołujemy się do tablicy w r.getThemeResourceNames()[0].
final Form firstForm = new Form("Pierwsza formatka");
firstForm.setLayout(new BorderLayout());
Label label1 = new Label("Hello world!");
label1.getStyle().setBgTransparency(100);
firstForm.addComponent(BorderLayout.CENTER, label1);
Tworzymy pierwszą formatkę. Parametrem jest napis jaki ma się pojawić na górnej belce, tak samo jako w standardowym formie. Następnie dla tej formatki ustawiamy layout typu BorderLayout, zgodnie z tym layoutem będą rozmieszczane wszystkie konponenty. W następnie dodajemy jeden komponent (napis) i dodajemy go na środek. Wcześniej jednak ustawiamy jego tło na całkowicie przezroczyste żebyśmy mogli widzieć tło aplikacji jakie jest zdefiniowane w motywie. W layoucie BorderLayout środkowa jego część zawsze zajmuje największą możliwą przestrzeń, gdybyśmy nie przypisali przezroczystego tła napisowi, nie zobaczylibyśmy tła aplikacji. Podobnie postępujemy z drugą formatką.
firstForm.setTransitionInAnimator(
CommonTransitions.createSlide(CommonTransitions.SLIDE_HORIZONTAL,
false, 1000));
Przypisujemy animacje dla sytuacji gdy formatka ma się pojawić. Trwać ona będzie 1000ms oraz będzie przesuwać się w stronę lewą. Podobnie tworzymy dla drugiej formatki, tylko animacja tam będzie przesuwać się w prawo.
Command goBtn = new Command("Wciśnij mnie!", 1) {
public void actionPerformed(ActionEvent evt) {
secondForm.show();
}
};
firstForm.addCommand(goBtn);
Podczas tworzenia przycisków możemy od razu zdefiniować jaka akcja ma się wykonać podczas jego przyciśnięcia. Robimy to tworząc metodę actionPerformed dla tego przycisku. Co prawda nie jest to za bardzo zgodne z modelem MVC ale dla drobnych akcji takie podejście chyba nie jest aż tak złe. Akcja która zdefiowaliśmy wyświetla drugą formatkę. Oczywiście pojawia się ona z efektem przejścia który przypisaliśmy jej wcześniej.
Dalej w kodzie przypisujemy kolejne przyciski o dość zrozumiałym działaniu, by na końcu wyświetlić pierwszą formatkę metodą show().
Uruchamiamy!

U mnie działa:) Zachęcam do przetestowania na telefonie, nie powinno być problemów raczej.
Należy pamiętać, że jeśli użyjemy efektu przejścia jakim jest np. Transition3D.createRotation(int, bool) to jest wymagane od urządzenia obsługa 3D (pakiet javax.microedition.m3g).

To by było na tyle mojego bardzo krótkiego wstępu do Lightweight UI Toolkit. Zachęcam do zapoznania się z API - bardzo proste i rozbudowane zarazem. Ja z pewnością napisze jeszcze trochę tutaj na ten temat. Pracuję już z LWUIT kilka miesięcy i trochę ciekawostek się nazbierało do opisania ^^

Zapraszam do komentowania!

Linki:
Projekt NetBeans przykładu z wpisu: download
Strona domowa - https://lwuit.dev.java.net/
Oficjalne forum - http://forums.java.net/jive/forum.jspa?forumID=139
Blog - http://lwuit.blogspot.com/

wtorek, 6 stycznia 2009

Darmowe szkolenia z Glassfish!

Sun robi niespodzianki noworoczne i oferuje nam darmowe szkolenie (trial) z zakresu serwera aplikacji GlassFish. Żeby z niego skorzystać należy się zarejestrować by po tym otrzymać dostęp na 60 dni do serwisu szkoleniowego. Zakres programu jest dość wąski wg mnie bo obejmuje tylko informacje wstępne na temat serwera oraz różne aspekty tworzenia usług sieciowych: projektowanie, bezpieczeństwo, QoS, integracja z .NET, transakcyjność, praca z usługami. Jak to wygląda od środka jeszcze nie wiem, bo zarejestruje się gdzieś pod koniec stycznia dopiero gdy znajdę więcej czasu. Ale wszystkich zachęcam do skorzystania, zawsze można się czegoś nauczyć nowego ^^
Co ciekawe rejestracja daje nam także zniżki np na certyfikaty SCWCD czy SCBCD.
Z tego co wyczytałem to promocja kończy się 20 marca.
Link do rejestracji (i większej ilości informacji): www.sun.com/training/glassfish_login.html


EDIT:
To jednak nie na certyfikaty są zniżki tylko na pakiety przygotowujące go egzaminu ! Przepraszam za pomyłkę ;-)

czwartek, 1 stycznia 2009

Dostęp do kontekstu utrwalania w niezarządzanych obiektach JSF

Tworząc projekt z użyciem JSF i Spring Security musiałem w jednej z metod uwierzytelniających pobrać dane o użytkowniku z bazy danych. Problemem było to, że obiekt ten nie był zarządzanym przez kontener aplikacji więc nie mogłem wstrzyknąć sobie do niego referencji do kontekstu utrwalania. Samemu tworząc obiekt jak w przypadku platformy Java SE uzyskiwałem wyjątek braku informacji o jednostce utrwalania. Ostatecznie z rozwiązaniem problemu przyszła mi z pomocą grupa dyskusyjna pl.comp.lang.java a dokładniej użytkownik Jarek któremu bardzo dziękuje ^^

Ok, żeby dostać się do kontekstu utrwalania należy wzbogacić nasz deskryptor wdrożenia web.xml o następujący wpis:
<persistence-context-ref>
<persistence-context-ref-name>
persistence/[nazwa jednostki utrwalania z persistence.xml]
</persistence-context-ref-name>
<persistence-unit-name>
[nazwa jednostki utrwalania z persistence.xml]
</persistence-unit-name>
</persistence-context-ref>
Miedzy pierwszą parą znaczników wpisujemy gdzie będziemy mogli znaleźć naszą jednostkę utrwalania w JNDI, a w drugiej nazwę tej jednostki z pliku persistence.xml. Bardzo proste:) Należy tylko pamiętać aby wcześniej wszystko skonfigurować związanego z utrwalaniem.
Teraz gdy to już mamy możemy dobrać się do tego czego szukamy:
InitialContext ictx = new InitialContext();
Context envCtx = (Context) ictx.lookup("java:comp/env");
entityManager = (EntityManager) envCtx.lookup("persistence/[nazwa]");

Działa :)