package appointment.business;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import appointment.objects.Appointment;
import appointment.objects.AppointmentState;
import appointment.objects.User;
@Stateless
public class IAppointmentManagement implements IAppointmentManagementLocal {
@PersistenceContext
EntityManager entityManager;
public List<Appointment> getOverlappedAppointments(User user,
Date startTime, Date endTime, AppointmentState state) {
List<Appointment> overlappedAppointments = new ArrayList<Appointment>();
long newStart = startTime.getTime();
long newEnd = endTime.getTime();
for (Appointment appointment : user.getAppointments()) {
long appStart = appointment.getStartTime().getTime();
long appEnd = appointment.getEndTime().getTime();
boolean overlapped =
((newStart < appStart) && (newStart < appEnd) && (newEnd > appStart)&& (newEnd < appEnd))||
((newStart > appEnd) && (newStart < appEnd) && (newEnd > appStart)&& (newEnd < appEnd))||
((newStart > appStart) && (newStart < appEnd) && (newEnd > appStart)&& (newEnd > appEnd));
if ((overlapped && !hasFreeState(appointment.getStatus()) && !hasFreeState(state)) && (appointment.getIsPrivate())) {
overlappedAppointments.add(appointment);
}
}
return overlappedAppointments;
}
public boolean addAppointment(User user, Date startTime, Date endTime,
String title, String notes, AppointmentState status, Boolean visible) {
Appointment appointment = new Appointment(startTime,
endTime, title, notes, status, visible);
return addAppointmentToUser(appointment, user);
// Appointment should be added
// if (addAppointmentToUser(appointment, user))
// {
// return getAppointment(appointment.getId()).getUsers().contains(user);
//
//// return entityManager.find(User.class, user.getUsername())
//// .getAppointments().contains(appointment);
// }
}
private boolean addAppointmentToUser(Appointment appointment, User user)
{
if (appointment.addUserToAppointment(user)) {
try {
entityManager.persist(appointment);
} catch (Exception e) {
System.out.println(e.toString());
}
// update user relations
user.getAppointments().add(appointment);
try {
user = entityManager.merge(user);
} catch (Exception e) {
System.out.println(e.toString());
}
return true;
}
return false;
}
@SuppressWarnings("unchecked")
public List<Appointment> getAppointments(User user) {
List<Appointment> all = entityManager.createQuery(
"SELECT u.appointments FROM User u WHERE u.id = '"
+ user.getUsername() + "'").getResultList();
return all;
}
@SuppressWarnings("unchecked")
public List<Appointment> getAppointments(User user, Date startDate,
Date endDate) {
long start = startDate.getTime();
long end = endDate.getTime();
List<Appointment> all = entityManager.createQuery(
"SELECT a FROM Appointment a " + " WHERE '"
+ user.getUsername()
+ "' IN (SELECT u.username FROM a.users u )"
+ " AND (( a.startTime > " + start
+ " AND a.startTime < " + end + " ) OR ( a.endTime > "
+ start + " AND a.endTime < " + end + " )) ")
.getResultList();
return all;
}
@SuppressWarnings("unchecked")
public Appointment getAppointment(Long id) {
List<Appointment> resList = entityManager.createQuery(
"SELECT a FROM Appointment a WHERE a.id = '" + id.toString()
+ "'").getResultList();
if (resList.size() > 0)
return resList.get(0);
else
return null;
}
public List<Long> getIdList(List<Appointment> appointments) {
List<Long> appointmentLongList = new ArrayList<Long>();
for (Appointment appointment : appointments) {
appointmentLongList.add(appointment.getId());
}
return appointmentLongList;
}
public boolean removeAppointments(User user) {
for (Appointment appointment : user.getAppointments()) {
entityManager.remove(appointment);
}
return false;
}
private boolean hasFreeState(AppointmentState state)
{
return state.equals(AppointmentState.FREE);
}
}