Archiwa kategorii: Java - Page 2

Jak pogodzić maven’a z maven’em? (m2e vs maven-eclipse-plugin)

maven-logo

W projektach opartych o Maven‚a często do integracji ze środowiskiem Eclipse używany jest plugin maven-eclipse-plugin. Za pomocą tego pluginu spod konsoli można wygenerować wszystkie niezbędne pliki projektu wymagane przez IDE. Z drugiej strony Eclipse musi zostać wyposażony w plugin do integracji z Maven’em, dzięki czemu będzie poprawnie rozpoznawał zależności, zapewni graficzne wsparcie edycji plików *.pom i dołoży klika innych przydatnych rzeczy. Wybór nie jest tu duży i zazwyczaj pada na wtyczkę m2eclipse (oprócz tego dostępny jest jeszcze Eclipse IAM).

Załóżmy więc, że wygenerowaliśmy pliki projektu za pomocą polecenia mvn eclipse:eclipse. Jeśli spróbujemy zaimportować taki projekt w IDE, z pewnością zauważymy, że m2eclipse nie jest w stanie poprawnie rozpoznawać zależności projektu. Gdy podejrzymy w edytorze tekstu plik .project, zobaczymy tam komentarz, który jednoznacznie wskazuje na problem:

NO_M2ECLIPSE_SUPPORT: Project files created with the maven-eclipse-plugin are not supported in M2Eclipse.

Jak zatem przerobić taki projekt, aby był poprawnie rozpoznawany przez m2eclipse? Wystarczy kilka drobnych zmian w plikach .project i .classpath. Czytaj więcej »

Apache Shiro – uwierzytelnić lepiej?

shiro-logo.jpg

Jakiś czas temu opisywałem, jak szybko zaimplementować uwierzytelnianie w aplikacji GWT przy pomocy JAAS’a. Wtedy byłem trochę zafascynowany tym ostatnim i nie dostrzegałem wielu jego wad. Prosty moduł uwierzytelniania (mniej więcej taki, jaki wtedy stworzyliśmy) nie przysparza jeszcze większych trudności, jednak każde dodatkowe wymagania sprawiły, że JAAS coraz bardziej zaczął mnie zniechęcać. Nie twierdzę, że jest zły, tylko jego silna integracja z mechanizmami serwerów aplikacji sprawia, że aplikacja staje się mało przenaszalna i praktycznie przed każdym wdrożeniem na inny serwer moduł logowania trzeba implementować od nowa. Najgorsze w tym wszystkim jest to, że niektóre serwery udostępniają łatwe i przyjazne API do rozszerzania funkcjonalności uwierzytelniania, a inne z kolei utrudniają bądź wręcz to uniemożliwiają. Jeśli wiemy, że nasza aplikacja od początku do końca będzie współpracować z jednym tylko serwerem – problem znika, nie mniej i tak się namęczymy z implementacją kilku rzeczy.

Użerając się wciąż z JAAS’em w końcu postanowiłem spróbować czegoś innego. Padło na Apache Shiro – framework ułatwiający implementację uwierzytelniania, autoryzacji, szyfrowania i zarządzania sesjami w aplikacjach Java. Shiro wywodzi się ze starej biblioteki JSecurity i obecnie jest aktywnie rozwijane przez wielu deweloperów. Może być użyte w zwykłych aplikacjach Java oraz aplikacjach webowych, a mocna modularyzacja kodu pozwala na łatwe podstawianie swoich implementacji do tego co potrzebujemy. Przy okazji zawiera też wiele podstawowych metod uwierzytelniania, z których można skorzystać praktycznie od razu. Dodatkowo jeśli nasza aplikacja musi obsługiwać mechanizmy serwerowe, w Shiro można napisać własną implementację modułu logowania JAAS.

Czytaj więcej »

Google otwiera kod GPE!

Logo GWT

Google na swoim blogu poświęconym GWT ogłosiło, że udostępniło kody źródłowe Google Plugin for Eclipse, łącznie ze źródłami GWT Designer‚a. Kod został wydany na licencji Eclipse Public License (EPL) v1.0.

Co to dla nas oznacza? Od tej chwili każdy może mieć wgląd do źródeł obu projektów, każdy może też dołączyć do ekipy programistów. Można więc się spodziewać, że rozwój obu narzędzi nieco przyspieszy, a poprawki błędów będą pojawiały się szybciej. W przyszłości powstaną też być może komercyjne rozwiązania będące forkami powyższych projektów, mającymi jednak lepsze wsparcie od strony firm je produkujących.

