/*
* EventController.java
*
* Created on 4 May 2007, 19:56
*
*/
package org.spw.controller;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.persistence.TemporalType;
import org.spw.model.Contact;
import org.spw.model.Event;
/**
* Manage the Events.
* Implement CRUD operation and list of reminders
* @author PSe
*/
public class EventController {
private final EntityManagerFactory emf;
/** Creates a new instance of EventController */
public EventController() {
Properties props = PropertiesLoader.loadProperties("database.properties");
if (props != null)
{
emf = Persistence.createEntityManagerFactory("VolunteerPU", props);
}
else
{
emf = Persistence.createEntityManagerFactory("VolunteerPU");
}
}
/**
* Retrieve all the events
* @return List of all the events
*/
public List<Event> getEvents() {
EntityManager em = emf.createEntityManager();
List<Event> result = null;
try {
Query query = em.createNamedQuery("Event.findAll");
result = query.getResultList();
} catch (Exception e) {
Logger.getLogger(EventController.class.getName()).log(Level.SEVERE, "Error Query all Event", e);
if (em.getTransaction().isActive())
em.getTransaction().rollback();
} finally {
em.close();
}
return result;
}
/**
*
* @param object
*/
public void create(Event object) {
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
try {
em.persist(object);
em.getTransaction().commit();
} catch (Exception e) {
Logger.getLogger(EventController.class.getName()).log(Level.SEVERE, "Error creating " + object, e);
if (em.getTransaction().isActive())
em.getTransaction().rollback();
} finally {
em.close();
}
}
/**
*
* @param key
* @return
*/
public Event read(Long key) {
EntityManager em = emf.createEntityManager();
Event retValue = null;
try {
retValue = em.find(Event.class, key);
} catch (Exception e) {
Logger.getLogger(EventController.class.getName()).log(Level.SEVERE, "Error reading " + key, e);
if (em.getTransaction().isActive())
em.getTransaction().rollback();
} finally {
em.close();
}
return retValue;
}
/**
*
* @param object
* @return
*/
public Event update(Event object) {
Event result = null;
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
try {
result = em.merge(object);
em.getTransaction().commit();
} catch (Exception e) {
Logger.getLogger(EventController.class.getName()).log(Level.SEVERE, "Error updating " + object, e);
if (em.getTransaction().isActive())
em.getTransaction().rollback();
} finally {
em.close();
}
return result;
}
/**
*
* @param object
*/
public void delete(Event object) {
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
try {
Event entity = em.find(Event.class, object.getIdEvent());
em.remove(entity);
em.getTransaction().commit();
} catch (Exception e) {
Logger.getLogger(EventController.class.getName()).log(Level.SEVERE, "Error deleting " + object, e);
if (em.getTransaction().isActive())
em.getTransaction().rollback();
} finally {
em.close();
}
}
/**
* Parse a string representation and return the corresponding eventString
*
* @param eventString String representation
* @return The corresponding event
*/
public Event parse(String eventString) {
if (eventString == null) return null;
int begin = eventString.lastIndexOf('[') + 1;
if (begin < 0) return null;
int last = eventString.lastIndexOf(']');
if (last < 0) return null;
String number = eventString.substring(begin, last);
Event retValue = null;
try {
retValue = read(Long.parseLong(number));
} catch (NumberFormatException ex) {
//incorrect number, could not appen
Logger.getLogger(EventController.class.getName()).severe(eventString +
" is incorrect as a string version of a Event to parse. [" +
ex.getLocalizedMessage() + "]");
}
return retValue;
}
/**
* Return all the Event with a reminder
* @return The list of event with an active reminder
*/
public List<Event> getReminders() {
EntityManager em = emf.createEntityManager();
List<Event> result = null;
try {
// BROKEN : CURRENT_DATE is obtained with TO_DATE( SYSDATE )
// - TO_DATE is unknow in H2 database
// - SYSDATE is unknow in MySQL database
// Query query = em.createQuery("SELECT e FROM Event as e WHERE " +
// "e.reminderDate >= CURRENT_DATE");
// Adapt query to be run with any db
Query query = em.createNamedQuery("Event.findReminders");
query.setParameter("theDate", new Date(), TemporalType.DATE);
result = query.getResultList();
} catch (Exception e) {
Logger.getLogger(EventController.class.getName()).log(Level.SEVERE, "Error Query all Event", e);
if (em.getTransaction().isActive())
em.getTransaction().rollback();
} finally {
em.close();
}
return result;
}
/**
* Add or update the attendance of the contact to an event.
* This method manage the consistence of the operation in one transaction
*
* @param contact the attending contact.
* @param event the event attended.
*/
public void addAttendance(Contact contact, Event event) {
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
if (!event.getContactsAttended().contains(contact)) {
event.getContactsAttended().add(contact);
}
event = em.merge(event);
if (!contact.getEventsAttended().contains(event)) {
contact.getEventsAttended().add(event);
}
contact = em.merge(contact);
em.getTransaction().commit();
em.close();
}
/**
* Remove the attendance of the contact to an event.
* @param contact the attending contact.
* @param event the event attended.
*/
public void removeAttendance(Contact contact, Event event) {
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
if (event.getContactsAttended().contains(contact)) {
event.getContactsAttended().remove(contact);
}
event = em.merge(event);
if (contact.getEventsAttended().contains(event)) {
contact.getEventsAttended().remove(event);
}
contact = em.merge(contact);
em.getTransaction().commit();
em.close();
}
/**
* Add or update the attendance of the contact to an event.
* This method manage the consistence of the operation in one transaction
*
* @param contact the attending contact.
* @param event the event attended.
*/
public void addOrganizer(Contact contact, Event event) {
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
if (!event.getOrganizedBy().contains(contact)) {
event.getOrganizedBy().add(contact);
}
event = em.merge(event);
if (!contact.getOrganize().contains(event)) {
contact.getOrganize().add(event);
}
contact = em.merge(contact);
em.getTransaction().commit();
em.close();
}
/**
* Remove the attendance of the contact to an event.
* @param contact the attending contact.
* @param event the event attended.
*/
public void removeOrganizer(Contact contact, Event event) {
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
if (event.getOrganizedBy().contains(contact)) {
event.getOrganizedBy().remove(contact);
}
event = em.merge(event);
if (contact.getOrganize().contains(event)) {
contact.getOrganize().remove(event);
}
contact = em.merge(contact);
em.getTransaction().commit();
em.close();
}
}