From 0b8da6d54bb8d88cffc63c5130efd6ed6131a344 Mon Sep 17 00:00:00 2001 From: Sebastian Heunke Date: Mon, 4 May 2020 16:32:50 +0200 Subject: [PATCH 01/33] Removed Sun depedencies. Updated Java Version to 14. --- pom.xml | 20 +++++++------------ .../awslambda/InputTypeEntity.java | 4 ++-- .../awslambda/OutputTypeEntity.java | 9 +++++---- .../podilizerproc/awslambda/PoJoEntity.java | 12 +++++------ .../zhaw/splab/podilizerproc/util/Pair.java | 4 ++++ 5 files changed, 24 insertions(+), 25 deletions(-) create mode 100644 src/main/java/ch/zhaw/splab/podilizerproc/util/Pair.java diff --git a/pom.xml b/pom.xml index fc4d73c..5cf4a29 100644 --- a/pom.xml +++ b/pom.xml @@ -10,8 +10,8 @@ UTF-8 - 1.8 - 1.8.2 + 14 + 1.9.5 @@ -25,13 +25,6 @@ maven-model 2.2.1 - - com.sun.tools - tools - ${java.version} - system - ${java.home}/../lib/tools.jar - org.aspectj aspectjrt @@ -56,9 +49,10 @@ com.amazonaws aws-java-sdk-lambda - 1.11.60 + 1.11.774 + @@ -66,10 +60,10 @@ org.apache.maven.plugins maven-compiler-plugin - 3.6.0 + 3.8.1 - 1.8 - 1.8 + 14 + 14 -proc:none diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/InputTypeEntity.java b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/InputTypeEntity.java index 75c328d..0f0d9a9 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/InputTypeEntity.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/InputTypeEntity.java @@ -1,8 +1,8 @@ package ch.zhaw.splab.podilizerproc.awslambda; import com.sun.source.tree.VariableTree; -import javafx.util.Pair; +import java.util.AbstractMap; import java.util.List; /** @@ -14,7 +14,7 @@ public InputTypeEntity(String className, List params) { super(className); for (VariableTree var : params) { - fields.add(new Pair<>(var.getType().toString(), var.getName().toString())); + fields.add(new AbstractMap.SimpleEntry(var.getType().toString(), var.getName().toString())); } } } diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/OutputTypeEntity.java b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/OutputTypeEntity.java index 94e9edf..8bfeacd 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/OutputTypeEntity.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/OutputTypeEntity.java @@ -1,7 +1,8 @@ package ch.zhaw.splab.podilizerproc.awslambda; import com.sun.source.tree.Tree; -import javafx.util.Pair; + +import java.util.AbstractMap; /** * PoJo class entity for output type @@ -10,10 +11,10 @@ public class OutputTypeEntity extends PoJoEntity { public OutputTypeEntity(String className, Tree returnType) { super(className); - fields.add(new Pair<>("String", "defaultReturn")); - fields.add(new Pair<>("long", "time")); + fields.add(new AbstractMap.SimpleEntry<>("String", "defaultReturn")); + fields.add(new AbstractMap.SimpleEntry<>("long", "time")); if (!returnType.toString().equals("void")) { - fields.add(new Pair<>(returnType.toString(), "result")); + fields.add(new AbstractMap.SimpleEntry<>(returnType.toString(), "result")); } } } diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/PoJoEntity.java b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/PoJoEntity.java index dca8c84..1672d7f 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/PoJoEntity.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/PoJoEntity.java @@ -1,13 +1,13 @@ package ch.zhaw.splab.podilizerproc.awslambda; -import javafx.util.Pair; +import java.util.AbstractMap; import java.util.ArrayList; import java.util.List; public abstract class PoJoEntity { private String className; - protected List> fields; + protected List> fields; public PoJoEntity(String className) { this.className = className; @@ -46,7 +46,7 @@ private String generateConstructor() { String result = "\tpublic " + className + "("; String constructorBody = ""; int i = 0; - for (Pair entry : fields) { + for (AbstractMap.SimpleEntry entry : fields) { String var = entry.getKey() + " " + entry.getValue(); if (i == 0) { result += var; @@ -67,7 +67,7 @@ private String generateConstructor() { */ private String generateGetters() { String result = ""; - for (Pair entry : fields) { + for (AbstractMap.SimpleEntry entry : fields) { result += "\tpublic " + entry.getKey() + " get" + Utility.firstLetterToUpperCase(entry.getValue() + "(){\n" + "\t\treturn " + entry.getValue() + ";\n\t}\n"); @@ -82,7 +82,7 @@ private String generateGetters() { */ private String generateSetters() { String result = ""; - for (Pair entry : fields) { + for (AbstractMap.SimpleEntry entry : fields) { result += "\tpublic void set" + Utility.firstLetterToUpperCase(entry.getValue() + "(" + entry.getKey() + " " + entry.getValue() + "){\n" + "\t\tthis." + entry.getValue() + " = " + entry.getValue() + ";\n\t}\n"); @@ -97,7 +97,7 @@ private String generateSetters() { */ private String generateFieldsDeclaration() { String result = ""; - for (Pair entry : fields) { + for (AbstractMap.SimpleEntry entry : fields) { result += "\tprivate " + entry.getKey() + " " + entry.getValue() + ";\n"; } return result; diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/util/Pair.java b/src/main/java/ch/zhaw/splab/podilizerproc/util/Pair.java new file mode 100644 index 0000000..5dbd815 --- /dev/null +++ b/src/main/java/ch/zhaw/splab/podilizerproc/util/Pair.java @@ -0,0 +1,4 @@ +package ch.zhaw.splab.podilizerproc.util; + +public class Pair { +} From 5b61e014566b6f711a0c4e9188f899acaf2e129c Mon Sep 17 00:00:00 2001 From: Sebastian Heunke Date: Mon, 4 May 2020 17:20:41 +0200 Subject: [PATCH 02/33] Changed java target version because of depedency --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 5cf4a29..a890086 100644 --- a/pom.xml +++ b/pom.xml @@ -62,8 +62,8 @@ maven-compiler-plugin 3.8.1 - 14 - 14 + 11 + 11 -proc:none From 35777d93f0abddab10df40a58d806d3b3952bebd Mon Sep 17 00:00:00 2001 From: Sebastian Heunke Date: Mon, 4 May 2020 17:21:21 +0200 Subject: [PATCH 03/33] Added Envvar lookup as maven home fallback. --- .../ch/zhaw/splab/podilizerproc/awslambda/JarBuilder.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/JarBuilder.java b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/JarBuilder.java index 46cce14..3ea3741 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/JarBuilder.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/JarBuilder.java @@ -46,7 +46,11 @@ public void setPath(String path) { Invoker invoker = new DefaultInvoker(); try { if (invoker.getMavenHome() == null) { - invoker.setMavenHome(new File("/usr/share/maven/")); + String mavenHome = System.getenv("MAVEN_HOME"); + if (mavenHome == null || mavenHome.isEmpty()) { + mavenHome = "/usr/share/maven/"; + } + invoker.setMavenHome(new File(mavenHome)); } //log the build output to file PrintStream printStream = new PrintStream(buildLog); From 8af896c2486c8de626ba38c1a2786740db3d4587 Mon Sep 17 00:00:00 2001 From: Sebastian Heunke Date: Tue, 12 May 2020 19:17:13 +0200 Subject: [PATCH 04/33] Minor fixes including: * Better identificaiton of injected ctor * Changed default role to better reflect current setup * Changed file delimiter to be more consistent --- Termite.iml | 35 +++++++++++++++++++ .../annotations/LambdaProcessor.java | 2 ++ .../splab/podilizerproc/aspect/Invoke.java | 1 + .../podilizerproc/awslambda/Functions.java | 7 ++-- .../podilizerproc/awslambda/InvokeThread.java | 19 +++++----- .../podilizerproc/awslambda/JarUploader.java | 3 +- 6 files changed, 55 insertions(+), 12 deletions(-) create mode 100644 Termite.iml diff --git a/Termite.iml b/Termite.iml new file mode 100644 index 0000000..dbc7772 --- /dev/null +++ b/Termite.iml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java b/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java index e6e9ab2..a8de2c0 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java @@ -81,6 +81,8 @@ public boolean process(Set annotations, RoundEnvironment writer1.append(lambdaFunction.createOutputType()); writer.flush(); writer1.flush(); + writer.close(); + writer1.close(); } catch (IOException e) { e.printStackTrace(); } diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java b/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java index a511ecf..579f7ac 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java @@ -14,6 +14,7 @@ public class Invoke { @Around("@annotation(lambda)") public Object anyExec(ProceedingJoinPoint joinPoint, ch.zhaw.splab.podilizerproc.annotations.Lambda lambda) throws Throwable { + System.out.println("[TERMITE] Annotation invoked"); MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java index ae40c48..3515fe7 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java @@ -57,9 +57,10 @@ public void write(){ jarBuilder.mvnBuild(); - JarUploader jarUploader = new JarUploader(function.getLambdaFunctionName(), - function.getAwsFiler().getPomPath().toString() + "/target/lambda-java-1.0-SNAPSHOT.jar", - "LambdaFunction::handleRequest", + String lamdaJarLocation = function.getAwsFiler().getPomPath().toString(); + lamdaJarLocation = lamdaJarLocation.replace('\\', '/') + "/target/lambda-java-1.0-SNAPSHOT.jar"; + + JarUploader jarUploader = new JarUploader(function.getLambdaFunctionName(), lamdaJarLocation, "LambdaFunction::handleRequest", function.getLambdaAnnotation().region(), function.getLambdaAnnotation().timeOut(), function.getLambdaAnnotation().memorySize(), function.getLambdaAnnotation().endPoint()); jarUploader.uploadFunction(); diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/InvokeThread.java b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/InvokeThread.java index 7f86535..c3b8258 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/InvokeThread.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/InvokeThread.java @@ -12,10 +12,12 @@ import com.fasterxml.jackson.databind.SerializationFeature; import org.aspectj.lang.ProceedingJoinPoint; +import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.nio.ByteBuffer; import java.nio.charset.Charset; +import java.util.Arrays; public class InvokeThread extends Thread { private Method method; @@ -59,15 +61,16 @@ public void run() { objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); String json = ""; try { - Object inputObj = inClazz.getConstructors()[0].newInstance(joinPoint.getArgs()); + Constructor correctCtor = null; + for (Constructor constructor : inClazz.getConstructors()) { + if (constructor.getParameterCount() == joinPoint.getArgs().length) { + correctCtor = constructor; + break; + } + } + Object inputObj = correctCtor.newInstance(joinPoint.getArgs()); json = objectMapper.writeValueAsString(inputObj); - } catch (InstantiationException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { - e.printStackTrace(); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } catch (JsonProcessingException e) { + } catch (InstantiationException | IllegalAccessException | InvocationTargetException | JsonProcessingException e) { e.printStackTrace(); } Object outObj = null; diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/JarUploader.java b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/JarUploader.java index f8753d2..182db57 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/JarUploader.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/JarUploader.java @@ -48,7 +48,7 @@ public void run() { try { if (command.startsWith("aws sts")) { //System.out.println("\n\naws sts output: " + input.readLine() + "\n\n"); - role = "arn:aws:iam::" + input.readLine() + ":role/lambda_basic_execution"; + role = "arn:aws:iam::" + input.readLine() + ":role/service-role/lambda_basic_execution"; return; } // while ((line = input.readLine()) != null) @@ -108,6 +108,7 @@ private String getCommand() { if (!endPoint.equals("")){ result += " --endpoint-url " + endPoint; } + System.out.println("[TERMITE] Building Command:\n" + result); return result; } From 6a69400a32159a405ab2ebf2c47aad54550a49f3 Mon Sep 17 00:00:00 2001 From: Sebastian Heunke Date: Thu, 14 May 2020 13:10:10 +0200 Subject: [PATCH 05/33] Changed generated files to be java 11 --- pom.xml | 2 +- .../zhaw/splab/podilizerproc/awslambda/JarUploader.java | 2 +- .../zhaw/splab/podilizerproc/awslambda/PomGenerator.java | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index a890086..467cb11 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ UTF-8 - 14 + 11 1.9.5 diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/JarUploader.java b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/JarUploader.java index 182db57..911ed6d 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/JarUploader.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/JarUploader.java @@ -9,7 +9,7 @@ class JarUploader { private String region; - private String runtime = "java8"; + private String runtime = "java11"; private String role; private String functionName; private String zipFile; diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/PomGenerator.java b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/PomGenerator.java index 8ffc85b..b537a60 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/PomGenerator.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/PomGenerator.java @@ -35,8 +35,8 @@ public void create() { } Properties proper = model.getProperties(); - proper.setProperty("maven.compiler.source", "1.8"); - proper.setProperty("maven.compiler.target", "1.8"); + proper.setProperty("maven.compiler.source", "11"); + proper.setProperty("maven.compiler.target", "11"); Build build = new Build(); Plugin plugin = new Plugin(); @@ -79,8 +79,8 @@ private List dependencies() { List dependencies = new ArrayList<>(); String[][] dependenciesAtributes = {{"com.amazonaws", "aws-lambda-java-core", "1.1.0"}, - {"com.amazonaws", "aws-java-sdk-lambda", "1.11.60"}, - {"org.aspectj", "aspectjrt", "1.8.2"}, + {"com.amazonaws", "aws-java-sdk-lambda", "1.11.774"}, + {"org.aspectj", "aspectjrt", "1.9.5"}, {"com.googlecode.json-simple", "json-simple", "1.1"}, {"com.fasterxml.jackson.core", "jackson-annotations", "2.8.5"}}; for (int i = 0; i < dependenciesAtributes.length; i++) { From 68b054f8629be95c80e1c0418f307a9cb70c4122 Mon Sep 17 00:00:00 2001 From: Sebastian Heunke Date: Thu, 14 May 2020 13:51:15 +0200 Subject: [PATCH 06/33] Changed some depedencie to avoid aws-create problems. --- .../ch/zhaw/splab/podilizerproc/awslambda/PomGenerator.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/PomGenerator.java b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/PomGenerator.java index b537a60..4507961 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/PomGenerator.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/PomGenerator.java @@ -79,8 +79,8 @@ private List dependencies() { List dependencies = new ArrayList<>(); String[][] dependenciesAtributes = {{"com.amazonaws", "aws-lambda-java-core", "1.1.0"}, - {"com.amazonaws", "aws-java-sdk-lambda", "1.11.774"}, - {"org.aspectj", "aspectjrt", "1.9.5"}, + {"com.amazonaws", "aws-java-sdk-lambda", "1.11.60"}, + {"org.aspectj", "aspectjrt", "1.8.2"}, {"com.googlecode.json-simple", "json-simple", "1.1"}, {"com.fasterxml.jackson.core", "jackson-annotations", "2.8.5"}}; for (int i = 0; i < dependenciesAtributes.length; i++) { From 6e197c10af3403ea7c6d9431e92aee7ca6072ccc Mon Sep 17 00:00:00 2001 From: Sebastian Heunke Date: Tue, 19 May 2020 15:50:57 +0200 Subject: [PATCH 07/33] Added some notes for later implementations. --- .../annotations/LambdaProcessor.java | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java b/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java index a8de2c0..99e3c23 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java @@ -2,9 +2,7 @@ import ch.zhaw.splab.podilizerproc.awslambda.Functions; import ch.zhaw.splab.podilizerproc.awslambda.LambdaFunction; -import com.sun.source.tree.ClassTree; -import com.sun.source.tree.CompilationUnitTree; -import com.sun.source.tree.MethodTree; +import com.sun.source.tree.*; import com.sun.source.util.SimpleTreeVisitor; import com.sun.source.util.TreePath; import com.sun.source.util.TreePathScanner; @@ -14,6 +12,10 @@ import javax.lang.model.SourceVersion; import javax.lang.model.element.Element; import javax.lang.model.element.TypeElement; +import javax.lang.model.type.ExecutableType; +import javax.lang.model.type.TypeKind; +import javax.lang.model.type.TypeMirror; +import javax.lang.model.util.Types; import javax.tools.Diagnostic; import javax.tools.JavaFileObject; import java.io.IOException; @@ -26,6 +28,7 @@ @SupportedAnnotationTypes({"ch.zhaw.splab.podilizerproc.annotations.Lambda"}) public class LambdaProcessor extends AbstractProcessor { private Trees trees; + private Types typeUtils; /** * Initialization of {@link ProcessEnvironment} object and {@link Trees} object @@ -37,11 +40,13 @@ public synchronized void init(ProcessingEnvironment processingEnv) { super.init(processingEnv); trees = Trees.instance(processingEnv); + System.out.println("[TERMITE] Annotation Proccessor init."); + typeUtils = processingEnv.getTypeUtils(); + } public boolean process(Set annotations, RoundEnvironment roundEnv) { - ; List functions = new ArrayList<>(); Set annotatedMethods = roundEnv.getElementsAnnotatedWith(Lambda.class); @@ -55,6 +60,14 @@ public boolean process(Set annotations, RoundEnvironment TypeScanner typeScanner = new TypeScanner(); CUVisitor cuVisitor = new CUVisitor(); + //TODO: Find and package non primitive types. + // ExecutableType emeth = (ExecutableType)element.asType(); + // 1. Passed parameters + // 2. Return parameters + // 3. locally used types. (Hardest) + // for (TypeMirror parameterType : emeth.getParameterTypes()) { + // Element element1 = typeUtils.asElement(parameterType); + TreePath tp = trees.getPath(element); methodScanner.scan(tp, trees); From 314cf6eaf9a2ef809988bd58c72c900b9e01d6d2 Mon Sep 17 00:00:00 2001 From: Sebastian Heunke Date: Tue, 26 May 2020 14:13:38 +0200 Subject: [PATCH 08/33] Changed lambda invocation to be blocking. --- .../splab/podilizerproc/aspect/Invoke.java | 4 +++- .../podilizerproc/awslambda/InvokeThread.java | 23 +++++++++++++------ 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java b/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java index 579f7ac..8552030 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java @@ -20,7 +20,9 @@ public Object anyExec(ProceedingJoinPoint joinPoint, InvokeThread invokeThread = new InvokeThread(method, lambda, joinPoint); invokeThread.start(); - return null; + + // TODO try catch arround this get with fallback + return invokeThread.getLambdaResult().get(); } } diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/InvokeThread.java b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/InvokeThread.java index c3b8258..48b0dc3 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/InvokeThread.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/InvokeThread.java @@ -18,12 +18,15 @@ import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.util.Arrays; +import java.util.concurrent.CompletableFuture; public class InvokeThread extends Thread { private Method method; private Lambda lambda; private ProceedingJoinPoint joinPoint; + private final CompletableFuture lambdaResult = new CompletableFuture<>(); + public InvokeThread(Method method, Lambda lambda, ProceedingJoinPoint joinPoint) { super(); this.method = method; @@ -74,22 +77,28 @@ public void run() { e.printStackTrace(); } Object outObj = null; + Object methodResult = null; + try { InvokeRequest invokeRequest = new InvokeRequest(); invokeRequest.setFunctionName(functionName); invokeRequest.setPayload(json); outObj = objectMapper.readValue(byteBufferToString(lambdaClient.invoke(invokeRequest).getPayload(), Charset.forName("UTF-8")), outClazz); + outObj.getClass().getD + methodResult = outObj.getClass().getDeclaredMethod("getResult").invoke(outObj); } catch (Exception e) { e.printStackTrace(); System.out.println("Function " + method.getName() + " is unreachable. Processing locally..."); try { - Object tmp = joinPoint.proceed(); + methodResult = joinPoint.proceed(joinPoint.getArgs()); } catch (Throwable throwable) { throwable.printStackTrace(); } - } + System.out.println("Continuing with result: " + methodResult); + lambdaResult.complete(methodResult); + try { String functionReport = "Thread of Function " + method.getName() + " invocation was finished. " + "Function performed at - " + outObj.getClass().getDeclaredMethod("getDefaultReturn", null).invoke(outObj) + @@ -98,11 +107,7 @@ public void run() { functionReport += "; Return value is: " + outObj.getClass().getDeclaredMethod("getResult", null).invoke(outObj); } System.out.println(functionReport); - } catch (NoSuchMethodException e) { - e.printStackTrace(); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { + } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { e.printStackTrace(); } } @@ -152,4 +157,8 @@ public static String byteBufferToString(ByteBuffer buffer, Charset charset) { } return new String(bytes, charset); } + + public CompletableFuture getLambdaResult() { + return lambdaResult; + } } From 4ea12b6f88a2e66810742a7d038d7a81d2e2eb3b Mon Sep 17 00:00:00 2001 From: Sebastian Heunke Date: Tue, 26 May 2020 14:41:36 +0200 Subject: [PATCH 09/33] Fixed retun values for invoked void methods. --- .../splab/podilizerproc/awslambda/InvokeThread.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/InvokeThread.java b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/InvokeThread.java index 48b0dc3..a2080d8 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/InvokeThread.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/InvokeThread.java @@ -11,12 +11,14 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.reflect.MethodSignature; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.nio.ByteBuffer; import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.concurrent.CompletableFuture; @@ -84,9 +86,13 @@ public void run() { invokeRequest.setFunctionName(functionName); invokeRequest.setPayload(json); outObj = objectMapper.readValue(byteBufferToString(lambdaClient.invoke(invokeRequest).getPayload(), - Charset.forName("UTF-8")), outClazz); - outObj.getClass().getD - methodResult = outObj.getClass().getDeclaredMethod("getResult").invoke(outObj); + StandardCharsets.UTF_8), outClazz); + + Class returnType = ((MethodSignature) joinPoint.getSignature()).getReturnType(); + if (!returnType.equals(void.class)) { + // GetResult is only generated for non void methods + methodResult = outObj.getClass().getDeclaredMethod("getResult").invoke(outObj); + } } catch (Exception e) { e.printStackTrace(); System.out.println("Function " + method.getName() + " is unreachable. Processing locally..."); From 20f84c50860787e8127d333ae6bd91be7cebf60c Mon Sep 17 00:00:00 2001 From: Sebastian Heunke Date: Tue, 26 May 2020 16:05:37 +0200 Subject: [PATCH 10/33] Added Util class which allows async dispatching of (lambda) functions. --- .../splab/podilizerproc/util/AsyncLambda.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/main/java/ch/zhaw/splab/podilizerproc/util/AsyncLambda.java diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/util/AsyncLambda.java b/src/main/java/ch/zhaw/splab/podilizerproc/util/AsyncLambda.java new file mode 100644 index 0000000..a397076 --- /dev/null +++ b/src/main/java/ch/zhaw/splab/podilizerproc/util/AsyncLambda.java @@ -0,0 +1,28 @@ +package ch.zhaw.splab.podilizerproc.util; + +import java.util.concurrent.Callable; +import java.util.concurrent.CompletableFuture; + +public class AsyncLambda { + + private AsyncLambda() {} + + public static CompletableFuture dispatch(Callable func) { + CompletableFuture result = new CompletableFuture<>(); + new Thread(() -> { + try { + result.complete(func.call()); + } catch (Exception e) { + result.completeExceptionally(e); + } + }).start(); + return result; + } + + public static CompletableFuture dispatch(Runnable func) { + return AsyncLambda.dispatch(() -> { + func.run(); + return null; + }); + } +} From c0adc21c1d84a1c9511159ccd7d486ac527d0f14 Mon Sep 17 00:00:00 2001 From: Sebastian Heunke Date: Tue, 26 May 2020 16:53:47 +0200 Subject: [PATCH 11/33] Made default handling of invocations synchronous. --- .../splab/podilizerproc/aspect/Invoke.java | 151 +++++++++++++++- .../podilizerproc/awslambda/InvokeThread.java | 170 ------------------ 2 files changed, 145 insertions(+), 176 deletions(-) delete mode 100644 src/main/java/ch/zhaw/splab/podilizerproc/awslambda/InvokeThread.java diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java b/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java index 8552030..b39563e 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java @@ -1,28 +1,167 @@ package ch.zhaw.splab.podilizerproc.aspect; -import ch.zhaw.splab.podilizerproc.awslambda.InvokeThread; +import ch.zhaw.splab.podilizerproc.annotations.Lambda; +import ch.zhaw.splab.podilizerproc.awslambda.AwsCredentialsReader; +import com.amazonaws.auth.AWSCredentials; +import com.amazonaws.auth.BasicAWSCredentials; +import com.amazonaws.regions.Region; +import com.amazonaws.regions.Regions; +import com.amazonaws.services.lambda.AWSLambdaClient; +import com.amazonaws.services.lambda.model.InvokeRequest; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.aspectj.lang.reflect.MethodSignature; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.nio.ByteBuffer; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; @Aspect public class Invoke { @Around("@annotation(lambda)") public Object anyExec(ProceedingJoinPoint joinPoint, - ch.zhaw.splab.podilizerproc.annotations.Lambda lambda) throws Throwable { + ch.zhaw.splab.podilizerproc.annotations.Lambda lambda) { System.out.println("[TERMITE] Annotation invoked"); MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); - InvokeThread invokeThread = new InvokeThread(method, lambda, joinPoint); - invokeThread.start(); + return invokeOnLambda(method, lambda, joinPoint); + } + + private Object invokeOnLambda(Method method, Lambda lambda, ProceedingJoinPoint joinPoint) { + Class inClazz = null; + Class outClazz = null; + try { + inClazz = Class.forName(getInputPackage(method)); + outClazz = Class.forName(getOutputPackage(method)); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + AwsCredentialsReader credentialsReader = new AwsCredentialsReader(); + credentialsReader.read(); + String awsAccessKeyId = credentialsReader.getAwsAccessKeyId(); + String awsSecretKeyAccessKey = credentialsReader.getAwsSecretAccessKey(); + String regionName = lambda.region(); + String functionName = getFunctionName(method); + + AWSCredentials credentials = new BasicAWSCredentials(awsAccessKeyId, awsSecretKeyAccessKey); + Region region = Region.getRegion(Regions.fromName(regionName)); + AWSLambdaClient lambdaClient = new AWSLambdaClient(credentials); + lambdaClient.setRegion(region); + + if (!lambda.endPoint().equals("")){ + lambdaClient.setEndpoint(lambda.endPoint()); + } + + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); + String json = ""; + try { + Constructor correctCtor = null; + for (Constructor constructor : inClazz.getConstructors()) { + if (constructor.getParameterCount() == joinPoint.getArgs().length) { + correctCtor = constructor; + break; + } + } + Object inputObj = correctCtor.newInstance(joinPoint.getArgs()); + json = objectMapper.writeValueAsString(inputObj); + } catch (InstantiationException | IllegalAccessException | InvocationTargetException | JsonProcessingException e) { + e.printStackTrace(); + } + Object outObj = null; + Object methodResult = null; - // TODO try catch arround this get with fallback - return invokeThread.getLambdaResult().get(); + try { + InvokeRequest invokeRequest = new InvokeRequest(); + invokeRequest.setFunctionName(functionName); + invokeRequest.setPayload(json); + outObj = objectMapper.readValue(byteBufferToString(lambdaClient.invoke(invokeRequest).getPayload(), + StandardCharsets.UTF_8), outClazz); + + Class returnType = ((MethodSignature) joinPoint.getSignature()).getReturnType(); + if (!returnType.equals(void.class)) { + // GetResult is only generated for non void methods + methodResult = outObj.getClass().getDeclaredMethod("getResult").invoke(outObj); + } + } catch (Exception e) { + e.printStackTrace(); + System.out.println("Function " + method.getName() + " is unreachable. Processing locally..."); + try { + methodResult = joinPoint.proceed(joinPoint.getArgs()); + } catch (Throwable throwable) { + throwable.printStackTrace(); + } + } + + try { + String functionReport = "Thread of Function " + method.getName() + " invocation was finished. " + + "Function performed at - " + outObj.getClass().getDeclaredMethod("getDefaultReturn", null).invoke(outObj) + + " - for " + outObj.getClass().getDeclaredMethod("getTime", null).invoke(outObj) + " ms"; + if (!method.getReturnType().toString().equals("void")){ + functionReport += "; Return value is: " + outObj.getClass().getDeclaredMethod("getResult", null).invoke(outObj); + } + System.out.println(functionReport); + } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { + e.printStackTrace(); + } + + return methodResult; } + + + /** + * Generates package name for input type based on method signature + * + * @param method is method signature object + * @return {@link String} package name of InputType + */ + private String getInputPackage(Method method) { + String fullClassName = method.getDeclaringClass().getName(); + return "aws." + fullClassName + "." + method.getName() + method.getParameterCount() + ".InputType"; + } + + /** + * Generates package name for output type based on method signature + * + * @param method is method signature object + * @return {@link String} package name of OutputType + */ + private String getOutputPackage(Method method) { + String fullClassName = method.getDeclaringClass().getName(); + return "aws." + fullClassName + "." + method.getName() + method.getParameterCount() + ".OutputType"; + } + + /** + * Generates function name for annotated method over the load process + * + * @param method is annotated method to generate lambda function name for + * @return {@link String} name of format 'package_class_method_#argsNumber' + */ + private String getFunctionName(Method method) { + String result = method.getDeclaringClass().getName().replace('.', '_'); + result += "_" + method.getName(); + result += method.getParameterCount(); + return result; + } + + private static String byteBufferToString(ByteBuffer buffer, Charset charset) { + byte[] bytes; + if (buffer.hasArray()) { + bytes = buffer.array(); + } else { + bytes = new byte[buffer.remaining()]; + buffer.get(bytes); + } + return new String(bytes, charset); + } } diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/InvokeThread.java b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/InvokeThread.java deleted file mode 100644 index a2080d8..0000000 --- a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/InvokeThread.java +++ /dev/null @@ -1,170 +0,0 @@ -package ch.zhaw.splab.podilizerproc.awslambda; - -import ch.zhaw.splab.podilizerproc.annotations.Lambda; -import com.amazonaws.auth.AWSCredentials; -import com.amazonaws.auth.BasicAWSCredentials; -import com.amazonaws.regions.Region; -import com.amazonaws.regions.Regions; -import com.amazonaws.services.lambda.AWSLambdaClient; -import com.amazonaws.services.lambda.model.InvokeRequest; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import org.aspectj.lang.ProceedingJoinPoint; -import org.aspectj.lang.reflect.MethodSignature; - -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.nio.ByteBuffer; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; -import java.util.Arrays; -import java.util.concurrent.CompletableFuture; - -public class InvokeThread extends Thread { - private Method method; - private Lambda lambda; - private ProceedingJoinPoint joinPoint; - - private final CompletableFuture lambdaResult = new CompletableFuture<>(); - - public InvokeThread(Method method, Lambda lambda, ProceedingJoinPoint joinPoint) { - super(); - this.method = method; - this.lambda = lambda; - this.joinPoint = joinPoint; - } - - @Override - public void run() { - Class inClazz = null; - Class outClazz = null; - try { - inClazz = Class.forName(getInputPackage(method)); - outClazz = Class.forName(getOutputPackage(method)); - } catch (ClassNotFoundException e) { - e.printStackTrace(); - } - AwsCredentialsReader credentialsReader = new AwsCredentialsReader(); - credentialsReader.read(); - String awsAccessKeyId = credentialsReader.getAwsAccessKeyId(); - String awsSecretKeyAccessKey = credentialsReader.getAwsSecretAccessKey(); - String regionName = lambda.region(); - String functionName = getFunctionName(method); - - AWSCredentials credentials = new BasicAWSCredentials(awsAccessKeyId, awsSecretKeyAccessKey); - Region region = Region.getRegion(Regions.fromName(regionName)); - AWSLambdaClient lambdaClient = new AWSLambdaClient(credentials); - lambdaClient.setRegion(region); - - if (!lambda.endPoint().equals("")){ - lambdaClient.setEndpoint(lambda.endPoint()); - } - - ObjectMapper objectMapper = new ObjectMapper(); - objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); - String json = ""; - try { - Constructor correctCtor = null; - for (Constructor constructor : inClazz.getConstructors()) { - if (constructor.getParameterCount() == joinPoint.getArgs().length) { - correctCtor = constructor; - break; - } - } - Object inputObj = correctCtor.newInstance(joinPoint.getArgs()); - json = objectMapper.writeValueAsString(inputObj); - } catch (InstantiationException | IllegalAccessException | InvocationTargetException | JsonProcessingException e) { - e.printStackTrace(); - } - Object outObj = null; - Object methodResult = null; - - try { - InvokeRequest invokeRequest = new InvokeRequest(); - invokeRequest.setFunctionName(functionName); - invokeRequest.setPayload(json); - outObj = objectMapper.readValue(byteBufferToString(lambdaClient.invoke(invokeRequest).getPayload(), - StandardCharsets.UTF_8), outClazz); - - Class returnType = ((MethodSignature) joinPoint.getSignature()).getReturnType(); - if (!returnType.equals(void.class)) { - // GetResult is only generated for non void methods - methodResult = outObj.getClass().getDeclaredMethod("getResult").invoke(outObj); - } - } catch (Exception e) { - e.printStackTrace(); - System.out.println("Function " + method.getName() + " is unreachable. Processing locally..."); - try { - methodResult = joinPoint.proceed(joinPoint.getArgs()); - } catch (Throwable throwable) { - throwable.printStackTrace(); - } - } - System.out.println("Continuing with result: " + methodResult); - lambdaResult.complete(methodResult); - - try { - String functionReport = "Thread of Function " + method.getName() + " invocation was finished. " + - "Function performed at - " + outObj.getClass().getDeclaredMethod("getDefaultReturn", null).invoke(outObj) + - " - for " + outObj.getClass().getDeclaredMethod("getTime", null).invoke(outObj) + " ms"; - if (!method.getReturnType().toString().equals("void")){ - functionReport += "; Return value is: " + outObj.getClass().getDeclaredMethod("getResult", null).invoke(outObj); - } - System.out.println(functionReport); - } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { - e.printStackTrace(); - } - } - - /** - * Generates package name for input type based on method signature - * - * @param method is method signature object - * @return {@link String} package name of InputType - */ - private String getInputPackage(Method method) { - String fullClassName = method.getDeclaringClass().getName(); - return "aws." + fullClassName + "." + method.getName() + method.getParameterCount() + ".InputType"; - } - - /** - * Generates package name for output type based on method signature - * - * @param method is method signature object - * @return {@link String} package name of OutputType - */ - private String getOutputPackage(Method method) { - String fullClassName = method.getDeclaringClass().getName(); - return "aws." + fullClassName + "." + method.getName() + method.getParameterCount() + ".OutputType"; - } - - /** - * Generates function name for annotated method over the load process - * - * @param method is annotated method to generate lambda function name for - * @return {@link String} name of format 'package_class_method_#argsNumber' - */ - private String getFunctionName(Method method) { - String result = method.getDeclaringClass().getName().replace('.', '_'); - result += "_" + method.getName(); - result += method.getParameterCount(); - return result; - } - - public static String byteBufferToString(ByteBuffer buffer, Charset charset) { - byte[] bytes; - if (buffer.hasArray()) { - bytes = buffer.array(); - } else { - bytes = new byte[buffer.remaining()]; - buffer.get(bytes); - } - return new String(bytes, charset); - } - - public CompletableFuture getLambdaResult() { - return lambdaResult; - } -} From ec202fc11032a168ef47ab9e94155db66a2b2305 Mon Sep 17 00:00:00 2001 From: Sebastian Heunke Date: Tue, 26 May 2020 17:07:10 +0200 Subject: [PATCH 12/33] Updated usage of lambda api to avoid deprecated methods. --- .../splab/podilizerproc/aspect/Invoke.java | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java b/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java index b39563e..83254ed 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java @@ -4,10 +4,14 @@ import ch.zhaw.splab.podilizerproc.annotations.Lambda; import ch.zhaw.splab.podilizerproc.awslambda.AwsCredentialsReader; import com.amazonaws.auth.AWSCredentials; +import com.amazonaws.auth.AWSStaticCredentialsProvider; import com.amazonaws.auth.BasicAWSCredentials; +import com.amazonaws.client.builder.AwsClientBuilder; import com.amazonaws.regions.Region; import com.amazonaws.regions.Regions; +import com.amazonaws.services.lambda.AWSLambda; import com.amazonaws.services.lambda.AWSLambdaClient; +import com.amazonaws.services.lambda.AWSLambdaClientBuilder; import com.amazonaws.services.lambda.model.InvokeRequest; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; @@ -53,13 +57,18 @@ private Object invokeOnLambda(Method method, Lambda lambda, ProceedingJoinPoint String functionName = getFunctionName(method); AWSCredentials credentials = new BasicAWSCredentials(awsAccessKeyId, awsSecretKeyAccessKey); - Region region = Region.getRegion(Regions.fromName(regionName)); - AWSLambdaClient lambdaClient = new AWSLambdaClient(credentials); - lambdaClient.setRegion(region); + Regions region = Regions.fromName(regionName); + + + AWSLambdaClientBuilder clientBuilder = AWSLambdaClientBuilder + .standard() + .withCredentials(new AWSStaticCredentialsProvider(credentials)) + .withRegion(region); if (!lambda.endPoint().equals("")){ - lambdaClient.setEndpoint(lambda.endPoint()); + clientBuilder = clientBuilder.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(lambda.endPoint(), regionName)); } + AWSLambda awsLambda = clientBuilder.build(); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); @@ -84,7 +93,7 @@ private Object invokeOnLambda(Method method, Lambda lambda, ProceedingJoinPoint InvokeRequest invokeRequest = new InvokeRequest(); invokeRequest.setFunctionName(functionName); invokeRequest.setPayload(json); - outObj = objectMapper.readValue(byteBufferToString(lambdaClient.invoke(invokeRequest).getPayload(), + outObj = objectMapper.readValue(byteBufferToString(awsLambda.invoke(invokeRequest).getPayload(), StandardCharsets.UTF_8), outClazz); Class returnType = ((MethodSignature) joinPoint.getSignature()).getReturnType(); From c9327356018359f37e134fb3c0aa9323b3830f80 Mon Sep 17 00:00:00 2001 From: Sebastian Heunke Date: Tue, 26 May 2020 17:07:25 +0200 Subject: [PATCH 13/33] Updated usage of lambda api to avoid deprecated methods. --- src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java b/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java index 83254ed..bb72ef7 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java @@ -7,17 +7,16 @@ import com.amazonaws.auth.AWSStaticCredentialsProvider; import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.client.builder.AwsClientBuilder; -import com.amazonaws.regions.Region; import com.amazonaws.regions.Regions; import com.amazonaws.services.lambda.AWSLambda; -import com.amazonaws.services.lambda.AWSLambdaClient; import com.amazonaws.services.lambda.AWSLambdaClientBuilder; import com.amazonaws.services.lambda.model.InvokeRequest; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import org.aspectj.lang.ProceedingJoinPoint; -import org.aspectj.lang.annotation.*; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.reflect.MethodSignature; import java.lang.reflect.Constructor; From c11d4a20d6a5dc96a4059eff5085c14bec29b1c5 Mon Sep 17 00:00:00 2001 From: Sebastian Heunke Date: Sun, 7 Jun 2020 17:11:19 +0200 Subject: [PATCH 14/33] Some wip utlities to analyze the depedencies of classes. --- .../annotations/LambdaProcessor.java | 34 +++- .../podilizerproc/awslambda/Functions.java | 4 +- .../depdencies/CompilationUnitInfo.java | 59 ++++++ .../depdencies/DependencyResolver.java | 171 ++++++++++++++++++ .../depdencies/JavaPackageInfo.java | 47 +++++ 5 files changed, 309 insertions(+), 6 deletions(-) create mode 100644 src/main/java/ch/zhaw/splab/podilizerproc/depdencies/CompilationUnitInfo.java create mode 100644 src/main/java/ch/zhaw/splab/podilizerproc/depdencies/DependencyResolver.java create mode 100644 src/main/java/ch/zhaw/splab/podilizerproc/depdencies/JavaPackageInfo.java diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java b/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java index 99e3c23..4046548 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java @@ -2,6 +2,7 @@ import ch.zhaw.splab.podilizerproc.awslambda.Functions; import ch.zhaw.splab.podilizerproc.awslambda.LambdaFunction; +import ch.zhaw.splab.podilizerproc.depdencies.DependencyResolver; import com.sun.source.tree.*; import com.sun.source.util.SimpleTreeVisitor; import com.sun.source.util.TreePath; @@ -13,10 +14,8 @@ import javax.lang.model.element.Element; import javax.lang.model.element.TypeElement; import javax.lang.model.type.ExecutableType; -import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeMirror; import javax.lang.model.util.Types; -import javax.tools.Diagnostic; import javax.tools.JavaFileObject; import java.io.IOException; import java.io.Writer; @@ -61,12 +60,31 @@ public boolean process(Set annotations, RoundEnvironment CUVisitor cuVisitor = new CUVisitor(); //TODO: Find and package non primitive types. - // ExecutableType emeth = (ExecutableType)element.asType(); + ExecutableType emeth = (ExecutableType)element.asType(); // 1. Passed parameters // 2. Return parameters // 3. locally used types. (Hardest) - // for (TypeMirror parameterType : emeth.getParameterTypes()) { - // Element element1 = typeUtils.asElement(parameterType); + for (TypeMirror parameterType : emeth.getParameterTypes()) { + Element paramElem = typeUtils.asElement(parameterType); + System.out.println("Paramter: " + parameterType); + System.out.println(paramElem); + if (paramElem != null) { + TreePath paramTree = trees.getPath(paramElem); + TypeScanner paramTypeScanner = new TypeScanner(); + paramTypeScanner.scan(paramTree, trees); + System.out.println("tree:"); + System.out.println(paramTree); + System.out.println("Scanned:"); + System.out.println(paramTypeScanner.getClazz()); + } + } + + //Element element1 = typeUtils.asElement(parameterType); + + System.out.println("###############################################################"); + DependencyResolver dependencyResolver = new DependencyResolver(trees, typeUtils, roundEnv); + dependencyResolver.resolveDependencies(element); + System.out.println("###############################################################"); TreePath tp = trees.getPath(element); @@ -76,6 +94,12 @@ public boolean process(Set annotations, RoundEnvironment TreePath tp1 = trees.getPath(getMostExternalType(element)); cuVisitor.visit(tp1, trees); + System.out.println("Class: "); + System.out.println(typeScanner.getClazz()); + + System.out.println("Cu:"); + System.out.println(cuVisitor.getCu()); + Lambda lambda = element.getAnnotation(Lambda.class); LambdaFunction lambdaFunction = diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java index 3515fe7..1707e9c 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java @@ -60,10 +60,12 @@ public void write(){ String lamdaJarLocation = function.getAwsFiler().getPomPath().toString(); lamdaJarLocation = lamdaJarLocation.replace('\\', '/') + "/target/lambda-java-1.0-SNAPSHOT.jar"; + System.out.println("!!!!!!!!!!! Skipping upload !!!!!!!!!!!!!"); + /* TODO: JarUploader jarUploader = new JarUploader(function.getLambdaFunctionName(), lamdaJarLocation, "LambdaFunction::handleRequest", function.getLambdaAnnotation().region(), function.getLambdaAnnotation().timeOut(), function.getLambdaAnnotation().memorySize(), function.getLambdaAnnotation().endPoint()); - jarUploader.uploadFunction(); + jarUploader.uploadFunction(); */ } catch (IOException e) { e.printStackTrace(); } diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/CompilationUnitInfo.java b/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/CompilationUnitInfo.java new file mode 100644 index 0000000..5e02278 --- /dev/null +++ b/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/CompilationUnitInfo.java @@ -0,0 +1,59 @@ +package ch.zhaw.splab.podilizerproc.depdencies; + +import javax.tools.JavaFileObject; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; + +public class CompilationUnitInfo { + + private final String name; + private final List allImports = new ArrayList<>(); + private JavaFileObject sourceFile = null; + // List of impports + // Src file reference + + public CompilationUnitInfo(String name) { + this.name = name; + } + + public void addImport(String importName) { + allImports.add(importName); + } + + public void addImports(List importNames) { + allImports.addAll(importNames); + } + + public void setSourceFile(JavaFileObject sourceFile) { + this.sourceFile = sourceFile; + } + + public String getName() { + return name; + } + + public List getAllImports() { + return allImports; + } + + public JavaFileObject getSourceFile() { + return sourceFile; + } + + @Override + public boolean equals(Object o) { + // Note: The equals method relies on the name being unique to the contained package + // This is not really clean oop, but it is way easier than comparing the imports every time. + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + CompilationUnitInfo that = (CompilationUnitInfo) o; + return Objects.equals(name, that.name); + } + + @Override + public int hashCode() { + return Objects.hash(name); + } +} diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/DependencyResolver.java b/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/DependencyResolver.java new file mode 100644 index 0000000..148e355 --- /dev/null +++ b/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/DependencyResolver.java @@ -0,0 +1,171 @@ +package ch.zhaw.splab.podilizerproc.depdencies; + +import com.sun.source.tree.CompilationUnitTree; +import com.sun.source.tree.ImportTree; +import com.sun.source.tree.Tree; +import com.sun.source.util.SimpleTreeVisitor; +import com.sun.source.util.TreePath; +import com.sun.source.util.Trees; + +import javax.annotation.processing.RoundEnvironment; +import javax.lang.model.element.Element; +import javax.lang.model.element.TypeElement; +import javax.lang.model.type.TypeMirror; +import javax.lang.model.util.Types; +import javax.tools.JavaFileObject; +import java.io.File; +import java.io.IOException; +import java.util.*; +import java.util.stream.Collectors; + +public class DependencyResolver { + + private Trees trees; + private Types typeUtils; + RoundEnvironment roundEnv; + + private final JavaPackageInfo rootPckg = new JavaPackageInfo(""); + + public DependencyResolver(Trees trees, Types typeUtils, RoundEnvironment roundEnv) { + this.trees = trees; + this.typeUtils = typeUtils; + this.roundEnv = roundEnv; + loadCompleteSourceInformation(); + } + + public void loadCompleteSourceInformation() { + for (Element rootElement : roundEnv.getRootElements()) { + // TODO: Build a strucutre which keeps track of all dependencies a element has + // TODO: This might fail if there is incredemental processing + // https://stackoverflow.com/questions/18038514/annotation-processor-only-processing-a-modified-class-after-first-run + TreePath rootElemPath = trees.getPath(rootElement); + + CUVisitor rootVisistor = new CUVisitor(); + rootVisistor.visit(rootElemPath, trees); + CompilationUnitTree cu = rootVisistor.getCu(); + + String pckgName = cu.getPackageName().toString(); + String srcName = new File(cu.getSourceFile().toUri()).getName(); + srcName = srcName.replace(".java", ""); + + String canoncialName = pckgName + "." + srcName; + System.out.println("Completename: " + canoncialName); + + CompilationUnitInfo compilationUnitInfo = new CompilationUnitInfo(srcName); + compilationUnitInfo.setSourceFile(cu.getSourceFile()); + compilationUnitInfo.addImport(pckgName); + List allImports = cu.getImports().stream() + .map(ImportTree::getQualifiedIdentifier) + .map(Object::toString) + .peek(importName -> System.out.println("Added import '" + importName + "'")) + .collect(Collectors.toList()); + compilationUnitInfo.addImports(allImports); + + List pckNames = Arrays.asList(pckgName.split("\\.")); + rootPckg.addCompilationUnit(pckNames, compilationUnitInfo); + } + } + + public Set resolveDependencies(Element element) { + Set result = new HashSet<>(); + CUVisitor cuVisitor = new CUVisitor(); + + TreePath tp = trees.getPath(element); + TreePath tp1 = trees.getPath(getMostExternalType(element)); + cuVisitor.visit(tp1, trees); + + CompilationUnitTree compilationUnit = cuVisitor.cu; + JavaFileObject sourceFile = compilationUnit.getSourceFile(); + + try { + System.out.println("src-Content: " + sourceFile.getCharContent(true)); + } catch (IOException e) { + e.printStackTrace(); + } + + System.out.println("Root elems:"); + for (Element rootElement : roundEnv.getRootElements()) { + // TODO: Build a strucutre which keeps track of all dependencies a element has + // TODO: This might fail if there is incredemental processing + // https://stackoverflow.com/questions/18038514/annotation-processor-only-processing-a-modified-class-after-first-run + System.out.println("Elem: " + rootElement); + System.out.println(rootElement.asType()); + TreePath rootElemPath = trees.getPath(rootElement); + CUVisitor rootVisistor = new CUVisitor(); + rootVisistor.visit(rootElemPath, trees); + System.out.println(rootVisistor.getCu()); + + // Direct Depdencies: List of imports + // HashMap packageName -> List + + // Tree with all packages: + } + + + for (ImportTree anImport : compilationUnit.getImports()) { + Tree qualifiedIdentifier = anImport.getQualifiedIdentifier(); + System.out.println("Import qualifier: " + qualifiedIdentifier); + // Options "bla.fasel.myclass" + // "bla.fasel.*" + + // Element -> Tree + // Tree -> Imports + // TypeMirror -> Element + + // Imports -> ? -> Element + + + } + + + + return result; + } + + + + /** + * Compilation Unit visitor + */ + private class CUVisitor extends SimpleTreeVisitor { + private List cuList = new ArrayList<>(); + private CompilationUnitTree cu = null; + + @Override + public Object visitCompilationUnit(CompilationUnitTree compilationUnitTree, Object o) { + cuList.add(compilationUnitTree); + cu = compilationUnitTree; + return null; + } + + public List getCuList() { + return cuList; + } + + public CompilationUnitTree getCu() { + return cu; + } + } + + + /** + * Gives the most external class owner of the code structure + * + * @param element is {@link Element} object to find external class of + * @return {@link TypeElement} object of the most external type + */ + private TypeElement getMostExternalType(Element element) { + if (element.getKind().isClass() && !element.getEnclosingElement().getKind().isClass()) { + return (TypeElement) element; + } + Element parent = element; + Element grandParent; + do { + parent = parent.getEnclosingElement(); + grandParent = parent.getEnclosingElement(); + } while (!(parent.getKind().isClass() && !grandParent.getKind().isClass() && + !grandParent.getKind().isInterface())); + return (TypeElement) parent; + + } +} diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/JavaPackageInfo.java b/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/JavaPackageInfo.java new file mode 100644 index 0000000..0881353 --- /dev/null +++ b/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/JavaPackageInfo.java @@ -0,0 +1,47 @@ +package ch.zhaw.splab.podilizerproc.depdencies; + +import java.util.*; + +public class JavaPackageInfo { + + private final Set subpackages = new HashSet<>(); + private final Set compliationUnits = new HashSet<>(); + + private final String name; + + public JavaPackageInfo(String name) { + this.name = name; + } + + public void addCompilationUnit(List parentPackages, CompilationUnitInfo cuInfo) { + if (parentPackages.isEmpty()) { + compliationUnits.add(cuInfo); + } else { + String nextPckgName = parentPackages.get(0); + Optional foundPackage = subpackages.stream() + .filter(pckgInfo -> nextPckgName.equals(pckgInfo.name)) + .findFirst(); + JavaPackageInfo nextPackage; + if (foundPackage.isPresent()) { + nextPackage = foundPackage.get(); + } else { + nextPackage = new JavaPackageInfo(nextPckgName); + subpackages.add(nextPackage); + } + nextPackage.addCompilationUnit(parentPackages.subList(1, parentPackages.size()), cuInfo); + } + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + JavaPackageInfo that = (JavaPackageInfo) o; + return Objects.equals(name, that.name); + } + + @Override + public int hashCode() { + return Objects.hash(name); + } +} From 0c0861a88a8cc5e4701584d830f7a4d3ee258034 Mon Sep 17 00:00:00 2001 From: Sebastian Heunke Date: Sun, 7 Jun 2020 22:07:21 +0200 Subject: [PATCH 15/33] Removed unecesarry code and finished depedency analysis. --- .../annotations/LambdaProcessor.java | 50 +++----- .../depdencies/CompilationUnitInfo.java | 17 ++- .../depdencies/DependencyResolver.java | 109 +++++------------- .../depdencies/JavaPackageInfo.java | 54 +++++++++ 4 files changed, 104 insertions(+), 126 deletions(-) diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java b/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java index 4046548..c74f586 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java @@ -3,23 +3,28 @@ import ch.zhaw.splab.podilizerproc.awslambda.Functions; import ch.zhaw.splab.podilizerproc.awslambda.LambdaFunction; import ch.zhaw.splab.podilizerproc.depdencies.DependencyResolver; -import com.sun.source.tree.*; +import com.sun.source.tree.ClassTree; +import com.sun.source.tree.CompilationUnitTree; +import com.sun.source.tree.MethodTree; import com.sun.source.util.SimpleTreeVisitor; import com.sun.source.util.TreePath; import com.sun.source.util.TreePathScanner; import com.sun.source.util.Trees; -import javax.annotation.processing.*; +import javax.annotation.processing.AbstractProcessor; +import javax.annotation.processing.ProcessingEnvironment; +import javax.annotation.processing.RoundEnvironment; +import javax.annotation.processing.SupportedAnnotationTypes; import javax.lang.model.SourceVersion; import javax.lang.model.element.Element; import javax.lang.model.element.TypeElement; -import javax.lang.model.type.ExecutableType; -import javax.lang.model.type.TypeMirror; import javax.lang.model.util.Types; import javax.tools.JavaFileObject; import java.io.IOException; import java.io.Writer; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; /** * Processor of {@link Lambda} annotation @@ -52,6 +57,7 @@ public boolean process(Set annotations, RoundEnvironment if (annotatedMethods.size() == 0) { return true; } + DependencyResolver dependencyResolver = new DependencyResolver(trees, roundEnv); for (Element element : annotatedMethods) { @@ -59,30 +65,8 @@ public boolean process(Set annotations, RoundEnvironment TypeScanner typeScanner = new TypeScanner(); CUVisitor cuVisitor = new CUVisitor(); - //TODO: Find and package non primitive types. - ExecutableType emeth = (ExecutableType)element.asType(); - // 1. Passed parameters - // 2. Return parameters - // 3. locally used types. (Hardest) - for (TypeMirror parameterType : emeth.getParameterTypes()) { - Element paramElem = typeUtils.asElement(parameterType); - System.out.println("Paramter: " + parameterType); - System.out.println(paramElem); - if (paramElem != null) { - TreePath paramTree = trees.getPath(paramElem); - TypeScanner paramTypeScanner = new TypeScanner(); - paramTypeScanner.scan(paramTree, trees); - System.out.println("tree:"); - System.out.println(paramTree); - System.out.println("Scanned:"); - System.out.println(paramTypeScanner.getClazz()); - } - } - - //Element element1 = typeUtils.asElement(parameterType); System.out.println("###############################################################"); - DependencyResolver dependencyResolver = new DependencyResolver(trees, typeUtils, roundEnv); dependencyResolver.resolveDependencies(element); System.out.println("###############################################################"); @@ -94,19 +78,13 @@ public boolean process(Set annotations, RoundEnvironment TreePath tp1 = trees.getPath(getMostExternalType(element)); cuVisitor.visit(tp1, trees); - System.out.println("Class: "); - System.out.println(typeScanner.getClazz()); - - System.out.println("Cu:"); - System.out.println(cuVisitor.getCu()); - Lambda lambda = element.getAnnotation(Lambda.class); LambdaFunction lambdaFunction = new LambdaFunction(methodScanner.getMethod(), typeScanner.getClazz(), cuVisitor.getCu(), lambda); functions.add(lambdaFunction); - try { - String packageName = lambdaFunction.generateInputPackage(); + /*try { + /*String packageName = lambdaFunction.generateInputPackage(); String generatedClassPath = packageName.substring(8, packageName.length() - 1); JavaFileObject inputType = processingEnv.getFiler().createSourceFile(generatedClassPath +".InputType", null); JavaFileObject outputType = processingEnv.getFiler().createSourceFile(generatedClassPath + ".OutputType", null); @@ -122,7 +100,7 @@ public boolean process(Set annotations, RoundEnvironment writer1.close(); } catch (IOException e) { e.printStackTrace(); - } + }*/ } Functions functionsWriter = new Functions(functions); diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/CompilationUnitInfo.java b/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/CompilationUnitInfo.java index 5e02278..a06a535 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/CompilationUnitInfo.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/CompilationUnitInfo.java @@ -1,15 +1,12 @@ package ch.zhaw.splab.podilizerproc.depdencies; import javax.tools.JavaFileObject; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; +import java.util.*; public class CompilationUnitInfo { private final String name; - private final List allImports = new ArrayList<>(); + private final Set importedPackages = new HashSet<>(); private JavaFileObject sourceFile = null; // List of impports // Src file reference @@ -19,11 +16,11 @@ public CompilationUnitInfo(String name) { } public void addImport(String importName) { - allImports.add(importName); + importedPackages.add(importName); } - public void addImports(List importNames) { - allImports.addAll(importNames); + public void addImports(Collection importNames) { + importedPackages.addAll(importNames); } public void setSourceFile(JavaFileObject sourceFile) { @@ -34,8 +31,8 @@ public String getName() { return name; } - public List getAllImports() { - return allImports; + public Set getAllImportedPackages() { + return importedPackages; } public JavaFileObject getSourceFile() { diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/DependencyResolver.java b/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/DependencyResolver.java index 148e355..99b8155 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/DependencyResolver.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/DependencyResolver.java @@ -2,7 +2,6 @@ import com.sun.source.tree.CompilationUnitTree; import com.sun.source.tree.ImportTree; -import com.sun.source.tree.Tree; import com.sun.source.util.SimpleTreeVisitor; import com.sun.source.util.TreePath; import com.sun.source.util.Trees; @@ -10,29 +9,29 @@ import javax.annotation.processing.RoundEnvironment; import javax.lang.model.element.Element; import javax.lang.model.element.TypeElement; -import javax.lang.model.type.TypeMirror; import javax.lang.model.util.Types; import javax.tools.JavaFileObject; import java.io.File; -import java.io.IOException; import java.util.*; import java.util.stream.Collectors; public class DependencyResolver { private Trees trees; - private Types typeUtils; RoundEnvironment roundEnv; private final JavaPackageInfo rootPckg = new JavaPackageInfo(""); - public DependencyResolver(Trees trees, Types typeUtils, RoundEnvironment roundEnv) { + public DependencyResolver(Trees trees, RoundEnvironment roundEnv) { this.trees = trees; - this.typeUtils = typeUtils; this.roundEnv = roundEnv; loadCompleteSourceInformation(); } + /** + * This method is responsible for loading the general package structure of the project. + * This will later be used to get compilation units which are related to each other. + */ public void loadCompleteSourceInformation() { for (Element rootElement : roundEnv.getRootElements()) { // TODO: Build a strucutre which keeps track of all dependencies a element has @@ -49,16 +48,15 @@ public void loadCompleteSourceInformation() { srcName = srcName.replace(".java", ""); String canoncialName = pckgName + "." + srcName; - System.out.println("Completename: " + canoncialName); CompilationUnitInfo compilationUnitInfo = new CompilationUnitInfo(srcName); compilationUnitInfo.setSourceFile(cu.getSourceFile()); compilationUnitInfo.addImport(pckgName); - List allImports = cu.getImports().stream() + Set allImports = cu.getImports().stream() .map(ImportTree::getQualifiedIdentifier) .map(Object::toString) - .peek(importName -> System.out.println("Added import '" + importName + "'")) - .collect(Collectors.toList()); + .map(completeImport -> completeImport.substring(0, completeImport.lastIndexOf('.'))) + .collect(Collectors.toSet()); compilationUnitInfo.addImports(allImports); List pckNames = Arrays.asList(pckgName.split("\\.")); @@ -66,60 +64,31 @@ public void loadCompleteSourceInformation() { } } - public Set resolveDependencies(Element element) { - Set result = new HashSet<>(); + public Set resolveDependencies(Element element) { + TreePath elemPath = trees.getPath(element); CUVisitor cuVisitor = new CUVisitor(); - - TreePath tp = trees.getPath(element); - TreePath tp1 = trees.getPath(getMostExternalType(element)); - cuVisitor.visit(tp1, trees); - + cuVisitor.visit(elemPath, trees); CompilationUnitTree compilationUnit = cuVisitor.cu; - JavaFileObject sourceFile = compilationUnit.getSourceFile(); - - try { - System.out.println("src-Content: " + sourceFile.getCharContent(true)); - } catch (IOException e) { - e.printStackTrace(); - } - - System.out.println("Root elems:"); - for (Element rootElement : roundEnv.getRootElements()) { - // TODO: Build a strucutre which keeps track of all dependencies a element has - // TODO: This might fail if there is incredemental processing - // https://stackoverflow.com/questions/18038514/annotation-processor-only-processing-a-modified-class-after-first-run - System.out.println("Elem: " + rootElement); - System.out.println(rootElement.asType()); - TreePath rootElemPath = trees.getPath(rootElement); - CUVisitor rootVisistor = new CUVisitor(); - rootVisistor.visit(rootElemPath, trees); - System.out.println(rootVisistor.getCu()); - - // Direct Depdencies: List of imports - // HashMap packageName -> List - // Tree with all packages: + // We are using the package name, not the file name itself to determin which files are relevant + // This is done because currently only the imports are used for the analysis + // this makes the analysis itself a lot easier, but might come with a small overhead compared + // to a more complex analysis of all used types in the classes themself + String packageName = compilationUnit.getPackageName().toString(); + + JavaPackageInfo packageInfo = rootPckg.findPackageInfo(packageName); + if (packageInfo == null) { + System.out.println("[TERMITE] WARNING: Unable to find package " + packageName); + return Collections.emptySet(); + } else { + System.out.println("[TERMITE] Found required dependencies for " + packageName); + return packageInfo.getRelevantDependencies(rootPckg) + .stream() + .map(JavaPackageInfo::getAllFiles) + .flatMap(Set::stream) + .peek(javaFile -> System.out.println("Adding: " + javaFile.getName())) + .collect(Collectors.toSet()); } - - - for (ImportTree anImport : compilationUnit.getImports()) { - Tree qualifiedIdentifier = anImport.getQualifiedIdentifier(); - System.out.println("Import qualifier: " + qualifiedIdentifier); - // Options "bla.fasel.myclass" - // "bla.fasel.*" - - // Element -> Tree - // Tree -> Imports - // TypeMirror -> Element - - // Imports -> ? -> Element - - - } - - - - return result; } @@ -148,24 +117,4 @@ public CompilationUnitTree getCu() { } - /** - * Gives the most external class owner of the code structure - * - * @param element is {@link Element} object to find external class of - * @return {@link TypeElement} object of the most external type - */ - private TypeElement getMostExternalType(Element element) { - if (element.getKind().isClass() && !element.getEnclosingElement().getKind().isClass()) { - return (TypeElement) element; - } - Element parent = element; - Element grandParent; - do { - parent = parent.getEnclosingElement(); - grandParent = parent.getEnclosingElement(); - } while (!(parent.getKind().isClass() && !grandParent.getKind().isClass() && - !grandParent.getKind().isInterface())); - return (TypeElement) parent; - - } } diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/JavaPackageInfo.java b/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/JavaPackageInfo.java index 0881353..6812714 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/JavaPackageInfo.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/JavaPackageInfo.java @@ -1,6 +1,8 @@ package ch.zhaw.splab.podilizerproc.depdencies; +import javax.tools.JavaFileObject; import java.util.*; +import java.util.stream.Collectors; public class JavaPackageInfo { @@ -32,6 +34,58 @@ public void addCompilationUnit(List parentPackages, CompilationUnitInfo } } + /** + * @return A set of all package infos which the package depends on. + */ + public Set getRelevantDependencies(JavaPackageInfo rootPckg) { + + HashSet allRelevantPackageInfos = new HashSet<>(); + + addDependenciesToSet(rootPckg, allRelevantPackageInfos); + + return allRelevantPackageInfos; + } + + public Set getAllFiles() { + return compliationUnits.stream() + .map(CompilationUnitInfo::getSourceFile) + .collect(Collectors.toSet()); + } + + private void addDependenciesToSet(JavaPackageInfo rootPckg, Set relevantDependencies) { + if (relevantDependencies.contains(this)) { + return; + } + // Add itself first, to avoid infinite recursion + relevantDependencies.add(this); + // Add all the dependencies which the contained CUs rely on + compliationUnits + .stream() + .flatMap(cuInfo -> cuInfo.getAllImportedPackages().stream()) + .distinct() + .map(rootPckg::findPackageInfo) + .filter(Objects::nonNull) + .forEach((relevantPckg) -> relevantPckg.addDependenciesToSet(rootPckg, relevantDependencies)); + } + + public JavaPackageInfo findPackageInfo(String completePackageName) { + return findPackageInfo(Arrays.asList(completePackageName.split("\\."))); + } + + public JavaPackageInfo findPackageInfo(List pckgNames) { + if (pckgNames.isEmpty()) { + return this; + } + Optional subPckg = subpackages.stream() + .filter(subpckg -> pckgNames.get(0).equals(subpckg.name)) + .findAny(); + + return subPckg + .map(pckg -> + pckg.findPackageInfo(pckgNames.subList(1, pckgNames.size()))) + .orElse(null); + } + @Override public boolean equals(Object o) { if (this == o) return true; From 40cb2f6b22850b9f53802c6d839c00cff808e65e Mon Sep 17 00:00:00 2001 From: Sebastian Heunke Date: Sun, 7 Jun 2020 22:11:15 +0200 Subject: [PATCH 16/33] Removal of dead code. --- .../annotations/LambdaProcessor.java | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java b/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java index c74f586..aa3c458 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java @@ -83,24 +83,6 @@ public boolean process(Set annotations, RoundEnvironment LambdaFunction lambdaFunction = new LambdaFunction(methodScanner.getMethod(), typeScanner.getClazz(), cuVisitor.getCu(), lambda); functions.add(lambdaFunction); - /*try { - /*String packageName = lambdaFunction.generateInputPackage(); - String generatedClassPath = packageName.substring(8, packageName.length() - 1); - JavaFileObject inputType = processingEnv.getFiler().createSourceFile(generatedClassPath +".InputType", null); - JavaFileObject outputType = processingEnv.getFiler().createSourceFile(generatedClassPath + ".OutputType", null); - Writer writer = inputType.openWriter(); - Writer writer1 = outputType.openWriter(); - writer.append(lambdaFunction.generateInputPackage() + "\n\n"); - writer1.append(lambdaFunction.generateInputPackage() + "\n\n"); - writer.append(lambdaFunction.createInputType()); - writer1.append(lambdaFunction.createOutputType()); - writer.flush(); - writer1.flush(); - writer.close(); - writer1.close(); - } catch (IOException e) { - e.printStackTrace(); - }*/ } Functions functionsWriter = new Functions(functions); From 74f1ec89d74c8695613b220d99326941610003bf Mon Sep 17 00:00:00 2001 From: Sebastian Heunke Date: Sun, 7 Jun 2020 23:05:59 +0200 Subject: [PATCH 17/33] Added copying of required CUs to lambda writing. --- .../annotations/LambdaProcessor.java | 10 ++--- .../podilizerproc/awslambda/Functions.java | 37 ++++++++++++++++-- .../awslambda/LambdaFunction.java | 38 +++++++++++-------- .../depdencies/CompilationUnitInfo.java | 26 +++++-------- .../depdencies/DependencyResolver.java | 14 +++---- .../depdencies/JavaPackageInfo.java | 14 +++---- 6 files changed, 80 insertions(+), 59 deletions(-) diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java b/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java index aa3c458..9d2dce2 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java @@ -2,6 +2,7 @@ import ch.zhaw.splab.podilizerproc.awslambda.Functions; import ch.zhaw.splab.podilizerproc.awslambda.LambdaFunction; +import ch.zhaw.splab.podilizerproc.depdencies.CompilationUnitInfo; import ch.zhaw.splab.podilizerproc.depdencies.DependencyResolver; import com.sun.source.tree.ClassTree; import com.sun.source.tree.CompilationUnitTree; @@ -19,9 +20,6 @@ import javax.lang.model.element.Element; import javax.lang.model.element.TypeElement; import javax.lang.model.util.Types; -import javax.tools.JavaFileObject; -import java.io.IOException; -import java.io.Writer; import java.util.ArrayList; import java.util.List; import java.util.Set; @@ -35,7 +33,7 @@ public class LambdaProcessor extends AbstractProcessor { private Types typeUtils; /** - * Initialization of {@link ProcessEnvironment} object and {@link Trees} object + * Initialization. * * @param processingEnv */ @@ -67,7 +65,7 @@ public boolean process(Set annotations, RoundEnvironment System.out.println("###############################################################"); - dependencyResolver.resolveDependencies(element); + Set requiredCompilationUnits = dependencyResolver.resolveDependencies(element); System.out.println("###############################################################"); @@ -81,7 +79,7 @@ public boolean process(Set annotations, RoundEnvironment Lambda lambda = element.getAnnotation(Lambda.class); LambdaFunction lambdaFunction = - new LambdaFunction(methodScanner.getMethod(), typeScanner.getClazz(), cuVisitor.getCu(), lambda); + new LambdaFunction(methodScanner.getMethod(), typeScanner.getClazz(), cuVisitor.getCu(), lambda, requiredCompilationUnits); functions.add(lambdaFunction); } diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java index 1707e9c..97b2c29 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java @@ -1,14 +1,15 @@ package ch.zhaw.splab.podilizerproc.awslambda; +import ch.zhaw.splab.podilizerproc.depdencies.CompilationUnitInfo; import org.codehaus.plexus.util.FileUtils; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.io.PrintWriter; +import javax.tools.JavaFileObject; +import java.io.*; import java.net.URL; import java.net.URLClassLoader; +import java.nio.file.Files; import java.util.List; +import java.util.Set; public class Functions { List functions; @@ -46,6 +47,8 @@ public void write(){ printWriter2.print(function.createOutputType()); printWriter2.close(); + writeRequiredCompilationUnits(path, function); + ClassLoader cl = getClass().getClassLoader(); URLClassLoader urlcl = (URLClassLoader)cl; URL[] classPath = urlcl.getURLs(); @@ -72,6 +75,32 @@ public void write(){ } } + + private void writeRequiredCompilationUnits(String path, LambdaFunction function) { + Set requiredCompilationUnits = function.getRequiredCompilationUnits(); + for (CompilationUnitInfo requiredCompilationUnit : requiredCompilationUnits) { + String packageName = requiredCompilationUnit.getPackageName(); + String absoluteFilePath = path + "/" + packageName.replace('.', '/'); + JavaFileObject sourceFile = requiredCompilationUnit.getSourceFile(); + + File targetFile = new File(absoluteFilePath); + + try(Reader reader = sourceFile.openReader(true); + BufferedReader bufferedReader = new BufferedReader(reader); + PrintWriter writer = new PrintWriter(targetFile)) { + String nextLine; + while ((nextLine = bufferedReader.readLine()) != null) { + writer.println(nextLine); + } + } catch (IOException e) { + System.out.println("[TERMITE] Failed to copy required compilation unit to " + absoluteFilePath); + e.printStackTrace(); + } + + } + + } + // TODO: 3/28/17 recreate getting of external libraries(include maven dependencies) private void writeExternalCP(String pathOut){ ClassLoader cl = getClass().getClassLoader(); diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/LambdaFunction.java b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/LambdaFunction.java index 6b6545b..5a95925 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/LambdaFunction.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/LambdaFunction.java @@ -1,28 +1,33 @@ package ch.zhaw.splab.podilizerproc.awslambda; import ch.zhaw.splab.podilizerproc.annotations.Lambda; +import ch.zhaw.splab.podilizerproc.depdencies.CompilationUnitInfo; import com.sun.source.tree.*; import javax.lang.model.element.Modifier; import java.util.ArrayList; +import java.util.Collections; import java.util.List; +import java.util.Set; /** *Entity of the AWS lambda function */ public class LambdaFunction { - private MethodTree method; - private ClassTree clazz; - private CompilationUnitTree cu; - private List fields = new ArrayList<>(); - private Filer awsFiler; - private Lambda lambdaAnnotation; - - public LambdaFunction(MethodTree method, ClassTree clazz, CompilationUnitTree cu, Lambda lambdaAnnotation) { + private final MethodTree method; + private final ClassTree clazz; + private final CompilationUnitTree cu; + private final List fields = new ArrayList<>(); + private final Filer awsFiler; + private final Lambda lambdaAnnotation; + private final Set requiredCompilationUnits; + + public LambdaFunction(MethodTree method, ClassTree clazz, CompilationUnitTree cu, Lambda lambdaAnnotation, Set requiredCompilationUnits) { this.method = method; this.clazz = clazz; this.cu = cu; this.lambdaAnnotation = lambdaAnnotation; + this.requiredCompilationUnits = requiredCompilationUnits; for (Tree tree : clazz.getMembers()) { if (tree.getKind() == Tree.Kind.VARIABLE) { @@ -91,14 +96,11 @@ public List imports(){ "com.fasterxml.jackson.databind.*", "com.amazonaws.services.lambda.runtime.RequestHandler" }; -// for (ImportTree importTree : -// cu.getImports()) { -// imports.add(importTree.getQualifiedIdentifier().toString()); -// } - for (String importStr : - defaultImports) { - imports.add(importStr); + for (ImportTree importTree : + cu.getImports()) { + imports.add(importTree.getQualifiedIdentifier().toString()); } + Collections.addAll(imports, defaultImports); return imports; } @@ -136,6 +138,10 @@ private String getClassSpecification(){ return result + " " + extendsString + " " + implementsString + " {"; } + public Set getRequiredCompilationUnits() { + return requiredCompilationUnits; + } + /** * Generates handler code * @return {@link String} of handler java code @@ -153,7 +159,7 @@ private String generateHandler(){ // String var = field.getName().toString(); // result += "\t\tthis." + var + " = inputType.get" + Utility.firstLetterToUpperCase(var) + "();\n"; // } - result += "\t\t" + generateMethodCall() + ";\n"; + result += "\t\t" + generateMethodCall(); result += "\t\tOutputType outputType = new OutputType(\"Lambda environment\""; result += ", System.currentTimeMillis() - time"; if (!method.getReturnType().toString().equals("void")){ diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/CompilationUnitInfo.java b/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/CompilationUnitInfo.java index a06a535..bfd63f0 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/CompilationUnitInfo.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/CompilationUnitInfo.java @@ -6,24 +6,14 @@ public class CompilationUnitInfo { private final String name; - private final Set importedPackages = new HashSet<>(); - private JavaFileObject sourceFile = null; - // List of impports - // Src file reference + private final String packageName; + private final Set importedPackages; + private final JavaFileObject sourceFile; - public CompilationUnitInfo(String name) { + public CompilationUnitInfo(String name, String packageName, Set importedPackages, JavaFileObject sourceFile) { this.name = name; - } - - public void addImport(String importName) { - importedPackages.add(importName); - } - - public void addImports(Collection importNames) { - importedPackages.addAll(importNames); - } - - public void setSourceFile(JavaFileObject sourceFile) { + this.packageName = packageName; + this.importedPackages = new HashSet<>(importedPackages); this.sourceFile = sourceFile; } @@ -31,6 +21,10 @@ public String getName() { return name; } + public String getPackageName() { + return packageName; + } + public Set getAllImportedPackages() { return importedPackages; } diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/DependencyResolver.java b/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/DependencyResolver.java index 99b8155..08c6a9a 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/DependencyResolver.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/DependencyResolver.java @@ -47,24 +47,22 @@ public void loadCompleteSourceInformation() { String srcName = new File(cu.getSourceFile().toUri()).getName(); srcName = srcName.replace(".java", ""); - String canoncialName = pckgName + "." + srcName; - CompilationUnitInfo compilationUnitInfo = new CompilationUnitInfo(srcName); - compilationUnitInfo.setSourceFile(cu.getSourceFile()); - compilationUnitInfo.addImport(pckgName); Set allImports = cu.getImports().stream() .map(ImportTree::getQualifiedIdentifier) .map(Object::toString) .map(completeImport -> completeImport.substring(0, completeImport.lastIndexOf('.'))) .collect(Collectors.toSet()); - compilationUnitInfo.addImports(allImports); + + CompilationUnitInfo compilationUnitInfo = + new CompilationUnitInfo(srcName, pckgName, allImports, cu.getSourceFile()); List pckNames = Arrays.asList(pckgName.split("\\.")); rootPckg.addCompilationUnit(pckNames, compilationUnitInfo); } } - public Set resolveDependencies(Element element) { + public Set resolveDependencies(Element element) { TreePath elemPath = trees.getPath(element); CUVisitor cuVisitor = new CUVisitor(); cuVisitor.visit(elemPath, trees); @@ -84,9 +82,9 @@ public Set resolveDependencies(Element element) { System.out.println("[TERMITE] Found required dependencies for " + packageName); return packageInfo.getRelevantDependencies(rootPckg) .stream() - .map(JavaPackageInfo::getAllFiles) + .map(JavaPackageInfo::getCompilationUnits) .flatMap(Set::stream) - .peek(javaFile -> System.out.println("Adding: " + javaFile.getName())) + .peek(cu -> System.out.println("Adding: " + cu.getSourceFile().getName())) .collect(Collectors.toSet()); } } diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/JavaPackageInfo.java b/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/JavaPackageInfo.java index 6812714..02563e7 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/JavaPackageInfo.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/JavaPackageInfo.java @@ -1,13 +1,11 @@ package ch.zhaw.splab.podilizerproc.depdencies; -import javax.tools.JavaFileObject; import java.util.*; -import java.util.stream.Collectors; public class JavaPackageInfo { private final Set subpackages = new HashSet<>(); - private final Set compliationUnits = new HashSet<>(); + private final Set compilationUnitInfos = new HashSet<>(); private final String name; @@ -17,7 +15,7 @@ public JavaPackageInfo(String name) { public void addCompilationUnit(List parentPackages, CompilationUnitInfo cuInfo) { if (parentPackages.isEmpty()) { - compliationUnits.add(cuInfo); + compilationUnitInfos.add(cuInfo); } else { String nextPckgName = parentPackages.get(0); Optional foundPackage = subpackages.stream() @@ -46,10 +44,8 @@ public Set getRelevantDependencies(JavaPackageInfo rootPckg) { return allRelevantPackageInfos; } - public Set getAllFiles() { - return compliationUnits.stream() - .map(CompilationUnitInfo::getSourceFile) - .collect(Collectors.toSet()); + public Set getCompilationUnits() { + return compilationUnitInfos; } private void addDependenciesToSet(JavaPackageInfo rootPckg, Set relevantDependencies) { @@ -59,7 +55,7 @@ private void addDependenciesToSet(JavaPackageInfo rootPckg, Set // Add itself first, to avoid infinite recursion relevantDependencies.add(this); // Add all the dependencies which the contained CUs rely on - compliationUnits + compilationUnitInfos .stream() .flatMap(cuInfo -> cuInfo.getAllImportedPackages().stream()) .distinct() From 28bf79e0056bcb8066ac4860e7ef4d6bde15978d Mon Sep 17 00:00:00 2001 From: Sebastian Heunke Date: Tue, 9 Jun 2020 15:10:50 +0200 Subject: [PATCH 18/33] Fixed a null pointer bug in compiler if no package deklaration is used. --- .../splab/podilizerproc/awslambda/Filer.java | 4 ++-- .../podilizerproc/awslambda/Functions.java | 24 +++++++++++++++---- .../depdencies/DependencyResolver.java | 2 +- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Filer.java b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Filer.java index 969d12d..0546e24 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Filer.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Filer.java @@ -42,7 +42,7 @@ public Path getPath() { if (cu.getPackageName() == null) { packageName = "aws"; } else { - packageName = "aws/" + cu.getPackageName().toString().replace(',', '/'); + packageName = "aws/" + cu.getPackageName().toString().replace('.', '/'); } clazzName = clazz.getSimpleName().toString(); @@ -71,7 +71,7 @@ public Path getPomPath() { if (cu.getPackageName() == null) { packageName = "aws"; } else { - packageName = "aws/" + cu.getPackageName().toString().replace(',', '/'); + packageName = "aws/" + cu.getPackageName().toString().replace('.', '/'); } clazzName = clazz.getSimpleName().toString(); diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java index 97b2c29..2356101 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java @@ -31,8 +31,10 @@ public void write(){ functions) { try { String path = function.getAwsFiler().getPath().toString(); + System.out.println("Path is: " + path); function.getAwsFiler().createDirectories(); File file = new File(path + "/LambdaFunction.java"); + System.out.println(file.getAbsolutePath()); PrintWriter printWriter = new PrintWriter(file); printWriter.print(function.create()); printWriter.close(); @@ -78,13 +80,27 @@ public void write(){ private void writeRequiredCompilationUnits(String path, LambdaFunction function) { Set requiredCompilationUnits = function.getRequiredCompilationUnits(); - for (CompilationUnitInfo requiredCompilationUnit : requiredCompilationUnits) { - String packageName = requiredCompilationUnit.getPackageName(); - String absoluteFilePath = path + "/" + packageName.replace('.', '/'); - JavaFileObject sourceFile = requiredCompilationUnit.getSourceFile(); + for (CompilationUnitInfo compilationUnit : requiredCompilationUnits) { + String packageName = compilationUnit.getPackageName(); + String absoluteFilePath = path + File.separatorChar + packageName.replace('.', File.separatorChar); + absoluteFilePath = absoluteFilePath + File.separatorChar + compilationUnit.getName() + ".java"; + JavaFileObject sourceFile = compilationUnit.getSourceFile(); File targetFile = new File(absoluteFilePath); + boolean wasCreated = false; + try { + targetFile.getParentFile().mkdirs(); + wasCreated = targetFile.createNewFile(); + } catch (IOException e) { + System.out.println("[TERMITE] Unable to create new source file at " + absoluteFilePath); + e.printStackTrace(); + continue; + } + if (!wasCreated) { + System.out.println("[TERMITE] WARNING: File already exists " + absoluteFilePath); + } + System.out.println("[TERMITE] START WRITE " + absoluteFilePath); try(Reader reader = sourceFile.openReader(true); BufferedReader bufferedReader = new BufferedReader(reader); PrintWriter writer = new PrintWriter(targetFile)) { diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/DependencyResolver.java b/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/DependencyResolver.java index 08c6a9a..0276c2e 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/DependencyResolver.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/DependencyResolver.java @@ -43,7 +43,7 @@ public void loadCompleteSourceInformation() { rootVisistor.visit(rootElemPath, trees); CompilationUnitTree cu = rootVisistor.getCu(); - String pckgName = cu.getPackageName().toString(); + String pckgName = cu.getPackageName() == null? "": cu.getPackageName().toString(); String srcName = new File(cu.getSourceFile().toUri()).getName(); srcName = srcName.replace(".java", ""); From 3e1529c7fc95f5d1c77cf5a1b869ceec703dc2d9 Mon Sep 17 00:00:00 2001 From: Sebastian Heunke Date: Tue, 9 Jun 2020 15:54:36 +0200 Subject: [PATCH 19/33] Added imports to input and output type if required. --- .../annotations/LambdaProcessor.java | 12 ++- .../podilizerproc/awslambda/Functions.java | 5 +- .../awslambda/InputTypeEntity.java | 12 ++- .../awslambda/LambdaFunction.java | 78 ++++++++++++------- .../awslambda/OutputTypeEntity.java | 7 +- .../podilizerproc/awslambda/PoJoEntity.java | 10 ++- .../depdencies/DependencyResolver.java | 3 - 7 files changed, 91 insertions(+), 36 deletions(-) diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java b/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java index 9d2dce2..3bf8781 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java @@ -7,6 +7,7 @@ import com.sun.source.tree.ClassTree; import com.sun.source.tree.CompilationUnitTree; import com.sun.source.tree.MethodTree; +import com.sun.source.tree.VariableTree; import com.sun.source.util.SimpleTreeVisitor; import com.sun.source.util.TreePath; import com.sun.source.util.TreePathScanner; @@ -19,6 +20,8 @@ import javax.lang.model.SourceVersion; import javax.lang.model.element.Element; import javax.lang.model.element.TypeElement; +import javax.lang.model.type.ExecutableType; +import javax.lang.model.type.TypeMirror; import javax.lang.model.util.Types; import java.util.ArrayList; import java.util.List; @@ -76,10 +79,17 @@ public boolean process(Set annotations, RoundEnvironment TreePath tp1 = trees.getPath(getMostExternalType(element)); cuVisitor.visit(tp1, trees); + ExecutableType emeth = (ExecutableType)element.asType(); Lambda lambda = element.getAnnotation(Lambda.class); LambdaFunction lambdaFunction = - new LambdaFunction(methodScanner.getMethod(), typeScanner.getClazz(), cuVisitor.getCu(), lambda, requiredCompilationUnits); + new LambdaFunction(methodScanner.getMethod(), + typeScanner.getClazz(), + cuVisitor.getCu(), + lambda, + requiredCompilationUnits, + emeth.getParameterTypes(), + emeth.getReturnType()); functions.add(lambdaFunction); } diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java index 2356101..bf01808 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java @@ -106,7 +106,10 @@ private void writeRequiredCompilationUnits(String path, LambdaFunction function) PrintWriter writer = new PrintWriter(targetFile)) { String nextLine; while ((nextLine = bufferedReader.readLine()) != null) { - writer.println(nextLine); + if (!nextLine.contains("@Lambda")) { + writer.println(nextLine); + } + // TODO properly remove annotations from code instead of this workaround } } catch (IOException e) { System.out.println("[TERMITE] Failed to copy required compilation unit to " + absoluteFilePath); diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/InputTypeEntity.java b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/InputTypeEntity.java index 0f0d9a9..4e7c69f 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/InputTypeEntity.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/InputTypeEntity.java @@ -2,6 +2,7 @@ import com.sun.source.tree.VariableTree; +import javax.lang.model.type.TypeMirror; import java.util.AbstractMap; import java.util.List; @@ -10,11 +11,20 @@ */ public class InputTypeEntity extends PoJoEntity { - public InputTypeEntity(String className, List params) { + public InputTypeEntity(String className, List params, List inputTypes) { super(className); for (VariableTree var : params) { fields.add(new AbstractMap.SimpleEntry(var.getType().toString(), var.getName().toString())); } + for (TypeMirror inputType : inputTypes) { + String typeString = inputType.toString(); + if (typeString.contains(".")) { + System.out.println("INPUT IMPORT: " + typeString); + importStatments.add(typeString); + } + } + + } } diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/LambdaFunction.java b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/LambdaFunction.java index 5a95925..36cc504 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/LambdaFunction.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/LambdaFunction.java @@ -5,13 +5,14 @@ import com.sun.source.tree.*; import javax.lang.model.element.Modifier; +import javax.lang.model.type.TypeMirror; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; /** - *Entity of the AWS lambda function + * Entity of the AWS lambda function */ public class LambdaFunction { private final MethodTree method; @@ -21,20 +22,30 @@ public class LambdaFunction { private final Filer awsFiler; private final Lambda lambdaAnnotation; private final Set requiredCompilationUnits; + private final List inputTypes; + private final TypeMirror resultType; - public LambdaFunction(MethodTree method, ClassTree clazz, CompilationUnitTree cu, Lambda lambdaAnnotation, Set requiredCompilationUnits) { + public LambdaFunction(MethodTree method, + ClassTree clazz, + CompilationUnitTree cu, + Lambda lambdaAnnotation, + Set requiredCompilationUnits, + List inputTypes, + TypeMirror resultType) { this.method = method; this.clazz = clazz; this.cu = cu; this.lambdaAnnotation = lambdaAnnotation; this.requiredCompilationUnits = requiredCompilationUnits; + this.inputTypes = inputTypes; + this.resultType = resultType; for (Tree tree : clazz.getMembers()) { if (tree.getKind() == Tree.Kind.VARIABLE) { - VariableTree field = (VariableTree)tree; + VariableTree field = (VariableTree) tree; //exclude static and final fields from list if (!field.getModifiers().getFlags().contains(Modifier.STATIC) & - !field.getModifiers().getFlags().contains(Modifier.FINAL)){ + !field.getModifiers().getFlags().contains(Modifier.FINAL)) { fields.add(field); } } @@ -52,9 +63,10 @@ public Filer getAwsFiler() { /** * Generates java code lambda function for appropriate method + * * @return {@link String} of generated java code */ - public String create(){ + public String create() { String result = importsToString(imports()); result += "\n" + getClassSpecification(); //result += "\n" + Utility.fieldsToString(fields); @@ -65,27 +77,30 @@ public String create(){ /** * Creates InputType class java code + * * @return java code of InputType class as a {@link String} */ - public String createInputType(){ - InputTypeEntity inputType = new InputTypeEntity("InputType", method.getParameters()); + public String createInputType() { + InputTypeEntity inputType = new InputTypeEntity("InputType", method.getParameters(), inputTypes); return inputType.create(); } /** * Creates OutputType class java code + * * @return java code of OutputType class as a {@link String} */ - public String createOutputType(){ - OutputTypeEntity outputType = new OutputTypeEntity("OutputType", method.getReturnType()); + public String createOutputType() { + OutputTypeEntity outputType = new OutputTypeEntity("OutputType", method.getReturnType(), resultType); return outputType.create(); } /** * Creates list of imports to be added to lambda function compilation unit + * * @return {@link String[]} of imports; */ - public List imports(){ + public List imports() { List imports = new ArrayList<>(); String[] defaultImports = { "com.amazonaws.services.lambda.runtime.Context", @@ -106,10 +121,11 @@ public List imports(){ /** * Turns list of imports into string of java code + * * @param imports is list of imports(Strings) * @return {@link String} of combined imports ready ti insert as java code */ - private String importsToString(List imports){ + private String importsToString(List imports) { StringBuilder result = new StringBuilder(); for (String importStr : imports) { @@ -121,16 +137,17 @@ private String importsToString(List imports){ /** * Generates lambda function class specification. Based on 'implements' and 'extends' of external class + * * @return {@link String} of class declaration */ - private String getClassSpecification(){ + private String getClassSpecification() { String result = "public class LambdaFunction"; String implementsString = "implements RequestStreamHandler"; - for (Tree implement: + for (Tree implement : clazz.getImplementsClause()) { implementsString += ", " + implement.toString(); } - if (clazz.getExtendsClause() == null){ + if (clazz.getExtendsClause() == null) { return result + " " + implementsString + " {"; } String extendsString = "extends " + clazz.getExtendsClause().toString(); @@ -144,9 +161,10 @@ public Set getRequiredCompilationUnits() { /** * Generates handler code + * * @return {@link String} of handler java code */ - private String generateHandler(){ + private String generateHandler() { String result = "\tpublic void handleRequest(InputStream inputStream, OutputStream outputStream, " + "Context context) throws IOException {\n" + "\t\tlong time = System.currentTimeMillis();" + @@ -162,7 +180,7 @@ private String generateHandler(){ result += "\t\t" + generateMethodCall(); result += "\t\tOutputType outputType = new OutputType(\"Lambda environment\""; result += ", System.currentTimeMillis() - time"; - if (!method.getReturnType().toString().equals("void")){ + if (!method.getReturnType().toString().equals("void")) { result += ", result"; } result += ");\n"; @@ -174,15 +192,16 @@ private String generateHandler(){ /** * Removes "@Lambda" and "@Invoker" annotations from method and adds "\t" to every string + * * @param method to be formatted * @return {@link String} of formatted method */ - private String removeAnnotations(MethodTree method){ + private String removeAnnotations(MethodTree method) { String methodString = method.toString(); String[] lines = methodString.split("\n"); StringBuilder result = new StringBuilder(); - for (int i = 0; i < lines.length; i++){ - if (!lines[i].startsWith("@Lambda") && !lines[i].startsWith("@Invoker")){ + for (int i = 0; i < lines.length; i++) { + if (!lines[i].startsWith("@Lambda") && !lines[i].startsWith("@Invoker")) { result.append("\t"); result.append(lines[i]); result.append("\n"); @@ -193,19 +212,20 @@ private String removeAnnotations(MethodTree method){ /** * Generates method call expression for lambda class + * * @return java code line as {@link String} */ - private String generateMethodCall(){ + private String generateMethodCall() { String result = ""; - if (!method.getReturnType().toString().equals("void")){ - result += "" + method.getReturnType().toString() + " result = "; + if (!method.getReturnType().toString().equals("void")) { + result += "" + method.getReturnType().toString() + " result = "; } result += method.getName().toString() + "("; int i = 0; for (VariableTree param : - method.getParameters()){ + method.getParameters()) { String getCall = "inputType.get" + Utility.firstLetterToUpperCase(param.getName().toString()) + "()"; - if (i == 0){ + if (i == 0) { result += getCall; } else { result += ", " + getCall; @@ -218,9 +238,10 @@ private String generateMethodCall(){ /** * Generates package declaration line for InputType + * * @return generated {@link String} with format 'aws.originalPackage.originalClass.originalMethod#argsNumber' */ - public String generateInputPackage(){ + public String generateInputPackage() { String result = "package aws."; result += getLambdaFunctionName().replace('_', '.'); return result + ";"; @@ -228,17 +249,18 @@ public String generateInputPackage(){ /** * Generates name for lambda function + * * @return {@link String} in format 'originalPackage_originalClass_originalMethod#argsNumber' */ - public String getLambdaFunctionName(){ + public String getLambdaFunctionName() { String result = ""; - if (cu.getPackageName() != null){ + if (cu.getPackageName() != null) { result += cu.getPackageName().toString().replace('.', '_'); result += "_"; } result += clazz.getSimpleName(); result += "_" + method.getName().toString(); - if (method.getParameters() != null){ + if (method.getParameters() != null) { result += method.getParameters().size(); } return result; diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/OutputTypeEntity.java b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/OutputTypeEntity.java index 8bfeacd..8ccf2b8 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/OutputTypeEntity.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/OutputTypeEntity.java @@ -2,6 +2,7 @@ import com.sun.source.tree.Tree; +import javax.lang.model.type.TypeMirror; import java.util.AbstractMap; /** @@ -9,12 +10,16 @@ */ public class OutputTypeEntity extends PoJoEntity { - public OutputTypeEntity(String className, Tree returnType) { + public OutputTypeEntity(String className, Tree returnType, TypeMirror resultType) { super(className); fields.add(new AbstractMap.SimpleEntry<>("String", "defaultReturn")); fields.add(new AbstractMap.SimpleEntry<>("long", "time")); if (!returnType.toString().equals("void")) { fields.add(new AbstractMap.SimpleEntry<>(returnType.toString(), "result")); } + String resultTypeStr = resultType.toString(); + if (resultTypeStr.contains(".")) { + importStatments.add(resultTypeStr); + } } } diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/PoJoEntity.java b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/PoJoEntity.java index 1672d7f..502bcb9 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/PoJoEntity.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/PoJoEntity.java @@ -7,6 +7,7 @@ public abstract class PoJoEntity { private String className; + protected List importStatments = new ArrayList<>(); protected List> fields; public PoJoEntity(String className) { @@ -15,7 +16,8 @@ public PoJoEntity(String className) { } public String create() { - String result = "public class " + className + "{\n"; + String result = generateImportStatements(); + result += "public class " + className + "{\n"; result += generateFieldsDeclaration() + "\n"; result += generateDefaultConstructor(); if (fields.size() != 0){ @@ -27,6 +29,12 @@ public String create() { return result; } + private String generateImportStatements() { + StringBuilder stringBuilder = new StringBuilder(); + importStatments.forEach(statement -> stringBuilder.append("import ").append(statement).append(";\n")); + return stringBuilder.toString(); + } + /** * Generates default constructor * diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/DependencyResolver.java b/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/DependencyResolver.java index 0276c2e..1977a69 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/DependencyResolver.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/DependencyResolver.java @@ -8,9 +8,6 @@ import javax.annotation.processing.RoundEnvironment; import javax.lang.model.element.Element; -import javax.lang.model.element.TypeElement; -import javax.lang.model.util.Types; -import javax.tools.JavaFileObject; import java.io.File; import java.util.*; import java.util.stream.Collectors; From cf6fa3706c51a3ae9be83c9cc6630bde74ec48b1 Mon Sep 17 00:00:00 2001 From: Sebastian Heunke Date: Tue, 9 Jun 2020 16:14:35 +0200 Subject: [PATCH 20/33] =?UTF-8?q?Small=20style=20imp=C3=83rovements.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../awslambda/LambdaFunction.java | 27 +++---------------- 1 file changed, 4 insertions(+), 23 deletions(-) diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/LambdaFunction.java b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/LambdaFunction.java index 36cc504..10c71d5 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/LambdaFunction.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/LambdaFunction.java @@ -4,7 +4,6 @@ import ch.zhaw.splab.podilizerproc.depdencies.CompilationUnitInfo; import com.sun.source.tree.*; -import javax.lang.model.element.Modifier; import javax.lang.model.type.TypeMirror; import java.util.ArrayList; import java.util.Collections; @@ -18,7 +17,6 @@ public class LambdaFunction { private final MethodTree method; private final ClassTree clazz; private final CompilationUnitTree cu; - private final List fields = new ArrayList<>(); private final Filer awsFiler; private final Lambda lambdaAnnotation; private final Set requiredCompilationUnits; @@ -39,17 +37,6 @@ public LambdaFunction(MethodTree method, this.requiredCompilationUnits = requiredCompilationUnits; this.inputTypes = inputTypes; this.resultType = resultType; - for (Tree tree : - clazz.getMembers()) { - if (tree.getKind() == Tree.Kind.VARIABLE) { - VariableTree field = (VariableTree) tree; - //exclude static and final fields from list - if (!field.getModifiers().getFlags().contains(Modifier.STATIC) & - !field.getModifiers().getFlags().contains(Modifier.FINAL)) { - fields.add(field); - } - } - } awsFiler = new Filer(cu, clazz, method); } @@ -69,7 +56,6 @@ public Filer getAwsFiler() { public String create() { String result = importsToString(imports()); result += "\n" + getClassSpecification(); - //result += "\n" + Utility.fieldsToString(fields); result += "\n" + generateHandler(); result += "\n" + removeAnnotations(method); return result + "\n}"; @@ -129,7 +115,7 @@ private String importsToString(List imports) { StringBuilder result = new StringBuilder(); for (String importStr : imports) { - result.append("import " + importStr + ";\n"); + result.append("import ").append(importStr).append(";\n"); } return String.valueOf(result); } @@ -172,11 +158,6 @@ private String generateHandler() { "\t\tobjectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);\n" + "\t\tString inputString = IOUtils.toString(inputStream);\n" + "\t\tInputType inputType = objectMapper.readValue(inputString, InputType.class);\n"; -// for (VariableTree field : -// fields) { -// String var = field.getName().toString(); -// result += "\t\tthis." + var + " = inputType.get" + Utility.firstLetterToUpperCase(var) + "();\n"; -// } result += "\t\t" + generateMethodCall(); result += "\t\tOutputType outputType = new OutputType(\"Lambda environment\""; result += ", System.currentTimeMillis() - time"; @@ -200,10 +181,10 @@ private String removeAnnotations(MethodTree method) { String methodString = method.toString(); String[] lines = methodString.split("\n"); StringBuilder result = new StringBuilder(); - for (int i = 0; i < lines.length; i++) { - if (!lines[i].startsWith("@Lambda") && !lines[i].startsWith("@Invoker")) { + for (String line : lines) { + if (!line.startsWith("@Lambda") && !line.startsWith("@Invoker")) { result.append("\t"); - result.append(lines[i]); + result.append(line); result.append("\n"); } } From 475e6a3a266ecc03f31209e1a76b1df9fc94ba35 Mon Sep 17 00:00:00 2001 From: Sebastian Heunke Date: Tue, 9 Jun 2020 16:48:01 +0200 Subject: [PATCH 21/33] reenabled upload (was disbaled for testing purposes. --- .../podilizerproc/awslambda/Functions.java | 4 +-- .../awslambda/LambdaFunction.java | 32 ++++++------------- 2 files changed, 11 insertions(+), 25 deletions(-) diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java index bf01808..634da6b 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java @@ -65,12 +65,10 @@ public void write(){ String lamdaJarLocation = function.getAwsFiler().getPomPath().toString(); lamdaJarLocation = lamdaJarLocation.replace('\\', '/') + "/target/lambda-java-1.0-SNAPSHOT.jar"; - System.out.println("!!!!!!!!!!! Skipping upload !!!!!!!!!!!!!"); - /* TODO: JarUploader jarUploader = new JarUploader(function.getLambdaFunctionName(), lamdaJarLocation, "LambdaFunction::handleRequest", function.getLambdaAnnotation().region(), function.getLambdaAnnotation().timeOut(), function.getLambdaAnnotation().memorySize(), function.getLambdaAnnotation().endPoint()); - jarUploader.uploadFunction(); */ + jarUploader.uploadFunction(); } catch (IOException e) { e.printStackTrace(); } diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/LambdaFunction.java b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/LambdaFunction.java index 10c71d5..fb06553 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/LambdaFunction.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/LambdaFunction.java @@ -57,7 +57,6 @@ public String create() { String result = importsToString(imports()); result += "\n" + getClassSpecification(); result += "\n" + generateHandler(); - result += "\n" + removeAnnotations(method); return result + "\n}"; } @@ -101,6 +100,11 @@ public List imports() { cu.getImports()) { imports.add(importTree.getQualifiedIdentifier().toString()); } + if (cu.getPackageName() != null) { + // Import the target class itself, to make direct use of the annotated method + imports.add(cu.getPackageName().toString() + "." + clazz.getSimpleName()); + } + Collections.addAll(imports, defaultImports); return imports; } @@ -171,37 +175,21 @@ private String generateHandler() { } - /** - * Removes "@Lambda" and "@Invoker" annotations from method and adds "\t" to every string - * - * @param method to be formatted - * @return {@link String} of formatted method - */ - private String removeAnnotations(MethodTree method) { - String methodString = method.toString(); - String[] lines = methodString.split("\n"); - StringBuilder result = new StringBuilder(); - for (String line : lines) { - if (!line.startsWith("@Lambda") && !line.startsWith("@Invoker")) { - result.append("\t"); - result.append(line); - result.append("\n"); - } - } - return String.valueOf(result); - } - /** * Generates method call expression for lambda class * * @return java code line as {@link String} */ private String generateMethodCall() { + // TODO: Handle non static methods by adding another field to input type containing the target object AND + // another field to the output type which will contain the modified object + System.out.println("Class Name is: " + clazz.toString()); + System.out.println("Simple name is: " + clazz.getSimpleName()); String result = ""; if (!method.getReturnType().toString().equals("void")) { result += "" + method.getReturnType().toString() + " result = "; } - result += method.getName().toString() + "("; + result += clazz.getSimpleName() + "." + method.getName().toString() + "("; int i = 0; for (VariableTree param : method.getParameters()) { From 2105a4f9245fe2ee6f8ce19bfe4f99c6955261b4 Mon Sep 17 00:00:00 2001 From: Sebastian Heunke Date: Tue, 9 Jun 2020 17:01:04 +0200 Subject: [PATCH 22/33] Small adjustments to file generation and fixed bug with geneerated sources. --- .../annotations/LambdaProcessor.java | 22 +++++++++++++++++++ .../podilizerproc/awslambda/Functions.java | 8 +++---- .../awslambda/InputTypeEntity.java | 1 - .../awslambda/LambdaFunction.java | 2 -- .../podilizerproc/awslambda/PoJoEntity.java | 1 + 5 files changed, 27 insertions(+), 7 deletions(-) diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java b/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java index 3bf8781..2c4b24a 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java @@ -23,6 +23,9 @@ import javax.lang.model.type.ExecutableType; import javax.lang.model.type.TypeMirror; import javax.lang.model.util.Types; +import javax.tools.JavaFileObject; +import java.io.IOException; +import java.io.Writer; import java.util.ArrayList; import java.util.List; import java.util.Set; @@ -92,6 +95,25 @@ public boolean process(Set annotations, RoundEnvironment emeth.getReturnType()); functions.add(lambdaFunction); + try { + String packageName = lambdaFunction.generateInputPackage(); + String generatedClassPath = packageName.substring(8, packageName.length() - 1); + JavaFileObject inputType = processingEnv.getFiler().createSourceFile(generatedClassPath +".InputType", null); + JavaFileObject outputType = processingEnv.getFiler().createSourceFile(generatedClassPath + ".OutputType", null); + Writer writer = inputType.openWriter(); + Writer writer1 = outputType.openWriter(); + writer.append(lambdaFunction.generateInputPackage() + "\n\n"); + writer1.append(lambdaFunction.generateInputPackage() + "\n\n"); + writer.append(lambdaFunction.createInputType()); + writer1.append(lambdaFunction.createOutputType()); + writer.flush(); + writer1.flush(); + writer.close(); + writer1.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } Functions functionsWriter = new Functions(functions); functionsWriter.write(); diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java index 634da6b..7b88ed9 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java @@ -65,10 +65,10 @@ public void write(){ String lamdaJarLocation = function.getAwsFiler().getPomPath().toString(); lamdaJarLocation = lamdaJarLocation.replace('\\', '/') + "/target/lambda-java-1.0-SNAPSHOT.jar"; - JarUploader jarUploader = new JarUploader(function.getLambdaFunctionName(), lamdaJarLocation, "LambdaFunction::handleRequest", - function.getLambdaAnnotation().region(), function.getLambdaAnnotation().timeOut(), - function.getLambdaAnnotation().memorySize(), function.getLambdaAnnotation().endPoint()); - jarUploader.uploadFunction(); + //JarUploader jarUploader = new JarUploader(function.getLambdaFunctionName(), lamdaJarLocation, "LambdaFunction::handleRequest", + // function.getLambdaAnnotation().region(), function.getLambdaAnnotation().timeOut(), + // function.getLambdaAnnotation().memorySize(), function.getLambdaAnnotation().endPoint()); + //jarUploader.uploadFunction(); } catch (IOException e) { e.printStackTrace(); } diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/InputTypeEntity.java b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/InputTypeEntity.java index 4e7c69f..a0e7f7f 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/InputTypeEntity.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/InputTypeEntity.java @@ -20,7 +20,6 @@ public InputTypeEntity(String className, List params, Li for (TypeMirror inputType : inputTypes) { String typeString = inputType.toString(); if (typeString.contains(".")) { - System.out.println("INPUT IMPORT: " + typeString); importStatments.add(typeString); } } diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/LambdaFunction.java b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/LambdaFunction.java index fb06553..afe7310 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/LambdaFunction.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/LambdaFunction.java @@ -183,8 +183,6 @@ private String generateHandler() { private String generateMethodCall() { // TODO: Handle non static methods by adding another field to input type containing the target object AND // another field to the output type which will contain the modified object - System.out.println("Class Name is: " + clazz.toString()); - System.out.println("Simple name is: " + clazz.getSimpleName()); String result = ""; if (!method.getReturnType().toString().equals("void")) { result += "" + method.getReturnType().toString() + " result = "; diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/PoJoEntity.java b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/PoJoEntity.java index 502bcb9..31e6cae 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/PoJoEntity.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/PoJoEntity.java @@ -32,6 +32,7 @@ public String create() { private String generateImportStatements() { StringBuilder stringBuilder = new StringBuilder(); importStatments.forEach(statement -> stringBuilder.append("import ").append(statement).append(";\n")); + stringBuilder.append("\n"); // Make it look nice :) return stringBuilder.toString(); } From 8636b04ddcacac4d0d9c3de7d5f6659329202096 Mon Sep 17 00:00:00 2001 From: Sebastian Heunke Date: Tue, 9 Jun 2020 17:17:06 +0200 Subject: [PATCH 23/33] Minor logging changes. --- .../annotations/LambdaProcessor.java | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java b/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java index 2c4b24a..087a3cb 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java @@ -35,6 +35,8 @@ */ @SupportedAnnotationTypes({"ch.zhaw.splab.podilizerproc.annotations.Lambda"}) public class LambdaProcessor extends AbstractProcessor { + private static boolean LAMBDAS_PROCESSED = false; + private Trees trees; private Types typeUtils; @@ -46,15 +48,19 @@ public class LambdaProcessor extends AbstractProcessor { @Override public synchronized void init(ProcessingEnvironment processingEnv) { super.init(processingEnv); - trees = Trees.instance(processingEnv); - - System.out.println("[TERMITE] Annotation Proccessor init."); - typeUtils = processingEnv.getTypeUtils(); + if (!LAMBDAS_PROCESSED) { + trees = Trees.instance(processingEnv); + System.out.println("[TERMITE] Annotation Proccessor init."); + typeUtils = processingEnv.getTypeUtils(); + } } public boolean process(Set annotations, RoundEnvironment roundEnv) { + // TODO: For a normal maven compile call this class / method is called twice. + // This method should somehow detect if it was already run and should avoid executing twice. + List functions = new ArrayList<>(); Set annotatedMethods = roundEnv.getElementsAnnotatedWith(Lambda.class); @@ -97,6 +103,7 @@ public boolean process(Set annotations, RoundEnvironment try { String packageName = lambdaFunction.generateInputPackage(); + System.out.println("[TERMITE] Generating local Data Classes. For Package: " + packageName); String generatedClassPath = packageName.substring(8, packageName.length() - 1); JavaFileObject inputType = processingEnv.getFiler().createSourceFile(generatedClassPath +".InputType", null); JavaFileObject outputType = processingEnv.getFiler().createSourceFile(generatedClassPath + ".OutputType", null); @@ -110,8 +117,9 @@ public boolean process(Set annotations, RoundEnvironment writer1.flush(); writer.close(); writer1.close(); + System.out.println("[TERMITE] Successfully generated local sources."); } catch (IOException e) { - e.printStackTrace(); + System.out.println("[TERMITE] Failed to generate local sources. They probably already exist."); } } From 4cecff59ee3ca38c4e3dda7f73d0463d62fe9f33 Mon Sep 17 00:00:00 2001 From: Sebastian Heunke Date: Tue, 9 Jun 2020 17:43:15 +0200 Subject: [PATCH 24/33] Improved behaviour if multiple annotation processing runs are performed. --- .../annotations/LambdaProcessor.java | 24 ++++++++++++------- .../podilizerproc/awslambda/Functions.java | 8 +++---- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java b/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java index 087a3cb..d2f18f4 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java @@ -35,7 +35,6 @@ */ @SupportedAnnotationTypes({"ch.zhaw.splab.podilizerproc.annotations.Lambda"}) public class LambdaProcessor extends AbstractProcessor { - private static boolean LAMBDAS_PROCESSED = false; private Trees trees; private Types typeUtils; @@ -48,11 +47,9 @@ public class LambdaProcessor extends AbstractProcessor { @Override public synchronized void init(ProcessingEnvironment processingEnv) { super.init(processingEnv); - if (!LAMBDAS_PROCESSED) { - trees = Trees.instance(processingEnv); - System.out.println("[TERMITE] Annotation Proccessor init."); - typeUtils = processingEnv.getTypeUtils(); - } + trees = Trees.instance(processingEnv); + System.out.println("[TERMITE] Annotation Proccessor init."); + typeUtils = processingEnv.getTypeUtils(); } @@ -60,11 +57,20 @@ public synchronized void init(ProcessingEnvironment processingEnv) { public boolean process(Set annotations, RoundEnvironment roundEnv) { // TODO: For a normal maven compile call this class / method is called twice. // This method should somehow detect if it was already run and should avoid executing twice. + if (roundEnv.errorRaised()) { + System.out.println("[TERMITE] Code not compilable, skipping processing for now..."); + return false; + } + if (roundEnv.processingOver()) { + System.out.println("[TERMITE] Nothing left todo, skipping processing..."); + return false; + } + List functions = new ArrayList<>(); Set annotatedMethods = roundEnv.getElementsAnnotatedWith(Lambda.class); - if (annotatedMethods.size() == 0) { + if (annotatedMethods.isEmpty()) { return true; } DependencyResolver dependencyResolver = new DependencyResolver(trees, roundEnv); @@ -88,7 +94,7 @@ public boolean process(Set annotations, RoundEnvironment TreePath tp1 = trees.getPath(getMostExternalType(element)); cuVisitor.visit(tp1, trees); - ExecutableType emeth = (ExecutableType)element.asType(); + ExecutableType emeth = (ExecutableType) element.asType(); Lambda lambda = element.getAnnotation(Lambda.class); LambdaFunction lambdaFunction = @@ -105,7 +111,7 @@ public boolean process(Set annotations, RoundEnvironment String packageName = lambdaFunction.generateInputPackage(); System.out.println("[TERMITE] Generating local Data Classes. For Package: " + packageName); String generatedClassPath = packageName.substring(8, packageName.length() - 1); - JavaFileObject inputType = processingEnv.getFiler().createSourceFile(generatedClassPath +".InputType", null); + JavaFileObject inputType = processingEnv.getFiler().createSourceFile(generatedClassPath + ".InputType", null); JavaFileObject outputType = processingEnv.getFiler().createSourceFile(generatedClassPath + ".OutputType", null); Writer writer = inputType.openWriter(); Writer writer1 = outputType.openWriter(); diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java index 7b88ed9..634da6b 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java @@ -65,10 +65,10 @@ public void write(){ String lamdaJarLocation = function.getAwsFiler().getPomPath().toString(); lamdaJarLocation = lamdaJarLocation.replace('\\', '/') + "/target/lambda-java-1.0-SNAPSHOT.jar"; - //JarUploader jarUploader = new JarUploader(function.getLambdaFunctionName(), lamdaJarLocation, "LambdaFunction::handleRequest", - // function.getLambdaAnnotation().region(), function.getLambdaAnnotation().timeOut(), - // function.getLambdaAnnotation().memorySize(), function.getLambdaAnnotation().endPoint()); - //jarUploader.uploadFunction(); + JarUploader jarUploader = new JarUploader(function.getLambdaFunctionName(), lamdaJarLocation, "LambdaFunction::handleRequest", + function.getLambdaAnnotation().region(), function.getLambdaAnnotation().timeOut(), + function.getLambdaAnnotation().memorySize(), function.getLambdaAnnotation().endPoint()); + jarUploader.uploadFunction(); } catch (IOException e) { e.printStackTrace(); } From cef23564b6b7e37b31499b3706044d172d9c0b1f Mon Sep 17 00:00:00 2001 From: Sebastian Heunke Date: Tue, 9 Jun 2020 20:01:14 +0200 Subject: [PATCH 25/33] Added basic handling of non static methods, this reference does not yet work. --- .../splab/podilizerproc/aspect/Invoke.java | 32 ++++++++++++++++--- .../awslambda/InputTypeEntity.java | 18 +++++++++-- .../awslambda/LambdaFunction.java | 16 ++++++++-- 3 files changed, 56 insertions(+), 10 deletions(-) diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java b/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java index bb72ef7..08fabe1 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java @@ -22,9 +22,14 @@ import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.lang.reflect.Modifier; import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; +import java.rmi.server.ExportException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; @Aspect public class Invoke { @@ -73,15 +78,26 @@ private Object invokeOnLambda(Method method, Lambda lambda, ProceedingJoinPoint objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); String json = ""; try { + List ctorArgs = new ArrayList<>(); + if (!Modifier.isStatic(joinPoint.getSignature().getModifiers())) { + System.out.println("Adding explcit this arg..."); + ctorArgs.add(joinPoint.getTarget()); + } + ctorArgs.addAll(Arrays.asList(joinPoint.getArgs())); + + Constructor correctCtor = null; for (Constructor constructor : inClazz.getConstructors()) { - if (constructor.getParameterCount() == joinPoint.getArgs().length) { + if (constructor.getParameterCount() == ctorArgs.size()) { correctCtor = constructor; break; } } - Object inputObj = correctCtor.newInstance(joinPoint.getArgs()); + + Object inputObj = correctCtor.newInstance(ctorArgs.toArray()); json = objectMapper.writeValueAsString(inputObj); + // TODO: Remove these verbose printouts (Or make log level configurable) + System.out.println("[TERMITE] Sending: " + json); } catch (InstantiationException | IllegalAccessException | InvocationTargetException | JsonProcessingException e) { e.printStackTrace(); } @@ -92,8 +108,16 @@ private Object invokeOnLambda(Method method, Lambda lambda, ProceedingJoinPoint InvokeRequest invokeRequest = new InvokeRequest(); invokeRequest.setFunctionName(functionName); invokeRequest.setPayload(json); - outObj = objectMapper.readValue(byteBufferToString(awsLambda.invoke(invokeRequest).getPayload(), - StandardCharsets.UTF_8), outClazz); + String resultJson = byteBufferToString(awsLambda.invoke(invokeRequest).getPayload(), StandardCharsets.UTF_8); + System.out.println("[TERMITE] Receiving: " + resultJson); + System.out.println("!!!!!!!!!!!!!!!!!"); + try { + outObj = objectMapper.readValue(resultJson, outClazz); + } catch (Throwable t) { + System.out.println("ERRRRRROOOOOOOOR"); + System.out.println(resultJson); + } + // TODO: Remove these verbose printouts (Or make log level configurable) Class returnType = ((MethodSignature) joinPoint.getSignature()).getReturnType(); if (!returnType.equals(void.class)) { diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/InputTypeEntity.java b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/InputTypeEntity.java index a0e7f7f..c814ca5 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/InputTypeEntity.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/InputTypeEntity.java @@ -1,7 +1,9 @@ package ch.zhaw.splab.podilizerproc.awslambda; +import com.sun.source.tree.MethodTree; import com.sun.source.tree.VariableTree; +import javax.lang.model.element.Modifier; import javax.lang.model.type.TypeMirror; import java.util.AbstractMap; import java.util.List; @@ -11,11 +13,21 @@ */ public class InputTypeEntity extends PoJoEntity { - public InputTypeEntity(String className, List params, List inputTypes) { + /** This "weird" name is used to avoid any unintentional clashes with real variables */ + public static final String EXPLICIT_THIS_FIELD = "termiteExplicitThis"; + + public InputTypeEntity(String className, String qualifiedParentType, MethodTree method, List inputTypes) { super(className); + if (!method.getModifiers().getFlags().contains(Modifier.STATIC)) { + // Add an explicit this reference for non static methods + importStatments.add(qualifiedParentType); + String[] split = qualifiedParentType.split("\\."); + String parentSimpleName = split[split.length - 1]; + fields.add(new AbstractMap.SimpleEntry<>(parentSimpleName, EXPLICIT_THIS_FIELD)); + } for (VariableTree var : - params) { - fields.add(new AbstractMap.SimpleEntry(var.getType().toString(), var.getName().toString())); + method.getParameters()) { + fields.add(new AbstractMap.SimpleEntry<>(var.getType().toString(), var.getName().toString())); } for (TypeMirror inputType : inputTypes) { String typeString = inputType.toString(); diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/LambdaFunction.java b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/LambdaFunction.java index afe7310..2b29908 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/LambdaFunction.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/LambdaFunction.java @@ -4,6 +4,7 @@ import ch.zhaw.splab.podilizerproc.depdencies.CompilationUnitInfo; import com.sun.source.tree.*; +import javax.lang.model.element.Modifier; import javax.lang.model.type.TypeMirror; import java.util.ArrayList; import java.util.Collections; @@ -66,7 +67,7 @@ public String create() { * @return java code of InputType class as a {@link String} */ public String createInputType() { - InputTypeEntity inputType = new InputTypeEntity("InputType", method.getParameters(), inputTypes); + InputTypeEntity inputType = new InputTypeEntity("InputType", getQualifiedParentType(), method, inputTypes); return inputType.create(); } @@ -102,7 +103,7 @@ public List imports() { } if (cu.getPackageName() != null) { // Import the target class itself, to make direct use of the annotated method - imports.add(cu.getPackageName().toString() + "." + clazz.getSimpleName()); + imports.add(getQualifiedParentType()); } Collections.addAll(imports, defaultImports); @@ -187,7 +188,12 @@ private String generateMethodCall() { if (!method.getReturnType().toString().equals("void")) { result += "" + method.getReturnType().toString() + " result = "; } - result += clazz.getSimpleName() + "." + method.getName().toString() + "("; + if (method.getModifiers().getFlags().contains(Modifier.STATIC)) { + result += clazz.getSimpleName(); + } else { + result += "inputType.getTermiteExplicitThis()"; + } + result += "." + method.getName().toString() + "("; int i = 0; for (VariableTree param : method.getParameters()) { @@ -245,4 +251,8 @@ public String toString() { ", cu=" + cu + '}'; } + + private String getQualifiedParentType() { + return cu.getPackageName().toString() + "." + clazz.getSimpleName(); + } } From 5d657837499bd126cef3d4fcc685eddadbf4d373 Mon Sep 17 00:00:00 2001 From: Sebastian Heunke Date: Fri, 12 Jun 2020 14:50:05 +0200 Subject: [PATCH 26/33] Fixed handling of non static methods and added serialization for private properties. --- .../splab/podilizerproc/aspect/Invoke.java | 20 +++++++++---------- .../awslambda/LambdaFunction.java | 5 ++++- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java b/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java index 08fabe1..93a9bd8 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java @@ -11,6 +11,8 @@ import com.amazonaws.services.lambda.AWSLambda; import com.amazonaws.services.lambda.AWSLambdaClientBuilder; import com.amazonaws.services.lambda.model.InvokeRequest; +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; @@ -69,18 +71,18 @@ private Object invokeOnLambda(Method method, Lambda lambda, ProceedingJoinPoint .withCredentials(new AWSStaticCredentialsProvider(credentials)) .withRegion(region); - if (!lambda.endPoint().equals("")){ + if (!lambda.endPoint().equals("")) { clientBuilder = clientBuilder.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(lambda.endPoint(), regionName)); } AWSLambda awsLambda = clientBuilder.build(); ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); String json = ""; try { List ctorArgs = new ArrayList<>(); if (!Modifier.isStatic(joinPoint.getSignature().getModifiers())) { - System.out.println("Adding explcit this arg..."); ctorArgs.add(joinPoint.getTarget()); } ctorArgs.addAll(Arrays.asList(joinPoint.getArgs())); @@ -110,19 +112,18 @@ private Object invokeOnLambda(Method method, Lambda lambda, ProceedingJoinPoint invokeRequest.setPayload(json); String resultJson = byteBufferToString(awsLambda.invoke(invokeRequest).getPayload(), StandardCharsets.UTF_8); System.out.println("[TERMITE] Receiving: " + resultJson); - System.out.println("!!!!!!!!!!!!!!!!!"); try { outObj = objectMapper.readValue(resultJson, outClazz); } catch (Throwable t) { - System.out.println("ERRRRRROOOOOOOOR"); - System.out.println(resultJson); + System.out.println("[TERMITE] Failed to deserialize result."); } // TODO: Remove these verbose printouts (Or make log level configurable) - Class returnType = ((MethodSignature) joinPoint.getSignature()).getReturnType(); - if (!returnType.equals(void.class)) { + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + if (outObj != null && signature != null && !void.class.equals(signature.getReturnType())) { // GetResult is only generated for non void methods - methodResult = outObj.getClass().getDeclaredMethod("getResult").invoke(outObj); + Method getResultMethod = outObj.getClass().getDeclaredMethod("getResult"); + methodResult = getResultMethod.invoke(outObj); } } catch (Exception e) { e.printStackTrace(); @@ -138,7 +139,7 @@ private Object invokeOnLambda(Method method, Lambda lambda, ProceedingJoinPoint String functionReport = "Thread of Function " + method.getName() + " invocation was finished. " + "Function performed at - " + outObj.getClass().getDeclaredMethod("getDefaultReturn", null).invoke(outObj) + " - for " + outObj.getClass().getDeclaredMethod("getTime", null).invoke(outObj) + " ms"; - if (!method.getReturnType().toString().equals("void")){ + if (!method.getReturnType().toString().equals("void")) { functionReport += "; Return value is: " + outObj.getClass().getDeclaredMethod("getResult", null).invoke(outObj); } System.out.println(functionReport); @@ -150,7 +151,6 @@ private Object invokeOnLambda(Method method, Lambda lambda, ProceedingJoinPoint } - /** * Generates package name for input type based on method signature * diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/LambdaFunction.java b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/LambdaFunction.java index 2b29908..8f94d3d 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/LambdaFunction.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/LambdaFunction.java @@ -95,7 +95,9 @@ public List imports() { "com.amazonaws.services.lambda.runtime.RequestStreamHandler", "com.amazonaws.util.IOUtils", "com.fasterxml.jackson.databind.*", - "com.amazonaws.services.lambda.runtime.RequestHandler" + "com.amazonaws.services.lambda.runtime.RequestHandler", + "com.fasterxml.jackson.annotation.JsonAutoDetect", + "com.fasterxml.jackson.annotation.PropertyAccessor;" }; for (ImportTree importTree : cu.getImports()) { @@ -160,6 +162,7 @@ private String generateHandler() { "Context context) throws IOException {\n" + "\t\tlong time = System.currentTimeMillis();" + "\t\tObjectMapper objectMapper = new ObjectMapper();\n" + + "\t\tobjectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);\n" + "\t\tobjectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);\n" + "\t\tString inputString = IOUtils.toString(inputStream);\n" + "\t\tInputType inputType = objectMapper.readValue(inputString, InputType.class);\n"; From ff25864dfe6fb3721cbbb3f2e106aae85e86d37e Mon Sep 17 00:00:00 2001 From: Sebastian Heunke Date: Fri, 12 Jun 2020 16:19:19 +0200 Subject: [PATCH 27/33] Improved matching of lambda annotation to avoid deleting too much code. --- .../ch/zhaw/splab/podilizerproc/aspect/Invoke.java | 2 +- .../splab/podilizerproc/awslambda/Functions.java | 12 +++++------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java b/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java index 93a9bd8..516ffcf 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java @@ -28,7 +28,6 @@ import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; -import java.rmi.server.ExportException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -114,6 +113,7 @@ private Object invokeOnLambda(Method method, Lambda lambda, ProceedingJoinPoint System.out.println("[TERMITE] Receiving: " + resultJson); try { outObj = objectMapper.readValue(resultJson, outClazz); + objectMapper.readerForUpdating(outObj).readValue(resultJson); } catch (Throwable t) { System.out.println("[TERMITE] Failed to deserialize result."); } diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java index 634da6b..5660721 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java @@ -1,5 +1,6 @@ package ch.zhaw.splab.podilizerproc.awslambda; +import ch.zhaw.splab.podilizerproc.annotations.Lambda; import ch.zhaw.splab.podilizerproc.depdencies.CompilationUnitInfo; import org.codehaus.plexus.util.FileUtils; @@ -102,13 +103,10 @@ private void writeRequiredCompilationUnits(String path, LambdaFunction function) try(Reader reader = sourceFile.openReader(true); BufferedReader bufferedReader = new BufferedReader(reader); PrintWriter writer = new PrintWriter(targetFile)) { - String nextLine; - while ((nextLine = bufferedReader.readLine()) != null) { - if (!nextLine.contains("@Lambda")) { - writer.println(nextLine); - } - // TODO properly remove annotations from code instead of this workaround - } + bufferedReader + .lines() + .map(line -> line.replaceAll("@\\s*Lambda(\\s*\\([^)]*\\))?", "")) + .forEach(writer::println); } catch (IOException e) { System.out.println("[TERMITE] Failed to copy required compilation unit to " + absoluteFilePath); e.printStackTrace(); From d5438f4f8d92ce47af89027454142e7dea3598dd Mon Sep 17 00:00:00 2001 From: Sebastian Heunke Date: Fri, 12 Jun 2020 16:43:14 +0200 Subject: [PATCH 28/33] Made logging less verbose. --- .../splab/podilizerproc/annotations/LambdaProcessor.java | 5 ----- .../ch/zhaw/splab/podilizerproc/awslambda/Functions.java | 3 --- .../splab/podilizerproc/depdencies/DependencyResolver.java | 2 +- 3 files changed, 1 insertion(+), 9 deletions(-) diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java b/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java index d2f18f4..de5a03d 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java @@ -48,7 +48,6 @@ public class LambdaProcessor extends AbstractProcessor { public synchronized void init(ProcessingEnvironment processingEnv) { super.init(processingEnv); trees = Trees.instance(processingEnv); - System.out.println("[TERMITE] Annotation Proccessor init."); typeUtils = processingEnv.getTypeUtils(); } @@ -81,11 +80,7 @@ public boolean process(Set annotations, RoundEnvironment TypeScanner typeScanner = new TypeScanner(); CUVisitor cuVisitor = new CUVisitor(); - - System.out.println("###############################################################"); Set requiredCompilationUnits = dependencyResolver.resolveDependencies(element); - System.out.println("###############################################################"); - TreePath tp = trees.getPath(element); methodScanner.scan(tp, trees); diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java index 5660721..1baa837 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java @@ -32,10 +32,8 @@ public void write(){ functions) { try { String path = function.getAwsFiler().getPath().toString(); - System.out.println("Path is: " + path); function.getAwsFiler().createDirectories(); File file = new File(path + "/LambdaFunction.java"); - System.out.println(file.getAbsolutePath()); PrintWriter printWriter = new PrintWriter(file); printWriter.print(function.create()); printWriter.close(); @@ -99,7 +97,6 @@ private void writeRequiredCompilationUnits(String path, LambdaFunction function) System.out.println("[TERMITE] WARNING: File already exists " + absoluteFilePath); } - System.out.println("[TERMITE] START WRITE " + absoluteFilePath); try(Reader reader = sourceFile.openReader(true); BufferedReader bufferedReader = new BufferedReader(reader); PrintWriter writer = new PrintWriter(targetFile)) { diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/DependencyResolver.java b/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/DependencyResolver.java index 1977a69..a3ec46d 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/DependencyResolver.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/depdencies/DependencyResolver.java @@ -76,7 +76,7 @@ public Set resolveDependencies(Element element) { System.out.println("[TERMITE] WARNING: Unable to find package " + packageName); return Collections.emptySet(); } else { - System.out.println("[TERMITE] Found required dependencies for " + packageName); + System.out.println("[TERMITE] Found required dependencies for package " + packageName); return packageInfo.getRelevantDependencies(rootPckg) .stream() .map(JavaPackageInfo::getCompilationUnits) From 1bbacd30cf2c5adbc3daf24f54a97ccefd3e2fa8 Mon Sep 17 00:00:00 2001 From: Sebastian Heunke Date: Fri, 12 Jun 2020 18:49:53 +0200 Subject: [PATCH 29/33] Minor changes to fallback behaviour. --- .../splab/podilizerproc/aspect/Invoke.java | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java b/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java index 516ffcf..04a2946 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java @@ -37,7 +37,7 @@ public class Invoke { @Around("@annotation(lambda)") public Object anyExec(ProceedingJoinPoint joinPoint, - ch.zhaw.splab.podilizerproc.annotations.Lambda lambda) { + ch.zhaw.splab.podilizerproc.annotations.Lambda lambda) throws Throwable { System.out.println("[TERMITE] Annotation invoked"); MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); @@ -45,7 +45,8 @@ public Object anyExec(ProceedingJoinPoint joinPoint, return invokeOnLambda(method, lambda, joinPoint); } - private Object invokeOnLambda(Method method, Lambda lambda, ProceedingJoinPoint joinPoint) { + private Object invokeOnLambda(Method method, Lambda lambda, ProceedingJoinPoint joinPoint) throws Throwable { + Thread.dumpStack(); Class inClazz = null; Class outClazz = null; try { @@ -128,21 +129,24 @@ private Object invokeOnLambda(Method method, Lambda lambda, ProceedingJoinPoint } catch (Exception e) { e.printStackTrace(); System.out.println("Function " + method.getName() + " is unreachable. Processing locally..."); - try { - methodResult = joinPoint.proceed(joinPoint.getArgs()); - } catch (Throwable throwable) { - throwable.printStackTrace(); - } + + // Note: While using the joinPoint to proceed normal execution, the code will sometimes be executed twice. + // This is a known AspectJ Bug documented here: https://github.com/spring-projects/spring-framework/issues/24046 + methodResult = joinPoint.proceed(); } try { - String functionReport = "Thread of Function " + method.getName() + " invocation was finished. " + - "Function performed at - " + outObj.getClass().getDeclaredMethod("getDefaultReturn", null).invoke(outObj) + - " - for " + outObj.getClass().getDeclaredMethod("getTime", null).invoke(outObj) + " ms"; - if (!method.getReturnType().toString().equals("void")) { - functionReport += "; Return value is: " + outObj.getClass().getDeclaredMethod("getResult", null).invoke(outObj); + if (outObj != null) { + String functionReport = "Thread of Function " + method.getName() + " invocation was finished. " + + "Function performed at - " + outObj.getClass().getDeclaredMethod("getDefaultReturn", null).invoke(outObj) + + " - for " + outObj.getClass().getDeclaredMethod("getTime", null).invoke(outObj) + " ms"; + if (!method.getReturnType().toString().equals("void")) { + functionReport += "; Return value is: " + outObj.getClass().getDeclaredMethod("getResult", null).invoke(outObj); + } + System.out.println(functionReport); + } else { + System.out.println("Processed " + method.getName() + " locally with result " + methodResult); } - System.out.println(functionReport); } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { e.printStackTrace(); } From b66ab74c3bab3a5e671bc0848f91894f0bcb7d4f Mon Sep 17 00:00:00 2001 From: Sebastian Heunke Date: Tue, 23 Jun 2020 13:54:46 +0200 Subject: [PATCH 30/33] =?UTF-8?q?Fixed=20a=20bug=20with=20generics=20not?= =?UTF-8?q?=20being=20imported=20correctly=C3=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java | 7 ++++--- .../splab/podilizerproc/awslambda/InputTypeEntity.java | 8 +++++--- .../splab/podilizerproc/awslambda/OutputTypeEntity.java | 6 +++++- .../ch/zhaw/splab/podilizerproc/awslambda/PoJoEntity.java | 8 ++++++++ 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java b/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java index 04a2946..72c8883 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java @@ -46,7 +46,6 @@ public Object anyExec(ProceedingJoinPoint joinPoint, } private Object invokeOnLambda(Method method, Lambda lambda, ProceedingJoinPoint joinPoint) throws Throwable { - Thread.dumpStack(); Class inClazz = null; Class outClazz = null; try { @@ -99,7 +98,7 @@ private Object invokeOnLambda(Method method, Lambda lambda, ProceedingJoinPoint Object inputObj = correctCtor.newInstance(ctorArgs.toArray()); json = objectMapper.writeValueAsString(inputObj); // TODO: Remove these verbose printouts (Or make log level configurable) - System.out.println("[TERMITE] Sending: " + json); + System.out.println("[TERMITE] Sending json input."); } catch (InstantiationException | IllegalAccessException | InvocationTargetException | JsonProcessingException e) { e.printStackTrace(); } @@ -111,12 +110,14 @@ private Object invokeOnLambda(Method method, Lambda lambda, ProceedingJoinPoint invokeRequest.setFunctionName(functionName); invokeRequest.setPayload(json); String resultJson = byteBufferToString(awsLambda.invoke(invokeRequest).getPayload(), StandardCharsets.UTF_8); - System.out.println("[TERMITE] Receiving: " + resultJson); + System.out.println("[TERMITE] Received json output."); + System.out.flush(); try { outObj = objectMapper.readValue(resultJson, outClazz); objectMapper.readerForUpdating(outObj).readValue(resultJson); } catch (Throwable t) { System.out.println("[TERMITE] Failed to deserialize result."); + t.printStackTrace(); } // TODO: Remove these verbose printouts (Or make log level configurable) diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/InputTypeEntity.java b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/InputTypeEntity.java index c814ca5..dc39cc0 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/InputTypeEntity.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/InputTypeEntity.java @@ -32,10 +32,12 @@ public InputTypeEntity(String className, String qualifiedParentType, MethodTree for (TypeMirror inputType : inputTypes) { String typeString = inputType.toString(); if (typeString.contains(".")) { - importStatments.add(typeString); + if (typeString.contains("<")) { + importStatments.addAll(resolveGenericsFromImport(typeString)); + } else { + importStatments.add(typeString); + } } } - - } } diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/OutputTypeEntity.java b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/OutputTypeEntity.java index 8ccf2b8..58f133a 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/OutputTypeEntity.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/OutputTypeEntity.java @@ -19,7 +19,11 @@ public OutputTypeEntity(String className, Tree returnType, TypeMirror resultType } String resultTypeStr = resultType.toString(); if (resultTypeStr.contains(".")) { - importStatments.add(resultTypeStr); + if (resultTypeStr.contains("<")) { + importStatments.addAll(resolveGenericsFromImport(resultTypeStr)); + } else { + importStatments.add(resultTypeStr); + } } } } diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/PoJoEntity.java b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/PoJoEntity.java index 31e6cae..3770a86 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/PoJoEntity.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/PoJoEntity.java @@ -4,6 +4,9 @@ import java.util.AbstractMap; import java.util.ArrayList; import java.util.List; +import java.util.function.Predicate; +import java.util.stream.Collectors; +import java.util.stream.Stream; public abstract class PoJoEntity { private String className; @@ -111,4 +114,9 @@ private String generateFieldsDeclaration() { } return result; } + + protected List resolveGenericsFromImport(String str) { + // This is a cheap workaround to have all classes of a generic be its own import + return Stream.of(str.split("[<>]")).filter(Predicate.not(String::isBlank)).collect(Collectors.toList()); + } } From f7dd7f172b460728a606c257e07a08bc0f0a81a8 Mon Sep 17 00:00:00 2001 From: Sebastian Heunke Date: Tue, 23 Jun 2020 13:57:40 +0200 Subject: [PATCH 31/33] Added filtering of builtins to import List --- .../ch/zhaw/splab/podilizerproc/awslambda/PoJoEntity.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/PoJoEntity.java b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/PoJoEntity.java index 3770a86..18ff600 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/PoJoEntity.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/PoJoEntity.java @@ -117,6 +117,9 @@ private String generateFieldsDeclaration() { protected List resolveGenericsFromImport(String str) { // This is a cheap workaround to have all classes of a generic be its own import - return Stream.of(str.split("[<>]")).filter(Predicate.not(String::isBlank)).collect(Collectors.toList()); + return Stream.of(str.split("[<>]")) + .filter(Predicate.not(String::isBlank)) + .filter(typeName -> typeName.contains(".")) // filter out build-in types + .collect(Collectors.toList()); } } From 74761071b80ec4ed8f60d2284d7084bbe4eca520 Mon Sep 17 00:00:00 2001 From: Sebastian Heunke Date: Tue, 30 Jun 2020 20:12:53 +0200 Subject: [PATCH 32/33] Removed unused code. --- .../podilizerproc/annotations/LambdaProcessor.java | 2 -- .../ch/zhaw/splab/podilizerproc/aspect/Invoke.java | 12 +++++++----- .../splab/podilizerproc/awslambda/Functions.java | 2 -- .../java/ch/zhaw/splab/podilizerproc/util/Pair.java | 4 ---- 4 files changed, 7 insertions(+), 13 deletions(-) delete mode 100644 src/main/java/ch/zhaw/splab/podilizerproc/util/Pair.java diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java b/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java index de5a03d..b6863ae 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/annotations/LambdaProcessor.java @@ -7,7 +7,6 @@ import com.sun.source.tree.ClassTree; import com.sun.source.tree.CompilationUnitTree; import com.sun.source.tree.MethodTree; -import com.sun.source.tree.VariableTree; import com.sun.source.util.SimpleTreeVisitor; import com.sun.source.util.TreePath; import com.sun.source.util.TreePathScanner; @@ -21,7 +20,6 @@ import javax.lang.model.element.Element; import javax.lang.model.element.TypeElement; import javax.lang.model.type.ExecutableType; -import javax.lang.model.type.TypeMirror; import javax.lang.model.util.Types; import javax.tools.JavaFileObject; import java.io.IOException; diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java b/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java index 72c8883..0824857 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java @@ -11,6 +11,7 @@ import com.amazonaws.services.lambda.AWSLambda; import com.amazonaws.services.lambda.AWSLambdaClientBuilder; import com.amazonaws.services.lambda.model.InvokeRequest; +import com.amazonaws.services.lambda.model.InvokeResult; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.core.JsonProcessingException; @@ -109,8 +110,11 @@ private Object invokeOnLambda(Method method, Lambda lambda, ProceedingJoinPoint InvokeRequest invokeRequest = new InvokeRequest(); invokeRequest.setFunctionName(functionName); invokeRequest.setPayload(json); - String resultJson = byteBufferToString(awsLambda.invoke(invokeRequest).getPayload(), StandardCharsets.UTF_8); - System.out.println("[TERMITE] Received json output."); + System.out.println("[TERMITE] Starting "); + InvokeResult invokeResult = awsLambda.invoke(invokeRequest); + String resultJson = byteBufferToString(invokeResult.getPayload(), StandardCharsets.UTF_8); + System.out.println("[TERMITE] Received json output." + + " Size: " + invokeResult.getSdkHttpMetadata().getAllHttpHeaders().get("Content-Length")); System.out.flush(); try { outObj = objectMapper.readValue(resultJson, outClazz); @@ -135,15 +139,13 @@ private Object invokeOnLambda(Method method, Lambda lambda, ProceedingJoinPoint // This is a known AspectJ Bug documented here: https://github.com/spring-projects/spring-framework/issues/24046 methodResult = joinPoint.proceed(); } + awsLambda.shutdown(); try { if (outObj != null) { String functionReport = "Thread of Function " + method.getName() + " invocation was finished. " + "Function performed at - " + outObj.getClass().getDeclaredMethod("getDefaultReturn", null).invoke(outObj) + " - for " + outObj.getClass().getDeclaredMethod("getTime", null).invoke(outObj) + " ms"; - if (!method.getReturnType().toString().equals("void")) { - functionReport += "; Return value is: " + outObj.getClass().getDeclaredMethod("getResult", null).invoke(outObj); - } System.out.println(functionReport); } else { System.out.println("Processed " + method.getName() + " locally with result " + methodResult); diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java index 1baa837..dd3d278 100644 --- a/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java +++ b/src/main/java/ch/zhaw/splab/podilizerproc/awslambda/Functions.java @@ -1,6 +1,5 @@ package ch.zhaw.splab.podilizerproc.awslambda; -import ch.zhaw.splab.podilizerproc.annotations.Lambda; import ch.zhaw.splab.podilizerproc.depdencies.CompilationUnitInfo; import org.codehaus.plexus.util.FileUtils; @@ -8,7 +7,6 @@ import java.io.*; import java.net.URL; import java.net.URLClassLoader; -import java.nio.file.Files; import java.util.List; import java.util.Set; diff --git a/src/main/java/ch/zhaw/splab/podilizerproc/util/Pair.java b/src/main/java/ch/zhaw/splab/podilizerproc/util/Pair.java deleted file mode 100644 index 5dbd815..0000000 --- a/src/main/java/ch/zhaw/splab/podilizerproc/util/Pair.java +++ /dev/null @@ -1,4 +0,0 @@ -package ch.zhaw.splab.podilizerproc.util; - -public class Pair { -} From fad496265e854fc402daddafeaea7e067ebf5bb5 Mon Sep 17 00:00:00 2001 From: HmSebastianH Date: Tue, 30 Jun 2020 20:20:19 +0200 Subject: [PATCH 33/33] Delete Termite.iml --- Termite.iml | 35 ----------------------------------- 1 file changed, 35 deletions(-) delete mode 100644 Termite.iml diff --git a/Termite.iml b/Termite.iml deleted file mode 100644 index dbc7772..0000000 --- a/Termite.iml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file