Na uwagę zwraca też fakt ciekawej polityki Google’a, które rozwija projekt o zamkniętym kodzie i otwiera go dopiero w momencie uzyskania pożądanej funkcjonalności. Podobnie jest przecież z poszczególnymi wersjami Androida.

Implementacja weryfikacji obrazkowej CAPTCHA w GWT i JAAS

Istotnym problemem stron internetowych są nieproszone boty, które często uprzykrzają życie nie tylko administratorom serwisu, ale też użytkownikom, którzy chcieliby mieć dostęp do treści jak najwyższej jakości. Nic przecież tak nie drażni jak mnogość bezsensowych komentarzy z reklamami przy wpisie, dla którego np. toczyła się ciekawa dyskusja. Od lat podejmuje się próby rozróżnienia użytkownika będącego po drugiej stronie i stwierdzenia, czy mamy do czynienia z człowiekiem czy komputerem. Jednym ze sposobów jest zastosowanie CAPTCHA. Czy jest to sposób w pełni skuteczny? Jak się domyślasz, bądź wiesz – nie, jednak z pewnością eliminuje zdecydowaną większość mało zaawansowanych botów. Ważne jest też, aby CAPTCHA nie była zbytnim utrudnieniem dla właściwego użytkownika, bo nic tak nie irytuje, jak kilkukrotne odświeżanie obrazka, aby w końcu trafić na ten w miarę czytelny.

W niniejszym wpisie nie będę rozwodził się na temat skuteczności CAPTCHA, jak i przekonywał do używania tego typu zabezpieczenia lub nie. Nie chcę też sugerować konkretnego rodzaju zabezpieczenia, bo przecież oprócz najpopularniejszych  obrazków z mało czytelnymi literami i cyframi, istnieją jeszcze zabezpieczenia głosowe, czy takie polegające na wykonaniu jakiegoś zadania matematycznego, bądź inne bardziej wyrafinowane. Po prostu dostałem zadanie w firmowym projekcie polegające na implementacji weryfikacji obrazkowej i zanim się do tego zabiorę, postanowiłem nieco wcześniej rozeznać się w temacie.

Czytaj więcej »

Relacja wiele-do-wielu i Criteria API w JPA 2.0

Jakiś czas temu zapowiadałem pojawienie się artykułu na temat relacji wiele-do-wielu zrealizowanej za pomocą RequestFactory w GWT. Od tamtej pory trochę wody w Wiśle upłynęło, a ja z braku czasu nie miałem kiedy napisać o swoich poczynaniach. Jako że miniony weekend znalazłem trochę czasu i spędziłem go pod znakiem GWT, postanowiłem nadrobić zaległości.

Zdecydowałem się jednak rozdzielić temat RequestFactory od tematu JPA i opisać te dwa zagadnienia osobno. Podyktowane jest to przede wszystkim chęcią rozpisania się trochę o tym pierwszym, a i w związku z JPA chciałbym przedstawić kilka ciekawostek. Materiału trochę jest, więc zebranie tego wszystkiego razem tylko wydłużyłoby czas oczekiwania na nowy wpis. Sam projekt, a raczej kontynuacja tego rozpoczętego przy pierwszych bojach z RequestFactory i rozwijanego dalej podczas opisu możliwości walidacji encji w JPA i GWT, jest już prawie na ukończeniu i można go pobrać z repozytorium.

Relacja wiele-do-wielu (many-to-many) jest chyba najtrudniejszą relacją do zamodelowania i zrozumienia dla początkujących programistów. Jako jedyna po stronie bazy danych wymaga utworzenia osobnej tabeli (tzw. intersekcji) łączącej rekordy dwóch głównych tabel. Z tego też powodu zazwyczaj sprawia najwięcej trudności przy mapowaniu tabel na encje za pomocą JPA (podobnie zresztą w czystym Hibernate). Upraszczając problem, relację wiele-do-wielu można rozłożyć na dwie relacje jeden-do-wielu (one-to-many) i dołożyć mapowanie osobnej encji pełniącej rolę intersekcji. Wtedy jednak w encjach głównych dostaniemy bezpośredni dostęp za pomocą kolekcji jedynie do encji intersekcji, a nie do siebie nawzajem. Jak więc poprawnie napisać mapowanie wiele-do-wielu używając adnotacji @ManyToMany?
Czytaj więcej »

GWT 2.4 – wsparcie dla programistów Androida i nie tylko

Logo GWT

W poprzedniej wersji GWT było już widać, że Google mocno stawia na rozwój narzędzi programistycznych i chce, aby aplikacje powstawały coraz łatwiej i szybciej. Dlatego też kolejne wydanie GWT nie przynosi wielu zmian w samym sobie, a większość nowości dotyczy narzędzi wspierających tworzenie aplikacji w GWT, jak Google Plugin for Eclipse czy GWT Designer. Mimo wszystko zawsze warto stosować aktualną wersję GWT, więc zapraszam do pobierania.

