From 478821e278fc08746dc081e800e55bd7ad305f5e Mon Sep 17 00:00:00 2001
From: kaibocai <89094811+kaibocai@users.noreply.github.com>
Date: Tue, 26 Sep 2023 15:20:25 -0500
Subject: [PATCH] clean up
clean up more
move resolver to dedicate package
rename resolver to converter
---
endtoendtests/pom.xml | 2 +-
.../functions/worker/JavaWorkerClient.java | 2 +-
.../worker/binding/BindingDataStore.java | 73 +++-----
.../worker/binding/DataOperations.java | 11 +-
.../worker/broker/FunctionDefinition.java | 2 +-
.../worker/broker/JavaFunctionBroker.java | 4 +-
.../worker/broker/JavaMethodExecutor.java | 5 +-
.../worker/broker/JavaMethodInvokeInfo.java | 49 ------
.../worker/broker/ParamBindInfo.java | 8 +-
.../ClassLoaderProvider.java | 2 +-
.../DefaultClassLoaderProvider.java | 2 +-
.../EnhancedClassLoaderProvider.java | 2 +-
.../FactoryClassLoader.java | 2 +-
.../CoreTypeConverter.java} | 8 +-
.../ParameterConverter.java} | 39 ++---
.../worker/handler/WorkerWarmupHandler.java | 2 +-
.../worker/invoker/MethodInvoker.java | 34 ++++
.../worker/broker/JavaFunctionBrokerTest.java | 2 +-
...rTest.java => ParameterConverterTest.java} | 157 +++++++++---------
...erTest.java => CoreTypeConverterTest.java} | 20 +--
.../broker/tests/FunctionDefinitionTest.java | 2 +-
...onEnvironmentReloadRequestHandlerTest.java | 2 +-
22 files changed, 192 insertions(+), 238 deletions(-)
delete mode 100644 src/main/java/com/microsoft/azure/functions/worker/broker/JavaMethodInvokeInfo.java
rename src/main/java/com/microsoft/azure/functions/worker/{reflect => classloader}/ClassLoaderProvider.java (89%)
rename src/main/java/com/microsoft/azure/functions/worker/{reflect => classloader}/DefaultClassLoaderProvider.java (97%)
rename src/main/java/com/microsoft/azure/functions/worker/{reflect => classloader}/EnhancedClassLoaderProvider.java (97%)
rename src/main/java/com/microsoft/azure/functions/worker/{reflect => classloader}/FactoryClassLoader.java (84%)
rename src/main/java/com/microsoft/azure/functions/worker/{broker/CoreTypeResolver.java => converter/CoreTypeConverter.java} (95%)
rename src/main/java/com/microsoft/azure/functions/worker/{broker/ParameterResolver.java => converter/ParameterConverter.java} (62%)
create mode 100644 src/main/java/com/microsoft/azure/functions/worker/invoker/MethodInvoker.java
rename src/test/java/com/microsoft/azure/functions/worker/broker/{ParameterResolverTest.java => ParameterConverterTest.java} (93%)
rename src/test/java/com/microsoft/azure/functions/worker/broker/tests/{CoreTypeResolverTest.java => CoreTypeConverterTest.java} (86%)
diff --git a/endtoendtests/pom.xml b/endtoendtests/pom.xml
index 755c550e..4b77dd57 100644
--- a/endtoendtests/pom.xml
+++ b/endtoendtests/pom.xml
@@ -22,7 +22,7 @@
UTF-8
1.8
1.18.0
- 3.0.0-SNAPSHOT
+ 3.0.0
1.0.0-beta.1
azure-functions-java-endtoendtests
westus
diff --git a/src/main/java/com/microsoft/azure/functions/worker/JavaWorkerClient.java b/src/main/java/com/microsoft/azure/functions/worker/JavaWorkerClient.java
index 2073b2a2..b54d94c6 100644
--- a/src/main/java/com/microsoft/azure/functions/worker/JavaWorkerClient.java
+++ b/src/main/java/com/microsoft/azure/functions/worker/JavaWorkerClient.java
@@ -12,7 +12,7 @@
import com.microsoft.azure.functions.worker.broker.*;
import com.microsoft.azure.functions.worker.handler.*;
-import com.microsoft.azure.functions.worker.reflect.*;
+import com.microsoft.azure.functions.worker.classloader.*;
import com.microsoft.azure.functions.rpc.messages.*;
/**
diff --git a/src/main/java/com/microsoft/azure/functions/worker/binding/BindingDataStore.java b/src/main/java/com/microsoft/azure/functions/worker/binding/BindingDataStore.java
index 3ab1637b..5b18f4d7 100644
--- a/src/main/java/com/microsoft/azure/functions/worker/binding/BindingDataStore.java
+++ b/src/main/java/com/microsoft/azure/functions/worker/binding/BindingDataStore.java
@@ -6,12 +6,11 @@
import java.util.List;
import java.util.Map;
import java.util.Optional;
-import java.util.UUID;
import com.microsoft.azure.functions.ExecutionContext;
import com.microsoft.azure.functions.rpc.messages.ParameterBinding;
import com.microsoft.azure.functions.rpc.messages.TypedData;
-import com.microsoft.azure.functions.worker.broker.CoreTypeResolver;
+import com.microsoft.azure.functions.worker.converter.CoreTypeConverter;
import org.apache.commons.lang3.exception.ExceptionUtils;
@@ -21,16 +20,22 @@
* Thread-safety: Single thread.
*/
public final class BindingDataStore {
+
+ private final Map targets;
+ private final Map> inputSources;
+ private final Map> otherSources;
+ private final Map> metadataSources;
+ private Map definitions;
+ public static final String RETURN_NAME = "$return";
+
public BindingDataStore() {
this.targets = new HashMap<>();
this.inputSources = new HashMap<>();
this.otherSources = new HashMap<>();
this.metadataSources = new HashMap<>();
- this.promotedTargets = null;
}
- ///////////////////////// region Input Binding Data
-
+ //Logics for input Binding Data
public void addParameterSources(List parameters) {
assert parameters != null;
for (ParameterBinding parameter : parameters) {
@@ -92,24 +97,21 @@ private static DataSource> rpcSourceFromParameter(ParameterBinding parameter)
return rpcSourceFromTypedData(parameter.getName(), parameter.getData());
}
- ///////////////////////// end region Input Binding Data
-
- ///////////////////////// region Output Binding Data
- public List getOutputParameterBindings(boolean excludeReturn) throws Exception {
+ //Logics for output Binding Data
+ public List getOutputParameterBindings() throws Exception {
List bindings = new ArrayList<>();
- for (Map.Entry entry : this.getTarget(this.promotedTargets).entrySet()) {
- if (!excludeReturn || !entry.getKey().equals(RETURN_NAME)) {
- entry.getValue().computeFromValue().ifPresent(data ->
- bindings.add(ParameterBinding.newBuilder().setName(entry.getKey()).setData(data).build())
- );
- }
+ for (String key : this.targets.keySet()) {
+ if (key.equals(RETURN_NAME)) continue;
+ DataTarget dataTarget = this.targets.get(key);
+ dataTarget.computeFromValue().ifPresent(data ->
+ bindings.add(ParameterBinding.newBuilder().setName(key).setData(data).build()));
}
return bindings;
}
public Optional getDataTargetTypedValue(String name) throws Exception{
- return Optional.ofNullable(this.getTarget(this.promotedTargets).get(name)).map(o -> {
+ return Optional.ofNullable(this.targets.get(name)).map(o -> {
try {
return o.computeFromValue().orElse(null);
} catch (Exception ex) {
@@ -119,48 +121,37 @@ public Optional getDataTargetTypedValue(String name) throws Exception
});
}
- public Optional getOrAddDataTarget(UUID outputId, String name, Type target, boolean hasImplicitOutput) {
+ public Optional getOrAddDataTarget(String name, Type target, boolean hasImplicitOutput) {
DataTarget output = null;
if (this.isDataTargetValid(name, target)) {
- output = this.getTarget(outputId).get(name);
+ output = this.targets.get(name);
if (output == null && (this.isDefinitionOutput(name) || hasImplicitOutput)) {
- this.getTarget(outputId).put(name, output = rpcDataTargetFromType(target));
+ this.targets.put(name, output = rpcDataTargetFromType(target));
}
}
- return Optional.ofNullable(output).map(out -> new BindingData(out));
+ return Optional.ofNullable(output).map(BindingData::new);
}
public void setDataTargetValue(String name, Object value) {
- Optional.ofNullable(this.getTarget(this.promotedTargets).get(name)).ifPresent(out -> out.setValue(value));
- }
-
- public void promoteDataTargets(UUID outputId) {
- this.promotedTargets = outputId;
- }
-
- private Map getTarget(UUID outputId) {
- return this.targets.computeIfAbsent(outputId, m -> new HashMap<>());
+ Optional.ofNullable(this.targets.get(name)).ifPresent(out -> out.setValue(value));
}
private boolean isDataTargetValid(String name, Type target) {
if (!name.equals(RETURN_NAME)) {
- if (!CoreTypeResolver.isValidOutputType(target)) { return false; }
- target = CoreTypeResolver.getParameterizedActualTypeArgumentsType(target);
+ if (!CoreTypeConverter.isValidOutputType(target)) { return false; }
+ target = CoreTypeConverter.getParameterizedActualTypeArgumentsType(target);
}
return true;
}
private static DataTarget rpcDataTargetFromType(Type target) {
- if (CoreTypeResolver.isHttpResponse(target)) {
+ if (CoreTypeConverter.isHttpResponse(target)) {
return new RpcHttpDataTarget();
}
return new RpcUnspecifiedDataTarget();
}
- ///////////////////////// end region Output Binding Data
-
- ///////////////////////// region Binding Definitions
-
+ //Logics for binding Definitions
public void setBindingDefinitions(Map definitions) {
this.definitions = definitions;
}
@@ -172,14 +163,4 @@ private boolean isDefinitionOutput(String name) {
private Optional getDefinition(String name) {
return Optional.ofNullable(this.definitions.get(name));
}
-
- ///////////////////////// endregion Binding Definitions
-
- private UUID promotedTargets;
- private final Map> targets;
- private final Map> inputSources;
- private final Map> otherSources;
- private final Map> metadataSources;
- private Map definitions;
- public static final String RETURN_NAME = "$return";
}
diff --git a/src/main/java/com/microsoft/azure/functions/worker/binding/DataOperations.java b/src/main/java/com/microsoft/azure/functions/worker/binding/DataOperations.java
index 3164c0bb..a5c28e9a 100644
--- a/src/main/java/com/microsoft/azure/functions/worker/binding/DataOperations.java
+++ b/src/main/java/com/microsoft/azure/functions/worker/binding/DataOperations.java
@@ -1,10 +1,7 @@
package com.microsoft.azure.functions.worker.binding;
-import java.io.IOException;
import java.lang.reflect.Type;
import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Base64;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
@@ -15,13 +12,11 @@
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.apache.commons.lang3.reflect.TypeUtils;
-import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonParser;
import com.google.gson.JsonSyntaxException;
-import com.google.gson.reflect.*;
import com.microsoft.azure.functions.worker.WorkerLogManager;
-import com.microsoft.azure.functions.worker.broker.CoreTypeResolver;
+import com.microsoft.azure.functions.worker.converter.CoreTypeConverter;
@FunctionalInterface
interface CheckedFunction {
@@ -101,7 +96,7 @@ Optional apply(T sourceValue, Type targetType) {
// Try POJO
if (Collection.class.isAssignableFrom(TypeUtils.getRawType(targetType, null))) {
- Class> collectionItemType = (Class>) CoreTypeResolver
+ Class> collectionItemType = (Class>) CoreTypeConverter
.getParameterizedActualTypeArgumentsType(targetType);
try {
@@ -185,7 +180,7 @@ static Object generalAssignment(Object value, Type target) {
if (value == null) {
return ObjectUtils.NULL;
}
- if (CoreTypeResolver.getRuntimeClass(target).isAssignableFrom(value.getClass())) {
+ if (CoreTypeConverter.getRuntimeClass(target).isAssignableFrom(value.getClass())) {
return value;
}
throw new ClassCastException("Cannot convert " + value + "to type " + target.getTypeName());
diff --git a/src/main/java/com/microsoft/azure/functions/worker/broker/FunctionDefinition.java b/src/main/java/com/microsoft/azure/functions/worker/broker/FunctionDefinition.java
index eb42c200..f5051a13 100644
--- a/src/main/java/com/microsoft/azure/functions/worker/broker/FunctionDefinition.java
+++ b/src/main/java/com/microsoft/azure/functions/worker/broker/FunctionDefinition.java
@@ -3,7 +3,7 @@
import com.microsoft.azure.functions.rpc.messages.BindingInfo;
import com.microsoft.azure.functions.worker.binding.BindingDefinition;
import com.microsoft.azure.functions.worker.description.FunctionMethodDescriptor;
-import com.microsoft.azure.functions.worker.reflect.ClassLoaderProvider;
+import com.microsoft.azure.functions.worker.classloader.ClassLoaderProvider;
import java.lang.reflect.Method;
import java.util.ArrayList;
diff --git a/src/main/java/com/microsoft/azure/functions/worker/broker/JavaFunctionBroker.java b/src/main/java/com/microsoft/azure/functions/worker/broker/JavaFunctionBroker.java
index a855e7c9..cd24a662 100644
--- a/src/main/java/com/microsoft/azure/functions/worker/broker/JavaFunctionBroker.java
+++ b/src/main/java/com/microsoft/azure/functions/worker/broker/JavaFunctionBroker.java
@@ -19,7 +19,7 @@
import com.microsoft.azure.functions.worker.chain.FunctionExecutionMiddleware;
import com.microsoft.azure.functions.worker.chain.InvocationChainFactory;
import com.microsoft.azure.functions.worker.description.FunctionMethodDescriptor;
-import com.microsoft.azure.functions.worker.reflect.ClassLoaderProvider;
+import com.microsoft.azure.functions.worker.classloader.ClassLoaderProvider;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.apache.commons.lang3.tuple.ImmutablePair;
@@ -122,7 +122,7 @@ public Optional invokeMethod(String id, InvocationRequest request, Li
throws Exception {
ExecutionContextDataSource executionContextDataSource = buildExecutionContext(id, request);
invoke(executionContextDataSource);
- outputs.addAll(executionContextDataSource.getDataStore().getOutputParameterBindings(true));
+ outputs.addAll(executionContextDataSource.getDataStore().getOutputParameterBindings());
return executionContextDataSource.getDataStore().getDataTargetTypedValue(BindingDataStore.RETURN_NAME);
}
diff --git a/src/main/java/com/microsoft/azure/functions/worker/broker/JavaMethodExecutor.java b/src/main/java/com/microsoft/azure/functions/worker/broker/JavaMethodExecutor.java
index 759f575f..03585d88 100644
--- a/src/main/java/com/microsoft/azure/functions/worker/broker/JavaMethodExecutor.java
+++ b/src/main/java/com/microsoft/azure/functions/worker/broker/JavaMethodExecutor.java
@@ -1,6 +1,7 @@
package com.microsoft.azure.functions.worker.broker;
import com.microsoft.azure.functions.worker.binding.*;
+import com.microsoft.azure.functions.worker.converter.ParameterConverter;
/**
* Used to executor of arbitrary Java method in any JAR using reflection.
@@ -17,9 +18,9 @@ public static JavaMethodExecutor getInstance(){
private JavaMethodExecutor() {}
public void execute(ExecutionContextDataSource executionContextDataSource) throws Exception {
- Object retValue = ParameterResolver.resolveArguments(executionContextDataSource)
+ Object retValue = ParameterConverter.resolveArguments(executionContextDataSource)
.orElseThrow(() -> new NoSuchMethodException("Cannot locate the method signature with the given input"))
- .invoke(executionContextDataSource::getFunctionInstance);
+ .invoke(executionContextDataSource.getFunctionInstance());
executionContextDataSource.updateReturnValue(retValue);
}
}
diff --git a/src/main/java/com/microsoft/azure/functions/worker/broker/JavaMethodInvokeInfo.java b/src/main/java/com/microsoft/azure/functions/worker/broker/JavaMethodInvokeInfo.java
deleted file mode 100644
index a60615ef..00000000
--- a/src/main/java/com/microsoft/azure/functions/worker/broker/JavaMethodInvokeInfo.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package com.microsoft.azure.functions.worker.broker;
-
-import java.lang.reflect.*;
-import java.util.*;
-
-import org.apache.commons.lang3.exception.*;
-
-interface InstanceSupplier {
- Object get() throws Exception;
-}
-
-/**
- * Used to run the actual method with specific arguments using reflection.
- * Thread-Safety: Single thread.
- */
-class JavaMethodInvokeInfo {
- private JavaMethodInvokeInfo() {}
-
- Object invoke(InstanceSupplier instanceSupplier) throws Exception {
- Object instance = Modifier.isStatic(this.m.getModifiers()) ? null : instanceSupplier.get();
- try {
- return this.m.invoke(instance, this.args);
- } catch (Exception ex) {
- return ExceptionUtils.rethrow(ex);
- }
- }
-
- private Method m;
- private Object[] args;
-
- static class Builder {
- Builder() {
- this.info = new JavaMethodInvokeInfo();
- this.arguments = new LinkedList<>();
- }
-
- JavaMethodInvokeInfo build() {
- assert this.info.m != null;
- this.info.args = this.arguments.toArray();
- return this.info;
- }
-
- void setMethod(Method method) { this.info.m = method; }
- void appendArgument(Object argument) { this.arguments.add(argument); }
-
- private JavaMethodInvokeInfo info;
- private List