Search in sources :

Example 6 with CalendarRuntime

use of org.openhab.io.caldav.internal.EventStorage.CalendarRuntime in project openhab1-addons by openhab.

the class EventReloaderJob method loadEvents.

/**
     * all events which are available must be removed from the oldEventIds list
     *
     * @param calendarRuntime
     * @param oldEventIds
     * @throws IOException
     * @throws ParserException
     */
public synchronized void loadEvents(final CalendarRuntime calendarRuntime, final List<String> oldEventIds) throws IOException, ParserException {
    CalDavConfig config = calendarRuntime.getConfig();
    Sardine sardine = Util.getConnection(config);
    List<DavResource> list = sardine.list(config.getUrl(), 1, false);
    log.trace("before load events : oldeventsid contains : {}", oldEventIds.toString());
    for (DavResource resource : list) {
        final String filename = Util.getFilename(resource.getName());
        try {
            if (resource.isDirectory()) {
                continue;
            }
            // an ics file can contain multiple events
            // ==> multiple eventcontainers could have the same filename (and different eventid),
            // ==>we must not have one of them remaining in oldEventIds var (bad chosen name, cause it's a list of
            // oldEventContainers's filename, so with doubles possible)
            // or the remaining jobs with this filename will get unscheduled on the "removeDeletedEvents(config,
            // oldEventIds)" call (line 136)
            oldEventIds.removeAll(Arrays.asList(filename));
            // must not be loaded
            EventContainer eventContainer = calendarRuntime.getEventContainerByFilename(filename);
            final org.joda.time.DateTime lastResourceChangeFS = new org.joda.time.DateTime(resource.getModified());
            log.trace("eventContainer found: {}", eventContainer != null);
            log.trace("last resource modification: {}", lastResourceChangeFS);
            log.trace("last change of already loaded event: {}", eventContainer != null ? eventContainer.getLastChanged() : null);
            if (config.isLastModifiedFileTimeStampValid()) {
                if (eventContainer != null && !lastResourceChangeFS.isAfter(eventContainer.getLastChanged())) {
                    // to be created
                    if (eventContainer.getCalculatedUntil() != null && eventContainer.getCalculatedUntil().isAfter(org.joda.time.DateTime.now().plusMinutes(config.getReloadMinutes()))) {
                        // the event is calculated as long as the next reload
                        // interval can handle this
                        log.trace("skipping resource {}, not changed (calculated until: {})", resource.getName(), eventContainer.getCalculatedUntil());
                        continue;
                    }
                    if (eventContainer.isHistoricEvent()) {
                        // no more upcoming events, do nothing
                        log.trace("skipping resource {}, not changed (historic)", resource.getName());
                        continue;
                    }
                    File icsFile = Util.getCacheFile(config.getKey(), filename);
                    if (icsFile != null && icsFile.exists()) {
                        FileInputStream fis = new FileInputStream(icsFile);
                        this.loadEvents(filename, lastResourceChangeFS, fis, config, oldEventIds, false);
                        fis.close();
                        continue;
                    }
                }
            }
            log.debug("loading resource: {} (FSchangedTS not valid)", resource);
            // prepare resource url
            URL url = new URL(config.getUrl());
            String resourcePath = resource.getPath();
            String escapedResource = resource.getName().replaceAll("/", "%2F");
            resourcePath = resourcePath.replace(resource.getName(), escapedResource);
            url = new URL(url.getProtocol(), url.getHost(), url.getPort(), resourcePath);
            InputStream inputStream = sardine.get(url.toString().replaceAll(" ", "%20"));
            this.loadEvents(filename, lastResourceChangeFS, inputStream, config, oldEventIds, false);
        } catch (ParserException e) {
            log.error("error parsing ics file: " + filename, e);
        } catch (SardineException e) {
            log.error("error reading ics file: " + filename, e);
        }
    }
    log.trace("after load events : oldeventsid contains : {}", oldEventIds.toString());
}
Also used : Sardine(com.github.sardine.Sardine) ParserException(net.fortuna.ical4j.data.ParserException) DavResource(com.github.sardine.DavResource) EventContainer(org.openhab.io.caldav.internal.EventStorage.EventContainer) FileInputStream(java.io.FileInputStream) InputStream(java.io.InputStream) CalDavConfig(org.openhab.io.caldav.internal.CalDavConfig) DateTime(net.fortuna.ical4j.model.DateTime) LocalDateTime(org.joda.time.LocalDateTime) FileInputStream(java.io.FileInputStream) URL(java.net.URL) SardineException(com.github.sardine.impl.SardineException) CalendarRuntime(org.openhab.io.caldav.internal.EventStorage.CalendarRuntime) File(java.io.File)

