diff --git a/aws-lambda/pom.xml b/aws-lambda/pom.xml new file mode 100644 index 0000000000..878e4db109 --- /dev/null +++ b/aws-lambda/pom.xml @@ -0,0 +1,99 @@ + + + + parent-modules + com.baeldung + 1.0.0-SNAPSHOT + + 4.0.0 + + com.baeldung + aws-lambda + 0.1.0-SNAPSHOT + jar + aws-lambda + + + + + com.amazonaws + aws-java-sdk-dynamodb + 1.11.241 + + + com.amazonaws + aws-java-sdk-core + 1.11.241 + + + com.amazonaws + aws-lambda-java-core + ${aws-lambda-java-core.version} + + + commons-logging + commons-logging + + + + + com.amazonaws + aws-lambda-java-events + ${aws-lambda-java-events.version} + + + commons-logging + commons-logging + + + + + com.google.code.gson + gson + ${gson.version} + + + commons-io + commons-io + ${commons-io.version} + + + com.googlecode.json-simple + json-simple + ${json-simple.version} + + + + + + org.apache.maven.plugins + maven-shade-plugin + ${maven-shade-plugin.version} + + false + + + + package + + shade + + + + + + + + 1.1.1 + 20180130 + 2.5 + 1.3.0 + 1.2.0 + 2.8.2 + 1.11.241 + 3.0.0 + 2.10 + + \ No newline at end of file diff --git a/aws/src/main/java/com/baeldung/lambda/LambdaMethodHandler.java b/aws-lambda/src/main/java/com/baeldung/lambda/LambdaMethodHandler.java similarity index 100% rename from aws/src/main/java/com/baeldung/lambda/LambdaMethodHandler.java rename to aws-lambda/src/main/java/com/baeldung/lambda/LambdaMethodHandler.java diff --git a/aws/src/main/java/com/baeldung/lambda/LambdaRequestHandler.java b/aws-lambda/src/main/java/com/baeldung/lambda/LambdaRequestHandler.java similarity index 100% rename from aws/src/main/java/com/baeldung/lambda/LambdaRequestHandler.java rename to aws-lambda/src/main/java/com/baeldung/lambda/LambdaRequestHandler.java diff --git a/aws/src/main/java/com/baeldung/lambda/LambdaRequestStreamHandler.java b/aws-lambda/src/main/java/com/baeldung/lambda/LambdaRequestStreamHandler.java similarity index 100% rename from aws/src/main/java/com/baeldung/lambda/LambdaRequestStreamHandler.java rename to aws-lambda/src/main/java/com/baeldung/lambda/LambdaRequestStreamHandler.java diff --git a/aws-lambda/src/main/java/com/baeldung/lambda/apigateway/APIDemoHandler.java b/aws-lambda/src/main/java/com/baeldung/lambda/apigateway/APIDemoHandler.java new file mode 100644 index 0000000000..328915c028 --- /dev/null +++ b/aws-lambda/src/main/java/com/baeldung/lambda/apigateway/APIDemoHandler.java @@ -0,0 +1,166 @@ +package com.baeldung.lambda.apigateway; + +import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; +import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; +import com.amazonaws.services.dynamodbv2.document.*; +import com.amazonaws.services.dynamodbv2.document.spec.PutItemSpec; +import com.amazonaws.services.lambda.runtime.Context; +import com.amazonaws.services.lambda.runtime.RequestStreamHandler; +import com.baeldung.lambda.apigateway.model.Person; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.json.simple.parser.ParseException; + +import java.io.*; + +public class APIDemoHandler implements RequestStreamHandler { + + private JSONParser parser = new JSONParser(); + private static final String DYNAMODB_TABLE_NAME = System.getenv("TABLE_NAME"); + + @Override + public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException { + + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); + JSONObject responseJson = new JSONObject(); + + AmazonDynamoDB client = AmazonDynamoDBClientBuilder.defaultClient(); + DynamoDB dynamoDb = new DynamoDB(client); + + try { + JSONObject event = (JSONObject) parser.parse(reader); + + if (event.get("body") != null) { + + Person person = new Person((String) event.get("body")); + + dynamoDb.getTable(DYNAMODB_TABLE_NAME) + .putItem(new PutItemSpec().withItem(new Item().withNumber("id", person.getId()) + .withString("firstName", person.getFirstName()) + .withString("lastName", person.getLastName()).withNumber("age", person.getAge()) + .withString("address", person.getAddress()))); + } + + JSONObject responseBody = new JSONObject(); + responseBody.put("message", "New item created"); + + JSONObject headerJson = new JSONObject(); + headerJson.put("x-custom-header", "my custom header value"); + + responseJson.put("statusCode", 200); + responseJson.put("headers", headerJson); + responseJson.put("body", responseBody.toString()); + + } catch (ParseException pex) { + responseJson.put("statusCode", 400); + responseJson.put("exception", pex); + } + + OutputStreamWriter writer = new OutputStreamWriter(outputStream, "UTF-8"); + writer.write(responseJson.toString()); + writer.close(); + } + + public void handleGetByPathParam(InputStream inputStream, OutputStream outputStream, Context context) + throws IOException { + + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); + JSONObject responseJson = new JSONObject(); + + AmazonDynamoDB client = AmazonDynamoDBClientBuilder.defaultClient(); + DynamoDB dynamoDb = new DynamoDB(client); + + Item result = null; + try { + JSONObject event = (JSONObject) parser.parse(reader); + JSONObject responseBody = new JSONObject(); + + if (event.get("pathParameters") != null) { + + JSONObject pps = (JSONObject) event.get("pathParameters"); + if (pps.get("id") != null) { + + int id = Integer.parseInt((String) pps.get("id")); + result = dynamoDb.getTable(DYNAMODB_TABLE_NAME).getItem("id", id); + } + + } + if (result != null) { + + Person person = new Person(result.toJSON()); + responseBody.put("Person", person); + responseJson.put("statusCode", 200); + } else { + + responseBody.put("message", "No item found"); + responseJson.put("statusCode", 404); + } + + JSONObject headerJson = new JSONObject(); + headerJson.put("x-custom-header", "my custom header value"); + + responseJson.put("headers", headerJson); + responseJson.put("body", responseBody.toString()); + + } catch (ParseException pex) { + responseJson.put("statusCode", 400); + responseJson.put("exception", pex); + } + + OutputStreamWriter writer = new OutputStreamWriter(outputStream, "UTF-8"); + writer.write(responseJson.toString()); + writer.close(); + } + + public void handleGetByQueryParam(InputStream inputStream, OutputStream outputStream, Context context) + throws IOException { + + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); + JSONObject responseJson = new JSONObject(); + + AmazonDynamoDB client = AmazonDynamoDBClientBuilder.defaultClient(); + DynamoDB dynamoDb = new DynamoDB(client); + + Item result = null; + try { + JSONObject event = (JSONObject) parser.parse(reader); + JSONObject responseBody = new JSONObject(); + + if (event.get("queryStringParameters") != null) { + + JSONObject qps = (JSONObject) event.get("queryStringParameters"); + if (qps.get("id") != null) { + + int id = Integer.parseInt((String) qps.get("id")); + result = dynamoDb.getTable(DYNAMODB_TABLE_NAME).getItem("id", id); + } + } + + if (result != null) { + + Person person = new Person(result.toJSON()); + responseBody.put("Person", person); + responseJson.put("statusCode", 200); + } else { + + responseBody.put("message", "No item found"); + responseJson.put("statusCode", 404); + } + + JSONObject headerJson = new JSONObject(); + headerJson.put("x-custom-header", "my custom header value"); + + responseJson.put("headers", headerJson); + responseJson.put("body", responseBody.toString()); + + } catch (ParseException pex) { + responseJson.put("statusCode", 400); + responseJson.put("exception", pex); + } + + OutputStreamWriter writer = new OutputStreamWriter(outputStream, "UTF-8"); + writer.write(responseJson.toString()); + writer.close(); + } + +} diff --git a/aws-lambda/src/main/java/com/baeldung/lambda/apigateway/model/Person.java b/aws-lambda/src/main/java/com/baeldung/lambda/apigateway/model/Person.java new file mode 100644 index 0000000000..3be7b261cd --- /dev/null +++ b/aws-lambda/src/main/java/com/baeldung/lambda/apigateway/model/Person.java @@ -0,0 +1,68 @@ +package com.baeldung.lambda.apigateway.model; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +public class Person { + + private int id; + private String firstName; + private String lastName; + private int age; + private String address; + + public Person(String json) { + Gson gson = new Gson(); + Person request = gson.fromJson(json, Person.class); + this.id = request.getId(); + this.firstName = request.getFirstName(); + this.lastName = request.getLastName(); + this.age = request.getAge(); + this.address = request.getAddress(); + } + + public String toString() { + final Gson gson = new GsonBuilder().setPrettyPrinting().create(); + return gson.toJson(this); + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } +} diff --git a/aws/src/main/java/com/baeldung/lambda/dynamodb/SavePersonHandler.java b/aws-lambda/src/main/java/com/baeldung/lambda/dynamodb/SavePersonHandler.java similarity index 100% rename from aws/src/main/java/com/baeldung/lambda/dynamodb/SavePersonHandler.java rename to aws-lambda/src/main/java/com/baeldung/lambda/dynamodb/SavePersonHandler.java diff --git a/aws/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonRequest.java b/aws-lambda/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonRequest.java similarity index 100% rename from aws/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonRequest.java rename to aws-lambda/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonRequest.java diff --git a/aws/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonResponse.java b/aws-lambda/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonResponse.java similarity index 100% rename from aws/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonResponse.java rename to aws-lambda/src/main/java/com/baeldung/lambda/dynamodb/bean/PersonResponse.java diff --git a/pom.xml b/pom.xml index 39419ec035..edb60f0fac 100644 --- a/pom.xml +++ b/pom.xml @@ -18,6 +18,7 @@ atomix apache-cayenne aws + aws-lambda akka-streams algorithms annotations