|
|
@ -3,18 +3,14 @@ package de.srsoftware.cal; |
|
|
|
|
|
|
|
|
|
|
|
import static de.srsoftware.cal.Util.*; |
|
|
|
import static de.srsoftware.cal.Util.*; |
|
|
|
import static de.srsoftware.tools.Error.error; |
|
|
|
import static de.srsoftware.tools.Error.error; |
|
|
|
import static de.srsoftware.tools.Optionals.nullIfEmpty; |
|
|
|
|
|
|
|
import static de.srsoftware.tools.Result.transform; |
|
|
|
import static de.srsoftware.tools.Result.transform; |
|
|
|
import static de.srsoftware.tools.Tag.HREF; |
|
|
|
import static de.srsoftware.tools.Tag.HREF; |
|
|
|
import static de.srsoftware.tools.TagFilter.*; |
|
|
|
import static de.srsoftware.tools.TagFilter.*; |
|
|
|
|
|
|
|
|
|
|
|
import de.srsoftware.cal.api.*; |
|
|
|
import de.srsoftware.cal.api.*; |
|
|
|
import de.srsoftware.tools.*; |
|
|
|
import de.srsoftware.tools.*; |
|
|
|
import java.io.IOException; |
|
|
|
|
|
|
|
import java.io.InputStream; |
|
|
|
import java.io.InputStream; |
|
|
|
import java.net.*; |
|
|
|
import java.net.*; |
|
|
|
import java.nio.file.Files; |
|
|
|
|
|
|
|
import java.nio.file.Path; |
|
|
|
|
|
|
|
import java.security.MessageDigest; |
|
|
|
import java.security.MessageDigest; |
|
|
|
import java.security.NoSuchAlgorithmException; |
|
|
|
import java.security.NoSuchAlgorithmException; |
|
|
|
import java.time.LocalDate; |
|
|
|
import java.time.LocalDate; |
|
|
@ -281,9 +277,9 @@ public abstract class BaseImporter implements Importer { |
|
|
|
public Stream<Appointment> fetch() { |
|
|
|
public Stream<Appointment> fetch() { |
|
|
|
var url = Payload.of(programURL()); |
|
|
|
var url = Payload.of(programURL()); |
|
|
|
Stream<Result<String>> urls = url(url) |
|
|
|
Stream<Result<String>> urls = url(url) |
|
|
|
.map(this::open) //
|
|
|
|
.map(Util::open) //
|
|
|
|
.map(this::preload) |
|
|
|
.map(Util::preload) |
|
|
|
.map(this::parseXML) |
|
|
|
.map(Util::parseXML) |
|
|
|
.map(this::extractEventUrls) |
|
|
|
.map(this::extractEventUrls) |
|
|
|
.stream(); |
|
|
|
.stream(); |
|
|
|
return urls //
|
|
|
|
return urls //
|
|
|
@ -308,27 +304,14 @@ public abstract class BaseImporter implements Importer { |
|
|
|
.map(url -> new Link(url, "Event-Seite")) |
|
|
|
.map(url -> new Link(url, "Event-Seite")) |
|
|
|
.orElse(null); |
|
|
|
.orElse(null); |
|
|
|
return urlResult //
|
|
|
|
return urlResult //
|
|
|
|
.map(this::open) |
|
|
|
.map(Util::open) |
|
|
|
.map(this::preload) |
|
|
|
.map(Util::preload) |
|
|
|
.map(this::parseXML) |
|
|
|
.map(Util::parseXML) |
|
|
|
.map(this::extractEventTag) |
|
|
|
.map(this::extractEventTag) |
|
|
|
.map(tagResult -> extractEvent(tagResult, link)); |
|
|
|
.map(tagResult -> extractEvent(tagResult, link)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
protected Result<InputStream> open(Result<URL> url) { |
|
|
|
|
|
|
|
var opt = url.optional(); |
|
|
|
|
|
|
|
if (opt.isEmpty()) return transform(url); |
|
|
|
|
|
|
|
try { |
|
|
|
|
|
|
|
var conn = (HttpURLConnection) opt.get().openConnection(); |
|
|
|
|
|
|
|
conn.setRequestProperty("Accept","*/*"); |
|
|
|
|
|
|
|
conn.setRequestProperty("Host",opt.get().getHost()); |
|
|
|
|
|
|
|
conn.setRequestProperty("User-Agent","OpenCloudCal/0.1"); |
|
|
|
|
|
|
|
return Payload.of(conn.getInputStream()); |
|
|
|
|
|
|
|
} catch (IOException e) { |
|
|
|
|
|
|
|
return error(e, "Failed to open %s", url, e); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
protected abstract Result<LocalDate> parseEndDate(String string); |
|
|
|
protected abstract Result<LocalDate> parseEndDate(String string); |
|
|
|
protected abstract Result<LocalTime> parseEndTime(String string); |
|
|
|
protected abstract Result<LocalTime> parseEndTime(String string); |
|
|
@ -336,19 +319,10 @@ public abstract class BaseImporter implements Importer { |
|
|
|
protected abstract Result<LocalDate> parseStartDate(String string); |
|
|
|
protected abstract Result<LocalDate> parseStartDate(String string); |
|
|
|
protected abstract Result<LocalTime> parseStartTime(String string); |
|
|
|
protected abstract Result<LocalTime> parseStartTime(String string); |
|
|
|
|
|
|
|
|
|
|
|
protected Result<Tag> parseXML(Result<InputStream> inputStream) { |
|
|
|
|
|
|
|
var opt = inputStream.optional(); |
|
|
|
|
|
|
|
return opt.isEmpty() ? transform((inputStream)) : XMLParser.parse(opt.get()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
protected Result<InputStream> preload(Result<InputStream> inputStream) { |
|
|
|
protected Result<InputStream> preload(Result<InputStream> inputStream) { |
|
|
|
var opt = inputStream.optional(); |
|
|
|
return Util.preload(inputStream); |
|
|
|
if (opt.isEmpty()) return transform(inputStream); |
|
|
|
|
|
|
|
try { |
|
|
|
|
|
|
|
return Payload.of(XMLParser.preload(opt.get())); |
|
|
|
|
|
|
|
} catch (IOException e) { |
|
|
|
|
|
|
|
return error(e, "Failed to buffer data from %s", inputStream); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
protected abstract String programURL(); |
|
|
|
protected abstract String programURL(); |
|
|
|