Example 7 with CalendarRuntime

use of org.openhab.io.caldav.internal.EventStorage.CalendarRuntime in project openhab1-addons by openhab.

the class CalDavLoaderImpl method startLoading.

public void startLoading() {
    if (execService != null) {
        return;
    }
    log.trace("starting execution...");
    int i = 0;
    for (final CalendarRuntime eventRuntime : EventStorage.getInstance().getEventCache().values()) {
        try {
            JobDetail job = JobBuilder.newJob().ofType(EventReloaderJob.class).usingJobData(EventReloaderJob.KEY_CONFIG, eventRuntime.getConfig().getKey()).withIdentity(eventRuntime.getConfig().getKey(), JOB_NAME_EVENT_RELOADER).storeDurably().build();
            this.scheduler.addJob(job, false);
            SimpleTrigger jobTrigger = TriggerBuilder.newTrigger().forJob(job).withIdentity(eventRuntime.getConfig().getKey(), JOB_NAME_EVENT_RELOADER).startAt(DateBuilder.futureDate(10 + i, IntervalUnit.SECOND)).withSchedule(SimpleScheduleBuilder.repeatMinutelyForever(eventRuntime.getConfig().getReloadMinutes())).build();
            this.scheduler.scheduleJob(jobTrigger);
            log.info("reload job scheduled for: {}", eventRuntime.getConfig().getKey());
        } catch (SchedulerException e) {
            log.error("cannot schedule calendar-reloader", e);
        }
        // next event 10 seconds later
        i += 10;
    }
}
Also used : JobDetail(org.quartz.JobDetail) SchedulerException(org.quartz.SchedulerException) CalendarRuntime(org.openhab.io.caldav.internal.EventStorage.CalendarRuntime) SimpleTrigger(org.quartz.SimpleTrigger)

Example 8 with CalendarRuntime

use of org.openhab.io.caldav.internal.EventStorage.CalendarRuntime in project openhab1-addons by openhab.

the class CalDavLoaderImpl method getEvents.

