/*
* Jitsi, the OpenSource Java VoIP and Instant Messaging client.
*
* Copyright @ 2015 Atlassian Pty Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.java.sip.communicator.plugin.addrbook.msoutlook.calendar;
import java.util.*;
import net.java.sip.communicator.plugin.addrbook.*;
import net.java.sip.communicator.service.calendar.*;
/**
* A class that represents one calendar item. It schedules tasks for the
* beginning and for the end of the calendar item to update the free busy status
*
* @author Hristo Terezov
*/
public class CalendarItemTimerTask
{
/**
* The status of the calendar item.
*/
private final CalendarService.BusyStatusEnum state;
/**
* The start date of the calendar item.
*/
private final Date startDate;
/**
* The end date of the calendar item.
*/
private final Date endDate;
/**
* The ID of the calendar item.
*/
private final String id;
/**
* Indicates if the start task should be executed immediately or not. This
* flag is <tt>true</tt> if the start date is before the current date.
*/
private final boolean executeNow;
/**
* The <tt>CalendarServiceImpl</tt> instance.
*/
private final CalendarServiceImpl calendarService
= AddrBookActivator.getCalendarService();
/**
* The <tt>Timer</tt> instance that schedules the tasks.
*/
private static Timer timer = new Timer();
/**
* The <tt>RecurringPattern</tt> instance associated with the calendar item.
* This must be <tt>null</tt> if the calendar item is not recurring.
*/
private RecurringPattern pattern;
/**
* The task that will be executed at the beginning of the task.
*/
private TimerTask startTask = new TimerTask()
{
@Override
public void run()
{
start();
}
};
/**
* The task that will be executed at the end of the task.
*/
private TimerTask endTask = new TimerTask()
{
@Override
public void run()
{
stop();
}
};
/**
* Constructs new <tt>CalendarItemTimerTask</tt> instance.
* @param state the state of the calendar item.
* @param startDate the start date of the calendar item.
* @param endDate the end date of the calendar item.
* @param id the ID of the calendar item.
* @param executeNow Indicates if the start task should be executed
* immediately or not
* @param pattern the <tt>RecurringPattern</tt> instance associated with the
* calendar item. It must be <tt>null</tt> if the calendar item is not
* recurring.
*/
public CalendarItemTimerTask(CalendarService.BusyStatusEnum state,
Date startDate, Date endDate, String id, boolean executeNow,
RecurringPattern pattern)
{
this.state = state;
this.startDate = startDate;
this.endDate = endDate;
this.id = id;
calendarService.addToTaskMap(id, this);
this.executeNow = executeNow;
this.pattern = pattern;
}
/**
* Returns the <tt>RecurringPattern</tt> instance associated with the
* calendar item.
* @return the <tt>RecurringPattern</tt> instance associated with the
* calendar item.
*/
public RecurringPattern getPattern()
{
return pattern;
}
/**
* Returns the ID of the calendar item.
* @return the ID of the calendar item.
*/
public String getId()
{
return id;
}
/**
* This method is executed in the beginning of the calendar item.
*/
protected void start()
{
calendarService.addToCurrentItems(this);
calendarService.updateStateFromCurrentItems();
}
/**
* This method is executed in the end of the calendar item.
*/
protected void stop()
{
calendarService.removeFromTaskMap(id);
calendarService.removeFromCurrentItems(this);
calendarService.updateStateFromCurrentItems();
if(pattern != null)
{
CalendarItemTimerTask nextTask
= pattern.next(startDate, endDate);
this.pattern = null;
nextTask.scheduleTasks();
}
}
/**
* Schedules the start and end tasks of the calendar item.
*/
public void scheduleTasks()
{
if(!executeNow)
{
timer.schedule(startTask, startDate);
}
else
{
startTask.run();
}
timer.schedule(endTask, endDate);
}
/**
* Removes the task.
*/
public void remove()
{
startTask.cancel();
endTask.cancel();
calendarService.removeFromTaskMap(id);
calendarService.removeFromCurrentItems(this);
calendarService.updateStateFromCurrentItems();
}
/**
* Returns the free busy status of the calendar item.
* @return the free busy status of the calendar item.
*/
public CalendarService.BusyStatusEnum getStatus()
{
return state;
}
/**
* Returns the start date of the calendar item
* @return the start date of the calendar item
*/
public Date getStartDate()
{
return startDate;
}
/**
* Returns the end date of the calendar item
* @return the end date of the calendar item
*/
public Date getEndDate()
{
return endDate;
}
/**
* Sets the <tt>RecurringPattern</tt> associated with the calendar item.
* @param pattern the pattern to set
*/
public void setPattern(RecurringPattern pattern)
{
this.pattern = pattern;
}
}