Spis treści

Raport końcowy

Obsługa bazy danych i logika aplikacji

Automatyczne generowanie skryptu bazy okazało się być rozwiązaniem wygodnym, jednak generującym błędy wymagające ręcznego poprawienia.

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.

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:

W ramach projektu została zaimplementowana integracja z mapami Google umożliwiająca w prosty sposób wybór lokalizacji poszukiwanego zdarzenia:

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.