@Override
public List<CalDavEvent> getEvents(final CalDavQuery query) {
    log.trace("quering events for filter: {}", query);
    final ArrayList<CalDavEvent> eventList = new ArrayList<CalDavEvent>();
    if (query.getCalendarIds() != null) {
        for (String calendarId : query.getCalendarIds()) {
            final CalendarRuntime eventRuntime = EventStorage.getInstance().getEventCache().get(calendarId);
            if (eventRuntime == null) {
                log.debug("calendar id {} not found", calendarId);
                continue;
            }
            for (EventContainer eventContainer : eventRuntime.getEventMap().values()) {
                for (CalDavEvent calDavEvent : eventContainer.getEventList()) {
                    if (query.getFrom() != null) {
                        if (calDavEvent.getEnd().isBefore(query.getFrom())) {
                            continue;
                        }
                    }
                    if (query.getTo() != null) {
                        if (calDavEvent.getStart().isAfter(query.getTo())) {
                            continue;
                        }
                    }
                    if (query.getFilterName() != null) {
                        if (!calDavEvent.getName().matches(query.getFilterName())) {
                            continue;
                        }
                    }
                    if (query.getFilterCategory() != null) {
                        log.trace("processing filter category");
                        if (calDavEvent.getCategoryList() == null) {
                            log.trace("not found event category for event {}", calDavEvent.getId());
                            continue;
                        } else {
                            log.trace("processing event category");
                            boolean eventCategoriesMatchFilterCategories = false;
                            if (query.getFilterCategoryMatchesAny()) {
                                log.trace("filter-category-any encountered");
                                int filterCategoriesIndex = 0;
                                List<String> filterCategories = query.getFilterCategory();
                                List<String> eventCategories = calDavEvent.getCategoryList();
                                log.trace("comparing filter '{}' to event categories '{}' from event {}", filterCategories, eventCategories, calDavEvent.getId());
                                // browse filter categories, which are not null
                                while (eventCategoriesMatchFilterCategories == false && filterCategoriesIndex < filterCategories.size()) {
                                    int eventCategoriesIndex = 0;
                                    // browse event categories, which can be null
                                    while (eventCategoriesMatchFilterCategories == false && eventCategoriesIndex < eventCategories.size()) {
                                        if (eventCategories.get(eventCategoriesIndex).equalsIgnoreCase(filterCategories.get(filterCategoriesIndex))) {
                                            log.debug("filter category {} matches event category {}", filterCategories.get(filterCategoriesIndex), eventCategories.get(eventCategoriesIndex));
                                            eventCategoriesMatchFilterCategories = true;
                                        }
                                        eventCategoriesIndex++;
                                    }
                                    filterCategoriesIndex++;
                                }
                            } else {
                                log.trace("filter-category encountered");
                                eventCategoriesMatchFilterCategories = calDavEvent.getCategoryList().containsAll(query.getFilterCategory());
                            }
                            if (!eventCategoriesMatchFilterCategories) {
                                continue;
                            }
                        }
                    } else {
                        log.trace("not found any filter category");
                    }
                    eventList.add(calDavEvent);
                }
            }
        }
    }
    if (query.getSort() != null) {
        Collections.sort(eventList, new Comparator<CalDavEvent>() {

            @Override
            public int compare(CalDavEvent arg0, CalDavEvent arg1) {
                if (query.getSort().equals(CalDavQuery.Sort.ASCENDING)) {
                    return (arg0.getStart().compareTo(arg1.getStart()));
                } else if (query.getSort().equals(CalDavQuery.Sort.DESCENDING)) {
                    return (arg1.getStart().compareTo(arg0.getStart()));
                } else {
                    return 0;
                }
            }
        });
    }
    log.debug("return event list for {} with {} entries", query, eventList.size());
    return eventList;
}
Also used : EventContainer(org.openhab.io.caldav.internal.EventStorage.EventContainer) CalDavEvent(org.openhab.io.caldav.CalDavEvent) ArrayList(java.util.ArrayList) CalendarRuntime(org.openhab.io.caldav.internal.EventStorage.CalendarRuntime)

Example 9 with CalendarRuntime

use of org.openhab.io.caldav.internal.EventStorage.CalendarRuntime in project openhab1-addons by openhab.

the class EventJob method execute.

@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);
    }
}
Also used : JobExecutionException(org.quartz.JobExecutionException) EventContainer(org.openhab.io.caldav.internal.EventStorage.EventContainer) CalDavEvent(org.openhab.io.caldav.CalDavEvent) EventNotifier(org.openhab.io.caldav.EventNotifier) CalendarRuntime(org.openhab.io.caldav.internal.EventStorage.CalendarRuntime) JobExecutionException(org.quartz.JobExecutionException)

Aggregations

CalendarRuntime (org.openhab.io.caldav.internal.EventStorage.CalendarRuntime)9 EventContainer (org.openhab.io.caldav.internal.EventStorage.EventContainer)7 CalDavEvent (org.openhab.io.caldav.CalDavEvent)5 IOException (java.io.IOException)4 EventNotifier (org.openhab.io.caldav.EventNotifier)4 SchedulerException (org.quartz.SchedulerException)4 SardineException (com.github.sardine.impl.SardineException)3 File (java.io.File)3 ArrayList (java.util.ArrayList)3 ParserException (net.fortuna.ical4j.data.ParserException)3 JobExecutionException (org.quartz.JobExecutionException)3 Sardine (com.github.sardine.Sardine)2 FileInputStream (java.io.FileInputStream)2 UnsupportedEncodingException (java.io.UnsupportedEncodingException)2 UnsupportedCharsetException (java.nio.charset.UnsupportedCharsetException)2 ConfigurationException (org.osgi.service.cm.ConfigurationException)2 DavResource (com.github.sardine.DavResource)1 InputStream (java.io.InputStream)1 URL (java.net.URL)1 Date (java.util.Date)1