LABORATORIUM ARCHITEKTURY SYSTEMÓW KOMPUTEROWYCH WYDZIAŁ ELEKTYCZNY POLITECHNIKA POZNAŃSKA System informacji giełdowej na urządzenia mobilne Inżynierska praca dyplomowa Projekt zespołowy Łukasz STACHOWIAK Tomasz SOBKOWIAK Promotor: dr inż. Krzysztof BUCHOLC Poznań 2009 System informacji giełdowej na urządzenia mobilne Spis treści WSTĘP ........................................................................................................................................... 4 1. SYSTEM MOBILE STOCK MONITOR ....................................................................................... 4 2. ARCHITEKTURA SYSTEMU MOBILE STOCK MONITOR ........................................................... 5 2.1. Ogólny schemat............................................................................................................. 5 3. BUDOWA SERWERA .............................................................................................................. 6 4. APLIKACJA DLA PLATFORMY JAVA MICRO EDITION.............................................................. 7 4.1. Wstęp ............................................................................................................................ 7 4.2. Wprowadzanie do platformy Java Micro Edition .......................................................... 7 4.3. Konfiguracje .................................................................................................................. 8 4.4. Profile ............................................................................................................................ 9 4.5. Konfiguracja Connected Limited Device Configuration .............................................. 10 4.6. Profil Mobile Information Device Profile .................................................................... 11 4.7. Szkielet budowy oraz cykl życia MIDletu .................................................................... 13 4.8. Zapis danych w systemie Record Management System ............................................. 15 4.9. Biblioteki dodatkowe .................................................................................................. 16 4.9.1. J2ME Web Services ............................................................................................. 16 4.9.2. OpenBaseMovil-db.............................................................................................. 17 4.9.3. Lightweight UI Toolkit ......................................................................................... 18 4.9.4. kXML .................................................................................................................... 19 4.10. 5. Implementacja aplikacji .......................................................................................... 19 4.10.1. Inicjalizacja aplikacji ............................................................................................ 19 4.10.2. Baza danych......................................................................................................... 20 4.10.3. Menu główne oraz struktura formularzy ............................................................ 22 Serwis WWW....................................................................................................................... 23 5.1. Funkcjonalność serwisu ................................................................................................... 23 ZAKOŃCZENIE.............................................................................................................................. 24 BIBLIOGRAFIA .............................................................................................................................. 25 3 System informacji giełdowej na urządzenia mobilne WSTĘP 1. SYSTEM MOBILE STOCK MONITOR 4 System informacji giełdowej na urządzenia mobilne 2. ARCHITEKTURA SYSTEMU MOBILE STOCK MONITOR 2.1. Ogólny schemat System Mobile Stock Monitor zbudowany w architekturze rozproszonej typu klientserwer. Ogólny schemat przedstawia poniższy rysunek. Głównym elementem systemu jest Serwer MSM którego zadaniem jest udostępnianie danych klientom mobilnym. Dane udostępniane przez serwer są wcześniej pobierane z zewnętrznego źródła i zapisywane w bazie danych MSM. 5 System informacji giełdowej na urządzenia mobilne 3. BUDOWA SERWERA 6 System informacji giełdowej na urządzenia mobilne 4. APLIKACJA DLA PLATFORMY JAVA MICRO EDITION Autorem rozdziału jest Łukasz Stachowiak 4.1. Wstęp Zostanie napisany po zakończeniu pisania pracy. 4.2. Wprowadzanie do platformy Java Micro Edition Początkowo język Oak stworzony przez Sun Microsystems na początku lat 90, przeznaczony dla urządzeń mobilnych nie odniósł sukcesu. Pomimo tego, że był on stworzony z myślą o tym by jak najbardziej ograniczyć liczbę błędów możliwych do popełnienia przez programistę (co było udręką programistów C++) nie udało się sprzedać żadnego urządzenia wyposażonego w obsługę tego języka. Po zmianie nazwy na Java i kierunku rozwoju, język ten stał się najpopularniejszym językiem programowania doby Internetu. Sukces zawdzięcza z pewnością obsłudze obiektowego paradygmatu programowania, przenośności, łatwości w programowaniu rozproszonym, bezpieczeństwu i niezawodności. Firma Sun po kilku latach ponownie rozpoczęła prace nad obsługa urządzeń przenośnych co poskutkowało wydaniem PersonalJava (znanym także pod nazwą pJava). Ostateczne uformowanie wszystkich edycji Javy nastąpiło w 1999 roku kiedy to Sun ogłosił istnienie trzech platform Java: Java Enterprise Edition (Java EE) – dla aplikacji biznesowych Java Standard Edition (Java SE) – dla aplikacji desktopowych Java Micro Edition (Java ME) – dla urządzeń o ograniczonych zasobach Platforma Java Micro Edition (Java ME) jest zbiorem technologii oraz specyfikacji do tworzenia aplikacji dla urządzeń o ograniczonych zasobach takich jak telefony komórkowe, urządzenia wbudowane, palmtopy. Platforma ta z czasem stała się podstawową w tworzeniu gier oraz programów użytkowych na tych urządzeniach. Językiem programowania na tej platformie jest oczywiście obiektowy język Java. Ponieważ zbiór urządzeń przenośnych jest bardzo duży i co za tym idzie możliwości każdego z nich są odmienne ze względu na liczbę posiadanej pamięci, moc procesora, dostępne inne peryferia (np. ekran, głośnik) twórcy postanowili utworzyć zbiór specyfikacji tworzących zbiór platform. Taka specyfikacja nazywana jest konfiguracją i definiuje ona platformę dla określonego zbioru urządzeń elektronicznych. Taka konfiguracja jest rozszerzana przez profile które dodają 7 System informacji giełdowej na urządzenia mobilne określone możliwości w celu wyspecjalizowania platformy dla konkretnej grupy urządzeń. Ponad to taka platforma może zostać wzbogacona o pakiety opcjonalne nadające specyficzne możliwości lub obsługę konkretnych technologii. Na rysunku 5.1 przedstawiono schemat architektury platformy Java ME. Rysunek 4.1. Architektura platform Java wraz z wyszczególnioną platformą Micro Edition[2]. Taka architektura może wydawać się skomplikowana jednak firma Sun dość intensywnie prowadziła rozmowy z producentami urządzeń aby objęła ona jak największą ich liczbę. Skutkiem tego stało się praktycznie wprowadzenie nowego standardu – większość nowych urządzeń przenośnych posiada w sobie obsługę platformy Java ME. 4.3. Konfiguracje Konfiguracja jest podstawą platformy, specyfikuje ona minimalne cechy grupy urządzeń które obejmuje i tworzy spójne środowisko dla programistów. Środowisko oprogramowania rodziny urządzeń, jest charakteryzowane przez następujące cechy: 8 System informacji giełdowej na urządzenia mobilne typ i ilość dostępnej pamięci typ i prędkość procesora typ połączenia sieciowego jakie udostępnia urządzenie Java ME została podzielona na dwie główne konfiguracje: Connected limited device configuration (CLDC) – przeznaczona jest dla urządzeń takich jak telefony komórkowe, posiadających bardzo ograniczone zasoby pamięciowe oraz moc procesora. Konfiguracja ta zostanie szerzej opisana w jednym z następnych podrozdziałów. Connected device configuration (CDC) – przeznaczona jest dla bardziej rozbudowanych urządzeń na których możliwe jest uruchomienie bardziej rozbudowanych programów. Przyjęto wymaganie co najmniej 2 MB pamięci podręcznej aby możliwa była obsługa tej konfiguracji przez urządzenie. CDC najczęściej przeznaczone jest dla urządzeń typu PDA. Każda konfiguracja składa się z maszyny wirtualnej oraz zestawu podstawowych klas. Ze względu na ograniczone zasoby urządzeń maszyna wirtualna Java ME nie może zapewnić pełnej funkcjonalności którą posiada maszyna wirtualna Java SE. Dlatego jej specyfikacja składa się z elementów języka Java oraz maszyny wirtualnej Java SE z której nie musi posiadać. Np. w pierwszej wersji CLCD nie wymagana była obsługa liczb zmienno przecinkowych i nie została ona zaimplementowana. 4.4. Profile Profile rozszerzają konfigurację tak aby dopasować całą platformę do wymagań konkretnej grupy urządzeń (jak np. telefony komórkowe). Wprowadzają nowe pakiety klas dodające obsługę np. urządzeń wejścia wyjścia, ekranu, mediów, pamięci trwałej itd. Profili zostało zdefiniowanych znacznie więcej niż konfiguracji, co więcej wszystkie z nich zostały opracowane w ramach inicjatywy Java Community Process (JCP). Program ten ma na celu zebranie grupy specjalistów w danej dziedzinie i opracowanie spójnej specyfikacji dla danego problemu[4]. Dzięki takiemu podejściu wszystkie stworzone profile, w których opracowywaniu brały udział firmy produkujące docelowe urządzenia, są powszechnie zaakceptowane i mogą być obsługiwane przez znacznie większą liczbę urządzeń. Do najbardziej popularnych profili należą: 9 System informacji giełdowej na urządzenia mobilne Mobile Information Device Profile PDA Foundation Personal i Personal Basis 4.5.Konfiguracja Connected Limited Device Configuration Przed przystąpieniem do pracy nad aplikacją koniecznie jest zapoznanie się ze środowiskiem w jakim ta aplikacja będzie pracować. Dlatego w tym i w kolejnych podrozdziałach zostaną omówione szczegóły konfiguracji CLDC, profilu MIDP a następnie kilku podstawowych bibliotek z których autor korzystał w trakcie implementacji. Aplikacja Mobile Stock Monitor oparta jest o konfigurację Connected Limited Device Configuration w wersji 1.1 która jest najczęściej spotykaną konfiguracją na urządzeniach przenośnych. Ta konfiguracja posiada następujące wymagania sprzętowe: 160 kb pamięci nieulotnej dla maszyny wirtualnej oraz bibliotek podstawowych 32 kb pamięci podręcznej do uruchomienia aplikacji 16 lub 32 bitowy procesor Obejmuje następujące elementy: język Java maszynę wirtualną (KVM) biblioteki podstawowe (pakiety klas java.lang.* oraz java.util.*) obsługę wejścia/wyjścia (pakiet klas java.io.*) bezpieczeństwo obsługę sieci internacjonalizacja Ze względu na niezwykle małe rozmiary maszyna wirtualna Java ME nazwana została kilobajtową maszyną wirtualną (ang. kilobyte virtual machine) jednak przyjętą nazwą stosowaną dla niej jest skrót KVM (z ang. kilobyte virtual machine). Biblioteki wchodzące w skład specyfikacji to w większości biblioteki pochodzące ze standardowej wersji Javy w wersji 1.3. Jednak ta lista została w znaczący sposób 10 System informacji giełdowej na urządzenia mobilne ograniczona, nie tylko ze względu na oszczędność zasobów ale także bezpieczeństwo oraz „oczyszczenie” języka z niezalecanych w użytku już klas oraz metod (oznaczone jako przedawnione – ang. deprecated). W tej konfiguracji brakuje następujących elementów: refleksja – brak pakietu java.lang.reflect oraz metod w pakiecie java.lang.Class związanych z refleksją brak metod finalizujących finalize() brak interfejsu Java Native Interface umożliwiającego uruchamianie kodu napisanego w innym języku programowania niż Java ograniczona została liczba typów wyjątków oraz błędów zmniejszono liczbę metod w obsłudze wątków oraz uniemożliwiono tworzenie ich grup a także wątków demonów brak możliwości definiowania własnych klas ładujących CLDC wprowadza dodatkowo jedną bibliotekę nazwaną Generic Connection Framework której przeznaczeniem jest obsługa połączeń sieciowych. Ta biblioteka jednak nie posiada implementacji obsługi żadnego protokołu sieciowego. Stanowi jedynie interfejs na bazie którego należy tworzyć połączenia sieciowe. Konkretną implementacją poszczególnych protokołów sieciowych zajmuje się rozszerzający konfigurację profil. Biblioteka ta została zdefiniowana w pakiecie javax.microedition.io [3]. Wybór konfiguracji CLDC w wersji 1.1 dla tworzonej aplikacji ogranicza w niewielkim zakresie liczbę urządzeń dla których może być ona przeznaczona. Jednak wybór ten był jednak konieczny ze względu na brak obsługi liczb zmienno przecinkowych w wersji 1.0 tej konfiguracji. Bez tego typu operacji zarówno nie byłoby możliwe wierne oddanie notowań giełdowych oraz aplikacja stała by się uboższa ze względu na wymaganie ich obsługi przez biblioteki zewnętrze które także zostały użyte podczas implementacji. 4.6. Profil Mobile Information Device Profile Profil MIDP w wersji 2.0 jest najpopularniejszym profilem używanym w urządzeniach przenośnych. Jego implementacja znajduje się na praktycznie każdym modelu wydawanym modelu telefonu komórkowego. Profil ten w wystarczający sposób 11 System informacji giełdowej na urządzenia mobilne rozszerza konfigurację CLDC zapewniając bardzo rozwinięte środowisko do tworzenia aplikacji użytkowych oraz gier. Głównymi elementami wprowadzanymi przez MIDP są: obsługa protokołów sieciowych TCP, UDP, HTTP a także połączeń szyfrowanych SSL tworzenie interfejsu użytkownika obsługa klawiatury obsługa zdarzeń wprowadzanie wielu kontrolek ułatwiających tworzenie gier odtwarzanie dźwięków obsługa dodatkowych urządzeń jak np. wbudowany aparat fotograficzny utrwalanie danych w pamięci stałej obsługa ekranów dotykowych Zwiększona liczba bibliotek odbija się na wymaganiach sprzętowych narzucanych urządzeniom. Wymagane jest dodatkowo: 256 kb pamięci trwałej 8 kb dodatkowej pamięci trwałej na zapis danych 128 kb pamięci podręcznej Oraz urządzenie powinno dodatkowo posiadać: ekran wielkości 96 na 54 piksele o co najmniej 1 bitowej głębi kolorów urządzenie wejściowe typu klawiatura lub ekran dotykowy połączenie sieciowe możliwość odgrywania dźwięków mechanizm zapisu oraz odczytu danych z pamięci trwałej oraz obsługę innych elementów jak format PNG, kodowanie UTF-8. Ich lista została zawarta w dokumencie [5] Aplikacje MIDP nazywane są MIDletami i są rozprowadzane w plikach typu jar (java archive). Możliwe jest także umieszczanie wielu MIDletów w jednym pliku jar nazywanym zestawem MIDletów (ang. MIDlet Suits). Taki zestaw jest traktowany jako całość i nie można usuwać pojedynczo MIDletów wchodzących w jego skład [5]. 12 System informacji giełdowej na urządzenia mobilne 4.7.Szkielet budowy oraz cykl życia MIDletu Profil MIDP narzuca określony szkielet budowy MIDletu a także definiuje cykl życia aplikacji tego typu. Każdy MIDlet musi posiadać jedną klasę dziedziczącą po abstrakcyjnej klasie basowej javax.microedition.midlet.MIDlet. Taka klasa staje się główną w aplikacji i to od niej zaczyna się jej działanie. Abstrakcyjna klasa MIDlet zawiera w sobie metody konieczne obsługi przejść między poszczególnymi stanami cyklu życia, dodatkowo wymusza implementację kilku metod. Najprostszy szkielet MIDletu przedstawia się następująco: public class SzkieletMIDletu extends MIDlet { protected void startApp() throws MIDletStateChangeException { } protected void pauseApp() { } protected void destroyApp(boolean unconditional) throws MIDletStateChangeException { } } Dodatkowo wymagane jest przez klasę posiadanie konstruktora bezargumentowego. Jeśli taki nie zostanie zdefiniowany zostanie automatycznie utworzony podczas kompilacji. Metody startApp, pauseApp, destroyApp są ściśle związane z cyklem życia aplikacji. W urządzeniach typu telefon komórkowy konieczna jest obsługa zdarzeń typu odebranie połączenia telefonicznego, aplikacja w takim momencie nie może blokować nadchodzącej rozmowy lecz musi w poprawny sposób zostać wstrzymana, a po zakończeniu rozmowy ponownie przywrócona do poprzedniego stanu. Dlatego wydzielono trzy możliwe stany w jakich może znajdować się aplikacja: zatrzymany, aktywny, zniszczony. Diagram poniżej przedstawia przejścia pomiędzy poszczególnymi stanami. 13 System informacji giełdowej na urządzenia mobilne Rysunek 4.2. Diagram przejść między poszczególnymi stanami aplikacji typu MIDlet. Jak przedstawiono powyżej metody których implementacja jest wymuszana są wywoływane przed przejściem w kolejny stan zgodnie z diagramem. Programista może dzięki temu wykonać niezbędne czynności aby aplikacja bezpiecznie przygotowała się do zmiany stanu. Bardziej szczegółowego omówienia wymaga metoda destroyApp odpowiedzialna za zwalnianie zasobów podczas zamykania aplikacji. Posiada on jeden parametr uncoditional typu logicznego który decyduje czy operacja zamykania aplikacji może zostać przerwana i pozostać w swoim aktualnym stanie czy zamknięcie aplikacji jest nieuniknione. W pierwszym przypadku wartość tego parametru to false, może to zostać wykorzystane np. by dać szanse użytkownikowi na zapisanie wyników pracy, jeśli takiej możliwości nie ma i MIDlet musi zostać natychmiast zamknięty wartość parametru to true. Należy także zwrócić uwagę na wyjątek typu MIDletStateChangeException który może zostać zgłoszony przez metody startApp oraz destryApp. Jest on generowany w przypadku gdy zmiana stanu nie jest z jakiś powodów możliwa [1]. 14 System informacji giełdowej na urządzenia mobilne 4.8.Zapis danych w systemie Record Management System Profil MIDP wprowadza uniwersalny system zapisu i odczytu danych który zapewnia przenośność między różnego typu urządzeniami. System ten jest oparty o prostą rekordową bazę danych i nazwany został Record Management System (RMS). W RMS dane utrwalane są w zbiorach rekordów. Taki zbiór jest przechowywany w pamięci trwałej nawet po wyłączeniu aplikacja i jest dostępny przy każdym jej uruchomieniu. Za integralność danych zawartych w rekordach odpowiada system operacyjny danego urządzenia. Musi on zapewnić trwałość tych danych nawet podczas takich sytuacji jak restart systemu czy jego wyłączenie spowodowane rozładowaniem baterii. Zbiory rekordów są tworzone w niezależny od platformy sposób. Każdy MIDlet może ich utworzyć dowolną liczbę, jedynym warunkiem jest nadawanie każdemu unikalnej nazwy w obrębie zestawu MIDletów. Nazwa może być dowolnym ciągiem znaków Unicode (wielkość liter ma znaczenie) o maksymalnej długości 32 znaki. Możliwe jest także nadawanie uprawnień zbiorom tak aby mogły być współdzielone przez większa liczbę MIDletów. Ponad to zbiory są oznaczane znacznikami czasu który reprezentuje datę ostatniej modyfikacji na nim wykonanej. Przy każdej operacji zwiększana jest także jego wersja która jest reprezentowana przez liczbę całkowitą. Takie dodatkowe oznaczenia ułatwiają w niektórych przypadkach synchronizację danych. Kiedy MIDlet jest usuwany z pamięci telefonu wszystkie jego zbiory są także usuwane. Każdy przechowywany rekord jest tablicą bajtów. Programista pragnący zapisać jakąś daną musi najpierw zamienić ją na tablicę bajtów i dopiero wtedy będzie możliwego jej zapisanie w systemie RMS. Rekordy w obrębie zbioru są automatycznie indeksowane. Pierwszy rekord zapisywany posiada identyfikator 1 i dla każdego kolejnego wprowadzanego rekordu ta wartość jest inkrementowana. Dla programisty korzystającego z RMS najważniejszą klasą jest RecordStore która odpowiada za zarządzanie wszystkimi danymi zapisywanymi w pamięci trwałej. Klasa ta posiada wiele użytecznych metod z których do najważniejszych należą: openRecordStore – tworzy nowy zbiór rekordów addRecord – dodaje rekord do zbioru setRecord – modyfikuje dany rekord 15 System informacji giełdowej na urządzenia mobilne getRecord – pobiera wybrany rekord, metoda zwraca tablicę bajtów enumarateRecords – metoda zwraca obiekt typu RecordEnumeration pomocna przy przeglądaniu rekordów danego zbioru Rekordy przeglądane za pomocą klasy RecordEnumeration można dodatkowo filtrować i sortować. Wystarczy przypisać obiekt implementujący interfejs RecordFilter dla filtru oraz RecordComparator dla sortowania, daje to możliwość przeglądania tylko wybranych rekordów w odpowiednim porządku [5]. Pomimo sporych możliwości Record Management System jest dla programisty dość niewygodny w użyciu. Główną tego przyczyną jest zapis danych w postaci tablicy bajtów, rodzi to dodatkowe problemy w konwersjach takiej tablicy na konkretne typy danych. RMS jest jednak elementem profilu MIDP bez którego nie można stworzyć funkcjonalnej aplikacji. W aplikacji która jest przedmiotem tego rozdziału RMS został użyty do zapisu danych konfiguracyjnych oraz informacji o użytkowniku. Do przechowywania większych zbiorów danych wykorzystana została biblioteka OpenBaseMovil-db, która została utworzona właśnie na bazie RMS. Będzie ona dokładniej omówiona w dalszej części rozdziału. 4.9.Biblioteki dodatkowe Praktycznie wszystkie tworzone w dzisiejszych czasach aplikacje na wszelkie możliwe platformy korzystają z zewnętrznych bibliotek aby zwiększyć bezpieczeństwo oraz przyspieszyć proces ich tworzenia. Biblioteki takie są sprawdzonym i uniwersalnym rozwiązaniem które może zostać zastosowane w bardzo szerokim spektrum. Dlatego także w aplikacji Mobile Stock Monitor postanowiono skorzystać z kilku sprawdzonych rozwiązań aby nie tylko przyspieszyć proces powstawania aplikacji ale także zwiększyć funkcjonalność i zapewnić większą przenośność. Poszczególne dodatkowe biblioteki zostaną omówione w kolejnych podpunktach. 4.9.1. J2ME Web Services Specyfikacja J2ME Web Services została opracowana przez grupę ekspertów w ramach inicjatywy Java Community Process. Jej celem było zdefiniowanie opcjonalnego pakietu bibliotek odpowiedzialnych za przetwarzanie dokumentów XML oraz poprawną komunikację z serwisami sieciowymi komunikującymi się poprzez protokoły oparte o XML a w szczególności SOAP. Implementacja tej specyfikacji jest 16 System informacji giełdowej na urządzenia mobilne przeznaczona zarówno dla konfiguracji CLDC jak i CDC i jej implementacja na urządzeniu jest wymagana do poprawnego działania aplikacji Mobile Stock Monitor [6]. 4.9.2. OpenBaseMovil-db System Record Management System pomimo dobrej idei aby stworzyć uniwersalne rozwiązanie dla zapisu danych na urządzeniach przenośnych zostało w znaczący sposób zepsute przez producentów konkretnych urządzeń. Nie każdy model urządzenia obsługiwał system RMS w ten sam sposób. Np. pojawiały się problemy w ograniczeniami na wielkość zbioru, lub ich liczbę. Tego typu różnice w znaczący sposób utrudniają stworzenie uniwersalnej aplikacji zarządzającej dużym zbiorem danych i niszczą idee niezależnych od platformy rozwiązań javowych. Twórcy biblioteki OpenBaseMovil-db wyszli naprzeciw tym nieścisłością i stworzyli uniwersalną relacyjną bazę danych niezależną od modelu urządzenia i ograniczeń przez nie narzucanych. Biblioteka ta umożliwia tworzenie wielu baz danych, tabel, indeksów czy wierszy w tabeli i jest ograniczona jedynie przez liczbę dostępnej przestrzeni w pamięci trwałej. Nie zaimplementowano obsługi języka zapytań SQL jednak obiektowy dostęp do danych został znacznie bardziej poszerzony w stosunku do systemu RMS. Wprowadzono także podstawowe typy danych jakie mogą być przechowywane w kolumnach: BLOB Boolean Date Image Int Long Short String Zwalnia to programistę z kłopotliwej kontroli typów czy serializacji/deserializacji obiektów podczas operacji na danych. Dla wbudowanych typów zaimplementowany już zostały metody wyszukujące oraz sortujące. Ciekawą możliwością jest wyszukiwanie wierszy w tabeli które posiadają odpowiednie (podane) wartości w większej liczbie kolumn [7]. 17 System informacji giełdowej na urządzenia mobilne Inne możliwości oraz przykłady użycia tej biblioteki zostaną opisane w części rozdziału poświęconej implementacji. 4.9.3. Lightweight UI Toolkit Innym wyzwaniem stawianym przed programistami platformy Java ME jest interfejs użytkownika. Pomimo jednakowego zestawu bibliotek standardowych zawartych w profilu dla wszystkich urządzeń utworzona aplikacja może wyglądać i zachowywać się zupełnie inaczej na różnych urządzeniach. Co więcej dość uboga liczba kontrolek zmusza często programistów do pisania własnych, trudnych do zaimplementowania rozwiązań. Tego typu problemy rozwiązuje biblioteka do tworzenia bogatego interfejsu użytkownika Lightweight UI Toolkit (LWUIT). Jest to darmowe rozwiązanie rozprowadzane na licencji GPL 1 zapewniające identyczny wygląd oraz zachowanie aplikacji na każdym urządzeniu przenośnym. LWUIT zostało stworzone na wzór biblioteki Java SE do tworzenia interfejsu użytkownika Swing, ten model zapewnia łatwe przejście dla programistów mający doświadczenie wcześniej wyłącznie z programowaniem aplikacji desktopowych na programowanie aplikacji na urządzenia mobilne. Do głównych cech biblioteki należą: interfejsy klas podobne do Swingowych duży zestaw gotowych komponentów możliwość rozmieszczania komponentów w wielu rodzajach układów łatwa zmiana styli komponentów (tzw. Look and Feel) możliwość tworzenia motywów dla aplikacji obsługa wielu czcionek obsługa ekranów dotykowych łatwe tworzenie animacji oraz efektów przejść między ekranami internacjonalizacja integracja z SVG możliwość wyświetlania animacji 3D Dodatkowo pomimo bogatego zestawu gotowych komponentów tworzenie własnych jest znacznie prostsze niż w przypadków biblioteki standardowej. 1 [9] 18 Żadna klasa System informacji giełdowej na urządzenia mobilne komponentu w bibliotece LWUIT nie jest oznaczona słowem kluczowy final 2 co oznacza, że programista może w łatwy sposób dziedziczyć jej zachowanie w własnych podklasach i zmieniać jego wygląd oraz zachowanie dostosowując je do własnych potrzeb. MIDlety tworzone za pomocą tej biblioteki charakteryzują się także wysoką responsywnością, ponieważ komponenty rysowane są na osobnym wątku co nie zatrzymuje aplikacji. Razem z biblioteką rozpowszechniany jest także specjalny edytor zasobów, który umożliwia tworzenie pakietów zasobów dla aplikacji LWUIT. Do takiego pakietu możemy dołączyć czcionki, obrazy, animacje, tłumaczenia tekstów na poszczególne języki a także gotowe motywy których tworzenie jest także jedną z funkcjonalności programu. LWUIT wymaga środowiska CLDC 1.1/MIDP 2.0 oraz 272 kb pamięci trwałej dla zestawu bibliotek [8]. 4.9.4. kXML Niektóre komunikaty odbierane z serwera są w postaci dokumentów XML. Aby je przetworzyć w poprawny sposób wykorzystywana jest biblioteka kXML. Jej niezwykle małe rozmiary (składa się z zaledwie 3 klas) oraz możliwości wystarczające do przetwarzania mało skomplikowanych wiadomości XML w bardzo dobry sposób wpasowują ją do zastosowań w aplikacjach Java ME. Przykłady użycia biblioteki zostaną opisane w podrozdziale dotyczącym implementacji [11]. 4.10. Implementacja aplikacji W następnych podrozdziałach autor przedstawi szczegółowy opis implementacji najważniejszych części programu. 4.10.1. Inicjalizacja aplikacji Główną klasa aplikacji jest MSMClient która to jest podklasą klasy MIDlet. Z tego względu jest ona zmuszona implementować metodę startApp od jakiej rozpoczyna się uruchomienie aplikacji. Metoda ta wykonuje podstawowe operacje. W pierwszej kolejności inicjalizowany jest ekran poprzez wywołanie metody Display.init() w której jako parametr podawany jest obiekt MIDletu. Następnie wczytuje się główny motyw graficzny. 2 Klasy języka Java oznaczone słowem kluczowym final nie mogą podlegać dziedziczeniu [10]. 19 System informacji giełdowej na urządzenia mobilne Resources r = Resources.open(THEME_FILE); UIManager.getInstance(). setThemeProps(r.getTheme(r.getThemeResourceNames()[0])); W pierwszej linii następuje wczytanie zasobu znajdującego się w katalogu wskazywanym przez stałą 3 THEME_FILE a w kolejnej jego wczytanie oraz zastosowanie jako głównej. W jednym zbiorze może znajdować się więcej niż jeden motyw dlatego metoda getThemeResourceNames zwraca tablicę w której następuje odwołanie do pierwszego elementu. Po tej operacji możliwe jest wyświetlenie okna z informacją dla użytkownika, o wczytywaniu aplikacji, co realizuje następujący kod: 4.10.2. Baza danych Biblioteka OpenBaseMovil-db umożliwia utworzenia na bazie systemu zapisu RMS imitacji bazy danych w środowisku Java ME. Baza danych zastosowana w aplikacji składa się z dwóch tabel, które przedstawione są na poniższym schemacie. Rysunek 4.3. Diagram przedstawiający tabele dostępne w bazie danych W tabeli stockcorps przechowywane są informacje na temat spółek giełdowych, które może obserwować użytkownik. Poszczególne kolumny przechowują następujące informacje: Id – całkowitoliczbowy identyfikator spółki shortname – nazwa skrócona spółki (3 znaki) Przyjęło się tak nazywać zmienne oznaczone jako statyczne oraz finalne jednocześnie, pomimo tego, że w języku Java nie istnieje taki byt jak stała. 3 20 System informacji giełdowej na urządzenia mobilne name – pełna nazwa spółki (maksimum 30 znaków) observed – wartość boolowska określająca czy użytkownik obserwuje daną spółkę Drugą tabelą jest stockquotes przechowująca informację na temat notowań spółek: stock_id – identyfikator spółki price – cena akcji change – zmiana w stosunku do poprzedniej wartości (procentowo) total – obrót (w tyś. zł.) date – data kiedy spółka posiadała takie notowania last_result – pole pomocnicze oznaczające czy dane w tym rekordzie są najbardziej aktualne Pola price oraz OpenBaseMovil-db change przechowywane niestety nie jako liczby całkowite. umożliwia Biblioteka przechowywania liczb zmiennoprzecinkowych dlatego te wartości przed zapisem są mnożone przez 100 i zapisywane jako całkowite. Za tworzenie i zarządzenie bazą danych odpowiada obiekt klasa typu singleton 4 MSMDb przechowywana w pakiecie msm.j2meclient.data. Struktura bazy tworzona jest jednokrotnie podczas pierwszego uruchomienia aplikacji na urządzeniu. Za tę operację odpowiada metoda createDB: dbh = Database.connect(DATABASE_NAME); if (dbh.getVersionMajor() == (short) 0) { dbh.drop(); dbh = Database.create(DATABASE_NAME); dbh.setVersionMajor((short) 1); createTables(dbh); } W pierwszej kolejności wykonywane jest łączenie z bazą danych, która gdy nie istnieje jest automatycznie tworzona. Aby stwierdzić czy baza wcześniej nie została utworzona wykorzystywana jest informacja o wersji bazy. W przypadku gdy jej wartość jest równa 4 Klasy typu singleton mogą posiadać tylko jedną instancję[wstawić literature]. 21 System informacji giełdowej na urządzenia mobilne zero, oznacza to, że nie została wcześniej utworzona i wykonywane jest usuwanie informacji, przypisanie wersji równej jeden, a następnie w metodzie createTables tworzenie struktury. Przykładowe utworzenie tabeli stockcorps wygląda następująco: Table stockCorpTable = new Table("stockcorps"); stockCorpTable.addColumn("id", Constants.FT_LONG); stockCorpTable.addColumn("shortname", Constants.FT_STRING, 5); stockCorpTable.addColumn("name", Constants.FT_STRING, 30); stockCorpTable.addColumn("observed", Constants.FT_BOOLEAN); W pierwszej kolejności tworzony jest obiekt typu Table a następnie za pomocą metody addColumn dodawane są kolumny. Informacja potrzebna do stworzenia kolumny to jej nazwa, oraz typ danych jaki będzie przechowywać. Nazwy typów danych jakie mogą być przechowywane zdefiniowane zostały jako stałe w klasie Constants biblioteki OpenBaseMovil-db. Biblioteka ta aby możliwe było wyszukiwanie danych wymusza na programiście zdefiniowanie indeksów na poszczególnych kolumnach. Przykładowo indeks na polu id tworzy się następująco: stockCorpTable.createIndex("id_index", "id"); Dzięki temu możliwe jest teraz wyszukiwanie po wartościach w polu id. Po zakończeniu tworzenia tabeli zostaje ona zapisana w wywołaniu metody na obiekcie bazy danych createTable której parametrem jest tworzona tabela. Podczas pierwszego uruchomienia dodawane do bazy są także informacje o wszystkich spółkach dostępnych. Proces ten ze względu na dużą ich liczbę może trwać do 2-3 minut. 4.10.3. Menu główne oraz struktura formularzy 22 System informacji giełdowej na urządzenia mobilne 5. Serwis WWW Autorem rozdziału jest Łukasz Stachowiak 5.1. Funkcjonalność serwisu W dzisiejszych czasach praktycznie każda aplikacja posiada własną stronę WWW. Zadaniem takiej strony jest przedstawienie możliwości aplikacji oraz dodatkowa funkcjonalność zależna od charakteru produktu. Dla systemu Mobile Stock Monitor serwis WWW przedstawiony w tym rozdziale pełni rolę uzupełnienia aby cała platforma tworzyła całość. Do zadań serwisu należy: rejestracja nowych użytkowników, zarządzanie profilem, wybór obserwowanych spółek. 5.2. Platforma Java Enterprise Edition Serwis WWW został zbudowany na platformie Java Enterprise Edition 5 (Java EE). Platforma ta definiuje środowisko do tworzenia aplikacji działających w sieci której głównymi elementami są Enterprise JavaBeans, serwlety oraz JavaServer Pages (JSP). Te trzy elementy tworzą razem kompletne rozwiązanie dla tworzenia aplikacji. Gotowe aplikacje Java EE uruchamiane są na serwerze aplikacyjnym zgodnym z tą platformą. Do najważniejszych cech wyróżniających tę platformę są: bezpieczeństwo, transakcyjność, współbieżność, trwałość, obsługa obiektów rozproszonych. 23 System informacji giełdowej na urządzenia mobilne ZAKOŃCZENIE 24 System informacji giełdowej na urządzenia mobilne BIBLIOGRAFIA [1.] Kim Topley, J2ME Almanach, Helion, Gliwice 2003 [2.] Oficjalna strona platformy Java Micro Edition http://java.sun.com/javame/index.jsp [3.] Specyfikacja CLDC 1.1 http://jcp.org/en/jsr/detail?id=139 [4.] Strona główna programu Java Community Process http://jcp.org/en/home/index [5.] Specyfikacja MIDP 2.0 http://jcp.org/en/jsr/detail?id=118 [6.] Specyfikacja J2ME Web Services http://jcp.org/en/jsr/detail?id=172 [7.] Oficjalna strona biblioteki OpenBaseMovil http://www.openbasemovil.org/ [8.] Oficjalna strona biblioteki Lightweight UI Toolkit https://lwuit.dev.java.net/ [9.] Licencja GPL http://www.gnu.org/licenses/old-licenses/gpl-2.0.html [10.] Cay S. Horstmann, Gary Cornell, Java 2 Podstawy, Helion, Gliwice 2003 [11.] Oficjalna strona biblioteki kXML http://kxml.objectweb.org/ 25