====Raport końcowy==== === Obsługa bazy danych i logika aplikacji === * Baza danych została zaprojektowana z wykorzystaniem narzędzia Toad. * Ze stworzonych diagramów ERD, został wygenerowany skrypt w języku PostgreSQL. Automatyczne generowanie skryptu bazy okazało się być rozwiązaniem wygodnym, jednak generującym błędy wymagające ręcznego poprawienia. * Logika aplikacji i komunikacja z bazą zostały zaimplementowane w języku Java. * Unordered List ItemJako silnik aplikacji został wybrany JBoss 6.0. * Mapowanie obiektowo-relacyjne zostało przperowadzone z wykorzystaniem modułu JPA i frameworku Hibernate. * Zapytania kierowane do bazy zostały stworzone w języku Hibernate Query Language (HQL) i zaimplementowane wewnątrz beanów w ramach modułu EJB (wykorzystana wersja 3.0). Poniższy przyklad przedstawia fragment beana realizującego blokowanie konta użytkownika. @Override public void addEventComment(String eventName, String comment, String author) throws NoSuchEvent, NoSuchUserException { String getEvent = "SELECT a FROM Event as a WHERE a.eventName=?"; Query getEventQ = em.createQuery(getEvent); getEventQ.setParameter(1, eventName); try{ Event ev=(Event) getEventQ.getSingleResult(); EventComment eventComment=new EventComment(); eventComment.setComment(comment); eventComment.setEvent(ev); eventComment.setCreationDate(new Timestamp(Calendar.getInstance().getTimeInMillis())); String getAuthor= "SELECT a FROM User as a WHERE a.email=?"; Query getAuthorQ=em.createQuery(getAuthor); getAuthorQ.setParameter(1, author); try{ User u=(User)getAuthorQ.getSingleResult(); eventComment.setUser(u); em.merge(eventComment); } catch(NoResultException e){ throw new NoSuchUserException(""); } } catch(NoResultException e){ throw new NoSuchEvent(); } } Działanie beanów zostało przetestowane przy pomocy testów jednostkowych z wykorzystaniem frameworku JUnit4. Przykład testu, pokazujący korzystanie z API dostarczonego przez moduł EJB. @Test public void addEventComment() throws InactiveUserAccount, NoSuchUserException, ObjectAlreadyExistsException, NoSuchCategoryException, NotCompleteInfoException, WrongInputData, NoSuchEvent{ long now=Calendar.getInstance().getTimeInMillis(); long oneDayInMilis=24*60*60*1000; long startTime=now+oneDayInMilis*7; long singInDeadline=startTime-2*oneDayInMilis; long stopTime=startTime+2*60*60*1000; EventTimes times=new EventTimes(startTime, stopTime, singInDeadline, false, null); Location loc=new Location(100L, 200L); ParticipantRequirements reqs=new ParticipantRequirements(34, 12, false, RequiredGender.NONE, false, null); userEjb.addNewUser{{:pl:dydaktyka:ztb:2011:projekty:meetus:dodawanie_wydarzen.png|}}("dora", 23, false, false); catEjb.addCategory("noga", "dora"); eventEjb.addEvent("mecz","noga" , "whatever", "dora",times,reqs,loc); eventEjb.addEventComment("mecz", "bylo fajnie", "dora"); } === Interfejs === Do aplikacji został dołącząny interfejs wwww. Logowanie. Zostało zaimplementowane poprzez integrację z portalem facebook. Takie rozwiązanie umożliwia użytkownikom facebooka automatyczne logowanie do naszego serwisu. {{:pl:dydaktyka:ztb:2011:projekty:meetus:logowanie.png|}} Po zalogowaniu użytkownik przenoszony jest na stronę portalu gdzie dostępne są takie opcje jak wyszukiwanie wydarzeń, dodawanie wydarzeń, dodawanie kategorii, statystyki i inne. Przykładowy formularz dodawania wydarzenia: {{:pl:dydaktyka:ztb:2011:projekty:meetus:dodawanie_wydarzen.png|}} W ramach projektu została zaimplementowana integracja z mapami Google umożliwiająca w prosty sposób wybór lokalizacji poszukiwanego zdarzenia: {{:pl:dydaktyka:ztb:2011:projekty:meetus:po_zalogowaniu.png|}} === Testy === Logika aplikacji została przetestowana z wykorzystaniem testów jednostkowych. Podczas tworzenia testów została wykorzystana technika nazewnictwa testów zaprezentwana w poniższym tutoriali http://vimeo.com/10569751 . Polega ona na nazwaniu klasy testowej zgodnie z konwencją: TestedClassShould, a kolejne metody testu określaja co klasa powinnna robić. Np. class UserBeanShould wraz z metodami testowymi @Test public void enableAddingNewUsers(), @Test public void returnNumberOfUsers(); Taka technika nazewnictwa sprawdza się szczególnie przy tworzeniu oprogramowania zgodnie z TDD. Pozwala na łatwe zdefiniowanie interfejsu klasy poptrzez stworzenie odpowiednich testów. Na podstawie testów uzupełniana jest implementacja klasy.