Compare commits

...

3 Commits

Author SHA1 Message Date
Jesse Brault
b2e8e0c5b9 Fix problems with concurrency. 2026-01-04 18:06:28 -06:00
Jesse Brault
c797190f5a Update gradle to 9.2.0. 2026-01-04 17:26:01 -06:00
Jesse Brault
23bd24ddb1 Change package name to com.jessebrault.di. 2025-06-28 12:12:45 -05:00
46 changed files with 77 additions and 84 deletions

View File

@ -4,7 +4,7 @@ plugins {
}
group = 'com.jessebrault.di'
version = '0.1.0'
version = '0.2.0-SNAPSHOT'
repositories {
mavenCentral()

Binary file not shown.

View File

@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.0-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME

9
gradlew vendored
View File

@ -1,7 +1,7 @@
#!/bin/sh
#
# Copyright © 2015-2021 the original authors.
# Copyright © 2015 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@ -114,7 +114,6 @@ case "$( uname )" in #(
NONSTOP* ) nonstop=true ;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
@ -172,7 +171,6 @@ fi
# For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
JAVACMD=$( cygpath --unix "$JAVACMD" )
@ -205,15 +203,14 @@ fi
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Collect all arguments for the java command:
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# and any embedded shellness will be escaped.
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
# treated as '${Hostname}' itself on the command line.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \
-jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \
"$@"
# Stop when "xargs" is not available.

3
gradlew.bat vendored
View File

@ -70,11 +70,10 @@ goto fail
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %*
:end
@rem End local scope for the variables with windows NT shell

View File

