diff --git a/buildSrc/src/main/kotlin/de.siphalor.tweed5.base-module.gradle.kts b/buildSrc/src/main/kotlin/de.siphalor.tweed5.base-module.gradle.kts index 32f6d5d..01ede73 100644 --- a/buildSrc/src/main/kotlin/de.siphalor.tweed5.base-module.gradle.kts +++ b/buildSrc/src/main/kotlin/de.siphalor.tweed5.base-module.gradle.kts @@ -35,7 +35,10 @@ dependencies { testCompileOnly(libs.autoservice.annotations) testAnnotationProcessor(libs.autoservice.processor) - implementation(libs.jetbrains.annotations) + compileOnly(libs.jetbrains.annotations) + testImplementation(libs.jetbrains.annotations) + compileOnly(libs.jspecify.annotations) + testImplementation(libs.jspecify.annotations) implementation(libs.slf4j.api) "localRuntimeOnly"(libs.slf4j.rt) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 77ce880..b3b417d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,6 +4,7 @@ asm = "9.7" autoservice = "1.1.1" java = "8" jetbrains-annotations = "26.0.1" +jspecify = "1.0.0" junit = "5.12.0" lombok = "1.18.34" mockito = "5.14.2" @@ -19,6 +20,7 @@ asm-core = { group = "org.ow2.asm", name = "asm", version.ref = "asm" } autoservice-annotations = { group = "com.google.auto.service", name = "auto-service-annotations", version.ref = "autoservice" } autoservice-processor = { group = "com.google.auto.service", name = "auto-service", version.ref = "autoservice" } jetbrains-annotations = { group = "org.jetbrains", name = "annotations", version.ref = "jetbrains-annotations" } +jspecify-annotations = { group = "org.jspecify", name = "jspecify", version.ref = "jspecify" } junit-platform = { group = "org.junit", name = "junit-bom", version.ref = "junit" } junit-core = { group = "org.junit.jupiter", name = "junit-jupiter" } junit-launcher = { group = "org.junit.platform", name = "junit-platform-launcher" } diff --git a/tweed5-construct/src/main/java/de/siphalor/tweed5/construct/api/TweedConstructFactory.java b/tweed5-construct/src/main/java/de/siphalor/tweed5/construct/api/TweedConstructFactory.java index d15e077..e88b338 100644 --- a/tweed5-construct/src/main/java/de/siphalor/tweed5/construct/api/TweedConstructFactory.java +++ b/tweed5-construct/src/main/java/de/siphalor/tweed5/construct/api/TweedConstructFactory.java @@ -3,8 +3,7 @@ package de.siphalor.tweed5.construct.api; import de.siphalor.tweed5.construct.impl.TweedConstructFactoryImpl; import org.jetbrains.annotations.CheckReturnValue; import org.jetbrains.annotations.Contract; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * A factory that allows to construct instances of subclasses of a specific type. @@ -20,7 +19,7 @@ public interface TweedConstructFactory { /** * Starts building a new factory for the given base class. */ - static TweedConstructFactory.@NotNull FactoryBuilder builder(Class baseClass) { + static TweedConstructFactory.FactoryBuilder builder(Class baseClass) { return TweedConstructFactoryImpl.builder(baseClass); } @@ -30,7 +29,7 @@ public interface TweedConstructFactory { */ @CheckReturnValue @Contract(pure = true) - @NotNull Construct construct(@NotNull Class subClass); + Construct construct(Class subClass); /** * Builder for the factory. @@ -40,19 +39,19 @@ public interface TweedConstructFactory { * Defines a new typed argument of the given type. */ @Contract(mutates = "this", value = "_ -> this") - @NotNull FactoryBuilder typedArg(@NotNull Class argType); + FactoryBuilder typedArg(Class argType); /** * Defines a new named argument with the given name and value type. */ @Contract(mutates = "this", value = "_, _ -> this") - @NotNull FactoryBuilder namedArg(@NotNull String name, @NotNull Class argType); + FactoryBuilder namedArg(String name, Class argType); /** * Builds the factory. */ @Contract(pure = true) - @NotNull TweedConstructFactory build(); + TweedConstructFactory build(); } /** @@ -71,7 +70,7 @@ public interface TweedConstructFactory { * @see #namedArg(String, Object) */ @Contract(mutates = "this", value = "_ -> this") - @NotNull Construct typedArg(@NotNull A value); + Construct typedArg(A value); /** * Binds a value to a typed argument of the given type. @@ -81,19 +80,19 @@ public interface TweedConstructFactory { * @see #namedArg(String, Object) */ @Contract(mutates = "this", value = "_, _ -> this") - @NotNull Construct typedArg(@NotNull Class argType, @Nullable A value); + Construct typedArg(Class argType, @Nullable A value); /** * Binds a value to a named argument. * @see #typedArg(Object) */ @Contract(mutates = "this", value = "_, _ -> this") - @NotNull Construct namedArg(@NotNull String name, @Nullable A value); + Construct namedArg(String name, @Nullable A value); /** * Finishes the binding and actually constructs the class. */ @Contract(pure = true) - @NotNull C finish(); + C finish(); } } diff --git a/tweed5-construct/src/main/java/de/siphalor/tweed5/construct/api/package-info.java b/tweed5-construct/src/main/java/de/siphalor/tweed5/construct/api/package-info.java new file mode 100644 index 0000000..29b778b --- /dev/null +++ b/tweed5-construct/src/main/java/de/siphalor/tweed5/construct/api/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package de.siphalor.tweed5.construct.api; + +import org.jspecify.annotations.NullMarked; diff --git a/tweed5-construct/src/main/java/de/siphalor/tweed5/construct/impl/TweedConstructFactoryImpl.java b/tweed5-construct/src/main/java/de/siphalor/tweed5/construct/impl/TweedConstructFactoryImpl.java index 725f75e..4247909 100644 --- a/tweed5-construct/src/main/java/de/siphalor/tweed5/construct/impl/TweedConstructFactoryImpl.java +++ b/tweed5-construct/src/main/java/de/siphalor/tweed5/construct/impl/TweedConstructFactoryImpl.java @@ -4,8 +4,7 @@ import de.siphalor.tweed5.construct.api.ConstructParameter; import de.siphalor.tweed5.construct.api.TweedConstruct; import de.siphalor.tweed5.construct.api.TweedConstructFactory; import lombok.*; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; @@ -37,11 +36,11 @@ public class TweedConstructFactoryImpl implements TweedConstructFactory { } @Override - public TweedConstructFactory.@NotNull Construct construct(@NotNull Class subClass) { + public TweedConstructFactory.Construct construct(Class subClass) { return new Construct<>(getConstructTarget(subClass)); } - private @NotNull ConstructTarget getConstructTarget(Class type) { + private ConstructTarget getConstructTarget(Class type) { ConstructTarget cachedConstructTarget = readConstructTargetFromCache(type); if (cachedConstructTarget != null) { return cachedConstructTarget; @@ -164,7 +163,7 @@ public class TweedConstructFactoryImpl implements TweedConstructFactory { return new ConstructTarget<>(type, argOrder, createInvokerFromCandidate(type, executable)); } - private Function createInvokerFromCandidate(Class type, Executable executable) { + private Function<@Nullable Object[], C> createInvokerFromCandidate(Class type, Executable executable) { MethodHandle handle; try { if (executable instanceof Method) { @@ -263,7 +262,7 @@ public class TweedConstructFactoryImpl implements TweedConstructFactory { private final Map> namedArgs = new HashMap<>(); @Override - public TweedConstructFactory.@NotNull FactoryBuilder typedArg(@NotNull Class argType) { + public TweedConstructFactory.FactoryBuilder typedArg(Class argType) { argType = boxClass(argType); if (typedArgs.contains(argType)) { throw new IllegalArgumentException("Argument for type " + argType + " has already been registered"); @@ -273,10 +272,7 @@ public class TweedConstructFactoryImpl implements TweedConstructFactory { } @Override - public TweedConstructFactory.@NotNull FactoryBuilder namedArg( - @NotNull String name, - @NotNull Class argType - ) { + public TweedConstructFactory.FactoryBuilder namedArg(String name, Class argType) { Class existingArgType = namedArgs.get(name); if (existingArgType != null) { throw new IllegalArgumentException( @@ -290,7 +286,7 @@ public class TweedConstructFactoryImpl implements TweedConstructFactory { } @Override - public @NotNull TweedConstructFactory build() { + public TweedConstructFactory build() { return new TweedConstructFactoryImpl<>( constructBaseClass, typedArgs, @@ -302,18 +298,18 @@ public class TweedConstructFactoryImpl implements TweedConstructFactory { @RequiredArgsConstructor private class Construct implements TweedConstructFactory.Construct { private final ConstructTarget target; - private final Map, Object> typedArgValues = new HashMap<>(); - private final Map namedArgValues = new HashMap<>(); + private final Map, @Nullable Object> typedArgValues = new HashMap<>(); + private final Map namedArgValues = new HashMap<>(); @Override - public TweedConstructFactory.@NotNull Construct typedArg(@NotNull A value) { + public TweedConstructFactory.Construct typedArg(A value) { requireTypedArgExists(value.getClass(), value); typedArgValues.put(value.getClass(), value); return this; } @Override - public TweedConstructFactory.@NotNull Construct typedArg(@NotNull Class argType, @Nullable A value) { + public TweedConstructFactory.Construct typedArg(Class argType, @Nullable A value) { argType = boxClass(argType); if (value != null && !argType.isAssignableFrom(value.getClass())) { throw new IllegalArgumentException( @@ -327,7 +323,7 @@ public class TweedConstructFactoryImpl implements TweedConstructFactory { return this; } - private void requireTypedArgExists(@NotNull Class type, @Nullable A value) { + private void requireTypedArgExists(Class type, @Nullable A value) { if (!typedArgs.contains(type)) { throw new IllegalArgumentException( "Typed argument for type " + type.getName() + " does not exist, value: " + value @@ -336,7 +332,7 @@ public class TweedConstructFactoryImpl implements TweedConstructFactory { } @Override - public TweedConstructFactory.@NotNull Construct namedArg(@NotNull String name, @Nullable A value) { + public TweedConstructFactory.Construct namedArg(String name, @Nullable A value) { Class argType = namedArgs.get(name); if (argType == null) { throw new IllegalArgumentException( @@ -353,10 +349,10 @@ public class TweedConstructFactoryImpl implements TweedConstructFactory { } @Override - public @NotNull C finish() { + public C finish() { checkAllArgsFilled(); - Object[] argValues = new Object[target.argOrder.length]; + @Nullable Object[] argValues = new Object[target.argOrder.length]; for (int i = 0; i < target.argOrder.length; i++) { Object arg = target.argOrder[i]; if (arg instanceof Class) { @@ -459,6 +455,6 @@ public class TweedConstructFactoryImpl implements TweedConstructFactory { private static class ConstructTarget { Class type; Object[] argOrder; - Function invoker; + Function<@Nullable Object[], C> invoker; } } diff --git a/tweed5-construct/src/main/java/de/siphalor/tweed5/construct/impl/package-info.java b/tweed5-construct/src/main/java/de/siphalor/tweed5/construct/impl/package-info.java index 2515b80..842a306 100644 --- a/tweed5-construct/src/main/java/de/siphalor/tweed5/construct/impl/package-info.java +++ b/tweed5-construct/src/main/java/de/siphalor/tweed5/construct/impl/package-info.java @@ -1,4 +1,6 @@ @ApiStatus.Internal +@NullMarked package de.siphalor.tweed5.construct.impl; import org.jetbrains.annotations.ApiStatus; +import org.jspecify.annotations.NullMarked; diff --git a/tweed5-core/src/main/java/de/siphalor/tweed5/core/api/container/ConfigContainer.java b/tweed5-core/src/main/java/de/siphalor/tweed5/core/api/container/ConfigContainer.java index dd77dcd..8acb90c 100644 --- a/tweed5-core/src/main/java/de/siphalor/tweed5/core/api/container/ConfigContainer.java +++ b/tweed5-core/src/main/java/de/siphalor/tweed5/core/api/container/ConfigContainer.java @@ -5,7 +5,7 @@ import de.siphalor.tweed5.core.api.extension.EntryExtensionsData; import de.siphalor.tweed5.core.api.entry.ConfigEntry; import de.siphalor.tweed5.core.api.extension.RegisteredExtensionData; import de.siphalor.tweed5.core.api.extension.TweedExtension; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Collection; import java.util.Map; diff --git a/tweed5-core/src/main/java/de/siphalor/tweed5/core/api/entry/BaseConfigEntry.java b/tweed5-core/src/main/java/de/siphalor/tweed5/core/api/entry/BaseConfigEntry.java index 2bfb493..96086c2 100644 --- a/tweed5-core/src/main/java/de/siphalor/tweed5/core/api/entry/BaseConfigEntry.java +++ b/tweed5-core/src/main/java/de/siphalor/tweed5/core/api/entry/BaseConfigEntry.java @@ -4,13 +4,11 @@ import de.siphalor.tweed5.core.api.container.ConfigContainer; import de.siphalor.tweed5.core.api.extension.EntryExtensionsData; import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.jetbrains.annotations.NotNull; @RequiredArgsConstructor @Getter public abstract class BaseConfigEntry implements ConfigEntry { - @NotNull private final Class valueClass; private ConfigContainer container; private EntryExtensionsData extensionsData; diff --git a/tweed5-core/src/main/java/de/siphalor/tweed5/core/api/entry/ConfigEntry.java b/tweed5-core/src/main/java/de/siphalor/tweed5/core/api/entry/ConfigEntry.java index d6908d2..ca05282 100644 --- a/tweed5-core/src/main/java/de/siphalor/tweed5/core/api/entry/ConfigEntry.java +++ b/tweed5-core/src/main/java/de/siphalor/tweed5/core/api/entry/ConfigEntry.java @@ -2,7 +2,6 @@ package de.siphalor.tweed5.core.api.entry; import de.siphalor.tweed5.core.api.extension.EntryExtensionsData; import de.siphalor.tweed5.core.api.container.ConfigContainer; -import org.jetbrains.annotations.NotNull; public interface ConfigEntry { Class valueClass(); @@ -15,6 +14,5 @@ public interface ConfigEntry { void visitInOrder(ConfigEntryVisitor visitor); void visitInOrder(ConfigEntryValueVisitor visitor, T value); - @NotNull - T deepCopy(@NotNull T value); + T deepCopy(T value); } diff --git a/tweed5-core/src/main/java/de/siphalor/tweed5/core/api/package-info.java b/tweed5-core/src/main/java/de/siphalor/tweed5/core/api/package-info.java new file mode 100644 index 0000000..43122b8 --- /dev/null +++ b/tweed5-core/src/main/java/de/siphalor/tweed5/core/api/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package de.siphalor.tweed5.core.api; + +import org.jspecify.annotations.NullMarked; diff --git a/tweed5-core/src/main/java/de/siphalor/tweed5/core/impl/DefaultConfigContainer.java b/tweed5-core/src/main/java/de/siphalor/tweed5/core/impl/DefaultConfigContainer.java index 8e6ebfa..93e0f7a 100644 --- a/tweed5-core/src/main/java/de/siphalor/tweed5/core/impl/DefaultConfigContainer.java +++ b/tweed5-core/src/main/java/de/siphalor/tweed5/core/impl/DefaultConfigContainer.java @@ -12,11 +12,13 @@ import de.siphalor.tweed5.patchwork.impl.PatchworkClassPart; import de.siphalor.tweed5.utils.api.collection.InheritanceMap; import lombok.Getter; import lombok.Setter; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NullUnmarked; +import org.jspecify.annotations.Nullable; import java.lang.invoke.MethodHandle; import java.util.*; +@NullUnmarked public class DefaultConfigContainer implements ConfigContainer { @Getter private ConfigContainerSetupPhase setupPhase = ConfigContainerSetupPhase.EXTENSIONS_SETUP; diff --git a/tweed5-core/src/main/java/de/siphalor/tweed5/core/impl/entry/CollectionConfigEntryImpl.java b/tweed5-core/src/main/java/de/siphalor/tweed5/core/impl/entry/CollectionConfigEntryImpl.java index d9933a6..c52dd07 100644 --- a/tweed5-core/src/main/java/de/siphalor/tweed5/core/impl/entry/CollectionConfigEntryImpl.java +++ b/tweed5-core/src/main/java/de/siphalor/tweed5/core/impl/entry/CollectionConfigEntryImpl.java @@ -1,7 +1,6 @@ package de.siphalor.tweed5.core.impl.entry; import de.siphalor.tweed5.core.api.entry.*; -import org.jetbrains.annotations.NotNull; import java.util.Collection; import java.util.function.IntFunction; @@ -52,7 +51,7 @@ public class CollectionConfigEntryImpl> extends BaseC } @Override - public @NotNull T deepCopy(@NotNull T value) { + public T deepCopy(T value) { T copy = collectionConstructor.apply(value.size()); for (E element : value) { copy.add(elementEntry().deepCopy(element)); diff --git a/tweed5-core/src/main/java/de/siphalor/tweed5/core/impl/entry/SimpleConfigEntryImpl.java b/tweed5-core/src/main/java/de/siphalor/tweed5/core/impl/entry/SimpleConfigEntryImpl.java index ba1d5fe..62d227a 100644 --- a/tweed5-core/src/main/java/de/siphalor/tweed5/core/impl/entry/SimpleConfigEntryImpl.java +++ b/tweed5-core/src/main/java/de/siphalor/tweed5/core/impl/entry/SimpleConfigEntryImpl.java @@ -4,7 +4,6 @@ import de.siphalor.tweed5.core.api.entry.BaseConfigEntry; import de.siphalor.tweed5.core.api.entry.ConfigEntryValueVisitor; import de.siphalor.tweed5.core.api.entry.ConfigEntryVisitor; import de.siphalor.tweed5.core.api.entry.SimpleConfigEntry; -import org.jetbrains.annotations.NotNull; public class SimpleConfigEntryImpl extends BaseConfigEntry implements SimpleConfigEntry { public SimpleConfigEntryImpl(Class valueClass) { @@ -22,8 +21,7 @@ public class SimpleConfigEntryImpl extends BaseConfigEntry implements Simp } @Override - @NotNull - public T deepCopy(@NotNull T value) { + public T deepCopy(T value) { return value; } } diff --git a/tweed5-core/src/main/java/de/siphalor/tweed5/core/impl/entry/StaticMapCompoundConfigEntryImpl.java b/tweed5-core/src/main/java/de/siphalor/tweed5/core/impl/entry/StaticMapCompoundConfigEntryImpl.java index 2af283f..2bc6a85 100644 --- a/tweed5-core/src/main/java/de/siphalor/tweed5/core/impl/entry/StaticMapCompoundConfigEntryImpl.java +++ b/tweed5-core/src/main/java/de/siphalor/tweed5/core/impl/entry/StaticMapCompoundConfigEntryImpl.java @@ -1,7 +1,6 @@ package de.siphalor.tweed5.core.impl.entry; import de.siphalor.tweed5.core.api.entry.*; -import org.jetbrains.annotations.NotNull; import java.util.LinkedHashMap; import java.util.Map; @@ -11,7 +10,7 @@ public class StaticMapCompoundConfigEntryImpl> ext private final IntFunction mapConstructor; private final Map> compoundEntries = new LinkedHashMap<>(); - public StaticMapCompoundConfigEntryImpl(@NotNull Class valueClass, IntFunction mapConstructor) { + public StaticMapCompoundConfigEntryImpl(Class valueClass, IntFunction mapConstructor) { super(valueClass); this.mapConstructor = mapConstructor; } @@ -80,7 +79,7 @@ public class StaticMapCompoundConfigEntryImpl> ext } @Override - public @NotNull T deepCopy(@NotNull T value) { + public T deepCopy(T value) { T copy = instantiateCompoundValue(); value.forEach((String key, Object element) -> { //noinspection unchecked diff --git a/tweed5-core/src/main/java/de/siphalor/tweed5/core/impl/package-info.java b/tweed5-core/src/main/java/de/siphalor/tweed5/core/impl/package-info.java index 8de029c..c627670 100644 --- a/tweed5-core/src/main/java/de/siphalor/tweed5/core/impl/package-info.java +++ b/tweed5-core/src/main/java/de/siphalor/tweed5/core/impl/package-info.java @@ -1 +1,4 @@ -package de.siphalor.tweed5.core.impl; \ No newline at end of file +@NullMarked +package de.siphalor.tweed5.core.impl; + +import org.jspecify.annotations.NullMarked; diff --git a/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/comment/api/CommentExtension.java b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/comment/api/CommentExtension.java index d4bd42c..030d6b1 100644 --- a/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/comment/api/CommentExtension.java +++ b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/comment/api/CommentExtension.java @@ -2,7 +2,7 @@ package de.siphalor.tweed5.defaultextensions.comment.api; import de.siphalor.tweed5.core.api.entry.ConfigEntry; import de.siphalor.tweed5.core.api.extension.TweedExtension; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public interface CommentExtension extends TweedExtension { @Nullable String getFullComment(ConfigEntry configEntry); diff --git a/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/comment/api/package-info.java b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/comment/api/package-info.java new file mode 100644 index 0000000..06cff2c --- /dev/null +++ b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/comment/api/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package de.siphalor.tweed5.defaultextensions.comment.api; + +import org.jspecify.annotations.NullMarked; diff --git a/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/comment/impl/CommentExtensionImpl.java b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/comment/impl/CommentExtensionImpl.java index 7e18bb3..8f6effe 100644 --- a/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/comment/impl/CommentExtensionImpl.java +++ b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/comment/impl/CommentExtensionImpl.java @@ -13,9 +13,12 @@ import de.siphalor.tweed5.data.extension.api.extension.ReadWriteRelatedExtension import de.siphalor.tweed5.defaultextensions.comment.api.*; import lombok.Getter; import lombok.Value; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.NullUnmarked; +import org.jspecify.annotations.Nullable; @AutoService(CommentExtension.class) +@NullUnmarked public class CommentExtensionImpl implements ReadWriteRelatedExtension, CommentExtension { @Getter private RegisteredExtensionData internalEntryDataExtension; @@ -62,8 +65,7 @@ public class CommentExtensionImpl implements ReadWriteRelatedExtension, CommentE } @Override - @Nullable - public String getFullComment(ConfigEntry configEntry) { + public @Nullable String getFullComment(@NonNull ConfigEntry configEntry) { String comment = ((InternalCommentEntryData) configEntry.extensionsData()).commentProducer().createComment(configEntry); return comment.isEmpty() ? null : comment; } diff --git a/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/comment/impl/TweedEntryWriterCommentMiddleware.java b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/comment/impl/TweedEntryWriterCommentMiddleware.java index 1285255..2bce6cc 100644 --- a/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/comment/impl/TweedEntryWriterCommentMiddleware.java +++ b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/comment/impl/TweedEntryWriterCommentMiddleware.java @@ -6,8 +6,8 @@ import de.siphalor.tweed5.core.api.middleware.Middleware; import de.siphalor.tweed5.data.extension.api.TweedEntryWriter; import de.siphalor.tweed5.dataapi.api.TweedDataVisitor; import lombok.RequiredArgsConstructor; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; class TweedEntryWriterCommentMiddleware implements Middleware> { public static final TweedEntryWriterCommentMiddleware INSTANCE = new TweedEntryWriterCommentMiddleware(); @@ -20,8 +20,8 @@ class TweedEntryWriterCommentMiddleware implements Middleware process(TweedEntryWriter inner) { //noinspection unchecked - TweedEntryWriter> innerCasted = (TweedEntryWriter>) inner; - return (TweedEntryWriter>) (writer, value, entry, context) -> { + TweedEntryWriter> innerCasted = (TweedEntryWriter>) inner; + return (TweedEntryWriter>) (writer, value, entry, context) -> { if (writer instanceof CompoundDataVisitor) { // Comment is already written in front of the key by the CompoundDataWriter, // so we don't have to write it here. @@ -94,7 +94,7 @@ class TweedEntryWriterCommentMiddleware implements Middleware pathParts = new ArrayDeque<>(50); private final Deque listIndexes = new ArrayDeque<>(10); - public Context currentContext() { + public @Nullable Context currentContext() { return contextStack.peek(); } diff --git a/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/pather/api/PathTrackingDataVisitor.java b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/pather/api/PathTrackingDataVisitor.java index 641925c..e2f6605 100644 --- a/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/pather/api/PathTrackingDataVisitor.java +++ b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/pather/api/PathTrackingDataVisitor.java @@ -2,7 +2,6 @@ package de.siphalor.tweed5.defaultextensions.pather.api; import de.siphalor.tweed5.dataapi.api.TweedDataVisitor; import lombok.RequiredArgsConstructor; -import org.jetbrains.annotations.NotNull; @RequiredArgsConstructor public class PathTrackingDataVisitor implements TweedDataVisitor { @@ -58,7 +57,7 @@ public class PathTrackingDataVisitor implements TweedDataVisitor { } @Override - public void visitString(@NotNull String value) { + public void visitString(String value) { delegate.visitString(value); valueVisited(); } diff --git a/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/pather/api/package-info.java b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/pather/api/package-info.java new file mode 100644 index 0000000..37f7e9b --- /dev/null +++ b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/pather/api/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package de.siphalor.tweed5.defaultextensions.pather.api; + +import org.jspecify.annotations.NullMarked; diff --git a/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/pather/impl/PatherExtensionImpl.java b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/pather/impl/PatherExtensionImpl.java index 582e5c3..da13592 100644 --- a/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/pather/impl/PatherExtensionImpl.java +++ b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/pather/impl/PatherExtensionImpl.java @@ -15,10 +15,13 @@ import de.siphalor.tweed5.defaultextensions.pather.api.PathTracking; import de.siphalor.tweed5.defaultextensions.pather.api.PathTrackingDataReader; import de.siphalor.tweed5.defaultextensions.pather.api.PathTrackingDataVisitor; import de.siphalor.tweed5.defaultextensions.pather.api.PatherExtension; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import lombok.val; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.NullUnmarked; +import org.jspecify.annotations.Nullable; @AutoService(PatherExtension.class) +@NullUnmarked public class PatherExtensionImpl implements PatherExtension, TweedExtension, ReadWriteRelatedExtension { private static final String PATHER_ID = "pather"; @@ -39,7 +42,7 @@ public class PatherExtensionImpl implements PatherExtension, TweedExtension, Rea entryWriterMiddleware = createEntryWriterMiddleware(); } - private @NotNull Middleware> createEntryReaderMiddleware() { + private @NonNull Middleware> createEntryReaderMiddleware() { return new Middleware>() { @Override public String id() { @@ -49,7 +52,7 @@ public class PatherExtensionImpl implements PatherExtension, TweedExtension, Rea @Override public TweedEntryReader process(TweedEntryReader inner) { //noinspection unchecked - TweedEntryReader> castedInner = (TweedEntryReader>) inner; + val castedInner = (TweedEntryReader>) inner; return (TweedDataReader reader, ConfigEntry entry, TweedReadContext context) -> { if (context.extensionsData().isPatchworkPartSet(PathTracking.class)) { @@ -74,7 +77,7 @@ public class PatherExtensionImpl implements PatherExtension, TweedExtension, Rea @Override public TweedEntryWriter process(TweedEntryWriter inner) { //noinspection unchecked - TweedEntryWriter> castedInner = (TweedEntryWriter>) inner; + val castedInner = (TweedEntryWriter>) inner; return (TweedDataVisitor writer, Object value, ConfigEntry entry, TweedWriteContext context) -> { if (context.extensionsData().isPatchworkPartSet(PathTracking.class)) { diff --git a/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/pather/impl/package-info.java b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/pather/impl/package-info.java new file mode 100644 index 0000000..460822d --- /dev/null +++ b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/pather/impl/package-info.java @@ -0,0 +1,6 @@ +@ApiStatus.Internal +@NullMarked +package de.siphalor.tweed5.defaultextensions.pather.impl; + +import org.jetbrains.annotations.ApiStatus; +import org.jspecify.annotations.NullMarked; diff --git a/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/ConfigEntryValidator.java b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/ConfigEntryValidator.java index f226aa8..f1737c1 100644 --- a/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/ConfigEntryValidator.java +++ b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/ConfigEntryValidator.java @@ -2,11 +2,10 @@ package de.siphalor.tweed5.defaultextensions.validation.api; import de.siphalor.tweed5.core.api.entry.ConfigEntry; import de.siphalor.tweed5.defaultextensions.validation.api.result.ValidationResult; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.Nullable; public interface ConfigEntryValidator { - ValidationResult validate(ConfigEntry configEntry, T value); + ValidationResult validate(ConfigEntry configEntry, T value); - @NotNull String description(ConfigEntry configEntry); } diff --git a/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/ValidationExtension.java b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/ValidationExtension.java index 66f0369..d9347b1 100644 --- a/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/ValidationExtension.java +++ b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/ValidationExtension.java @@ -3,7 +3,8 @@ package de.siphalor.tweed5.defaultextensions.validation.api; import de.siphalor.tweed5.core.api.entry.ConfigEntry; import de.siphalor.tweed5.core.api.extension.TweedExtension; import de.siphalor.tweed5.defaultextensions.validation.api.result.ValidationIssues; +import org.jspecify.annotations.Nullable; public interface ValidationExtension extends TweedExtension { - ValidationIssues validate(ConfigEntry entry, T value); + ValidationIssues validate(ConfigEntry entry, T value); } diff --git a/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/package-info.java b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/package-info.java new file mode 100644 index 0000000..7294c45 --- /dev/null +++ b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package de.siphalor.tweed5.defaultextensions.validation.api; + +import org.jspecify.annotations.NullMarked; diff --git a/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/result/ValidationResult.java b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/result/ValidationResult.java index 958562d..f777e5a 100644 --- a/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/result/ValidationResult.java +++ b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/result/ValidationResult.java @@ -3,7 +3,6 @@ package de.siphalor.tweed5.defaultextensions.validation.api.result; import lombok.AccessLevel; import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.Collection; @@ -14,7 +13,6 @@ import java.util.function.Function; @RequiredArgsConstructor(access = AccessLevel.PRIVATE) public class ValidationResult { private final T value; - @NotNull private final Collection issues; private final boolean hasError; @@ -22,7 +20,7 @@ public class ValidationResult { return new ValidationResult<>(value, Collections.emptyList(), false); } - public static ValidationResult withIssues(T value, @NotNull Collection issues) { + public static ValidationResult withIssues(T value, Collection issues) { return new ValidationResult<>(value, issues, issuesContainError(issues)); } diff --git a/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/validators/NonNullValidator.java b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/validators/NonNullValidator.java index c3b8ab8..92c0768 100644 --- a/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/validators/NonNullValidator.java +++ b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/validators/NonNullValidator.java @@ -5,13 +5,13 @@ import de.siphalor.tweed5.defaultextensions.validation.api.ConfigEntryValidator; import de.siphalor.tweed5.defaultextensions.validation.api.result.ValidationIssue; import de.siphalor.tweed5.defaultextensions.validation.api.result.ValidationIssueLevel; import de.siphalor.tweed5.defaultextensions.validation.api.result.ValidationResult; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.Nullable; import java.util.Collections; public class NonNullValidator implements ConfigEntryValidator { @Override - public ValidationResult validate(ConfigEntry configEntry, T value) { + public ValidationResult validate(ConfigEntry configEntry, T value) { if (value == null) { return ValidationResult.withIssues(null, Collections.singleton( new ValidationIssue("Value must not be null", ValidationIssueLevel.ERROR) @@ -21,7 +21,7 @@ public class NonNullValidator implements ConfigEntryValidator { } @Override - public @NotNull String description(ConfigEntry configEntry) { + public String description(ConfigEntry configEntry) { return "Must be set (not null)."; } } diff --git a/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/validators/NumberRangeValidator.java b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/validators/NumberRangeValidator.java index 2cb182f..393554a 100644 --- a/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/validators/NumberRangeValidator.java +++ b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/validators/NumberRangeValidator.java @@ -7,23 +7,20 @@ import de.siphalor.tweed5.defaultextensions.validation.api.result.ValidationIssu import de.siphalor.tweed5.defaultextensions.validation.api.result.ValidationResult; import lombok.AllArgsConstructor; import lombok.Value; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; import java.util.Collections; @Value @AllArgsConstructor -public class NumberRangeValidator implements ConfigEntryValidator { - @NotNull +public class NumberRangeValidator implements ConfigEntryValidator { Class numberClass; - @Nullable - N minimum; - @Nullable - N maximum; + @Nullable N minimum; + @Nullable N maximum; @Override - public ValidationResult validate(ConfigEntry configEntry, T value) { + public ValidationResult validate(ConfigEntry configEntry, T value) { if (!(value instanceof Number)) { return ValidationResult.withIssues(value, Collections.singleton( new ValidationIssue("Value must be numeric", ValidationIssueLevel.ERROR) @@ -56,7 +53,7 @@ public class NumberRangeValidator implements ConfigEntryValida return ValidationResult.ok(value); } - private int compare(@NotNull Number a, @NotNull Number b) { + private int compare(Number a, Number b) { if (numberClass == Byte.class) { return Byte.compare(a.byteValue(), b.byteValue()); } else if (numberClass == Short.class) { @@ -73,7 +70,7 @@ public class NumberRangeValidator implements ConfigEntryValida } @Override - public @NotNull String description(ConfigEntry configEntry) { + public String description(ConfigEntry configEntry) { if (minimum == null) { if (maximum == null) { return ""; diff --git a/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/validators/SimpleValidatorMiddleware.java b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/validators/SimpleValidatorMiddleware.java index 14ec162..8ad8cf8 100644 --- a/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/validators/SimpleValidatorMiddleware.java +++ b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/validators/SimpleValidatorMiddleware.java @@ -6,7 +6,7 @@ import de.siphalor.tweed5.defaultextensions.validation.api.ConfigEntryValidator; import de.siphalor.tweed5.defaultextensions.validation.api.result.ValidationResult; import lombok.AllArgsConstructor; import lombok.Getter; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.Nullable; @Getter @AllArgsConstructor @@ -18,12 +18,12 @@ public class SimpleValidatorMiddleware implements Middleware ValidationResult validate(ConfigEntry configEntry, T value) { + public ValidationResult validate(ConfigEntry configEntry, T value) { return inner.validate(configEntry, value).andThen(v -> validator.validate(configEntry, v)); } @Override - public @NotNull String description(ConfigEntry configEntry) { + public String description(ConfigEntry configEntry) { String description = validator.description(configEntry); if (description.isEmpty()) { return inner.description(configEntry); diff --git a/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/validators/package-info.java b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/validators/package-info.java new file mode 100644 index 0000000..c06a792 --- /dev/null +++ b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/api/validators/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package de.siphalor.tweed5.defaultextensions.validation.api.validators; + +import org.jspecify.annotations.NullMarked; diff --git a/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/impl/ValidationExtensionImpl.java b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/impl/ValidationExtensionImpl.java index 9128f5c..26ef7d6 100644 --- a/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/impl/ValidationExtensionImpl.java +++ b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/impl/ValidationExtensionImpl.java @@ -35,11 +35,13 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Value; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NullUnmarked; +import org.jspecify.annotations.Nullable; import java.util.*; @AutoService(ValidationExtension.class) +@NullUnmarked public class ValidationExtensionImpl implements ReadWriteRelatedExtension, ValidationExtension, CommentModifyingExtension { private static final ValidationResult PRIMITIVE_IS_NULL_RESULT = ValidationResult.withIssues( null, @@ -47,7 +49,7 @@ public class ValidationExtensionImpl implements ReadWriteRelatedExtension, Valid ); private static final ConfigEntryValidator PRIMITIVE_VALIDATOR = new ConfigEntryValidator() { @Override - public ValidationResult validate(ConfigEntry configEntry, T value) { + public ValidationResult validate(@NotNull ConfigEntry configEntry, @Nullable T value) { if (value == null) { //noinspection unchecked return (ValidationResult) PRIMITIVE_IS_NULL_RESULT; @@ -56,18 +58,18 @@ public class ValidationExtensionImpl implements ReadWriteRelatedExtension, Valid } @Override - public @NotNull String description(ConfigEntry configEntry) { + public String description(@NotNull ConfigEntry configEntry) { return "Value must not be null."; } }; private static final ConfigEntryValidator NOOP_VALIDATOR = new ConfigEntryValidator() { @Override - public ValidationResult validate(ConfigEntry configEntry, T value) { + public ValidationResult validate(@NotNull ConfigEntry configEntry, @Nullable T value) { return ValidationResult.ok(value); } @Override - public @NotNull String description(ConfigEntry configEntry) { + public String description(@NotNull ConfigEntry configEntry) { return ""; } }; @@ -166,7 +168,7 @@ public class ValidationExtensionImpl implements ReadWriteRelatedExtension, Valid } @Override - public ValidationIssues validate(ConfigEntry entry, T value) { + public ValidationIssues validate(@NotNull ConfigEntry entry, @Nullable T value) { PathTracking pathTracking = new PathTracking(); ValidatingConfigEntryVisitor validatingVisitor = new ValidatingConfigEntryVisitor(pathTracking); diff --git a/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/impl/package-info.java b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/impl/package-info.java new file mode 100644 index 0000000..016b465 --- /dev/null +++ b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validation/impl/package-info.java @@ -0,0 +1,6 @@ +@ApiStatus.Internal +@NullMarked +package de.siphalor.tweed5.defaultextensions.validation.impl; + +import org.jetbrains.annotations.ApiStatus; +import org.jspecify.annotations.NullMarked; diff --git a/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validationfallback/api/ValidationFallbackValue.java b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validationfallback/api/ValidationFallbackValue.java index 840ec11..c6dddfc 100644 --- a/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validationfallback/api/ValidationFallbackValue.java +++ b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validationfallback/api/ValidationFallbackValue.java @@ -1,5 +1,7 @@ package de.siphalor.tweed5.defaultextensions.validationfallback.api; +import org.jspecify.annotations.Nullable; + public interface ValidationFallbackValue { - Object validationFallbackValue(); + @Nullable Object validationFallbackValue(); } diff --git a/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validationfallback/api/package-info.java b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validationfallback/api/package-info.java new file mode 100644 index 0000000..e756c3d --- /dev/null +++ b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validationfallback/api/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package de.siphalor.tweed5.defaultextensions.validationfallback.api; + +import org.jspecify.annotations.NullMarked; diff --git a/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validationfallback/impl/ValidationFallbackExtensionImpl.java b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validationfallback/impl/ValidationFallbackExtensionImpl.java index 5227c5e..52de7d0 100644 --- a/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validationfallback/impl/ValidationFallbackExtensionImpl.java +++ b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validationfallback/impl/ValidationFallbackExtensionImpl.java @@ -11,7 +11,7 @@ import de.siphalor.tweed5.defaultextensions.validation.api.result.ValidationIssu import de.siphalor.tweed5.defaultextensions.validation.api.result.ValidationResult; import de.siphalor.tweed5.defaultextensions.validationfallback.api.ValidationFallbackExtension; import de.siphalor.tweed5.defaultextensions.validationfallback.api.ValidationFallbackValue; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Collections; @@ -55,7 +55,7 @@ public class ValidationFallbackExtensionImpl implements ValidationFallbackExtens public ConfigEntryValidator process(ConfigEntryValidator inner) { return new ConfigEntryValidator() { @Override - public ValidationResult validate(ConfigEntry configEntry, T value) { + public ValidationResult validate(ConfigEntry configEntry, T value) { ValidationResult result = inner.validate(configEntry, value); if (!result.hasError()) { return result; @@ -90,7 +90,7 @@ public class ValidationFallbackExtensionImpl implements ValidationFallbackExtens } @Override - public @NotNull String description(ConfigEntry configEntry) { + public String description(ConfigEntry configEntry) { if (!configEntry.extensionsData().isPatchworkPartSet(ValidationFallbackValue.class)) { return inner.description(configEntry); } diff --git a/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validationfallback/impl/package-info.java b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validationfallback/impl/package-info.java new file mode 100644 index 0000000..51070c4 --- /dev/null +++ b/tweed5-default-extensions/src/main/java/de/siphalor/tweed5/defaultextensions/validationfallback/impl/package-info.java @@ -0,0 +1,6 @@ +@ApiStatus.Internal +@NullMarked +package de.siphalor.tweed5.defaultextensions.validationfallback.impl; + +import org.jetbrains.annotations.ApiStatus; +import org.jspecify.annotations.NullMarked; diff --git a/tweed5-naming-format/src/main/java/de/siphalor/tweed5/namingformat/api/package-info.java b/tweed5-naming-format/src/main/java/de/siphalor/tweed5/namingformat/api/package-info.java new file mode 100644 index 0000000..3de6f08 --- /dev/null +++ b/tweed5-naming-format/src/main/java/de/siphalor/tweed5/namingformat/api/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package de.siphalor.tweed5.namingformat.api; + +import org.jspecify.annotations.NullMarked; diff --git a/tweed5-naming-format/src/main/java/de/siphalor/tweed5/namingformat/impl/package-info.java b/tweed5-naming-format/src/main/java/de/siphalor/tweed5/namingformat/impl/package-info.java index 19eebb7..7d31b13 100644 --- a/tweed5-naming-format/src/main/java/de/siphalor/tweed5/namingformat/impl/package-info.java +++ b/tweed5-naming-format/src/main/java/de/siphalor/tweed5/namingformat/impl/package-info.java @@ -1,5 +1,6 @@ @ApiStatus.Internal - +@NullMarked package de.siphalor.tweed5.namingformat.impl; -import org.jetbrains.annotations.ApiStatus; \ No newline at end of file +import org.jetbrains.annotations.ApiStatus; +import org.jspecify.annotations.NullMarked; diff --git a/tweed5-patchwork/src/main/java/de/siphalor/tweed5/patchwork/api/PatchworkClassCreator.java b/tweed5-patchwork/src/main/java/de/siphalor/tweed5/patchwork/api/PatchworkClassCreator.java index 09cb046..7dc22b4 100644 --- a/tweed5-patchwork/src/main/java/de/siphalor/tweed5/patchwork/api/PatchworkClassCreator.java +++ b/tweed5-patchwork/src/main/java/de/siphalor/tweed5/patchwork/api/PatchworkClassCreator.java @@ -4,7 +4,10 @@ import de.siphalor.tweed5.patchwork.impl.ByteArrayClassLoader; import de.siphalor.tweed5.patchwork.impl.PatchworkClass; import de.siphalor.tweed5.patchwork.impl.PatchworkClassGenerator; import de.siphalor.tweed5.patchwork.impl.PatchworkClassPart; -import lombok.*; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.Value; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; @@ -16,17 +19,18 @@ import java.util.stream.Collectors; @Value public class PatchworkClassCreator

> { - @NonNull Class

patchworkInterface; - @NonNull PatchworkClassGenerator.Config generatorConfig; public static

> Builder

builder() { return new Builder<>(); } - public PatchworkClass

createClass(Collection> partInterfaces) throws PatchworkClassGenerator.GenerationException { - List parts = partInterfaces.stream().map(PatchworkClassPart::new).collect(Collectors.toList()); + public PatchworkClass

createClass(Collection> partInterfaces) throws + PatchworkClassGenerator.GenerationException { + List parts = partInterfaces.stream() + .map(PatchworkClassPart::new) + .collect(Collectors.toList()); PatchworkClassGenerator generator = new PatchworkClassGenerator(generatorConfig, parts); try { @@ -45,7 +49,10 @@ public class PatchworkClassCreator

> { MethodHandle setterHandle = lookup.findSetter(patchworkClass, part.fieldName(), part.partInterface()); part.fieldSetter(setterHandle); } catch (NoSuchFieldException | IllegalAccessException e) { - throw new IllegalStateException("Failed to access setter for patchwork part " + part.partInterface().getName(), e); + throw new IllegalStateException( + "Failed to access setter for patchwork part " + part.partInterface().getName(), + e + ); } } try { @@ -67,9 +74,7 @@ public class PatchworkClassCreator

> { @Setter @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Builder

> { - @NonNull private Class

patchworkInterface; - @NonNull private String classPackage; private String classPrefix = ""; diff --git a/tweed5-patchwork/src/main/java/de/siphalor/tweed5/patchwork/api/package-info.java b/tweed5-patchwork/src/main/java/de/siphalor/tweed5/patchwork/api/package-info.java new file mode 100644 index 0000000..6e4ed5d --- /dev/null +++ b/tweed5-patchwork/src/main/java/de/siphalor/tweed5/patchwork/api/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package de.siphalor.tweed5.patchwork.api; + +import org.jspecify.annotations.NullMarked; diff --git a/tweed5-patchwork/src/main/java/de/siphalor/tweed5/patchwork/impl/ByteArrayClassLoader.java b/tweed5-patchwork/src/main/java/de/siphalor/tweed5/patchwork/impl/ByteArrayClassLoader.java index 08c36b6..ae0579d 100644 --- a/tweed5-patchwork/src/main/java/de/siphalor/tweed5/patchwork/impl/ByteArrayClassLoader.java +++ b/tweed5-patchwork/src/main/java/de/siphalor/tweed5/patchwork/impl/ByteArrayClassLoader.java @@ -1,8 +1,10 @@ package de.siphalor.tweed5.patchwork.impl; +import org.jspecify.annotations.Nullable; + public class ByteArrayClassLoader extends ClassLoader { - public static Class loadClass(String binaryClassName, byte[] byteCode) { + public static Class loadClass(@Nullable String binaryClassName, byte[] byteCode) { return new ByteArrayClassLoader(ByteArrayClassLoader.class.getClassLoader()) .createClass(binaryClassName, byteCode); } @@ -11,7 +13,7 @@ public class ByteArrayClassLoader extends ClassLoader { super(parent); } - public Class createClass(String binaryClassName, byte[] byteCode) { + public Class createClass(@Nullable String binaryClassName, byte[] byteCode) { Class clazz = defineClass(binaryClassName, byteCode, 0, byteCode.length); resolveClass(clazz); return clazz; diff --git a/tweed5-patchwork/src/main/java/de/siphalor/tweed5/patchwork/impl/PatchworkClassGenerator.java b/tweed5-patchwork/src/main/java/de/siphalor/tweed5/patchwork/impl/PatchworkClassGenerator.java index a4c6c0a..f272541 100644 --- a/tweed5-patchwork/src/main/java/de/siphalor/tweed5/patchwork/impl/PatchworkClassGenerator.java +++ b/tweed5-patchwork/src/main/java/de/siphalor/tweed5/patchwork/impl/PatchworkClassGenerator.java @@ -4,6 +4,8 @@ import de.siphalor.tweed5.patchwork.api.Patchwork; import de.siphalor.tweed5.patchwork.api.PatchworkPartIsNullException; import de.siphalor.tweed5.patchwork.impl.util.StreamUtils; import lombok.*; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; import org.objectweb.asm.*; import org.objectweb.asm.commons.GeneratorAdapter; @@ -21,7 +23,8 @@ public class PatchworkClassGenerator { */ private static final int CLASS_VERSION = Opcodes.V1_8; private static final String TARGET_PACKAGE = "de.siphalor.tweed5.core.generated.contextextensions"; - private static final List DEFAULT_PATHWORK_INTERFACES = Collections.singletonList(Type.getType(Patchwork.class)); + private static final List DEFAULT_PATHWORK_INTERFACES + = Collections.singletonList(Type.getType(Patchwork.class)); private static final String INNER_EQUALS_METHOD_NAME = "patchwork$innerEquals"; @@ -458,7 +461,13 @@ public class PatchworkClassGenerator { } // - private GeneratorAdapter createMethod(int access, String name, String desc, String signature, String[] exceptions) { + private GeneratorAdapter createMethod( + int access, + String name, + String desc, + @Nullable String signature, + String @Nullable [] exceptions + ) { MethodVisitor methodVisitor = classWriter.visitMethod(access, name, desc, signature, exceptions); return new GeneratorAdapter(methodVisitor, access, name, desc); } @@ -502,7 +511,13 @@ public class PatchworkClassGenerator { } @Override - public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) { + public MethodVisitor visitMethod( + int access, + String name, + String descriptor, + String signature, + String[] exceptions + ) { GeneratorAdapter methodWriter = createMethod(Opcodes.ACC_PUBLIC, name, descriptor, signature, exceptions); return new PartMethodVisitor(api, methodWriter, descriptor, extensionClass); } @@ -513,7 +528,12 @@ public class PatchworkClassGenerator { private final String methodDescriptor; private final PatchworkClassPart patchworkPart; - protected PartMethodVisitor(int api, GeneratorAdapter methodWriter, String methodDescriptor, PatchworkClassPart patchworkPart) { + protected PartMethodVisitor( + int api, + GeneratorAdapter methodWriter, + String methodDescriptor, + PatchworkClassPart patchworkPart + ) { super(api); this.methodWriter = methodWriter; this.patchworkPart = patchworkPart; @@ -531,7 +551,12 @@ public class PatchworkClassGenerator { methodWriter.visitCode(); methodWriter.visitVarInsn(Opcodes.ALOAD, 0); - methodWriter.visitFieldInsn(Opcodes.GETFIELD, internalClassName(), patchworkPart.fieldName(), Type.getDescriptor(patchworkPart.partInterface())); + methodWriter.visitFieldInsn( + Opcodes.GETFIELD, + internalClassName(), + patchworkPart.fieldName(), + Type.getDescriptor(patchworkPart.partInterface()) + ); methodWriter.dup(); methodWriter.ifNull(nullLabel); methodWriter.loadArgs(); @@ -563,11 +588,9 @@ public class PatchworkClassGenerator { @Data public static class Config { - @NonNull - private String classPackage; - @NonNull + @lombok.NonNull + private @NonNull String classPackage; private String classPrefix = ""; - @NonNull private Collection> markerInterfaces = Collections.emptyList(); } @@ -594,12 +617,16 @@ public class PatchworkClassGenerator { transient Collection signatures; private DuplicateMethodsException(Collection methods) { - super("Duplicate method signatures:\n" + methods.stream().map(DuplicateMethodsException::getMethodMessage).collect(Collectors.joining("\n"))); + super("Duplicate method signatures:\n" + methods.stream() + .map(DuplicateMethodsException::getMethodMessage) + .collect(Collectors.joining("\n"))); this.signatures = methods; } private static String getMethodMessage(Method method) { - StringBuilder stringBuilder = new StringBuilder("\t- " + method.getDeclaringClass().getCanonicalName() + "#("); + StringBuilder stringBuilder = new StringBuilder("\t- " + + method.getDeclaringClass().getCanonicalName() + + "#("); for (Class parameterType : method.getParameterTypes()) { stringBuilder.append(parameterType.getCanonicalName()); stringBuilder.append(", "); diff --git a/tweed5-patchwork/src/main/java/de/siphalor/tweed5/patchwork/impl/package-info.java b/tweed5-patchwork/src/main/java/de/siphalor/tweed5/patchwork/impl/package-info.java new file mode 100644 index 0000000..c7dbc57 --- /dev/null +++ b/tweed5-patchwork/src/main/java/de/siphalor/tweed5/patchwork/impl/package-info.java @@ -0,0 +1,6 @@ +@ApiStatus.Internal +@NullMarked +package de.siphalor.tweed5.patchwork.impl; + +import org.jetbrains.annotations.ApiStatus; +import org.jspecify.annotations.NullMarked; diff --git a/tweed5-serde-api/src/main/java/de/siphalor/tweed5/dataapi/api/TweedDataReadException.java b/tweed5-serde-api/src/main/java/de/siphalor/tweed5/dataapi/api/TweedDataReadException.java index 0bc31ea..1c2fe6e 100644 --- a/tweed5-serde-api/src/main/java/de/siphalor/tweed5/dataapi/api/TweedDataReadException.java +++ b/tweed5-serde-api/src/main/java/de/siphalor/tweed5/dataapi/api/TweedDataReadException.java @@ -3,7 +3,7 @@ package de.siphalor.tweed5.dataapi.api; import lombok.AccessLevel; import lombok.Getter; import lombok.Setter; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; @Getter public class TweedDataReadException extends RuntimeException { @@ -28,8 +28,7 @@ public class TweedDataReadException extends RuntimeException { private String message; private Throwable cause; @Setter(AccessLevel.NONE) - @Nullable - private TweedDataReaderRecoverMode recoverMode; + private @Nullable TweedDataReaderRecoverMode recoverMode; public TweedDataReadException build() { return new TweedDataReadException(message, cause, recoverMode); diff --git a/tweed5-serde-api/src/main/java/de/siphalor/tweed5/dataapi/api/TweedDataVisitor.java b/tweed5-serde-api/src/main/java/de/siphalor/tweed5/dataapi/api/TweedDataVisitor.java index b85fd88..f59639c 100644 --- a/tweed5-serde-api/src/main/java/de/siphalor/tweed5/dataapi/api/TweedDataVisitor.java +++ b/tweed5-serde-api/src/main/java/de/siphalor/tweed5/dataapi/api/TweedDataVisitor.java @@ -1,7 +1,5 @@ package de.siphalor.tweed5.dataapi.api; -import org.jetbrains.annotations.NotNull; - public interface TweedDataVisitor { void visitNull(); void visitBoolean(boolean value); @@ -11,7 +9,7 @@ public interface TweedDataVisitor { void visitLong(long value); void visitFloat(float value); void visitDouble(double value); - void visitString(@NotNull String value); + void visitString(String value); default void visitEmptyList() { visitListStart(); diff --git a/tweed5-serde-api/src/main/java/de/siphalor/tweed5/dataapi/api/package-info.java b/tweed5-serde-api/src/main/java/de/siphalor/tweed5/dataapi/api/package-info.java new file mode 100644 index 0000000..6cefc6e --- /dev/null +++ b/tweed5-serde-api/src/main/java/de/siphalor/tweed5/dataapi/api/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package de.siphalor.tweed5.dataapi.api; + +import org.jspecify.annotations.NullMarked; diff --git a/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/api/ReadWriteExtension.java b/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/api/ReadWriteExtension.java index dfc2b8d..29e02af 100644 --- a/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/api/ReadWriteExtension.java +++ b/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/api/ReadWriteExtension.java @@ -5,13 +5,23 @@ import de.siphalor.tweed5.core.api.extension.TweedExtension; import de.siphalor.tweed5.data.extension.api.extension.ReadWriteContextExtensionsData; import de.siphalor.tweed5.dataapi.api.TweedDataReader; import de.siphalor.tweed5.dataapi.api.TweedDataVisitor; +import org.jspecify.annotations.Nullable; public interface ReadWriteExtension extends TweedExtension { void setEntryReaderWriterDefinition(ConfigEntry entry, EntryReaderWriterDefinition readerWriterDefinition); ReadWriteContextExtensionsData createReadWriteContextExtensionsData(); - T read(TweedDataReader reader, ConfigEntry entry, ReadWriteContextExtensionsData contextExtensionsData) throws TweedEntryReadException; + T read( + TweedDataReader reader, + ConfigEntry entry, + ReadWriteContextExtensionsData contextExtensionsData + ) throws TweedEntryReadException; - void write(TweedDataVisitor writer, T value, ConfigEntry entry, ReadWriteContextExtensionsData contextExtensionsData) throws TweedEntryWriteException; + void write( + TweedDataVisitor writer, + T value, + ConfigEntry entry, + ReadWriteContextExtensionsData contextExtensionsData + ) throws TweedEntryWriteException; } diff --git a/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/api/TweedEntryReader.java b/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/api/TweedEntryReader.java index c37b81a..2c2ec4d 100644 --- a/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/api/TweedEntryReader.java +++ b/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/api/TweedEntryReader.java @@ -3,8 +3,11 @@ package de.siphalor.tweed5.data.extension.api; import de.siphalor.tweed5.core.api.entry.ConfigEntry; import de.siphalor.tweed5.dataapi.api.TweedDataReadException; import de.siphalor.tweed5.dataapi.api.TweedDataReader; +import org.jspecify.annotations.Nullable; @FunctionalInterface -public interface TweedEntryReader> { - T read(TweedDataReader reader, C entry, TweedReadContext context) throws TweedEntryReadException, TweedDataReadException; +public interface TweedEntryReader> { + T read(TweedDataReader reader, C entry, TweedReadContext context) throws + TweedEntryReadException, + TweedDataReadException; } diff --git a/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/api/TweedEntryWriter.java b/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/api/TweedEntryWriter.java index 4f30917..295ab44 100644 --- a/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/api/TweedEntryWriter.java +++ b/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/api/TweedEntryWriter.java @@ -3,8 +3,9 @@ package de.siphalor.tweed5.data.extension.api; import de.siphalor.tweed5.core.api.entry.ConfigEntry; import de.siphalor.tweed5.dataapi.api.TweedDataWriteException; import de.siphalor.tweed5.dataapi.api.TweedDataVisitor; +import org.jspecify.annotations.Nullable; @FunctionalInterface -public interface TweedEntryWriter> { - void write(TweedDataVisitor writer, T value, C entry, TweedWriteContext context) throws TweedEntryWriteException, TweedDataWriteException; +public interface TweedEntryWriter> { + void write(TweedDataVisitor writer, @Nullable T value, C entry, TweedWriteContext context) throws TweedEntryWriteException, TweedDataWriteException; } diff --git a/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/api/extension/ReadWriteRelatedExtension.java b/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/api/extension/ReadWriteRelatedExtension.java index d75cf41..39573a8 100644 --- a/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/api/extension/ReadWriteRelatedExtension.java +++ b/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/api/extension/ReadWriteRelatedExtension.java @@ -3,7 +3,7 @@ package de.siphalor.tweed5.data.extension.api.extension; import de.siphalor.tweed5.core.api.middleware.Middleware; import de.siphalor.tweed5.data.extension.api.TweedEntryReader; import de.siphalor.tweed5.data.extension.api.TweedEntryWriter; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public interface ReadWriteRelatedExtension { default void setupReadWriteExtension(ReadWriteExtensionSetupContext context) { diff --git a/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/api/package-info.java b/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/api/package-info.java new file mode 100644 index 0000000..2c89bbe --- /dev/null +++ b/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/api/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package de.siphalor.tweed5.data.extension.api; + +import org.jspecify.annotations.NullMarked; diff --git a/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/api/readwrite/TweedEntryReaderWriters.java b/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/api/readwrite/TweedEntryReaderWriters.java index 19f6679..2132b79 100644 --- a/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/api/readwrite/TweedEntryReaderWriters.java +++ b/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/api/readwrite/TweedEntryReaderWriters.java @@ -8,6 +8,7 @@ import de.siphalor.tweed5.data.extension.api.TweedEntryWriter; import de.siphalor.tweed5.data.extension.impl.TweedEntryReaderWriterImpls; import lombok.AccessLevel; import lombok.NoArgsConstructor; +import org.jspecify.annotations.NonNull; import java.util.Collection; @@ -55,11 +56,11 @@ public class TweedEntryReaderWriters { public static > TweedEntryReaderWriter> collectionReaderWriter() { //noinspection unchecked - return (TweedEntryReaderWriter>)(TweedEntryReaderWriter) TweedEntryReaderWriterImpls.COLLECTION_READER_WRITER; + return (TweedEntryReaderWriter>) (TweedEntryReaderWriter) TweedEntryReaderWriterImpls.COLLECTION_READER_WRITER; } public static TweedEntryReaderWriter> compoundReaderWriter() { //noinspection unchecked - return (TweedEntryReaderWriter>)(TweedEntryReaderWriter) TweedEntryReaderWriterImpls.COMPOUND_READER_WRITER; + return (TweedEntryReaderWriter>) (TweedEntryReaderWriter) TweedEntryReaderWriterImpls.COMPOUND_READER_WRITER; } } diff --git a/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/api/readwrite/package-info.java b/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/api/readwrite/package-info.java new file mode 100644 index 0000000..e56b614 --- /dev/null +++ b/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/api/readwrite/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package de.siphalor.tweed5.data.extension.api.readwrite; + +import org.jspecify.annotations.NullMarked; diff --git a/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/impl/ReadWriteExtensionImpl.java b/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/impl/ReadWriteExtensionImpl.java index 15e8a9c..fe7f4af 100644 --- a/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/impl/ReadWriteExtensionImpl.java +++ b/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/impl/ReadWriteExtensionImpl.java @@ -22,6 +22,10 @@ import de.siphalor.tweed5.patchwork.impl.PatchworkClassGenerator; import de.siphalor.tweed5.patchwork.impl.PatchworkClassPart; import lombok.Setter; import lombok.Value; +import lombok.val; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.NullUnmarked; +import org.jspecify.annotations.Nullable; import java.lang.invoke.MethodHandle; import java.util.Collection; @@ -29,14 +33,16 @@ import java.util.HashMap; import java.util.Map; @AutoService(ReadWriteExtension.class) +@NullUnmarked public class ReadWriteExtensionImpl implements ReadWriteExtension { private RegisteredExtensionData readerWriterDefinitionExtension; private RegisteredExtensionData readWriteEntryDataExtension; private DefaultMiddlewareContainer> entryReaderMiddlewareContainer; private DefaultMiddlewareContainer> entryWriterMiddlewareContainer; - private Map, RegisteredExtensionDataImpl> readWriteContextExtensionsDataClasses; - private PatchworkClass readWriteContextExtensionsDataPatchwork; + private Map, RegisteredExtensionDataImpl> + readWriteContextExtensionsDataClasses; + private PatchworkClass<@NonNull ReadWriteContextExtensionsData> readWriteContextExtensionsDataPatchwork; @Override public String getId() { @@ -54,11 +60,17 @@ public class ReadWriteExtensionImpl implements ReadWriteExtension { ReadWriteExtensionSetupContext setupContext = new ReadWriteExtensionSetupContext() { @Override - public RegisteredExtensionData registerReadWriteContextExtensionData(Class extensionDataClass) { + public RegisteredExtensionData registerReadWriteContextExtensionData( + Class extensionDataClass + ) { if (readWriteContextExtensionsDataClasses.containsKey(extensionDataClass)) { - throw new IllegalArgumentException("Context extension " + extensionDataClass.getName() + " is already registered"); + throw new IllegalArgumentException("Context extension " + + extensionDataClass.getName() + + " is already registered"); } - RegisteredExtensionDataImpl registeredExtensionData = new RegisteredExtensionDataImpl<>(); + RegisteredExtensionDataImpl + registeredExtensionData + = new RegisteredExtensionDataImpl<>(); readWriteContextExtensionsDataClasses.put(extensionDataClass, registeredExtensionData); return registeredExtensionData; } @@ -73,11 +85,13 @@ public class ReadWriteExtensionImpl implements ReadWriteExtension { rwExtension.setupReadWriteExtension(setupContext); - if (rwExtension.entryReaderMiddleware() != null) { - entryReaderMiddlewareContainer.register(rwExtension.entryReaderMiddleware()); + val readerMiddleware = rwExtension.entryReaderMiddleware(); + if (readerMiddleware != null) { + entryReaderMiddlewareContainer.register(readerMiddleware); } - if (rwExtension.entryWriterMiddleware() != null) { - entryWriterMiddlewareContainer.register(rwExtension.entryWriterMiddleware()); + val writerMiddleware = rwExtension.entryWriterMiddleware(); + if (writerMiddleware != null) { + entryWriterMiddlewareContainer.register(writerMiddleware); } } } @@ -85,20 +99,26 @@ public class ReadWriteExtensionImpl implements ReadWriteExtension { entryReaderMiddlewareContainer.seal(); entryWriterMiddlewareContainer.seal(); - PatchworkClassCreator patchworkClassCreator = PatchworkClassCreator.builder() + val patchworkClassCreator = PatchworkClassCreator.builder() .patchworkInterface(ReadWriteContextExtensionsData.class) .classPackage("de.siphalor.tweed5.data.extension.generated") .classPrefix("ReadWriteContextExtensionsData$") .build(); try { - readWriteContextExtensionsDataPatchwork = patchworkClassCreator.createClass(readWriteContextExtensionsDataClasses.keySet()); + readWriteContextExtensionsDataPatchwork = + patchworkClassCreator.createClass(readWriteContextExtensionsDataClasses.keySet()); for (PatchworkClassPart patchworkClassPart : readWriteContextExtensionsDataPatchwork.parts()) { - RegisteredExtensionDataImpl registeredExtension = readWriteContextExtensionsDataClasses.get(patchworkClassPart.partInterface()); + RegisteredExtensionDataImpl + registeredExtension + = readWriteContextExtensionsDataClasses.get(patchworkClassPart.partInterface()); registeredExtension.setter = patchworkClassPart.fieldSetter(); } } catch (PatchworkClassGenerator.GenerationException e) { - throw new IllegalStateException("Failed to generate read write context extensions' data patchwork class", e); + throw new IllegalStateException( + "Failed to generate read write context extensions' data patchwork class", + e + ); } } @@ -115,14 +135,19 @@ public class ReadWriteExtensionImpl implements ReadWriteExtension { baseWriter = TweedEntryReaderWriterImpls.NOOP_READER_WRITER; } - readWriteEntryDataExtension.set(configEntry.extensionsData(), new ReadWriteEntryDataExtensionImpl( - entryReaderMiddlewareContainer.process(baseReader), - entryWriterMiddlewareContainer.process(baseWriter) - )); + readWriteEntryDataExtension.set( + configEntry.extensionsData(), new ReadWriteEntryDataExtensionImpl( + entryReaderMiddlewareContainer.process(baseReader), + entryWriterMiddlewareContainer.process(baseWriter) + ) + ); } @Override - public void setEntryReaderWriterDefinition(ConfigEntry entry, EntryReaderWriterDefinition readerWriterDefinition) { + public void setEntryReaderWriterDefinition( + @NonNull ConfigEntry entry, + @NonNull EntryReaderWriterDefinition readerWriterDefinition + ) { readerWriterDefinitionExtension.set(entry.extensionsData(), readerWriterDefinition); } @@ -136,7 +161,11 @@ public class ReadWriteExtensionImpl implements ReadWriteExtension { } @Override - public T read(TweedDataReader reader, ConfigEntry entry, ReadWriteContextExtensionsData contextExtensionsData) throws TweedEntryReadException { + public T read( + @NonNull TweedDataReader reader, + @NonNull ConfigEntry entry, + @NonNull ReadWriteContextExtensionsData contextExtensionsData + ) throws TweedEntryReadException { try { return getReaderChain(entry).read(reader, entry, new TweedReadWriteContextImpl(contextExtensionsData)); } catch (TweedDataReadException e) { @@ -145,7 +174,12 @@ public class ReadWriteExtensionImpl implements ReadWriteExtension { } @Override - public void write(TweedDataVisitor writer, T value, ConfigEntry entry, ReadWriteContextExtensionsData contextExtensionsData) throws TweedEntryWriteException { + public void write( + @NonNull TweedDataVisitor writer, + @Nullable T value, + @NonNull ConfigEntry entry, + @NonNull ReadWriteContextExtensionsData contextExtensionsData + ) throws TweedEntryWriteException { try { getWriterChain(entry).write(writer, value, entry, new TweedReadWriteContextImpl(contextExtensionsData)); } catch (TweedDataWriteException e) { @@ -160,7 +194,8 @@ public class ReadWriteExtensionImpl implements ReadWriteExtension { } @Setter - private static class RegisteredExtensionDataImpl, E> implements RegisteredExtensionData { + private static class RegisteredExtensionDataImpl, E> + implements RegisteredExtensionData { private MethodHandle setter; @Override @@ -173,13 +208,13 @@ public class ReadWriteExtensionImpl implements ReadWriteExtension { } } - static TweedEntryReader> getReaderChain(ConfigEntry elementEntry) { + static TweedEntryReader> getReaderChain(ConfigEntry elementEntry) { //noinspection unchecked - return (TweedEntryReader>) ((ReadWriteEntryDataExtension) elementEntry.extensionsData()).entryReaderChain(); + return (TweedEntryReader>) ((ReadWriteEntryDataExtension) elementEntry.extensionsData()).entryReaderChain(); } - static TweedEntryWriter> getWriterChain(ConfigEntry elementEntry) { + static TweedEntryWriter> getWriterChain(ConfigEntry elementEntry) { //noinspection unchecked - return (TweedEntryWriter>) ((ReadWriteEntryDataExtension) elementEntry.extensionsData()).entryWriterChain(); + return (TweedEntryWriter>) ((ReadWriteEntryDataExtension) elementEntry.extensionsData()).entryWriterChain(); } } diff --git a/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/impl/TweedEntryReaderWriterImpls.java b/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/impl/TweedEntryReaderWriterImpls.java index 4dd2c9f..bcf0cbf 100644 --- a/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/impl/TweedEntryReaderWriterImpls.java +++ b/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/impl/TweedEntryReaderWriterImpls.java @@ -9,6 +9,9 @@ import de.siphalor.tweed5.dataapi.api.*; import lombok.AccessLevel; import lombok.NoArgsConstructor; import lombok.RequiredArgsConstructor; +import org.jetbrains.annotations.Contract; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; import java.util.*; import java.util.function.BiConsumer; @@ -32,7 +35,7 @@ public class TweedEntryReaderWriterImpls { public static final TweedEntryReaderWriter> NOOP_READER_WRITER = new NoopReaderWriter(); @RequiredArgsConstructor - public static class NullableReader> implements TweedEntryReader { + public static class NullableReader> implements TweedEntryReader { private final TweedEntryReader delegate; @Override @@ -46,7 +49,7 @@ public class TweedEntryReaderWriterImpls { } @RequiredArgsConstructor - public static class NullableWriter> implements TweedEntryWriter { + public static class NullableWriter> implements TweedEntryWriter { private final TweedEntryWriter delegate; @Override @@ -60,7 +63,7 @@ public class TweedEntryReaderWriterImpls { } @RequiredArgsConstructor - private static class PrimitiveReaderWriter implements TweedEntryReaderWriter> { + private static class PrimitiveReaderWriter implements TweedEntryReaderWriter> { private final Function readerCall; private final BiConsumer writerCall; @@ -70,13 +73,13 @@ public class TweedEntryReaderWriterImpls { } @Override - public void write(TweedDataVisitor writer, T value, ConfigEntry entry, TweedWriteContext context) throws TweedEntryWriteException, TweedDataWriteException { + public void write(TweedDataVisitor writer, @Nullable T value, ConfigEntry entry, TweedWriteContext context) throws TweedEntryWriteException, TweedDataWriteException { requireNonNullWriteValue(value); writerCall.accept(writer, value); } } - public static class CollectionReaderWriter> implements TweedEntryReaderWriter> { + public static class CollectionReaderWriter> implements TweedEntryReaderWriter> { @Override public C read(TweedDataReader reader, CollectionConfigEntry entry, TweedReadContext context) throws TweedEntryReadException, TweedDataReadException { assertIsToken(reader.readToken(), TweedDataToken::isListStart, "Expected list start"); @@ -126,7 +129,7 @@ public class TweedEntryReaderWriterImpls { } } - public static class CompoundReaderWriter implements TweedEntryReaderWriter> { + public static class CompoundReaderWriter implements TweedEntryReaderWriter> { @Override public T read(TweedDataReader reader, CompoundConfigEntry entry, TweedReadContext context) throws TweedEntryReadException, TweedDataReadException { assertIsToken(reader.readToken(), TweedDataToken::isMapStart, "Expected map start"); @@ -143,10 +146,8 @@ public class TweedEntryReaderWriterImpls { //noinspection unchecked ConfigEntry subEntry = (ConfigEntry) compoundEntries.get(key); TweedEntryReader> subEntryReaderChain = ReadWriteExtensionImpl.getReaderChain(subEntry); - if (subEntryReaderChain != null) { - Object subEntryValue = subEntryReaderChain.read(reader, subEntry, context); - entry.set(compoundValue, key, subEntryValue); - } + Object subEntryValue = subEntryReaderChain.read(reader, subEntry, context); + entry.set(compoundValue, key, subEntryValue); } else { throw new TweedEntryReadException("Unexpected token " + token + ": Expected map key or map end"); } @@ -155,7 +156,7 @@ public class TweedEntryReaderWriterImpls { } @Override - public void write(TweedDataVisitor writer, T value, CompoundConfigEntry entry, TweedWriteContext context) throws TweedEntryWriteException, TweedDataWriteException { + public void write(TweedDataVisitor writer, @Nullable T value, CompoundConfigEntry entry, TweedWriteContext context) throws TweedEntryWriteException, TweedDataWriteException { requireNonNullWriteValue(value); writer.visitMapStart(); @@ -168,19 +169,17 @@ public class TweedEntryReaderWriterImpls { TweedEntryWriter> subEntryWriterChain = ReadWriteExtensionImpl.getWriterChain(subEntry); - if (subEntryWriterChain != null) { - writer.visitMapEntryKey(key); - subEntryWriterChain.write(writer, entry.get(value, key), subEntry, context); - } + writer.visitMapEntryKey(key); + subEntryWriterChain.write(writer, entry.get(value, key), subEntry, context); } writer.visitMapEnd(); } } - public static class NoopReaderWriter implements TweedEntryReaderWriter> { + public static class NoopReaderWriter implements TweedEntryReaderWriter<@Nullable Object, ConfigEntry> { @Override - public Object read(TweedDataReader reader, ConfigEntry entry, TweedReadContext context) throws TweedDataReadException { + public @Nullable Object read(TweedDataReader reader, ConfigEntry entry, TweedReadContext context) throws TweedDataReadException { TweedDataToken token = reader.readToken(); if (!token.isListStart() && !token.isMapStart()) { return null; @@ -209,7 +208,7 @@ public class TweedEntryReaderWriterImpls { } @Override - public void write(TweedDataVisitor writer, Object value, ConfigEntry entry, TweedWriteContext context) throws TweedDataWriteException { + public void write(TweedDataVisitor writer, @Nullable Object value, ConfigEntry entry, TweedWriteContext context) throws TweedDataWriteException { writer.visitNull(); } @@ -218,7 +217,8 @@ public class TweedEntryReaderWriterImpls { } } - private static void requireNonNullWriteValue(T value) throws TweedEntryWriteException { + @Contract("null -> fail") + private static void requireNonNullWriteValue(@Nullable T value) throws TweedEntryWriteException { if (value == null) { throw new TweedEntryWriteException("Unable to write null value"); } diff --git a/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/impl/package-info.java b/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/impl/package-info.java index 686c825..6062ecd 100644 --- a/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/impl/package-info.java +++ b/tweed5-serde-extension/src/main/java/de/siphalor/tweed5/data/extension/impl/package-info.java @@ -1,4 +1,6 @@ @ApiStatus.Internal +@NullMarked package de.siphalor.tweed5.data.extension.impl; -import org.jetbrains.annotations.ApiStatus; \ No newline at end of file +import org.jetbrains.annotations.ApiStatus; +import org.jspecify.annotations.NullMarked; diff --git a/tweed5-serde-hjson/src/main/java/de/siphalor/tweed5/data/hjson/HjsonLexer.java b/tweed5-serde-hjson/src/main/java/de/siphalor/tweed5/data/hjson/HjsonLexer.java index 0784310..30da99e 100644 --- a/tweed5-serde-hjson/src/main/java/de/siphalor/tweed5/data/hjson/HjsonLexer.java +++ b/tweed5-serde-hjson/src/main/java/de/siphalor/tweed5/data/hjson/HjsonLexer.java @@ -3,7 +3,7 @@ package de.siphalor.tweed5.data.hjson; import de.siphalor.tweed5.dataapi.api.TweedDataReadException; import lombok.RequiredArgsConstructor; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import java.io.IOException; import java.io.Reader; @@ -58,8 +58,7 @@ public class HjsonLexer { } } - @Nullable - private HjsonLexerToken.Type getTerminalTokenType(int codePoint) { + private HjsonLexerToken.@Nullable Type getTerminalTokenType(int codePoint) { switch (codePoint) { case -1: return HjsonLexerToken.Type.EOF; case '[': return HjsonLexerToken.Type.BRACKET_OPEN; @@ -78,8 +77,7 @@ public class HjsonLexer { return new HjsonLexerToken(tokenType, position, position, null); } - @Nullable - private HjsonLexerToken tryReadQuotedString(int codePoint) throws TweedDataReadException { + private @Nullable HjsonLexerToken tryReadQuotedString(int codePoint) throws TweedDataReadException { if (codePoint == '"') { return readJsonQuotedString('"'); } else if (codePoint == '\'') { diff --git a/tweed5-serde-hjson/src/main/java/de/siphalor/tweed5/data/hjson/HjsonLexerToken.java b/tweed5-serde-hjson/src/main/java/de/siphalor/tweed5/data/hjson/HjsonLexerToken.java index c3563f6..4a0a98d 100644 --- a/tweed5-serde-hjson/src/main/java/de/siphalor/tweed5/data/hjson/HjsonLexerToken.java +++ b/tweed5-serde-hjson/src/main/java/de/siphalor/tweed5/data/hjson/HjsonLexerToken.java @@ -3,7 +3,7 @@ package de.siphalor.tweed5.data.hjson; import lombok.EqualsAndHashCode; import lombok.Value; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; @ApiStatus.Internal @Value @@ -12,12 +12,10 @@ public class HjsonLexerToken { HjsonReadPosition begin; HjsonReadPosition end; @EqualsAndHashCode.Exclude - @Nullable - CharSequence content; + @Nullable CharSequence content; @EqualsAndHashCode.Include - @Nullable - public String contentString() { + public @Nullable String contentString() { return content == null ? null : content.toString(); } diff --git a/tweed5-serde-hjson/src/main/java/de/siphalor/tweed5/data/hjson/HjsonReader.java b/tweed5-serde-hjson/src/main/java/de/siphalor/tweed5/data/hjson/HjsonReader.java index 9d251ad..be510e5 100644 --- a/tweed5-serde-hjson/src/main/java/de/siphalor/tweed5/data/hjson/HjsonReader.java +++ b/tweed5-serde-hjson/src/main/java/de/siphalor/tweed5/data/hjson/HjsonReader.java @@ -1,6 +1,8 @@ package de.siphalor.tweed5.data.hjson; import de.siphalor.tweed5.dataapi.api.*; +import org.jspecify.annotations.NullUnmarked; +import org.jspecify.annotations.Nullable; import java.util.*; import java.util.stream.Collectors; @@ -10,9 +12,9 @@ public class HjsonReader implements TweedDataReader { private final Deque contexts; private State state = State.BEFORE_VALUE; - private HjsonLexerToken peekedLexerToken; + private @Nullable HjsonLexerToken peekedLexerToken; - private TweedDataToken peekedToken; + private @Nullable TweedDataToken peekedToken; public HjsonReader(HjsonLexer lexer) { this.lexer = lexer; @@ -204,6 +206,7 @@ public class HjsonReader implements TweedDataReader { }; } + @NullUnmarked private TweedDataToken createNumberToken(HjsonLexerToken lexerToken) { assert lexerToken.content() != null; return new TweedDataToken() { @@ -318,7 +321,7 @@ public class HjsonReader implements TweedDataReader { tryLong = 0L; boolean inFraction = false; do { - tryLong = Math.addExact(Math.multiplyExact(tryLong, 10L), (long) (codePoint - '0')); + tryLong = Math.addExact(Math.multiplyExact(tryLong, 10L), codePoint - '0'); if (inFraction) { fractionDigits++; } @@ -513,7 +516,7 @@ public class HjsonReader implements TweedDataReader { @Override public String readAsString() throws TweedDataReadException { if (lexerToken.type() == HjsonLexerToken.Type.QUOTELESS_STRING || lexerToken.type() == HjsonLexerToken.Type.MULTILINE_STRING) { - return lexerToken.contentString(); + return Objects.requireNonNull(lexerToken.contentString()); } else if (lexerToken.type() == HjsonLexerToken.Type.JSON_STRING) { return readJsonString(lexerToken.content()); } @@ -623,6 +626,7 @@ public class HjsonReader implements TweedDataReader { } private Context currentContext() { + assert contexts.peek() != null; return contexts.peek(); } diff --git a/tweed5-serde-hjson/src/main/java/de/siphalor/tweed5/data/hjson/HjsonSerde.java b/tweed5-serde-hjson/src/main/java/de/siphalor/tweed5/data/hjson/HjsonSerde.java index ea0a642..987d8a6 100644 --- a/tweed5-serde-hjson/src/main/java/de/siphalor/tweed5/data/hjson/HjsonSerde.java +++ b/tweed5-serde-hjson/src/main/java/de/siphalor/tweed5/data/hjson/HjsonSerde.java @@ -4,19 +4,17 @@ import de.siphalor.tweed5.dataapi.api.TweedDataReader; import de.siphalor.tweed5.dataapi.api.TweedDataVisitor; import de.siphalor.tweed5.dataapi.api.TweedSerde; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; +import java.io.*; public class HjsonSerde implements TweedSerde { @Override public TweedDataReader createReader(InputStream inputStream) { - return null; + return new HjsonReader(new HjsonLexer(new InputStreamReader(inputStream))); } @Override public TweedDataVisitor createWriter(OutputStream outputStream) throws IOException { - return null; + return new HjsonWriter(new OutputStreamWriter(outputStream), new HjsonWriter.Options()); } @Override diff --git a/tweed5-serde-hjson/src/main/java/de/siphalor/tweed5/data/hjson/HjsonWriter.java b/tweed5-serde-hjson/src/main/java/de/siphalor/tweed5/data/hjson/HjsonWriter.java index b74cdcf..ef562dc 100644 --- a/tweed5-serde-hjson/src/main/java/de/siphalor/tweed5/data/hjson/HjsonWriter.java +++ b/tweed5-serde-hjson/src/main/java/de/siphalor/tweed5/data/hjson/HjsonWriter.java @@ -3,7 +3,6 @@ package de.siphalor.tweed5.data.hjson; import de.siphalor.tweed5.dataapi.api.TweedDataWriteException; import de.siphalor.tweed5.dataapi.api.TweedDataVisitor; import lombok.Data; -import org.jetbrains.annotations.NotNull; import java.io.IOException; import java.io.Writer; @@ -90,7 +89,7 @@ public class HjsonWriter implements TweedDataVisitor { } @Override - public void visitString(@NotNull String value) { + public void visitString(String value) { beforeValueWrite(); writeStringValue(getValueStringStringType(value), value); afterValueWrite(); diff --git a/tweed5-serde-hjson/src/main/java/de/siphalor/tweed5/data/hjson/package-info.java b/tweed5-serde-hjson/src/main/java/de/siphalor/tweed5/data/hjson/package-info.java new file mode 100644 index 0000000..f91e1eb --- /dev/null +++ b/tweed5-serde-hjson/src/main/java/de/siphalor/tweed5/data/hjson/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package de.siphalor.tweed5.data.hjson; + +import org.jspecify.annotations.NullMarked; diff --git a/tweed5-type-utils/src/main/java/de/siphalor/tweed5/typeutils/api/type/ActualType.java b/tweed5-type-utils/src/main/java/de/siphalor/tweed5/typeutils/api/type/ActualType.java index af45a95..33fe409 100644 --- a/tweed5-type-utils/src/main/java/de/siphalor/tweed5/typeutils/api/type/ActualType.java +++ b/tweed5-type-utils/src/main/java/de/siphalor/tweed5/typeutils/api/type/ActualType.java @@ -3,8 +3,7 @@ package de.siphalor.tweed5.typeutils.api.type; import lombok.AccessLevel; import lombok.Getter; import lombok.RequiredArgsConstructor; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.annotation.Annotation; import java.lang.reflect.*; @@ -27,13 +26,11 @@ public class ActualType implements AnnotatedElement { * The {@link AnnotatedType} that represents the type that is actually in use (without parameters). */ @Getter(AccessLevel.PROTECTED) - @Nullable - private final AnnotatedType usedType; + private final @Nullable AnnotatedType usedType; /** * The {@link AnnotatedParameterizedType} that represents the type that is actually in use with parameters. */ - @Nullable - private final AnnotatedParameterizedType usedParameterizedType; + private final @Nullable AnnotatedParameterizedType usedParameterizedType; /** * A representation of the layered annotations of this type. @@ -45,7 +42,7 @@ public class ActualType implements AnnotatedElement { * Internal cache for the resolved actual type parameters. */ @Nullable - private List<@NotNull ActualType> resolvedParameters; + private List> resolvedParameters; /** * Creates a basic actual type from just a declared class. @@ -64,7 +61,7 @@ public class ActualType implements AnnotatedElement { * * @throws UnsupportedOperationException when the given annotated type is not yet supported by this class */ - public static ActualType ofUsedType(@NotNull AnnotatedType annotatedType) throws UnsupportedOperationException { + public static ActualType ofUsedType(AnnotatedType annotatedType) throws UnsupportedOperationException { Class clazz = getDeclaredClassForUsedType(annotatedType); LayeredTypeAnnotations layeredTypeAnnotations = new LayeredTypeAnnotations(); @@ -83,7 +80,7 @@ public class ActualType implements AnnotatedElement { * * @throws UnsupportedOperationException if the given parameter is not supported yet */ - private static @NotNull Class getDeclaredClassForUsedType(@NotNull AnnotatedType annotatedType) throws UnsupportedOperationException { + private static Class getDeclaredClassForUsedType(AnnotatedType annotatedType) throws UnsupportedOperationException { if (annotatedType.getType() instanceof Class) { return (Class) annotatedType.getType(); } else if (annotatedType.getType() instanceof ParameterizedType) { @@ -102,24 +99,24 @@ public class ActualType implements AnnotatedElement { } @Override - public A getAnnotation(@NotNull Class annotationClass) { + public A getAnnotation(Class annotationClass) { return layeredTypeAnnotations.getAnnotation(annotationClass); } @Override - public @NotNull Annotation @NotNull [] getAnnotations() { + public Annotation[] getAnnotations() { return layeredTypeAnnotations.getAnnotations(); } @Override - public @NotNull Annotation @NotNull [] getDeclaredAnnotations() { + public Annotation[] getDeclaredAnnotations() { return layeredTypeAnnotations.getDeclaredAnnotations(); } /** * Resolves the type parameters of this type as {@link ActualType}s. */ - public @NotNull List<@NotNull ActualType> parameters() { + public List> parameters() { if (resolvedParameters != null) { return resolvedParameters; } else if (usedParameterizedType == null) { @@ -145,7 +142,7 @@ public class ActualType implements AnnotatedElement { * @param targetClass the class to check * @return the list of type parameters if the given class is assignable from this type or {@code null} if not */ - public @Nullable List> getTypesOfSuperArguments(@NotNull Class targetClass) { + public @Nullable List> getTypesOfSuperArguments(Class targetClass) { if (targetClass.getTypeParameters().length == 0) { if (targetClass.isAssignableFrom(declaredType)) { return Collections.emptyList(); @@ -170,7 +167,7 @@ public class ActualType implements AnnotatedElement { return currentType; } - List<@NotNull ActualType> currentParameters = currentType.parameters(); + List> currentParameters = currentType.parameters(); Map paramMap; if (currentParameters.isEmpty()) { @@ -178,6 +175,8 @@ public class ActualType implements AnnotatedElement { } else { paramMap = new HashMap<>(); for (int i = 0; i < currentParameters.size(); i++) { + // used types are always known in resolved parameters + //noinspection DataFlowIssue paramMap.put(currentClass.getTypeParameters()[i].getName(), currentParameters.get(i).usedType()); } } @@ -185,7 +184,7 @@ public class ActualType implements AnnotatedElement { if (targetClass.isInterface()) { for (AnnotatedType annotatedInterface : currentClass.getAnnotatedInterfaces()) { ActualType interfaceType = resolveTypeWithParameters(annotatedInterface, paramMap); - @Nullable ActualType resultType = getViewOnSuperType(targetClass, interfaceType); + ActualType resultType = getViewOnSuperType(targetClass, interfaceType); if (resultType != null) { return resultType; } @@ -193,7 +192,7 @@ public class ActualType implements AnnotatedElement { } if (currentClass != Object.class && !currentClass.isInterface()) { ActualType superType = resolveTypeWithParameters(currentClass.getAnnotatedSuperclass(), paramMap); - @Nullable ActualType resultType = getViewOnSuperType(targetClass, superType); + ActualType resultType = getViewOnSuperType(targetClass, superType); if (resultType != null) { return resultType; } @@ -243,10 +242,10 @@ public class ActualType implements AnnotatedElement { appendAnnotationsToString(sb, usedType.getAnnotations()); } sb.append(declaredType.getName()); - List<@NotNull ActualType> parameters = parameters(); + List> parameters = parameters(); if (!parameters.isEmpty()) { sb.append("<"); - for (@NotNull ActualType parameter : parameters) { + for (ActualType parameter : parameters) { sb.append(parameter); sb.append(", "); } @@ -256,8 +255,8 @@ public class ActualType implements AnnotatedElement { return sb.toString(); } - private void appendAnnotationsToString(@NotNull StringBuilder sb, @NotNull Annotation[] annotations) { - for (@NotNull Annotation annotation : annotations) { + private void appendAnnotationsToString(StringBuilder sb, Annotation[] annotations) { + for (Annotation annotation : annotations) { sb.append(annotation); sb.append(' '); } diff --git a/tweed5-type-utils/src/main/java/de/siphalor/tweed5/typeutils/api/type/AnnotationRepeatType.java b/tweed5-type-utils/src/main/java/de/siphalor/tweed5/typeutils/api/type/AnnotationRepeatType.java index 2dde51a..14b10e5 100644 --- a/tweed5-type-utils/src/main/java/de/siphalor/tweed5/typeutils/api/type/AnnotationRepeatType.java +++ b/tweed5-type-utils/src/main/java/de/siphalor/tweed5/typeutils/api/type/AnnotationRepeatType.java @@ -2,12 +2,11 @@ package de.siphalor.tweed5.typeutils.api.type; import de.siphalor.tweed5.typeutils.impl.type.AnnotationRepeatTypeResolver; import lombok.Value; -import org.jetbrains.annotations.NotNull; import java.lang.annotation.Annotation; public interface AnnotationRepeatType { - static AnnotationRepeatType getType(@NotNull Class annotationClass) { + static AnnotationRepeatType getType(Class annotationClass) { return AnnotationRepeatTypeResolver.getType(annotationClass); } diff --git a/tweed5-type-utils/src/main/java/de/siphalor/tweed5/typeutils/api/type/LayeredTypeAnnotations.java b/tweed5-type-utils/src/main/java/de/siphalor/tweed5/typeutils/api/type/LayeredTypeAnnotations.java index d7166ff..f446337 100644 --- a/tweed5-type-utils/src/main/java/de/siphalor/tweed5/typeutils/api/type/LayeredTypeAnnotations.java +++ b/tweed5-type-utils/src/main/java/de/siphalor/tweed5/typeutils/api/type/LayeredTypeAnnotations.java @@ -1,8 +1,7 @@ package de.siphalor.tweed5.typeutils.api.type; import lombok.Value; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.annotation.Annotation; import java.lang.reflect.AnnotatedElement; @@ -11,7 +10,7 @@ import java.util.*; public class LayeredTypeAnnotations implements AnnotatedElement { private static final Annotation[] EMPTY_ANNOTATIONS = new Annotation[0]; - public static LayeredTypeAnnotations of(@NotNull TypeAnnotationLayer layer, @NotNull AnnotatedElement annotatedElement) { + public static LayeredTypeAnnotations of(TypeAnnotationLayer layer, AnnotatedElement annotatedElement) { LayeredTypeAnnotations annotations = new LayeredTypeAnnotations(); annotations.layers.add(new Layer(layer, annotatedElement)); return annotations; @@ -19,7 +18,7 @@ public class LayeredTypeAnnotations implements AnnotatedElement { private final List layers = new ArrayList<>(); - public void appendLayerFrom(@NotNull TypeAnnotationLayer layer, @NotNull AnnotatedElement annotatedElement) { + public void appendLayerFrom(TypeAnnotationLayer layer, AnnotatedElement annotatedElement) { int i; for (i = 0; i < layers.size(); i++) { if (layer.compareTo(layers.get(i).layer()) > 0) { @@ -29,7 +28,7 @@ public class LayeredTypeAnnotations implements AnnotatedElement { layers.add(i, new Layer(layer, annotatedElement)); } - public void prependLayerFrom(@NotNull TypeAnnotationLayer layer, @NotNull AnnotatedElement annotatedElement) { + public void prependLayerFrom(TypeAnnotationLayer layer, AnnotatedElement annotatedElement) { int i; for (i = 0; i < layers.size(); i++) { if (layer.compareTo(layers.get(i).layer()) >= 0) { @@ -40,7 +39,7 @@ public class LayeredTypeAnnotations implements AnnotatedElement { } @Override - public T getAnnotation(@NotNull Class annotationClass) { + public T getAnnotation(Class annotationClass) { if (layers.isEmpty()) { return null; } else if (layers.size() == 1) { @@ -62,7 +61,7 @@ public class LayeredTypeAnnotations implements AnnotatedElement { } @Override - public @NotNull Annotation @NotNull [] getAnnotations() { + public Annotation[] getAnnotations() { if (layers.isEmpty()) { return EMPTY_ANNOTATIONS; } else if (layers.size() == 1) { @@ -87,7 +86,7 @@ public class LayeredTypeAnnotations implements AnnotatedElement { } @Override - public @NotNull Annotation @NotNull [] getDeclaredAnnotations() { + public Annotation[] getDeclaredAnnotations() { if (layers.isEmpty()) { return EMPTY_ANNOTATIONS; } else if (layers.size() == 1) { @@ -111,7 +110,7 @@ public class LayeredTypeAnnotations implements AnnotatedElement { return annotations.values().toArray(new Annotation[0]); } - private static @Nullable Class getRepeatAlternativeAnnotation(@NotNull Class annotationClass) { + private static @Nullable Class getRepeatAlternativeAnnotation(Class annotationClass) { AnnotationRepeatType annotationRepeatType = AnnotationRepeatType.getType(annotationClass); Class altAnnotationClass = null; if (annotationRepeatType instanceof AnnotationRepeatType.Repeatable) { diff --git a/tweed5-type-utils/src/main/java/de/siphalor/tweed5/typeutils/api/type/package-info.java b/tweed5-type-utils/src/main/java/de/siphalor/tweed5/typeutils/api/type/package-info.java new file mode 100644 index 0000000..f8149fb --- /dev/null +++ b/tweed5-type-utils/src/main/java/de/siphalor/tweed5/typeutils/api/type/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package de.siphalor.tweed5.typeutils.api.type; + +import org.jspecify.annotations.NullMarked; diff --git a/tweed5-type-utils/src/main/java/de/siphalor/tweed5/typeutils/impl/package-info.java b/tweed5-type-utils/src/main/java/de/siphalor/tweed5/typeutils/impl/package-info.java index de4336b..b34ab40 100644 --- a/tweed5-type-utils/src/main/java/de/siphalor/tweed5/typeutils/impl/package-info.java +++ b/tweed5-type-utils/src/main/java/de/siphalor/tweed5/typeutils/impl/package-info.java @@ -1,5 +1,6 @@ @ApiStatus.Internal - +@NullMarked package de.siphalor.tweed5.typeutils.impl; -import org.jetbrains.annotations.ApiStatus; \ No newline at end of file +import org.jetbrains.annotations.ApiStatus; +import org.jspecify.annotations.NullMarked; diff --git a/tweed5-type-utils/src/main/java/de/siphalor/tweed5/typeutils/impl/type/AnnotationRepeatTypeResolver.java b/tweed5-type-utils/src/main/java/de/siphalor/tweed5/typeutils/impl/type/AnnotationRepeatTypeResolver.java index f9e24be..95face4 100644 --- a/tweed5-type-utils/src/main/java/de/siphalor/tweed5/typeutils/impl/type/AnnotationRepeatTypeResolver.java +++ b/tweed5-type-utils/src/main/java/de/siphalor/tweed5/typeutils/impl/type/AnnotationRepeatTypeResolver.java @@ -1,8 +1,7 @@ package de.siphalor.tweed5.typeutils.impl.type; import de.siphalor.tweed5.typeutils.api.type.AnnotationRepeatType; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.annotation.Annotation; import java.lang.annotation.Repeatable; @@ -16,7 +15,7 @@ public class AnnotationRepeatTypeResolver { private static final Map, AnnotationRepeatType> CACHE = new HashMap<>(); private static final ReadWriteLock CACHE_LOCK = new ReentrantReadWriteLock(); - public static AnnotationRepeatType getType(@NotNull Class annotationClass) { + public static AnnotationRepeatType getType(Class annotationClass) { CACHE_LOCK.readLock().lock(); try { AnnotationRepeatType cachedValue = CACHE.get(annotationClass); @@ -29,7 +28,7 @@ public class AnnotationRepeatTypeResolver { return determineType(annotationClass); } - private static AnnotationRepeatType determineType(@NotNull Class annotationClass) { + private static AnnotationRepeatType determineType(Class annotationClass) { Class container = getRepeatableContainerFromComponentAnnotation(annotationClass); if (container != null) { CACHE_LOCK.writeLock().lock(); @@ -64,8 +63,7 @@ public class AnnotationRepeatTypeResolver { return AnnotationRepeatType.NonRepeatable.instance(); } - @Nullable - private static Class getRepeatableContainerFromComponentAnnotation( + private static @Nullable Class getRepeatableContainerFromComponentAnnotation( Class annotationClass ) { Repeatable repeatableDeclaration = annotationClass.getAnnotation(Repeatable.class); @@ -75,8 +73,7 @@ public class AnnotationRepeatTypeResolver { return repeatableDeclaration.value(); } - @Nullable - private static Class getRepeatableComponentFromContainerAnnotation( + private static @Nullable Class getRepeatableComponentFromContainerAnnotation( Class annotationClass ) { try { diff --git a/tweed5-utils/src/main/java/de/siphalor/tweed5/utils/api/collection/ClassToInstanceMap.java b/tweed5-utils/src/main/java/de/siphalor/tweed5/utils/api/collection/ClassToInstanceMap.java index 8029192..6c7984c 100644 --- a/tweed5-utils/src/main/java/de/siphalor/tweed5/utils/api/collection/ClassToInstanceMap.java +++ b/tweed5-utils/src/main/java/de/siphalor/tweed5/utils/api/collection/ClassToInstanceMap.java @@ -3,17 +3,18 @@ package de.siphalor.tweed5.utils.api.collection; import lombok.AccessLevel; import lombok.EqualsAndHashCode; import lombok.RequiredArgsConstructor; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; import java.util.*; @SuppressWarnings("unchecked") @EqualsAndHashCode @RequiredArgsConstructor(access = AccessLevel.PROTECTED) -public class ClassToInstanceMap implements Iterable { +public class ClassToInstanceMap implements Iterable { private final Map, T> delegate; - public static ClassToInstanceMap backedBy(Map, T> delegate) { + public static ClassToInstanceMap backedBy(Map, T> delegate) { return new ClassToInstanceMap<>(delegate); } @@ -41,11 +42,11 @@ public class ClassToInstanceMap implements Iterable { return (V) delegate.get(key); } - public V put(@NotNull V value) { + public @Nullable V put(V value) { return (V) delegate.put((Class) value.getClass(), value); } - public V remove(Class key) { + public @Nullable V remove(Class key) { return (V) delegate.remove(key); } @@ -60,7 +61,7 @@ public class ClassToInstanceMap implements Iterable { public Set values() { return new AbstractSet() { @Override - public @NotNull Iterator iterator() { + public Iterator iterator() { Iterator, T>> entryIterator = delegate.entrySet().iterator(); return new Iterator() { @Override @@ -88,7 +89,7 @@ public class ClassToInstanceMap implements Iterable { } @Override - public @NotNull Iterator iterator() { + public Iterator iterator() { return values().iterator(); } } diff --git a/tweed5-utils/src/main/java/de/siphalor/tweed5/utils/api/collection/ClassToInstancesMultimap.java b/tweed5-utils/src/main/java/de/siphalor/tweed5/utils/api/collection/ClassToInstancesMultimap.java index 7bfc9ea..3ff9d6b 100644 --- a/tweed5-utils/src/main/java/de/siphalor/tweed5/utils/api/collection/ClassToInstancesMultimap.java +++ b/tweed5-utils/src/main/java/de/siphalor/tweed5/utils/api/collection/ClassToInstancesMultimap.java @@ -1,7 +1,7 @@ package de.siphalor.tweed5.utils.api.collection; import lombok.RequiredArgsConstructor; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Array; import java.util.*; @@ -33,7 +33,7 @@ public class ClassToInstancesMultimap implements Collection { } @Override - public boolean contains(@NotNull Object o) { + public boolean contains(Object o) { return delegate.getOrDefault(o.getClass(), Collections.emptyList()).contains(o); } @@ -42,10 +42,10 @@ public class ClassToInstancesMultimap implements Collection { } @Override - public @NotNull Iterator iterator() { + public Iterator iterator() { return new Iterator() { private final Iterator, Collection>> classIterator = delegate.entrySet().iterator(); - private Iterator listIterator; + private @Nullable Iterator listIterator; private boolean keptElement; private boolean keptAnyElementInList; @@ -82,14 +82,12 @@ public class ClassToInstancesMultimap implements Collection { } @Override - @NotNull - public Object @NotNull [] toArray() { + public Object[] toArray() { return delegate.values().stream().flatMap(Collection::stream).toArray(); } @Override - @NotNull - public S @NotNull [] toArray(@NotNull S @NotNull [] array) { + public S[] toArray(S[] array) { Class clazz = array.getClass().getComponentType(); return delegate.values().stream() .flatMap(Collection::stream) @@ -97,12 +95,12 @@ public class ClassToInstancesMultimap implements Collection { } @Override - public boolean add(@NotNull T value) { + public boolean add(T value) { return delegate.computeIfAbsent(((Class) value.getClass()), clazz -> collectionSupplier.get()).add(value); } @Override - public boolean remove(@NotNull Object value) { + public boolean remove(Object value) { Collection values = delegate.get(value.getClass()); if (values == null) { return false; @@ -116,19 +114,17 @@ public class ClassToInstancesMultimap implements Collection { return false; } - @NotNull public Collection getAll(Class clazz) { return (Collection) Collections.unmodifiableCollection(delegate.getOrDefault(clazz, Collections.emptyList())); } - @NotNull public Collection removeAll(Class clazz) { Collection removed = delegate.remove(clazz); return removed == null ? Collections.emptyList() : Collections.unmodifiableCollection(removed); } @Override - public boolean containsAll(@NotNull Collection values) { + public boolean containsAll(Collection values) { for (Object value : values) { if (!contains(value)) { return false; @@ -138,7 +134,7 @@ public class ClassToInstancesMultimap implements Collection { } @Override - public boolean addAll(@NotNull Collection values) { + public boolean addAll(Collection values) { boolean changed = false; for (T value : values) { changed = add(value) || changed; @@ -147,7 +143,7 @@ public class ClassToInstancesMultimap implements Collection { } @Override - public boolean removeAll(@NotNull Collection values) { + public boolean removeAll(Collection values) { boolean changed = false; for (Object value : values) { changed = remove(value) || changed; @@ -156,7 +152,7 @@ public class ClassToInstancesMultimap implements Collection { } @Override - public boolean retainAll(@NotNull Collection values) { + public boolean retainAll(Collection values) { Map, ? extends List> valuesByClass = values.stream() .collect(Collectors.groupingBy(Object::getClass)); delegate.putAll((Map, List>)(Object) valuesByClass); @@ -178,37 +174,37 @@ public class ClassToInstancesMultimap implements Collection { } @Override - public @NotNull Iterator iterator() { + public Iterator iterator() { return delegate.values().stream().flatMap(Collection::stream).iterator(); } @Override - public boolean add(@NotNull T value) { + public boolean add(T value) { throw createUnsupportedOperationException(); } @Override - public boolean remove(@NotNull Object value) { + public boolean remove(Object value) { throw createUnsupportedOperationException(); } @Override - public @NotNull Collection removeAll(Class clazz) { + public Collection removeAll(Class clazz) { throw createUnsupportedOperationException(); } @Override - public boolean addAll(@NotNull Collection values) { + public boolean addAll(Collection values) { throw createUnsupportedOperationException(); } @Override - public boolean removeAll(@NotNull Collection values) { + public boolean removeAll(Collection values) { throw createUnsupportedOperationException(); } @Override - public boolean retainAll(@NotNull Collection values) { + public boolean retainAll(Collection values) { throw createUnsupportedOperationException(); } diff --git a/tweed5-utils/src/main/java/de/siphalor/tweed5/utils/api/collection/InheritanceMap.java b/tweed5-utils/src/main/java/de/siphalor/tweed5/utils/api/collection/InheritanceMap.java index 545867f..79d8705 100644 --- a/tweed5-utils/src/main/java/de/siphalor/tweed5/utils/api/collection/InheritanceMap.java +++ b/tweed5-utils/src/main/java/de/siphalor/tweed5/utils/api/collection/InheritanceMap.java @@ -2,22 +2,24 @@ package de.siphalor.tweed5.utils.api.collection; import lombok.AccessLevel; import lombok.AllArgsConstructor; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; import java.util.*; @SuppressWarnings("unchecked") @AllArgsConstructor(access = AccessLevel.PROTECTED) -public class InheritanceMap { +public class InheritanceMap { private static final InheritanceMap EMPTY = unmodifiable(new InheritanceMap<>(Object.class)); private final Class baseClass; private final Map>> instanceToClasses; private final Map, Collection> classToInstances; - public static InheritanceMap empty() { + public static InheritanceMap empty() { return (InheritanceMap) EMPTY; } - public static InheritanceMap unmodifiable(InheritanceMap map) { + public static InheritanceMap unmodifiable(InheritanceMap map) { return new Unmodifiable<>(map); } @@ -49,7 +51,7 @@ public class InheritanceMap { return (Collection) classToInstances.getOrDefault(clazz, Collections.emptyList()); } - public V getSingleInstance(Class clazz) throws NonUniqueResultException { + public @Nullable V getSingleInstance(Class clazz) throws NonUniqueResultException { Collection instances = classToInstances.getOrDefault(clazz, Collections.emptyList()); if (instances.isEmpty()) { return null; @@ -87,7 +89,7 @@ public class InheritanceMap { } } - public V removeInstance(V instance) { + public @Nullable V removeInstance(V instance) { if (!instanceToClasses.containsKey(instance)) { return null; } @@ -153,7 +155,7 @@ public class InheritanceMap { } } - private static class Unmodifiable extends InheritanceMap { + private static class Unmodifiable extends InheritanceMap { public Unmodifiable(InheritanceMap delegate) { super(delegate.baseClass, delegate.instanceToClasses, delegate.classToInstances); } diff --git a/tweed5-utils/src/main/java/de/siphalor/tweed5/utils/api/collection/package-info.java b/tweed5-utils/src/main/java/de/siphalor/tweed5/utils/api/collection/package-info.java new file mode 100644 index 0000000..2e82d5d --- /dev/null +++ b/tweed5-utils/src/main/java/de/siphalor/tweed5/utils/api/collection/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package de.siphalor.tweed5.utils.api.collection; + +import org.jspecify.annotations.NullMarked; diff --git a/tweed5-weaver-pojo-serde-extension/src/main/java/de/siphalor/tweed5/weaver/pojoext/serde/api/ReadWritePojoPostProcessor.java b/tweed5-weaver-pojo-serde-extension/src/main/java/de/siphalor/tweed5/weaver/pojoext/serde/api/ReadWritePojoPostProcessor.java index cbd68c3..94d3257 100644 --- a/tweed5-weaver-pojo-serde-extension/src/main/java/de/siphalor/tweed5/weaver/pojoext/serde/api/ReadWritePojoPostProcessor.java +++ b/tweed5-weaver-pojo-serde-extension/src/main/java/de/siphalor/tweed5/weaver/pojoext/serde/api/ReadWritePojoPostProcessor.java @@ -7,7 +7,7 @@ import de.siphalor.tweed5.weaver.pojo.api.weaving.WeavingContext; import de.siphalor.tweed5.weaver.pojo.api.weaving.postprocess.TweedPojoWeavingPostProcessor; import de.siphalor.tweed5.weaver.pojoext.serde.impl.SerdePojoReaderWriterSpec; import lombok.extern.slf4j.Slf4j; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.Array; import java.lang.reflect.Constructor; @@ -80,8 +80,7 @@ public class ReadWritePojoPostProcessor implements TweedPojoWeavingPostProcessor } } - @Nullable - private EntryReaderWriterDefinition createDefinitionFromEntryConfig(EntryReadWriteConfig entryConfig, WeavingContext context) { + private @Nullable EntryReaderWriterDefinition createDefinitionFromEntryConfig(EntryReadWriteConfig entryConfig, WeavingContext context) { String readerSpecText = entryConfig.reader().isEmpty() ? entryConfig.value() : entryConfig.reader(); String writerSpecText = entryConfig.writer().isEmpty() ? entryConfig.value() : entryConfig.writer(); @@ -98,14 +97,14 @@ public class ReadWritePojoPostProcessor implements TweedPojoWeavingPostProcessor return null; } - //noinspection unchecked - TweedEntryReader reader = readerSpec == null - ? TweedEntryReaderWriterImpls.NOOP_READER_WRITER - : resolveReaderWriterFromSpec((Class>)(Object) TweedEntryReader.class, readerFactories, readerSpec, context); - //noinspection unchecked - TweedEntryWriter writer = writerSpec == null - ? TweedEntryReaderWriterImpls.NOOP_READER_WRITER - : resolveReaderWriterFromSpec((Class>)(Object) TweedEntryWriter.class, writerFactories, writerSpec, context); + //noinspection unchecked,rawtypes + TweedEntryReader reader = Optional.ofNullable(readerSpec) + .map((spec) -> resolveReaderWriterFromSpec((Class>)(Object) TweedEntryReader.class, readerFactories, spec, context)) + .orElse(((TweedEntryReader) TweedEntryReaderWriterImpls.NOOP_READER_WRITER)); + //noinspection unchecked,rawtypes + TweedEntryWriter writer = Optional.ofNullable(writerSpec) + .map((spec) -> resolveReaderWriterFromSpec((Class>)(Object) TweedEntryWriter.class, writerFactories, spec, context)) + .orElse(((TweedEntryWriter) TweedEntryReaderWriterImpls.NOOP_READER_WRITER)); return new EntryReaderWriterDefinition() { @Override @@ -120,8 +119,7 @@ public class ReadWritePojoPostProcessor implements TweedPojoWeavingPostProcessor }; } - @Nullable - private SerdePojoReaderWriterSpec specFromText(String specText, WeavingContext context) { + private @Nullable SerdePojoReaderWriterSpec specFromText(String specText, WeavingContext context) { if (specText.isEmpty()) { return null; } @@ -137,7 +135,7 @@ public class ReadWritePojoPostProcessor implements TweedPojoWeavingPostProcessor } } - private T resolveReaderWriterFromSpec( + private @Nullable T resolveReaderWriterFromSpec( Class baseClass, Map> factories, SerdePojoReaderWriterSpec spec, @@ -152,17 +150,18 @@ public class ReadWritePojoPostProcessor implements TweedPojoWeavingPostProcessor TweedReaderWriterProvider.ReaderWriterFactory factory = factories.get(spec.identifier()); T instance; - if (factory != null) { - instance = factory.create(arguments); - } else { - instance = loadClassIfExists(baseClass, spec.identifier(), arguments); - } - - if (instance == null) { + try { + if (factory != null) { + instance = factory.create(arguments); + } else { + instance = loadClassIfExists(baseClass, spec.identifier(), arguments); + } + } catch (Exception e) { log.warn( "Failed to resolve reader or writer factory \"{}\" for entry {}, entry will not be included in serde", spec.identifier(), - context.path() + context.path(), + e ); return null; } @@ -170,7 +169,7 @@ public class ReadWritePojoPostProcessor implements TweedPojoWeavingPostProcessor return instance; } - private T loadClassIfExists(Class baseClass, String className, T[] arguments) { + private @Nullable T loadClassIfExists(Class baseClass, String className, T[] arguments) { try { Class clazz = Class.forName(className); Class[] argClasses = new Class[arguments.length]; diff --git a/tweed5-weaver-pojo-serde-extension/src/main/java/de/siphalor/tweed5/weaver/pojoext/serde/api/package-info.java b/tweed5-weaver-pojo-serde-extension/src/main/java/de/siphalor/tweed5/weaver/pojoext/serde/api/package-info.java new file mode 100644 index 0000000..efc7a8b --- /dev/null +++ b/tweed5-weaver-pojo-serde-extension/src/main/java/de/siphalor/tweed5/weaver/pojoext/serde/api/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package de.siphalor.tweed5.weaver.pojoext.serde.api; + +import org.jspecify.annotations.NullMarked; diff --git a/tweed5-weaver-pojo-serde-extension/src/main/java/de/siphalor/tweed5/weaver/pojoext/serde/impl/package-info.java b/tweed5-weaver-pojo-serde-extension/src/main/java/de/siphalor/tweed5/weaver/pojoext/serde/impl/package-info.java new file mode 100644 index 0000000..dfc2ed1 --- /dev/null +++ b/tweed5-weaver-pojo-serde-extension/src/main/java/de/siphalor/tweed5/weaver/pojoext/serde/impl/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package de.siphalor.tweed5.weaver.pojoext.serde.impl; + +import org.jspecify.annotations.NullMarked; diff --git a/tweed5-weaver-pojo-serde-extension/src/test/java/de/siphalor/tweed5/weaver/pojoext/serde/WeaverPojoSerdeExtensionTest.java b/tweed5-weaver-pojo-serde-extension/src/test/java/de/siphalor/tweed5/weaver/pojoext/serde/WeaverPojoSerdeExtensionTest.java index 47861ba..7b62ce6 100644 --- a/tweed5-weaver-pojo-serde-extension/src/test/java/de/siphalor/tweed5/weaver/pojoext/serde/WeaverPojoSerdeExtensionTest.java +++ b/tweed5-weaver-pojo-serde-extension/src/test/java/de/siphalor/tweed5/weaver/pojoext/serde/WeaverPojoSerdeExtensionTest.java @@ -57,13 +57,13 @@ class WeaverPojoSerdeExtensionTest { public static class TestWriterProvider implements TweedReaderWriterProvider { @Override public void provideReaderWriters(ProviderContext context) { - context.registerWriterFactory("tweed5.test.dummy", delegates -> new TweedEntryWriter>() { + context.registerWriterFactory("tweed5.test.dummy", delegates -> new TweedEntryWriter>() { @Override public void write( - TweedDataVisitor writer, + @NonNull TweedDataVisitor writer, Object value, ConfigEntry entry, - TweedWriteContext context + @NonNull TweedWriteContext context ) throws TweedDataWriteException { writer.visitString("my cool custom writer"); } diff --git a/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/api/entry/WeavableCompoundConfigEntry.java b/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/api/entry/WeavableCompoundConfigEntry.java index aefb089..2cc5e03 100644 --- a/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/api/entry/WeavableCompoundConfigEntry.java +++ b/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/api/entry/WeavableCompoundConfigEntry.java @@ -5,7 +5,7 @@ import de.siphalor.tweed5.core.api.entry.CompoundConfigEntry; import de.siphalor.tweed5.core.api.entry.ConfigEntry; import lombok.RequiredArgsConstructor; import lombok.Value; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.Nullable; import java.lang.invoke.MethodHandle; import java.util.function.Supplier; @@ -28,9 +28,9 @@ public interface WeavableCompoundConfigEntry extends CompoundConfigEntry { @Value @RequiredArgsConstructor class SubEntry { - @NotNull String name; - @NotNull ConfigEntry configEntry; - @NotNull MethodHandle getter; - @NotNull MethodHandle setter; + String name; + ConfigEntry configEntry; + @Nullable MethodHandle getter; + @Nullable MethodHandle setter; } } diff --git a/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/api/entry/package-info.java b/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/api/entry/package-info.java new file mode 100644 index 0000000..4e330e5 --- /dev/null +++ b/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/api/entry/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package de.siphalor.tweed5.weaver.pojo.api.entry; + +import org.jspecify.annotations.NullMarked; diff --git a/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/api/weaving/CollectionPojoWeaver.java b/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/api/weaving/CollectionPojoWeaver.java index 8f9972d..faf2a0c 100644 --- a/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/api/weaving/CollectionPojoWeaver.java +++ b/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/api/weaving/CollectionPojoWeaver.java @@ -9,8 +9,7 @@ import de.siphalor.tweed5.weaver.pojo.impl.entry.CollectionConfigEntryImpl; import de.siphalor.tweed5.weaver.pojo.impl.weaving.PojoWeavingException; import de.siphalor.tweed5.weaver.pojo.impl.weaving.collection.CollectionWeavingConfig; import de.siphalor.tweed5.weaver.pojo.impl.weaving.collection.CollectionWeavingConfigImpl; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; @@ -33,7 +32,7 @@ public class CollectionPojoWeaver implements TweedPojoWeaver { @SuppressWarnings({"rawtypes", "unchecked"}) @Override - public @Nullable ConfigEntry weaveEntry(ActualType valueType, WeavingContext context) { + public @Nullable ConfigEntry weaveEntry(ActualType valueType, WeavingContext context) { List> collectionTypeParams = valueType.getTypesOfSuperArguments(Collection.class); if (collectionTypeParams == null) { return null; @@ -82,7 +81,7 @@ public class CollectionPojoWeaver implements TweedPojoWeaver { return CollectionWeavingConfigImpl.withOverrides(parent, local); } - private CollectionWeavingConfig createWeavingConfigFromAnnotations(@NotNull AnnotatedElement annotations) { + private @Nullable CollectionWeavingConfig createWeavingConfigFromAnnotations(AnnotatedElement annotations) { CollectionWeaving annotation = annotations.getAnnotation(CollectionWeaving.class); if (annotation == null) { return null; diff --git a/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/api/weaving/CompoundPojoWeaver.java b/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/api/weaving/CompoundPojoWeaver.java index 57adc1e..010c6f0 100644 --- a/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/api/weaving/CompoundPojoWeaver.java +++ b/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/api/weaving/CompoundPojoWeaver.java @@ -15,8 +15,7 @@ import de.siphalor.tweed5.weaver.pojo.impl.weaving.PojoClassIntrospector; import de.siphalor.tweed5.weaver.pojo.impl.weaving.PojoWeavingException; import de.siphalor.tweed5.weaver.pojo.impl.weaving.compound.CompoundWeavingConfig; import de.siphalor.tweed5.weaver.pojo.impl.weaving.compound.CompoundWeavingConfigImpl; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.invoke.MethodHandle; import java.lang.reflect.AnnotatedElement; @@ -44,7 +43,7 @@ public class CompoundPojoWeaver implements TweedPojoWeaver { } @Override - public @Nullable ConfigEntry weaveEntry(ActualType valueType, WeavingContext context) { + public @Nullable ConfigEntry weaveEntry(ActualType valueType, WeavingContext context) { if (context.annotations().getAnnotation(CompoundWeaving.class) == null) { return null; } @@ -88,8 +87,7 @@ public class CompoundPojoWeaver implements TweedPojoWeaver { return CompoundWeavingConfigImpl.withOverrides(parent, local); } - @Nullable - private CompoundWeavingConfig createWeavingConfigFromAnnotations(@NotNull AnnotatedElement annotations) { + private @Nullable CompoundWeavingConfig createWeavingConfigFromAnnotations(AnnotatedElement annotations) { CompoundWeaving annotation = annotations.getAnnotation(CompoundWeaving.class); if (annotation == null) { return null; @@ -127,7 +125,6 @@ public class CompoundPojoWeaver implements TweedPojoWeaver { //noinspection rawtypes Class annotationEntryClass = weavingConfig.compoundEntryClass(); - @NotNull Class> weavableEntryClass = (Class>) ( annotationEntryClass != null ? annotationEntryClass @@ -143,7 +140,7 @@ public class CompoundPojoWeaver implements TweedPojoWeaver { return property.getter() != null && (property.setter() != null || property.isFinal()); } - private @NotNull WeavableCompoundConfigEntry.SubEntry weaveCompoundSubEntry( + private WeavableCompoundConfigEntry.SubEntry weaveCompoundSubEntry( PojoClassIntrospector.Property property, WeavingContext.ExtensionsData newExtensionsData, WeavingContext parentContext @@ -167,7 +164,9 @@ public class CompoundPojoWeaver implements TweedPojoWeaver { ); } - private @NotNull String convertName(String name, CompoundWeavingConfig weavingConfig) { + private String convertName(String name, CompoundWeavingConfig weavingConfig) { + // Always non-null at this point, since null values were already defaulted + //noinspection DataFlowIssue return NamingFormat.convert( name, weavingConfig.compoundSourceNamingFormat(), @@ -175,7 +174,7 @@ public class CompoundPojoWeaver implements TweedPojoWeaver { ); } - private @NotNull NamingFormat getNamingFormatById(String id) { + private NamingFormat getNamingFormatById(String id) { NamingFormat namingFormat = namingFormatCollector.namingFormats().get(id); if (namingFormat == null) { throw new PojoWeavingException( diff --git a/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/api/weaving/TrivialPojoWeaver.java b/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/api/weaving/TrivialPojoWeaver.java index 01000ca..2c67cf1 100644 --- a/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/api/weaving/TrivialPojoWeaver.java +++ b/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/api/weaving/TrivialPojoWeaver.java @@ -3,7 +3,6 @@ package de.siphalor.tweed5.weaver.pojo.api.weaving; import de.siphalor.tweed5.core.api.entry.ConfigEntry; import de.siphalor.tweed5.core.impl.entry.SimpleConfigEntryImpl; import de.siphalor.tweed5.typeutils.api.type.ActualType; -import org.jetbrains.annotations.Nullable; public class TrivialPojoWeaver implements TweedPojoWeaver { @Override @@ -12,7 +11,7 @@ public class TrivialPojoWeaver implements TweedPojoWeaver { } @Override - public @Nullable ConfigEntry weaveEntry(ActualType valueType, WeavingContext context) { + public ConfigEntry weaveEntry(ActualType valueType, WeavingContext context) { SimpleConfigEntryImpl entry = new SimpleConfigEntryImpl<>(valueType.declaredType()); entry.seal(context.configContainer()); return entry; diff --git a/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/api/weaving/TweedPojoWeavingFunction.java b/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/api/weaving/TweedPojoWeavingFunction.java index 17b2c60..a89abaf 100644 --- a/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/api/weaving/TweedPojoWeavingFunction.java +++ b/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/api/weaving/TweedPojoWeavingFunction.java @@ -2,8 +2,7 @@ package de.siphalor.tweed5.weaver.pojo.api.weaving; import de.siphalor.tweed5.core.api.entry.ConfigEntry; import de.siphalor.tweed5.typeutils.api.type.ActualType; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; @FunctionalInterface public interface TweedPojoWeavingFunction { @@ -12,8 +11,7 @@ public interface TweedPojoWeavingFunction { * The returned config entry must be sealed. * @return The resulting, sealed config entry or {@code null}, if the weaving function is not applicable to the given parameters. */ - @Nullable - ConfigEntry weaveEntry(ActualType valueType, WeavingContext context); + @Nullable ConfigEntry weaveEntry(ActualType valueType, WeavingContext context); @FunctionalInterface interface NonNull extends TweedPojoWeavingFunction { @@ -25,6 +23,6 @@ public interface TweedPojoWeavingFunction { * @throws RuntimeException when a valid config entry could not be resolved. */ @Override - @NotNull ConfigEntry weaveEntry(ActualType valueType, WeavingContext context); + @org.jspecify.annotations.NonNull ConfigEntry weaveEntry(ActualType valueType, WeavingContext context); } } diff --git a/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/api/weaving/WeavingContext.java b/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/api/weaving/WeavingContext.java index ce59fbf..11bd317 100644 --- a/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/api/weaving/WeavingContext.java +++ b/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/api/weaving/WeavingContext.java @@ -6,26 +6,19 @@ import de.siphalor.tweed5.patchwork.api.Patchwork; import de.siphalor.tweed5.typeutils.api.type.ActualType; import lombok.*; import lombok.experimental.Accessors; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.reflect.AnnotatedElement; import java.util.Arrays; @Value public class WeavingContext implements TweedPojoWeavingFunction.NonNull { - @Nullable - WeavingContext parent; + @Nullable WeavingContext parent; @Getter(AccessLevel.NONE) - @NotNull TweedPojoWeavingFunction.NonNull weavingFunction; - @NotNull ConfigContainer configContainer; - @NotNull String[] path; - @NotNull ExtensionsData extensionsData; - @NotNull AnnotatedElement annotations; public static Builder builder(TweedPojoWeavingFunction.NonNull weavingFunction, ConfigContainer configContainer) { @@ -36,14 +29,14 @@ public class WeavingContext implements TweedPojoWeavingFunction.NonNull { return new Builder(null, weavingFunction, configContainer, new String[]{ baseName }); } - public Builder subContextBuilder(@NotNull String subPathName) { + public Builder subContextBuilder(String subPathName) { String[] newPath = Arrays.copyOf(path, path.length + 1); newPath[path.length] = subPathName; return new Builder(this, weavingFunction, configContainer, newPath).extensionsData(extensionsData); } @Override - public @NotNull ConfigEntry weaveEntry(ActualType valueType, WeavingContext context) { + public ConfigEntry weaveEntry(ActualType valueType, WeavingContext context) { return weavingFunction.weaveEntry(valueType, context); } diff --git a/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/api/weaving/package-info.java b/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/api/weaving/package-info.java new file mode 100644 index 0000000..051f636 --- /dev/null +++ b/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/api/weaving/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package de.siphalor.tweed5.weaver.pojo.api.weaving; + +import org.jspecify.annotations.NullMarked; diff --git a/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/api/weaving/postprocess/package-info.java b/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/api/weaving/postprocess/package-info.java new file mode 100644 index 0000000..6f55af1 --- /dev/null +++ b/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/api/weaving/postprocess/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package de.siphalor.tweed5.weaver.pojo.api.weaving.postprocess; + +import org.jspecify.annotations.NullMarked; diff --git a/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/entry/CollectionConfigEntryImpl.java b/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/entry/CollectionConfigEntryImpl.java index 532b177..5b76ec3 100644 --- a/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/entry/CollectionConfigEntryImpl.java +++ b/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/entry/CollectionConfigEntryImpl.java @@ -9,6 +9,7 @@ import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.ToString; import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.Nullable; import java.util.Collection; import java.util.function.IntFunction; @@ -18,7 +19,7 @@ import java.util.function.IntFunction; @ToString(callSuper = true) public class CollectionConfigEntryImpl> extends BaseConfigEntry implements WeavableCollectionConfigEntry { private final IntFunction constructor; - private ConfigEntry elementEntry; + private @Nullable ConfigEntry elementEntry; public CollectionConfigEntryImpl(@NotNull Class valueClass, IntFunction constructor) { super(valueClass); diff --git a/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/entry/StaticPojoCompoundConfigEntry.java b/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/entry/StaticPojoCompoundConfigEntry.java index 7f146b2..e39b4b7 100644 --- a/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/entry/StaticPojoCompoundConfigEntry.java +++ b/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/entry/StaticPojoCompoundConfigEntry.java @@ -5,7 +5,6 @@ import de.siphalor.tweed5.core.api.entry.ConfigEntry; import de.siphalor.tweed5.core.api.entry.ConfigEntryValueVisitor; import de.siphalor.tweed5.core.api.entry.ConfigEntryVisitor; import de.siphalor.tweed5.weaver.pojo.api.entry.WeavableCompoundConfigEntry; -import org.jetbrains.annotations.NotNull; import java.util.Collections; import java.util.LinkedHashMap; @@ -17,7 +16,7 @@ public class StaticPojoCompoundConfigEntry extends BaseConfigEntry impleme private final Map subEntries = new LinkedHashMap<>(); private final Map> subConfigEntries = new LinkedHashMap<>(); - public StaticPojoCompoundConfigEntry(@NotNull Class valueClass, @NotNull Supplier noArgsConstructor) { + public StaticPojoCompoundConfigEntry(Class valueClass, Supplier noArgsConstructor) { super(valueClass); this.noArgsConstructor = noArgsConstructor; } @@ -91,7 +90,7 @@ public class StaticPojoCompoundConfigEntry extends BaseConfigEntry impleme subEntries.forEach((key, entry) -> { if (visitor.enterCompoundSubEntry(key)) { try { - Object subValue = entry.getter().invokeExact(value); + Object subValue = entry.getter().invoke(value); //noinspection unchecked visitor.visitEntry((ConfigEntry) entry.configEntry(), subValue); } catch (Throwable e) { @@ -103,11 +102,11 @@ public class StaticPojoCompoundConfigEntry extends BaseConfigEntry impleme } @Override - public @NotNull T deepCopy(@NotNull T value) { + public T deepCopy(T value) { T copy = instantiateCompoundValue(); for (SubEntry subEntry : subEntries.values()) { try { - Object subValue = subEntry.getter().invokeExact(value); + Object subValue = subEntry.getter().invoke(value); subEntry.setter().invoke(copy, subValue); } catch (Throwable e) { throw new RuntimeException("Failed to copy value of sub entry \"" + subEntry.name() + "\"", e); diff --git a/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/entry/package-info.java b/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/entry/package-info.java new file mode 100644 index 0000000..385fbdb --- /dev/null +++ b/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/entry/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package de.siphalor.tweed5.weaver.pojo.impl.entry; + +import org.jspecify.annotations.NullMarked; diff --git a/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/weaving/PojoClassIntrospector.java b/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/weaving/PojoClassIntrospector.java index fc31ab2..12aa724 100644 --- a/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/weaving/PojoClassIntrospector.java +++ b/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/weaving/PojoClassIntrospector.java @@ -5,7 +5,7 @@ import lombok.Builder; import lombok.RequiredArgsConstructor; import lombok.Value; import lombok.extern.slf4j.Slf4j; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; @@ -23,7 +23,7 @@ public class PojoClassIntrospector { private final Class clazz; private final MethodHandles.Lookup lookup = MethodHandles.publicLookup(); - private Map properties; + private @Nullable Map properties; public static PojoClassIntrospector forClass(Class clazz) { if ((clazz.getModifiers() & Modifier.PUBLIC) == 0) { diff --git a/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/weaving/TweedPojoWeaverBootstrapper.java b/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/weaving/TweedPojoWeaverBootstrapper.java index 7df96c6..50ef7f3 100644 --- a/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/weaving/TweedPojoWeaverBootstrapper.java +++ b/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/weaving/TweedPojoWeaverBootstrapper.java @@ -15,7 +15,7 @@ import de.siphalor.tweed5.weaver.pojo.api.weaving.WeavingContext; import de.siphalor.tweed5.weaver.pojo.api.weaving.postprocess.TweedPojoWeavingPostProcessor; import lombok.*; import lombok.extern.slf4j.Slf4j; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import java.lang.annotation.Annotation; import java.lang.invoke.MethodHandle; diff --git a/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/weaving/collection/CollectionWeavingConfig.java b/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/weaving/collection/CollectionWeavingConfig.java index 2fa67c9..33d0425 100644 --- a/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/weaving/collection/CollectionWeavingConfig.java +++ b/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/weaving/collection/CollectionWeavingConfig.java @@ -1,10 +1,9 @@ package de.siphalor.tweed5.weaver.pojo.impl.weaving.collection; import de.siphalor.tweed5.weaver.pojo.api.entry.WeavableCollectionConfigEntry; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public interface CollectionWeavingConfig { @SuppressWarnings("rawtypes") - @Nullable - Class collectionEntryClass(); + @Nullable Class collectionEntryClass(); } diff --git a/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/weaving/collection/CollectionWeavingConfigImpl.java b/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/weaving/collection/CollectionWeavingConfigImpl.java index 78d05b3..802d8f5 100644 --- a/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/weaving/collection/CollectionWeavingConfigImpl.java +++ b/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/weaving/collection/CollectionWeavingConfigImpl.java @@ -3,15 +3,14 @@ package de.siphalor.tweed5.weaver.pojo.impl.weaving.collection; import de.siphalor.tweed5.weaver.pojo.api.entry.WeavableCollectionConfigEntry; import lombok.Builder; import lombok.Value; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; @Builder @Value public class CollectionWeavingConfigImpl implements CollectionWeavingConfig { @SuppressWarnings("rawtypes") - @Nullable - Class collectionEntryClass; + @Nullable Class collectionEntryClass; public static CollectionWeavingConfigImpl withOverrides(CollectionWeavingConfig self, CollectionWeavingConfig overrides) { return CollectionWeavingConfigImpl.builder() diff --git a/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/weaving/collection/package-info.java b/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/weaving/collection/package-info.java new file mode 100644 index 0000000..e1095d8 --- /dev/null +++ b/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/weaving/collection/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package de.siphalor.tweed5.weaver.pojo.impl.weaving.collection; + +import org.jspecify.annotations.NullMarked; diff --git a/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/weaving/compound/CompoundWeavingConfig.java b/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/weaving/compound/CompoundWeavingConfig.java index 71fd835..ebeb9cf 100644 --- a/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/weaving/compound/CompoundWeavingConfig.java +++ b/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/weaving/compound/CompoundWeavingConfig.java @@ -2,14 +2,13 @@ package de.siphalor.tweed5.weaver.pojo.impl.weaving.compound; import de.siphalor.tweed5.namingformat.api.NamingFormat; import de.siphalor.tweed5.weaver.pojo.api.entry.WeavableCompoundConfigEntry; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public interface CompoundWeavingConfig { - NamingFormat compoundSourceNamingFormat(); + @Nullable NamingFormat compoundSourceNamingFormat(); - NamingFormat compoundTargetNamingFormat(); + @Nullable NamingFormat compoundTargetNamingFormat(); @SuppressWarnings("rawtypes") - @Nullable - Class compoundEntryClass(); + @Nullable Class compoundEntryClass(); } diff --git a/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/weaving/compound/CompoundWeavingConfigImpl.java b/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/weaving/compound/CompoundWeavingConfigImpl.java index f78aea9..d09b0a2 100644 --- a/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/weaving/compound/CompoundWeavingConfigImpl.java +++ b/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/weaving/compound/CompoundWeavingConfigImpl.java @@ -4,17 +4,16 @@ import de.siphalor.tweed5.namingformat.api.NamingFormat; import de.siphalor.tweed5.weaver.pojo.api.entry.WeavableCompoundConfigEntry; import lombok.Builder; import lombok.Value; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; @Builder @Value public class CompoundWeavingConfigImpl implements CompoundWeavingConfig { - NamingFormat compoundSourceNamingFormat; - NamingFormat compoundTargetNamingFormat; + @Nullable NamingFormat compoundSourceNamingFormat; + @Nullable NamingFormat compoundTargetNamingFormat; @SuppressWarnings("rawtypes") - @Nullable - Class compoundEntryClass; + @Nullable Class compoundEntryClass; public static CompoundWeavingConfigImpl withOverrides(CompoundWeavingConfig self, CompoundWeavingConfig overrides) { return CompoundWeavingConfigImpl.builder() diff --git a/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/weaving/compound/package-info.java b/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/weaving/compound/package-info.java new file mode 100644 index 0000000..528e67e --- /dev/null +++ b/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/weaving/compound/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package de.siphalor.tweed5.weaver.pojo.impl.weaving.compound; + +import org.jspecify.annotations.NullMarked; diff --git a/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/weaving/package-info.java b/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/weaving/package-info.java new file mode 100644 index 0000000..c299fc3 --- /dev/null +++ b/tweed5-weaver-pojo/src/main/java/de/siphalor/tweed5/weaver/pojo/impl/weaving/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package de.siphalor.tweed5.weaver.pojo.impl.weaving; + +import org.jspecify.annotations.NullMarked;