Poniżej lista najważniejszych zmian:

  • App Engine Tools for Android

    Nowy GPE zawiera wsparcie dla deweloperów Androida upraszczające tworzenie metod serwisów po stronie serwera osadzonych na serwerze App Engine. Dzięki tej zmianie podczas tworzenia nowej usługi serwisu GPE generuje cały niezbędny kod aplikacji androidowej, a programista może skupić się na implementacji właściwej metody.

  • Apps Marketplace Support

    GPE pozwala teraz programiście na szybkie umieszczenie swojej aplikacji w serwisie Google Apps Marketplace, w analogiczny sposób jak do tej pory można było ją wgrać na serwer App Engine.

    Dodatkowo GPE umożliwia wygenerowanie prostego przykładu korzystającego z Google API, posiadającego mechanizmy uwierzytelniania, który można wgrać do Apps Marketplace. Plugin pozwala również na łatwe zarządzanie wgranymi aplikacjami, dzięki czemu ich aktualizacja może przebiegać szybko i bezproblemowo.

  • GWT Designer Enhancements

    Zmian nie ustrzegł się również GWT Designer, który znacznie przyśpieszył względem ostatniego wydania. Oprócz poprawek wydajnościowych został wyposażony w edytor WYSIWYG dla kodu UiBinder‚a. Dzięki temu można równocześnie pracować nad kodem źródłowym i obserwować wyniki wprowadzonych zmian. Znacznemu usprawnieniu uległa również edycja styli CSS, które teraz można edytować na podobnej zasadzie, jak wszystkie inne właściwości elementów GWT.

Te główne zmiany zostały opisane na blogu GWT. Widać, że Google silnie promuje nowe udogodnienia i stara się zachęcić programistów Androida do korzystania z GWT + GPE. Jeśli jednak nie jesteś jednym z nich, z pewnością ucieszysz się z wprowadzenia cache’u wyników kompilacji, dzięki czemu praca nad kodem aplikacji będzie szybsza i przyjemniejsza. Jeśli jesteś ciekaw pozostałych, mniej ważnych nowości, zachęcam do przeczytania pełnej listy zmian.

Database Change Notification – odbieranie zdarzeń z bazie danych Oracle

Dzisiaj będzie krótko, bo w związku ze zmianą mojego Centrum Dowodzenia (czyt. mieszkania) mam ostatnio trochę mało czasu i dużo gratów na głowie :) Będzie o tym, w jaki sposób w aplikacji napisanej w Javie odbierać zdarzenia z bazy danych Oracle. Po co to robić? Ano czasami trzeba, np. gdy duża część logiki biznesowej siedzi już w procedurach na bazie i nie ma szybkiego sposobu, żeby się jej pozbyć, albo mamy kilka aplikacji korzystających z tej samej bazy i nie mamy innego sposobu niż baza na zapewnienie komunikacji między nimi. W każdym bądź razie kiedyś musiałem takiego potworka zrobić i pomyślałem, że się tym podzielę.

Muszę też zaznaczyć, że jeśli tworzysz aplikację od nowa, bądź masz nieco możliwość wyboru rozwiązania, nie czytaj dalej. Użyj JMS, wywołuj zdarzenia po RMI, zrób cokolwiek byle nie to. Potraktuj bazę danych jako składnicę danych i nic więcej – ułatwisz życie sobie i innym, którzy mają utrzymywać później Twój kod. Zapytasz dlaczego? Po pierwsze nie ma jednego uniwersalnego sposobu na otrzymywanie zdarzeń z bazy (no chyba że w grę wchodzi cykliczne odpytywanie) i jest on zależny od danego dostawcy bazy danych. Po drugie, nie wszystkie bazy danych taki mechanizm mają. Po trzecie, może okazać się, że implementacja tego mechanizmu nie jest doskonała i napotkamy szereg problemów przy jej wdrożeniu. Jeśli już naprawdę potrzebujesz takiego rozwiązania, chcę Ci zaprezentować mechanizm Database Change Notification w bazie danych Oracle.

Czytaj więcej »

JPA i walidacja encji w projekcie GWT