@ -1,14 +1,15 @@
package groowt.util.di;
package com.jessebrault.di;
import jakarta.inject.Inject;
import org.jetbrains.annotations.Nullable;
import java.lang.reflect.*;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import static groowt.util.di.ObjectFactoryUtil.toTypes;
import static com.jessebrault.di.ObjectFactoryUtil.toTypes;
// TODO: maybe inject fields
public abstract class AbstractInjectingObjectFactory implements ObjectFactory {
@ -104,20 +105,15 @@ public abstract class AbstractInjectingObjectFactory implements ObjectFactory {
}
private final Map<Class<?>, Constructor<?>[]> cachedAllConstructors = new HashMap<>();
private final Collection<CachedInjectConstructor<?>> cachedInjectConstructors = new ArrayList<>();
private final Collection<CachedNonInjectConstructor<?>> cachedNonInjectConstructors = new ArrayList<>();
private final Map<Class<?>, Collection<Method>> cachedSetters = new HashMap<>();
private final Map<Method, Parameter> cachedSetterParameters = new HashMap<>();
private final Map<Class<?>, Constructor<?>[]> cachedAllConstructors = new ConcurrentHashMap<>();
private final Map<Class<?>, Constructor<?>> cachedInjectConstructors = new ConcurrentHashMap<>();
private final Map<Class<?>, Map<Class<?>[], Constructor<?>>> cachedNonInjectConstructors = new ConcurrentHashMap<>();
private final Map<Class<?>, Collection<Method>> cachedSetters = new ConcurrentHashMap<>();
private final Map<Method, Parameter> cachedSetterParameters = new ConcurrentHashMap<>();
@SuppressWarnings("unchecked")
private <T> @Nullable Constructor<T> findCachedInjectConstructor(Class<T> clazz) {
for (final CachedInjectConstructor<?> cachedConstructor : this.cachedInjectConstructors) {
if (clazz.equals(cachedConstructor.clazz())) {
return (Constructor<T>) cachedConstructor.constructor();
}
}
return null;
return (Constructor<T>) this.cachedInjectConstructors.get(clazz);
}
/**
@ -153,15 +149,14 @@ public abstract class AbstractInjectingObjectFactory implements ObjectFactory {
}
protected final void putCachedInjectConstructor(CachedInjectConstructor<?> cached) {
this.cachedInjectConstructors.add(cached);
this.cachedInjectConstructors.put(cached.clazz(), cached.constructor());
}
@SuppressWarnings("unchecked")
private <T> @Nullable Constructor<T> findCachedNonInjectConstructor(Class<T> clazz, Class<?>[] paramTypes) {
for (final CachedNonInjectConstructor<?> cachedConstructor : this.cachedNonInjectConstructors) {
if (clazz.equals(cachedConstructor.clazz()) && Arrays.equals(cachedConstructor.paramTypes(), paramTypes)) {
return (Constructor<T>) cachedConstructor.constructor();
}
final Map<Class<?>[], Constructor<?>> constructors = this.cachedNonInjectConstructors.get(clazz);
if (constructors != null) {
return (Constructor<T>) constructors.get(paramTypes);
}
return null;
}
@ -209,7 +204,10 @@ public abstract class AbstractInjectingObjectFactory implements ObjectFactory {
}
protected final void putCachedNonInjectConstructor(CachedNonInjectConstructor<?> cached) {
this.cachedNonInjectConstructors.add(cached);
final Map<Class<?>[], Constructor<?>> constructors = this.cachedNonInjectConstructors.computeIfAbsent(
cached.clazz(), clazz -> new HashMap<>()
);
constructors.put(cached.paramTypes(), cached.constructor());
}
/**

View File

@ -1,7 +1,7 @@
package groowt.util.di;
package com.jessebrault.di;
import groowt.util.di.filters.FilterHandler;
import groowt.util.di.filters.IterableFilterHandler;
import com.jessebrault.di.filters.FilterHandler;
import com.jessebrault.di.filters.IterableFilterHandler;
import org.jetbrains.annotations.Nullable;
import java.lang.annotation.Annotation;
@ -12,7 +12,7 @@ import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;
import static groowt.util.di.RegistryObjectFactoryUtil.orElseSupply;
import static com.jessebrault.di.RegistryObjectFactoryUtil.orElseSupply;
public abstract class AbstractRegistryObjectFactory extends AbstractInjectingObjectFactory
implements RegistryObjectFactory {

View File

@ -1,3 +1,3 @@
package groowt.util.di;
package com.jessebrault.di;
sealed public interface Binding<T> permits ClassBinding, ProviderBinding, SingletonBinding, LazySingletonBinding {}

View File

@ -1,4 +1,4 @@
package groowt.util.di;
package com.jessebrault.di;
import jakarta.inject.Provider;

View File

@ -1,4 +1,4 @@
package groowt.util.di;
package com.jessebrault.di;
import jakarta.inject.Provider;

View File

@ -1,3 +1,3 @@
package groowt.util.di;
package com.jessebrault.di;
public record ClassBinding<T>(Class<T> from, Class<? extends T> to) implements Binding<T> {}

View File

@ -1,4 +1,4 @@
package groowt.util.di;
package com.jessebrault.di;
import jakarta.inject.Named;
import org.jetbrains.annotations.Nullable;

View File

@ -1,4 +1,4 @@
package groowt.util.di;
package com.jessebrault.di;
import org.jetbrains.annotations.Nullable;

View File

@ -1,7 +1,7 @@
package groowt.util.di;
package com.jessebrault.di;
import groowt.util.di.filters.FilterHandler;
import groowt.util.di.filters.IterableFilterHandler;
import com.jessebrault.di.filters.FilterHandler;
import com.jessebrault.di.filters.IterableFilterHandler;
import org.jetbrains.annotations.Nullable;
import java.lang.annotation.Annotation;
@ -14,7 +14,7 @@ import java.util.Collection;
import java.util.List;
import java.util.function.Supplier;
import static groowt.util.di.RegistryObjectFactoryUtil.*;
import static com.jessebrault.di.RegistryObjectFactoryUtil.*;
public class DefaultRegistryObjectFactory extends AbstractRegistryObjectFactory {

View File

@ -1,4 +1,4 @@
package groowt.util.di;
package com.jessebrault.di;
import java.util.Collection;

View File

@ -1,8 +1,7 @@
package groowt.util.di;
package com.jessebrault.di;
import org.jetbrains.annotations.Nullable;
import java.util.function.BiPredicate;
import java.util.function.Consumer;
import java.util.function.Predicate;

View File

@ -1,4 +1,4 @@
package groowt.util.di;
package com.jessebrault.di;
public interface KeyHolder<B extends KeyBinder<K>, K, T> {
Class<B> binderType();

View File

@ -1,4 +1,4 @@
package groowt.util.di;
package com.jessebrault.di;
import java.util.function.Supplier;

View File

@ -1,3 +1,3 @@
package groowt.util.di;
package com.jessebrault.di;
public interface NamedRegistryExtension extends RegistryExtension, KeyBinder<String>, QualifierHandlerContainer {}

View File

@ -1,4 +1,4 @@
package groowt.util.di;
package com.jessebrault.di;
import org.jetbrains.annotations.Contract;

View File

@ -1,4 +1,4 @@
package groowt.util.di;
package com.jessebrault.di;
import org.jetbrains.annotations.ApiStatus;

View File

@ -1,4 +1,4 @@
package groowt.util.di;
package com.jessebrault.di;
import jakarta.inject.Provider;

View File

@ -1,4 +1,4 @@
package groowt.util.di;
package com.jessebrault.di;
import org.jetbrains.annotations.Nullable;

View File

@ -1,4 +1,4 @@
package groowt.util.di;
package com.jessebrault.di;
import jakarta.inject.Qualifier;
import org.jetbrains.annotations.Nullable;

View File

@ -1,4 +1,4 @@
package groowt.util.di;
package com.jessebrault.di;
import org.jetbrains.annotations.Nullable;

View File

@ -1,3 +1,3 @@
package groowt.util.di;
package com.jessebrault.di;
public interface RegistryExtension {}

View File

@ -1,9 +1,9 @@
package groowt.util.di;
package com.jessebrault.di;
import groovy.lang.Closure;
import groovy.lang.DelegatesTo;
import groowt.util.di.filters.FilterHandler;
import groowt.util.di.filters.IterableFilterHandler;
import com.jessebrault.di.filters.FilterHandler;
import com.jessebrault.di.filters.IterableFilterHandler;
import jakarta.inject.Provider;
import org.jetbrains.annotations.Nullable;

View File

@ -1,7 +1,7 @@
package groowt.util.di;
package com.jessebrault.di;
import groowt.util.di.filters.Filter;
import groowt.util.di.filters.IterableFilter;
import com.jessebrault.di.filters.Filter;
import com.jessebrault.di.filters.IterableFilter;
import jakarta.inject.Qualifier;
import jakarta.inject.Scope;
import org.jetbrains.annotations.ApiStatus;

View File

@ -1,4 +1,4 @@
package groowt.util.di;
package com.jessebrault.di;
import java.lang.annotation.Annotation;

View File

@ -1,4 +1,4 @@
package groowt.util.di;
package com.jessebrault.di;
import jakarta.inject.Scope;
import org.jetbrains.annotations.Nullable;

View File

@ -1,4 +1,4 @@
package groowt.util.di;
package com.jessebrault.di;
import jakarta.inject.Provider;
import org.jetbrains.annotations.Nullable;

View File

@ -1,4 +1,4 @@
package groowt.util.di;
package com.jessebrault.di;
public record SimpleKeyHolder<B extends KeyBinder<K>, K, T>(Class<B> binderType, Class<T> type, K key)
implements KeyHolder<B, K, T> {}

View File

@ -1,3 +1,3 @@
package groowt.util.di;
package com.jessebrault.di;
public record SingletonBinding<T>(T to) implements Binding<T> {}

View File

@ -1,4 +1,4 @@
package groowt.util.di;
package com.jessebrault.di;
import jakarta.inject.Singleton;
import org.jetbrains.annotations.Nullable;

View File

@ -1,9 +1,9 @@
package groowt.util.di;
package com.jessebrault.di;
import jakarta.inject.Provider;
import jakarta.inject.Singleton;
import static groowt.util.di.BindingUtil.toLazySingleton;
import static com.jessebrault.di.BindingUtil.toLazySingleton;
public final class SingletonScopeHandler implements ScopeHandler<Singleton> {

View File

@ -1,4 +1,4 @@
package groowt.util.di.annotation;
package com.jessebrault.di.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;

View File

@ -1,4 +1,4 @@
package groowt.util.di.filters;
package com.jessebrault.di.filters;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;

View File

@ -1,4 +1,4 @@
package groowt.util.di.filters;
package com.jessebrault.di.filters;
import java.lang.annotation.Annotation;
import java.util.Objects;

View File

@ -1,9 +1,9 @@
package groowt.util.di.filters;
package com.jessebrault.di.filters;
import java.lang.annotation.*;
import java.util.function.BiPredicate;
import static groowt.util.di.filters.FilterUtil.isAssignableToAnyOf;
import static com.jessebrault.di.filters.FilterUtil.isAssignableToAnyOf;
public final class FilterHandlers {

View File

@ -1,4 +1,4 @@
package groowt.util.di.filters;
package com.jessebrault.di.filters;
public final class FilterUtil {

View File

@ -1,4 +1,4 @@
package groowt.util.di.filters;
package com.jessebrault.di.filters;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;

View File

@ -1,4 +1,4 @@
package groowt.util.di.filters;
package com.jessebrault.di.filters;
import java.lang.annotation.Annotation;

View File

@ -1,9 +1,9 @@
package groowt.util.di.filters;
package com.jessebrault.di.filters;
import java.lang.annotation.*;
import java.util.function.BiPredicate;
import static groowt.util.di.filters.FilterUtil.isAssignableToAnyOf;
import static com.jessebrault.di.filters.FilterUtil.isAssignableToAnyOf;
public final class IterableFilterHandlers {

View File

@ -1,4 +1,4 @@
package groowt.util.di.filters;
package com.jessebrault.di.filters;
import java.lang.annotation.Annotation;
import java.util.function.BiPredicate;

View File

@ -1,4 +1,4 @@
package groowt.util.di.filters;
package com.jessebrault.di.filters;
import java.lang.annotation.Annotation;
import java.util.Objects;

View File

@ -1,11 +1,11 @@
package groowt.util.di;
package com.jessebrault.di;
import jakarta.inject.Inject;
import jakarta.inject.Named;
import jakarta.inject.Singleton;
import org.junit.jupiter.api.Test;
import static groowt.util.di.BindingUtil.*;
import static com.jessebrault.di.BindingUtil.*;
import static org.junit.jupiter.api.Assertions.*;
public class DefaultRegistryObjectFactoryTests {