Skip to content

Commit

Permalink
refactor: use context instead of inject for our context stuff
Browse files Browse the repository at this point in the history
  • Loading branch information
mimbrero committed Jul 15, 2023
1 parent e145ebd commit f5efca2
Show file tree
Hide file tree
Showing 33 changed files with 257 additions and 219 deletions.
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package st.networkers.rimor.params.parse;

import st.networkers.rimor.inject.ExecutionContext;
import st.networkers.rimor.inject.Token;
import st.networkers.rimor.inject.ParameterToken;
import st.networkers.rimor.context.ExecutionContext;
import st.networkers.rimor.context.Token;
import st.networkers.rimor.context.ParameterToken;
import st.networkers.rimor.params.InstructionParam;
import st.networkers.rimor.params.InstructionParams;
import st.networkers.rimor.params.parse.support.StringInstructionParamParser;
import st.networkers.rimor.inject.provide.AbstractRimorProvider;
import st.networkers.rimor.context.provide.AbstractExecutionContextProvider;
import st.networkers.rimor.reflect.CachedMethod;
import st.networkers.rimor.reflect.CachedParameter;

Expand All @@ -19,7 +19,7 @@
* <p>
* Check {@link StringInstructionParamParser} for a quick example.
*/
public abstract class AbstractInstructionParamParser<T> extends AbstractRimorProvider<T> implements InstructionParamParser<T> {
public abstract class AbstractInstructionParamParser<T> extends AbstractExecutionContextProvider<T> implements InstructionParamParser<T> {

protected static final Token<List<Object>> PARAMS_TOKEN = new Token<List<Object>>() {}.annotatedWith(InstructionParams.class);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package st.networkers.rimor.params.parse;

import st.networkers.rimor.inject.ExecutionContext;
import st.networkers.rimor.inject.Token;
import st.networkers.rimor.context.ExecutionContext;
import st.networkers.rimor.context.Token;
import st.networkers.rimor.params.InstructionParams;
import st.networkers.rimor.params.parse.support.BooleanInstructionParamParser;
import st.networkers.rimor.params.parse.support.DefaultInstructionParamParser;
import st.networkers.rimor.params.parse.support.EnumInstructionParamParser;
import st.networkers.rimor.params.parse.support.StringInstructionParamParser;
import st.networkers.rimor.inject.provide.RimorProvider;
import st.networkers.rimor.context.provide.ExecutionContextProvider;

/**
* Abstract class for providers that just parse an element from the {@link InstructionParams}-annotated lists.
Expand All @@ -18,7 +18,7 @@
* @see EnumInstructionParamParser
* @see StringInstructionParamParser
*/
public interface InstructionParamParser<T> extends RimorProvider<T> {
public interface InstructionParamParser<T> extends ExecutionContextProvider<T> {

T parse(Object parameter, Token<T> token, ExecutionContext context);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package st.networkers.rimor.params.parse.support;

import org.apache.commons.lang3.ArrayUtils;
import st.networkers.rimor.inject.ExecutionContext;
import st.networkers.rimor.inject.Token;
import st.networkers.rimor.context.ExecutionContext;
import st.networkers.rimor.context.Token;
import st.networkers.rimor.params.parse.AbstractInstructionParamParser;

import java.util.Arrays;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package st.networkers.rimor.params.parse.support;

import st.networkers.rimor.inject.ExecutionContext;
import st.networkers.rimor.inject.Token;
import st.networkers.rimor.context.ExecutionContext;
import st.networkers.rimor.context.Token;
import st.networkers.rimor.params.parse.AbstractInstructionParamParser;

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package st.networkers.rimor.params.parse.support;

import st.networkers.rimor.inject.ExecutionContext;
import st.networkers.rimor.inject.Token;
import st.networkers.rimor.context.ExecutionContext;
import st.networkers.rimor.context.Token;
import st.networkers.rimor.params.parse.AbstractInstructionParamParser;

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package st.networkers.rimor.params.parse.support;

import st.networkers.rimor.inject.ExecutionContext;
import st.networkers.rimor.inject.Token;
import st.networkers.rimor.context.ExecutionContext;
import st.networkers.rimor.context.Token;
import st.networkers.rimor.params.parse.AbstractInstructionParamParser;

public class StringInstructionParamParser extends AbstractInstructionParamParser<String> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
import st.networkers.rimor.inject.ExecutionContext;
import st.networkers.rimor.inject.Token;
import st.networkers.rimor.inject.ParameterToken;
import st.networkers.rimor.context.ExecutionContext;
import st.networkers.rimor.context.Token;
import st.networkers.rimor.context.ParameterToken;
import st.networkers.rimor.params.InstructionParam;
import st.networkers.rimor.params.InstructionParamImpl;
import st.networkers.rimor.params.InstructionParams;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import st.networkers.rimor.inject.Token;
import st.networkers.rimor.context.Token;
import st.networkers.rimor.params.InstructionParam;

import static org.assertj.core.api.Assertions.assertThat;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package st.networkers.rimor.params.parse.support;

import org.junit.jupiter.api.Test;
import st.networkers.rimor.inject.Token;
import st.networkers.rimor.context.Token;
import st.networkers.rimor.params.InstructionParam;

import static org.assertj.core.api.Assertions.assertThat;
Expand Down
31 changes: 18 additions & 13 deletions rimor/src/main/java/st/networkers/rimor/Rimor.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,57 +6,62 @@
import st.networkers.rimor.extension.ExtensionManager;
import st.networkers.rimor.extension.RimorExtension;
import st.networkers.rimor.extension.SupportExtension;
import st.networkers.rimor.inject.RimorInjector;
import st.networkers.rimor.inject.provide.ProviderRegistry;
import st.networkers.rimor.inject.provide.RimorProvider;
import st.networkers.rimor.context.ExecutionContextService;
import st.networkers.rimor.context.provide.ProviderRegistry;
import st.networkers.rimor.context.provide.ExecutionContextProvider;
import st.networkers.rimor.resolve.PathResolver;

public class Rimor {

private final BeanManager beanManager;
private final CommandRegistry commandRegistry;
private final CommandExecutor commandExecutor;
private final ExecutionContextService executionContextService;
private final ExtensionManager extensionManager;
private final ProviderRegistry providerRegistry;
private final PathResolver pathResolver;
private final RimorInjector injector;

public Rimor(BeanManager beanManager, CommandRegistry commandRegistry, CommandExecutor commandExecutor,
ExtensionManager extensionManager, ProviderRegistry providerRegistry, PathResolver pathResolver,
RimorInjector injector) {
ExecutionContextService executionContextService) {
this.beanManager = beanManager;
this.commandRegistry = commandRegistry;
this.commandExecutor = commandExecutor;
this.extensionManager = extensionManager;
this.providerRegistry = providerRegistry;
this.pathResolver = pathResolver;
this.injector = injector;
this.executionContextService = executionContextService;

this.registerExtension(new SupportExtension());
}

/**
* Registers the given bean.
*
* @param bean the bean register
*/
public Rimor register(Object bean) {
this.beanManager.processBean(bean);
return this;
}

/**
* Registers the given {@link RimorProvider}.
* Registers the given {@link ExecutionContextProvider}.
*
* @param provider the provider to register
*/
public Rimor registerProvider(RimorProvider<?> provider) {
public Rimor registerProvider(ExecutionContextProvider<?> provider) {
this.providerRegistry.register(provider);
return this;
}

/**
* Registers the given {@link RimorProvider}s.
* Registers the given {@link ExecutionContextProvider}s.
*
* @param providers the providers to register
*/
public Rimor registerProviders(RimorProvider<?>... providers) {
for (RimorProvider<?> provider : providers)
public Rimor registerProviders(ExecutionContextProvider<?>... providers) {
for (ExecutionContextProvider<?> provider : providers)
this.registerProvider(provider);
return this;
}
Expand Down Expand Up @@ -106,7 +111,7 @@ public PathResolver getPathResolver() {
return pathResolver;
}

public RimorInjector getInjector() {
return injector;
public ExecutionContextService getExecutionContextService() {
return executionContextService;
}
}
10 changes: 10 additions & 0 deletions rimor/src/main/java/st/networkers/rimor/bean/BeanManager.java
Original file line number Diff line number Diff line change
@@ -1,17 +1,27 @@
package st.networkers.rimor.bean;

import st.networkers.rimor.context.provide.ProviderRegistry;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

public class BeanManager {

private final Collection<BeanProcessor> beanProcessors = new ArrayList<>();

private final Map<Object, ProviderRegistry> providerRegistries = new HashMap<>();

public void registerBeanProcessor(BeanProcessor beanProcessor) {
this.beanProcessors.add(beanProcessor);
}

public void processBean(Object bean) {
this.beanProcessors.forEach(beanProcessor -> beanProcessor.process(bean));
}

public ProviderRegistry getProviderRegistry(Object bean) {
return this.providerRegistries.get(bean);
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package st.networkers.rimor.inject;
package st.networkers.rimor.context;

import st.networkers.rimor.util.MatchingMap;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package st.networkers.rimor.context;

import st.networkers.rimor.context.provide.ExecutionContextProvider;
import st.networkers.rimor.reflect.CachedMethod;

import java.util.Optional;

/**
* Provides an instance bound to a given {@link Token} from an {@link ExecutionContext} or a registered provider.
*/
public interface ExecutionContextService {

/**
* Gets an {@link Optional} wrapping the object bound to the given {@link Token} from the given
* {@link ExecutionContext}, if able. Otherwise, gets it from a registered {@link ExecutionContextProvider}, or
* returns an empty {@code Optional} if there are no available {@code ExecutionContextProvider} for the
* given {@code Token}.
*
* @param token the token to get its bound object
* @param context the context of a command execution
* @return an {@link Optional} wrapping the object bound to the token, or empty
*/
<T> Optional<T> get(Token<T> token, ExecutionContext context);

/**
* Gets an {@link Optional} wrapping the object bound to the given {@link Token} from the given
* {@link ExecutionContext}, if able. Otherwise, gets it from a registered {@link ExecutionContextProvider}, or
* returns an empty {@code Optional} if there are no available {@code ExecutionContextProvider} for the
* given {@code Token}.
*
* @param token the token to get its bound object
* @param context the context of a command execution
* @param bean the bean to use its local providers
* @return an {@link Optional} wrapping the object bound to the token, or empty
*/
<T> Optional<T> get(Token<T> token, ExecutionContext context, Object bean);

/**
* Invokes the given method injecting all its parameters following {@link #get(Token, ExecutionContext)}
*
* @param cachedMethod the method to invoke
* @param instance an instance of the method's class to invoke it on, or {@code null} if static
* @param context the context of a command execution
* @return the result of executing the method
*/
Object invokeMethod(CachedMethod cachedMethod, Object instance, ExecutionContext context);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package st.networkers.rimor.context;

import st.networkers.rimor.bean.BeanManager;
import st.networkers.rimor.context.provide.ProviderRegistry;
import st.networkers.rimor.reflect.CachedMethod;
import st.networkers.rimor.reflect.CachedParameter;
import st.networkers.rimor.util.OptionalUtils;
import st.networkers.rimor.util.ReflectionUtils;

import java.util.Optional;

public class ExecutionContextServiceImpl implements ExecutionContextService {

private final BeanManager beanManager;
private final ProviderRegistry globalProviderRegistry;

public ExecutionContextServiceImpl(BeanManager beanManager, ProviderRegistry globalProviderRegistry) {
this.beanManager = beanManager;
this.globalProviderRegistry = globalProviderRegistry;
}

@Override
public <T> Optional<T> get(Token<T> token, ExecutionContext context) {
return OptionalUtils.firstPresent(
context.get(token),
() -> this.fromProviderRegistry(globalProviderRegistry, token, context)
);
}

@Override
public <T> Optional<T> get(Token<T> token, ExecutionContext context, Object bean) {
return OptionalUtils.firstPresent(
context.get(token),
() -> this.fromProviderRegistry(beanManager.getProviderRegistry(bean), token, context),
() -> this.fromProviderRegistry(globalProviderRegistry, token, context)
);
}

private <T> Optional<T> fromProviderRegistry(ProviderRegistry providerRegistry, Token<T> token, ExecutionContext context) {
return providerRegistry.findFor(token).map(provider -> provider.get(token, context));
}

@Override
public Object invokeMethod(CachedMethod method, Object instance, ExecutionContext context) {
return ReflectionUtils.invoke(method.getMethod(), instance, resolveParameters(method, context));
}

private Object[] resolveParameters(CachedMethod method, ExecutionContext context) {
Object[] parameters = new Object[method.getParameters().size()];

int i = 0;
for (CachedParameter parameter : method.getParameters()) {
parameters[i++] = this.get(ParameterToken.build(method, parameter), context).orElse(null);
}

return parameters;
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package st.networkers.rimor.inject;
package st.networkers.rimor.context;

import st.networkers.rimor.reflect.CachedMethod;
import st.networkers.rimor.reflect.CachedParameter;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package st.networkers.rimor.inject;
package st.networkers.rimor.context;

import org.apache.commons.lang3.ClassUtils;
import org.apache.commons.lang3.reflect.TypeUtils;
Expand Down
Loading

0 comments on commit f5efca2

Please sign in to comment.