implementation group: 'com.fasterxml.jackson.module', name: 'jackson-module-kotlin', version: '2.16.1'
implementation group: "com.google.inject", name: "guice", version: "7.0.0"
implementation group: "org.jetbrains.kotlinx", name: "kotlinx-html-jvm", version: "0.11.0"
- implementation group: 'com.google.code.findbugs', name: 'jsr305', version: '3.0.2'
+ implementation group: 'org.jspecify', name: 'jspecify', version: '1.0.0'
testImplementation(platform("org.junit:junit-bom:5.11.3"))
testImplementation group: "org.junit.jupiter", name: "junit-jupiter-engine"
package net.pterodactylus.rhynodge;
-import org.jetbrains.annotations.NotNull;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
/**
* Defines a filter that runs between {@link Query}s and {@link Merger}s and
* The state to convert
* @return The new state
*/
- @NotNull
- State filter(@NotNull State state);
+ @NonNull
+ State filter(@Nullable State state);
}
package net.pterodactylus.rhynodge;
-import javax.annotation.Nonnull;
-
import net.pterodactylus.rhynodge.output.Output;
+import org.jspecify.annotations.NonNull;
/**
* Defines the current state of a system.
*/
Throwable exception();
- @Nonnull
+ @NonNull
Output output(Reaction reaction);
}
import net.pterodactylus.rhynodge.states.TorrentState.TorrentFile;
import com.google.common.base.Predicate;
-import org.jetbrains.annotations.NotNull;
+import org.jspecify.annotations.NonNull;
/**
* Filter for {@link TorrentState}s that removes all {@link TorrentFile}s whose
this.filterWords = filterWords;
}
- @NotNull
+ @NonNull
@Override
- public State filter(@NotNull State state) {
+ public State filter(@NonNull State state) {
if (!state.success()) {
return FailedState.from(state);
}
import net.pterodactylus.rhynodge.states.HtmlState;
import com.google.common.base.Optional;
-import org.jetbrains.annotations.NotNull;
import org.jsoup.nodes.Document;
+import org.jspecify.annotations.NonNull;
/**
* {@link Filter} implementation that can extract {@link ComicState}s from
*/
public abstract class ComicSiteFilter implements Filter {
- @NotNull
+ @NonNull
@Override
- public State filter(@NotNull State state) {
+ public State filter(@NonNull State state) {
checkArgument(state instanceof HtmlState, "state must be an HTML state");
/* initialize states: */
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
import org.apache.log4j.Logger;
-import org.jetbrains.annotations.NotNull;
+import org.jspecify.annotations.NonNull;
/**
* {@link Filter} implementation that extracts {@link Episode} information from
/**
* {@inheritDoc}
*/
- @NotNull
+ @NonNull
@Override
- public State filter(@NotNull State state) {
+ public State filter(@NonNull State state) {
if (!state.success()) {
return FailedState.from(state);
}
import net.pterodactylus.rhynodge.states.StringState;
import com.google.common.base.Optional;
-import org.jetbrains.annotations.NotNull;
import org.jsoup.nodes.Document;
+import org.jspecify.annotations.NonNull;
/**
* {@link Filter} implementation that extracts a URL from an {@link HtmlState}.
*/
public abstract class ExtractUrlFilter implements Filter {
- @NotNull
+ @NonNull
@Override
- public State filter(@NotNull State state) {
+ public State filter(@NonNull State state) {
checkArgument(state instanceof HtmlState, "state must be an HTML state");
HtmlState htmlState = (HtmlState) state;
import net.pterodactylus.rhynodge.states.HttpState;
import org.apache.log4j.Logger;
-import org.jetbrains.annotations.NotNull;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
+import org.jspecify.annotations.NonNull;
/**
* {@link Filter} that converts a {@link HttpState} into an {@link HtmlState}.
/**
* {@inheritDoc}
*/
- @NotNull
+ @NonNull
@Override
- public State filter(@NotNull State state) {
+ public State filter(@NonNull State state) {
if (!state.success()) {
return FailedState.from(state);
}
import net.pterodactylus.rhynodge.states.HttpState;
import net.pterodactylus.rhynodge.states.StringState;
-import org.jetbrains.annotations.NotNull;
+import org.jspecify.annotations.NonNull;
/**
* {@link Filter} implementation that uses the {@link StringState#value() value}
*/
public class HttpQueryFilter implements Filter {
- @NotNull
+ @NonNull
@Override
- public State filter(@NotNull State state) {
+ public State filter(@NonNull State state) {
checkArgument(state instanceof StringState, "state must be a String state");
StringState stringState = (StringState) state;
import net.pterodactylus.rhynodge.states.TorrentState;
import net.pterodactylus.rhynodge.states.TorrentState.TorrentFile;
-import org.jetbrains.annotations.NotNull;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
+import org.jspecify.annotations.NonNull;
/**
* {@link Filter} implementation that parses a {@link TorrentState} from an
/**
* {@inheritDoc}
*/
- @NotNull
+ @NonNull
@Override
- public State filter(@NotNull State state) {
+ public State filter(@NonNull State state) {
if (!state.success()) {
return FailedState.from(state);
}
import java.util.HashSet;
import java.util.List;
import java.util.Set;
-import javax.annotation.Nonnull;
import net.pterodactylus.rhynodge.Merger;
import net.pterodactylus.rhynodge.State;
import net.pterodactylus.rhynodge.states.ComicState;
import net.pterodactylus.rhynodge.states.ComicState.Comic;
+import org.jspecify.annotations.NonNull;
import static com.google.common.base.Preconditions.checkArgument;
*/
public class ComicMerger implements Merger {
- @Nonnull
+ @NonNull
@Override
- public State mergeStates(@Nonnull State previousState, @Nonnull State currentState) {
+ public State mergeStates(@NonNull State previousState, @NonNull State currentState) {
checkArgument(previousState instanceof ComicState, "previous state must be a comic state");
checkArgument(currentState instanceof ComicState, "current state must be a comic state");
import java.util.HashSet;
import java.util.Map;
-import javax.annotation.Nonnull;
-
import net.pterodactylus.rhynodge.Merger;
import net.pterodactylus.rhynodge.State;
import net.pterodactylus.rhynodge.states.EpisodeState;
import net.pterodactylus.rhynodge.states.EpisodeState.Episode;
import net.pterodactylus.rhynodge.states.TorrentState.TorrentFile;
+import org.jspecify.annotations.NonNull;
import static com.google.common.base.Preconditions.checkState;
import static java.util.function.Function.identity;
/**
* {@inheritDoc}
*/
- @Nonnull
+ @NonNull
@Override
- public State mergeStates(@Nonnull State previousState, @Nonnull State currentState) {
+ public State mergeStates(@NonNull State previousState, @NonNull State currentState) {
checkState(currentState instanceof EpisodeState, "currentState is not a EpisodeState but a %s", currentState.getClass().getName());
checkState(previousState instanceof EpisodeState, "previousState is not a EpisodeState but a %s", currentState.getClass().getName());
import java.util.HashSet;
import java.util.Set;
-import javax.annotation.Nonnull;
import net.pterodactylus.rhynodge.Merger;
import net.pterodactylus.rhynodge.State;
import net.pterodactylus.rhynodge.states.TorrentState;
import net.pterodactylus.rhynodge.states.TorrentState.TorrentFile;
+import org.jspecify.annotations.NonNull;
import static com.google.common.base.Preconditions.checkState;
/**
* {@inheritDoc}
*/
- @Nonnull
+ @NonNull
@Override
- public State mergeStates(@Nonnull State previousState, @Nonnull State currentState) {
+ public State mergeStates(@NonNull State previousState, @NonNull State currentState) {
checkState(currentState instanceof TorrentState, "currentState is not a TorrentState but a %s", currentState.getClass().getName());
checkState(previousState instanceof TorrentState, "previousState is not a TorrentState but a %s", currentState.getClass().getName());
import java.time.Clock;
import java.util.Objects;
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
import net.pterodactylus.rhynodge.Reaction;
import net.pterodactylus.rhynodge.State;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.google.common.escape.Escaper;
import com.google.common.html.HtmlEscapers;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
/**
* Abstract implementation of a {@link State} that knows about the basic
return exception;
}
- @Nonnull
+ @NonNull
@Override
public Output output(Reaction reaction) {
return new DefaultOutput(summary(reaction))
.addText("text/html", htmlText());
}
- @Nonnull
+ @NonNull
protected String summary(Reaction reaction) {
return reaction.name();
}
- @Nonnull
+ @NonNull
protected abstract String plainText();
@Nullable
import java.util.Iterator;
import java.util.List;
import java.util.Set;
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
import net.pterodactylus.rhynodge.Reaction;
import net.pterodactylus.rhynodge.states.ComicState.Comic;
import com.google.common.collect.Lists;
import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.commons.lang3.StringUtils;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
import static java.lang.String.format;
return format("ComicState[comics=%s]", comics());
}
- @Nonnull
+ @NonNull
@Override
protected String summary(Reaction reaction) {
return format("New Comic found for “%s!”", reaction.name());
}
- @Nonnull
+ @NonNull
@Override
protected String plainText() {
StringBuilder text = new StringBuilder();
import java.util.List;
import java.util.Map;
import java.util.Set;
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
import net.pterodactylus.rhynodge.Reaction;
import net.pterodactylus.rhynodge.State;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Ordering;
import org.apache.commons.lang3.StringEscapeUtils;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
/**
* {@link State} implementation that stores episodes of TV shows, parsed via
return Collections.unmodifiableCollection(episodes);
}
- @Nonnull
+ @NonNull
@Override
protected String summary(Reaction reaction) {
if (!newEpisodes.isEmpty()) {
return String.format("%d changed Torrent(s) for “%s!”", changedEpisodes.size(), reaction.name());
}
- @Nonnull
+ @NonNull
@Override
protected String plainText() {
StringBuilder stringBuilder = new StringBuilder();
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
-import javax.annotation.Nonnull;
import net.pterodactylus.rhynodge.State;
+import org.jspecify.annotations.NonNull;
/**
* {@link State} implementation that signals failure.
return true;
}
- @Nonnull
+ @NonNull
@Override
protected String plainText() {
if (exception() == null) {
package net.pterodactylus.rhynodge.states;
-import javax.annotation.Nonnull;
-
import net.pterodactylus.rhynodge.State;
+import org.jspecify.annotations.NonNull;
/**
* A {@link State} that contains information about a file.
return modificationTime;
}
- @Nonnull
+ @NonNull
@Override
protected String plainText() {
return toString();
package net.pterodactylus.rhynodge.states;
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-
import net.pterodactylus.rhynodge.State;
import org.jsoup.nodes.Document;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
/**
* {@link State} implementation that contains a parsed HTML {@link Document}.
return document;
}
- @Nonnull
+ @NonNull
@Override
protected String plainText() {
//noinspection ConstantConditions
import java.io.UnsupportedEncodingException;
-import javax.annotation.Nonnull;
-
import net.pterodactylus.rhynodge.State;
import net.pterodactylus.rhynodge.queries.HttpQuery;
import org.apache.http.HeaderElement;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicHeaderValueParser;
+import org.jspecify.annotations.NonNull;
/**
* {@link State} that contains the results of an {@link HttpQuery}.
}
}
- @Nonnull
+ @NonNull
@Override
protected String plainText() {
return content();
import java.util.Optional;
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-
import net.pterodactylus.rhynodge.State;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
/**
* {@link State} implementation that can expose itself as plain text and/or
return !plainTextOutput.isPresent() && !htmlOutput.isPresent();
}
- @Nonnull
+ @NonNull
@Override
protected String plainText() {
return plainTextOutput.orElse("");
package net.pterodactylus.rhynodge.states;
-import javax.annotation.Nonnull;
+import org.jspecify.annotations.NonNull;
/**
* A {@link net.pterodactylus.rhynodge.State} that stores a single {@link
return value.isEmpty();
}
- @Nonnull
+ @NonNull
@Override
protected String plainText() {
return value;
import java.util.Optional;
import java.util.Set;
-import javax.annotation.Nonnull;
-
import net.pterodactylus.rhynodge.Reaction;
import net.pterodactylus.rhynodge.State;
import net.pterodactylus.rhynodge.output.DefaultOutput;
import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.http.NameValuePair;
import org.apache.http.client.utils.URLEncodedUtils;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
import static com.google.common.collect.Ordering.from;
import static java.lang.String.format;
return this;
}
- @Nonnull
+ @NonNull
@Override
protected String summary(Reaction reaction) {
return format("Found %d new Torrent(s) for “%s!”", newTorrentFiles.size(), reaction.name());
}
- @Nonnull
+ @NonNull
@Override
protected String plainText() {
StringBuilder plainText = new StringBuilder();
import java.io.File;
import java.io.IOException;
import java.util.Optional;
-import javax.annotation.Nonnull;
import net.pterodactylus.rhynodge.State;
import net.pterodactylus.rhynodge.states.StateManager.StateDirectory;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.common.io.Files;
import org.hamcrest.Matchers;
+import org.jspecify.annotations.NonNull;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
super(success);
}
- @Nonnull
+ @NonNull
@Override
protected String plainText() {
return "Test";
@JsonProperty
private final Object someObject = new Object();
- @Nonnull
+ @NonNull
@Override
protected String plainText() {
return "Invalid";