From 6a5b26e1b898605468330834b56b5409b7498802 Mon Sep 17 00:00:00 2001 From: Robert Volkmann <20912167+robertvolkmann@users.noreply.github.com> Date: Tue, 29 Nov 2022 18:43:40 +0100 Subject: [PATCH] Feature: remove eip and cloud patterns (#2354) * feat: remove EIP patterns * feat: remove cloud patterns * feat: remove serverless pattern --- cloud-claim-check-pattern/.gitignore | 38 --- cloud-claim-check-pattern/README.md | 80 ----- .../call-usage-app/.gitignore | 38 --- .../etc/call-usage-app.urm.puml | 117 ------- .../call-usage-app/host.json | 7 - .../call-usage-app/pom.xml | 152 --------- .../functions/UsageCostProcessorFunction.java | 169 --------- .../claimcheckpattern/domain/Message.java | 44 --- .../claimcheckpattern/domain/MessageBody.java | 44 --- .../domain/MessageHeader.java | 48 --- .../domain/MessageReference.java | 46 --- .../domain/UsageCostDetail.java | 44 --- .../claimcheckpattern/domain/UsageDetail.java | 45 --- .../UsageDetailPublisherFunction.java | 147 -------- .../utility/EventHandlerUtility.java | 67 ---- .../utility/MessageHandlerUtility.java | 128 ------- .../HttpResponseMessageMock.java | 106 ------ .../UsageCostProcessorFunctionTest.java | 182 ---------- .../UsageDetailPublisherFunctionTest.java | 120 ------- .../utility/EventHandlerUtilityTest.java | 71 ---- .../utility/MessageHandlerUtilityTest.java | 115 ------- .../org.mockito.plugins.MockMaker | 1 - .../subscriptionValidationEvent.json | 15 - .../src/test/resources/usageDetailEvent.json | 15 - .../etc/Claim-Check-Pattern.png | Bin 53447 -> 0 bytes .../etc/claim-check-pattern.urm.puml | 117 ------- .../etc/class-diagram.png | Bin 110789 -> 0 bytes cloud-claim-check-pattern/pom.xml | 71 ---- cloud-static-content-hosting/README.md | 145 -------- .../etc/static-content-hosting.drawio | 1 - .../etc/static-content-hosting.png | Bin 88049 -> 0 bytes eip-aggregator/README.md | 30 -- eip-aggregator/etc/aggregator.gif | Bin 2413 -> 0 bytes eip-aggregator/etc/eip-aggregator.urm.puml | 14 - eip-aggregator/pom.xml | 93 ----- .../java/com/iluwatar/eip/aggregator/App.java | 71 ---- .../aggregator/routes/AggregatorRoute.java | 60 ---- .../routes/MessageAggregationStrategy.java | 51 --- .../src/main/resources/application.properties | 25 -- .../com/iluwatar/eip/aggregator/AppTest.java | 47 --- .../routes/AggregatorRouteTest.java | 87 ----- .../MessageAggregationStrategyTest.java | 68 ---- .../resources/application-test.properties | 25 -- eip-message-channel/.gitignore | 1 - eip-message-channel/README.md | 24 -- .../etc/eip-message-channel.urm.puml | 9 - eip-message-channel/etc/message-channel.png | Bin 47216 -> 0 bytes eip-message-channel/etc/message-channel.ucls | 320 ------------------ eip-message-channel/pom.xml | 70 ---- .../com/iluwatar/eip/message/channel/App.java | 73 ---- .../iluwatar/eip/message/channel/AppTest.java | 47 --- eip-publish-subscribe/.gitignore | 1 - eip-publish-subscribe/README.md | 23 -- .../etc/eip-publish-subscribe.urm.puml | 9 - .../etc/publish-subscribe.png | Bin 27741 -> 0 bytes .../etc/publish-subscribe.ucls | 218 ------------ eip-publish-subscribe/pom.xml | 70 ---- .../iluwatar/eip/publish/subscribe/App.java | 68 ---- .../src/main/resources/logback.xml | 49 --- .../eip/publish/subscribe/AppTest.java | 47 --- eip-splitter/README.md | 29 -- eip-splitter/etc/eip-splitter.urm.puml | 8 - eip-splitter/etc/sequencer.gif | Bin 2298 -> 0 bytes eip-splitter/pom.xml | 93 ----- .../java/com/iluwatar/eip/splitter/App.java | 77 ----- .../eip/splitter/routes/SplitterRoute.java | 53 --- .../src/main/resources/application.properties | 25 -- .../com/iluwatar/eip/splitter/AppTest.java | 47 --- .../splitter/routes/SplitterRouteTest.java | 75 ---- .../resources/application-test.properties | 25 -- eip-wire-tap/README.md | 27 -- eip-wire-tap/etc/eip-wire-tap.urm.puml | 8 - eip-wire-tap/etc/wiretap.gif | Bin 3067 -> 0 bytes eip-wire-tap/pom.xml | 93 ----- .../java/com/iluwatar/eip/wiretap/App.java | 76 ----- .../eip/wiretap/routes/WireTapRoute.java | 57 ---- .../src/main/resources/application.properties | 26 -- .../com/iluwatar/eip/wiretap/AppTest.java | 47 --- .../eip/wiretap/routes/WireTapRouteTest.java | 86 ----- .../resources/application-test.properties | 26 -- pom.xml | 20 -- serverless/README.md | 201 ----------- serverless/etc/aws-black.png | Bin 9262 -> 0 bytes serverless/etc/azure-black.png | Bin 4707 -> 0 bytes serverless/etc/gcf-black.png | Bin 7651 -> 0 bytes serverless/etc/kubeless-logos-black.png | Bin 8939 -> 0 bytes serverless/etc/openwhisk-black.png | Bin 5722 -> 0 bytes serverless/etc/serverless.urm.png | Bin 219522 -> 0 bytes serverless/etc/serverless.urm.puml | 138 -------- serverless/etc/spotinst-logos-black-small.png | Bin 5412 -> 0 bytes serverless/etc/webtask-small-grayscale.png | Bin 8420 -> 0 bytes serverless/pom.xml | 112 ------ serverless/serverless.yml | 104 ------ .../baas/api/AbstractDynamoDbHandler.java | 95 ------ .../baas/api/FindPersonApiHandler.java | 56 --- .../baas/api/SavePersonApiHandler.java | 58 ---- .../serverless/baas/model/Address.java | 62 ---- .../serverless/baas/model/Person.java | 64 ---- .../serverless/faas/ApiGatewayResponse.java | 174 ---------- .../iluwatar/serverless/faas/LambdaInfo.java | 51 --- .../faas/api/LambdaInfoApiHandler.java | 76 ----- .../baas/api/FindPersonApiHandlerTest.java | 70 ---- .../baas/api/SavePersonApiHandlerTest.java | 103 ------ .../faas/api/LambdaInfoApiHandlerTest.java | 48 --- 104 files changed, 6083 deletions(-) delete mode 100644 cloud-claim-check-pattern/.gitignore delete mode 100644 cloud-claim-check-pattern/README.md delete mode 100644 cloud-claim-check-pattern/call-usage-app/.gitignore delete mode 100644 cloud-claim-check-pattern/call-usage-app/etc/call-usage-app.urm.puml delete mode 100644 cloud-claim-check-pattern/call-usage-app/host.json delete mode 100644 cloud-claim-check-pattern/call-usage-app/pom.xml delete mode 100644 cloud-claim-check-pattern/call-usage-app/src/main/java/com/iluwatar/claimcheckpattern/consumer/callcostprocessor/functions/UsageCostProcessorFunction.java delete mode 100644 cloud-claim-check-pattern/call-usage-app/src/main/java/com/iluwatar/claimcheckpattern/domain/Message.java delete mode 100644 cloud-claim-check-pattern/call-usage-app/src/main/java/com/iluwatar/claimcheckpattern/domain/MessageBody.java delete mode 100644 cloud-claim-check-pattern/call-usage-app/src/main/java/com/iluwatar/claimcheckpattern/domain/MessageHeader.java delete mode 100644 cloud-claim-check-pattern/call-usage-app/src/main/java/com/iluwatar/claimcheckpattern/domain/MessageReference.java delete mode 100644 cloud-claim-check-pattern/call-usage-app/src/main/java/com/iluwatar/claimcheckpattern/domain/UsageCostDetail.java delete mode 100644 cloud-claim-check-pattern/call-usage-app/src/main/java/com/iluwatar/claimcheckpattern/domain/UsageDetail.java delete mode 100644 cloud-claim-check-pattern/call-usage-app/src/main/java/com/iluwatar/claimcheckpattern/producer/calldetails/functions/UsageDetailPublisherFunction.java delete mode 100644 cloud-claim-check-pattern/call-usage-app/src/main/java/com/iluwatar/claimcheckpattern/utility/EventHandlerUtility.java delete mode 100644 cloud-claim-check-pattern/call-usage-app/src/main/java/com/iluwatar/claimcheckpattern/utility/MessageHandlerUtility.java delete mode 100644 cloud-claim-check-pattern/call-usage-app/src/test/java/com/iluwatar/claimcheckpattern/HttpResponseMessageMock.java delete mode 100644 cloud-claim-check-pattern/call-usage-app/src/test/java/com/iluwatar/claimcheckpattern/consumer/callcostprocessor/functions/UsageCostProcessorFunctionTest.java delete mode 100644 cloud-claim-check-pattern/call-usage-app/src/test/java/com/iluwatar/claimcheckpattern/producer/calldetails/functions/UsageDetailPublisherFunctionTest.java delete mode 100644 cloud-claim-check-pattern/call-usage-app/src/test/java/com/iluwatar/claimcheckpattern/utility/EventHandlerUtilityTest.java delete mode 100644 cloud-claim-check-pattern/call-usage-app/src/test/java/com/iluwatar/claimcheckpattern/utility/MessageHandlerUtilityTest.java delete mode 100644 cloud-claim-check-pattern/call-usage-app/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker delete mode 100644 cloud-claim-check-pattern/call-usage-app/src/test/resources/subscriptionValidationEvent.json delete mode 100644 cloud-claim-check-pattern/call-usage-app/src/test/resources/usageDetailEvent.json delete mode 100644 cloud-claim-check-pattern/etc/Claim-Check-Pattern.png delete mode 100644 cloud-claim-check-pattern/etc/claim-check-pattern.urm.puml delete mode 100644 cloud-claim-check-pattern/etc/class-diagram.png delete mode 100644 cloud-claim-check-pattern/pom.xml delete mode 100644 cloud-static-content-hosting/README.md delete mode 100644 cloud-static-content-hosting/etc/static-content-hosting.drawio delete mode 100644 cloud-static-content-hosting/etc/static-content-hosting.png delete mode 100644 eip-aggregator/README.md delete mode 100644 eip-aggregator/etc/aggregator.gif delete mode 100644 eip-aggregator/etc/eip-aggregator.urm.puml delete mode 100644 eip-aggregator/pom.xml delete mode 100644 eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/App.java delete mode 100644 eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/AggregatorRoute.java delete mode 100644 eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategy.java delete mode 100644 eip-aggregator/src/main/resources/application.properties delete mode 100644 eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/AppTest.java delete mode 100644 eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/AggregatorRouteTest.java delete mode 100644 eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategyTest.java delete mode 100644 eip-aggregator/src/test/resources/application-test.properties delete mode 100644 eip-message-channel/.gitignore delete mode 100644 eip-message-channel/README.md delete mode 100644 eip-message-channel/etc/eip-message-channel.urm.puml delete mode 100644 eip-message-channel/etc/message-channel.png delete mode 100644 eip-message-channel/etc/message-channel.ucls delete mode 100644 eip-message-channel/pom.xml delete mode 100644 eip-message-channel/src/main/java/com/iluwatar/eip/message/channel/App.java delete mode 100644 eip-message-channel/src/test/java/com/iluwatar/eip/message/channel/AppTest.java delete mode 100644 eip-publish-subscribe/.gitignore delete mode 100644 eip-publish-subscribe/README.md delete mode 100644 eip-publish-subscribe/etc/eip-publish-subscribe.urm.puml delete mode 100644 eip-publish-subscribe/etc/publish-subscribe.png delete mode 100644 eip-publish-subscribe/etc/publish-subscribe.ucls delete mode 100644 eip-publish-subscribe/pom.xml delete mode 100644 eip-publish-subscribe/src/main/java/com/iluwatar/eip/publish/subscribe/App.java delete mode 100644 eip-publish-subscribe/src/main/resources/logback.xml delete mode 100644 eip-publish-subscribe/src/test/java/com/iluwatar/eip/publish/subscribe/AppTest.java delete mode 100644 eip-splitter/README.md delete mode 100644 eip-splitter/etc/eip-splitter.urm.puml delete mode 100644 eip-splitter/etc/sequencer.gif delete mode 100644 eip-splitter/pom.xml delete mode 100644 eip-splitter/src/main/java/com/iluwatar/eip/splitter/App.java delete mode 100644 eip-splitter/src/main/java/com/iluwatar/eip/splitter/routes/SplitterRoute.java delete mode 100644 eip-splitter/src/main/resources/application.properties delete mode 100644 eip-splitter/src/test/java/com/iluwatar/eip/splitter/AppTest.java delete mode 100644 eip-splitter/src/test/java/com/iluwatar/eip/splitter/routes/SplitterRouteTest.java delete mode 100644 eip-splitter/src/test/resources/application-test.properties delete mode 100644 eip-wire-tap/README.md delete mode 100644 eip-wire-tap/etc/eip-wire-tap.urm.puml delete mode 100644 eip-wire-tap/etc/wiretap.gif delete mode 100644 eip-wire-tap/pom.xml delete mode 100644 eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/App.java delete mode 100644 eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/routes/WireTapRoute.java delete mode 100644 eip-wire-tap/src/main/resources/application.properties delete mode 100644 eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/AppTest.java delete mode 100644 eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/routes/WireTapRouteTest.java delete mode 100644 eip-wire-tap/src/test/resources/application-test.properties delete mode 100644 serverless/README.md delete mode 100644 serverless/etc/aws-black.png delete mode 100644 serverless/etc/azure-black.png delete mode 100644 serverless/etc/gcf-black.png delete mode 100644 serverless/etc/kubeless-logos-black.png delete mode 100644 serverless/etc/openwhisk-black.png delete mode 100644 serverless/etc/serverless.urm.png delete mode 100644 serverless/etc/serverless.urm.puml delete mode 100644 serverless/etc/spotinst-logos-black-small.png delete mode 100644 serverless/etc/webtask-small-grayscale.png delete mode 100644 serverless/pom.xml delete mode 100644 serverless/serverless.yml delete mode 100644 serverless/src/main/java/com/iluwatar/serverless/baas/api/AbstractDynamoDbHandler.java delete mode 100644 serverless/src/main/java/com/iluwatar/serverless/baas/api/FindPersonApiHandler.java delete mode 100644 serverless/src/main/java/com/iluwatar/serverless/baas/api/SavePersonApiHandler.java delete mode 100644 serverless/src/main/java/com/iluwatar/serverless/baas/model/Address.java delete mode 100644 serverless/src/main/java/com/iluwatar/serverless/baas/model/Person.java delete mode 100644 serverless/src/main/java/com/iluwatar/serverless/faas/ApiGatewayResponse.java delete mode 100644 serverless/src/main/java/com/iluwatar/serverless/faas/LambdaInfo.java delete mode 100644 serverless/src/main/java/com/iluwatar/serverless/faas/api/LambdaInfoApiHandler.java delete mode 100644 serverless/src/test/java/com/iluwatar/serverless/baas/api/FindPersonApiHandlerTest.java delete mode 100644 serverless/src/test/java/com/iluwatar/serverless/baas/api/SavePersonApiHandlerTest.java delete mode 100644 serverless/src/test/java/com/iluwatar/serverless/faas/api/LambdaInfoApiHandlerTest.java diff --git a/cloud-claim-check-pattern/.gitignore b/cloud-claim-check-pattern/.gitignore deleted file mode 100644 index f508cf94f..000000000 --- a/cloud-claim-check-pattern/.gitignore +++ /dev/null @@ -1,38 +0,0 @@ -# Build output -target/ -*.class - -# Log file -*.log - -# BlueJ files -*.ctxt - -# Mobile Tools for Java (J2ME) -.mtj.tmp/ - -# Package Files # -*.jar -*.war -*.ear -*.zip -*.tar.gz -*.rar - -# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* - -# IDE -.idea/ -*.iml -.settings/ -.project -.classpath - -# macOS -.DS_Store - -# Azure Functions -local.settings.json -bin/ -obj/ diff --git a/cloud-claim-check-pattern/README.md b/cloud-claim-check-pattern/README.md deleted file mode 100644 index b17866177..000000000 --- a/cloud-claim-check-pattern/README.md +++ /dev/null @@ -1,80 +0,0 @@ ---- -title: Claim Check Pattern -category: Cloud -language: en -tag: - - Cloud distributed - - Microservices ---- - -## Name - -[Claim Check Pattern](https://docs.microsoft.com/en-us/azure/architecture/patterns/claim-check) - -## Also known as - -[Reference-Based Messaging](https://www.enterpriseintegrationpatterns.com/patterns/messaging/StoreInLibrary.html) - -## Intent - -- Reduce the load of data transfer through the Internet. Instead of sending actual data directly, just send the message reference. -- Improve data security. As only message reference is shared, no data is exposed to the Internet. - -## Explanation - -Real-World Example - -> Suppose if you want to build a photo processing system. A photo processing system takes an image as input, processes it, and outputs a different set of images. Consider system has one persistent storage, one input component, ten processing components, messaging platform. Once a photo is given to the input component, it stores that image on persistent storage. It then creates ten different messages/events with the same image location and publishes them to the messaging platform. The messaging platform triggers ten different processing components. The ten processing components extract information about image location from the received event and then read an image from persistent storage. They generate ten different images from the original image and drop these images again to persistent storage. - -In Plain words - -> Split a large message into a claim check and a payload. Send the claim check to the messaging platform and store the payload to an external service. This pattern allows large messages to be processed while protecting the message bus and the client from being overwhelmed or slowed down. This pattern also helps to reduce costs, as storage is usually cheaper than resource units used by the messaging platform.([ref](https://docs.microsoft.com/en-us/azure/architecture/patterns/claim-check)) - -## Architecture Diagram - -![alt text](./etc/Claim-Check-Pattern.png "Claim Check Pattern") - -## Applicability - -Use the Claim Check Pattern when - -- Huge processing data causes a lot of bandwidth consumption to transfer data through the Internet. -- To secure your data transfer by storing in common persistent storage. -- Using a cloud platform - Azure Functions or AWS Lambda, Azure EventGrid or AWS Event Bridge, Azure Blob Storage or AWS S3 Bucket. -- Each service must be independent and idempotent. Output data is dropped to persistent storage by the service. -- Publish-subscribe messaging pattern needs to be used. - -## Consequences - -- This pattern is stateless. Any compute API will not store any data. -- You must have persistent storage and a reliable messaging platform. - -## Tutorials - -### Workflow - -Suppose a telecom company wants to build call cost calculator system which generate the call cost daily. At the end of each day, details of the calls made by the consumers are stored somewhere. The call calculator system will read this data and generate call cost data for each user. Consumers will be billed using this generated data in case of postpaid service. - -Producer class( `UsageDetailPublisherFunction` Azure Function) will generate call usage details (here we are generating call data in producer class itself. In real world scenario, it will read from storage). `UsageDetailPublisherFunction` creates a message. Message consists of message header and message body. Message header is basically an event grid event or claim or message reference. Message body contains actual data. `UsageDetailPublisherFunction` sends a message header to Event Grid topic `usage-detail` and drops an entire message to the blob storage. Event Grid then sent this message header to the `UsageCostProcessorFunction` Azure function. It will read the entire message from blob storage with the help of the header, will calculate call cost and drop the result to the blob storage. - -### Class Diagrams - -![alt text](./etc/class-diagram.png "Claim-Check-Class-Diagram") - -### Setup - -- Any operating system can be used macOS, Windows, Linux as everything is deployed on Azure. -- Install Java JDK 11 and set up Java environmental variables. -- Install Git. -- Install Visual Studio Code. -- Install [ Azure Functions extension](https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azurefunctions) to be able to deploy using Visual studio. - -### Storage Data - -The data is stored in the Azure blob storage in the container `callusageapp`. For every trigger, one GUID is created. Under the `GUID folder`, 2 files will be created `input.json` and `output.json`. -`Input.json` is dropped `producer` azure function which contains call usage details.` Output.json` contains call cost details which are dropped by the `consumer` azure function. - -## Credits - -- [Messaging Pattern - Claim Check](https://www.enterpriseintegrationpatterns.com/patterns/messaging/StoreInLibrary.html) -- [Azure Architecture Pattern - Claim Check Pattern](https://docs.microsoft.com/en-us/azure/architecture/patterns/claim-check) diff --git a/cloud-claim-check-pattern/call-usage-app/.gitignore b/cloud-claim-check-pattern/call-usage-app/.gitignore deleted file mode 100644 index f508cf94f..000000000 --- a/cloud-claim-check-pattern/call-usage-app/.gitignore +++ /dev/null @@ -1,38 +0,0 @@ -# Build output -target/ -*.class - -# Log file -*.log - -# BlueJ files -*.ctxt - -# Mobile Tools for Java (J2ME) -.mtj.tmp/ - -# Package Files # -*.jar -*.war -*.ear -*.zip -*.tar.gz -*.rar - -# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* - -# IDE -.idea/ -*.iml -.settings/ -.project -.classpath - -# macOS -.DS_Store - -# Azure Functions -local.settings.json -bin/ -obj/ diff --git a/cloud-claim-check-pattern/call-usage-app/etc/call-usage-app.urm.puml b/cloud-claim-check-pattern/call-usage-app/etc/call-usage-app.urm.puml deleted file mode 100644 index 0ffec48b1..000000000 --- a/cloud-claim-check-pattern/call-usage-app/etc/call-usage-app.urm.puml +++ /dev/null @@ -1,117 +0,0 @@ -@startuml -package com.iluwatar.claimcheckpattern.producer.calldetails.functions { - class UsageDetailPublisherFunction { - - eventHandlerUtility : EventHandlerUtility - - messageHandlerUtility : MessageHandlerUtility - + UsageDetailPublisherFunction() - + UsageDetailPublisherFunction(messageHandlerUtility : MessageHandlerUtility, eventHandlerUtility : EventHandlerUtility) - + run(request : HttpRequestMessage>, context : ExecutionContext) : HttpResponseMessage - } -} -package com.iluwatar.claimcheckpattern.domain { - class Message { - - messageBody : MessageBody - - messageHeader : MessageHeader - + Message() - + getMessageBody() : MessageBody - + getMessageHeader() : MessageHeader - + setMessageBody(messageBody : MessageBody) - + setMessageHeader(messageHeader : MessageHeader) - } - class MessageBody { - - data : List - + MessageBody() - + getData() : List - + setData(data : List) - } - class MessageHeader { - - data : Object - - dataVersion : String - - eventTime : String - - eventType : String - - id : String - - subject : String - - topic : String - + MessageHeader() - + getData() : Object - + getDataVersion() : String - + getEventTime() : String - + getEventType() : String - + getId() : String - + getSubject() : String - + getTopic() : String - + setData(data : Object) - + setDataVersion(dataVersion : String) - + setEventTime(eventTime : String) - + setEventType(eventType : String) - + setId(id : String) - + setSubject(subject : String) - + setTopic(topic : String) - } - class MessageReference { - - dataFileName : String - - dataLocation : String - + MessageReference() - + MessageReference(dataLocation : String, dataFileName : String) - + getDataFileName() : String - + getDataLocation() : String - + setDataFileName(dataFileName : String) - + setDataLocation(dataLocation : String) - } - class UsageCostDetail { - - callCost : double - - dataCost : double - - userId : String - + UsageCostDetail() - + getCallCost() : double - + getDataCost() : double - + getUserId() : String - + setCallCost(callCost : double) - + setDataCost(dataCost : double) - + setUserId(userId : String) - } - class UsageDetail { - - data : int - - duration : int - - userId : String - + UsageDetail() - + getData() : int - + getDuration() : int - + getUserId() : String - + setData(data : int) - + setDuration(duration : int) - + setUserId(userId : String) - } -} -package com.iluwatar.claimcheckpattern.utility { - class EventHandlerUtility { - - customEventClient : EventGridPublisherClient - + EventHandlerUtility() - + EventHandlerUtility(customEventClient : EventGridPublisherClient) - + publishEvent(customEvent : T, logger : Logger) - } - class MessageHandlerUtility { - - blobServiceClient : BlobServiceClient - + MessageHandlerUtility() - + MessageHandlerUtility(blobServiceClient : BlobServiceClient) - + dropToPersistantStorage(message : Message, logger : Logger) - + readFromPersistantStorage(messageReference : MessageReference, logger : Logger) : Message - } -} -package com.iluwatar.claimcheckpattern.consumer.callcostprocessor.functions { - class UsageCostProcessorFunction { - - messageHandlerUtilityForUsageCostDetail : MessageHandlerUtility - - messageHandlerUtilityForUsageDetail : MessageHandlerUtility - + UsageCostProcessorFunction() - + UsageCostProcessorFunction(messageHandlerUtilityForUsageDetail : MessageHandlerUtility, messageHandlerUtilityForUsageCostDetail : MessageHandlerUtility) - - calculateUsageCostDetails(usageDetailsList : List) : List - + run(request : HttpRequestMessage>, context : ExecutionContext) : HttpResponseMessage - } -} -UsageCostProcessorFunction --> "-messageHandlerUtilityForUsageDetail" MessageHandlerUtility -Message --> "-messageBody" MessageBody -UsageDetailPublisherFunction --> "-eventHandlerUtility" EventHandlerUtility -Builder ..+ HttpResponseMessage -UsageDetailPublisherFunction --> "-messageHandlerUtility" MessageHandlerUtility -Message --> "-messageHeader" MessageHeader -@enduml \ No newline at end of file diff --git a/cloud-claim-check-pattern/call-usage-app/host.json b/cloud-claim-check-pattern/call-usage-app/host.json deleted file mode 100644 index 4ac89572d..000000000 --- a/cloud-claim-check-pattern/call-usage-app/host.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": "2.0", - "extensionBundle": { - "id": "Microsoft.Azure.Functions.ExtensionBundle", - "version": "[1.*, 2.0.0)" - } -} \ No newline at end of file diff --git a/cloud-claim-check-pattern/call-usage-app/pom.xml b/cloud-claim-check-pattern/call-usage-app/pom.xml deleted file mode 100644 index b40572c7f..000000000 --- a/cloud-claim-check-pattern/call-usage-app/pom.xml +++ /dev/null @@ -1,152 +0,0 @@ - - - - 4.0.0 - - - - com.iluwatar - claim-check-pattern - 1.25.0-SNAPSHOT - - - call-usage-app - call-usage-app - jar - - - UTF-8 - 1.14.0 - 1.4.2 - CallUsageApp - - - - - - com.azure - azure-sdk-bom - 1.0.4 - pom - import - - - - - - - com.microsoft.azure.functions - azure-functions-java-library - ${azure.functions.java.library.version} - - - - com.azure - azure-messaging-eventgrid - - - - com.azure - azure-storage-blob - 12.13.0 - - - - org.slf4j - slf4j-simple - test - - - - - org.mockito - mockito-core - test - - - - - - - - - com.microsoft.azure - azure-functions-maven-plugin - ${azure.functions.maven.plugin.version} - - - ${functionAppName} - - java-functions-group - - java-functions-app-service-plan - - - westus - - - - - - - - - windows - 11 - - - - FUNCTIONS_EXTENSION_VERSION - ~3 - - - - - - package-functions - - package - - - - - - - maven-clean-plugin - 3.1.0 - - - - obj - - - - - - - diff --git a/cloud-claim-check-pattern/call-usage-app/src/main/java/com/iluwatar/claimcheckpattern/consumer/callcostprocessor/functions/UsageCostProcessorFunction.java b/cloud-claim-check-pattern/call-usage-app/src/main/java/com/iluwatar/claimcheckpattern/consumer/callcostprocessor/functions/UsageCostProcessorFunction.java deleted file mode 100644 index 5d5022e0a..000000000 --- a/cloud-claim-check-pattern/call-usage-app/src/main/java/com/iluwatar/claimcheckpattern/consumer/callcostprocessor/functions/UsageCostProcessorFunction.java +++ /dev/null @@ -1,169 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.claimcheckpattern.consumer.callcostprocessor.functions; - -import com.azure.core.util.BinaryData; -import com.azure.core.util.serializer.TypeReference; -import com.azure.messaging.eventgrid.EventGridEvent; -import com.azure.messaging.eventgrid.systemevents.SubscriptionValidationEventData; -import com.azure.messaging.eventgrid.systemevents.SubscriptionValidationResponse; -import com.iluwatar.claimcheckpattern.domain.Message; -import com.iluwatar.claimcheckpattern.domain.MessageBody; -import com.iluwatar.claimcheckpattern.domain.MessageHeader; -import com.iluwatar.claimcheckpattern.domain.MessageReference; -import com.iluwatar.claimcheckpattern.domain.UsageCostDetail; -import com.iluwatar.claimcheckpattern.domain.UsageDetail; -import com.iluwatar.claimcheckpattern.utility.MessageHandlerUtility; -import com.microsoft.azure.functions.ExecutionContext; -import com.microsoft.azure.functions.HttpMethod; -import com.microsoft.azure.functions.HttpRequestMessage; -import com.microsoft.azure.functions.HttpResponseMessage; -import com.microsoft.azure.functions.HttpStatus; -import com.microsoft.azure.functions.annotation.AuthorizationLevel; -import com.microsoft.azure.functions.annotation.FunctionName; -import com.microsoft.azure.functions.annotation.HttpTrigger; -import java.time.OffsetDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; - -/** - * Azure Functions with HTTP Trigger. - * This is Consumer class. - */ -public class UsageCostProcessorFunction { - - private MessageHandlerUtility messageHandlerUtilityForUsageDetail; - private MessageHandlerUtility messageHandlerUtilityForUsageCostDetail; - - public UsageCostProcessorFunction() { - this.messageHandlerUtilityForUsageDetail = new MessageHandlerUtility<>(); - this.messageHandlerUtilityForUsageCostDetail = new MessageHandlerUtility<>(); - } - - public UsageCostProcessorFunction( - MessageHandlerUtility messageHandlerUtilityForUsageDetail, - MessageHandlerUtility messageHandlerUtilityForUsageCostDetail) { - this.messageHandlerUtilityForUsageDetail = messageHandlerUtilityForUsageDetail; - this.messageHandlerUtilityForUsageCostDetail = messageHandlerUtilityForUsageCostDetail; - } - - /** - * Azure function which gets triggered when event grid event send event to it. - * After receiving event, it read input file from blob storage, calculate call cost details. - * It creates new message with cost details and drop message to blob storage. - * @param request represents HttpRequestMessage - * @param context represents ExecutionContext - * @return HttpResponseMessage - */ - @FunctionName("UsageCostProcessorFunction") - public HttpResponseMessage run(@HttpTrigger(name = "req", methods = { HttpMethod.GET, - HttpMethod.POST }, authLevel = AuthorizationLevel.ANONYMOUS) - HttpRequestMessage> request, - final ExecutionContext context) { - try { - var eventGridEvents = EventGridEvent.fromString(request.getBody().get()); - for (var eventGridEvent : eventGridEvents) { - // Handle system events - if (eventGridEvent.getEventType() - .equals("Microsoft.EventGrid.SubscriptionValidationEvent")) { - SubscriptionValidationEventData subscriptionValidationEventData = eventGridEvent.getData() - .toObject(SubscriptionValidationEventData.class); - // Handle the subscription validation event - var responseData = new SubscriptionValidationResponse(); - responseData.setValidationResponse(subscriptionValidationEventData.getValidationCode()); - return request.createResponseBuilder(HttpStatus.OK).body(responseData).build(); - - } else if (eventGridEvent.getEventType().equals("UsageDetail")) { - // Get message header and reference - var messageReference = eventGridEvent.getData() - .toObject(MessageReference.class); - - // Read message from persistent storage - var message = this.messageHandlerUtilityForUsageDetail - .readFromPersistantStorage(messageReference, context.getLogger()); - - // Get Data and generate cost details - List usageDetailsList = BinaryData.fromObject( - message.getMessageBody().getData()) - .toObject(new TypeReference<>() { - }); - var usageCostDetailsList = calculateUsageCostDetails(usageDetailsList); - - // Create message body - var newMessageBody = new MessageBody(); - newMessageBody.setData(usageCostDetailsList); - - // Create message header - var newMessageReference = new MessageReference("callusageapp", - eventGridEvent.getId() + "/output.json"); - var newMessageHeader = new MessageHeader(); - newMessageHeader.setId(eventGridEvent.getId()); - newMessageHeader.setSubject("UsageCostProcessor"); - newMessageHeader.setTopic(""); - newMessageHeader.setEventType("UsageCostDetail"); - newMessageHeader.setEventTime(OffsetDateTime.now().toString()); - newMessageHeader.setData(newMessageReference); - newMessageHeader.setDataVersion("v1.0"); - - // Create entire message - var newMessage = new Message(); - newMessage.setMessageHeader(newMessageHeader); - newMessage.setMessageBody(newMessageBody); - - // Drop data to persistent storage - this.messageHandlerUtilityForUsageCostDetail.dropToPersistantStorage(newMessage, - context.getLogger()); - - context.getLogger().info("Message is dropped successfully"); - return request.createResponseBuilder(HttpStatus.OK) - .body("Message is dropped successfully").build(); - } - } - } catch (Exception e) { - context.getLogger().warning(e.getMessage()); - } - - return request.createResponseBuilder(HttpStatus.INTERNAL_SERVER_ERROR).body(null).build(); - } - - private List calculateUsageCostDetails(List usageDetailsList) { - if (usageDetailsList == null) { - return null; - } - var usageCostDetailsList = new ArrayList(); - - usageDetailsList.forEach(usageDetail -> { - var usageCostDetail = new UsageCostDetail(); - usageCostDetail.setUserId(usageDetail.getUserId()); - usageCostDetail.setCallCost(usageDetail.getDuration() * 0.30); // 0.30₹ per minute - usageCostDetail.setDataCost(usageDetail.getData() * 0.20); // 0.20₹ per MB - - usageCostDetailsList.add(usageCostDetail); - }); - - return usageCostDetailsList; - } -} diff --git a/cloud-claim-check-pattern/call-usage-app/src/main/java/com/iluwatar/claimcheckpattern/domain/Message.java b/cloud-claim-check-pattern/call-usage-app/src/main/java/com/iluwatar/claimcheckpattern/domain/Message.java deleted file mode 100644 index b24b32a18..000000000 --- a/cloud-claim-check-pattern/call-usage-app/src/main/java/com/iluwatar/claimcheckpattern/domain/Message.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.claimcheckpattern.domain; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * It is the message which gets dropped or read by Producer or Consumer Azure functions. - * It is stored in the json format. - * @param represents UsageDetail or UsageCostDetail - */ -@Data -@NoArgsConstructor -@AllArgsConstructor -public class Message { - private MessageHeader messageHeader; - - private MessageBody messageBody; - -} \ No newline at end of file diff --git a/cloud-claim-check-pattern/call-usage-app/src/main/java/com/iluwatar/claimcheckpattern/domain/MessageBody.java b/cloud-claim-check-pattern/call-usage-app/src/main/java/com/iluwatar/claimcheckpattern/domain/MessageBody.java deleted file mode 100644 index 4bf2c055c..000000000 --- a/cloud-claim-check-pattern/call-usage-app/src/main/java/com/iluwatar/claimcheckpattern/domain/MessageBody.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.claimcheckpattern.domain; - -import java.util.List; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * It is message body of the message. - * It stores actual data in our case UsageCostDetail or UsageDetail. - * @param represents UsageDetail or UsageCostDetail - */ -@Data -@NoArgsConstructor -@AllArgsConstructor -public class MessageBody { - - private List data; - -} diff --git a/cloud-claim-check-pattern/call-usage-app/src/main/java/com/iluwatar/claimcheckpattern/domain/MessageHeader.java b/cloud-claim-check-pattern/call-usage-app/src/main/java/com/iluwatar/claimcheckpattern/domain/MessageHeader.java deleted file mode 100644 index 717339bd3..000000000 --- a/cloud-claim-check-pattern/call-usage-app/src/main/java/com/iluwatar/claimcheckpattern/domain/MessageHeader.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.claimcheckpattern.domain; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * This is message header or event which is sent to Event Grid. - * Its structure is same as Azure Event Grid Event Class. - */ -@Data -@NoArgsConstructor -@AllArgsConstructor -public class MessageHeader { - - private String id; - private String subject; - private String topic; - private String eventType; - private String eventTime; - private Object data; - private String dataVersion; - -} \ No newline at end of file diff --git a/cloud-claim-check-pattern/call-usage-app/src/main/java/com/iluwatar/claimcheckpattern/domain/MessageReference.java b/cloud-claim-check-pattern/call-usage-app/src/main/java/com/iluwatar/claimcheckpattern/domain/MessageReference.java deleted file mode 100644 index 226276321..000000000 --- a/cloud-claim-check-pattern/call-usage-app/src/main/java/com/iluwatar/claimcheckpattern/domain/MessageReference.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.claimcheckpattern.domain; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * This is claim/message reference class. - * It contains the information about data where it is stored in persistent storage - * and file name. - * dataLocation is blob storage container name. - * dataFileName is file name in above container. - */ -@Data -@NoArgsConstructor -@AllArgsConstructor -public class MessageReference { - - private String dataLocation; - private String dataFileName; - -} diff --git a/cloud-claim-check-pattern/call-usage-app/src/main/java/com/iluwatar/claimcheckpattern/domain/UsageCostDetail.java b/cloud-claim-check-pattern/call-usage-app/src/main/java/com/iluwatar/claimcheckpattern/domain/UsageCostDetail.java deleted file mode 100644 index 3b0b50b99..000000000 --- a/cloud-claim-check-pattern/call-usage-app/src/main/java/com/iluwatar/claimcheckpattern/domain/UsageCostDetail.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.claimcheckpattern.domain; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * This is call cost details class. - * It stores userId of the caller, call duration cost and data cost. - */ -@Data -@NoArgsConstructor -@AllArgsConstructor -public class UsageCostDetail { - - private String userId; - private double callCost; - private double dataCost; - -} diff --git a/cloud-claim-check-pattern/call-usage-app/src/main/java/com/iluwatar/claimcheckpattern/domain/UsageDetail.java b/cloud-claim-check-pattern/call-usage-app/src/main/java/com/iluwatar/claimcheckpattern/domain/UsageDetail.java deleted file mode 100644 index 1327bc692..000000000 --- a/cloud-claim-check-pattern/call-usage-app/src/main/java/com/iluwatar/claimcheckpattern/domain/UsageDetail.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.claimcheckpattern.domain; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * This is call usage detail calls. - * It stores userId of the caller, call duration and data used. - */ -@Data -@NoArgsConstructor -@AllArgsConstructor -public class UsageDetail { - - private String userId; - - private int duration; - - private int data; -} diff --git a/cloud-claim-check-pattern/call-usage-app/src/main/java/com/iluwatar/claimcheckpattern/producer/calldetails/functions/UsageDetailPublisherFunction.java b/cloud-claim-check-pattern/call-usage-app/src/main/java/com/iluwatar/claimcheckpattern/producer/calldetails/functions/UsageDetailPublisherFunction.java deleted file mode 100644 index b53744842..000000000 --- a/cloud-claim-check-pattern/call-usage-app/src/main/java/com/iluwatar/claimcheckpattern/producer/calldetails/functions/UsageDetailPublisherFunction.java +++ /dev/null @@ -1,147 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.claimcheckpattern.producer.calldetails.functions; - -import com.azure.messaging.eventgrid.EventGridEvent; -import com.azure.messaging.eventgrid.systemevents.SubscriptionValidationEventData; -import com.azure.messaging.eventgrid.systemevents.SubscriptionValidationResponse; -import com.iluwatar.claimcheckpattern.domain.Message; -import com.iluwatar.claimcheckpattern.domain.MessageBody; -import com.iluwatar.claimcheckpattern.domain.MessageHeader; -import com.iluwatar.claimcheckpattern.domain.MessageReference; -import com.iluwatar.claimcheckpattern.domain.UsageDetail; -import com.iluwatar.claimcheckpattern.utility.EventHandlerUtility; -import com.iluwatar.claimcheckpattern.utility.MessageHandlerUtility; -import com.microsoft.azure.functions.ExecutionContext; -import com.microsoft.azure.functions.HttpMethod; -import com.microsoft.azure.functions.HttpRequestMessage; -import com.microsoft.azure.functions.HttpResponseMessage; -import com.microsoft.azure.functions.HttpStatus; -import com.microsoft.azure.functions.annotation.AuthorizationLevel; -import com.microsoft.azure.functions.annotation.FunctionName; -import com.microsoft.azure.functions.annotation.HttpTrigger; -import java.time.OffsetDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.Random; -import java.util.UUID; - -/** - * Azure Functions with HTTP Trigger. - * This is Producer class. - */ -public class UsageDetailPublisherFunction { - - private MessageHandlerUtility messageHandlerUtility; - private EventHandlerUtility eventHandlerUtility; - - public UsageDetailPublisherFunction() { - this.messageHandlerUtility = new MessageHandlerUtility<>(); - this.eventHandlerUtility = new EventHandlerUtility<>(); - } - - public UsageDetailPublisherFunction(MessageHandlerUtility messageHandlerUtility, - EventHandlerUtility eventHandlerUtility) { - this.messageHandlerUtility = messageHandlerUtility; - this.eventHandlerUtility = eventHandlerUtility; - } - - /** - * Azure function which create message, drop it in persistent storage - * and publish the event to Event Grid topic. - * @param request represents HttpRequestMessage - * @param context represents ExecutionContext - * @return HttpResponseMessage - */ - @FunctionName("UsageDetailPublisherFunction") - public HttpResponseMessage run(@HttpTrigger(name = "req", methods = { - HttpMethod.POST }, authLevel = AuthorizationLevel.ANONYMOUS) - HttpRequestMessage> request, - final ExecutionContext context) { - try { - - var eventGridEvents = EventGridEvent.fromString(request.getBody().get()); - - for (EventGridEvent eventGridEvent : eventGridEvents) { - // Handle system events - if (eventGridEvent.getEventType() - .equals("Microsoft.EventGrid.SubscriptionValidationEvent")) { - SubscriptionValidationEventData subscriptionValidationEventData = eventGridEvent.getData() - .toObject(SubscriptionValidationEventData.class); - // Handle the subscription validation event - var responseData = new SubscriptionValidationResponse(); - responseData.setValidationResponse(subscriptionValidationEventData.getValidationCode()); - return request.createResponseBuilder(HttpStatus.OK).body(responseData).build(); - - } else if (eventGridEvent.getEventType().equals("UsageDetail")) { - // Create message body - var messageBody = new MessageBody(); - var usageDetailsList = new ArrayList(); - var random = new Random(); - for (int i = 0; i < 51; i++) { - var usageDetail = new UsageDetail(); - usageDetail.setUserId("userId" + i); - usageDetail.setData(random.nextInt(500)); - usageDetail.setDuration(random.nextInt(500)); - - usageDetailsList.add(usageDetail); - } - messageBody.setData(usageDetailsList); - - // Create message header - var messageHeader = new MessageHeader(); - messageHeader.setId(UUID.randomUUID().toString()); - messageHeader.setSubject("UsageDetailPublisher"); - messageHeader.setTopic("usagecostprocessorfunction-topic"); - messageHeader.setEventType("UsageDetail"); - messageHeader.setEventTime(OffsetDateTime.now().toString()); - var messageReference = new MessageReference("callusageapp", - messageHeader.getId() + "/input.json"); - messageHeader.setData(messageReference); - messageHeader.setDataVersion("v1.0"); - - // Create entire message - var message = new Message(); - message.setMessageHeader(messageHeader); - message.setMessageBody(messageBody); - - // Drop data to persistent storage - this.messageHandlerUtility.dropToPersistantStorage(message, context.getLogger()); - - // Publish event to event grid topic - eventHandlerUtility.publishEvent(messageHeader, context.getLogger()); - - context.getLogger().info("Message is dropped and event is published successfully"); - return request.createResponseBuilder(HttpStatus.OK).body(message).build(); - } - } - } catch (Exception e) { - context.getLogger().warning(e.getMessage()); - } - - return request.createResponseBuilder(HttpStatus.OK).body(null).build(); - } -} diff --git a/cloud-claim-check-pattern/call-usage-app/src/main/java/com/iluwatar/claimcheckpattern/utility/EventHandlerUtility.java b/cloud-claim-check-pattern/call-usage-app/src/main/java/com/iluwatar/claimcheckpattern/utility/EventHandlerUtility.java deleted file mode 100644 index ef69ae4f0..000000000 --- a/cloud-claim-check-pattern/call-usage-app/src/main/java/com/iluwatar/claimcheckpattern/utility/EventHandlerUtility.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.claimcheckpattern.utility; - -import com.azure.core.credential.AzureKeyCredential; -import com.azure.core.util.BinaryData; -import com.azure.messaging.eventgrid.EventGridPublisherClient; -import com.azure.messaging.eventgrid.EventGridPublisherClientBuilder; -import java.util.logging.Logger; - -/** - * This class is event publisher utility which published message header to Event Grid topic. - * @param represents UsageDetail or UsageCostDetail - */ -public class EventHandlerUtility { - - private EventGridPublisherClient customEventClient; - - /** Default constructor. - */ - public EventHandlerUtility() { - this.customEventClient = new EventGridPublisherClientBuilder() - .endpoint(System.getenv("EventGridURL")) - .credential(new AzureKeyCredential(System.getenv("EventGridKey"))) - .buildCustomEventPublisherClient(); - } - - /** - Parameterized constructor. - */ - public EventHandlerUtility(EventGridPublisherClient customEventClient) { - this.customEventClient = customEventClient; - } - - /** - Method for publishing event to Event Grid Topic. - */ - public void publishEvent(T customEvent, Logger logger) { - try { - customEventClient.sendEvent(BinaryData.fromObject(customEvent)); - } catch (Exception e) { - logger.info(e.getMessage()); - } - } -} diff --git a/cloud-claim-check-pattern/call-usage-app/src/main/java/com/iluwatar/claimcheckpattern/utility/MessageHandlerUtility.java b/cloud-claim-check-pattern/call-usage-app/src/main/java/com/iluwatar/claimcheckpattern/utility/MessageHandlerUtility.java deleted file mode 100644 index 032cb11ae..000000000 --- a/cloud-claim-check-pattern/call-usage-app/src/main/java/com/iluwatar/claimcheckpattern/utility/MessageHandlerUtility.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.claimcheckpattern.utility; - -import com.azure.core.util.BinaryData; -import com.azure.core.util.serializer.TypeReference; -import com.azure.storage.blob.BlobClient; -import com.azure.storage.blob.BlobContainerClient; -import com.azure.storage.blob.BlobServiceClient; -import com.azure.storage.blob.BlobServiceClientBuilder; -import com.iluwatar.claimcheckpattern.domain.Message; -import com.iluwatar.claimcheckpattern.domain.MessageReference; -import java.util.logging.Logger; - -/** - * This class read and drop message from Azure blob storage. - * @param represents UsageDetail or UsageCostDetail - */ -public class MessageHandlerUtility { - - private BlobServiceClient blobServiceClient; - - /** - * Parameterized constructor. - * @param blobServiceClient represents BlobServiceClient - */ - public MessageHandlerUtility(BlobServiceClient blobServiceClient) { - this.blobServiceClient = blobServiceClient; - } - - /** - * Default constructor. - */ - public MessageHandlerUtility() { - // Create a BlobServiceClient object which will be used to create a container - // client - this.blobServiceClient = new BlobServiceClientBuilder() - .connectionString(System.getenv("BlobStorageConnectionString")).buildClient(); - - } - - /** - * Read message from blob storage. - * @param messageReference represents MessageReference - * @param logger represents Logger - * @return Message - */ - public Message readFromPersistantStorage(MessageReference messageReference, Logger logger) { - Message message = null; - try { - - // Get container name from message reference - String containerName = messageReference.getDataLocation(); - - // Get blob name from message reference - String blobName = messageReference.getDataFileName(); - - // Get container client - BlobContainerClient containerClient = blobServiceClient.getBlobContainerClient(containerName); - - // Get a reference to a blob - BlobClient blobClient = containerClient.getBlobClient(blobName); - - // download the blob - message = blobClient.downloadContent().toObject(new TypeReference>() { - }); - } catch (Exception e) { - logger.info(e.getMessage()); - } - return message; - - } - - /** - * Drop message to blob storage. - * @param message represents Message - * @param logger represents Logger - */ - public void dropToPersistantStorage(Message message, Logger logger) { - try { - - // Get message reference - MessageReference messageReference = (MessageReference) message.getMessageHeader().getData(); - - // Create a unique name for the container - String containerName = messageReference.getDataLocation(); - - // Create the container and return a container client object - BlobContainerClient containerClient = this.blobServiceClient - .getBlobContainerClient(containerName); - if (!containerClient.exists()) { - containerClient.create(); - } - - // Get a reference to a blob - BlobClient blobClient = containerClient.getBlobClient(messageReference.getDataFileName()); - - // Upload the blob - blobClient.upload(BinaryData.fromObject(message)); - } catch (Exception e) { - logger.info(e.getMessage()); - } - - } - -} diff --git a/cloud-claim-check-pattern/call-usage-app/src/test/java/com/iluwatar/claimcheckpattern/HttpResponseMessageMock.java b/cloud-claim-check-pattern/call-usage-app/src/test/java/com/iluwatar/claimcheckpattern/HttpResponseMessageMock.java deleted file mode 100644 index 0a1c32a4b..000000000 --- a/cloud-claim-check-pattern/call-usage-app/src/test/java/com/iluwatar/claimcheckpattern/HttpResponseMessageMock.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.claimcheckpattern; - -import com.microsoft.azure.functions.HttpResponseMessage; -import com.microsoft.azure.functions.HttpStatus; -import com.microsoft.azure.functions.HttpStatusType; -import java.util.HashMap; -import java.util.Map; - -/** - * The mock for HttpResponseMessage, can be used in unit tests to verify if the - * returned response by HTTP trigger function is correct or not. - */ -public class HttpResponseMessageMock implements HttpResponseMessage { - private int httpStatusCode; - private HttpStatusType httpStatus; - private Object body; - private Map headers; - - public HttpResponseMessageMock(HttpStatusType status, Map headers, Object body) { - this.httpStatus = status; - this.httpStatusCode = status.value(); - this.headers = headers; - this.body = body; - } - - @Override - public HttpStatusType getStatus() { - return this.httpStatus; - } - - @Override - public int getStatusCode() { - return httpStatusCode; - } - - @Override - public String getHeader(String key) { - return this.headers.get(key); - } - - @Override - public Object getBody() { - return this.body; - } - - public static class HttpResponseMessageBuilderMock implements HttpResponseMessage.Builder { - private Object body; - private int httpStatusCode; - private Map headers = new HashMap<>(); - private HttpStatusType httpStatus; - - public Builder status(HttpStatus status) { - this.httpStatusCode = status.value(); - this.httpStatus = status; - return this; - } - - @Override - public Builder status(HttpStatusType httpStatusType) { - this.httpStatusCode = httpStatusType.value(); - this.httpStatus = httpStatusType; - return this; - } - - @Override - public HttpResponseMessage.Builder header(String key, String value) { - this.headers.put(key, value); - return this; - } - - @Override - public HttpResponseMessage.Builder body(Object body) { - this.body = body; - return this; - } - - @Override - public HttpResponseMessage build() { - return new HttpResponseMessageMock(this.httpStatus, this.headers, this.body); - } - } -} diff --git a/cloud-claim-check-pattern/call-usage-app/src/test/java/com/iluwatar/claimcheckpattern/consumer/callcostprocessor/functions/UsageCostProcessorFunctionTest.java b/cloud-claim-check-pattern/call-usage-app/src/test/java/com/iluwatar/claimcheckpattern/consumer/callcostprocessor/functions/UsageCostProcessorFunctionTest.java deleted file mode 100644 index fc1683768..000000000 --- a/cloud-claim-check-pattern/call-usage-app/src/test/java/com/iluwatar/claimcheckpattern/consumer/callcostprocessor/functions/UsageCostProcessorFunctionTest.java +++ /dev/null @@ -1,182 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.claimcheckpattern.consumer.callcostprocessor.functions; - -import com.iluwatar.claimcheckpattern.HttpResponseMessageMock; -import com.iluwatar.claimcheckpattern.domain.Message; -import com.iluwatar.claimcheckpattern.domain.MessageBody; -import com.iluwatar.claimcheckpattern.domain.MessageHeader; -import com.iluwatar.claimcheckpattern.domain.MessageReference; -import com.iluwatar.claimcheckpattern.domain.UsageCostDetail; -import com.iluwatar.claimcheckpattern.domain.UsageDetail; -import com.iluwatar.claimcheckpattern.utility.MessageHandlerUtility; -import com.microsoft.azure.functions.ExecutionContext; -import com.microsoft.azure.functions.HttpRequestMessage; -import com.microsoft.azure.functions.HttpResponseMessage; -import com.microsoft.azure.functions.HttpStatus; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.junit.jupiter.MockitoExtension; -import org.mockito.stubbing.Answer; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.time.OffsetDateTime; -import java.util.*; -import java.util.logging.Logger; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.*; - -/** - * Unit test for Function class. - */ -@ExtendWith(MockitoExtension.class) -class UsageCostProcessorFunctionTest { - - @Mock - MessageHandlerUtility mockMessageHandlerUtilityForUsageADetail; - @Mock - MessageHandlerUtility mockMessageHandlerUtilityForUsageCostDetail; - @Mock - ExecutionContext context; - - Message messageToDrop; - Message messageToRead; - MessageReference messageReference; - @InjectMocks - UsageCostProcessorFunction usageCostProcessorFunction; - - @BeforeEach - void setUp() { - var messageBodyUsageDetail = new MessageBody(); - var usageDetailsList = new ArrayList(); - - var messageBodyUsageCostDetail = new MessageBody(); - var usageCostDetailsList = new ArrayList(); - for (int i = 0; i < 2; i++) { - var usageDetail = new UsageDetail(); - usageDetail.setUserId("userId" + i); - usageDetail.setData(i + 1); - usageDetail.setDuration(i + 1); - usageDetailsList.add(usageDetail); - - var usageCostDetail = new UsageCostDetail(); - usageCostDetail.setUserId(usageDetail.getUserId()); - usageCostDetail.setDataCost(usageDetail.getData() * 0.20); - usageCostDetail.setCallCost(usageDetail.getDuration() * 0.30); - usageCostDetailsList.add(usageCostDetail); - } - messageBodyUsageDetail.setData(usageDetailsList); - messageBodyUsageCostDetail.setData(usageCostDetailsList); - - // Create message header - var messageHeader = new MessageHeader(); - messageHeader.setId(UUID.randomUUID().toString()); - messageHeader.setSubject("UsageDetailPublisher"); - messageHeader.setTopic("usagecostprocessorfunction-topic"); - messageHeader.setEventType("UsageDetail"); - messageHeader.setEventTime(OffsetDateTime.now().toString()); - this.messageReference = new MessageReference("callusageapp", "d8284456-dfff-4bd4-9cef-ea99f70f4835/input.json"); - messageHeader.setData(messageReference); - messageHeader.setDataVersion("v1.0"); - - // Create entire message - messageToRead = new Message<>(); - messageToRead.setMessageHeader(messageHeader); - messageToRead.setMessageBody(messageBodyUsageDetail); - - messageToDrop = new Message<>(); - messageToDrop.setMessageHeader(messageHeader); - messageToDrop.setMessageBody(messageBodyUsageCostDetail); - - } - - /** - * Unit test for HttpTriggerJava method. - */ - @Test - void shouldTriggerHttpAzureFunctionJavaWithSubscriptionValidationEventType() throws Exception { - - // Setup - @SuppressWarnings("unchecked") - final HttpRequestMessage> req = mock(HttpRequestMessage.class); - String fileAbsolutePath = getClass().getResource("/subscriptionValidationEvent.json").getPath() - .replaceAll("%20", " "), jsonBody = Files.readString(Paths.get(fileAbsolutePath)).replaceAll("\n", " "); - doReturn(Optional.of(jsonBody)).when(req).getBody(); - doAnswer(new Answer() { - @Override - public HttpResponseMessage.Builder answer(InvocationOnMock invocation) { - HttpStatus status = (HttpStatus) invocation.getArguments()[0]; - return new HttpResponseMessageMock.HttpResponseMessageBuilderMock().status(status); - } - }).when(req).createResponseBuilder(any(HttpStatus.class)); - - final ExecutionContext context = mock(ExecutionContext.class); - - // Invoke - final HttpResponseMessage ret = this.usageCostProcessorFunction.run(req, context); - - // Verify - assertEquals(ret.getStatus(), HttpStatus.OK); - } - - @Test - void shouldTriggerHttpAzureFunctionJavaWithUsageDetailEventType() throws Exception { - // Setup - @SuppressWarnings("unchecked") - final HttpRequestMessage> req = mock(HttpRequestMessage.class); - String fileAbsolutePath = getClass().getResource("/usageDetailEvent.json").getPath().replaceAll("%20", " "), - jsonBody = Files.readString(Paths.get(fileAbsolutePath)).replaceAll("\n", " "); - doReturn(Optional.of(jsonBody)).when(req).getBody(); - doReturn(Logger.getGlobal()).when(context).getLogger(); - - when(this.mockMessageHandlerUtilityForUsageADetail.readFromPersistantStorage(any(MessageReference.class), - eq(Logger.getGlobal()))).thenReturn(messageToRead); - doAnswer(new Answer() { - @Override - public HttpResponseMessage.Builder answer(InvocationOnMock invocation) { - HttpStatus status = (HttpStatus) invocation.getArguments()[0]; - return new HttpResponseMessageMock.HttpResponseMessageBuilderMock().status(status); - } - }).when(req).createResponseBuilder(any(HttpStatus.class)); - - assertNotNull(this.mockMessageHandlerUtilityForUsageADetail); - assertEquals(this.messageToRead, this.mockMessageHandlerUtilityForUsageADetail - .readFromPersistantStorage(this.messageReference, Logger.getGlobal())); - - // Invoke - final HttpResponseMessage ret = this.usageCostProcessorFunction.run(req, context); - - // Verify - assertEquals(HttpStatus.OK, ret.getStatus()); - assertEquals("Message is dropped successfully", ret.getBody()); - } - -} diff --git a/cloud-claim-check-pattern/call-usage-app/src/test/java/com/iluwatar/claimcheckpattern/producer/calldetails/functions/UsageDetailPublisherFunctionTest.java b/cloud-claim-check-pattern/call-usage-app/src/test/java/com/iluwatar/claimcheckpattern/producer/calldetails/functions/UsageDetailPublisherFunctionTest.java deleted file mode 100644 index c44e23b35..000000000 --- a/cloud-claim-check-pattern/call-usage-app/src/test/java/com/iluwatar/claimcheckpattern/producer/calldetails/functions/UsageDetailPublisherFunctionTest.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.claimcheckpattern.producer.calldetails.functions; - -import com.iluwatar.claimcheckpattern.HttpResponseMessageMock; -import com.iluwatar.claimcheckpattern.domain.MessageHeader; -import com.iluwatar.claimcheckpattern.domain.UsageDetail; -import com.iluwatar.claimcheckpattern.utility.EventHandlerUtility; -import com.iluwatar.claimcheckpattern.utility.MessageHandlerUtility; -import com.microsoft.azure.functions.ExecutionContext; -import com.microsoft.azure.functions.HttpRequestMessage; -import com.microsoft.azure.functions.HttpResponseMessage; -import com.microsoft.azure.functions.HttpStatus; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.junit.jupiter.MockitoExtension; -import org.mockito.stubbing.Answer; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.*; -import java.util.logging.Logger; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.*; - -/** - * Unit test for Function class. - */ -@ExtendWith(MockitoExtension.class) -class UsageDetailPublisherFunctionTest { - @Mock - MessageHandlerUtility mockMessageHandlerUtility; - @Mock - EventHandlerUtility mockEventHandlerUtility; - - @InjectMocks - UsageDetailPublisherFunction usageDetailPublisherFunction; - - /** - * Unit test for HttpTriggerJava method. - */ - @Test - void shouldTriggerHttpAzureFunctionJavaWithSubscriptionValidationEventType() throws Exception { - - // Setup - @SuppressWarnings("unchecked") - final HttpRequestMessage> req = mock(HttpRequestMessage.class); - String fileAbsolutePath = getClass().getResource("/subscriptionValidationEvent.json").getPath() - .replaceAll("%20", " "), jsonBody = Files.readString(Paths.get(fileAbsolutePath)).replaceAll("\n", " "); - doReturn(Optional.of(jsonBody)).when(req).getBody(); - doAnswer(new Answer() { - @Override - public HttpResponseMessage.Builder answer(InvocationOnMock invocation) { - HttpStatus status = (HttpStatus) invocation.getArguments()[0]; - return new HttpResponseMessageMock.HttpResponseMessageBuilderMock().status(status); - } - }).when(req).createResponseBuilder(any(HttpStatus.class)); - - final ExecutionContext context = mock(ExecutionContext.class); - - // Invoke - final HttpResponseMessage ret = this.usageDetailPublisherFunction.run(req, context); - - // Verify - assertEquals(ret.getStatus(), HttpStatus.OK); - } - - @Test - void shouldTriggerHttpAzureFunctionJavaWithUsageDetailEventType() throws Exception { - - // Setup - @SuppressWarnings("unchecked") - final HttpRequestMessage> req = mock(HttpRequestMessage.class); - String fileAbsolutePath = getClass().getResource("/usageDetailEvent.json").getPath().replaceAll("%20", " "), - jsonBody = Files.readString(Paths.get(fileAbsolutePath)).replaceAll("\n", " "); - doReturn(Optional.of(jsonBody)).when(req).getBody(); - doAnswer(new Answer() { - @Override - public HttpResponseMessage.Builder answer(InvocationOnMock invocation) { - HttpStatus status = (HttpStatus) invocation.getArguments()[0]; - return new HttpResponseMessageMock.HttpResponseMessageBuilderMock().status(status); - } - }).when(req).createResponseBuilder(any(HttpStatus.class)); - - final ExecutionContext context = mock(ExecutionContext.class); - doReturn(Logger.getGlobal()).when(context).getLogger(); - - // Invoke - final HttpResponseMessage ret = this.usageDetailPublisherFunction.run(req, context); - - // Verify - assertEquals(ret.getStatus(), HttpStatus.OK); - } - -} diff --git a/cloud-claim-check-pattern/call-usage-app/src/test/java/com/iluwatar/claimcheckpattern/utility/EventHandlerUtilityTest.java b/cloud-claim-check-pattern/call-usage-app/src/test/java/com/iluwatar/claimcheckpattern/utility/EventHandlerUtilityTest.java deleted file mode 100644 index 69e63241f..000000000 --- a/cloud-claim-check-pattern/call-usage-app/src/test/java/com/iluwatar/claimcheckpattern/utility/EventHandlerUtilityTest.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.claimcheckpattern.utility; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.*; - -import com.azure.core.util.BinaryData; -import com.azure.messaging.eventgrid.EventGridPublisherClient; -import com.iluwatar.claimcheckpattern.domain.Message; -import com.iluwatar.claimcheckpattern.domain.UsageDetail; -import java.util.logging.Logger; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; - -@ExtendWith(MockitoExtension.class) -class EventHandlerUtilityTest { - - @Mock - EventGridPublisherClient mockCustomEventClient; - - @InjectMocks - EventHandlerUtility> eventHandlerUtility; - - @BeforeEach - void setUp() { - - System.setProperty("EventGridURL", "https://www.dummyEndpoint.com/api/events"); - System.setProperty("EventGridKey", "EventGridURL"); - } - - @Test - void shouldPublishEvent() { - doNothing().when(mockCustomEventClient).sendEvent(any(BinaryData.class)); - eventHandlerUtility.publishEvent(null, Logger.getLogger("logger")); - verify(mockCustomEventClient, times(1)).sendEvent(any(BinaryData.class)); - - } - - @Test - void shouldPublishEventWithNullLogger() { - eventHandlerUtility.publishEvent(null, null); - verify(mockCustomEventClient, times(1)).sendEvent(any(BinaryData.class)); - } -} diff --git a/cloud-claim-check-pattern/call-usage-app/src/test/java/com/iluwatar/claimcheckpattern/utility/MessageHandlerUtilityTest.java b/cloud-claim-check-pattern/call-usage-app/src/test/java/com/iluwatar/claimcheckpattern/utility/MessageHandlerUtilityTest.java deleted file mode 100644 index 7bfc08b89..000000000 --- a/cloud-claim-check-pattern/call-usage-app/src/test/java/com/iluwatar/claimcheckpattern/utility/MessageHandlerUtilityTest.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.claimcheckpattern.utility; - -import com.azure.storage.blob.BlobClient; -import com.azure.storage.blob.BlobContainerClient; -import com.azure.storage.blob.BlobServiceClient; -import com.iluwatar.claimcheckpattern.domain.*; -import com.iluwatar.claimcheckpattern.utility.MessageHandlerUtility; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; -import java.time.OffsetDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; -import java.util.UUID; -import java.util.logging.Logger; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.*; - -@ExtendWith(MockitoExtension.class) -class MessageHandlerUtilityTest { - @Mock - private BlobClient mockBlobClient; - - @Mock - private BlobContainerClient mockContainerClient; - - @Mock - private BlobServiceClient mockBlobServiceClient; - - @InjectMocks - private MessageHandlerUtility messageHandlerUtility; - - private Message messageToPublish; - private MessageReference messageReference; - - @BeforeEach - void setUp() { - System.setProperty("BlobStorageConnectionString", "https://www.dummyEndpoint.com/api/blobs"); - - var messageBody = new MessageBody(); - var usageDetailsList = new ArrayList(); - var random = new Random(); - for (int i = 0; i < 51; i++) { - var usageDetail = new UsageDetail(); - usageDetail.setUserId("userId" + i); - usageDetail.setData(random.nextInt(500)); - usageDetail.setDuration(random.nextInt(500)); - - usageDetailsList.add(usageDetail); - } - messageBody.setData(usageDetailsList); - - // Create message header - var messageHeader = new MessageHeader(); - messageHeader.setId(UUID.randomUUID().toString()); - messageHeader.setSubject("UsageDetailPublisher"); - messageHeader.setTopic("usagecostprocessorfunction-topic"); - messageHeader.setEventType("UsageDetail"); - messageHeader.setEventTime(OffsetDateTime.now().toString()); - this.messageReference = new MessageReference("callusageapp", messageHeader.getId() + "/input.json"); - messageHeader.setData(messageReference); - messageHeader.setDataVersion("v1.0"); - - // Create entire message - this.messageToPublish = new Message<>(); - this.messageToPublish.setMessageHeader(messageHeader); - this.messageToPublish.setMessageBody(messageBody); - - when(mockContainerClient.getBlobClient(anyString())).thenReturn(mockBlobClient); - when(mockBlobServiceClient.getBlobContainerClient(anyString())).thenReturn(mockContainerClient); - } - - @Test - void shouldDropMessageToPersistantStorage() { - messageHandlerUtility.dropToPersistantStorage(messageToPublish, Logger.getLogger("logger")); - verify(mockBlobServiceClient, times(1)).getBlobContainerClient(anyString()); - // verify(mockContainerClient, times(0)).exists(); - } - - @Test - void shouldReadMessageFromPersistantStorage() { - - messageHandlerUtility.readFromPersistantStorage(messageReference, Logger.getLogger("logger")); - verify(mockBlobServiceClient, times(1)).getBlobContainerClient(anyString()); - } -} diff --git a/cloud-claim-check-pattern/call-usage-app/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/cloud-claim-check-pattern/call-usage-app/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker deleted file mode 100644 index ca6ee9cea..000000000 --- a/cloud-claim-check-pattern/call-usage-app/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker +++ /dev/null @@ -1 +0,0 @@ -mock-maker-inline \ No newline at end of file diff --git a/cloud-claim-check-pattern/call-usage-app/src/test/resources/subscriptionValidationEvent.json b/cloud-claim-check-pattern/call-usage-app/src/test/resources/subscriptionValidationEvent.json deleted file mode 100644 index 52bd6ee6a..000000000 --- a/cloud-claim-check-pattern/call-usage-app/src/test/resources/subscriptionValidationEvent.json +++ /dev/null @@ -1,15 +0,0 @@ -[ - { - "data": { - "validationCode": "C12F266E-79D9-4C0A-9922-5EF6201A34C2", - "validationUrl": "https://rp-centralindia.eventgrid.azure.net:553/eventsubscriptions/usagedetailpublisherfunction-subscription/validate?idu003dC12F266E-79D9-4C0A-9922-5EF6201A34C2u0026tu003d2021-10-26T08:10:52.4999377Zu0026apiVersionu003d2020-10-15-previewu0026tokenu003d30kEVoL8rAOWzQv0buurhrKnbP%2bGMtHObbA%2bax6wb4Y%3d" - }, - "dataVersion": "2", - "eventTime": "2021-10-26T08:10:52.4999377Z", - "eventType": "Microsoft.EventGrid.SubscriptionValidationEvent", - "id": "e2a8466b-3dc0-46b7-bb7d-b999e51a2848", - "metadataVersion": "1", - "subject": "", - "topic": "/subscriptions/0fef643d-a6b1-48f9-a256-53fbd0d22f48/resourceGroups/resource-group-ccp/providers/Microsoft.EventGrid/domains/event-grid-domains-ccp/topics/usagedetailpublisherfunction-topic" - } -] diff --git a/cloud-claim-check-pattern/call-usage-app/src/test/resources/usageDetailEvent.json b/cloud-claim-check-pattern/call-usage-app/src/test/resources/usageDetailEvent.json deleted file mode 100644 index 137649e29..000000000 --- a/cloud-claim-check-pattern/call-usage-app/src/test/resources/usageDetailEvent.json +++ /dev/null @@ -1,15 +0,0 @@ -[ - { - "data": { - "dataFileName": "d8284456-dfff-4bd4-9cef-ea99f70f4835/input.json", - "dataLocation": "callusageapp" - }, - "dataVersion": "v1.0", - "eventTime": "2021-10-25T19:17:15.7468501Z", - "eventType": "UsageDetail", - "id": "d8284456-dfff-4bd4-9cef-ea99f70f4835", - "metadataVersion": "1", - "subject": "UsageDetailPublisher", - "topic": "/subscriptions/0fef643d-a6b1-48f9-a256-ea99f70f4835/resourceGroups/resource-group-ccp/providers/Microsoft.EventGrid/domains/event-grid-domains-ccp/topics/usagecostprocessorfunction-topic" - } -] diff --git a/cloud-claim-check-pattern/etc/Claim-Check-Pattern.png b/cloud-claim-check-pattern/etc/Claim-Check-Pattern.png deleted file mode 100644 index a2d8040afaf6c79495f50128bf17a0272cfe7370..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53447 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 diff --git a/cloud-claim-check-pattern/etc/claim-check-pattern.urm.puml b/cloud-claim-check-pattern/etc/claim-check-pattern.urm.puml deleted file mode 100644 index 14df8b68b..000000000 --- a/cloud-claim-check-pattern/etc/claim-check-pattern.urm.puml +++ /dev/null @@ -1,117 +0,0 @@ -@startuml -class UsageDetailPublisherFunction [[java:com.iluwatar.producer.calldetails.functions]] { - -messageHandlerUtility: MessageHandlerUtility - -eventHandlerUtility: EventHandlerUtility - +run(): HttpResponseMessage -} - -class UsageCostProcessorFunction [[java:com.iluwatar.consumer.callcostprocessor.functions]] { - -messageHandlerUtilityForUsageDetail: MessageHandlerUtility - -messageHandlerUtilityForUsageCostDetail: MessageHandlerUtility - +run(): HttpResponseMessage -} - -class "MessageHandlerUtility" as MessageHandlerUtility_T [[java:com.iluwatar.claimcheckpattern.utility]] { - +readFromPersistantStorage(messageReference: MessageReference, logger: Logger): Message - +dropToPersistantStorage(message: Message, logger: Logger): void -} - -class "EventHandlerUtility" as EventHandlerUtility_T [[java:com.callusage.utility.PersistentLocalStorageUtility]] { - +publishEvent(customEvent: T, logger: Logger): void -} - -class "Message" as Message_T [[java:com.iluwatar.claimcheckpattern.domain]] { - -messageHeader: MessageHeader - -messageData: MessageData - +Message(messageHeader: MessageHeader, messageData: MessageData) - +getMessageData(): MessageData - +getMessageHeader(): MessageHeader -} - - -class MessageHeader [[java:com.iluwatar.claimcheckpattern.domain]] { - -id: String - -subject: String - -topic: String - -eventType: String - -eventTime: String - -data: Object - -dataVersion: String - +getId(): String - +setId(id: String): void - +getSubject(): String - +setSubject(subject: String): void - +getTopic(): String - +setTopic(topic: String): void - +getEventType(): String - +setEventType(eventType: String): void - +getEventTime(): String - +setEventTime(eventTime: String): void - +getData(): Object - +setData(data: Object): void - +getDataVersion(): String - +setDataVersion(dataVersion:String): void - -} - - -class "MessageBody" as MessageBody_T [[java:com.iluwatar.claimcheckpattern.domain]] { - -data: List[] T - +getData(): List[] T - +setData(data:List[] T): void -} - -class MessageReference [[java:com.iluwatar.claimcheckpattern.domain]] { - -dataLocation: String - -dataFileName: String - +getDataLocation(): String - +setDataLocation(dataLocation:String): void - +getDataFileName(): String - +setDataFileName(dataFileName:String): void -} - -class UsageDetail [[java:com.iluwatar.claimcheckpattern.domain]] { - -userId: String - -duration: int - -data: int - +getUserId(): String - +setUserId(userId: String): void - +getDuration(): long - +setDuration(duration: long): void - +getData(): long - +setData(data: long): void -} - -class UsageCostDetail [[java:com.iluwatar.claimcheckpattern.domain]] { - -userId: String - -callCost: double - -dataCost: double - +getUserId(): String - +setUserId(userId: String): void - +getCallCost(): double - +setCallCost(callCost:double): void - +getDataCost(): double - +setDataCost(dataCost:double) : void -} - - - - - - - -Message_T "1" *-- "1" MessageHeader : has -Message_T "1" *-- "1" MessageBody_T : has -MessageHeader "1" *-- "1" MessageReference : has as data object -MessageBody_T "1" *-- "1" UsageDetail: has -MessageBody_T "1" *-- "1" UsageCostDetail: has - -EventHandlerUtility_T "1" *-- "1" MessageHeader: has -MessageHandlerUtility_T "1" *-- "1" Message_T: has - -UsageDetailPublisherFunction "1" *-- "1" MessageHandlerUtility_T : has -UsageDetailPublisherFunction "1" *-- "1" EventHandlerUtility_T : has - -UsageCostProcessorFunction "1" *-- "1" MessageHandlerUtility_T : has -UsageCostProcessorFunction "1" *-- "1" MessageHandlerUtility_T : has -@enduml \ No newline at end of file diff --git a/cloud-claim-check-pattern/etc/class-diagram.png b/cloud-claim-check-pattern/etc/class-diagram.png deleted file mode 100644 index d627b1b70c21f4fad1079a0c01ebe385965da2b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 110789 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 diff --git a/cloud-claim-check-pattern/pom.xml b/cloud-claim-check-pattern/pom.xml deleted file mode 100644 index 1015bb0fd..000000000 --- a/cloud-claim-check-pattern/pom.xml +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - com.iluwatar - java-design-patterns - 1.25.0-SNAPSHOT - - - 4.0.0 - claim-check-pattern - pom - - - call-usage-app - - - - com.google.code.gson - gson - 2.8.9 - - - org.junit.jupiter - junit-jupiter - 5.8.1 - test - - - org.mockito - mockito-junit-jupiter - 4.0.0 - test - - - - org.mockito - mockito-inline - 4.0.0 - test - - - - \ No newline at end of file diff --git a/cloud-static-content-hosting/README.md b/cloud-static-content-hosting/README.md deleted file mode 100644 index 918931e34..000000000 --- a/cloud-static-content-hosting/README.md +++ /dev/null @@ -1,145 +0,0 @@ ---- -title: Static Content Hosting -category: Cloud -language: en -tag: -- Cloud distributed ---- - -## Intent - -Deploy static content to a cloud-based storage service that can deliver them directly to the client. -This can reduce the need for potentially expensive compute instances. - -## Explanation - -Real world example - -> A global marketing web site with static content needs to be quickly deployed to start attracting -> potential customers. To keep the hosting expenses and maintenance minimum, a cloud hosted storage -> service along with content delivery network is used. - -In plain words - -> Static Content Hosting pattern utilizes cloud native storage service to store the content and -> global content delivery network to cache it in multiple data centers around the world. -> -> On a static website, individual webpages include static content. They might also contain -> client-side scripts such as Javascript. By contrast, a dynamic website relies on server-side -> processing, including server-side scripts such as PHP, JSP, or ASP.NET. - -Wikipedia says - -> A static web page (sometimes called a flat page or a stationary page) is a web page that is -> delivered to the user's web browser exactly as stored, in contrast to dynamic web pages which are -> generated by a web application. -> -> Static web pages are suitable for content that never or rarely needs to be updated, though modern -> web template systems are changing this. Maintaining large numbers of static pages as files can be -> impractical without automated tools, such as static site generators. - -**Example** - -![alt text](./etc/static-content-hosting.png "Static Content Hosting") - -In this example we create a static web site using AWS S3 and utilize AWS Cloudfront to distribute -the content globally. - -1. First you will need an AWS account. You can create a free one here: [AWS Free Tier](https://aws.amazon.com/free/free-tier/) - -2. Login to the [AWS Console](https://console.aws.amazon.com/console/home?nc2=h_ct&src=header-signin) - -3. Go to Identity and Access Management (IAM) service. - -4. Create IAM user that has only the necessary rights for this application. - - * Click `Users` - * Click `Add user`. Choose `User name` as you wish and `Access type` should be `Programmatic access`. Click `Next: Permissions`. - * Choose `Attach existing policies directly`. Select `AmazonS3FullAccess` and `CloudFrontFullAccess`. Click `Next: Tags`. - * No tags are necessarily needed, so just click `Next: Review`. - * Review the presented information and if all seems good click `Create user`. - * You are presented with `Access key ID` and `Secret access key` which you will need to complete this example, so store them safely. - * Click `Close`. - -5. [Install AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv1.html) to gain programmic access to AWS cloud. - -6. Configure AWS CLI with command `aws configure` as desribed in the [instructions](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config) - -7. Create AWS S3 bucket for the web site content. Note that the S3 bucket names must be globally unique. - - * The syntax is `aws s3 mb ` as described in the [instructions](https://docs.aws.amazon.com/cli/latest/userguide/cli-services-s3-commands.html#using-s3-commands-managing-buckets-creating) - * For example `aws s3 mb s3://my-static-website-jh34jsjmg` - * Verify that the bucket was successfully created with command `aws s3 ls` which list the existing buckets - -8. Configure the bucket as a web site with command `aws s3 website` as described in the [instructions](https://docs.aws.amazon.com/cli/latest/reference/s3/website.html). - - * E.g. `aws s3 website s3://my-static-website-jh34jsjmg --index-document index.html --error-document error.html` - -9. Upload content to the bucket. - - * First create the content, at least `index.html` and `error.html` documents. - * Upload the content to your bucket as described [here](https://docs.aws.amazon.com/cli/latest/userguide/cli-services-s3-commands.html#using-s3-commands-managing-objects-copy) - * E.g. `aws s3 cp index.html s3://my-static-website-jh34jsjmg` and `aws s3 cp error.html s3://my-static-website-jh34jsjmg` - -10. Next we need to set the bucket policy to allow read access. - - * Create `policy.json` with the following contents (note that you need to replace the bucket name with your own). - - ```json - { - "Version": "2012-10-17", - "Statement": [ - { - "Sid": "PublicReadGetObject", - "Effect": "Allow", - "Principal": "*", - "Action": "s3:GetObject", - "Resource": "arn:aws:s3:::my-static-website-jh34jsjmg/*" - } - ] - } - ``` - - * Set the bucket policy according to these [instructions](https://docs.aws.amazon.com/cli/latest/reference/s3api/put-bucket-policy.html) - * E.g. `aws s3api put-bucket-policy --bucket my-static-website-jh34jsjmg --policy file://policy.json` - -11. Test the web site in your browser. - - * The web site URL format is `http://.s3-website-.amazonaws.com` - * E.g. this web site was created in `eu-west-1` region with name `my-static-website-jh34jsjmg` so it can be accessed via url `http://my-static-website-jh34jsjmg.s3-website-eu-west-1.amazonaws.com` - -12. Create CloudFormation distribution for the web site. - - * The syntax is described in [this reference](https://docs.aws.amazon.com/cli/latest/reference/cloudfront/create-distribution.html) - * E.g. the easiest way is to call `aws cloudfront create-distribution --origin-domain-name my-static-website-jh34jsjmg.s3.amazonaws.com --default-root-object index.html` - * There's also JSON syntax e.g. `--distribution-config file://dist-config.json` to pass distribution configuration arguments in file - * The output of the call will show you the exact distribution settings including the generated CloudFront domain name you can use for testing e.g. `d2k3xwnaqa8nqx.cloudfront.net` - * CloudFormation distribution deployment takes some time, but once it's completed your web site is served from data centers all around the globe! - -13. That's it! You have implemented a static web site with content distribution network serving it lightning fast all around the world. - - * To update the web site you need to update the objects in S3 bucket and invalidate the objects in the CloudFront distribution - * To do it from AWS CLI see [this reference](https://docs.aws.amazon.com/cli/latest/reference/cloudfront/create-invalidation.html) - * Some further development you might want to do is serve the content over https and add a domain name for your site - -## Applicability - -Use the Static Content Hosting pattern when you want to: - -* Minimize the hosting cost for websites and applications that contain some static resources. -* Build a globally available web site with static content -* Monitor the web site traffic, bandwidth usage, costs etc. - -## Typical Use Case - -* Web sites with global reach -* Content produced by static web site generators -* Web sites with no dynamic content requirements - -## Real world examples - -* [Java Design Patterns web site](https://java-design-patterns.com) - -## Credits - -* [Static Content Hosting pattern](https://docs.microsoft.com/en-us/azure/architecture/patterns/static-content-hosting) diff --git a/cloud-static-content-hosting/etc/static-content-hosting.drawio b/cloud-static-content-hosting/etc/static-content-hosting.drawio deleted file mode 100644 index 50281e5e6..000000000 --- a/cloud-static-content-hosting/etc/static-content-hosting.drawio +++ /dev/null @@ -1 +0,0 @@ -7Vpbc9o6EP41PMZjW77AY0Kh56HttMOcIX3qCCxsNbLlyjKX/PqzMvING9rMQGE4mWQS72olrfbbXe8KBmgcbz8KnEafeUDYwDaD7QB9GNi2hRwL/inObs8ZIc0IBQ20UM2Y0Veimabm5jQgWUtQcs4kTdvMJU8SspQtHhaCb9piK87au6Y4JB3GbIlZlzungYz23KFr1vx/CA2jcmfL1CMxLoU1I4twwDcNFpoM0FhwLvdP8XZMmDJeaZf9vOmR0UoxQRL5JxOePj8vvN38XzEXc/KNzvDj65cH29PKyV15YhKAATTJhYx4yBPMJjX3aZmLNVGrWkDUIp84TzXzJ5Fyp8HEueTAimTM9CgoLHbPQJiGW5Lfm2MflPuYFbUrqS2Vz6UcPH+vlwCqnqSIcs7+eOpMR82mWRnPxZKcspWr/Q+LkMgTgsMKXQgLwmMCh4B5gjAs6bqtCNb+GVZyNYTwoFF8C6L+NRDVyJg3jox/VWS0lmvMcr1VFyrGILMpSDYRlWSW4uLgG0iubYvrpYiQZHvaft3j6gn2SCukU7M30plqUyc6G2le1Exy/uhCJhreloWc0iLaQrZvGe61beTflo089/ZMNLqhl5r5m5faGdNgWR/ddBYsC7vrgGO9Q3NCSes9bm62rrN60vzfBGfYRsewQKHflOuK+koEBQMQ8X+FrfO2DsiaMJ6CRQ7x5LlkNCHjqpVVBlvxRI4546KQQfAzVds/hQIHlNRjCU8U4ivKWJ94JgV/IQfCAc6iwj3URqoKoND4fsILwr7yjErKExhbcCl53BB4ZDRUA1I50RPW1BJ0USg33Ufprn2r8JaC1udVW+Is3R90RbdKj6eUU7XKZA2LZXoR6JtTNSHehuqKwcCbzDHyrNjrDPUL8ts1ntctgv1ht3gpeefvEjoO8zifAWOG4M8iX76Ar/+R41wa3B5ckLFX8MeGyugHX/wEbbKuU05M13bQcR8+A6qW20YVoS6sXk9N6lXV69mBRUeAHTOeB1MBoXHDuC6VkqtCyQ6cU3foIu+icLqeZ7T7DGQ5PX2GX4k1QR2hSyX3LqaWoS4jBcGSHI9XMIQ8MHpfem7aWbM6wB3iG9MgYMc6P8HzJKh85xxhZrfDzOrJnpbVE2flvPND4nQgsRUkOAhgvTwN9sCUuelukaku0Mu+3OxBpq8rvxwy3esv1AqWgIKt6SIvUtjdAuOWSaMMGf/qwHRvlJwqZEyaAJ9C2AAqdxwvnnMQL9bVYRl1YClfJ+aGLOBVr4KGJEFRNA9sjykkFtBWeOEeEwmWelRKqF8Px8pwe6FinYcEx6QaKOYYGXrQaz+0pwgSggP0TcExfoWmcpMZS6g47tZBDvKp0/OmQ30V5cX8o1y44R+NKg3SKY8xhURqasxOuUdgv6DtJsG/8DD5tW1Ue0ai/G16v7A69s3h2r0yUN1uN/e+Xxe86bogO9d9gdVyGN8x+xqRv3llYL3pY7PSQEWQHwmzM3+M1g4xt6cU9Z2eEKua+DdYDMj6KxXFWOOLKWjyHw== \ No newline at end of file diff --git a/cloud-static-content-hosting/etc/static-content-hosting.png b/cloud-static-content-hosting/etc/static-content-hosting.png deleted file mode 100644 index 6e0baa95e0f99d3a8a32063531060a8fe80a9323..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88049 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 Q||DEh4#5)Ult@S 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 JQdQeK{{x#R@mc@? diff --git a/eip-aggregator/README.md b/eip-aggregator/README.md deleted file mode 100644 index b4a69cf78..000000000 --- a/eip-aggregator/README.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: EIP Aggregator -category: Integration -language: en -tag: - - Enterprise Integration Pattern ---- - -## Intent -Sometimes in enterprise systems there is a need to group incoming data in order to process it as a whole. For example -you may need to gather offers and after defined number of offers has been received you would like to choose the one with -the best parameters. - -Aggregator allows you to merge messages based on defined criteria and parameters. It gathers original messages, -applies aggregation strategy and upon fulfilling given criteria, releasing merged messages. - -## Diagram -![alt text](./etc/aggregator.gif "Splitter") - -## Applicability -Use the Aggregator pattern when - -* You need to combine multiple incoming messages -* You want to process grouped data - -## Credits - -* [Gregor Hohpe, Bobby Woolf - Enterprise Integration Patterns](http://www.enterpriseintegrationpatterns.com/patterns/messaging/Aggregator.html) -* [Apache Camel - Documentation](http://camel.apache.org/aggregator2.html) -* [Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions](https://www.amazon.com/gp/product/0321200683/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0321200683&linkCode=as2&tag=javadesignpat-20&linkId=122e0cff74eedd004cc81a3ecfa623cf) diff --git a/eip-aggregator/etc/aggregator.gif b/eip-aggregator/etc/aggregator.gif deleted file mode 100644 index b06cdfb0c920bd2e8f9257ebcae452e81dac6acd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2413 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 diff --git a/eip-aggregator/etc/eip-aggregator.urm.puml b/eip-aggregator/etc/eip-aggregator.urm.puml deleted file mode 100644 index 4d8661e21..000000000 --- a/eip-aggregator/etc/eip-aggregator.urm.puml +++ /dev/null @@ -1,14 +0,0 @@ -@startuml -package com.iluwatar.eip.aggregator { - class App { - + App() - + main(args : String[]) {static} - } -} -package com.iluwatar.eip.aggregator.routes { - class MessageAggregationStrategy { - + MessageAggregationStrategy() - + aggregate(oldExchange : Exchange, newExchange : Exchange) : Exchange - } -} -@enduml \ No newline at end of file diff --git a/eip-aggregator/pom.xml b/eip-aggregator/pom.xml deleted file mode 100644 index f24a205dd..000000000 --- a/eip-aggregator/pom.xml +++ /dev/null @@ -1,93 +0,0 @@ - - - - 4.0.0 - eip-aggregator - - com.iluwatar - java-design-patterns - 1.26.0-SNAPSHOT - - - - org.springframework.boot - spring-boot-starter-web - - - org.apache.camel - camel-core - - - org.apache.camel.springboot - camel-spring-boot - ${camel.version} - - - org.glassfish.jaxb - jaxb-runtime - - - javax.xml.bind - jaxb-api - - - - org.junit.jupiter - junit-jupiter-engine - test - - - org.springframework.boot - spring-boot-starter-test - - - org.apache.camel - camel-test-spring - ${camel.version} - - - - - - org.apache.maven.plugins - maven-assembly-plugin - - - - - - com.iluwatar.epi.aggregator.App - - - - - - - - - diff --git a/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/App.java b/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/App.java deleted file mode 100644 index d985199a1..000000000 --- a/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/App.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.eip.aggregator; - -import org.apache.camel.CamelContext; -import org.apache.camel.builder.RouteBuilder; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -/** - * Sometimes in enterprise systems there is a need to group incoming data in order to process it as - * a whole. For example you may need to gather offers and after defined number of offers has been - * received you would like to choose the one with the best parameters. - * - *

Aggregator allows you to merge messages based on defined criteria and parameters. It gathers - * original messages, applies aggregation strategy and upon fulfilling given criteria, releasing - * merged messages. - */ -@SpringBootApplication -public class App { - - /** - * Program entry point. It starts Spring Boot application and using Apache Camel it - * auto-configures routes. - * - * @param args command line args - */ - public static void main(String[] args) throws Exception { - // Run Spring Boot application and obtain ApplicationContext - var context = SpringApplication.run(App.class, args); - - // Get CamelContext from ApplicationContext - var camelContext = (CamelContext) context.getBean("camelContext"); - - // Add a new routes that will handle endpoints form SplitterRoute class. - camelContext.addRoutes(new RouteBuilder() { - @Override - public void configure() { - from("{{endpoint}}").log("ENDPOINT: ${body}"); - } - }); - - // Add producer that will send test message to an entry point in WireTapRoute - String[] stringArray = {"Test item #1", "Test item #2", "Test item #3"}; - camelContext.createProducerTemplate().sendBody("{{entry}}", stringArray); - - SpringApplication.exit(context); - } -} diff --git a/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/AggregatorRoute.java b/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/AggregatorRoute.java deleted file mode 100644 index ab1fdddec..000000000 --- a/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/AggregatorRoute.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.eip.aggregator.routes; - -import org.apache.camel.builder.RouteBuilder; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -/** - * Sample aggregator route definition. - * - *

It consumes messages out of the direct:entry entry point and forwards them to - * direct:endpoint. Route accepts messages containing String as a body, it aggregates the - * messages based on the settings and forwards them as CSV to the output chanel. - * - *

Settings for the aggregation are: aggregate until 3 messages are bundled or wait 2000ms - * before sending bundled messages further. - * - *

In this example input/output endpoints names are stored in application.properties - * file. - */ -@Component -public class AggregatorRoute extends RouteBuilder { - - @Autowired - private MessageAggregationStrategy aggregator; - - /** - * Configures the route. - */ - @Override - public void configure() { - // Main route - from("{{entry}}").aggregate(constant(true), aggregator) - .completionSize(3).completionInterval(2000) - .to("{{endpoint}}"); - } -} diff --git a/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategy.java b/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategy.java deleted file mode 100644 index 07d3f2eeb..000000000 --- a/eip-aggregator/src/main/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategy.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.eip.aggregator.routes; - -import org.apache.camel.AggregationStrategy; -import org.apache.camel.Exchange; -import org.springframework.stereotype.Component; - -/** - * Aggregation strategy joining bodies of messages. If message is first one oldMessage is - * null. All changes are made on IN messages. - */ -@Component -public class MessageAggregationStrategy implements AggregationStrategy { - - @Override - public Exchange aggregate(Exchange oldExchange, Exchange newExchange) { - if (oldExchange == null) { - return newExchange; - } - - var in1 = (String) oldExchange.getIn().getBody(); - var in2 = (String) newExchange.getIn().getBody(); - - oldExchange.getIn().setBody(in1 + ";" + in2); - - return oldExchange; - } -} diff --git a/eip-aggregator/src/main/resources/application.properties b/eip-aggregator/src/main/resources/application.properties deleted file mode 100644 index ca07b459e..000000000 --- a/eip-aggregator/src/main/resources/application.properties +++ /dev/null @@ -1,25 +0,0 @@ -# -# The MIT License -# Copyright © 2014-2021 Ilkka Seppälä -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -# - -entry=direct:entry -endpoint=direct:endpoint diff --git a/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/AppTest.java b/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/AppTest.java deleted file mode 100644 index 0b3d69861..000000000 --- a/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/AppTest.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.eip.aggregator; - -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; - -/** - * Test for App class - */ -class AppTest { - - /** - * Issue: Add at least one assertion to this test case. - * - * Solution: Inserted assertion to check whether the execution of the main method in {@link App#main(String[])} - * throws an exception. - */ - - @Test - void shouldExecuteApplicationWithoutException() { - assertDoesNotThrow(() -> App.main(new String[]{})); - } -} diff --git a/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/AggregatorRouteTest.java b/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/AggregatorRouteTest.java deleted file mode 100644 index 0dd3cf60e..000000000 --- a/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/AggregatorRouteTest.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.eip.aggregator.routes; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -import org.apache.camel.EndpointInject; -import org.apache.camel.ProducerTemplate; -import org.apache.camel.component.mock.MockEndpoint; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -/** - * Test class for AggregatorRoute. - *

- * In order for it to work we have to mock endpoints we want to read/write to. To mock those we need - * to substitute original endpoint names to mocks. - *

- */ -@ExtendWith(SpringExtension.class) -@SpringBootTest(classes = AggregatorRouteTest.class) -@ActiveProfiles("test") -@EnableAutoConfiguration -@ComponentScan -class AggregatorRouteTest { - - @EndpointInject(uri = "{{entry}}") - private ProducerTemplate entry; - - @EndpointInject(uri = "{{endpoint}}") - private MockEndpoint endpoint; - - /** - * Test if endpoint receives three separate messages. - * - * @throws Exception in case of en exception during the test - */ - @Test - @DirtiesContext - void testSplitter() throws Exception { - - // Three items in one entry message - entry.sendBody("TEST1"); - entry.sendBody("TEST2"); - entry.sendBody("TEST3"); - entry.sendBody("TEST4"); - entry.sendBody("TEST5"); - - // Endpoint should have three different messages in the end order of the messages is not important - endpoint.expectedMessageCount(2); - endpoint.assertIsSatisfied(); - - var body = (String) endpoint.getReceivedExchanges().get(0).getIn().getBody(); - assertEquals(3, body.split(";").length); - - var body2 = (String) endpoint.getReceivedExchanges().get(1).getIn().getBody(); - assertEquals(2, body2.split(";").length); - } -} diff --git a/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategyTest.java b/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategyTest.java deleted file mode 100644 index ed5d46e7b..000000000 --- a/eip-aggregator/src/test/java/com/iluwatar/eip/aggregator/routes/MessageAggregationStrategyTest.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.eip.aggregator.routes; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -import org.apache.camel.CamelContext; -import org.apache.camel.impl.engine.SimpleCamelContext; -import org.apache.camel.support.DefaultExchange; -import org.junit.jupiter.api.Test; - -/** - * Tests MessageAggregationStrategy - */ -class MessageAggregationStrategyTest { - - private final CamelContext context = new SimpleCamelContext(); - - @Test - void testAggregate() { - var mas = new MessageAggregationStrategy(); - var oldExchange = new DefaultExchange(context); - oldExchange.getIn().setBody("TEST1"); - - var newExchange = new DefaultExchange(context); - newExchange.getIn().setBody("TEST2"); - - var output = mas.aggregate(oldExchange, newExchange); - var outputBody = (String) output.getIn().getBody(); - assertEquals("TEST1;TEST2", outputBody); - } - - @Test - void testAggregateOldNull() { - var mas = new MessageAggregationStrategy(); - - var newExchange = new DefaultExchange(context); - newExchange.getIn().setBody("TEST2"); - - var output = mas.aggregate(null, newExchange); - var outputBody = (String) output.getIn().getBody(); - - assertEquals(newExchange, output); - assertEquals("TEST2", outputBody); - } -} diff --git a/eip-aggregator/src/test/resources/application-test.properties b/eip-aggregator/src/test/resources/application-test.properties deleted file mode 100644 index 843005704..000000000 --- a/eip-aggregator/src/test/resources/application-test.properties +++ /dev/null @@ -1,25 +0,0 @@ -# -# The MIT License -# Copyright © 2014-2021 Ilkka Seppälä -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -# - -entry=direct:entry -endpoint=mock:endpoint diff --git a/eip-message-channel/.gitignore b/eip-message-channel/.gitignore deleted file mode 100644 index b83d22266..000000000 --- a/eip-message-channel/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/target/ diff --git a/eip-message-channel/README.md b/eip-message-channel/README.md deleted file mode 100644 index 1d06174e2..000000000 --- a/eip-message-channel/README.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: EIP Message Channel -category: Integration -language: en -tag: - - Enterprise Integration Pattern ---- - -## Intent -When two applications communicate using a messaging system they do it by using logical addresses -of the system, so called Message Channels. - -## Class diagram -![alt text](./etc/message-channel.png "Message Channel") - -## Applicability -Use the Message Channel pattern when - -* two or more applications need to communicate using a messaging system - -## Real world examples - -* [akka-camel](http://doc.akka.io/docs/akka/snapshot/scala/camel.html) -* [Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions](https://www.amazon.com/gp/product/0321200683/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0321200683&linkCode=as2&tag=javadesignpat-20&linkId=122e0cff74eedd004cc81a3ecfa623cf) diff --git a/eip-message-channel/etc/eip-message-channel.urm.puml b/eip-message-channel/etc/eip-message-channel.urm.puml deleted file mode 100644 index 38e2369ce..000000000 --- a/eip-message-channel/etc/eip-message-channel.urm.puml +++ /dev/null @@ -1,9 +0,0 @@ -@startuml -package com.iluwatar.eip.message.channel { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } -} -@enduml \ No newline at end of file diff --git a/eip-message-channel/etc/message-channel.png b/eip-message-channel/etc/message-channel.png deleted file mode 100644 index 7db473281affe66670f2a7e7488ad26de87107e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47216 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 diff --git a/eip-message-channel/etc/message-channel.ucls b/eip-message-channel/etc/message-channel.ucls deleted file mode 100644 index 3ef0ed4bc..000000000 --- a/eip-message-channel/etc/message-channel.ucls +++ /dev/null @@ -1,320 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/eip-message-channel/pom.xml b/eip-message-channel/pom.xml deleted file mode 100644 index 898c47fcb..000000000 --- a/eip-message-channel/pom.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - - 4.0.0 - - com.iluwatar - java-design-patterns - 1.26.0-SNAPSHOT - - eip-message-channel - - - org.apache.camel - camel-core - - - org.apache.camel - camel-stream - - - org.junit.jupiter - junit-jupiter-engine - test - - - - - - org.apache.maven.plugins - maven-assembly-plugin - - - - - - com.iluwatar.eip.message.channel.App - - - - - - - - - diff --git a/eip-message-channel/src/main/java/com/iluwatar/eip/message/channel/App.java b/eip-message-channel/src/main/java/com/iluwatar/eip/message/channel/App.java deleted file mode 100644 index 90912d5fe..000000000 --- a/eip-message-channel/src/main/java/com/iluwatar/eip/message/channel/App.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.eip.message.channel; - -import lombok.extern.slf4j.Slf4j; -import org.apache.camel.builder.RouteBuilder; -import org.apache.camel.impl.DefaultCamelContext; - -/** - * When two applications communicate with each other using a messaging system they first need to - * establish a communication channel that will carry the data. Message Channel decouples Message - * producers and consumers. - * - *

The sending application doesn't necessarily know what particular application will end up - * retrieving it, but it can be assured that the application that retrieves the information is - * interested in that information. This is because the messaging system has different Message - * Channels for different types of information the applications want to communicate. When an - * application sends information, it doesn't randomly add the information to any channel available; - * it adds it to a channel whose specific purpose is to communicate that sort of information. - * Likewise, an application that wants to receive particular information doesn't pull info off some - * random channel; it selects what channel to get information from based on what type of information - * it wants. - * - *

In this example we use Apache Camel to establish two different Message Channels. The first - * one reads from standard input and delivers messages to Direct endpoint. The second Message - * Channel is established from the Direct component to console output. No actual messages are sent, - * only the established routes are printed to standard output. - */ -@Slf4j -public class App { - - /** - * Program entry point. - */ - public static void main(String[] args) throws Exception { - var context = new DefaultCamelContext(); - - context.addRoutes(new RouteBuilder() { - - @Override - public void configure() throws Exception { - from("stream:in").to("direct:greetings"); - from("direct:greetings").to("stream:out"); - } - }); - - context.start(); - context.getRoutes().forEach(r -> LOGGER.info(r.toString())); - context.stop(); - } -} diff --git a/eip-message-channel/src/test/java/com/iluwatar/eip/message/channel/AppTest.java b/eip-message-channel/src/test/java/com/iluwatar/eip/message/channel/AppTest.java deleted file mode 100644 index 427bceb73..000000000 --- a/eip-message-channel/src/test/java/com/iluwatar/eip/message/channel/AppTest.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.eip.message.channel; - -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; - -/** - * Application test - */ -class AppTest { - - /** - * Issue: Add at least one assertion to this test case. - * - * Solution: Inserted assertion to check whether the execution of the main method in {@link App#main(String[])} - * throws an exception. - */ - - @Test - void shouldExecuteApplicationWithoutException() { - assertDoesNotThrow(() -> App.main(new String[]{})); - } -} diff --git a/eip-publish-subscribe/.gitignore b/eip-publish-subscribe/.gitignore deleted file mode 100644 index b83d22266..000000000 --- a/eip-publish-subscribe/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/target/ diff --git a/eip-publish-subscribe/README.md b/eip-publish-subscribe/README.md deleted file mode 100644 index fbdd35e7e..000000000 --- a/eip-publish-subscribe/README.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: EIP Publish Subscribe -category: Integration -language: en -tag: - - Enterprise Integration Pattern ---- - -## Intent -Broadcast messages from sender to all the interested receivers. - -## Class diagram -![alt text](./etc/publish-subscribe.png "Publish Subscribe Channel") - -## Applicability -Use the Publish Subscribe Channel pattern when - -* two or more applications need to communicate using a messaging system for broadcasts. - -## Credits - -* [J2EE Design Patterns](https://www.amazon.com/gp/product/0596004273/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596004273&linkCode=as2&tag=javadesignpat-20&linkId=48d37c67fb3d845b802fa9b619ad8f31) -* [Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions](https://www.amazon.com/gp/product/0321200683/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0321200683&linkCode=as2&tag=javadesignpat-20&linkId=122e0cff74eedd004cc81a3ecfa623cf) diff --git a/eip-publish-subscribe/etc/eip-publish-subscribe.urm.puml b/eip-publish-subscribe/etc/eip-publish-subscribe.urm.puml deleted file mode 100644 index a201f59bb..000000000 --- a/eip-publish-subscribe/etc/eip-publish-subscribe.urm.puml +++ /dev/null @@ -1,9 +0,0 @@ -@startuml -package com.iluwatar.eip.publish.subscribe { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } -} -@enduml \ No newline at end of file diff --git a/eip-publish-subscribe/etc/publish-subscribe.png b/eip-publish-subscribe/etc/publish-subscribe.png deleted file mode 100644 index 99867da66b548a6d484d67364d4eb3dbaed3e2f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27741 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

s(c{+6#Xc&>ImMwHl&y7=u7` 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 xk&%Jtkpd1f - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/eip-publish-subscribe/pom.xml b/eip-publish-subscribe/pom.xml deleted file mode 100644 index ecd3dc2ce..000000000 --- a/eip-publish-subscribe/pom.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - - 4.0.0 - - com.iluwatar - java-design-patterns - 1.26.0-SNAPSHOT - - eip-publish-subscribe - - - org.apache.camel - camel-core - - - org.apache.camel - camel-stream - - - org.junit.jupiter - junit-jupiter-engine - test - - - - - - org.apache.maven.plugins - maven-assembly-plugin - - - - - - com.iluwatar.eip.publish.subscribe.App - - - - - - - - - diff --git a/eip-publish-subscribe/src/main/java/com/iluwatar/eip/publish/subscribe/App.java b/eip-publish-subscribe/src/main/java/com/iluwatar/eip/publish/subscribe/App.java deleted file mode 100644 index 94ab862df..000000000 --- a/eip-publish-subscribe/src/main/java/com/iluwatar/eip/publish/subscribe/App.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.eip.publish.subscribe; - -import lombok.extern.slf4j.Slf4j; -import org.apache.camel.builder.RouteBuilder; -import org.apache.camel.impl.DefaultCamelContext; - -/** - * There are well-established patterns for implementing broadcasting. The Observer pattern describes - * the need to decouple observers from their subject (that is, the originator of the event) so that - * the subject can easily provide event notification to all interested observers no matter how many - * observers there are (even none). The Publish-Subscribe pattern expands upon Observer by adding - * the notion of an event channel for communicating event notifications. - * - *

A Publish-Subscribe Channel works like this: It has one input channel that splits into - * multiple output channels, one for each subscriber. When an event is published into the channel, - * the Publish-Subscribe Channel delivers a copy of the message to each of the output channels. Each - * output end of the channel has only one subscriber, which is allowed to consume a message only - * once. In this way, each subscriber gets the message only once, and consumed copies disappear from - * their channels. - * - *

In this example we use Apache Camel to establish a Publish-Subscribe Channel from - * "direct-origin" to "mock:foo", "mock:bar" and "stream:out". - */ -@Slf4j -public class App { - - /** - * Program entry point. - */ - public static void main(String[] args) throws Exception { - var context = new DefaultCamelContext(); - context.addRoutes(new RouteBuilder() { - @Override - public void configure() throws Exception { - from("direct:origin").multicast().to("mock:foo", "mock:bar", "stream:out"); - } - }); - var template = context.createProducerTemplate(); - context.start(); - context.getRoutes().forEach(r -> LOGGER.info(r.toString())); - template.sendBody("direct:origin", "Hello from origin"); - context.stop(); - } -} diff --git a/eip-publish-subscribe/src/main/resources/logback.xml b/eip-publish-subscribe/src/main/resources/logback.xml deleted file mode 100644 index 1f177fc24..000000000 --- a/eip-publish-subscribe/src/main/resources/logback.xml +++ /dev/null @@ -1,49 +0,0 @@ - - - - - publish-subscribe.log - - publish-subscribe-%d.log - 5 - - - %-5p [%d{ISO8601,UTC}] %c: %m%n - - - - - %-5p [%d{ISO8601,UTC}] %c: %m%n - - - - - - - - - - diff --git a/eip-publish-subscribe/src/test/java/com/iluwatar/eip/publish/subscribe/AppTest.java b/eip-publish-subscribe/src/test/java/com/iluwatar/eip/publish/subscribe/AppTest.java deleted file mode 100644 index f8cc0083c..000000000 --- a/eip-publish-subscribe/src/test/java/com/iluwatar/eip/publish/subscribe/AppTest.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.eip.publish.subscribe; - -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; - -/** - * Application test - */ -class AppTest { - - /** - * Issue: Add at least one assertion to this test case. - * - * Solution: Inserted assertion to check whether the execution of the main method in {@link App#main(String[])} - * throws an exception. - */ - - @Test - void shouldExecuteApplicationWithoutException() { - assertDoesNotThrow(() -> App.main(new String[]{})); - } -} diff --git a/eip-splitter/README.md b/eip-splitter/README.md deleted file mode 100644 index 468685e00..000000000 --- a/eip-splitter/README.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: EIP Splitter -category: Integration -language: en -tag: - - Enterprise Integration Pattern ---- - -## Intent -It is very common in integration systems that incoming messages consists of many items bundled together. For example -an invoice document contains multiple invoice lines describing transaction (quantity, name of provided -service/sold goods, price etc.). Such bundled messages may not be accepted by other systems. This is where splitter -pattern comes in handy. It will take the whole document, split it based on given criteria and send individual -items to the endpoint. - -## Diagram -![alt text](./etc/sequencer.gif "Splitter") - -## Applicability -Use the Splitter pattern when - -* You need to split received data into smaller pieces to process them individually -* You need to control the size of data batches you are able to process - -## Credits - -* [Gregor Hohpe, Bobby Woolf - Enterprise Integration Patterns](http://www.enterpriseintegrationpatterns.com/patterns/messaging/Sequencer.html) -* [Apache Camel - Documentation](http://camel.apache.org/splitter.html) -* [Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions](https://www.amazon.com/gp/product/0321200683/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0321200683&linkCode=as2&tag=javadesignpat-20&linkId=122e0cff74eedd004cc81a3ecfa623cf) diff --git a/eip-splitter/etc/eip-splitter.urm.puml b/eip-splitter/etc/eip-splitter.urm.puml deleted file mode 100644 index ad063b709..000000000 --- a/eip-splitter/etc/eip-splitter.urm.puml +++ /dev/null @@ -1,8 +0,0 @@ -@startuml -package com.iluwatar.eip.splitter { - class App { - + App() - + main(args : String[]) {static} - } -} -@enduml \ No newline at end of file diff --git a/eip-splitter/etc/sequencer.gif b/eip-splitter/etc/sequencer.gif deleted file mode 100644 index a925fa2098777dadbf4c9e9a2006e9513421b8dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2298 zcmVM)j$~<` zXsWJk>%Q9|%W!Sqc&_h!@BbtjVK}4#kI1BQ$!t1p2coq2tXi+wtajUpPNxU1cuX#v z&mZp>jBdN%@c2%>CWhtsynfF|(Cc=6f`f#GOn-m`cZQ6Oj*lmZfQyiomY0>1b(EN$ zo}Y4>Yn-5^rl(n=QlzM@uCG3-fv~i-wlK1+x4XQ(9HP3u!o$8otHH#{%Cs{^%g@lZ z$kEi*nA6tT+J)HL-ru3%;^TVV>7`uiUB1OEd82n6^~ zU;udh61wwOa3Dd00}v{lc#a{&hYlrD-1yDkMSvgwHF6wjt=`9m0SJmD$?}=Wlo(+G zT-mbbFp~rWIs{4c3cjB}g9;r=bf`^nKy#kd*;8H7r%jak)f_n&c7g2gjG43R*KIxHkwrxb?a;PC*FN(S zuW zGOk7Ab2;Xw+l?_4x#B4t`uHM{{Sh%(X{05BB#u^2*rSt%eF&w8B!0GuV`D=0*mGNQ z`6P%zsx_o!f53G}oL8nnr*;=am7kg;;uGZ%gJ6Y)pgw68$4dnyny5jFCR%3>P4cPW zn_E>i#-mW=$!MdSI=ZK%E>e2vrKHZ5X91lqDv+X>q5vock%Fq8s7|~JLaWV{S}6qw zs2V_{sIFQ7t|my4XPYzf=Vq*(DSH_ItxXu4hOS!>>q0$>rW)+8){^i=1CFvy@|imVsZtfuyhwh@Nb;r(A1l zfB^!HT{hVPjGeR}MSs0*qicTvhy)Qg9W%w{o(1!`09SqQ$9Zb)8$?LXTj4#t})~t8`-e~O|V&7s|9z)<+SC;s}k{f+GxQ(CfdgGACn>yHK zuzUH-&UQXSvK3=Yb?8&{6Zldg1r4sRhnu`QudO%FxZ04#`?lA^+WR}Nm_ zRxDx~JEX-MI--aC1B@K!__i^wPlI^`1r|ZL#@O7CiK$u2APH#@Lzc0MXVjwu{Ux;s zJ<^SVq@Z#vcrr^0k%*V;S#UPFx!z4}iEiv*Ut|d$S}I3zm&D^LS$Q2U9;Fv1AtNGp z$xGt+@|U{^<{@9WKocyon4WASGMAyuTpG}W(6r7mr&)_?p7K-Kgv~a&2@7uu^P02S zV>q8CO>*7@m*2e1ROU&~dA8G?#Yo{fhsc_G`tzScxhFoUc}H~WA!i89*+923ziGRmD^p>*)oOLs2xuLvUj0xftMXN^ zcr`0rYv9+w{*|nVl~Y}LQCPu}HLQ*;D_|Y_Rmx_{t%(&ZWcRvQlHS#_d==}X8oO7t ziuSTk%`9MrO4rU746~bkY@TBA+0t@0ve&AuYU`l_PEbXtSMvm+bgK-e+IF(XJxyv= zE8FC@HMyJrjcr)giUQ*X_Zpa;?Q&aNDC(wCt=2t_SP>gq@Gh6I<4vk)y<1)82BE7v z!|r*r>s;3|gSn@zZ)5YSUdVE{1iDCTbVEyExtjIA_N51M2dv+_R`#&FMKFNjV%P^u zSF;jMFku&LS+@E$wHH2ah8YN23xl?~8t#ODeB%OJ%?25_FV-<6)a%^X(pShKrf~>-JJ{wv7{5JMac(8cK*iR$x8r^9 zb}5YH@17U9`6Yy)1Z?EPwz$O`%CZQ&+}5Uqx3_W*S)Sb~Ws&V!cvreIp6l}GDYLZC zmRhf;fAbpOuqpb$jJ|GO3QTD>L%7i+MYLV9>}Ej^`La=FG*!18>MGwy(@Ms{l^N{b zPj8shLWb|8VSQrlrn(iY&T)Oq{A%zTw$;3@v9DJh>?Ge>k-LtytLuzpWfxk^PKK^l zk6lD*b6VD_wzjk9L+m5p_RiG)M5NOk?P8PKyw?6ModI0sO4pjj;f}Yw=S}Z=+xy=5 U&bPkz&F_Bu``-ZHY6JiPJ08586aWAK diff --git a/eip-splitter/pom.xml b/eip-splitter/pom.xml deleted file mode 100644 index 49d2cf9e0..000000000 --- a/eip-splitter/pom.xml +++ /dev/null @@ -1,93 +0,0 @@ - - - - 4.0.0 - eip-splitter - - com.iluwatar - java-design-patterns - 1.26.0-SNAPSHOT - - - - org.springframework.boot - spring-boot-starter-web - - - org.apache.camel - camel-core - - - org.apache.camel.springboot - camel-spring-boot - ${camel.version} - - - org.glassfish.jaxb - jaxb-runtime - - - javax.xml.bind - jaxb-api - - - - org.junit.jupiter - junit-jupiter-engine - test - - - org.springframework.boot - spring-boot-starter-test - - - org.apache.camel - camel-test-spring - ${camel.version} - - - - - - org.apache.maven.plugins - maven-assembly-plugin - - - - - - com.iluwatar.eip.splitter.App - - - - - - - - - diff --git a/eip-splitter/src/main/java/com/iluwatar/eip/splitter/App.java b/eip-splitter/src/main/java/com/iluwatar/eip/splitter/App.java deleted file mode 100644 index c941e6883..000000000 --- a/eip-splitter/src/main/java/com/iluwatar/eip/splitter/App.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.eip.splitter; - -import org.apache.camel.CamelContext; -import org.apache.camel.builder.RouteBuilder; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -/** - * It is very common in integration systems that incoming messages consists of many items bundled - * together. For example an invoice document contains multiple invoice lines describing transaction - * (quantity, name of provided service/sold goods, price etc.). Such bundled messages may not be - * accepted by other systems. This is where splitter pattern comes in handy. It will take the whole - * document, split it based on given criteria and send individual items to the endpoint. - * - *

- * Splitter allows you to split messages based on defined criteria. It takes original message, - * process it and send multiple parts to the output channel. It is not defined if it should keep the - * order of items though. - *

- */ -@SpringBootApplication -public class App { - - /** - * Program entry point. It starts Spring Boot application and using Apache Camel it - * auto-configures routes. - * - * @param args command line args - */ - public static void main(String[] args) throws Exception { - // Run Spring Boot application and obtain ApplicationContext - var context = SpringApplication.run(App.class, args); - - // Get CamelContext from ApplicationContext - var camelContext = (CamelContext) context.getBean("camelContext"); - - // Add a new routes that will handle endpoints form SplitterRoute class. - camelContext.addRoutes(new RouteBuilder() { - - @Override - public void configure() throws Exception { - from("{{endpoint}}").log("ENDPOINT: ${body}"); - } - - }); - - // Add producer that will send test message to an entry point in WireTapRoute - String[] stringArray = {"Test item #1", "Test item #2", "Test item #3"}; - camelContext.createProducerTemplate().sendBody("{{entry}}", stringArray); - - SpringApplication.exit(context); - } -} diff --git a/eip-splitter/src/main/java/com/iluwatar/eip/splitter/routes/SplitterRoute.java b/eip-splitter/src/main/java/com/iluwatar/eip/splitter/routes/SplitterRoute.java deleted file mode 100644 index 1def66117..000000000 --- a/eip-splitter/src/main/java/com/iluwatar/eip/splitter/routes/SplitterRoute.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.eip.splitter.routes; - -import org.apache.camel.builder.RouteBuilder; -import org.springframework.stereotype.Component; - -/** - * Sample splitter route definition. - * - *

It consumes messages out of the direct:entry entry point and forwards them to - * direct:endpoint. Route accepts messages having body of array or collection of objects. - * Splitter component split message body and forwards single objects to the endpoint. - * - *

In this example input/output endpoints names are stored in application.properties - * file. - */ -@Component -public class SplitterRoute extends RouteBuilder { - - /** - * Configures the route. - * - * @throws Exception in case of exception during configuration - */ - @Override - public void configure() throws Exception { - // Main route - from("{{entry}}").split().body().to("{{endpoint}}"); - } -} diff --git a/eip-splitter/src/main/resources/application.properties b/eip-splitter/src/main/resources/application.properties deleted file mode 100644 index ca07b459e..000000000 --- a/eip-splitter/src/main/resources/application.properties +++ /dev/null @@ -1,25 +0,0 @@ -# -# The MIT License -# Copyright © 2014-2021 Ilkka Seppälä -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -# - -entry=direct:entry -endpoint=direct:endpoint diff --git a/eip-splitter/src/test/java/com/iluwatar/eip/splitter/AppTest.java b/eip-splitter/src/test/java/com/iluwatar/eip/splitter/AppTest.java deleted file mode 100644 index 0c1d30768..000000000 --- a/eip-splitter/src/test/java/com/iluwatar/eip/splitter/AppTest.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.eip.splitter; - -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; - -/** - * Test for App class - */ -class AppTest { - - /** - * Issue: Add at least one assertion to this test case. - * - * Solution: Inserted assertion to check whether the execution of the main method in {@link App#main(String[])} - * throws an exception. - */ - - @Test - void shouldExecuteApplicationWithoutException() { - assertDoesNotThrow(() -> App.main(new String[]{})); - } -} diff --git a/eip-splitter/src/test/java/com/iluwatar/eip/splitter/routes/SplitterRouteTest.java b/eip-splitter/src/test/java/com/iluwatar/eip/splitter/routes/SplitterRouteTest.java deleted file mode 100644 index 871ad1af6..000000000 --- a/eip-splitter/src/test/java/com/iluwatar/eip/splitter/routes/SplitterRouteTest.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.eip.splitter.routes; - -import org.apache.camel.EndpointInject; -import org.apache.camel.ProducerTemplate; -import org.apache.camel.component.mock.MockEndpoint; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -/** - * Test class for SplitterRoute. - *

- * In order for it to work we have to mock endpoints we want to read/write to. To mock those we need - * to substitute original endpoint names to mocks. - *

- */ -@ExtendWith(SpringExtension.class) -@SpringBootTest(classes = SplitterRouteTest.class) -@ActiveProfiles("test") -@EnableAutoConfiguration -@ComponentScan -class SplitterRouteTest { - - @EndpointInject(uri = "{{entry}}") - private ProducerTemplate entry; - - @EndpointInject(uri = "{{endpoint}}") - private MockEndpoint endpoint; - - /** - * Test if endpoint receives three separate messages. - * - * @throws Exception in case of en exception during the test - */ - @Test - @DirtiesContext - void testSplitter() throws Exception { - - // Three items in one entry message - entry.sendBody(new String[]{"TEST1", "TEST2", "TEST3"}); - - // Endpoint should have three different messages in the end order of the messages is not important - endpoint.expectedMessageCount(3); - endpoint.assertIsSatisfied(); - } -} diff --git a/eip-splitter/src/test/resources/application-test.properties b/eip-splitter/src/test/resources/application-test.properties deleted file mode 100644 index 843005704..000000000 --- a/eip-splitter/src/test/resources/application-test.properties +++ /dev/null @@ -1,25 +0,0 @@ -# -# The MIT License -# Copyright © 2014-2021 Ilkka Seppälä -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -# - -entry=direct:entry -endpoint=mock:endpoint diff --git a/eip-wire-tap/README.md b/eip-wire-tap/README.md deleted file mode 100644 index b0ab84e30..000000000 --- a/eip-wire-tap/README.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: EIP Wire Tap -category: Integration -language: en -tag: - - Enterprise Integration Pattern ---- - -## Intent -In most integration cases there is a need to monitor the messages flowing through the system. It is usually achieved -by intercepting the message and redirecting it to a different location like console, filesystem or the database. -It is important that such functionality should not modify the original message and influence the processing path. - -## Diagram -![alt text](./etc/wiretap.gif "Wire Tap") - -## Applicability -Use the Wire Tap pattern when - -* You need to monitor messages flowing through the system -* You need to redirect the same, unchanged message to two different endpoints/paths - -## Credits - -* [Gregor Hohpe, Bobby Woolf - Enterprise Integration Patterns](http://www.enterpriseintegrationpatterns.com/patterns/messaging/WireTap.html) -* [Apache Camel - Documentation](http://camel.apache.org/wire-tap.html) -* [Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions](https://www.amazon.com/gp/product/0321200683/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0321200683&linkCode=as2&tag=javadesignpat-20&linkId=122e0cff74eedd004cc81a3ecfa623cf) diff --git a/eip-wire-tap/etc/eip-wire-tap.urm.puml b/eip-wire-tap/etc/eip-wire-tap.urm.puml deleted file mode 100644 index 51ee99723..000000000 --- a/eip-wire-tap/etc/eip-wire-tap.urm.puml +++ /dev/null @@ -1,8 +0,0 @@ -@startuml -package com.iluwatar.eip.wiretap { - class App { - + App() - + main(args : String[]) {static} - } -} -@enduml \ No newline at end of file diff --git a/eip-wire-tap/etc/wiretap.gif b/eip-wire-tap/etc/wiretap.gif deleted file mode 100644 index 4141737167ca7c590baaef807534a74ec6e46c8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3067 zcmVNk%w1Vg3QN0M!5h|NsB@_xJDb@8{>|%>S9+-`~dfl-JkSx#x?_%*?Xi zhQ7YOrq6t}wY8kXb*-(fnZI+Sq@;|mX_=XsfuUiGi;IPYg>sKpe0+R!b8}{YOlD?g zT5v;JT3StDI#E$kN=iyXLP9!7D?B_rGe9OYGczqXA}T5>At50eAQKrG850-|4-XFw z5DEzi2?YlP0002~0RjL3000000000000000000000000000000000000000000000 z00000A^8La6aX;*EC2ui0R92B000L6K!9*aEE41ejE#QM|Xmz`=aE0K~<+$Hk^e zyr)B>zQWSe)LX>Hq07nJpxwyI-__#d${&Cc8H^8Nm{ z_0ol7=FQ!@e+U!Sn)S-w!GhnkNmNL&A}5BixanhOWLY+F7DI{@$#0~|ljKUGT*>m6 z%9b!=%A85Frp=o;bL!m5v!~DhpFo2O9ZIyQ(W6L{DqYI7sne%Wqnf!#wW`&tShH%~ z%5`JBu3*E81uJf>*|TWLK1<8CZCihC-fw9A@EZw5KJbZ619W6LJ2+O#m# znQF7f>>8e_*}#K4&b<2c-bcD|W76$gu<+;52Q$BY92arU$}de%={&mk+1r6-x0Jkk zqwrNG7S|l1o~kMT0rww<8imGHK`ht3m}S1{=bwPS8RwjJK7pbnU&a^a6C+fx zz@v~xD(R$@R%+>`ls16E0|`8ELI79XiRX8E645B8sHUnas+w}@DX67%X-J}mq5?>% zLOc+{s=W5P>INMoAnXPhgzDm`-r)*>uD&+w?4-a7n*g!3B2m?oc3Q*Xp-W)ohq54G z(7?FlmTT_0=%%ax?z-u2Ds2NQ7>n$E;EK!cz4+#Pue-v+TP;Tr^^&a@v@+p~tYt*_ zfB;1Vz`_IiMl5l@6QCfiuqYhh#KIjNJMVJ}GfafT5KnCK$>mmjaRM0|!7(WK04zn9 z2*d0ew*+;2SwraLf|^&dELwzSF9VRk2@fQ#^wLZ>?ex=7NBwjLAgm06ZA%a>@-7~K z99)E24{@~AWS4Dr*;HGNwGd&iW$oK*F{F>J*Ze%UGjcZsw9TvGoHN|}WVG`^?*!eO z5=C;{KnZ6z?)cdq1bcA@6*!T&$fB~RfCw;{;DC-o6LC2Ji$8Aq=}kwzGUY~$zFS5e z5&qCe_PoRYbK$lZ&Np_l?(OaEum{i06sl#J_yi$Dp#1X8H}CxO&_^#l^dD@nGO@;A zp80wtoU(!e0~Vh>1`i-V{rTvpkAC&nhhXKx*~L6O?FHdJkUDi2*Csv$iN0V@PQDFpadrvK@eo%dgCKf1rm@s4dCT2Bsh!#jfX%5Qt*T* zOyLPF*gh+5Fn)0Roy_b9Gx`B=Anhm^@d${+9(L>=#yVUQinPIHl>mWAOrjE($iyZ( z@rh0Zf%Pu7fh{qCh=t0W0wBP}E_(5cU<@M!Qh*8sgfDbMz@ibM$i_Chv5iu^o)y!m z!7R%EFLwX471tzVJJ`)FfAjMpJGSM&b;!_=`x~B}(8x9n6j2CAd!r;L`Nj`a?P6E6 zoFfaxwFgPy1*W(F=!A#_%{s;zaK)C=Ie@e&)(j)#H6CC>)gzfb|} zkP%6ww+we7B%D$R0%(B+mdVU!I`f&(jHWcF8O;rpU}Ys(fD?|{$p<+A1{8Qugt(bZ zYMS$$=sc%2S9Stz7J-|udx-3W2}t1S50Jr>C;$3JGl=w&Yq-p%B4@_PB#fW~8BC}` ziNt~hNNWKskk^A000Rh!v!F;Q0YVqb(d;$!p%IPMECWizf94aQ0u|^kJJ!oZ`p$0u zy2wY~vY;#rj35Iz&8bdz%F~|u^rt}eX$deOEem`=q7I^{MMqi8C)hNoP>rfoqdL^0 z9#y1+1mX{C=(Bnd4sUy$-{ADQmX<1LZBGaQ3N|p+wz^fS8&H8mSylj~4oImNC1qOI z`qsYsb*FKiD+=n0)w9OaMtXh10#s0f5jgg-kd3TlCrjDNT6VH1U;zkFfL4NL2(L`- ztP>X7*vp#sw5YvoW;ZKZYZWpOI*f#}girtrbo91Z+5iYNw#WfFKm!`!01P|;+|Nk~ zqe-YOZkM|x-SYNdhV`3u5?i0HMF#<(M8yltcwFl4M@D9~P-_D;AmO5d184OAE-j>c z9zue*snyt?cd&bk?WPyL0D0}L+{+{NQs+VDg#mi+J6;35mv;w#&4B1@Ujlb1!R+l1 za^GX!?+ACm4mJ*i_4|j}$|yq!XaRRKOq~rUctjauK!!Z5C=>S=za8=#sU|!b7aJDE zGKLO|Da7G#@%P3p%5ijdoT480A+~&>@qUD?VYM)KaMhvrwkq^ zuV}*`4D($48w@dI zE)A+jU21BadeyLwwX7r1YN=R4Gq%n(RB)~9UN42$z7DogfGzA|`(y$~nt-vFt&;;B z>AB2~HcgOCBxOtc+B0!Bk)Vz3Zm)#e*7mlzQKD^bkNeyfSs=RCU6BDiDrt`*EW77D zjsYO=1uQ6mzW1#H7>vLIfT6d*fgu1ClwboDpmn4g5P=D7U<4tVJmVXGRL51`@|s`bst?dAG$8| zudiI}XwL)LhYt3%yPXbeH~ZV?K8Ltt{p@tlI~(jSb-nvN4SZ+%-v>{Iz_*?7i2s7& z@t*j`Z(;F{kNo2=4)dgY{qB;_{1qUt`OZs$^PUfV6F@Ke(wCC*Ilp?}P0xDKp+4wr zXMF2fPx{%@{`HnGJLYXa``Ytf^uGVS=YubN%@e=)l0QE39k2Z5C%*a4Cp^wQoEL4#yXqLGDK*c4pY9$xl^ zy%vU`;e}+V6lRzoW0;0fSYb}shHhwua5#l>IEPzUhgf)rcnF4i*oA!9hfA@Bo`Hsf zI24399G7;8bhsXd$cR9Zhy)UdkZ2T=xEPOEi9K8kG2nLJ^9H;fbV( z6Q(FaqnL_6v5FAVimtecAGC - - - 4.0.0 - eip-wire-tap - - com.iluwatar - java-design-patterns - 1.26.0-SNAPSHOT - - - - org.springframework.boot - spring-boot-starter-web - - - org.apache.camel - camel-core - - - org.apache.camel.springboot - camel-spring-boot - ${camel.version} - - - org.glassfish.jaxb - jaxb-runtime - - - javax.xml.bind - jaxb-api - - - - org.junit.jupiter - junit-jupiter-engine - test - - - org.springframework.boot - spring-boot-starter-test - - - org.apache.camel - camel-test-spring - ${camel.version} - - - - - - org.apache.maven.plugins - maven-assembly-plugin - - - - - - com.iluwatar.eip.wiretap.App - - - - - - - - - diff --git a/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/App.java b/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/App.java deleted file mode 100644 index 0c6da7cc1..000000000 --- a/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/App.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.eip.wiretap; - -import org.apache.camel.CamelContext; -import org.apache.camel.builder.RouteBuilder; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -/** - * In most integration cases there is a need to monitor the messages flowing through the system. It - * is usually achieved by intercepting the message and redirecting it to a different location like - * console, filesystem or the database. It is important that such functionality should not modify - * the original message and influence the processing path. - * - *

- * Wire Tap allows you to route messages to a separate location while they are being forwarded to - * the ultimate destination. It basically consumes messages of the input channel and publishes the - * unmodified message to both output channels. - *

- */ -@SpringBootApplication -public class App { - - /** - * Program entry point. It starts Spring Boot application and using Apache Camel it - * auto-configures routes. - * - * @param args command line args - */ - public static void main(String[] args) throws Exception { - // Run Spring Boot application and obtain ApplicationContext - var context = SpringApplication.run(App.class, args); - - // Get CamelContext from ApplicationContext - var camelContext = (CamelContext) context.getBean("camelContext"); - - // Add a new routes that will handle endpoints form WireTapRoute class. - camelContext.addRoutes(new RouteBuilder() { - - @Override - public void configure() throws Exception { - from("{{endpoint}}").log("ENDPOINT: ${body}"); - from("{{wireTapEndpoint}}").log("WIRETAPPED ENDPOINT: ${body}"); - } - - }); - - // Add producer that will send test message to an entry point in WireTapRoute - camelContext.createProducerTemplate().sendBody("{{entry}}", "Test message"); - - SpringApplication.exit(context); - } -} diff --git a/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/routes/WireTapRoute.java b/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/routes/WireTapRoute.java deleted file mode 100644 index 79b948f66..000000000 --- a/eip-wire-tap/src/main/java/com/iluwatar/eip/wiretap/routes/WireTapRoute.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.eip.wiretap.routes; - -import org.apache.camel.builder.RouteBuilder; -import org.springframework.stereotype.Component; - -/** - * Sample wire tap route definition. - * - *

It consumes messages out of the direct:entry entry point and forwards them to - * direct:endpoint. Wire Tap intercepts the message and sends it to direct:wireTap, - * which in turn forwards it to - * direct:wireTapEndpoint. - * - *

In this example input/output endpoints names are stored in application.properties - * file. - */ -@Component -public class WireTapRoute extends RouteBuilder { - - /** - * Configures the route. - * - * @throws Exception in case of exception during configuration - */ - @Override - public void configure() throws Exception { - // Main route - from("{{entry}}").wireTap("direct:wireTap").to("{{endpoint}}"); - - // Wire tap route - from("direct:wireTap").log("Message: ${body}").to("{{wireTapEndpoint}}"); - } -} diff --git a/eip-wire-tap/src/main/resources/application.properties b/eip-wire-tap/src/main/resources/application.properties deleted file mode 100644 index cb77786ed..000000000 --- a/eip-wire-tap/src/main/resources/application.properties +++ /dev/null @@ -1,26 +0,0 @@ -# -# The MIT License -# Copyright © 2014-2021 Ilkka Seppälä -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -# - -entry=direct:entry -endpoint=direct:endpoint -wireTapEndpoint=direct:wireTapEndpoint \ No newline at end of file diff --git a/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/AppTest.java b/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/AppTest.java deleted file mode 100644 index 9440a6095..000000000 --- a/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/AppTest.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.eip.wiretap; - -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; - -/** - * Test for App class - */ -class AppTest { - - /** - * Issue: Add at least one assertion to this test case. - * - * Solution: Inserted assertion to check whether the execution of the main method in {@link App#main(String[])} - * throws an exception. - */ - - @Test - void shouldExecuteApplicationWithoutException() { - assertDoesNotThrow(() -> App.main(new String[]{})); - } -} diff --git a/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/routes/WireTapRouteTest.java b/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/routes/WireTapRouteTest.java deleted file mode 100644 index b9c2c1460..000000000 --- a/eip-wire-tap/src/test/java/com/iluwatar/eip/wiretap/routes/WireTapRouteTest.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.eip.wiretap.routes; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -import org.apache.camel.EndpointInject; -import org.apache.camel.ProducerTemplate; -import org.apache.camel.component.mock.MockEndpoint; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -/** - * Test class for WireTapRoute. - *

- * In order for it to work we have to mock endpoints we want to read/write to. To mock those we need - * to substitute original endpoint names to mocks. - *

- */ -@ExtendWith(SpringExtension.class) -@SpringBootTest(classes = WireTapRouteTest.class) -@ActiveProfiles("test") -@EnableAutoConfiguration -@ComponentScan -class WireTapRouteTest { - - @EndpointInject(uri = "{{entry}}") - private ProducerTemplate entry; - - @EndpointInject(uri = "{{endpoint}}") - private MockEndpoint endpoint; - - @EndpointInject(uri = "{{wireTapEndpoint}}") - private MockEndpoint wireTapEndpoint; - - /** - * Test if both endpoints receive exactly one message containing the same, unchanged body. - * - * @throws Exception in case of en exception during the test - */ - @Test - @DirtiesContext - void testWireTap() throws Exception { - entry.sendBody("TEST"); - - endpoint.expectedMessageCount(1); - wireTapEndpoint.expectedMessageCount(1); - - endpoint.assertIsSatisfied(); - wireTapEndpoint.assertIsSatisfied(); - - var endpointIn = endpoint.getExchanges().get(0).getIn(); - var wireTapEndpointIn = wireTapEndpoint.getExchanges().get(0).getIn(); - - assertEquals("TEST", endpointIn.getBody()); - assertEquals("TEST", wireTapEndpointIn.getBody()); - } -} diff --git a/eip-wire-tap/src/test/resources/application-test.properties b/eip-wire-tap/src/test/resources/application-test.properties deleted file mode 100644 index 801b7c928..000000000 --- a/eip-wire-tap/src/test/resources/application-test.properties +++ /dev/null @@ -1,26 +0,0 @@ -# -# The MIT License -# Copyright © 2014-2021 Ilkka Seppälä -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -# - -entry=direct:entry -endpoint=mock:endpoint -wireTapEndpoint=mock:wireTapEndpoint \ No newline at end of file diff --git a/pom.xml b/pom.xml index 95247640c..981b912e1 100644 --- a/pom.xml +++ b/pom.xml @@ -40,14 +40,10 @@ 2.7.5 0.8.8 1.4 - 3.18.3 19.0 2.66.0 4.0 3.12.8 - 1.1.0 - 1.12.13 - 2.0.1 1.1.0 2.0.0 3.0.0-M5 @@ -127,11 +123,9 @@ business-delegate half-sync-half-async layers - eip-message-channel fluentinterface reactor caching - eip-publish-subscribe delegation event-driven-architecture api-gateway @@ -162,13 +156,9 @@ throttling unit-of-work partial-response - eip-wire-tap - eip-splitter - eip-aggregator retry dirty-flag trampoline - serverless ambassador acyclic-visitor collection-pipeline @@ -234,16 +224,6 @@ commons-dbcp ${commons-dbcp.version} - - org.apache.camel - camel-core - ${camel.version} - - - org.apache.camel - camel-stream - ${camel.version} - com.google.guava guava diff --git a/serverless/README.md b/serverless/README.md deleted file mode 100644 index 6119508f5..000000000 --- a/serverless/README.md +++ /dev/null @@ -1,201 +0,0 @@ ---- -title: Serverless -category: Architectural -language: en -tag: - - Cloud distributed ---- - -## Serverless - -Serverless eliminates the need to plan for infrastructure and let's you focus on your -application. - -Following are optimization katas you should be aware of while building a serverless -applications - -* The Lean function - * Concise logic - Use functions to transform, not transport (utilize some of the - integration available from the provider to transport), and make sure you read only - what you need - * Efficient/single purpose code - avoid conditional/routing logic and break down - into individual functions, avoid "fat"/monolithic functions and control the - dependencies in the function deployment package to reduce the load time for your - function - * ephemeral environment - Utilize container start for expensive initializations -* Eventful Invocations - * Succinct payloads - Scrutinize the event as much as possible, and watch for - payload constraints (async - 128K) - * resilient routing - Understand retry policies and leverage dead letter queues - (SQS or SNS for replays) and remember retries count as invocations - * concurrent execution - lambda thinks of it's scale in terms of concurrency and - its not request based/duration based. Lambda will spin up the number of instances - based on the request. -* Coordinated calls - * Decoupled via APIs - best practice to setup your application is to have API's as - contracts that ensures separation of concerns - * scale-matched downstream - make sure when Lambda is calling downstream - components, you are matching scale configuration to it (by specifying max - concurrency based on downstream services) - * secured - Always ask a question, do I need a VPC? -* Serviceful operations - * Automated - use automated tools to manage and maintain the stack - * monitored applications - use monitoring services to get holistic view of your - serverless applications - -## Intent - -Whether to reduce your infrastructure costs, shrink the time you spend on ops tasks, -simplify your deployment processes, reach infinite scalability, serverless cuts time -to market in half. - -## Explanation - -Serverless computing is a cloud computing execution model in which the cloud provider -dynamically manages the allocation of machine resources. Pricing is based on the -actual amount of resources consumed by an application, rather than on pre-purchased -units of capacity. - -## Class diagram -![alt text](./etc/serverless.urm.png "Serverless pattern class diagram") - -## Serverless framework - -[Serverless](https://serverless.com/) is a toolkit for deploying and operating serverless architectures. - -## (Function as a Service or "FaaS") - -The term ‘Serverless’ is confusing since with such applications there are both server -hardware and server processes running somewhere, but the difference to normal -approaches is that the organization building and supporting a ‘Serverless’ application - is not looking after the hardware or the processes - they are outsourcing this to a vendor. - -Some of the Serverless Cloud Providers are - -![https://serverless.com/framework/docs/providers/aws/](./etc/aws-black.png "aws") -![https://serverless.com/framework/docs/providers/azure/](./etc/azure-black.png "azure") -![https://serverless.com/framework/docs/providers/openwhisk/](./etc/openwhisk-black.png "openwhisk") -![https://serverless.com/framework/docs/providers/google/](./etc/gcf-black.png "google") -![https://serverless.com/framework/docs/providers/kubeless/](./etc/kubeless-logos-black.png "kubeless") -![https://serverless.com/framework/docs/providers/spotinst/](./etc/spotinst-logos-black-small.png "spotinst") -![https://serverless.com/framework/docs/providers/webtasks/](./etc/webtask-small-grayscale.png "webtask") -... - -Anything that triggers an Lambda Function to execute is regarded by the Framework as -an Event. Most of the Serverless Cloud Providers support following Events -- Http -- PubSub Events -- scheduled - -AWS supports processing event generated from AWS Services (S3/Cloudwatch/etc) and -using aws as a compute engine is our first choice. - -## (Backend as a Service or "BaaS") -This example creates a backend for ‘persons’ collection which uses DynamoDB NoSQL -database service also provided by Amazon. - -## AWS lambda function implementation - -[AWS Lambda SDK](https://aws.amazon.com/sdk-for-java/) provides pre-defined interface -`com.amazonaws.services.lambda.runtime -.RequestHandler` to implement our lambda function. - -```java -public class LambdaInfoApiHandler implements RequestHandler, ApiGatewayResponse> { - - private static final Logger LOG = Logger.getLogger(LambdaInfoApiHandler.class); - private static final Integer SUCCESS_STATUS_CODE = 200; - - - @Override - public ApiGatewayResponse handleRequest(Map input, Context context) { - - } -} -``` -handleRequest method is where the function code is implemented. Context provides -useful information about Lambda execution environment. AWS Lambda function needs a -deployment package. This package is either a .zip or .jar file that contains all the -dependencies of the function. - -`serverless.yml` contains configuration to manage deployments for your functions. - -## Run example in local - -# Pre-requisites - -* Node.js v6.5.0 or later. -* Serverless CLI v1.9.0 or later. You can run npm install -g serverless to install it. -* An AWS account. If you don't already have one, you can sign up for a free trial that includes 1 million free Lambda requests per month. -* [Set-up](https://serverless.com/framework/docs/providers/aws/guide/credentials/) your Provider Credentials. Watch the video on setting up credentials - -# build and deploy - -* `cd serverless` -* `mvn clean package` -* `serverless deploy --stage=dev --verbose` - -Based on the configuration in `serverless.yml` serverless framework creates following -resources - -* CloudFormation stack for S3 (ServerlessDeploymentBucket) -* IAM Role (IamRoleLambdaExecution) -* CloudWatch (log groups) -* API Gateway (ApiGatewayRestApi) -* Lambda function -* DynamoDB collection - -The command will print out Stack Outputs which looks something like this - -```yaml -endpoints: - GET - https://xxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/info - POST - https://xxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/api/person - GET - https://xxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/api/person/{id} - -``` - -```yaml -CurrentTimeLambdaFunctionQualifiedArn: arn:aws:lambda:us-east-1:xxxxxxxxxxx:function:lambda-info-http-endpoint-dev-currentTime:4 -ServiceEndpoint: https://xxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev -ServerlessDeploymentBucketName: lambda-info-http-endpoin-serverlessdeploymentbuck-2u8uz2i7cap2 -``` -access the endpoint to invoke the function. - -Use the following cURL commands to test the endpoints - -```cURL -curl -X GET \ - https://xxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/info \ - -H 'cache-control: no-cache' -``` - -```cURL -curl -X POST \ - https://xxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/api/person \ - -H 'cache-control: no-cache' \ - -H 'content-type: application/json' \ - -d '{ - "firstName": "Thor", - "lastName": "Odinson", - "address": { - "addressLineOne": "1 Odin ln", - "addressLineTwo": "100", - "city": "Asgard", - "state": "country of the Gods", - "zipCode": "00001" - } -}' -``` - -```cURL -curl -X GET \ - https://xxxxxxxxx.execute-api.us-east-1.amazonaws.com/dev/api/person/{id} \ - -H 'cache-control: no-cache' -``` - -## Credits - -* [serverless docs](https://serverless.com/framework/docs/) -* [Serverless Architectures](https://martinfowler.com/articles/serverless.html) -* [Serverless Black Belt](https://youtu.be/oQFORsso2go) diff --git a/serverless/etc/aws-black.png b/serverless/etc/aws-black.png deleted file mode 100644 index 7b5ba317856f8f1b05fb7c02c0b24f4bb955cd42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9262 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

0AXR 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 LOQT8y&)EM0Zf;=R diff --git a/serverless/etc/gcf-black.png b/serverless/etc/gcf-black.png deleted file mode 100644 index b4e22982c8e25e4b7cac03e82909b8047a7910ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7651 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 A_5c6? diff --git a/serverless/etc/openwhisk-black.png b/serverless/etc/openwhisk-black.png deleted file mode 100644 index e70139088b7d1175a01efbddc0942b2fa71e74d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5722 zcmcIoc{r49+gFi6NJYppMwZ4lV_(KLV@)!aL1e6h2{V?#40@C;Yf{hfq>Kn9YsgO7 zLyV=GlzkV*_SnUzXM5j2-sAm_<2#P;{^P!{>pp+y?_93)`sWviyl%+O%FoKcz`$;7 zq-Vjva6P}JOT0TF*x4V$pzDTr!2peYoINlW7-u(=FmX@XYj-hzNwH%*X@ zk}1U07lHA_8in{{EJLnaxrTVTs=0x*wSX|9`Z0kIhTse&`gr34)QOs)KX}!T*FS&D zfq;KN2ws|?Ka;XGMFJ6ce+*Db79!&cQHB7Op|Vf~MHLklX`nm=3Xy}z%R%L3pepJL z^6C%>@UI7S9L?X&UEM;@;ICN6J57)$f#9nyCl?$XEE}vKi}&}CgQ}^i{p66BmpMkr z1dwn9XQB))K=f}0JxqYBKh~Fk#p8fK8J%75fdoy^ai)Kk;Nxp*`VTQK;IBp?;SAg~<8%{H*H_bO6Bu^RG1iBRar}+0RP^Ql_BF-@5S($Yn7`v< zkK_L3i}Ii>~GXd{!g~xmUJpo8hJOLlziT4E}ER}$!&aPP8&;8Hi`LkL*j6XIA z<7VKG_W}OVUv=z%h!0Ww-|GI;*X{q(Gr8krRvc`&%+ z8{>a`HNJ)$lNlJ!#T)DCS`oi4WibDWYUAthScsK;&srAGgfu^U1+1LI$K57rj&Ny> z7dUT%>~m_8jeRX(y5y1wWmP__r)YHEJRW2!=E9_J&b1IIvaPZIc8FB2uss^w-CTS$ zrZzTodu2ppWwb`&Xm|F>I%}oRw>*GI4hX5!1d2kI0z{%B^Z{8;TyOwW!dbYaZPZy- z9+Cf7LsPtnEfW)yM%QNM#83exaH}xc!(M*pzJ}(L?rgZxR@CN8JMWLVCUuT!{5mFlAXdlCs3M94O!LI(QU%DMZyUa`;W?@i%)jY{J! z>o3CJb6mFd(fk%0ul1=M%(9Xz=7Mt020f2fg6+dZ`_pG{pm=29;54Ts1@N94%gPKn zHex*q{CIX%gFK>mkIl9MkPnLpOwWB7K071}U74DOF<~IRp;DqvdjsWr( wu%>e> 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 v9BVWG=rI2e21(nWr2j7XER7$S-8sQuwkr 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

bR6Gy)`F%R* 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

ZAH(})k{^WxyW|GtQQcrfYXH_9#Csk=U!h%K( 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%0A=$Ok)Uf`<#WB*QKts(Vt&Tq9{d5b8{(3NY4vl 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 diff --git a/serverless/etc/serverless.urm.puml b/serverless/etc/serverless.urm.puml deleted file mode 100644 index 27ff043fd..000000000 --- a/serverless/etc/serverless.urm.puml +++ /dev/null @@ -1,138 +0,0 @@ -@startuml -package com.iluwatar.serverless.faas.api { - class LambdaInfoApiHandler { - - LOG : Logger {static} - - SUCCESS_STATUS_CODE : Integer {static} - + LambdaInfoApiHandler() - + handleRequest(input : Map, context : Context) : ApiGatewayResponse - - headers() : Map - - lambdaInfo(context : Context) : LambdaInfo - } -} -package com.iluwatar.serverless.baas.model { - class Address { - - addressLineOne : String - - addressLineTwo : String - - city : String - - serialVersionUID : long {static} - - state : String - - zipCode : String - + Address() - + equals(o : Object) : boolean - + getAddressLineOne() : String - + getAddressLineTwo() : String - + getCity() : String - + getState() : String - + getZipCode() : String - + hashCode() : int - + setAddressLineOne(addressLineOne : String) - + setAddressLineTwo(addressLineTwo : String) - + setCity(city : String) - + setState(state : String) - + setZipCode(zipCode : String) - + toString() : String - } - class Person { - - address : Address - - firstName : String - - id : String - - lastName : String - - serialVersionUID : long {static} - + Person() - + equals(o : Object) : boolean - + getAddress() : Address - + getFirstName() : String - + getId() : String - + getLastName() : String - + hashCode() : int - + setAddress(address : Address) - + setFirstName(firstName : String) - + setId(id : String) - + setLastName(lastName : String) - + toString() : String - } -} -package com.iluwatar.serverless.faas { - class ApiGatewayResponse { - - body : String - - headers : Map - - isBase64Encoded : Boolean - - serialVersionUID : long {static} - - statusCode : Integer - + ApiGatewayResponse(statusCode : Integer, body : String, headers : Map, isBase64Encoded : Boolean) - + getBody() : String - + getHeaders() : Map - + getStatusCode() : Integer - + isBase64Encoded() : Boolean - } - class ApiGatewayResponseBuilder { - - OBJECT_MAPPER : ObjectMapper {static} - - body : T extends Serializable - - headers : Map - - isBase64Encoded : Boolean - - statusCode : Integer - + ApiGatewayResponseBuilder() - + base64Encoded(isBase64Encoded : Boolean) : ApiGatewayResponseBuilder - + body(body : T extends Serializable) : ApiGatewayResponseBuilder - + build() : ApiGatewayResponse - + headers(headers : Map) : ApiGatewayResponseBuilder - + statusCode(statusCode : Integer) : ApiGatewayResponseBuilder - } - class LambdaInfo { - - awsRequestId : String - - functionName : String - - functionVersion : String - - logGroupName : String - - logStreamName : String - - memoryLimitInMb : Integer - - serialVersionUID : long {static} - + LambdaInfo() - + equals(o : Object) : boolean - + getAwsRequestId() : String - + getFunctionName() : String - + getFunctionVersion() : String - + getLogGroupName() : String - + getLogStreamName() : String - + getMemoryLimitInMb() : Integer - + hashCode() : int - + setAwsRequestId(awsRequestId : String) - + setFunctionName(functionName : String) - + setFunctionVersion(functionVersion : String) - + setLogGroupName(logGroupName : String) - + setLogStreamName(logStreamName : String) - + setMemoryLimitInMb(memoryLimitInMb : Integer) - + toString() : String - } -} -package com.iluwatar.serverless.baas.api { - abstract class AbstractDynamoDbHandler { - - dynamoDbMapper : DynamoDBMapper - - objectMapper : ObjectMapper - + AbstractDynamoDbHandler() - # apiGatewayProxyResponseEvent(statusCode : Integer, body : T extends Serializable) : APIGatewayProxyResponseEvent - # getDynamoDbMapper() : DynamoDBMapper - # getObjectMapper() : ObjectMapper - # headers() : Map - - initAmazonDynamoDb() - + setDynamoDbMapper(dynamoDbMapper : DynamoDBMapper) - } - class FindPersonApiHandler { - - LOG : Logger {static} - - SUCCESS_STATUS_CODE : Integer {static} - + FindPersonApiHandler() - + handleRequest(apiGatewayProxyRequestEvent : APIGatewayProxyRequestEvent, context : Context) : APIGatewayProxyResponseEvent - } - class SavePersonApiHandler { - - BAD_REQUEST_STATUS_CODE : Integer {static} - - CREATED_STATUS_CODE : Integer {static} - - LOG : Logger {static} - + SavePersonApiHandler() - + handleRequest(apiGatewayProxyRequestEvent : APIGatewayProxyRequestEvent, context : Context) : APIGatewayProxyResponseEvent - } -} -ApiGatewayResponseBuilder ..+ ApiGatewayResponse -Person --> "-address" Address -Access ..+ JsonProperty -FindPersonApiHandler --|> AbstractDynamoDbHandler -SavePersonApiHandler --|> AbstractDynamoDbHandler -@enduml \ No newline at end of file diff --git a/serverless/etc/spotinst-logos-black-small.png b/serverless/etc/spotinst-logos-black-small.png deleted file mode 100644 index b748f80c7c592a4f9417dd89088216d3890d8872..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5412 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 - - - 4.0.0 - serverless - - com.iluwatar - java-design-patterns - 1.26.0-SNAPSHOT - - - - com.amazonaws - aws-lambda-java-core - ${aws-lambda-core.version} - - - com.amazonaws - aws-java-sdk-dynamodb - ${aws-java-sdk-dynamodb.version} - - - com.amazonaws - aws-lambda-java-events - ${aws-lambda-java-events.version} - - - com.fasterxml.jackson.core - jackson-core - - - com.fasterxml.jackson.core - jackson-databind - - - com.fasterxml.jackson.core - jackson-annotations - - - org.junit.jupiter - junit-jupiter-engine - test - - - org.mockito - mockito-core - test - - - org.hamcrest - hamcrest-core - test - - - - - - - org.apache.maven.plugins - maven-shade-plugin - 2.3 - - false - - - - package - - shade - - - ${project.artifactId} - - - - - - - diff --git a/serverless/serverless.yml b/serverless/serverless.yml deleted file mode 100644 index 6a5b867cf..000000000 --- a/serverless/serverless.yml +++ /dev/null @@ -1,104 +0,0 @@ -# -# This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). -# -# The MIT License -# Copyright © 2014-2022 Ilkka Seppälä -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -# - -service: serverless-services - -frameworkVersion: ">=1.2.0 <2.0.0" - -provider: - name: aws - runtime: java8 - usagePlan: - quota: - limit: 500 - offset: 2 - period: MONTH - throttle: - burstLimit: 20 - rateLimit: 10 - -package: - artifact: target/serverless.jar - -functions: - lambdaInfoApi: - handler: com.iluwatar.serverless.faas.api.LambdaInfoApiHandler - events: - - http: - path: info - method: get - - savePerson: - handler: com.iluwatar.serverless.baas.api.SavePersonApiHandler - events: - - http: - path: api/person - method: post - cors: true - integration: lambda-proxy - - getPerson: - handler: com.iluwatar.serverless.baas.api.FindPersonApiHandler - events: - - http: - path: api/person/{id} - method: get - cors: true - integration: lambda-proxy - -resources: - Resources: - DynamoDbTable: - Type: AWS::DynamoDB::Table - Properties: - TableName: persons - AttributeDefinitions: - - AttributeName: id - AttributeType: S - KeySchema: - - AttributeName: id - KeyType: HASH - ProvisionedThroughput: - ReadCapacityUnits: 1 - WriteCapacityUnits: 1 - DynamoDBIamPolicy: - Type: AWS::IAM::Policy - DependsOn: DynamoDbTable - Properties: - PolicyName: lambda-dynamodb - PolicyDocument: - Version: '2012-10-17' - Statement: - - Effect: Allow - Action: - - dynamodb:GetItem - - dynamodb:PutItem - - dynamodb:UpdateItem - - dynamodb:DeleteItem - - dynamodb:Query - - dynamodb:Scan - Resource: arn:aws:dynamodb:*:*:table/persons - Roles: - - Ref: IamRoleLambdaExecution \ No newline at end of file diff --git a/serverless/src/main/java/com/iluwatar/serverless/baas/api/AbstractDynamoDbHandler.java b/serverless/src/main/java/com/iluwatar/serverless/baas/api/AbstractDynamoDbHandler.java deleted file mode 100644 index b4f3c1590..000000000 --- a/serverless/src/main/java/com/iluwatar/serverless/baas/api/AbstractDynamoDbHandler.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.serverless.baas.api; - -import com.amazonaws.regions.Regions; -import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; -import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper; -import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import java.io.Serializable; -import java.util.Map; - -/** - * abstract dynamodb handler. - * - * @param - serializable collection - */ -public abstract class AbstractDynamoDbHandler { - private DynamoDBMapper dynamoDbMapper; - - private final ObjectMapper objectMapper; - - public AbstractDynamoDbHandler() { - this.initAmazonDynamoDb(); - this.objectMapper = new ObjectMapper(); - } - - private void initAmazonDynamoDb() { - var amazonDynamoDb = AmazonDynamoDBClientBuilder - .standard() - .withRegion(Regions.US_EAST_1) - .build(); - - this.dynamoDbMapper = new DynamoDBMapper(amazonDynamoDb); - } - - protected DynamoDBMapper getDynamoDbMapper() { - return this.dynamoDbMapper; - } - - protected ObjectMapper getObjectMapper() { - return objectMapper; - } - - public void setDynamoDbMapper(DynamoDBMapper dynamoDbMapper) { - this.dynamoDbMapper = dynamoDbMapper; - } - - protected Map headers() { - return Map.of("Content-Type", "application/json"); - } - - /** - * API Gateway response. - * - * @param statusCode - status code - * @param body - Object body - * @return - api gateway proxy response - */ - protected APIGatewayProxyResponseEvent apiGatewayProxyResponseEvent(Integer statusCode, T body) { - var apiGatewayProxyResponseEvent = new APIGatewayProxyResponseEvent().withHeaders(headers()); - try { - apiGatewayProxyResponseEvent - .withStatusCode(statusCode) - .withBody(getObjectMapper().writeValueAsString(body)); - } catch (JsonProcessingException jsonProcessingException) { - throw new RuntimeException(jsonProcessingException); - } - - return apiGatewayProxyResponseEvent; - } -} diff --git a/serverless/src/main/java/com/iluwatar/serverless/baas/api/FindPersonApiHandler.java b/serverless/src/main/java/com/iluwatar/serverless/baas/api/FindPersonApiHandler.java deleted file mode 100644 index dc4dfa878..000000000 --- a/serverless/src/main/java/com/iluwatar/serverless/baas/api/FindPersonApiHandler.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.serverless.baas.api; - -import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.RequestHandler; -import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent; -import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent; -import com.iluwatar.serverless.baas.model.Person; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * find person from persons collection Created by dheeraj.mummar on 3/5/18. - */ -public class FindPersonApiHandler extends AbstractDynamoDbHandler - implements RequestHandler { - - private static final Logger LOG = LoggerFactory.getLogger(FindPersonApiHandler.class); - private static final Integer SUCCESS_STATUS_CODE = 200; - - @Override - public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent req, Context ctx) { - req.getPathParameters().forEach(FindPersonApiHandler::logKeyValue); - var id = req.getPathParameters().get("id"); - var person = this.getDynamoDbMapper().load(Person.class, id); - return apiGatewayProxyResponseEvent(SUCCESS_STATUS_CODE, person); - } - - private static void logKeyValue(String key, String value) { - LOG.info(key + "=" + value); - } - -} diff --git a/serverless/src/main/java/com/iluwatar/serverless/baas/api/SavePersonApiHandler.java b/serverless/src/main/java/com/iluwatar/serverless/baas/api/SavePersonApiHandler.java deleted file mode 100644 index e0a8d98b0..000000000 --- a/serverless/src/main/java/com/iluwatar/serverless/baas/api/SavePersonApiHandler.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.serverless.baas.api; - -import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.RequestHandler; -import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent; -import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent; -import com.iluwatar.serverless.baas.model.Person; -import java.io.IOException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * save person into persons collection Created by dheeraj.mummar on 3/4/18. - */ -public class SavePersonApiHandler extends AbstractDynamoDbHandler - implements RequestHandler { - - private static final Logger LOG = LoggerFactory.getLogger(SavePersonApiHandler.class); - private static final Integer CREATED_STATUS_CODE = 201; - private static final Integer BAD_REQUEST_STATUS_CODE = 400; - - @Override - public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent req, Context ctx) { - try { - var objectMapper = getObjectMapper(); - var person = objectMapper.readValue(req.getBody(), Person.class); - getDynamoDbMapper().save(person); - return apiGatewayProxyResponseEvent(CREATED_STATUS_CODE, person); - } catch (IOException ioException) { - LOG.error("unable to parse body", ioException); - return apiGatewayProxyResponseEvent(BAD_REQUEST_STATUS_CODE, null); - } - } -} diff --git a/serverless/src/main/java/com/iluwatar/serverless/baas/model/Address.java b/serverless/src/main/java/com/iluwatar/serverless/baas/model/Address.java deleted file mode 100644 index c0198f0a7..000000000 --- a/serverless/src/main/java/com/iluwatar/serverless/baas/model/Address.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.serverless.baas.model; - -import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute; -import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBDocument; -import java.io.Serializable; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.Setter; -import lombok.ToString; - -/** - * Address class Created by dheeraj.mummarareddy on 3/4/18. - */ -@Getter -@Setter -@EqualsAndHashCode -@ToString -@DynamoDBDocument -public class Address implements Serializable { - - private static final long serialVersionUID = 6760844284799736970L; - - @DynamoDBAttribute(attributeName = "addressLineOne") - private String addressLineOne; - - @DynamoDBAttribute(attributeName = "addressLineTwo") - private String addressLineTwo; - - @DynamoDBAttribute(attributeName = "city") - private String city; - - @DynamoDBAttribute(attributeName = "state") - private String state; - - @DynamoDBAttribute(attributeName = "zipCode") - private String zipCode; - -} diff --git a/serverless/src/main/java/com/iluwatar/serverless/baas/model/Person.java b/serverless/src/main/java/com/iluwatar/serverless/baas/model/Person.java deleted file mode 100644 index a7b3c83e6..000000000 --- a/serverless/src/main/java/com/iluwatar/serverless/baas/model/Person.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.serverless.baas.model; - -import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute; -import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAutoGeneratedKey; -import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey; -import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable; -import com.fasterxml.jackson.annotation.JsonProperty; -import java.io.Serializable; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.Setter; -import lombok.ToString; - -/** - * Person class Created by dheeraj.mummarareddy on 3/4/18. - */ -@Getter -@Setter -@ToString -@EqualsAndHashCode -@DynamoDBTable(tableName = "persons") -public class Person implements Serializable { - - private static final long serialVersionUID = -3413087924608627075L; - - @JsonProperty(access = JsonProperty.Access.READ_ONLY) - @DynamoDBHashKey(attributeName = "id") - @DynamoDBAutoGeneratedKey - private String id; - - @DynamoDBAttribute(attributeName = "firstName") - private String firstName; - - @DynamoDBAttribute(attributeName = "lastName") - private String lastName; - - @DynamoDBAttribute(attributeName = "address") - private Address address; - -} diff --git a/serverless/src/main/java/com/iluwatar/serverless/faas/ApiGatewayResponse.java b/serverless/src/main/java/com/iluwatar/serverless/faas/ApiGatewayResponse.java deleted file mode 100644 index 6d15ad8ec..000000000 --- a/serverless/src/main/java/com/iluwatar/serverless/faas/ApiGatewayResponse.java +++ /dev/null @@ -1,174 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.serverless.faas; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import java.io.Serializable; -import java.util.Map; - -/** - * Api gateway response. - */ -public class ApiGatewayResponse implements Serializable { - - private static final long serialVersionUID = 1181159426782844892L; - - private final Integer statusCode; - private final String body; - private final Map headers; - private final Boolean isBase64Encoded; - - /** - * api gateway response. - * - * @param statusCode - http status code - * @param body - response body - * @param headers - response headers - * @param isBase64Encoded - base64Encoded flag - */ - public ApiGatewayResponse( - Integer statusCode, - String body, - Map headers, - Boolean isBase64Encoded - ) { - this.statusCode = statusCode; - this.body = body; - this.headers = headers; - this.isBase64Encoded = isBase64Encoded; - } - - /** - * http status code. - * - * @return statusCode - http status code - */ - public Integer getStatusCode() { - return statusCode; - } - - /** - * response body. - * - * @return string body - */ - public String getBody() { - return body; - } - - /** - * response headers. - * - * @return response headers - */ - public Map getHeaders() { - return headers; - } - - /** - * base64Encoded flag, API Gateway expects the property to be called "isBase64Encoded". - * - * @return base64Encoded flag - */ - public Boolean isBase64Encoded() { - return isBase64Encoded; - } - - /** - * ApiGatewayResponse Builder class. - * - * @param Serializable object - */ - public static class ApiGatewayResponseBuilder { - private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); - private Integer statusCode; - private T body; - private Map headers; - private Boolean isBase64Encoded; - - /** - * http status code. - * - * @param statusCode - http status code - * @return ApiGatewayResponseBuilder - */ - public ApiGatewayResponseBuilder statusCode(Integer statusCode) { - this.statusCode = statusCode; - return this; - } - - /** - * Serializable body. - * - * @param body - Serializable object - * @return ApiGatewayResponseBuilder - */ - public ApiGatewayResponseBuilder body(T body) { - this.body = body; - return this; - } - - /** - * response headers. - * - * @param headers - response headers - * @return ApiGatewayResponseBuilder - */ - public ApiGatewayResponseBuilder headers(Map headers) { - this.headers = headers; - return this; - } - - /** - * base64Encoded flag. - * - * @param isBase64Encoded - base64Encoded flag - * @return ApiGatewayResponseBuilder - */ - public ApiGatewayResponseBuilder base64Encoded(Boolean isBase64Encoded) { - this.isBase64Encoded = isBase64Encoded; - return this; - } - - /** - * build ApiGatewayResponse. - * - * @return ApiGatewayResponse - */ - public ApiGatewayResponse build() { - String strBody = null; - if (this.body != null) { - try { - strBody = OBJECT_MAPPER.writeValueAsString(body); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } - } - - return new ApiGatewayResponse(this.statusCode, strBody, this.headers, this.isBase64Encoded); - } - } -} diff --git a/serverless/src/main/java/com/iluwatar/serverless/faas/LambdaInfo.java b/serverless/src/main/java/com/iluwatar/serverless/faas/LambdaInfo.java deleted file mode 100644 index 0ea1a5eee..000000000 --- a/serverless/src/main/java/com/iluwatar/serverless/faas/LambdaInfo.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.serverless.faas; - -import java.io.Serializable; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.Setter; -import lombok.ToString; - -/** - * Lambda context information. - */ -@ToString -@EqualsAndHashCode -@Setter -@Getter -public class LambdaInfo implements Serializable { - - private static final long serialVersionUID = 3936130599040848923L; - - private String awsRequestId; - private String logGroupName; - private String logStreamName; - private String functionName; - private String functionVersion; - private Integer memoryLimitInMb; - -} diff --git a/serverless/src/main/java/com/iluwatar/serverless/faas/api/LambdaInfoApiHandler.java b/serverless/src/main/java/com/iluwatar/serverless/faas/api/LambdaInfoApiHandler.java deleted file mode 100644 index 954215c0a..000000000 --- a/serverless/src/main/java/com/iluwatar/serverless/faas/api/LambdaInfoApiHandler.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.serverless.faas.api; - -import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.RequestHandler; -import com.iluwatar.serverless.faas.ApiGatewayResponse; -import com.iluwatar.serverless.faas.LambdaInfo; -import java.util.Map; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * LambdaInfoApiHandler - simple api to get lambda context Created by dheeraj.mummar on 2/5/18. - */ -public class LambdaInfoApiHandler - implements RequestHandler, ApiGatewayResponse> { - - private static final Logger LOG = LoggerFactory.getLogger(LambdaInfoApiHandler.class); - private static final Integer SUCCESS_STATUS_CODE = 200; - - - @Override - public ApiGatewayResponse handleRequest(Map input, Context context) { - LOG.info("received: " + input); - - return new ApiGatewayResponse.ApiGatewayResponseBuilder() - .headers(headers()) - .statusCode(SUCCESS_STATUS_CODE) - .body(lambdaInfo(context)) - .build(); - } - - /** - * lambdaInfo. - * - * @param context - Lambda context - * @return LambdaInfo - */ - private LambdaInfo lambdaInfo(Context context) { - var lambdaInfo = new LambdaInfo(); - lambdaInfo.setAwsRequestId(context.getAwsRequestId()); - lambdaInfo.setFunctionName(context.getFunctionName()); - lambdaInfo.setFunctionVersion(context.getFunctionVersion()); - lambdaInfo.setLogGroupName(context.getLogGroupName()); - lambdaInfo.setLogStreamName(context.getLogStreamName()); - lambdaInfo.setMemoryLimitInMb(context.getMemoryLimitInMB()); - return lambdaInfo; - } - - private Map headers() { - return Map.of("Content-Type", "application/json"); - } -} diff --git a/serverless/src/test/java/com/iluwatar/serverless/baas/api/FindPersonApiHandlerTest.java b/serverless/src/test/java/com/iluwatar/serverless/baas/api/FindPersonApiHandlerTest.java deleted file mode 100644 index 97a0c7b4b..000000000 --- a/serverless/src/test/java/com/iluwatar/serverless/baas/api/FindPersonApiHandlerTest.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.serverless.baas.api; - -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; - -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; - -import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper; -import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent; -import com.iluwatar.serverless.baas.model.Person; -import java.util.Map; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; - -/** - * Unit tests for FindPersonApiHandler Created by dheeraj.mummar on 3/5/18. - */ -class FindPersonApiHandlerTest { - - private FindPersonApiHandler findPersonApiHandler; - - @Mock - private DynamoDBMapper dynamoDbMapper; - - @BeforeEach - void setUp() { - MockitoAnnotations.openMocks(this); - this.findPersonApiHandler = new FindPersonApiHandler(); - this.findPersonApiHandler.setDynamoDbMapper(dynamoDbMapper); - } - - @Test - void handleRequest() { - findPersonApiHandler.handleRequest(apiGatewayProxyRequestEvent(), mock(Context.class)); - verify(dynamoDbMapper, times(1)).load(Person.class, "37e7a1fe-3544-473d-b764-18128f02d72d"); - } - - private APIGatewayProxyRequestEvent apiGatewayProxyRequestEvent() { - var request = new APIGatewayProxyRequestEvent(); - return request.withPathParamters(Map.of("id", "37e7a1fe-3544-473d-b764-18128f02d72d")); - } -} diff --git a/serverless/src/test/java/com/iluwatar/serverless/baas/api/SavePersonApiHandlerTest.java b/serverless/src/test/java/com/iluwatar/serverless/baas/api/SavePersonApiHandlerTest.java deleted file mode 100644 index ccbeb92c1..000000000 --- a/serverless/src/test/java/com/iluwatar/serverless/baas/api/SavePersonApiHandlerTest.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.serverless.baas.api; - -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; - -import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper; -import com.amazonaws.services.lambda.runtime.Context; -import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.iluwatar.serverless.baas.model.Address; -import com.iluwatar.serverless.baas.model.Person; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; - -/** - * Unit tests for SavePersonApiHandler Created by dheeraj.mummar on 3/4/18. - */ -class SavePersonApiHandlerTest { - - private SavePersonApiHandler savePersonApiHandler; - - @Mock - private DynamoDBMapper dynamoDbMapper; - - private final ObjectMapper objectMapper = new ObjectMapper(); - - @BeforeEach - void setUp() { - MockitoAnnotations.openMocks(this); - this.savePersonApiHandler = new SavePersonApiHandler(); - this.savePersonApiHandler.setDynamoDbMapper(dynamoDbMapper); - } - - @Test - void handleRequestSavePersonSuccessful() throws JsonProcessingException { - var person = newPerson(); - var body = objectMapper.writeValueAsString(person); - var request = apiGatewayProxyRequestEvent(body); - var ctx = mock(Context.class); - var apiGatewayProxyResponseEvent = this.savePersonApiHandler.handleRequest(request, ctx); - verify(dynamoDbMapper, times(1)).save(person); - assertNotNull(apiGatewayProxyResponseEvent); - assertEquals(Integer.valueOf(201), apiGatewayProxyResponseEvent.getStatusCode()); - } - - @Test - void handleRequestSavePersonException() { - var request = apiGatewayProxyRequestEvent("invalid sample request"); - var ctx = mock(Context.class); - var apiGatewayProxyResponseEvent = this.savePersonApiHandler.handleRequest(request, ctx); - assertNotNull(apiGatewayProxyResponseEvent); - assertEquals(Integer.valueOf(400), apiGatewayProxyResponseEvent.getStatusCode()); - } - - private APIGatewayProxyRequestEvent apiGatewayProxyRequestEvent(String body) { - var apiGatewayProxyRequestEvent = new APIGatewayProxyRequestEvent(); - return apiGatewayProxyRequestEvent.withBody(body); - } - - private Person newPerson() { - var person = new Person(); - person.setFirstName("Thor"); - person.setLastName("Odinson"); - var address = new Address(); - address.setAddressLineOne("1 Odin ln"); - address.setCity("Asgard"); - address.setState("country of the Gods"); - address.setZipCode("00001"); - person.setAddress(address); - return person; - } -} diff --git a/serverless/src/test/java/com/iluwatar/serverless/faas/api/LambdaInfoApiHandlerTest.java b/serverless/src/test/java/com/iluwatar/serverless/faas/api/LambdaInfoApiHandlerTest.java deleted file mode 100644 index 102a0dc3a..000000000 --- a/serverless/src/test/java/com/iluwatar/serverless/faas/api/LambdaInfoApiHandlerTest.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * This project is licensed under the MIT license. Module model-view-viewmodel is using ZK framework licensed under LGPL (see lgpl-3.0.txt). - * - * The MIT License - * Copyright © 2014-2022 Ilkka Seppälä - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package com.iluwatar.serverless.faas.api; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.core.IsNull.notNullValue; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -import com.amazonaws.services.lambda.runtime.Context; -import org.junit.jupiter.api.Test; - -/** - * Unit tests for LambdaInfoApiHandler - */ -class LambdaInfoApiHandlerTest { - - @Test - void handleRequestWithMockContext() { - var lambdaInfoApiHandler = new LambdaInfoApiHandler(); - var context = mock(Context.class); - when(context.getAwsRequestId()).thenReturn("mock aws request id"); - - assertThat(lambdaInfoApiHandler.handleRequest(null, context), notNullValue()); - } -} \ No newline at end of file