diff --git a/pom.xml b/pom.xml
index fc4d73c..467cb11 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,8 +10,8 @@
UTF-8
- 1.8
- 1.8.2
+ 11
+ 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
+ 11
+ 11
-proc:none
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..b6863ae 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,8 @@
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;
import com.sun.source.tree.MethodTree;
@@ -10,25 +12,33 @@
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.tools.Diagnostic;
+import javax.lang.model.type.ExecutableType;
+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
*/
@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
+ * Initialization.
*
* @param processingEnv
*/
@@ -36,18 +46,31 @@ public class LambdaProcessor extends AbstractProcessor {
public synchronized void init(ProcessingEnvironment processingEnv) {
super.init(processingEnv);
trees = Trees.instance(processingEnv);
+ typeUtils = processingEnv.getTypeUtils();
}
public boolean process(Set extends TypeElement> 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 extends Element> annotatedMethods = roundEnv.getElementsAnnotatedWith(Lambda.class);
- if (annotatedMethods.size() == 0) {
+ if (annotatedMethods.isEmpty()) {
return true;
}
+ DependencyResolver dependencyResolver = new DependencyResolver(trees, roundEnv);
for (Element element :
annotatedMethods) {
@@ -55,6 +78,7 @@ public boolean process(Set extends TypeElement> annotations, RoundEnvironment
TypeScanner typeScanner = new TypeScanner();
CUVisitor cuVisitor = new CUVisitor();
+ Set requiredCompilationUnits = dependencyResolver.resolveDependencies(element);
TreePath tp = trees.getPath(element);
methodScanner.scan(tp, trees);
@@ -63,15 +87,24 @@ public boolean process(Set extends TypeElement> 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);
+ new LambdaFunction(methodScanner.getMethod(),
+ typeScanner.getClazz(),
+ cuVisitor.getCu(),
+ lambda,
+ requiredCompilationUnits,
+ emeth.getParameterTypes(),
+ emeth.getReturnType());
functions.add(lambdaFunction);
+
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 inputType = processingEnv.getFiler().createSourceFile(generatedClassPath + ".InputType", null);
JavaFileObject outputType = processingEnv.getFiler().createSourceFile(generatedClassPath + ".OutputType", null);
Writer writer = inputType.openWriter();
Writer writer1 = outputType.openWriter();
@@ -81,8 +114,11 @@ public boolean process(Set extends TypeElement> annotations, RoundEnvironment
writer1.append(lambdaFunction.createOutputType());
writer.flush();
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.");
}
}
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..0824857 100644
--- a/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java
+++ b/src/main/java/ch/zhaw/splab/podilizerproc/aspect/Invoke.java
@@ -1,12 +1,37 @@
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.AWSStaticCredentialsProvider;
+import com.amazonaws.auth.BasicAWSCredentials;
+import com.amazonaws.client.builder.AwsClientBuilder;
+import com.amazonaws.regions.Regions;
+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;
+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;
+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.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
@Aspect
public class Invoke {
@@ -14,12 +39,168 @@ 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();
- InvokeThread invokeThread = new InvokeThread(method, lambda, joinPoint);
- invokeThread.start();
- return null;
+ return invokeOnLambda(method, lambda, joinPoint);
}
+ private Object invokeOnLambda(Method method, Lambda lambda, ProceedingJoinPoint joinPoint) throws Throwable {
+ 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);
+ Regions region = Regions.fromName(regionName);
+
+
+ AWSLambdaClientBuilder clientBuilder = AWSLambdaClientBuilder
+ .standard()
+ .withCredentials(new AWSStaticCredentialsProvider(credentials))
+ .withRegion(region);
+
+ 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