/**
* Copyright (c) 2010-2017 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.eclipse.smarthome.binding.astro.internal.job;
import static org.eclipse.smarthome.binding.astro.AstroBindingConstants.*;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.TriggerBuilder.newTrigger;
import java.util.Calendar;
import org.apache.commons.lang.time.DateFormatUtils;
import org.eclipse.smarthome.binding.astro.handler.AstroThingHandler;
import org.eclipse.smarthome.binding.astro.internal.AstroHandlerFactory;
import org.eclipse.smarthome.binding.astro.internal.config.AstroChannelConfig;
import org.eclipse.smarthome.binding.astro.internal.model.Planet;
import org.eclipse.smarthome.binding.astro.internal.model.Range;
import org.eclipse.smarthome.binding.astro.internal.model.SunPhaseName;
import org.eclipse.smarthome.binding.astro.internal.util.DateTimeUtils;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.Trigger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Calculates and publishes the planet data and also schedules the events for the current day.
*
* @author Gerhard Riegler - Initial contribution
*/
public abstract class AbstractDailyJob extends AbstractBaseJob {
private final Logger logger = LoggerFactory.getLogger(AbstractDailyJob.class);
/**
* {@inheritDoc}
*/
@Override
protected void executeJob(String thingUid, JobDataMap jobDataMap) {
AstroThingHandler handler = AstroHandlerFactory.getHandler(thingUid);
if (handler != null) {
handler.publishDailyInfo();
schedulePlanetEvents(thingUid, handler, handler.getPlanet());
logger.info("Scheduled astro event-jobs for thing {}", thingUid);
}
}
/**
* Schedules the events for the planet for the current day.
*/
protected abstract void schedulePlanetEvents(String thingUid, AstroThingHandler handler, Planet planet);
protected void scheduleRange(String thingUid, AstroThingHandler astroHandler, Range range, String channelId) {
scheduleEvent(thingUid, astroHandler, range.getStart(), EVENT_START, channelId);
scheduleEvent(thingUid, astroHandler, range.getEnd(), EVENT_END, channelId);
}
protected void scheduleEvent(String thingUid, AstroThingHandler astroHandler, Calendar eventAt, String event,
String channelId) {
JobDataMap jobDataMap = new JobDataMap();
jobDataMap.put(KEY_THING_UID, thingUid);
jobDataMap.put(EventJob.KEY_EVENT, event);
jobDataMap.put(KEY_CHANNEL_ID, channelId);
AstroChannelConfig config = astroHandler.getThing().getChannel(channelId).getConfiguration()
.as(AstroChannelConfig.class);
eventAt = DateTimeUtils.applyConfig(eventAt, config);
schedule(astroHandler, EventJob.class, jobDataMap, "event-" + event.toLowerCase() + "-" + channelId, eventAt);
}
protected void schedulePublishPlanet(String thingUid, AstroThingHandler astroHandler, String jobKey,
Calendar eventAt) {
JobDataMap jobDataMap = new JobDataMap();
jobDataMap.put(KEY_THING_UID, thingUid);
schedule(astroHandler, PublishPlanetJob.class, jobDataMap, "publish-" + jobKey, eventAt);
}
protected void scheduleSunPhase(String thingUid, AstroThingHandler astroHandler, SunPhaseName phaseName,
Calendar eventAt) {
JobDataMap jobDataMap = new JobDataMap();
jobDataMap.put(KEY_THING_UID, thingUid);
jobDataMap.put(KEY_PHASE_NAME, phaseName);
schedule(astroHandler, SunPhaseJob.class, jobDataMap, "sunPhase-" + phaseName.toString().toLowerCase(),
eventAt);
}
private void schedule(AstroThingHandler astroHandler, Class<? extends AbstractBaseJob> clazz, JobDataMap jobDataMap,
String jobKey, Calendar eventAt) {
try {
Calendar today = Calendar.getInstance();
if (eventAt != null && DateTimeUtils.isSameDay(eventAt, today)
&& DateTimeUtils.isTimeGreaterEquals(eventAt, today)) {
jobDataMap.put(KEY_JOB_NAME, "job-" + jobKey);
String thingUid = jobDataMap.getString(KEY_THING_UID);
Trigger trigger = newTrigger().withIdentity("trigger-" + jobKey, thingUid).startAt(eventAt.getTime())
.build();
JobDetail jobDetail = newJob(clazz).withIdentity("job-" + jobKey, thingUid).usingJobData(jobDataMap)
.build();
astroHandler.getScheduler().scheduleJob(jobDetail, trigger);
logger.debug("Scheduled astro job-{} for thing {} at {}", jobKey, thingUid,
DateFormatUtils.ISO_DATETIME_FORMAT.format(eventAt));
}
} catch (Exception ex) {
logger.error("{}", ex.getMessage(), ex);
}
}
}