♻️ Use java’s Optional instead of Guava’s
authorDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Mon, 6 Oct 2025 15:47:58 +0000 (17:47 +0200)
committerDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Mon, 6 Oct 2025 15:47:58 +0000 (17:47 +0200)
26 files changed:
src/main/java/net/pterodactylus/rhynodge/filters/ComicSiteFilter.java
src/main/java/net/pterodactylus/rhynodge/filters/comics/AbstruseGooseComicFilter.java
src/main/java/net/pterodactylus/rhynodge/filters/comics/ChiefOBrienAtWorkComicFilter.java
src/main/java/net/pterodactylus/rhynodge/filters/comics/Collar6ComicFilter.java
src/main/java/net/pterodactylus/rhynodge/filters/comics/CyanideAndHappinessComicFilter.java
src/main/java/net/pterodactylus/rhynodge/filters/comics/GeneralProtectionFaultComicFilter.java
src/main/java/net/pterodactylus/rhynodge/filters/comics/GirlGeniusComicFilter.java
src/main/java/net/pterodactylus/rhynodge/filters/comics/KevinAndKellComicFilter.java
src/main/java/net/pterodactylus/rhynodge/filters/comics/SaturdayMorningBreakfastCerealComicFilter.java
src/main/java/net/pterodactylus/rhynodge/filters/comics/ScandinaviaAndTheWorldComicFilter.java
src/main/java/net/pterodactylus/rhynodge/filters/comics/XkcdComicFilter.java
src/main/kotlin/net/pterodactylus/rhynodge/filters/comics/BexAndKeitComicFilter.kt
src/main/kotlin/net/pterodactylus/rhynodge/filters/comics/BusinessCatComicFilter.kt
src/main/kotlin/net/pterodactylus/rhynodge/filters/comics/CtrlAltDelComicFilter.kt
src/main/kotlin/net/pterodactylus/rhynodge/filters/comics/GrrlPowerFilter.kt
src/main/kotlin/net/pterodactylus/rhynodge/filters/comics/HeldentageFilter.kt
src/main/kotlin/net/pterodactylus/rhynodge/filters/comics/LeastICouldDoComicFilter.kt
src/main/kotlin/net/pterodactylus/rhynodge/filters/comics/QuestionableContentComicFilter.kt
src/main/kotlin/net/pterodactylus/rhynodge/filters/comics/SinfestComicFilter.kt
src/main/kotlin/net/pterodactylus/rhynodge/filters/comics/SoggyCardboardComicFilter.kt
src/main/kotlin/net/pterodactylus/rhynodge/filters/comics/SplatballComicFilter.kt
src/main/kotlin/net/pterodactylus/rhynodge/filters/comics/TheMonsterUnderTheBedFilter.kt
src/main/kotlin/net/pterodactylus/rhynodge/utils/Optionals.kt
src/test/java/net/pterodactylus/rhynodge/filters/ComicSiteFilterTest.java
src/test/java/net/pterodactylus/rhynodge/filters/comics/AbstruseGooseComicFilterTest.java
src/test/kotlin/net/pterodactylus/rhynodge/filters/comics/ChiefOBrienAtWorkComicFilterTest.kt

index e8ea1c1..0ccd913 100644 (file)
@@ -24,6 +24,7 @@ import java.net.URISyntaxException;
 import java.util.Collections;
 import java.util.List;
 
+import java.util.Optional;
 import net.pterodactylus.rhynodge.Filter;
 import net.pterodactylus.rhynodge.State;
 import net.pterodactylus.rhynodge.states.ComicState;
@@ -32,7 +33,6 @@ import net.pterodactylus.rhynodge.states.ComicState.Strip;
 import net.pterodactylus.rhynodge.states.FailedState;
 import net.pterodactylus.rhynodge.states.HtmlState;
 
-import com.google.common.base.Optional;
 import org.jsoup.nodes.Document;
 import org.jspecify.annotations.NonNull;
 
@@ -62,7 +62,7 @@ public abstract class ComicSiteFilter implements Filter {
                        return new FailedState();
                }
 
