re-ordered methods
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
This commit is contained in:
@@ -4,7 +4,6 @@ package de.srsoftware.cal.importer;
|
|||||||
import static de.srsoftware.tools.Optionals.nullable;
|
import static de.srsoftware.tools.Optionals.nullable;
|
||||||
import static de.srsoftware.tools.TagFilter.*;
|
import static de.srsoftware.tools.TagFilter.*;
|
||||||
import static java.util.Optional.empty;
|
import static java.util.Optional.empty;
|
||||||
import static java.util.function.Predicate.not;
|
|
||||||
|
|
||||||
import de.srsoftware.cal.api.*;
|
import de.srsoftware.cal.api.*;
|
||||||
import de.srsoftware.tools.*;
|
import de.srsoftware.tools.*;
|
||||||
@@ -38,6 +37,52 @@ public class JenaRosenkeller implements Importer {
|
|||||||
return "Events von der Seite rosenkeller.org importieren";
|
return "Events von der Seite rosenkeller.org importieren";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static List<Attachment> extractAttachments(Tag appointmentTag) {
|
||||||
|
return appointmentTag //
|
||||||
|
.find(ofType("img"))
|
||||||
|
.stream()
|
||||||
|
.map(tag -> tag.get("src"))
|
||||||
|
.filter(Objects::nonNull)
|
||||||
|
.map(Payload::of)
|
||||||
|
.map(JenaRosenkeller::url)
|
||||||
|
.map(JenaRosenkeller::toAttachment)
|
||||||
|
.map(Result::optional)
|
||||||
|
.flatMap(Optional::stream)
|
||||||
|
.toList();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Optional<String> extractDescription(Tag appointmentTag) {
|
||||||
|
return appointmentTag.find(attributeHas("class", "tribe-events-single-event-description")).stream().flatMap(tag -> tag.inner(2).stream()).findAny();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static List<Link> extractLinks(Tag appointmentTag) {
|
||||||
|
var links = new ArrayList<Link>();
|
||||||
|
appointmentTag //
|
||||||
|
.find(attributeStartsWith("id", "post-"))
|
||||||
|
.stream()
|
||||||
|
.flatMap(tag -> tag.find(ofType("a")).stream())
|
||||||
|
.forEach(anchor -> {
|
||||||
|
var href = anchor.get("href");
|
||||||
|
if (href == null) return;
|
||||||
|
if (!href.contains("://")) href = BASE_URL + "href";
|
||||||
|
var text = anchor.inner(0).orElse(href);
|
||||||
|
Payload.of(href).map(JenaRosenkeller::url).optional().map(url -> new Link(url, text)).ifPresent(links::add);
|
||||||
|
});
|
||||||
|
return links;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Optional<LocalDateTime> extractStart(Tag appointmentTag) {
|
||||||
|
return appointmentTag.find(attributeEquals("class", "tribe-event-date-start")).stream().flatMap(tag -> tag.inner(0).stream()).flatMap(txt -> toDateTime(txt).stream()).findAny();
|
||||||
|
}
|
||||||
|
private static Optional<String> extractTitle(Tag appointmentTag) {
|
||||||
|
return appointmentTag
|
||||||
|
.find(attributeEndsWith("class", "single-event-title")) //
|
||||||
|
.stream()
|
||||||
|
.flatMap(tag -> tag.inner(2).stream())
|
||||||
|
.findAny();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Stream<Appointment> fetch() {
|
public Stream<Appointment> fetch() {
|
||||||
var url = Payload.of(BASE_URL + "/de/programm");
|
var url = Payload.of(BASE_URL + "/de/programm");
|
||||||
@@ -53,29 +98,6 @@ public class JenaRosenkeller implements Importer {
|
|||||||
.flatMap(result -> result.optional().stream());
|
.flatMap(result -> result.optional().stream());
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Result<Appointment> loadEvent(Result<URL> urlResult) {
|
|
||||||
var link = urlResult.optional().map(url -> new Link(url, "Event-Seite")).orElse(null);
|
|
||||||
return urlResult //
|
|
||||||
.map(JenaRosenkeller::open)
|
|
||||||
.map(JenaRosenkeller::preload)
|
|
||||||
.map(JenaRosenkeller::parse)
|
|
||||||
.map(JenaRosenkeller::getEventDiv)
|
|
||||||
.map(tagResult -> parseEvent(tagResult, link));
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Result<Tag> getEventDiv(Result<Tag> pageResult) {
|
|
||||||
switch (pageResult) {
|
|
||||||
case Payload<Tag> payload:
|
|
||||||
List<Tag> list = payload.get().find(attributeEquals("id", APPOINTMENT_TAG_ID));
|
|
||||||
if (list.size() == 1) return Payload.of(list.getFirst());
|
|
||||||
return Error.format("Could not find tag with id \"%s\"", APPOINTMENT_TAG_ID);
|
|
||||||
case Error<Tag> err:
|
|
||||||
return err.transform();
|
|
||||||
default:
|
|
||||||
return Error.format("Invalid parameter: %s", pageResult.getClass().getSimpleName());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Result<List<String>> findEventUrls(Result<Tag> tagResult) {
|
private static Result<List<String>> findEventUrls(Result<Tag> tagResult) {
|
||||||
return switch (tagResult) {
|
return switch (tagResult) {
|
||||||
case Payload<Tag> payload -> {
|
case Payload<Tag> payload -> {
|
||||||
@@ -94,27 +116,29 @@ public class JenaRosenkeller implements Importer {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Result<Tag> parse(Result<InputStream> inputStream) {
|
|
||||||
return switch (inputStream) {
|
private static Result<Tag> getEventDiv(Result<Tag> pageResult) {
|
||||||
case Payload<InputStream> payload -> XMLParser.parse(payload.get());
|
switch (pageResult) {
|
||||||
case Error<InputStream> error -> error.transform();
|
case Payload<Tag> payload:
|
||||||
default -> Error.of("Invalid parameter: %s".formatted(inputStream.getClass().getSimpleName()));
|
List<Tag> list = payload.get().find(attributeEquals("id", APPOINTMENT_TAG_ID));
|
||||||
};
|
if (list.size() == 1) return Payload.of(list.getFirst());
|
||||||
|
return Error.format("Could not find tag with id \"%s\"", APPOINTMENT_TAG_ID);
|
||||||
|
case Error<Tag> err:
|
||||||
|
return err.transform();
|
||||||
|
default:
|
||||||
|
return Error.format("Invalid parameter: %s", pageResult.getClass().getSimpleName());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Result<InputStream> preload(Result<InputStream> inputStream) {
|
|
||||||
switch (inputStream){
|
private static Result<Appointment> loadEvent(Result<URL> urlResult) {
|
||||||
case Payload<InputStream> payload:
|
var link = urlResult.optional().map(url -> new Link(url, "Event-Seite")).orElse(null);
|
||||||
try {
|
return urlResult //
|
||||||
return Payload.of(XMLParser.preload(payload.get()));
|
.map(JenaRosenkeller::open)
|
||||||
} catch (IOException e) {
|
.map(JenaRosenkeller::preload)
|
||||||
return Error.of("Failed to buffer data from %s".formatted(payload), e);
|
.map(JenaRosenkeller::parse)
|
||||||
}
|
.map(JenaRosenkeller::getEventDiv)
|
||||||
case Error<InputStream> error:
|
.map(tagResult -> parseEvent(tagResult, link));
|
||||||
return error.transform();
|
|
||||||
default:
|
|
||||||
return Error.format("Invalid parameter: %s", inputStream.getClass().getSimpleName());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Result<InputStream> open(Result<URL> url) {
|
private static Result<InputStream> open(Result<URL> url) {
|
||||||
@@ -132,6 +156,15 @@ public class JenaRosenkeller implements Importer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static Result<Tag> parse(Result<InputStream> inputStream) {
|
||||||
|
return switch (inputStream) {
|
||||||
|
case Payload<InputStream> payload -> XMLParser.parse(payload.get());
|
||||||
|
case Error<InputStream> error -> error.transform();
|
||||||
|
default -> Error.of("Invalid parameter: %s".formatted(inputStream.getClass().getSimpleName()));
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
private static Result<Appointment> parseEvent(Result<Tag> domResult, Link eventPage) {
|
private static Result<Appointment> parseEvent(Result<Tag> domResult, Link eventPage) {
|
||||||
switch (domResult) {
|
switch (domResult) {
|
||||||
case Payload<Tag> payload:
|
case Payload<Tag> payload:
|
||||||
@@ -153,20 +186,23 @@ public class JenaRosenkeller implements Importer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static List<Attachment> extractAttachments(Tag appointmentTag) {
|
|
||||||
return appointmentTag //
|
private static Result<InputStream> preload(Result<InputStream> inputStream) {
|
||||||
.find(ofType("img"))
|
switch (inputStream) {
|
||||||
.stream()
|
case Payload<InputStream> payload:
|
||||||
.map(tag -> tag.get("src"))
|
try {
|
||||||
.filter(Objects::nonNull)
|
return Payload.of(XMLParser.preload(payload.get()));
|
||||||
.map(Payload::of)
|
} catch (IOException e) {
|
||||||
.map(JenaRosenkeller::url)
|
return Error.of("Failed to buffer data from %s".formatted(payload), e);
|
||||||
.map(JenaRosenkeller::toAttachment)
|
}
|
||||||
.map(Result::optional)
|
case Error<InputStream> error:
|
||||||
.flatMap(Optional::stream)
|
return error.transform();
|
||||||
.toList();
|
default:
|
||||||
|
return Error.format("Invalid parameter: %s", inputStream.getClass().getSimpleName());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static Result<Attachment> toAttachment(Result<URL> urlResult) {
|
private static Result<Attachment> toAttachment(Result<URL> urlResult) {
|
||||||
switch (urlResult) {
|
switch (urlResult) {
|
||||||
case Payload<URL> payload:
|
case Payload<URL> payload:
|
||||||
@@ -183,33 +219,6 @@ public class JenaRosenkeller implements Importer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static List<Link> extractLinks(Tag appointmentTag) {
|
|
||||||
var links = new ArrayList<Link>();
|
|
||||||
appointmentTag //
|
|
||||||
.find(attributeStartsWith("id", "post-"))
|
|
||||||
.stream()
|
|
||||||
.flatMap(tag -> tag.find(ofType("a")).stream())
|
|
||||||
.forEach(anchor -> {
|
|
||||||
var href = anchor.get("href");
|
|
||||||
if (href == null) return;
|
|
||||||
if (!href.contains("://")) href = BASE_URL + "href";
|
|
||||||
var text = anchor.inner(0).orElse(href);
|
|
||||||
Payload.of(href).map(JenaRosenkeller::url).optional().map(url -> new Link(url, text)).ifPresent(links::add);
|
|
||||||
});
|
|
||||||
return links;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Result<Link> toLink(Result<URL> urlResult, Optional<String> description) {
|
|
||||||
return switch (urlResult) {
|
|
||||||
case Payload<URL> payload -> Payload.of(new Link(payload.get(),description.orElse(payload.toString())));
|
|
||||||
case Error<URL> err -> err.transform();
|
|
||||||
default -> Error.format("Invalid parameter: %s", urlResult.getClass().getSimpleName());
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Optional<LocalDateTime> extractStart(Tag appointmentTag) {
|
|
||||||
return appointmentTag.find(attributeEquals("class", "tribe-event-date-start")).stream().flatMap(tag -> tag.inner(0).stream()).flatMap(txt -> toDateTime(txt).stream()).findAny();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Optional<LocalDateTime> toDateTime(String text) {
|
private static Optional<LocalDateTime> toDateTime(String text) {
|
||||||
var match = DATE_PATTERN.matcher(text);
|
var match = DATE_PATTERN.matcher(text);
|
||||||
@@ -246,17 +255,6 @@ public class JenaRosenkeller implements Importer {
|
|||||||
return empty();
|
return empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Optional<String> extractDescription(Tag appointmentTag) {
|
|
||||||
return appointmentTag.find(attributeHas("class", "tribe-events-single-event-description")).stream().flatMap(tag -> tag.inner(2).stream()).findAny();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Optional<String> extractTitle(Tag appointmentTag) {
|
|
||||||
return appointmentTag
|
|
||||||
.find(attributeEndsWith("class", "single-event-title")) //
|
|
||||||
.stream()
|
|
||||||
.flatMap(tag -> tag.inner(2).stream())
|
|
||||||
.findAny();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Result<URL> url(Result<String> urls) {
|
private static Result<URL> url(Result<String> urls) {
|
||||||
switch (urls) {
|
switch (urls) {
|
||||||
|
|||||||
Reference in New Issue
Block a user