/**
* Copyright (c) 2010-2016 by the respective copyright holders.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.openhab.io.caldav.internal.job;
import org.openhab.io.caldav.CalDavEvent;
import org.openhab.io.caldav.EventNotifier;
import org.openhab.io.caldav.internal.CalDavLoaderImpl;
import org.openhab.io.caldav.internal.EventStorage;
import org.openhab.io.caldav.internal.EventStorage.CalendarRuntime;
import org.openhab.io.caldav.internal.EventStorage.EventContainer;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class EventJob implements Job {
private static final Logger log = LoggerFactory.getLogger(EventJob.class);
public static final String KEY_CONFIG = "config";
public static final String KEY_EVENT = "event";
public static final String KEY_REC_INDEX = "rec-index";
public static final String KEY_EVENT_TRIGGER = "event-trigger";
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
try {
final String config = context.getJobDetail().getJobDataMap().getString(KEY_CONFIG);
final String eventId = context.getJobDetail().getJobDataMap().getString(KEY_EVENT);
final int recIndex = context.getJobDetail().getJobDataMap().getInt(KEY_REC_INDEX);
final EventTrigger eventTrigger = EventTrigger
.valueOf(context.getJobDetail().getJobDataMap().getString(KEY_EVENT_TRIGGER));
CalendarRuntime calendarRuntime = EventStorage.getInstance().getEventCache().get(config);
if (calendarRuntime == null) {
throw new JobExecutionException("cannot get runtime for config: " + config, false);
}
EventContainer eventContainer = calendarRuntime.getEventMap().get(eventId);
if (eventContainer == null) {
throw new JobExecutionException(
"cannot get event-container for config: " + config + " and eventId: " + eventId, false);
}
if (eventContainer.getEventList().size() <= recIndex) {
throw new JobExecutionException("cannot get recurence-event for config: " + config + " and eventId: "
+ eventId + " and occurence: " + recIndex, false);
}
CalDavEvent event = eventContainer.getEventList().get(recIndex);
log.info("event {} for: {}", eventTrigger, event.getShortName());
for (EventNotifier notifier : CalDavLoaderImpl.instance.getEventListenerList()) {
try {
if (eventTrigger == EventTrigger.BEGIN) {
notifier.eventBegins(event);
} else if (eventTrigger == EventTrigger.END) {
notifier.eventEnds(event);
} else {
throw new IllegalStateException("not implemented event trigger: " + eventTrigger);
}
} catch (Exception e) {
log.error("error while invoking listener", e);
}
}
if (eventTrigger == EventTrigger.END) {
// if event is ended, remove it from the map
calendarRuntime.getEventMap().remove(eventContainer.getEventId());
}
} catch (Exception e) {
log.error("error executing event job", e);
throw new JobExecutionException("error executing event job", e, false);
}
}
public static enum EventTrigger {
BEGIN,
END
}
}