diff --git a/inject-events/pom.xml b/inject-events/pom.xml index 5087ca068..90c1c6df4 100644 --- a/inject-events/pom.xml +++ b/inject-events/pom.xml @@ -12,7 +12,7 @@ io.avaje avaje-inject - 10.0-RC6 + 10.0 provided diff --git a/inject-generator/pom.xml b/inject-generator/pom.xml index 9c7d866ce..32ce245f4 100644 --- a/inject-generator/pom.xml +++ b/inject-generator/pom.xml @@ -13,7 +13,7 @@ avaje inject generator annotation processor generating source code for avaje-inject dependency injection - 1.28 + 1.30 diff --git a/inject-generator/src/main/java/io/avaje/inject/generator/EventPublisherWriter.java b/inject-generator/src/main/java/io/avaje/inject/generator/EventPublisherWriter.java index a4b953bea..90875ecd6 100644 --- a/inject-generator/src/main/java/io/avaje/inject/generator/EventPublisherWriter.java +++ b/inject-generator/src/main/java/io/avaje/inject/generator/EventPublisherWriter.java @@ -52,7 +52,7 @@ private EventPublisherWriter(Element element) { .toString() .replaceFirst("java.", "") + ".events"; - qualifier = Optional.ofNullable(Util.getNamed(element)).orElse(""); + qualifier = Optional.ofNullable(Util.named(element)).orElse(""); var className = packageName + "." @@ -65,7 +65,7 @@ private EventPublisherWriter(Element element) { if (GENERATED_PUBLISHERS.containsKey(originName)) { //in super niche situations when compiling the same module, we need to tell avaje that these types already exist //got this when running both my eclipse compiler and then the terminal build - ProcessingContext.addOptionalType(UType.parse(asType).fullWithoutAnnotations(), Util.getNamed(element)); + ProcessingContext.addOptionalType(UType.parse(asType).fullWithoutAnnotations(), Util.named(element)); return; } importTypes.addAll(utype.importTypes()); @@ -77,7 +77,7 @@ private String getUniqueClassName(String className, Integer recursiveIndex) { Optional.ofNullable(APContext.typeElement(className)).ifPresent(e -> GENERATED_PUBLISHERS.put( e.getQualifiedName().toString(), - Optional.ofNullable(Util.getNamed(e)).orElse(""))); + Optional.ofNullable(Util.named(e)).orElse(""))); if (Optional.ofNullable(GENERATED_PUBLISHERS.get(className)) .filter(not(qualifier::equals)) diff --git a/inject-generator/src/main/java/io/avaje/inject/generator/FieldReader.java b/inject-generator/src/main/java/io/avaje/inject/generator/FieldReader.java index b300bd073..05985b599 100644 --- a/inject-generator/src/main/java/io/avaje/inject/generator/FieldReader.java +++ b/inject-generator/src/main/java/io/avaje/inject/generator/FieldReader.java @@ -19,7 +19,7 @@ final class FieldReader { FieldReader(Element element) { this.element = element; - this.name = Util.getNamed(element); + this.name = Util.named(element); this.nullable = Util.isNullable(element); this.isBeanMap = QualifiedMapPrism.isPresent(element); this.utype = Util.determineType(element.asType(), isBeanMap); diff --git a/inject-generator/src/main/java/io/avaje/inject/generator/InjectProcessor.java b/inject-generator/src/main/java/io/avaje/inject/generator/InjectProcessor.java index f7a048a8b..c7c6de993 100644 --- a/inject-generator/src/main/java/io/avaje/inject/generator/InjectProcessor.java +++ b/inject-generator/src/main/java/io/avaje/inject/generator/InjectProcessor.java @@ -155,7 +155,7 @@ public boolean process(Set annotations, RoundEnvironment .forEach(e -> { var type = UType.parse(e.asType()); type = "java.util.List".equals(type.mainType()) ? type.param0() : type; - ProcessingContext.addOptionalType(type.fullWithoutAnnotations(), Util.getNamed(e)); + ProcessingContext.addOptionalType(type.fullWithoutAnnotations(), Util.named(e)); ProcessingContext.addOptionalType(type.fullWithoutAnnotations(), null); }); diff --git a/inject-generator/src/main/java/io/avaje/inject/generator/MethodReader.java b/inject-generator/src/main/java/io/avaje/inject/generator/MethodReader.java index 39e03f58d..1bdff7b2d 100644 --- a/inject-generator/src/main/java/io/avaje/inject/generator/MethodReader.java +++ b/inject-generator/src/main/java/io/avaje/inject/generator/MethodReader.java @@ -492,7 +492,7 @@ static class MethodParam { MethodParam(VariableElement param) { this.element = param; this.simpleName = param.getSimpleName().toString(); - this.named = Util.getNamed(param); + this.named = Util.named(param); this.nullable = Util.isNullable(param); this.isBeanMap = QualifiedMapPrism.isPresent(param); this.utilType = Util.determineType(param.asType(), isBeanMap); @@ -572,7 +572,7 @@ void addImports(ImportTypeMap importTypes) { importTypes.add("io.avaje.inject.events.ObserverManager"); } importTypes.addAll(fullUType.importTypes()); - Util.getNullableAnnotation(element).map(Object::toString).ifPresent(importTypes::add); + Util.nullableAnnotation(element).map(Object::toString).ifPresent(importTypes::add); } void checkRequest(BeanRequestParams requestParams) { diff --git a/inject-generator/src/main/java/io/avaje/inject/generator/ProcessingContext.java b/inject-generator/src/main/java/io/avaje/inject/generator/ProcessingContext.java index 886b88061..ecf537f65 100644 --- a/inject-generator/src/main/java/io/avaje/inject/generator/ProcessingContext.java +++ b/inject-generator/src/main/java/io/avaje/inject/generator/ProcessingContext.java @@ -129,7 +129,7 @@ static boolean externallyProvided(String type) { static void addOptionalType(String paramType, String name) { if (!CTX.get().providedTypes.contains(paramType)) { - CTX.get().optionalTypes.add(Util.addQualifierSuffixTrim(name, paramType)); + CTX.get().optionalTypes.add(ProcessorUtils.trimAnnotations(Util.addQualifierSuffixTrim(name, paramType))); } } diff --git a/inject-generator/src/main/java/io/avaje/inject/generator/TypeExtendsInjection.java b/inject-generator/src/main/java/io/avaje/inject/generator/TypeExtendsInjection.java index 82e7230bd..5f3e6718c 100644 --- a/inject-generator/src/main/java/io/avaje/inject/generator/TypeExtendsInjection.java +++ b/inject-generator/src/main/java/io/avaje/inject/generator/TypeExtendsInjection.java @@ -165,7 +165,7 @@ private void checkForAspect(ExecutableElement methodElement) { private void addFactoryMethod(ExecutableElement methodElement, BeanPrism bean) { - String qualifierName = Util.getNamed(methodElement); + String qualifierName = Util.named(methodElement); factoryMethods.add(new MethodReader(methodElement, baseType, bean, qualifierName, importTypes).read()); } diff --git a/inject-generator/src/main/java/io/avaje/inject/generator/Util.java b/inject-generator/src/main/java/io/avaje/inject/generator/Util.java index 95b8a4f67..3c3287375 100644 --- a/inject-generator/src/main/java/io/avaje/inject/generator/Util.java +++ b/inject-generator/src/main/java/io/avaje/inject/generator/Util.java @@ -183,16 +183,6 @@ static String trimmedName(UType type) { return shortName(type.mainType()).toLowerCase(); } - String trimExtends(UType uType) { - String type = uType.mainType(); - if (type != null && type.startsWith("? extends ")) { - return type.substring(10); - } else if ("?".equals(type)) { - return "Wildcard"; - } - return type; - } - static boolean isOptional(String rawType) { return rawType.startsWith(OPTIONAL_PREFIX); } @@ -298,7 +288,7 @@ static String commonParent(String currentTop, String aPackage) { /** * Return the name via @Named or a Qualifier annotation. */ - static String getNamed(Element p) { + static String named(Element p) { final NamedPrism named = NamedPrism.getInstanceOn(p); if (named != null) { return named.value().replace("\"", "\\\""); @@ -320,8 +310,11 @@ static String getNamed(Element p) { /** * Return true if the element has a Nullable annotation. */ - static boolean isNullable(Element p) { - for (final AnnotationMirror mirror : p.getAnnotationMirrors()) { + static boolean isNullable(Element element) { + if (ProcessorUtils.hasAnnotationWithName(element, NULLABLE)) { + return true; + } + for (final AnnotationMirror mirror : UType.parse(element.asType()).annotations()) { if (NULLABLE.equals(shortName(mirror.getAnnotationType().toString()))) { return true; } @@ -329,8 +322,8 @@ static boolean isNullable(Element p) { return false; } - static Optional getNullableAnnotation(Element p) { - for (final AnnotationMirror mirror : p.getAnnotationMirrors()) { + static Optional nullableAnnotation(Element element) { + for (final AnnotationMirror mirror : element.getAnnotationMirrors()) { if (NULLABLE.equals(shortName(mirror.getAnnotationType().toString()))) { return Optional.of(mirror.getAnnotationType()); } diff --git a/inject-generator/src/test/java/io/avaje/inject/generator/models/valid/external/ExternalDeps.java b/inject-generator/src/test/java/io/avaje/inject/generator/models/valid/external/ExternalDeps.java index daa1e556c..5479d1a71 100644 --- a/inject-generator/src/test/java/io/avaje/inject/generator/models/valid/external/ExternalDeps.java +++ b/inject-generator/src/test/java/io/avaje/inject/generator/models/valid/external/ExternalDeps.java @@ -2,13 +2,17 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; + +import org.jspecify.annotations.Nullable; import io.avaje.inject.External; -import io.avaje.lang.Nullable; +import jakarta.inject.Inject; import jakarta.inject.Singleton; @Singleton public class ExternalDeps { + @Inject @Nullable AtomicLong longy; public ExternalDeps(@External AtomicBoolean bool, @Nullable AtomicInteger inty) {} } diff --git a/inject-test/src/main/java/io/avaje/inject/test/GlobalInitialise.java b/inject-test/src/main/java/io/avaje/inject/test/GlobalInitialise.java index 457ff387c..f1b2b438a 100644 --- a/inject-test/src/main/java/io/avaje/inject/test/GlobalInitialise.java +++ b/inject-test/src/main/java/io/avaje/inject/test/GlobalInitialise.java @@ -2,7 +2,7 @@ import io.avaje.inject.BeanScope; import io.avaje.inject.spi.AvajeModule; -import io.avaje.lang.Nullable; +import org.jspecify.annotations.Nullable; import java.io.IOException; import java.io.InputStream; diff --git a/inject-test/src/main/java/io/avaje/inject/test/PluginMgr.java b/inject-test/src/main/java/io/avaje/inject/test/PluginMgr.java index a6c955d5c..c5daf3acf 100644 --- a/inject-test/src/main/java/io/avaje/inject/test/PluginMgr.java +++ b/inject-test/src/main/java/io/avaje/inject/test/PluginMgr.java @@ -1,10 +1,12 @@ package io.avaje.inject.test; -import io.avaje.inject.BeanScope; -import io.avaje.lang.Nullable; - import java.util.ServiceLoader; +import org.jspecify.annotations.Nullable; + +import io.avaje.inject.BeanScope; +import io.avaje.inject.test.Plugin.Scope; + final class PluginMgr { private PluginMgr() {} @@ -23,8 +25,8 @@ static Plugin plugin() { /** * Return a new plugin scope (if there is a plugin). */ - @Nullable - static Plugin.Scope scope(BeanScope beanScope) { + @Nullable + static Scope scope(BeanScope beanScope) { return plugin == null ? null : plugin.createScope(beanScope); } } diff --git a/inject-test/src/main/java/io/avaje/inject/test/TestBeanScope.java b/inject-test/src/main/java/io/avaje/inject/test/TestBeanScope.java index fb91f5d9f..e8803433c 100644 --- a/inject-test/src/main/java/io/avaje/inject/test/TestBeanScope.java +++ b/inject-test/src/main/java/io/avaje/inject/test/TestBeanScope.java @@ -1,15 +1,16 @@ package io.avaje.inject.test; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + import io.avaje.inject.BeanScope; import io.avaje.inject.BeanScopeBuilder; -import io.avaje.lang.NonNullApi; -import io.avaje.lang.Nullable; /** * Provides access to the global "test scope" and helper methods to use it. * */ -@NonNullApi +@NullMarked public abstract class TestBeanScope { /** diff --git a/inject/pom.xml b/inject/pom.xml index 9a96fc0c9..d63b86504 100644 --- a/inject/pom.xml +++ b/inject/pom.xml @@ -12,6 +12,12 @@ avaje-inject dependency injection library using source code generation + + org.jspecify + jspecify + 1.0.0 + + jakarta.inject jakarta.inject-api @@ -24,12 +30,6 @@ ${project.version} - - io.avaje - avaje-lang - 1.1 - - io.avaje avaje-applog diff --git a/inject/src/main/java/io/avaje/inject/BeanEntry.java b/inject/src/main/java/io/avaje/inject/BeanEntry.java index c7f6ceda3..889757e4c 100644 --- a/inject/src/main/java/io/avaje/inject/BeanEntry.java +++ b/inject/src/main/java/io/avaje/inject/BeanEntry.java @@ -1,7 +1,5 @@ package io.avaje.inject; -import io.avaje.lang.NonNullApi; - import java.util.Set; /** @@ -9,7 +7,6 @@ * * @see BeanScope#all() */ -@NonNullApi public interface BeanEntry { /** diff --git a/inject/src/main/java/io/avaje/inject/BeanScope.java b/inject/src/main/java/io/avaje/inject/BeanScope.java index 85fe78b0e..0a480b4a0 100644 --- a/inject/src/main/java/io/avaje/inject/BeanScope.java +++ b/inject/src/main/java/io/avaje/inject/BeanScope.java @@ -6,8 +6,7 @@ import java.util.Map; import java.util.Optional; -import io.avaje.lang.NonNullApi; -import io.avaje.lang.Nullable; +import org.jspecify.annotations.Nullable; /** * Holds beans created by dependency injection. @@ -67,7 +66,6 @@ * * } */ -@NonNullApi public interface BeanScope extends AutoCloseable { /** diff --git a/inject/src/main/java/io/avaje/inject/BeanScopeBuilder.java b/inject/src/main/java/io/avaje/inject/BeanScopeBuilder.java index a438aabaf..cad20dc36 100644 --- a/inject/src/main/java/io/avaje/inject/BeanScopeBuilder.java +++ b/inject/src/main/java/io/avaje/inject/BeanScopeBuilder.java @@ -1,15 +1,15 @@ package io.avaje.inject; -import io.avaje.inject.spi.AvajeModule; -import io.avaje.inject.spi.ConfigPropertyPlugin; -import io.avaje.inject.spi.PropertyRequiresPlugin; -import io.avaje.lang.NonNullApi; -import io.avaje.lang.Nullable; - import java.lang.reflect.Type; import java.util.function.Consumer; import java.util.function.Supplier; +import org.jspecify.annotations.Nullable; + +import io.avaje.inject.spi.AvajeModule; +import io.avaje.inject.spi.ConfigPropertyPlugin; +import io.avaje.inject.spi.PropertyRequiresPlugin; + /** * Build a bean scope with options for shutdown hook and supplying external dependencies. *

@@ -30,7 +30,6 @@ * * } */ -@NonNullApi public interface BeanScopeBuilder { /** diff --git a/inject/src/main/java/io/avaje/inject/DBeanScopeBuilder.java b/inject/src/main/java/io/avaje/inject/DBeanScopeBuilder.java index 58d95dad1..186ed4695 100644 --- a/inject/src/main/java/io/avaje/inject/DBeanScopeBuilder.java +++ b/inject/src/main/java/io/avaje/inject/DBeanScopeBuilder.java @@ -3,6 +3,7 @@ import static java.lang.System.Logger.Level.DEBUG; import static java.lang.System.Logger.Level.INFO; import static java.util.Collections.emptySet; + import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Arrays; @@ -14,14 +15,20 @@ import java.util.function.Consumer; import java.util.function.Supplier; +import org.jspecify.annotations.Nullable; + import io.avaje.applog.AppLog; -import io.avaje.inject.spi.*; -import io.avaje.lang.NonNullApi; -import io.avaje.lang.Nullable; +import io.avaje.inject.spi.AvajeModule; +import io.avaje.inject.spi.Builder; +import io.avaje.inject.spi.ClosePair; +import io.avaje.inject.spi.ConfigPropertyPlugin; +import io.avaje.inject.spi.EnrichBean; +import io.avaje.inject.spi.ModuleOrdering; +import io.avaje.inject.spi.PropertyRequiresPlugin; +import io.avaje.inject.spi.SuppliedBean; import jakarta.inject.Provider; /** Build a bean scope with options for shutdown hook and supplying test doubles. */ -@NonNullApi final class DBeanScopeBuilder implements BeanScopeBuilder.ForTesting { private static final System.Logger log = AppLog.getLogger("io.avaje.inject"); diff --git a/inject/src/main/java/io/avaje/inject/package-info.java b/inject/src/main/java/io/avaje/inject/package-info.java index d86ae4f7b..1d14d17ee 100644 --- a/inject/src/main/java/io/avaje/inject/package-info.java +++ b/inject/src/main/java/io/avaje/inject/package-info.java @@ -26,4 +26,5 @@ * * } */ +@org.jspecify.annotations.NullMarked package io.avaje.inject; diff --git a/inject/src/main/java/io/avaje/inject/spi/ConfigPropertyPlugin.java b/inject/src/main/java/io/avaje/inject/spi/ConfigPropertyPlugin.java index 61c7bb477..29850b0b4 100644 --- a/inject/src/main/java/io/avaje/inject/spi/ConfigPropertyPlugin.java +++ b/inject/src/main/java/io/avaje/inject/spi/ConfigPropertyPlugin.java @@ -2,7 +2,7 @@ import java.util.Optional; -import io.avaje.lang.NonNullApi; +import org.jspecify.annotations.NullMarked; /** * Plugin interface which contains the application properties used for wiring. Used with @@ -11,28 +11,33 @@ *

The plugin is loaded via ServiceLoader and defaults to an implementation that uses {@link * System#getProperty(String)} and {@link System#getenv(String)}. */ -@NonNullApi +@NullMarked public interface ConfigPropertyPlugin extends InjectExtension, PropertyRequiresPlugin { /** * Return a configuration value that might not exist. */ + @Override Optional get(String property); /** * Return true if the property is defined. */ + @Override boolean contains(String property); /** Return true if the property is not defined. */ + @Override default boolean missing(String property) { return !contains(property); } /** Return true if the property is equal to the given value. */ + @Override boolean equalTo(String property, String value); /** Return true if the property is not defined or not equal to the given value. */ + @Override default boolean notEqualTo(String property, String value) { return !equalTo(property, value); } diff --git a/inject/src/main/java/io/avaje/inject/spi/DBeanScope.java b/inject/src/main/java/io/avaje/inject/spi/DBeanScope.java index 263087922..430a081ac 100644 --- a/inject/src/main/java/io/avaje/inject/spi/DBeanScope.java +++ b/inject/src/main/java/io/avaje/inject/spi/DBeanScope.java @@ -1,24 +1,31 @@ package io.avaje.inject.spi; -import io.avaje.applog.AppLog; -import io.avaje.inject.BeanEntry; -import io.avaje.inject.BeanScope; -import io.avaje.inject.Priority; -import io.avaje.lang.NonNullApi; -import io.avaje.lang.Nullable; +import static java.lang.System.Logger.Level.INFO; +import static java.lang.System.Logger.Level.TRACE; import java.lang.System.Logger.Level; import java.lang.annotation.Annotation; import java.lang.reflect.Type; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.IdentityHashMap; +import java.util.List; +import java.util.Map; +import java.util.NoSuchElementException; +import java.util.Optional; import java.util.concurrent.locks.ReentrantLock; import java.util.function.Consumer; import java.util.stream.Collectors; -import static java.lang.System.Logger.Level.INFO; -import static java.lang.System.Logger.Level.TRACE; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import io.avaje.applog.AppLog; +import io.avaje.inject.BeanEntry; +import io.avaje.inject.BeanScope; +import io.avaje.inject.Priority; -@NonNullApi +@NullMarked final class DBeanScope implements BeanScope { private static final System.Logger log = AppLog.getLogger("io.avaje.inject"); diff --git a/inject/src/main/java/io/avaje/inject/spi/DEntry.java b/inject/src/main/java/io/avaje/inject/spi/DEntry.java index 7ab1f0c73..a9239d584 100644 --- a/inject/src/main/java/io/avaje/inject/spi/DEntry.java +++ b/inject/src/main/java/io/avaje/inject/spi/DEntry.java @@ -1,12 +1,13 @@ package io.avaje.inject.spi; -import io.avaje.inject.BeanEntry; -import io.avaje.lang.NonNullApi; - import java.util.LinkedHashSet; import java.util.Set; -@NonNullApi +import org.jspecify.annotations.NullMarked; + +import io.avaje.inject.BeanEntry; + +@NullMarked final class DEntry implements BeanEntry { private final String qualifierName; diff --git a/inject/src/main/java/io/avaje/inject/spi/PropertyRequiresPlugin.java b/inject/src/main/java/io/avaje/inject/spi/PropertyRequiresPlugin.java index ed06cf238..f7f03c5e4 100644 --- a/inject/src/main/java/io/avaje/inject/spi/PropertyRequiresPlugin.java +++ b/inject/src/main/java/io/avaje/inject/spi/PropertyRequiresPlugin.java @@ -2,7 +2,7 @@ import java.util.Optional; -import io.avaje.lang.NonNullApi; +import org.jspecify.annotations.NullMarked; /** * Plugin interface which contains the application properties used for wiring. Used with {@link @@ -13,7 +13,7 @@ * * @deprecated use ConfigPropertyPlugin Instead */ -@NonNullApi +@NullMarked @Deprecated(forRemoval = true) public interface PropertyRequiresPlugin extends InjectExtension { diff --git a/inject/src/main/java/module-info.java b/inject/src/main/java/module-info.java index a62bdcfdd..ae9beb14f 100644 --- a/inject/src/main/java/module-info.java +++ b/inject/src/main/java/module-info.java @@ -3,13 +3,14 @@ exports io.avaje.inject; exports io.avaje.inject.spi; - requires transitive io.avaje.lang; requires transitive io.avaje.applog; - requires transitive jakarta.inject; requires static io.avaje.config; requires static org.mockito; requires static io.avaje.spi; + requires static transitive jakarta.inject; + requires static transitive org.jspecify; + uses io.avaje.inject.spi.InjectExtension; uses io.avaje.inject.spi.Module; uses io.avaje.inject.spi.Plugin;