use of net.fortuna.ical4j.data.ParserException 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());
}
Aggregations