Całkiem niedawno opisywałem moje boje z mechanizmem RequestFactory, który okazał się być całkiem fajnym tworem. Za jego pomocą udało się nam wtedy stworzyć aplikację z serwisami zorientowanymi na dane, gdzie warstwę dostępu do danych zapewniał nam Hibernate. Aplikacja potrafiła wykonać jedynie podstawowe operacje CRUD na pojedynczej encji i już wtedy zapowiedziałem, że w dalszym ciągu czekają na nas relacje między encjami oraz walidacja encji. Dzisiaj będę kontynuować stworzony wtedy projekt i zajmę się drugim z zapowiedzianych tematów, czyli normą JSR 303 definiującą reguły sprawdzania poprawności obiektów. Walidacja nie będzie skomplikowana i ma na celu jedynie pokazanie działania wraz z mechanizmem RequestFactory.

Aby materiału na dzisiaj nie było za mało, pokażę jak skonfigurować projekt, aby skorzystać ze standardu JPA, którego API zastąpi nam Hibernate’a. Ten ostatni będzie dalej obecny pod postacią dostawcy implementacji JPA, jednak jak zauważymy później, kod źródłowy będzie całkowicie od niego niezależny. Przy okazji pokuszę się o małe porównanie JPA z Hibernate’m.

Zacząłem trochę inaczej niż zawsze, gdyż na wstępie zazwyczaj skupiam się na sensowności/celu zastosowania danej technologii, a nie na tym co będziemy robić. Jeśli czujesz się trochę zawiedziony, to już to nadrabiam :) Po co używać więc JPA, jeśli mamy w projekcie doskonale działającego Hibernate’a? Po co uczyć się nowego, nieco innego API? Czy użycie JPA ma jakieś zalety, ewentualnie wady? Odpowiedzi na te pytania mogą być różne i wszystko zależy od tego, jaką aplikację tworzymy i w jakim środowisku będzie ona pracować. Przede wszystkim należy pamiętać, że Hibernate nie jest jedynym narzędziem ORM’owym i istnieje cała masa alternatywnych rozwiązań. Możemy np. trafić do zespołu, który będzie faworyzował Oraclowego TopLink‚a, bądź rozwijanego przez fundację Apache – Open JPA. Możemy też być uzależnieni od środowiska, np. osadzenie aplikacji na serwerze Google App Engine będzie wymagało od nas użycia DataNucleus‚a.

Czytaj więcej »

Java 7 wydana!

Java Logo

Na stronie Oracle’a pojawiła się długo oczekiwana nowa wersja platformy języka Java. Do pobrania dostępne jest zarówno JDK jak i JRE w wersji 7-mej, a obsługiwane systemy operacyjne to Linux, Solaris i Windows.

Nowe wydanie przynosi szereg usprawnień do maszyny wirtualnej oraz kilka mniej i bardziej ważnych zmian w samym języku. Najważniejsze z nich opisałem już wcześniej korzystając z dostępnej wtedy wersji Developer Preview.

Jak Java 7 zostanie przyjęta przez programistów? – to się okaże, wydaje się jednak, że przejście będzie następowało nieco szybciej, niż w przypadku migracji do wersji 6-tej. Pozostaje tylko czekać na wsparcie nowej wersji języka przez najważniejsze serwery aplikacji oraz środowiska programistyczne.

To co, czekamy teraz na Javę 8? :)

Alternatywa dla GWT-RPC: RequestFactory

Prawdopodobnie znasz już dobrze mechanizm GWT-RPC, który dostarcza podstawowy sposób komunikacji klient-serwer w projekcie wykorzystującym GWT. Mechanizm ten z powodzeniem działa już od pierwszych wersji GWT i mając z początku alternatywę jedynie w postaci ręcznych zapytań do serwletów http, wygrywa prawie każde starcie. Nie ustrzegł się jednak kilku dość istotnych wad (wynikających z ogólnej architektury aplikacji GWT), które nie tyle co coś uniemożliwiają, ale bardziej uprzykrzają życie programiście. O ile GWT-RPC w wywoływaniu prostych akcji sprawdza się świetnie, to implementacja dobrej warstwy pobierania danych jest już dość trudna. Problem leży w tym, że GWT nie potrafi zserializować obiektów encji wybieranych wprost z bazy danych poprzez np. Hibernate’a, które zawierają dowiązania do innych obiektów encji będących z nimi w relacji. W praktyce sprowadza się to do tego, że nie można stosować mapowań relacji typu „lazy”, gdyż informacje o relacjach przechowywane w obiektach encji nie mogą być zserializowane i przesłane do strony klienckiej. Relacje można więc sobie odpuścić (co jeszcze sprawdzi się w małej aplikacji), bądź przesyłać przez RPC obiekty specjalnych klas DTO (Data-Transfer Object), które będą zawierały jedynie niezbędne dla widoku informacje – a tu czeka nas ręczne i wolne przepakowywanie atrybutów obiektów oraz mozolne tworzenie klas DTO. Da się z tym żyć, jednak da się zrobić lepiej! Czytaj więcej »