package org.infoglue.calendar.servlets;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.Set;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.infoglue.calendar.controllers.EventController;
import org.infoglue.calendar.entities.Event;
import org.infoglue.common.util.HibernateUtil;
import org.infoglue.common.util.RemoteCacheUpdater;
import org.infoglue.common.util.VisualFormatter;
/**
* Servlet implementation class CalendarServlet
*/
public class EventsServlet extends HttpServlet
{
private static final long serialVersionUID = 1L;
private final static Logger logger = Logger.getLogger(EventsServlet.class.getName());
private VisualFormatter vf = new VisualFormatter();
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
StringBuffer sb = new StringBuffer();
String siteNodeId = request.getParameter("siteNodeId");
String calendarId = request.getParameter("calendarId");
String freeText = request.getParameter("freeText");
String startDateTime = request.getParameter("startDateTime");
String endDateTime = request.getParameter("endDateTime");
String categoryAttribute = request.getParameter("categoryAttribute");
String categoryNames = request.getParameter("categoryNames");
String calendarMonth = request.getParameter("calendarMonth");
String includedLanguages = request.getParameter("includedLanguages");
try
{
sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
sb.append("<events>");
Session session = HibernateUtil.currentSession();
Transaction tx = null;
try
{
tx = session.beginTransaction();
java.util.Calendar startCalendar = null;
java.util.Calendar endCalendar = null;
java.util.Calendar calendarMonthCalendar = null;
if(startDateTime != null && startDateTime.length() > 0)
startCalendar = getCalendar(startDateTime, "yyyy-MM-dd", true);
else
{
startCalendar = java.util.Calendar.getInstance();
startCalendar.set(java.util.Calendar.DAY_OF_MONTH, 1);
}
if(endDateTime != null && endDateTime.length() > 0)
endCalendar = getCalendar(endDateTime, "yyyy-MM-dd", true);
else
{
endCalendar = java.util.Calendar.getInstance();
int lastDate = endCalendar.getActualMaximum(java.util.Calendar.DATE);
endCalendar.set(java.util.Calendar.DAY_OF_MONTH, lastDate);
}
if(calendarMonth != null && calendarMonth.length() > 0)
{
calendarMonthCalendar = getCalendar(calendarMonth, "yyyy-MM", true);
if(startDateTime == null || startDateTime.length() == 0)
{
startCalendar.setTime(calendarMonthCalendar.getTime());
startCalendar.set(java.util.Calendar.DAY_OF_MONTH, 1);
}
if(endDateTime == null || endDateTime.length() == 0)
{
endCalendar.setTime(calendarMonthCalendar.getTime());
int lastDate = endCalendar.getActualMaximum(java.util.Calendar.DATE);
endCalendar.set(java.util.Calendar.DAY_OF_MONTH, lastDate);
}
}
else
{
calendarMonthCalendar = java.util.Calendar.getInstance();
calendarMonthCalendar.set(java.util.Calendar.DAY_OF_MONTH, 1);
}
startCalendar.set(java.util.Calendar.HOUR_OF_DAY, 1);
endCalendar.set(java.util.Calendar.HOUR_OF_DAY, 23);
String[] calendarIds = calendarId.split(",");
String[] categoryNamesArray = null;
if(categoryNames != null)
categoryNamesArray = categoryNames.split(",");
Set events = EventController.getController().getEventList(calendarIds, categoryAttribute, categoryNamesArray, includedLanguages, startCalendar, endCalendar, freeText, session);
if(siteNodeId != null && !siteNodeId.equals(""))
RemoteCacheUpdater.setUsage(new Integer(siteNodeId), calendarIds);
Iterator eventsIterator = events.iterator();
while(eventsIterator.hasNext())
{
Event event = (Event)eventsIterator.next();
sb.append(" <event id=\"" + event.getId() + "\" startDate=\"" + vf.formatDate(event.getStartDateTime().getTime(), "yyyy-MM-dd") + "\" endDate=\"" + vf.formatDate(event.getEndDateTime().getTime(), "yyyy-MM-dd") + "\"/>");
}
tx.commit();
}
catch (Exception e)
{
if (tx!=null) tx.rollback();
throw e;
}
finally
{
HibernateUtil.closeSession();
}
sb.append("</events>");
response.setContentType("text/xml");
}
catch(Exception e)
{
response.setContentType("text/html");
//response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
sb = new StringBuffer();
sb.append("siteNodeId:" + siteNodeId + "\n");
sb.append("calendarId:" + calendarId + "\n");
sb.append("freeText:" + freeText + "\n");
sb.append("startDateTime:" + startDateTime + "\n");
sb.append("endDateTime:" + endDateTime + "\n");
sb.append("categoryAttribute:" + categoryAttribute + "\n");
sb.append("categoryNames:" + categoryNames + "\n");
sb.append("calendarMonth:" + calendarMonth + "\n");
sb.append("includedLanguages:" + includedLanguages + "\n");
logger.error("En error occurred when we tried to generate eventlist:" + e.getMessage(), e);
logger.error(sb);
}
PrintWriter pw = response.getWriter();
pw.println(sb.toString());
pw.flush();
pw.close();
}
/**
* Gets a calendar object with date and hour
*
* @param dateString
* @param pattern
* @param hour
* @return
*/
public java.util.Calendar getCalendar(String dateString, String pattern, boolean fallback)
{
java.util. Calendar calendar = java.util.Calendar.getInstance();
if(dateString == null)
{
return calendar;
}
Date date = new Date();
try
{
// Format the current time.
SimpleDateFormat formatter = new SimpleDateFormat(pattern);
date = formatter.parse(dateString);
calendar.setTime(date);
//calendar.set(Calendar.HOUR_OF_DAY, hour.intValue());
}
catch(Exception e)
{
if(!fallback)
return null;
}
return calendar;
}
}