-               Comic comic = new Comic(title.or(""));
+               Comic comic = new Comic(title.orElse(""));
                int imageCounter = 0;
                for (String imageUrl : imageUrls) {
                        String imageComment = (imageCounter < imageComments.size()) ? imageComments.get(imageCounter) : "";
@@ -88,7 +88,7 @@ public abstract class ComicSiteFilter implements Filter {
         *
         * @param document
         *              The document to extract the title from
-        * @return The extracted title, or {@link Optional#absent()}} if no title could
+        * @return The extracted title, or {@link Optional#empty()}} if no title could
         *         be found
         */
        protected abstract Optional<String> extractTitle(Document document);
index 9d98650..f894f16 100644 (file)
 
 package net.pterodactylus.rhynodge.filters.comics;
 
-import static com.google.common.base.Optional.fromNullable;
 import static com.google.common.collect.FluentIterable.from;
+import static java.util.Optional.of;
 
 import java.util.List;
 
+import java.util.Optional;
 import net.pterodactylus.rhynodge.filters.ComicSiteFilter;
 
 import com.google.common.base.Function;
-import com.google.common.base.Optional;
 import com.google.common.collect.FluentIterable;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
@@ -39,7 +39,7 @@ public class AbstruseGooseComicFilter extends ComicSiteFilter {
 
        @Override
        protected Optional<String> extractTitle(Document document) {
-               return fromNullable(document.select("h1.storytitle a").text());
+               return of(document.select("h1.storytitle a").text());
        }
 
        @Override
index 5671bc4..314d130 100644 (file)
@@ -4,9 +4,9 @@ import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 
+import java.util.Optional;
 import net.pterodactylus.rhynodge.filters.ComicSiteFilter;
 
-import com.google.common.base.Optional;
 import org.jsoup.nodes.Document;
 
 /**
@@ -29,7 +29,7 @@ public class ChiefOBrienAtWorkComicFilter extends ComicSiteFilter {
 
        @Override
        protected Optional<String> extractTitle(Document document) {
-               return Optional.fromNullable(document.select("article .caption p").get(0).text());
+               return Optional.of(document.select("article .caption p").get(0).text());
        }
 
 }
index 49fe296..b1ddd2a 100644 (file)
@@ -20,10 +20,10 @@ package net.pterodactylus.rhynodge.filters.comics;
 import java.util.Collections;
 import java.util.List;
 
+import java.util.Optional;
 import net.pterodactylus.rhynodge.filters.ComicSiteFilter;
 
 import com.google.common.base.Function;
-import com.google.common.base.Optional;
 import com.google.common.collect.FluentIterable;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
index 80c8ac4..6eaab76 100644 (file)
@@ -17,8 +17,8 @@
 
 package net.pterodactylus.rhynodge.filters.comics;
 
-import static com.google.common.base.Optional.absent;
-import static com.google.common.base.Optional.of;
+import static java.util.Optional.empty;
+import static java.util.Optional.of;
 
 import java.net.URI;
 import java.net.URISyntaxException;
@@ -26,10 +26,10 @@ import java.net.URL;
 import java.util.Collections;
 import java.util.List;
 
+import java.util.Optional;
 import net.pterodactylus.rhynodge.filters.ComicSiteFilter;
 
 import com.google.common.base.Function;
-import com.google.common.base.Optional;
 import com.google.common.collect.FluentIterable;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
@@ -45,7 +45,7 @@ public class CyanideAndHappinessComicFilter extends ComicSiteFilter {
 
        @Override
        protected Optional<String> extractTitle(Document document) {
-               return extractImageUrls(document).isEmpty() ? absent() : of("");
+               return extractImageUrls(document).isEmpty() ? empty() : of("");
        }
 
        @Override
index 0a8f16a..8133461 100644 (file)
@@ -24,10 +24,10 @@ import static java.util.Collections.emptyList;
 import java.util.Collections;
 import java.util.List;
 
+import java.util.Optional;
 import net.pterodactylus.rhynodge.filters.ComicSiteFilter;
 
 import com.google.common.base.Function;
-import com.google.common.base.Optional;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
 import org.jsoup.select.Elements;
index d2ed5aa..390bd12 100644 (file)
 
 package net.pterodactylus.rhynodge.filters.comics;
 
-import static com.google.common.base.Optional.absent;
-import static com.google.common.base.Optional.of;
-
 import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
 import java.util.stream.Collectors;
-
 import net.pterodactylus.rhynodge.filters.ComicSiteFilter;
-
-import com.google.common.base.Optional;
 import org.jsoup.nodes.Document;
 import org.jsoup.select.Elements;
 
+import static java.util.Optional.empty;
+import static java.util.Optional.of;
+
 /**
  * {@link ComicSiteFilter} implementation that can parse Girl Genius comics.
  *
@@ -39,7 +37,7 @@ public class GirlGeniusComicFilter extends ComicSiteFilter {
 
        @Override
        protected Optional<String> extractTitle(Document document) {
-               return extractImageUrls(document).isEmpty() ? absent() : of("");
+               return extractImageUrls(document).isEmpty() ? empty() : of("");
        }
 
        @Override
index bd460ca..1b98739 100644 (file)
@@ -21,9 +21,9 @@ import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 
+import java.util.Optional;
 import net.pterodactylus.rhynodge.filters.ComicSiteFilter;
 
-import com.google.common.base.Optional;
 import org.apache.commons.lang3.StringEscapeUtils;
 import org.jsoup.nodes.Document;
 import org.jsoup.select.Elements;
@@ -38,7 +38,7 @@ public class KevinAndKellComicFilter extends ComicSiteFilter {
        @Override
        protected Optional<String> extractTitle(Document document) {
                Elements captionElements = document.select("#comicstripCaption");
-               return Optional.fromNullable(StringEscapeUtils.unescapeHtml4(captionElements.text()));
+               return Optional.ofNullable(StringEscapeUtils.unescapeHtml4(captionElements.text()));
        }
 
        @Override
index 7f4bc15..0d9b7d8 100644 (file)
@@ -21,9 +21,9 @@ import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 
+import java.util.Optional;
 import net.pterodactylus.rhynodge.filters.ComicSiteFilter;
 
-import com.google.common.base.Optional;
 import com.google.common.base.Predicate;
 import com.google.common.collect.FluentIterable;
 import org.jsoup.nodes.Document;
index 2a32f6a..dbe26e3 100644 (file)
@@ -18,7 +18,7 @@
 package net.pterodactylus.rhynodge.filters.comics;
 
 import com.google.common.base.Function;
-import com.google.common.base.Optional;
+import java.util.Optional;
 import net.pterodactylus.rhynodge.filters.ComicSiteFilter;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
index ae80654..63c2a43 100644 (file)
@@ -22,12 +22,14 @@ import java.util.List;
 import net.pterodactylus.rhynodge.filters.ComicSiteFilter;
 
 import com.google.common.base.Function;
-import com.google.common.base.Optional;
 import com.google.common.collect.FluentIterable;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
 import org.jsoup.select.Elements;
 
+import static java.util.Optional.empty;
+import static java.util.Optional.of;
+
 /**
  * {@link ComicSiteFilter} implementation that can parse XKCD comics.
  *
@@ -36,9 +38,9 @@ import org.jsoup.select.Elements;
 public class XkcdComicFilter extends ComicSiteFilter {
 
        @Override
-       protected Optional<String> extractTitle(Document document) {
+       protected java.util.Optional<String> extractTitle(Document document) {
                Elements titleElement = document.select("div#ctitle");
-               return titleElement.hasText() ? Optional.of(titleElement.text()) : Optional.<String>absent();
+               return titleElement.hasText() ? of(titleElement.text()) : empty();
        }
 
        @Override
index 670aee8..a01412f 100644 (file)
@@ -1,13 +1,13 @@
 package net.pterodactylus.rhynodge.filters.comics
 
-import com.google.common.base.Optional
-import com.google.common.base.Optional.absent
+import java.util.Optional
+import java.util.Optional.empty
 import net.pterodactylus.rhynodge.filters.ComicSiteFilter
 import org.jsoup.nodes.Document
 
 class BexAndKeitComicFilter : ComicSiteFilter() {
 
-       override fun extractTitle(document: Document): Optional<String> = absent()
+       override fun extractTitle(document: Document): Optional<String> = empty()
 
        override fun extractImageUrls(document: Document) =
                document.select(".row")
index 54a94c5..c9927b5 100644 (file)
@@ -1,6 +1,6 @@
 package net.pterodactylus.rhynodge.filters.comics
 
-import com.google.common.base.Optional
+import java.util.Optional
 import net.pterodactylus.rhynodge.filters.ComicSiteFilter
 import net.pterodactylus.rhynodge.utils.asOptional
 import org.jsoup.nodes.Document
index a4cf18a..83b8a3b 100644 (file)
@@ -16,7 +16,7 @@
  */
 package net.pterodactylus.rhynodge.filters.comics
 
-import com.google.common.base.Optional
+import java.util.Optional
 import net.pterodactylus.rhynodge.filters.ComicSiteFilter
 import net.pterodactylus.rhynodge.utils.asOptional
 import org.jsoup.nodes.Document
index a5c0f38..7d464dd 100644 (file)
@@ -1,6 +1,6 @@
 package net.pterodactylus.rhynodge.filters.comics
 
-import com.google.common.base.Optional
+import java.util.Optional
 import net.pterodactylus.rhynodge.filters.ComicSiteFilter
 import net.pterodactylus.rhynodge.utils.asOptional
 import org.jsoup.nodes.Document
index 48879c7..8a80fd3 100644 (file)
@@ -1,9 +1,6 @@
 package net.pterodactylus.rhynodge.filters.comics
 
-import com.google.common.base.Optional
-import com.google.common.base.Optional.absent
-import com.google.common.base.Optional.fromNullable
-import com.google.common.base.Optional.of
+import java.util.Optional
 import net.pterodactylus.rhynodge.filters.ComicSiteFilter
 import net.pterodactylus.rhynodge.utils.asOptional
 import org.jsoup.nodes.Document
index 4f29a23..f200c61 100644 (file)
@@ -17,7 +17,7 @@
 
 package net.pterodactylus.rhynodge.filters.comics
 
-import com.google.common.base.Optional
+import java.util.Optional
 import net.pterodactylus.rhynodge.filters.ComicSiteFilter
 import org.jsoup.nodes.Document
 
@@ -26,7 +26,7 @@ import org.jsoup.nodes.Document
  */
 class LeastICouldDoComicFilter : ComicSiteFilter() {
 
-       override fun extractTitle(document: Document) = Optional.of("")!!
+       override fun extractTitle(document: Document) = Optional.of("")
 
        override fun extractImageUrls(document: Document) =
                        document.select("#content-comic img.comic")
index f405839..ca9846d 100644 (file)
  */
 package net.pterodactylus.rhynodge.filters.comics
 
-import com.google.common.base.Optional
+import java.util.Optional
+import java.util.Optional.empty
 import net.pterodactylus.rhynodge.filters.ComicSiteFilter
 import org.jsoup.nodes.Document
 
 class QuestionableContentComicFilter : ComicSiteFilter() {
 
-       override fun extractTitle(document: Document): Optional<String> = Optional.absent()
+       override fun extractTitle(document: Document): Optional<String> = empty()
 
        override fun extractImageUrls(document: Document): List<String> =
                        listOf(document.select("#comicnav").first()!!.nextSibling()!!.nextSibling()!!.attr("src"))
index 0cd323b..a714e85 100644 (file)
@@ -16,7 +16,7 @@
  */
 package net.pterodactylus.rhynodge.filters.comics
 
-import com.google.common.base.Optional
+import java.util.Optional
 import net.pterodactylus.rhynodge.filters.ComicSiteFilter
 import net.pterodactylus.rhynodge.utils.asOptional
 import org.jsoup.nodes.Document
index 5da7106..dce0afa 100644 (file)
@@ -1,6 +1,6 @@
 package net.pterodactylus.rhynodge.filters.comics
 
-import com.google.common.base.Optional
+import java.util.Optional
 import net.pterodactylus.rhynodge.filters.ComicSiteFilter
 import net.pterodactylus.rhynodge.utils.asOptional
 import org.jsoup.nodes.Document
index be7c190..dec0672 100644 (file)
@@ -1,13 +1,13 @@
 package net.pterodactylus.rhynodge.filters.comics
 
-import com.google.common.base.Optional
-import com.google.common.base.Optional.absent
+import java.util.Optional
+import java.util.Optional.empty
 import net.pterodactylus.rhynodge.filters.ComicSiteFilter
 import org.jsoup.nodes.Document
 
 class SplatballComicFilter : ComicSiteFilter() {
 
-       override fun extractTitle(document: Document): Optional<String> = absent()
+       override fun extractTitle(document: Document): Optional<String> = empty()
 
        override fun extractImageUrls(document: Document) =
                document.select(".row")
index 0e151d2..5130a0f 100644 (file)
@@ -1,14 +1,14 @@
 package net.pterodactylus.rhynodge.filters.comics
 
-import com.google.common.base.*
-import com.google.common.base.Optional.*
 import net.pterodactylus.rhynodge.filters.*
 import org.jsoup.nodes.*
+import java.util.Optional
+import net.pterodactylus.rhynodge.utils.asOptional
 
 class TheMonsterUnderTheBedFilter : ComicSiteFilter() {
 
        override fun extractTitle(document: Document): Optional<String> =
-                       document.select("h2.post-title").text().toOptional()
+                       document.select("h2.post-title").text().asOptional()
 
        override fun extractImageUrls(document: Document): List<String> =
                        document.select("div#comic img").map { it.attr("src") }
@@ -16,5 +16,3 @@ class TheMonsterUnderTheBedFilter : ComicSiteFilter() {
        override fun extractImageComments(document: Document): List<String> = emptyList()
 
 }
-
-private fun <T> T?.toOptional(): Optional<T> = fromNullable(this)
index e51b36d..7c137b9 100644 (file)
@@ -1,7 +1,7 @@
 package net.pterodactylus.rhynodge.utils
 
-import com.google.common.base.Optional
+import java.util.Optional
 
-fun <T> T?.asOptional(): Optional<T> = Optional.fromNullable(this)
-fun String?.asOptional(): Optional<String> = if ((this == null) || (this.isEmpty())) Optional.absent() else Optional.of(this)
-fun String?.toOptional(): java.util.Optional<String> = java.util.Optional.ofNullable(this)
+fun <T> T?.asOptional(): Optional<T & Any> = Optional.ofNullable(this)
+fun String?.asOptional(): Optional<String> = if ((this == null) || (isEmpty())) Optional.empty() else Optional.of(this)
+fun String?.toOptional(): Optional<String> = Optional.ofNullable(this)
index 01c3f06..d807bed 100644 (file)
@@ -1,7 +1,7 @@
 package net.pterodactylus.rhynodge.filters;
 
-import static com.google.common.base.Optional.fromNullable;
 import static java.util.Arrays.asList;
+import static java.util.Optional.ofNullable;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.contains;
 import static org.hamcrest.Matchers.hasSize;
@@ -11,6 +11,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
 import java.util.Collections;
 import java.util.List;
 
+import java.util.Optional;
 import net.pterodactylus.rhynodge.State;
 import net.pterodactylus.rhynodge.states.ComicState;
 import net.pterodactylus.rhynodge.states.ComicState.Comic;
@@ -18,7 +19,6 @@ import net.pterodactylus.rhynodge.states.ComicState.Strip;
 import net.pterodactylus.rhynodge.states.FailedState;
 import net.pterodactylus.rhynodge.states.HtmlState;
 
-import com.google.common.base.Optional;
 import org.jsoup.nodes.Document;
 import org.junit.jupiter.api.Test;
 
@@ -77,7 +77,7 @@ public class ComicSiteFilterTest {
 
                @Override
                protected Optional<String> extractTitle(Document document) {
-                       return fromNullable(title);
+                       return ofNullable(title);
                }
 
                @Override
index 16be464..bf041d9 100644 (file)
@@ -17,7 +17,7 @@
 
 package net.pterodactylus.rhynodge.filters.comics;
 
-import static com.google.common.base.Optional.of;
+import static java.util.Optional.of;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.contains;
 import static org.hamcrest.Matchers.is;
@@ -25,9 +25,9 @@ import static org.hamcrest.Matchers.is;
 import java.io.IOException;
 import java.util.List;
 
+import java.util.Optional;
 import net.pterodactylus.rhynodge.filters.ResourceLoader;
 
-import com.google.common.base.Optional;
 import org.jsoup.nodes.Document;
 import org.junit.jupiter.api.Test;
 
index f252803..0f0c33a 100644 (file)
@@ -1,6 +1,6 @@
 package net.pterodactylus.rhynodge.filters.comics
 
-import com.google.common.base.Optional
+import java.util.Optional
 import net.pterodactylus.rhynodge.filters.ResourceLoader
 import org.hamcrest.MatcherAssert.assertThat
 import org.hamcrest.Matchers.contains