From f050a02eeb94ecd97fd295f61bfad124b21ffa93 Mon Sep 17 00:00:00 2001 From: "bartlomiej.zylinski" Date: Wed, 5 Jun 2024 12:18:20 +0200 Subject: [PATCH 01/18] Attempt to add CI --- .github/workflows/CI.yml | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 .github/workflows/CI.yml diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml new file mode 100644 index 0000000..907de43 --- /dev/null +++ b/.github/workflows/CI.yml @@ -0,0 +1,35 @@ +name: CI +on: + pull_request: + branches: ['**'] + push: + branches: ['**'] + tags: [v*] + +permissions: + contents: read + +jobs: + ci: + # run on 1) push, 2) external PRs, 3) + # do not run on internal, non-steward PRs since those will be run by push to branch + if: | + github.event_name == 'push' || + github.event.pull_request.head.repo.full_name != github.repository + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v4 + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + - name: Compile and Test + run: mvn clean package + - name: Attach test report + uses: dorny/test-reporter@v1 + with: + name: Maven Tests + path: target/surefire-reports/*.xml + reporter: java-junit + fail-on-error: true \ No newline at end of file From 79dae48448199335205c1830b659d17d77894284 Mon Sep 17 00:00:00 2001 From: "bartlomiej.zylinski" Date: Wed, 5 Jun 2024 12:30:27 +0200 Subject: [PATCH 02/18] Added maven war plugin version --- pom.xml | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index 75677a2..5d2ece6 100644 --- a/pom.xml +++ b/pom.xml @@ -192,13 +192,8 @@ org.apache.maven.plugins - maven-compiler-plugin - 3.11.0 - - 17 - 17 - true - + maven-war-plugin + 3.4.0 org.springframework.boot From db07ac64c7c69a7c8df2d15ef3e05b1075308cb7 Mon Sep 17 00:00:00 2001 From: "bartlomiej.zylinski" Date: Wed, 5 Jun 2024 12:37:57 +0200 Subject: [PATCH 03/18] Fix step name --- .github/workflows/CI.yml | 2 +- pom.xml | 5 ----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 907de43..2f9c35e 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -29,7 +29,7 @@ jobs: - name: Attach test report uses: dorny/test-reporter@v1 with: - name: Maven Tests + name: Compile and Test path: target/surefire-reports/*.xml reporter: java-junit fail-on-error: true \ No newline at end of file diff --git a/pom.xml b/pom.xml index 5d2ece6..7784fc8 100644 --- a/pom.xml +++ b/pom.xml @@ -144,32 +144,27 @@ io.github.openfeign feign-jackson - org.testcontainers testcontainers test - com.github.javafaker javafaker 1.0.2 test - org.junit.jupiter junit-jupiter test - org.springframework.boot spring-boot-starter-test test - org.awaitility awaitility From 4e49679b13a29842834ad2cab778225af2167ee1 Mon Sep 17 00:00:00 2001 From: "bartlomiej.zylinski" Date: Wed, 5 Jun 2024 12:41:11 +0200 Subject: [PATCH 04/18] Reorganized CI --- .github/workflows/CI.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 2f9c35e..fad5254 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -24,12 +24,14 @@ jobs: with: java-version: '17' distribution: 'temurin' - - name: Compile and Test - run: mvn clean package + - name: Build + run: mvn -DskipTests package + - name: Test + run: mvn -Dmaven.test.failure.ignore=true test - name: Attach test report uses: dorny/test-reporter@v1 with: - name: Compile and Test + name: Maven Tests path: target/surefire-reports/*.xml reporter: java-junit fail-on-error: true \ No newline at end of file From 30102fd4d66aabd8ee2656a1940230636e291836 Mon Sep 17 00:00:00 2001 From: "bartlomiej.zylinski" Date: Wed, 5 Jun 2024 12:49:05 +0200 Subject: [PATCH 05/18] Removed reporter --- .github/workflows/CI.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index fad5254..0a59739 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -5,6 +5,7 @@ on: push: branches: ['**'] tags: [v*] + workflow_dispatch: permissions: contents: read @@ -33,5 +34,4 @@ jobs: with: name: Maven Tests path: target/surefire-reports/*.xml - reporter: java-junit fail-on-error: true \ No newline at end of file From c9305cdb87ecb77dc8ca2241de7ac96346fdd829 Mon Sep 17 00:00:00 2001 From: "bartlomiej.zylinski" Date: Wed, 5 Jun 2024 12:53:08 +0200 Subject: [PATCH 06/18] Use another reporter --- .github/workflows/CI.yml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 0a59739..1bc9eb1 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -28,10 +28,9 @@ jobs: - name: Build run: mvn -DskipTests package - name: Test - run: mvn -Dmaven.test.failure.ignore=true test + run: mvn test - name: Attach test report - uses: dorny/test-reporter@v1 + uses: mikepenz/action-junit-report@v4 + if: success() || failure() # always run even if the previous step fails with: - name: Maven Tests - path: target/surefire-reports/*.xml - fail-on-error: true \ No newline at end of file + report_paths: '**/target/surefire-reports/*.xml' \ No newline at end of file From c1d818a33d19f9036fdd564efad2a895ab871cc3 Mon Sep 17 00:00:00 2001 From: "bartlomiej.zylinski" Date: Wed, 5 Jun 2024 12:58:58 +0200 Subject: [PATCH 07/18] Use another reporter --- .github/workflows/CI.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 1bc9eb1..410f430 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -30,7 +30,7 @@ jobs: - name: Test run: mvn test - name: Attach test report - uses: mikepenz/action-junit-report@v4 - if: success() || failure() # always run even if the previous step fails + if: success() || failure() + uses: scacap/action-surefire-report@v1 with: - report_paths: '**/target/surefire-reports/*.xml' \ No newline at end of file + fail_on_test_failures: true \ No newline at end of file From 609d4f38ce257855a077709785644b8f247e96cf Mon Sep 17 00:00:00 2001 From: "bartlomiej.zylinski" Date: Wed, 5 Jun 2024 13:34:51 +0200 Subject: [PATCH 08/18] Reduce the number of steps --- .github/workflows/CI.yml | 11 ++--------- README.md | 4 ++++ 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 410f430..97357e6 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -25,12 +25,5 @@ jobs: with: java-version: '17' distribution: 'temurin' - - name: Build - run: mvn -DskipTests package - - name: Test - run: mvn test - - name: Attach test report - if: success() || failure() - uses: scacap/action-surefire-report@v1 - with: - fail_on_test_failures: true \ No newline at end of file + - name: Build & Test + run: mvn clean package \ No newline at end of file diff --git a/README.md b/README.md index 7b49db1..6fac59a 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,9 @@ ![Logo](docs/images/otterjet-logo.png?raw=true) +# Welcome! + +[![CI](https://github.com/softwaremill/otterJet/workflows/CI/badge.svg)](https://github.com/softwaremill/otterJet/actions?query=workflow%3A%22CI%22) + # OtterJet OtterJet is a project designed to provide a visualization of messages from a NATS JetStream server. Offering a WEB interface for interacting with NATS JetStream servers. From 4b4a8c7c1a4bf28debf5b599ca1d8e4a7838835c Mon Sep 17 00:00:00 2001 From: "bartlomiej.zylinski" Date: Wed, 5 Jun 2024 13:43:24 +0200 Subject: [PATCH 09/18] Image align center --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 6fac59a..8e0fafb 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ -![Logo](docs/images/otterjet-logo.png?raw=true) +

+ +

# Welcome! From 6990c52ce1b43343db6b5a0c46483a36ece8f9bb Mon Sep 17 00:00:00 2001 From: "bartlomiej.zylinski" Date: Thu, 6 Jun 2024 13:20:55 +0200 Subject: [PATCH 10/18] Added Docker Compose --- docker-compose.yaml | 24 ++++++++ pom.xml | 49 +++------------- src/main/java/otterjet/MsgsController.java | 58 +++++++++---------- .../monitoring/NatsMonitoringApiClient.java | 5 +- .../NatsMonitoringAutoConfiguration.java | 4 +- .../proto/ProtoBufMessageDeserializer.java | 2 +- 6 files changed, 65 insertions(+), 77 deletions(-) create mode 100644 docker-compose.yaml diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..1c2b37d --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,24 @@ +version: '3.9' + +volumes: + nats-storage: + driver: local + +services: + nats: + image: nats:2.10.7 + command: [ "--jetstream", "-m", "8222" ] + deploy: + resources: + limits: + memory: 2g + reservations: + memory: 2g + volumes: + - nats-storage:/data + expose: + - "4222" + - "8222" + ports: + - "4222:4222" + - "8222:8222" \ No newline at end of file diff --git a/pom.xml b/pom.xml index 7784fc8..fbe00ce 100644 --- a/pom.xml +++ b/pom.xml @@ -3,10 +3,10 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.softwaremill - OtterJet + com.softwaremill.otter + jet 0.0.1 - war + jar Visualization of messages from a NATS JetStream server @@ -16,7 +16,6 @@ 17 2.41.1 1.19.3 - 5.10.1 3.2.0 2023.0.0 @@ -44,13 +43,6 @@ pom import
- - org.junit - junit-bom - ${junit.version} - pom - import - @@ -107,11 +99,6 @@ 7.0 provided - - org.glassfish.ozark - ozark - 1.0.0-m02 - org.springframework.boot spring-boot-starter-web @@ -144,35 +131,20 @@ io.github.openfeign feign-jackson - - org.testcontainers - testcontainers - test - - - com.github.javafaker - javafaker - 1.0.2 - test - - - org.junit.jupiter - junit-jupiter - test - org.springframework.boot spring-boot-starter-test test - org.awaitility - awaitility + org.testcontainers + testcontainers test - org.assertj - assertj-core + com.github.javafaker + javafaker + 1.0.2 test @@ -185,11 +157,6 @@ - - org.apache.maven.plugins - maven-war-plugin - 3.4.0 - org.springframework.boot spring-boot-maven-plugin diff --git a/src/main/java/otterjet/MsgsController.java b/src/main/java/otterjet/MsgsController.java index e81debd..d16613d 100644 --- a/src/main/java/otterjet/MsgsController.java +++ b/src/main/java/otterjet/MsgsController.java @@ -2,6 +2,7 @@ import java.util.List; import java.util.Optional; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; @@ -12,37 +13,34 @@ @Controller public class MsgsController { - private static final String TEMPLATE_NAME = "msgs-page"; - private static final Logger LOG = LoggerFactory.getLogger(MsgsController.class); + private static final String TEMPLATE_NAME = "msgs-page"; + private static final Logger LOG = LoggerFactory.getLogger(MsgsController.class); - private final ReaderService readerService; - private String subjectFilter; - private String typeFilter; - private String bodyContentFilter; + private final ReaderService readerService; - public MsgsController(ReaderService readerService) { - this.readerService = readerService; - } + public MsgsController(ReaderService readerService) { + this.readerService = readerService; + } - @GetMapping("/msgs") - public String page( - @RequestParam(value = "subject", required = false) String subject, - @RequestParam(value = "type", required = false) String type, - @RequestParam(value = "bodyContent", required = false) String bodyContent, - @RequestParam(value = "page", defaultValue = "0") int page, - @RequestParam(value = "size", defaultValue = "10") int size, - Model model) { - this.subjectFilter = Optional.ofNullable(subject).orElse(""); - this.typeFilter = Optional.ofNullable(type).orElse(""); - this.bodyContentFilter = Optional.ofNullable(bodyContent).orElse(""); - List filteredMessages = readerService.filter(subjectFilter, typeFilter, page, size, bodyContentFilter); - LOG.info("amount of read messages: " + filteredMessages.size()); - model.addAttribute("messages", filteredMessages); - model.addAttribute("subject", subjectFilter); - model.addAttribute("type", typeFilter); - model.addAttribute("bodyContent", bodyContentFilter); - model.addAttribute("page", page); - model.addAttribute("size", size); - return TEMPLATE_NAME; - } + @GetMapping("/msgs") + public String page( + @RequestParam(value = "subject", required = false) String subject, + @RequestParam(value = "type", required = false) String type, + @RequestParam(value = "bodyContent", required = false) String bodyContent, + @RequestParam(value = "page", defaultValue = "0") int page, + @RequestParam(value = "size", defaultValue = "10") int size, + Model model) { + String subjectFilter = Optional.ofNullable(subject).orElse(""); + String typeFilter = Optional.ofNullable(type).orElse(""); + String bodyContentFilter = Optional.ofNullable(bodyContent).orElse(""); + List filteredMessages = readerService.filter(subjectFilter, typeFilter, page, size, bodyContentFilter); + LOG.info("amount of read messages: " + filteredMessages.size()); + model.addAttribute("messages", filteredMessages); + model.addAttribute("subject", subjectFilter); + model.addAttribute("type", typeFilter); + model.addAttribute("bodyContent", bodyContentFilter); + model.addAttribute("page", page); + model.addAttribute("size", size); + return TEMPLATE_NAME; + } } diff --git a/src/main/java/otterjet/monitoring/NatsMonitoringApiClient.java b/src/main/java/otterjet/monitoring/NatsMonitoringApiClient.java index 0e696bc..5caa4cf 100644 --- a/src/main/java/otterjet/monitoring/NatsMonitoringApiClient.java +++ b/src/main/java/otterjet/monitoring/NatsMonitoringApiClient.java @@ -1,9 +1,8 @@ package otterjet.monitoring; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.GetMapping; interface NatsMonitoringApiClient { - @RequestMapping(method = RequestMethod.GET, value = "/jsz?streams=true&config=true") + @GetMapping("/jsz?streams=true&config=true") JetStreamMonitoringResponse getJetStreamMonitoringData(); } diff --git a/src/main/java/otterjet/monitoring/NatsMonitoringAutoConfiguration.java b/src/main/java/otterjet/monitoring/NatsMonitoringAutoConfiguration.java index dd8430e..3c2f461 100644 --- a/src/main/java/otterjet/monitoring/NatsMonitoringAutoConfiguration.java +++ b/src/main/java/otterjet/monitoring/NatsMonitoringAutoConfiguration.java @@ -16,7 +16,7 @@ class NatsMonitoringAutoConfiguration { @Configuration - @ConditionalOnExpression("'${nats.server.monitoring.port:}' != ''") // monitoring configured + @ConditionalOnExpression("'${nats.server.monitoring.port:}' != ''") static class NatsMonitoringEnabledConfiguration { @Bean @@ -48,7 +48,7 @@ private static String createNatsMonitoringUrl( } @Configuration - @ConditionalOnExpression("'${nats.server.monitoring.port:}' == ''") // monitoring not configured + @ConditionalOnExpression("'${nats.server.monitoring.port:}' == ''") @AutoConfigureAfter(NatsMonitoringEnabledConfiguration.class) static class NatsMonitoringDisabledConfiguration { diff --git a/src/main/java/otterjet/proto/ProtoBufMessageDeserializer.java b/src/main/java/otterjet/proto/ProtoBufMessageDeserializer.java index d077985..f40a703 100644 --- a/src/main/java/otterjet/proto/ProtoBufMessageDeserializer.java +++ b/src/main/java/otterjet/proto/ProtoBufMessageDeserializer.java @@ -52,7 +52,7 @@ public DeserializedMessage deserializeMessage(ByteBuffer buffer) { final var descriptors = descs.stream() .flatMap(desc -> desc.getMessageTypes().stream()) - .collect(Collectors.toList()); + .toList(); final var messageDescriptor = descriptors.stream() .filter(desc -> messageTypeName.equals(desc.getName()) || messageTypeName.equals(desc.getFullName())) From 8f630cccd74150069acfb23315f4b99dd4060600 Mon Sep 17 00:00:00 2001 From: "bartlomiej.zylinski" Date: Thu, 6 Jun 2024 13:26:25 +0200 Subject: [PATCH 11/18] Fix CI desc --- .github/workflows/CI.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 97357e6..0e4fcc6 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -12,8 +12,7 @@ permissions: jobs: ci: - # run on 1) push, 2) external PRs, 3) - # do not run on internal, non-steward PRs since those will be run by push to branch + # run on push, external PRs do not run on internal PRs since those will be run by push to branch if: | github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository From d4772f05c0275f4caa44c39caf4ad461ca5547e1 Mon Sep 17 00:00:00 2001 From: "bartlomiej.zylinski" Date: Thu, 6 Jun 2024 13:31:27 +0200 Subject: [PATCH 12/18] Packages rename --- .../jet}/DeserializationException.java | 2 +- .../jet}/DeserializedMessage.java | 2 +- .../jet}/MainViewController.java | 4 ++-- .../jet}/MessageDeserializer.java | 2 +- .../jet}/MsgsController.java | 2 +- .../jet}/OtterJetApplication.java | 2 +- .../{otterjet => otter/jet}/ReadMessage.java | 2 +- .../jet}/ReaderConfiguration.java | 2 +- .../jet}/ReaderConfigurationProperties.java | 2 +- .../jet}/ReaderService.java | 2 +- .../monitoring/AccountDetailsResponse.java | 2 +- .../monitoring/DirectMonitoringResponse.java | 2 +- .../DirectNatsMonitoringDataLoader.java | 2 +- .../JetStreamMonitoringResponse.java | 2 +- .../jet}/monitoring/MonitoringController.java | 2 +- .../jet}/monitoring/MonitoringData.java | 2 +- .../MonitoringNotConfiguredResponse.java | 2 +- .../monitoring/NatsMonitoringApiClient.java | 2 +- .../NatsMonitoringAutoConfiguration.java | 2 +- .../monitoring/NatsMonitoringDataLoader.java | 2 +- .../NoMonitoringConfiguredDataLoader.java | 2 +- .../jet}/monitoring/StreamConfigResponse.java | 2 +- .../monitoring/StreamDetailsResponse.java | 2 +- .../jet}/monitoring/StreamStateResponse.java | 2 +- .../PlainTextMessageDeserializer.java | 6 +++--- ...nTextMessageDeserializerConfiguration.java | 4 ++-- ...toMessageToDynamicMessageDeserializer.java | 2 +- .../FromAnyProtoMessageTypeNameSelector.java | 2 +- .../jet}/proto/MessageTypeNameSelector.java | 2 +- .../proto/ProtoBufMessageDeserializer.java | 10 ++++----- ...ProtoMessageDeserializerConfiguration.java | 4 ++-- ...toMessageToDynamicMessageDeserializer.java | 2 +- .../ProvidedProtoMessageTypeNameSelector.java | 2 +- ...toMessageToDynamicMessageDeserializer.java | 2 +- src/main/resources/application.yml | 2 +- .../jet}/AbstractIntegrationTest.java | 2 +- .../jet}/JetStreamContainerInitializer.java | 2 +- .../jet}/JetStreamUtils.java | 2 +- .../jet}/LocalJetStreamDropApplication.java | 2 +- .../assertions/ComparisonConfiguration.java | 2 +- .../examples/RandomProtoPersonGenerator.java | 4 ++-- ...lainTextMessagePublisherConfiguration.java | 5 +++-- .../jet}/examples/protobuf/PersonProtos.java | 4 ++-- ...ProtobufMessagePublisherConfiguration.java | 7 ++++--- .../plaintext/PlainTextMessageReaderTest.java | 20 ++++++++++-------- .../jet}/proto/AnyProtoMessageReaderTest.java | 21 ++++++++++--------- .../proto/SimpleProtoMessageReaderTest.java | 21 ++++++++++--------- src/test/resources/person.proto | 2 +- 48 files changed, 94 insertions(+), 88 deletions(-) rename src/main/java/{otterjet => otter/jet}/DeserializationException.java (91%) rename src/main/java/{otterjet => otter/jet}/DeserializedMessage.java (77%) rename src/main/java/{otterjet => otter/jet}/MainViewController.java (88%) rename src/main/java/{otterjet => otter/jet}/MessageDeserializer.java (88%) rename src/main/java/{otterjet => otter/jet}/MsgsController.java (99%) rename src/main/java/{otterjet => otter/jet}/OtterJetApplication.java (96%) rename src/main/java/{otterjet => otter/jet}/ReadMessage.java (87%) rename src/main/java/{otterjet => otter/jet}/ReaderConfiguration.java (98%) rename src/main/java/{otterjet => otter/jet}/ReaderConfigurationProperties.java (97%) rename src/main/java/{otterjet => otter/jet}/ReaderService.java (99%) rename src/main/java/{otterjet => otter/jet}/monitoring/AccountDetailsResponse.java (87%) rename src/main/java/{otterjet => otter/jet}/monitoring/DirectMonitoringResponse.java (78%) rename src/main/java/{otterjet => otter/jet}/monitoring/DirectNatsMonitoringDataLoader.java (94%) rename src/main/java/{otterjet => otter/jet}/monitoring/JetStreamMonitoringResponse.java (89%) rename src/main/java/{otterjet => otter/jet}/monitoring/MonitoringController.java (96%) rename src/main/java/{otterjet => otter/jet}/monitoring/MonitoringData.java (79%) rename src/main/java/{otterjet => otter/jet}/monitoring/MonitoringNotConfiguredResponse.java (72%) rename src/main/java/{otterjet => otter/jet}/monitoring/NatsMonitoringApiClient.java (87%) rename src/main/java/{otterjet => otter/jet}/monitoring/NatsMonitoringAutoConfiguration.java (98%) rename src/main/java/{otterjet => otter/jet}/monitoring/NatsMonitoringDataLoader.java (79%) rename src/main/java/{otterjet => otter/jet}/monitoring/NoMonitoringConfiguredDataLoader.java (89%) rename src/main/java/{otterjet => otter/jet}/monitoring/StreamConfigResponse.java (74%) rename src/main/java/{otterjet => otter/jet}/monitoring/StreamDetailsResponse.java (79%) rename src/main/java/{otterjet => otter/jet}/monitoring/StreamStateResponse.java (83%) rename src/main/java/{otterjet => otter/jet}/plaintext/PlainTextMessageDeserializer.java (76%) rename src/main/java/{otterjet => otter/jet}/plaintext/PlainTextMessageDeserializerConfiguration.java (87%) rename src/main/java/{otterjet => otter/jet}/proto/AnyProtoMessageToDynamicMessageDeserializer.java (95%) rename src/main/java/{otterjet => otter/jet}/proto/FromAnyProtoMessageTypeNameSelector.java (95%) rename src/main/java/{otterjet => otter/jet}/proto/MessageTypeNameSelector.java (88%) rename src/main/java/{otterjet => otter/jet}/proto/ProtoBufMessageDeserializer.java (95%) rename src/main/java/{otterjet => otter/jet}/proto/ProtoMessageDeserializerConfiguration.java (97%) rename src/main/java/{otterjet => otter/jet}/proto/ProtoMessageToDynamicMessageDeserializer.java (92%) rename src/main/java/{otterjet => otter/jet}/proto/ProvidedProtoMessageTypeNameSelector.java (93%) rename src/main/java/{otterjet => otter/jet}/proto/SimpleProtoMessageToDynamicMessageDeserializer.java (95%) rename src/test/java/{otterjet => otter/jet}/AbstractIntegrationTest.java (97%) rename src/test/java/{otterjet => otter/jet}/JetStreamContainerInitializer.java (98%) rename src/test/java/{otterjet => otter/jet}/JetStreamUtils.java (98%) rename src/test/java/{otterjet => otter/jet}/LocalJetStreamDropApplication.java (92%) rename src/test/java/{otterjet => otter/jet}/assertions/ComparisonConfiguration.java (97%) rename src/test/java/{otterjet => otter/jet}/examples/RandomProtoPersonGenerator.java (86%) rename src/test/java/{otterjet => otter/jet}/examples/plaintext/PlainTextMessagePublisherConfiguration.java (95%) rename src/test/java/{otterjet => otter/jet}/examples/protobuf/PersonProtos.java (99%) rename src/test/java/{otterjet => otter/jet}/examples/protobuf/SimpleProtobufMessagePublisherConfiguration.java (91%) rename src/test/java/{otterjet => otter/jet}/plaintext/PlainTextMessageReaderTest.java (80%) rename src/test/java/{otterjet => otter/jet}/proto/AnyProtoMessageReaderTest.java (85%) rename src/test/java/{otterjet => otter/jet}/proto/SimpleProtoMessageReaderTest.java (85%) diff --git a/src/main/java/otterjet/DeserializationException.java b/src/main/java/otter/jet/DeserializationException.java similarity index 91% rename from src/main/java/otterjet/DeserializationException.java rename to src/main/java/otter/jet/DeserializationException.java index d66fd35..a85b8b9 100644 --- a/src/main/java/otterjet/DeserializationException.java +++ b/src/main/java/otter/jet/DeserializationException.java @@ -1,4 +1,4 @@ -package otterjet; +package otter.jet; public class DeserializationException extends RuntimeException { private static final long serialVersionUID = -2575341690419824332L; diff --git a/src/main/java/otterjet/DeserializedMessage.java b/src/main/java/otter/jet/DeserializedMessage.java similarity index 77% rename from src/main/java/otterjet/DeserializedMessage.java rename to src/main/java/otter/jet/DeserializedMessage.java index a64b919..a0c86e0 100644 --- a/src/main/java/otterjet/DeserializedMessage.java +++ b/src/main/java/otter/jet/DeserializedMessage.java @@ -1,3 +1,3 @@ -package otterjet; +package otter.jet; public record DeserializedMessage(String name, String content) {} diff --git a/src/main/java/otterjet/MainViewController.java b/src/main/java/otter/jet/MainViewController.java similarity index 88% rename from src/main/java/otterjet/MainViewController.java rename to src/main/java/otter/jet/MainViewController.java index 55a417f..32a38b4 100644 --- a/src/main/java/otterjet/MainViewController.java +++ b/src/main/java/otter/jet/MainViewController.java @@ -1,6 +1,6 @@ -package otterjet; +package otter.jet; -import otterjet.monitoring.NatsMonitoringDataLoader; +import otter.jet.monitoring.NatsMonitoringDataLoader; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; diff --git a/src/main/java/otterjet/MessageDeserializer.java b/src/main/java/otter/jet/MessageDeserializer.java similarity index 88% rename from src/main/java/otterjet/MessageDeserializer.java rename to src/main/java/otter/jet/MessageDeserializer.java index 90020cb..b02a54d 100644 --- a/src/main/java/otterjet/MessageDeserializer.java +++ b/src/main/java/otter/jet/MessageDeserializer.java @@ -1,4 +1,4 @@ -package otterjet; +package otter.jet; import java.nio.ByteBuffer; diff --git a/src/main/java/otterjet/MsgsController.java b/src/main/java/otter/jet/MsgsController.java similarity index 99% rename from src/main/java/otterjet/MsgsController.java rename to src/main/java/otter/jet/MsgsController.java index d16613d..1bbd2d5 100644 --- a/src/main/java/otterjet/MsgsController.java +++ b/src/main/java/otter/jet/MsgsController.java @@ -1,4 +1,4 @@ -package otterjet; +package otter.jet; import java.util.List; import java.util.Optional; diff --git a/src/main/java/otterjet/OtterJetApplication.java b/src/main/java/otter/jet/OtterJetApplication.java similarity index 96% rename from src/main/java/otterjet/OtterJetApplication.java rename to src/main/java/otter/jet/OtterJetApplication.java index f0d86d9..16644fd 100644 --- a/src/main/java/otterjet/OtterJetApplication.java +++ b/src/main/java/otter/jet/OtterJetApplication.java @@ -1,4 +1,4 @@ -package otterjet; +package otter.jet; import org.springframework.boot.Banner; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/src/main/java/otterjet/ReadMessage.java b/src/main/java/otter/jet/ReadMessage.java similarity index 87% rename from src/main/java/otterjet/ReadMessage.java rename to src/main/java/otter/jet/ReadMessage.java index bb0d26c..ea7bb59 100644 --- a/src/main/java/otterjet/ReadMessage.java +++ b/src/main/java/otter/jet/ReadMessage.java @@ -1,4 +1,4 @@ -package otterjet; +package otter.jet; import java.time.LocalDateTime; diff --git a/src/main/java/otterjet/ReaderConfiguration.java b/src/main/java/otter/jet/ReaderConfiguration.java similarity index 98% rename from src/main/java/otterjet/ReaderConfiguration.java rename to src/main/java/otter/jet/ReaderConfiguration.java index e77be66..5f7be19 100644 --- a/src/main/java/otterjet/ReaderConfiguration.java +++ b/src/main/java/otter/jet/ReaderConfiguration.java @@ -1,4 +1,4 @@ -package otterjet; +package otter.jet; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.EnableConfigurationProperties; diff --git a/src/main/java/otterjet/ReaderConfigurationProperties.java b/src/main/java/otter/jet/ReaderConfigurationProperties.java similarity index 97% rename from src/main/java/otterjet/ReaderConfigurationProperties.java rename to src/main/java/otter/jet/ReaderConfigurationProperties.java index 96e18f9..f9b5bca 100644 --- a/src/main/java/otterjet/ReaderConfigurationProperties.java +++ b/src/main/java/otter/jet/ReaderConfigurationProperties.java @@ -1,4 +1,4 @@ -package otterjet; +package otter.jet; import java.util.Objects; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/src/main/java/otterjet/ReaderService.java b/src/main/java/otter/jet/ReaderService.java similarity index 99% rename from src/main/java/otterjet/ReaderService.java rename to src/main/java/otter/jet/ReaderService.java index 8ac7c9b..f793eab 100644 --- a/src/main/java/otterjet/ReaderService.java +++ b/src/main/java/otter/jet/ReaderService.java @@ -1,4 +1,4 @@ -package otterjet; +package otter.jet; import io.nats.client.Connection; import io.nats.client.JetStream; diff --git a/src/main/java/otterjet/monitoring/AccountDetailsResponse.java b/src/main/java/otter/jet/monitoring/AccountDetailsResponse.java similarity index 87% rename from src/main/java/otterjet/monitoring/AccountDetailsResponse.java rename to src/main/java/otter/jet/monitoring/AccountDetailsResponse.java index 3d6d95f..5016241 100644 --- a/src/main/java/otterjet/monitoring/AccountDetailsResponse.java +++ b/src/main/java/otter/jet/monitoring/AccountDetailsResponse.java @@ -1,4 +1,4 @@ -package otterjet.monitoring; +package otter.jet.monitoring; import com.fasterxml.jackson.annotation.JsonProperty; import java.util.List; diff --git a/src/main/java/otterjet/monitoring/DirectMonitoringResponse.java b/src/main/java/otter/jet/monitoring/DirectMonitoringResponse.java similarity index 78% rename from src/main/java/otterjet/monitoring/DirectMonitoringResponse.java rename to src/main/java/otter/jet/monitoring/DirectMonitoringResponse.java index eb19e35..9cc76b8 100644 --- a/src/main/java/otterjet/monitoring/DirectMonitoringResponse.java +++ b/src/main/java/otter/jet/monitoring/DirectMonitoringResponse.java @@ -1,4 +1,4 @@ -package otterjet.monitoring; +package otter.jet.monitoring; public record DirectMonitoringResponse(JetStreamMonitoringResponse response) implements MonitoringData {} diff --git a/src/main/java/otterjet/monitoring/DirectNatsMonitoringDataLoader.java b/src/main/java/otter/jet/monitoring/DirectNatsMonitoringDataLoader.java similarity index 94% rename from src/main/java/otterjet/monitoring/DirectNatsMonitoringDataLoader.java rename to src/main/java/otter/jet/monitoring/DirectNatsMonitoringDataLoader.java index c9e528f..acd23b4 100644 --- a/src/main/java/otterjet/monitoring/DirectNatsMonitoringDataLoader.java +++ b/src/main/java/otter/jet/monitoring/DirectNatsMonitoringDataLoader.java @@ -1,4 +1,4 @@ -package otterjet.monitoring; +package otter.jet.monitoring; class DirectNatsMonitoringDataLoader implements NatsMonitoringDataLoader { diff --git a/src/main/java/otterjet/monitoring/JetStreamMonitoringResponse.java b/src/main/java/otter/jet/monitoring/JetStreamMonitoringResponse.java similarity index 89% rename from src/main/java/otterjet/monitoring/JetStreamMonitoringResponse.java rename to src/main/java/otter/jet/monitoring/JetStreamMonitoringResponse.java index a2ab231..7db0815 100644 --- a/src/main/java/otterjet/monitoring/JetStreamMonitoringResponse.java +++ b/src/main/java/otter/jet/monitoring/JetStreamMonitoringResponse.java @@ -1,4 +1,4 @@ -package otterjet.monitoring; +package otter.jet.monitoring; import com.fasterxml.jackson.annotation.JsonProperty; import java.util.List; diff --git a/src/main/java/otterjet/monitoring/MonitoringController.java b/src/main/java/otter/jet/monitoring/MonitoringController.java similarity index 96% rename from src/main/java/otterjet/monitoring/MonitoringController.java rename to src/main/java/otter/jet/monitoring/MonitoringController.java index 8dd12cc..c1fd540 100644 --- a/src/main/java/otterjet/monitoring/MonitoringController.java +++ b/src/main/java/otter/jet/monitoring/MonitoringController.java @@ -1,4 +1,4 @@ -package otterjet.monitoring; +package otter.jet.monitoring; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; diff --git a/src/main/java/otterjet/monitoring/MonitoringData.java b/src/main/java/otter/jet/monitoring/MonitoringData.java similarity index 79% rename from src/main/java/otterjet/monitoring/MonitoringData.java rename to src/main/java/otter/jet/monitoring/MonitoringData.java index 42a552e..58979ad 100644 --- a/src/main/java/otterjet/monitoring/MonitoringData.java +++ b/src/main/java/otter/jet/monitoring/MonitoringData.java @@ -1,4 +1,4 @@ -package otterjet.monitoring; +package otter.jet.monitoring; public sealed interface MonitoringData permits DirectMonitoringResponse, MonitoringNotConfiguredResponse {} diff --git a/src/main/java/otterjet/monitoring/MonitoringNotConfiguredResponse.java b/src/main/java/otter/jet/monitoring/MonitoringNotConfiguredResponse.java similarity index 72% rename from src/main/java/otterjet/monitoring/MonitoringNotConfiguredResponse.java rename to src/main/java/otter/jet/monitoring/MonitoringNotConfiguredResponse.java index 054bd84..d1464fa 100644 --- a/src/main/java/otterjet/monitoring/MonitoringNotConfiguredResponse.java +++ b/src/main/java/otter/jet/monitoring/MonitoringNotConfiguredResponse.java @@ -1,3 +1,3 @@ -package otterjet.monitoring; +package otter.jet.monitoring; public final class MonitoringNotConfiguredResponse implements MonitoringData {} diff --git a/src/main/java/otterjet/monitoring/NatsMonitoringApiClient.java b/src/main/java/otter/jet/monitoring/NatsMonitoringApiClient.java similarity index 87% rename from src/main/java/otterjet/monitoring/NatsMonitoringApiClient.java rename to src/main/java/otter/jet/monitoring/NatsMonitoringApiClient.java index 5caa4cf..42b43d8 100644 --- a/src/main/java/otterjet/monitoring/NatsMonitoringApiClient.java +++ b/src/main/java/otter/jet/monitoring/NatsMonitoringApiClient.java @@ -1,4 +1,4 @@ -package otterjet.monitoring; +package otter.jet.monitoring; import org.springframework.web.bind.annotation.GetMapping; diff --git a/src/main/java/otterjet/monitoring/NatsMonitoringAutoConfiguration.java b/src/main/java/otter/jet/monitoring/NatsMonitoringAutoConfiguration.java similarity index 98% rename from src/main/java/otterjet/monitoring/NatsMonitoringAutoConfiguration.java rename to src/main/java/otter/jet/monitoring/NatsMonitoringAutoConfiguration.java index 3c2f461..2314694 100644 --- a/src/main/java/otterjet/monitoring/NatsMonitoringAutoConfiguration.java +++ b/src/main/java/otter/jet/monitoring/NatsMonitoringAutoConfiguration.java @@ -1,4 +1,4 @@ -package otterjet.monitoring; +package otter.jet.monitoring; import feign.Feign; import feign.Logger; diff --git a/src/main/java/otterjet/monitoring/NatsMonitoringDataLoader.java b/src/main/java/otter/jet/monitoring/NatsMonitoringDataLoader.java similarity index 79% rename from src/main/java/otterjet/monitoring/NatsMonitoringDataLoader.java rename to src/main/java/otter/jet/monitoring/NatsMonitoringDataLoader.java index 12ee806..e1d5277 100644 --- a/src/main/java/otterjet/monitoring/NatsMonitoringDataLoader.java +++ b/src/main/java/otter/jet/monitoring/NatsMonitoringDataLoader.java @@ -1,4 +1,4 @@ -package otterjet.monitoring; +package otter.jet.monitoring; public interface NatsMonitoringDataLoader { boolean isMonitoringEnabled(); diff --git a/src/main/java/otterjet/monitoring/NoMonitoringConfiguredDataLoader.java b/src/main/java/otter/jet/monitoring/NoMonitoringConfiguredDataLoader.java similarity index 89% rename from src/main/java/otterjet/monitoring/NoMonitoringConfiguredDataLoader.java rename to src/main/java/otter/jet/monitoring/NoMonitoringConfiguredDataLoader.java index a3910ef..40ecd58 100644 --- a/src/main/java/otterjet/monitoring/NoMonitoringConfiguredDataLoader.java +++ b/src/main/java/otter/jet/monitoring/NoMonitoringConfiguredDataLoader.java @@ -1,4 +1,4 @@ -package otterjet.monitoring; +package otter.jet.monitoring; class NoMonitoringConfiguredDataLoader implements NatsMonitoringDataLoader { @Override diff --git a/src/main/java/otterjet/monitoring/StreamConfigResponse.java b/src/main/java/otter/jet/monitoring/StreamConfigResponse.java similarity index 74% rename from src/main/java/otterjet/monitoring/StreamConfigResponse.java rename to src/main/java/otter/jet/monitoring/StreamConfigResponse.java index e14092b..ef8fce6 100644 --- a/src/main/java/otterjet/monitoring/StreamConfigResponse.java +++ b/src/main/java/otter/jet/monitoring/StreamConfigResponse.java @@ -1,4 +1,4 @@ -package otterjet.monitoring; +package otter.jet.monitoring; import java.util.List; diff --git a/src/main/java/otterjet/monitoring/StreamDetailsResponse.java b/src/main/java/otter/jet/monitoring/StreamDetailsResponse.java similarity index 79% rename from src/main/java/otterjet/monitoring/StreamDetailsResponse.java rename to src/main/java/otter/jet/monitoring/StreamDetailsResponse.java index 81b8dae..bcbdc80 100644 --- a/src/main/java/otterjet/monitoring/StreamDetailsResponse.java +++ b/src/main/java/otter/jet/monitoring/StreamDetailsResponse.java @@ -1,4 +1,4 @@ -package otterjet.monitoring; +package otter.jet.monitoring; public record StreamDetailsResponse( String name, StreamConfigResponse config, StreamStateResponse state) {} diff --git a/src/main/java/otterjet/monitoring/StreamStateResponse.java b/src/main/java/otter/jet/monitoring/StreamStateResponse.java similarity index 83% rename from src/main/java/otterjet/monitoring/StreamStateResponse.java rename to src/main/java/otter/jet/monitoring/StreamStateResponse.java index b191ab5..2b2c16e 100644 --- a/src/main/java/otterjet/monitoring/StreamStateResponse.java +++ b/src/main/java/otter/jet/monitoring/StreamStateResponse.java @@ -1,4 +1,4 @@ -package otterjet.monitoring; +package otter.jet.monitoring; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/src/main/java/otterjet/plaintext/PlainTextMessageDeserializer.java b/src/main/java/otter/jet/plaintext/PlainTextMessageDeserializer.java similarity index 76% rename from src/main/java/otterjet/plaintext/PlainTextMessageDeserializer.java rename to src/main/java/otter/jet/plaintext/PlainTextMessageDeserializer.java index e72c13a..e68cd22 100644 --- a/src/main/java/otterjet/plaintext/PlainTextMessageDeserializer.java +++ b/src/main/java/otter/jet/plaintext/PlainTextMessageDeserializer.java @@ -1,9 +1,9 @@ -package otterjet.plaintext; +package otter.jet.plaintext; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; -import otterjet.DeserializedMessage; -import otterjet.MessageDeserializer; +import otter.jet.DeserializedMessage; +import otter.jet.MessageDeserializer; class PlainTextMessageDeserializer implements MessageDeserializer { @Override diff --git a/src/main/java/otterjet/plaintext/PlainTextMessageDeserializerConfiguration.java b/src/main/java/otter/jet/plaintext/PlainTextMessageDeserializerConfiguration.java similarity index 87% rename from src/main/java/otterjet/plaintext/PlainTextMessageDeserializerConfiguration.java rename to src/main/java/otter/jet/plaintext/PlainTextMessageDeserializerConfiguration.java index 2af5b77..361d9c4 100644 --- a/src/main/java/otterjet/plaintext/PlainTextMessageDeserializerConfiguration.java +++ b/src/main/java/otter/jet/plaintext/PlainTextMessageDeserializerConfiguration.java @@ -1,6 +1,6 @@ -package otterjet.plaintext; +package otter.jet.plaintext; -import otterjet.MessageDeserializer; +import otter.jet.MessageDeserializer; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/src/main/java/otterjet/proto/AnyProtoMessageToDynamicMessageDeserializer.java b/src/main/java/otter/jet/proto/AnyProtoMessageToDynamicMessageDeserializer.java similarity index 95% rename from src/main/java/otterjet/proto/AnyProtoMessageToDynamicMessageDeserializer.java rename to src/main/java/otter/jet/proto/AnyProtoMessageToDynamicMessageDeserializer.java index 1e925ec..a21149e 100644 --- a/src/main/java/otterjet/proto/AnyProtoMessageToDynamicMessageDeserializer.java +++ b/src/main/java/otter/jet/proto/AnyProtoMessageToDynamicMessageDeserializer.java @@ -1,4 +1,4 @@ -package otterjet.proto; +package otter.jet.proto; import com.google.protobuf.Any; import com.google.protobuf.Descriptors; diff --git a/src/main/java/otterjet/proto/FromAnyProtoMessageTypeNameSelector.java b/src/main/java/otter/jet/proto/FromAnyProtoMessageTypeNameSelector.java similarity index 95% rename from src/main/java/otterjet/proto/FromAnyProtoMessageTypeNameSelector.java rename to src/main/java/otter/jet/proto/FromAnyProtoMessageTypeNameSelector.java index 877a374..133aa71 100644 --- a/src/main/java/otterjet/proto/FromAnyProtoMessageTypeNameSelector.java +++ b/src/main/java/otter/jet/proto/FromAnyProtoMessageTypeNameSelector.java @@ -1,4 +1,4 @@ -package otterjet.proto; +package otter.jet.proto; import com.google.protobuf.Any; import java.io.IOException; diff --git a/src/main/java/otterjet/proto/MessageTypeNameSelector.java b/src/main/java/otter/jet/proto/MessageTypeNameSelector.java similarity index 88% rename from src/main/java/otterjet/proto/MessageTypeNameSelector.java rename to src/main/java/otter/jet/proto/MessageTypeNameSelector.java index 7cb7e4b..c36ce03 100644 --- a/src/main/java/otterjet/proto/MessageTypeNameSelector.java +++ b/src/main/java/otter/jet/proto/MessageTypeNameSelector.java @@ -1,4 +1,4 @@ -package otterjet.proto; +package otter.jet.proto; import java.io.IOException; import java.nio.ByteBuffer; diff --git a/src/main/java/otterjet/proto/ProtoBufMessageDeserializer.java b/src/main/java/otter/jet/proto/ProtoBufMessageDeserializer.java similarity index 95% rename from src/main/java/otterjet/proto/ProtoBufMessageDeserializer.java rename to src/main/java/otter/jet/proto/ProtoBufMessageDeserializer.java index f40a703..7862a1a 100644 --- a/src/main/java/otterjet/proto/ProtoBufMessageDeserializer.java +++ b/src/main/java/otter/jet/proto/ProtoBufMessageDeserializer.java @@ -1,4 +1,4 @@ -package otterjet.proto; +package otter.jet.proto; import com.google.protobuf.DescriptorProtos.FileDescriptorProto; import com.google.protobuf.DescriptorProtos.FileDescriptorSet; @@ -14,10 +14,10 @@ import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; -import otterjet.DeserializationException; -import otterjet.DeserializedMessage; -import otterjet.MessageDeserializer; + +import otter.jet.DeserializationException; +import otter.jet.DeserializedMessage; +import otter.jet.MessageDeserializer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/otterjet/proto/ProtoMessageDeserializerConfiguration.java b/src/main/java/otter/jet/proto/ProtoMessageDeserializerConfiguration.java similarity index 97% rename from src/main/java/otterjet/proto/ProtoMessageDeserializerConfiguration.java rename to src/main/java/otter/jet/proto/ProtoMessageDeserializerConfiguration.java index fdd5d11..9be0e7a 100644 --- a/src/main/java/otterjet/proto/ProtoMessageDeserializerConfiguration.java +++ b/src/main/java/otter/jet/proto/ProtoMessageDeserializerConfiguration.java @@ -1,8 +1,8 @@ -package otterjet.proto; +package otter.jet.proto; import java.io.File; import java.io.FileNotFoundException; -import otterjet.MessageDeserializer; +import otter.jet.MessageDeserializer; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; diff --git a/src/main/java/otterjet/proto/ProtoMessageToDynamicMessageDeserializer.java b/src/main/java/otter/jet/proto/ProtoMessageToDynamicMessageDeserializer.java similarity index 92% rename from src/main/java/otterjet/proto/ProtoMessageToDynamicMessageDeserializer.java rename to src/main/java/otter/jet/proto/ProtoMessageToDynamicMessageDeserializer.java index dd55897..99ab97b 100644 --- a/src/main/java/otterjet/proto/ProtoMessageToDynamicMessageDeserializer.java +++ b/src/main/java/otter/jet/proto/ProtoMessageToDynamicMessageDeserializer.java @@ -1,4 +1,4 @@ -package otterjet.proto; +package otter.jet.proto; import com.google.protobuf.Descriptors; import com.google.protobuf.DynamicMessage; diff --git a/src/main/java/otterjet/proto/ProvidedProtoMessageTypeNameSelector.java b/src/main/java/otter/jet/proto/ProvidedProtoMessageTypeNameSelector.java similarity index 93% rename from src/main/java/otterjet/proto/ProvidedProtoMessageTypeNameSelector.java rename to src/main/java/otter/jet/proto/ProvidedProtoMessageTypeNameSelector.java index 5ab5bef..949b291 100644 --- a/src/main/java/otterjet/proto/ProvidedProtoMessageTypeNameSelector.java +++ b/src/main/java/otter/jet/proto/ProvidedProtoMessageTypeNameSelector.java @@ -1,4 +1,4 @@ -package otterjet.proto; +package otter.jet.proto; import java.nio.ByteBuffer; diff --git a/src/main/java/otterjet/proto/SimpleProtoMessageToDynamicMessageDeserializer.java b/src/main/java/otter/jet/proto/SimpleProtoMessageToDynamicMessageDeserializer.java similarity index 95% rename from src/main/java/otterjet/proto/SimpleProtoMessageToDynamicMessageDeserializer.java rename to src/main/java/otter/jet/proto/SimpleProtoMessageToDynamicMessageDeserializer.java index 27832d9..f0c4784 100644 --- a/src/main/java/otterjet/proto/SimpleProtoMessageToDynamicMessageDeserializer.java +++ b/src/main/java/otter/jet/proto/SimpleProtoMessageToDynamicMessageDeserializer.java @@ -1,4 +1,4 @@ -package otterjet.proto; +package otter.jet.proto; import com.google.protobuf.CodedInputStream; import com.google.protobuf.Descriptors; diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 6dd1c82..d01f0ae 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -9,7 +9,7 @@ server: logging: level: - otterjet.monitoring.NatsMonitoringApiClient: DEBUG + otter.jet.monitoring.NatsMonitoringApiClient: DEBUG nats: server: diff --git a/src/test/java/otterjet/AbstractIntegrationTest.java b/src/test/java/otter/jet/AbstractIntegrationTest.java similarity index 97% rename from src/test/java/otterjet/AbstractIntegrationTest.java rename to src/test/java/otter/jet/AbstractIntegrationTest.java index 0f7122f..6d6f844 100644 --- a/src/test/java/otterjet/AbstractIntegrationTest.java +++ b/src/test/java/otter/jet/AbstractIntegrationTest.java @@ -1,4 +1,4 @@ -package otterjet; +package otter.jet; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; diff --git a/src/test/java/otterjet/JetStreamContainerInitializer.java b/src/test/java/otter/jet/JetStreamContainerInitializer.java similarity index 98% rename from src/test/java/otterjet/JetStreamContainerInitializer.java rename to src/test/java/otter/jet/JetStreamContainerInitializer.java index 5557163..494f6c0 100644 --- a/src/test/java/otterjet/JetStreamContainerInitializer.java +++ b/src/test/java/otter/jet/JetStreamContainerInitializer.java @@ -1,4 +1,4 @@ -package otterjet; +package otter.jet; import java.util.List; import java.util.Map; diff --git a/src/test/java/otterjet/JetStreamUtils.java b/src/test/java/otter/jet/JetStreamUtils.java similarity index 98% rename from src/test/java/otterjet/JetStreamUtils.java rename to src/test/java/otter/jet/JetStreamUtils.java index fa8faf2..b977815 100644 --- a/src/test/java/otterjet/JetStreamUtils.java +++ b/src/test/java/otter/jet/JetStreamUtils.java @@ -1,4 +1,4 @@ -package otterjet; +package otter.jet; import io.nats.client.Connection; import io.nats.client.JetStream; diff --git a/src/test/java/otterjet/LocalJetStreamDropApplication.java b/src/test/java/otter/jet/LocalJetStreamDropApplication.java similarity index 92% rename from src/test/java/otterjet/LocalJetStreamDropApplication.java rename to src/test/java/otter/jet/LocalJetStreamDropApplication.java index a0031df..e8ac16d 100644 --- a/src/test/java/otterjet/LocalJetStreamDropApplication.java +++ b/src/test/java/otter/jet/LocalJetStreamDropApplication.java @@ -1,4 +1,4 @@ -package otterjet; +package otter.jet; class LocalOtterJetApplication { public static void main(String[] args) { diff --git a/src/test/java/otterjet/assertions/ComparisonConfiguration.java b/src/test/java/otter/jet/assertions/ComparisonConfiguration.java similarity index 97% rename from src/test/java/otterjet/assertions/ComparisonConfiguration.java rename to src/test/java/otter/jet/assertions/ComparisonConfiguration.java index d22b567..6140cd1 100644 --- a/src/test/java/otterjet/assertions/ComparisonConfiguration.java +++ b/src/test/java/otter/jet/assertions/ComparisonConfiguration.java @@ -1,4 +1,4 @@ -package otterjet.assertions; +package otter.jet.assertions; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; diff --git a/src/test/java/otterjet/examples/RandomProtoPersonGenerator.java b/src/test/java/otter/jet/examples/RandomProtoPersonGenerator.java similarity index 86% rename from src/test/java/otterjet/examples/RandomProtoPersonGenerator.java rename to src/test/java/otter/jet/examples/RandomProtoPersonGenerator.java index f907295..638fd15 100644 --- a/src/test/java/otterjet/examples/RandomProtoPersonGenerator.java +++ b/src/test/java/otter/jet/examples/RandomProtoPersonGenerator.java @@ -1,8 +1,8 @@ -package otterjet.examples; +package otter.jet.examples; import com.github.javafaker.Faker; import org.jetbrains.annotations.NotNull; -import otterjet.examples.protobuf.PersonProtos; +import otter.jet.examples.protobuf.PersonProtos; public class RandomProtoPersonGenerator { @NotNull diff --git a/src/test/java/otterjet/examples/plaintext/PlainTextMessagePublisherConfiguration.java b/src/test/java/otter/jet/examples/plaintext/PlainTextMessagePublisherConfiguration.java similarity index 95% rename from src/test/java/otterjet/examples/plaintext/PlainTextMessagePublisherConfiguration.java rename to src/test/java/otter/jet/examples/plaintext/PlainTextMessagePublisherConfiguration.java index 0d186a4..1109215 100644 --- a/src/test/java/otterjet/examples/plaintext/PlainTextMessagePublisherConfiguration.java +++ b/src/test/java/otter/jet/examples/plaintext/PlainTextMessagePublisherConfiguration.java @@ -1,11 +1,12 @@ -package otterjet.examples.plaintext; +package otter.jet.examples.plaintext; import com.github.javafaker.Faker; import java.nio.charset.StandardCharsets; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; -import otterjet.JetStreamUtils; + +import otter.jet.JetStreamUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; diff --git a/src/test/java/otterjet/examples/protobuf/PersonProtos.java b/src/test/java/otter/jet/examples/protobuf/PersonProtos.java similarity index 99% rename from src/test/java/otterjet/examples/protobuf/PersonProtos.java rename to src/test/java/otter/jet/examples/protobuf/PersonProtos.java index 2271248..ad66ab4 100644 --- a/src/test/java/otterjet/examples/protobuf/PersonProtos.java +++ b/src/test/java/otter/jet/examples/protobuf/PersonProtos.java @@ -2,7 +2,7 @@ // source: person.proto // Protobuf Java Version: 3.25.1 -package otterjet.examples.protobuf; +package otter.jet.examples.protobuf; public final class PersonProtos { private PersonProtos() {} @@ -500,7 +500,7 @@ public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { PersonProtos.Person.Builder.class); } - // Construct using otterjet.examples.protobuf.PersonProtos.Person.newBuilder() + // Construct using otter.jet.examples.protobuf.PersonProtos.Person.newBuilder() private Builder() {} private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { diff --git a/src/test/java/otterjet/examples/protobuf/SimpleProtobufMessagePublisherConfiguration.java b/src/test/java/otter/jet/examples/protobuf/SimpleProtobufMessagePublisherConfiguration.java similarity index 91% rename from src/test/java/otterjet/examples/protobuf/SimpleProtobufMessagePublisherConfiguration.java rename to src/test/java/otter/jet/examples/protobuf/SimpleProtobufMessagePublisherConfiguration.java index 39b1547..06c2714 100644 --- a/src/test/java/otterjet/examples/protobuf/SimpleProtobufMessagePublisherConfiguration.java +++ b/src/test/java/otter/jet/examples/protobuf/SimpleProtobufMessagePublisherConfiguration.java @@ -1,11 +1,12 @@ -package otterjet.examples.protobuf; +package otter.jet.examples.protobuf; import com.google.protobuf.Any; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; -import otterjet.JetStreamUtils; -import otterjet.examples.RandomProtoPersonGenerator; + +import otter.jet.JetStreamUtils; +import otter.jet.examples.RandomProtoPersonGenerator; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; diff --git a/src/test/java/otterjet/plaintext/PlainTextMessageReaderTest.java b/src/test/java/otter/jet/plaintext/PlainTextMessageReaderTest.java similarity index 80% rename from src/test/java/otterjet/plaintext/PlainTextMessageReaderTest.java rename to src/test/java/otter/jet/plaintext/PlainTextMessageReaderTest.java index 6430346..9fd8f5f 100644 --- a/src/test/java/otterjet/plaintext/PlainTextMessageReaderTest.java +++ b/src/test/java/otter/jet/plaintext/PlainTextMessageReaderTest.java @@ -1,4 +1,4 @@ -package otterjet.plaintext; +package otter.jet.plaintext; import static org.assertj.core.api.Assertions.assertThat; import static org.awaitility.Awaitility.await; @@ -8,13 +8,15 @@ import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneOffset; -import otterjet.AbstractIntegrationTest; -import otterjet.JetStreamContainerInitializer; -import otterjet.JetStreamUtils; -import otterjet.ReadMessage; -import otterjet.ReaderConfigurationProperties; -import otterjet.ReaderService; -import otterjet.assertions.ComparisonConfiguration; + +import org.assertj.core.api.Assertions; +import otter.jet.AbstractIntegrationTest; +import otter.jet.JetStreamContainerInitializer; +import otter.jet.JetStreamUtils; +import otter.jet.ReadMessage; +import otter.jet.ReaderConfigurationProperties; +import otter.jet.ReaderService; +import otter.jet.assertions.ComparisonConfiguration; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.TestPropertySource; @@ -48,7 +50,7 @@ public void shouldReadMessagesSentInPlaintext() { await() .untilAsserted( () -> - assertThat(readerService.filter(subjectFilter, typeFilter, 0, 10, "")) + Assertions.assertThat(readerService.filter(subjectFilter, typeFilter, 0, 10, "")) .usingRecursiveFieldByFieldElementComparator( ComparisonConfiguration.configureReadMessageComparison()) .contains( diff --git a/src/test/java/otterjet/proto/AnyProtoMessageReaderTest.java b/src/test/java/otter/jet/proto/AnyProtoMessageReaderTest.java similarity index 85% rename from src/test/java/otterjet/proto/AnyProtoMessageReaderTest.java rename to src/test/java/otter/jet/proto/AnyProtoMessageReaderTest.java index 9c22e3a..112e795 100644 --- a/src/test/java/otterjet/proto/AnyProtoMessageReaderTest.java +++ b/src/test/java/otter/jet/proto/AnyProtoMessageReaderTest.java @@ -1,4 +1,4 @@ -package otterjet.proto; +package otter.jet.proto; import static org.assertj.core.api.Assertions.assertThat; import static org.awaitility.Awaitility.await; @@ -7,20 +7,21 @@ import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneOffset; -import otterjet.AbstractIntegrationTest; -import otterjet.JetStreamContainerInitializer; -import otterjet.JetStreamUtils; -import otterjet.ReadMessage; -import otterjet.ReaderConfigurationProperties; -import otterjet.ReaderService; -import otterjet.assertions.ComparisonConfiguration; -import otterjet.examples.RandomProtoPersonGenerator; + +import otter.jet.AbstractIntegrationTest; +import otter.jet.JetStreamContainerInitializer; +import otter.jet.JetStreamUtils; +import otter.jet.ReadMessage; +import otter.jet.ReaderConfigurationProperties; +import otter.jet.ReaderService; +import otter.jet.assertions.ComparisonConfiguration; +import otter.jet.examples.RandomProtoPersonGenerator; import org.json.JSONArray; import org.json.JSONObject; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.TestPropertySource; -import otterjet.examples.protobuf.PersonProtos.Person; +import otter.jet.examples.protobuf.PersonProtos.Person; @TestPropertySource( properties = { diff --git a/src/test/java/otterjet/proto/SimpleProtoMessageReaderTest.java b/src/test/java/otter/jet/proto/SimpleProtoMessageReaderTest.java similarity index 85% rename from src/test/java/otterjet/proto/SimpleProtoMessageReaderTest.java rename to src/test/java/otter/jet/proto/SimpleProtoMessageReaderTest.java index a082983..c688cbf 100644 --- a/src/test/java/otterjet/proto/SimpleProtoMessageReaderTest.java +++ b/src/test/java/otter/jet/proto/SimpleProtoMessageReaderTest.java @@ -1,4 +1,4 @@ -package otterjet.proto; +package otter.jet.proto; import static org.assertj.core.api.Assertions.assertThat; import static org.awaitility.Awaitility.await; @@ -6,20 +6,21 @@ import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneOffset; -import otterjet.AbstractIntegrationTest; -import otterjet.JetStreamContainerInitializer; -import otterjet.JetStreamUtils; -import otterjet.ReadMessage; -import otterjet.ReaderConfigurationProperties; -import otterjet.ReaderService; -import otterjet.assertions.ComparisonConfiguration; -import otterjet.examples.RandomProtoPersonGenerator; + +import otter.jet.AbstractIntegrationTest; +import otter.jet.JetStreamContainerInitializer; +import otter.jet.JetStreamUtils; +import otter.jet.ReadMessage; +import otter.jet.ReaderConfigurationProperties; +import otter.jet.ReaderService; +import otter.jet.assertions.ComparisonConfiguration; +import otter.jet.examples.RandomProtoPersonGenerator; import org.json.JSONArray; import org.json.JSONObject; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.TestPropertySource; -import otterjet.examples.protobuf.PersonProtos.Person; +import otter.jet.examples.protobuf.PersonProtos.Person; @TestPropertySource( properties = { diff --git a/src/test/resources/person.proto b/src/test/resources/person.proto index 80a8da4..5e410e5 100644 --- a/src/test/resources/person.proto +++ b/src/test/resources/person.proto @@ -1,6 +1,6 @@ syntax = "proto3"; package protobuf; -option java_package = "otterjet.examples.protobuf"; +option java_package = "otter.jet.examples.protobuf"; option java_outer_classname = "PersonProtos"; message Person { int32 id = 1; From 3e64a695ae3d8f2637fb0a356a8b3ac117fb97da Mon Sep 17 00:00:00 2001 From: "bartlomiej.zylinski" Date: Thu, 6 Jun 2024 13:35:28 +0200 Subject: [PATCH 13/18] Added packages for view and reader --- .../otter/jet/plaintext/PlainTextMessageDeserializer.java | 4 ++-- .../PlainTextMessageDeserializerConfiguration.java | 2 +- .../java/otter/jet/proto/ProtoBufMessageDeserializer.java | 6 +++--- .../jet/proto/ProtoMessageDeserializerConfiguration.java | 2 +- .../otter/jet/{ => reader}/DeserializationException.java | 2 +- .../java/otter/jet/{ => reader}/DeserializedMessage.java | 2 +- .../java/otter/jet/{ => reader}/MessageDeserializer.java | 2 +- src/main/java/otter/jet/{ => reader}/ReadMessage.java | 2 +- .../java/otter/jet/{ => reader}/ReaderConfiguration.java | 2 +- .../jet/{ => reader}/ReaderConfigurationProperties.java | 2 +- src/main/java/otter/jet/{ => reader}/ReaderService.java | 2 +- src/main/java/otter/jet/{ => rest}/MainViewController.java | 2 +- src/main/java/otter/jet/{ => rest}/MsgsController.java | 4 +++- .../otter/jet/plaintext/PlainTextMessageReaderTest.java | 6 +++--- .../java/otter/jet/proto/AnyProtoMessageReaderTest.java | 6 +++--- .../java/otter/jet/proto/SimpleProtoMessageReaderTest.java | 6 +++--- 16 files changed, 27 insertions(+), 25 deletions(-) rename src/main/java/otter/jet/{ => reader}/DeserializationException.java (88%) rename src/main/java/otter/jet/{ => reader}/DeserializedMessage.java (72%) rename src/main/java/otter/jet/{ => reader}/MessageDeserializer.java (85%) rename src/main/java/otter/jet/{ => reader}/ReadMessage.java (83%) rename src/main/java/otter/jet/{ => reader}/ReaderConfiguration.java (97%) rename src/main/java/otter/jet/{ => reader}/ReaderConfigurationProperties.java (96%) rename src/main/java/otter/jet/{ => reader}/ReaderService.java (99%) rename src/main/java/otter/jet/{ => rest}/MainViewController.java (96%) rename src/main/java/otter/jet/{ => rest}/MsgsController.java (94%) diff --git a/src/main/java/otter/jet/plaintext/PlainTextMessageDeserializer.java b/src/main/java/otter/jet/plaintext/PlainTextMessageDeserializer.java index e68cd22..e5d6a95 100644 --- a/src/main/java/otter/jet/plaintext/PlainTextMessageDeserializer.java +++ b/src/main/java/otter/jet/plaintext/PlainTextMessageDeserializer.java @@ -2,8 +2,8 @@ import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; -import otter.jet.DeserializedMessage; -import otter.jet.MessageDeserializer; +import otter.jet.reader.DeserializedMessage; +import otter.jet.reader.MessageDeserializer; class PlainTextMessageDeserializer implements MessageDeserializer { @Override diff --git a/src/main/java/otter/jet/plaintext/PlainTextMessageDeserializerConfiguration.java b/src/main/java/otter/jet/plaintext/PlainTextMessageDeserializerConfiguration.java index 361d9c4..c4a912e 100644 --- a/src/main/java/otter/jet/plaintext/PlainTextMessageDeserializerConfiguration.java +++ b/src/main/java/otter/jet/plaintext/PlainTextMessageDeserializerConfiguration.java @@ -1,6 +1,6 @@ package otter.jet.plaintext; -import otter.jet.MessageDeserializer; +import otter.jet.reader.MessageDeserializer; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/src/main/java/otter/jet/proto/ProtoBufMessageDeserializer.java b/src/main/java/otter/jet/proto/ProtoBufMessageDeserializer.java index 7862a1a..71c3323 100644 --- a/src/main/java/otter/jet/proto/ProtoBufMessageDeserializer.java +++ b/src/main/java/otter/jet/proto/ProtoBufMessageDeserializer.java @@ -15,9 +15,9 @@ import java.util.ArrayList; import java.util.List; -import otter.jet.DeserializationException; -import otter.jet.DeserializedMessage; -import otter.jet.MessageDeserializer; +import otter.jet.reader.DeserializationException; +import otter.jet.reader.DeserializedMessage; +import otter.jet.reader.MessageDeserializer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/otter/jet/proto/ProtoMessageDeserializerConfiguration.java b/src/main/java/otter/jet/proto/ProtoMessageDeserializerConfiguration.java index 9be0e7a..27859f7 100644 --- a/src/main/java/otter/jet/proto/ProtoMessageDeserializerConfiguration.java +++ b/src/main/java/otter/jet/proto/ProtoMessageDeserializerConfiguration.java @@ -2,7 +2,7 @@ import java.io.File; import java.io.FileNotFoundException; -import otter.jet.MessageDeserializer; +import otter.jet.reader.MessageDeserializer; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; diff --git a/src/main/java/otter/jet/DeserializationException.java b/src/main/java/otter/jet/reader/DeserializationException.java similarity index 88% rename from src/main/java/otter/jet/DeserializationException.java rename to src/main/java/otter/jet/reader/DeserializationException.java index a85b8b9..af964d9 100644 --- a/src/main/java/otter/jet/DeserializationException.java +++ b/src/main/java/otter/jet/reader/DeserializationException.java @@ -1,4 +1,4 @@ -package otter.jet; +package otter.jet.reader; public class DeserializationException extends RuntimeException { private static final long serialVersionUID = -2575341690419824332L; diff --git a/src/main/java/otter/jet/DeserializedMessage.java b/src/main/java/otter/jet/reader/DeserializedMessage.java similarity index 72% rename from src/main/java/otter/jet/DeserializedMessage.java rename to src/main/java/otter/jet/reader/DeserializedMessage.java index a0c86e0..b743445 100644 --- a/src/main/java/otter/jet/DeserializedMessage.java +++ b/src/main/java/otter/jet/reader/DeserializedMessage.java @@ -1,3 +1,3 @@ -package otter.jet; +package otter.jet.reader; public record DeserializedMessage(String name, String content) {} diff --git a/src/main/java/otter/jet/MessageDeserializer.java b/src/main/java/otter/jet/reader/MessageDeserializer.java similarity index 85% rename from src/main/java/otter/jet/MessageDeserializer.java rename to src/main/java/otter/jet/reader/MessageDeserializer.java index b02a54d..6b2a2df 100644 --- a/src/main/java/otter/jet/MessageDeserializer.java +++ b/src/main/java/otter/jet/reader/MessageDeserializer.java @@ -1,4 +1,4 @@ -package otter.jet; +package otter.jet.reader; import java.nio.ByteBuffer; diff --git a/src/main/java/otter/jet/ReadMessage.java b/src/main/java/otter/jet/reader/ReadMessage.java similarity index 83% rename from src/main/java/otter/jet/ReadMessage.java rename to src/main/java/otter/jet/reader/ReadMessage.java index ea7bb59..4725b1d 100644 --- a/src/main/java/otter/jet/ReadMessage.java +++ b/src/main/java/otter/jet/reader/ReadMessage.java @@ -1,4 +1,4 @@ -package otter.jet; +package otter.jet.reader; import java.time.LocalDateTime; diff --git a/src/main/java/otter/jet/ReaderConfiguration.java b/src/main/java/otter/jet/reader/ReaderConfiguration.java similarity index 97% rename from src/main/java/otter/jet/ReaderConfiguration.java rename to src/main/java/otter/jet/reader/ReaderConfiguration.java index 5f7be19..544e265 100644 --- a/src/main/java/otter/jet/ReaderConfiguration.java +++ b/src/main/java/otter/jet/reader/ReaderConfiguration.java @@ -1,4 +1,4 @@ -package otter.jet; +package otter.jet.reader; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.EnableConfigurationProperties; diff --git a/src/main/java/otter/jet/ReaderConfigurationProperties.java b/src/main/java/otter/jet/reader/ReaderConfigurationProperties.java similarity index 96% rename from src/main/java/otter/jet/ReaderConfigurationProperties.java rename to src/main/java/otter/jet/reader/ReaderConfigurationProperties.java index f9b5bca..6aa245e 100644 --- a/src/main/java/otter/jet/ReaderConfigurationProperties.java +++ b/src/main/java/otter/jet/reader/ReaderConfigurationProperties.java @@ -1,4 +1,4 @@ -package otter.jet; +package otter.jet.reader; import java.util.Objects; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/src/main/java/otter/jet/ReaderService.java b/src/main/java/otter/jet/reader/ReaderService.java similarity index 99% rename from src/main/java/otter/jet/ReaderService.java rename to src/main/java/otter/jet/reader/ReaderService.java index f793eab..897721c 100644 --- a/src/main/java/otter/jet/ReaderService.java +++ b/src/main/java/otter/jet/reader/ReaderService.java @@ -1,4 +1,4 @@ -package otter.jet; +package otter.jet.reader; import io.nats.client.Connection; import io.nats.client.JetStream; diff --git a/src/main/java/otter/jet/MainViewController.java b/src/main/java/otter/jet/rest/MainViewController.java similarity index 96% rename from src/main/java/otter/jet/MainViewController.java rename to src/main/java/otter/jet/rest/MainViewController.java index 32a38b4..73dcf54 100644 --- a/src/main/java/otter/jet/MainViewController.java +++ b/src/main/java/otter/jet/rest/MainViewController.java @@ -1,4 +1,4 @@ -package otter.jet; +package otter.jet.rest; import otter.jet.monitoring.NatsMonitoringDataLoader; import org.springframework.stereotype.Controller; diff --git a/src/main/java/otter/jet/MsgsController.java b/src/main/java/otter/jet/rest/MsgsController.java similarity index 94% rename from src/main/java/otter/jet/MsgsController.java rename to src/main/java/otter/jet/rest/MsgsController.java index 1bbd2d5..da5b140 100644 --- a/src/main/java/otter/jet/MsgsController.java +++ b/src/main/java/otter/jet/rest/MsgsController.java @@ -1,4 +1,4 @@ -package otter.jet; +package otter.jet.rest; import java.util.List; import java.util.Optional; @@ -9,6 +9,8 @@ import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; +import otter.jet.reader.ReadMessage; +import otter.jet.reader.ReaderService; @Controller public class MsgsController { diff --git a/src/test/java/otter/jet/plaintext/PlainTextMessageReaderTest.java b/src/test/java/otter/jet/plaintext/PlainTextMessageReaderTest.java index 9fd8f5f..0a9c387 100644 --- a/src/test/java/otter/jet/plaintext/PlainTextMessageReaderTest.java +++ b/src/test/java/otter/jet/plaintext/PlainTextMessageReaderTest.java @@ -13,9 +13,9 @@ import otter.jet.AbstractIntegrationTest; import otter.jet.JetStreamContainerInitializer; import otter.jet.JetStreamUtils; -import otter.jet.ReadMessage; -import otter.jet.ReaderConfigurationProperties; -import otter.jet.ReaderService; +import otter.jet.reader.ReadMessage; +import otter.jet.reader.ReaderConfigurationProperties; +import otter.jet.reader.ReaderService; import otter.jet.assertions.ComparisonConfiguration; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; diff --git a/src/test/java/otter/jet/proto/AnyProtoMessageReaderTest.java b/src/test/java/otter/jet/proto/AnyProtoMessageReaderTest.java index 112e795..a8f0218 100644 --- a/src/test/java/otter/jet/proto/AnyProtoMessageReaderTest.java +++ b/src/test/java/otter/jet/proto/AnyProtoMessageReaderTest.java @@ -11,9 +11,9 @@ import otter.jet.AbstractIntegrationTest; import otter.jet.JetStreamContainerInitializer; import otter.jet.JetStreamUtils; -import otter.jet.ReadMessage; -import otter.jet.ReaderConfigurationProperties; -import otter.jet.ReaderService; +import otter.jet.reader.ReadMessage; +import otter.jet.reader.ReaderConfigurationProperties; +import otter.jet.reader.ReaderService; import otter.jet.assertions.ComparisonConfiguration; import otter.jet.examples.RandomProtoPersonGenerator; import org.json.JSONArray; diff --git a/src/test/java/otter/jet/proto/SimpleProtoMessageReaderTest.java b/src/test/java/otter/jet/proto/SimpleProtoMessageReaderTest.java index c688cbf..43cf7b1 100644 --- a/src/test/java/otter/jet/proto/SimpleProtoMessageReaderTest.java +++ b/src/test/java/otter/jet/proto/SimpleProtoMessageReaderTest.java @@ -10,9 +10,9 @@ import otter.jet.AbstractIntegrationTest; import otter.jet.JetStreamContainerInitializer; import otter.jet.JetStreamUtils; -import otter.jet.ReadMessage; -import otter.jet.ReaderConfigurationProperties; -import otter.jet.ReaderService; +import otter.jet.reader.ReadMessage; +import otter.jet.reader.ReaderConfigurationProperties; +import otter.jet.reader.ReaderService; import otter.jet.assertions.ComparisonConfiguration; import otter.jet.examples.RandomProtoPersonGenerator; import org.json.JSONArray; From f71e8ff1a7814369eaec37b437158daf4ecb2265 Mon Sep 17 00:00:00 2001 From: "bartlomiej.zylinski" Date: Thu, 6 Jun 2024 13:43:28 +0200 Subject: [PATCH 14/18] Added Back button on frontend --- src/main/resources/static/css/index.css | 25 ++++++++++++++++++++ src/main/resources/templates/main.ftlh | 24 ------------------- src/main/resources/templates/monitoring.ftlh | 5 ++++ src/main/resources/templates/msgs-page.ftlh | 14 ++++------- 4 files changed, 35 insertions(+), 33 deletions(-) diff --git a/src/main/resources/static/css/index.css b/src/main/resources/static/css/index.css index fb540a3..ac21624 100644 --- a/src/main/resources/static/css/index.css +++ b/src/main/resources/static/css/index.css @@ -36,3 +36,28 @@ input[type="text"] { border: 1px solid #ddd; border-radius: 4px; } + + +nav ul { + list-style-type: none; + padding: 0; +} + +nav ul li { + display: inline; + margin-right: 10px; +} + +nav ul li a { + display: inline-block; + color: #fff; + text-decoration: none; + background-color: #5C6BC0; + padding: 10px 15px; + border-radius: 4px; + transition: background-color 0.3s ease; +} + +nav ul li a:hover { + background-color: #3F51B5; +} diff --git a/src/main/resources/templates/main.ftlh b/src/main/resources/templates/main.ftlh index 93bea16..fedeaf7 100644 --- a/src/main/resources/templates/main.ftlh +++ b/src/main/resources/templates/main.ftlh @@ -16,30 +16,6 @@ padding: 15px; } - nav ul { - list-style-type: none; - padding: 0; - } - - nav ul li { - display: inline; - margin-right: 10px; - } - - nav ul li a { - display: inline-block; - color: #fff; - text-decoration: none; - background-color: #5C6BC0; - padding: 10px 15px; - border-radius: 4px; - transition: background-color 0.3s ease; - } - - nav ul li a:hover { - background-color: #3F51B5; - } - .header { display: flex; align-items: center; diff --git a/src/main/resources/templates/monitoring.ftlh b/src/main/resources/templates/monitoring.ftlh index de50d52..7c0fc71 100644 --- a/src/main/resources/templates/monitoring.ftlh +++ b/src/main/resources/templates/monitoring.ftlh @@ -68,5 +68,10 @@ + diff --git a/src/main/resources/templates/msgs-page.ftlh b/src/main/resources/templates/msgs-page.ftlh index f9fbc24..3c99352 100644 --- a/src/main/resources/templates/msgs-page.ftlh +++ b/src/main/resources/templates/msgs-page.ftlh @@ -74,11 +74,6 @@ overflow-y: auto; } - .message__content.collapsed { - max-height: 0; - padding: 0; - } - .message__content, .message__header { width: 800px; max-width: 100%; @@ -100,10 +95,6 @@ align-items: center; } - .controls__form--refresh { - margin-left: 10px; - } - .controls__field { display: flex; align-items: center; @@ -249,5 +240,10 @@ }); + From c0525d70764a9544ae75a68b1ba38a9b23361083 Mon Sep 17 00:00:00 2001 From: "bartlomiej.zylinski" Date: Thu, 6 Jun 2024 13:59:59 +0200 Subject: [PATCH 15/18] Removed unused dependencies --- .gitignore | 18 ---------- pom.xml | 97 +++++++++++++++++++++++------------------------------- 2 files changed, 42 insertions(+), 73 deletions(-) diff --git a/.gitignore b/.gitignore index ff7a4f6..7a5ba5e 100644 --- a/.gitignore +++ b/.gitignore @@ -6,24 +6,6 @@ target/ ### IntelliJ IDEA ### .idea -### Eclipse ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache - -### NetBeans ### -/nbproject/private/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ -build/ -!**/src/main/**/build/ -!**/src/test/**/build/ ### VS Code ### .vscode/ diff --git a/pom.xml b/pom.xml index fbe00ce..0de8efc 100644 --- a/pom.xml +++ b/pom.xml @@ -16,8 +16,8 @@ 17 2.41.1 1.19.3 - 3.2.0 - 2023.0.0 + 3.3.0 + 2023.0.2 @@ -48,57 +48,6 @@ - - com.google.protobuf - protobuf-java-util - 3.21.5 - - - com.fasterxml.jackson.module - jackson-module-jakarta-xmlbind-annotations - 2.16.0 - - - io.grpc - grpc-protobuf - 1.59.0 - - - com.google.protobuf - protobuf-java - 3.25.1 - - - io.envoyproxy.protoc-gen-validate - pgv-java-stub - 0.6.13 - - - javax.annotation - javax.annotation-api - 1.3.2 - - - io.grpc - grpc-stub - 1.59.0 - - - io.nats - jnats - 2.17.1 - - - org.slf4j - slf4j-api - 2.0.9 - - - javax - javaee-web-api - 7.0 - provided - org.springframework.boot spring-boot-starter-web @@ -131,6 +80,43 @@ io.github.openfeign feign-jackson + + com.google.protobuf + protobuf-java-util + 3.21.5 + + + com.google.protobuf + protobuf-java + 3.25.1 + + + io.grpc + grpc-stub + 1.59.0 + + + io.grpc + grpc-protobuf + 1.59.0 + + + io.nats + jnats + 2.18.1 + + + org.slf4j + slf4j-api + 2.0.9 + + + javax + javaee-web-api + 7.0 + provided + + org.springframework.boot spring-boot-starter-test @@ -153,13 +139,13 @@ 20231013 test - org.springframework.boot spring-boot-maven-plugin + 3.3.0 repackage @@ -186,8 +172,9 @@ + org.apache.maven.plugins maven-surefire-plugin - 3.2.1 + 3.2.5 From 395c1dc6b8eb25dd4c7990349656cc3ccc068c4f Mon Sep 17 00:00:00 2001 From: "bartlomiej.zylinski" Date: Thu, 6 Jun 2024 14:17:09 +0200 Subject: [PATCH 16/18] Add dependencies versions --- pom.xml | 58 +++++++++++++++++++++------------------------------------ 1 file changed, 21 insertions(+), 37 deletions(-) diff --git a/pom.xml b/pom.xml index 0de8efc..e2bebcd 100644 --- a/pom.xml +++ b/pom.xml @@ -14,10 +14,16 @@ UTF-8 17 17 - 2.41.1 - 1.19.3 - 3.3.0 - 2023.0.2 + 1.19.8 + 3.3.0 + 2023.0.2 + 13.2.1 + 3.25.0 + 1.64.0 + 1.0.2 + 20240303 + 2.18.1 + 2.0.9 @@ -25,21 +31,14 @@ org.springframework.boot spring-boot-dependencies - ${spring-boot.version} + ${spring.boot.version} pom import org.springframework.cloud spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - org.testcontainers - testcontainers-bom - ${testcontainers.version} + ${spring.cloud.version} pom import @@ -79,42 +78,37 @@ io.github.openfeign feign-jackson + ${feign.jackson.version} com.google.protobuf protobuf-java-util - 3.21.5 + ${protobuf.java.version} com.google.protobuf protobuf-java - 3.25.1 + ${protobuf.java.version} io.grpc grpc-stub - 1.59.0 + ${grpc.version} io.grpc grpc-protobuf - 1.59.0 + ${grpc.version} io.nats jnats - 2.18.1 + ${jnats.version} org.slf4j slf4j-api - 2.0.9 - - - javax - javaee-web-api - 7.0 - provided + ${slf4j-api.version} @@ -130,13 +124,13 @@ com.github.javafaker javafaker - 1.0.2 + ${javafaker.version} test org.json json - 20231013 + ${json.version} test @@ -161,16 +155,6 @@ - - com.diffplug.spotless - spotless-maven-plugin - ${spotless.plugin.version} - - - - - - org.apache.maven.plugins maven-surefire-plugin From b56ed831659e416a28291c3a6a006c9671577ae8 Mon Sep 17 00:00:00 2001 From: "bartlomiej.zylinski" Date: Tue, 18 Jun 2024 08:03:03 +0200 Subject: [PATCH 17/18] Fix review issues --- docker-compose.yaml | 2 -- .../java/otter/jet/plaintext/PlainTextMessageReaderTest.java | 3 +-- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/docker-compose.yaml b/docker-compose.yaml index 1c2b37d..da0c292 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -1,5 +1,3 @@ -version: '3.9' - volumes: nats-storage: driver: local diff --git a/src/test/java/otter/jet/plaintext/PlainTextMessageReaderTest.java b/src/test/java/otter/jet/plaintext/PlainTextMessageReaderTest.java index 0a9c387..aeea381 100644 --- a/src/test/java/otter/jet/plaintext/PlainTextMessageReaderTest.java +++ b/src/test/java/otter/jet/plaintext/PlainTextMessageReaderTest.java @@ -9,7 +9,6 @@ import java.time.LocalDateTime; import java.time.ZoneOffset; -import org.assertj.core.api.Assertions; import otter.jet.AbstractIntegrationTest; import otter.jet.JetStreamContainerInitializer; import otter.jet.JetStreamUtils; @@ -50,7 +49,7 @@ public void shouldReadMessagesSentInPlaintext() { await() .untilAsserted( () -> - Assertions.assertThat(readerService.filter(subjectFilter, typeFilter, 0, 10, "")) + assertThat(readerService.filter(subjectFilter, typeFilter, 0, 10, "")) .usingRecursiveFieldByFieldElementComparator( ComparisonConfiguration.configureReadMessageComparison()) .contains( From ffc4dcb0c0932ea871ed1e1a44843a158bf69268 Mon Sep 17 00:00:00 2001 From: "bartlomiej.zylinski" Date: Thu, 6 Jun 2024 13:59:59 +0200 Subject: [PATCH 18/18] Removed unused dependencies Add dependencies versions Added limit of messages Fix filters factory Use const insted of var and function Added begin timestamp to reader Fix tests setup Fix review issues Added Google Code Style --- intellij-java-google-style.xml | 598 ++++++++++++++++++ .../otter/jet/reader/ReaderConfiguration.java | 57 +- .../java/otter/jet/reader/ReaderService.java | 212 +++---- .../java/otter/jet/rest/MsgsController.java | 28 +- .../otter/jet/store/DefaultMessageStore.java | 41 ++ src/main/java/otter/jet/store/Filters.java | 27 + .../java/otter/jet/store/MessageStore.java | 12 + .../otter/jet/store/StoreConfiguration.java | 15 + src/main/resources/application.yml | 3 + src/main/resources/templates/msgs-page.ftlh | 30 +- .../examples/RandomProtoPersonGenerator.java | 1 + .../plaintext/PlainTextMessageReaderTest.java | 52 +- .../jet/proto/AnyProtoMessageReaderTest.java | 13 +- .../proto/SimpleProtoMessageReaderTest.java | 41 +- .../otter/jet/store/MessageStoreTest.java | 102 +++ src/test/resources/application-local.yml | 1 + 16 files changed, 1011 insertions(+), 222 deletions(-) create mode 100644 intellij-java-google-style.xml create mode 100644 src/main/java/otter/jet/store/DefaultMessageStore.java create mode 100644 src/main/java/otter/jet/store/Filters.java create mode 100644 src/main/java/otter/jet/store/MessageStore.java create mode 100644 src/main/java/otter/jet/store/StoreConfiguration.java create mode 100644 src/test/java/otter/jet/store/MessageStoreTest.java diff --git a/intellij-java-google-style.xml b/intellij-java-google-style.xml new file mode 100644 index 0000000..f3a6743 --- /dev/null +++ b/intellij-java-google-style.xml @@ -0,0 +1,598 @@ + + + + + + diff --git a/src/main/java/otter/jet/reader/ReaderConfiguration.java b/src/main/java/otter/jet/reader/ReaderConfiguration.java index 544e265..bcf8e19 100644 --- a/src/main/java/otter/jet/reader/ReaderConfiguration.java +++ b/src/main/java/otter/jet/reader/ReaderConfiguration.java @@ -4,29 +4,46 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import otter.jet.store.MessageStore; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; @Configuration @EnableConfigurationProperties(ReaderConfigurationProperties.class) class ReaderConfiguration { - private final ReaderConfigurationProperties readerConfigurationProperties; - - ReaderConfiguration(ReaderConfigurationProperties readerConfigurationProperties) { - this.readerConfigurationProperties = readerConfigurationProperties; - } - - @Bean - public ReaderService readerService( - @Value("${nats.server.host}") String natsServerHost, - @Value("${nats.server.port}") String natsServerPort, - MessageDeserializer messageDeserializer) { - return new ReaderService( - createNatsServerUrl(natsServerHost, natsServerPort), - messageDeserializer, - readerConfigurationProperties.getSubject()); - } - - private String createNatsServerUrl(String natsServerHost, String natsServerPort) { - return "nats://" + natsServerHost + ":" + natsServerPort; - } + private final ReaderConfigurationProperties readerConfigurationProperties; + + ReaderConfiguration(ReaderConfigurationProperties readerConfigurationProperties) { + this.readerConfigurationProperties = readerConfigurationProperties; + } + + @Bean + public ReaderService readerService( + @Value("${nats.server.host}") String natsServerHost, + @Value("${nats.server.port}") String natsServerPort, + @Value("${read.beginTimestamp:}") String startDate, + MessageDeserializer messageDeserializer, + MessageStore messageStore) { + return new ReaderService( + createNatsServerUrl(natsServerHost, natsServerPort), + messageDeserializer, + readerConfigurationProperties.getSubject(), + messageStore, + resolveBeginTimestamp(startDate)); + } + + private static LocalDateTime resolveBeginTimestamp(String startDate) { + if (!startDate.isBlank()) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + return LocalDateTime.parse(startDate, formatter); + } else { + return LocalDateTime.MIN; + } + } + + private String createNatsServerUrl(String natsServerHost, String natsServerPort) { + return "nats://" + natsServerHost + ":" + natsServerPort; + } } diff --git a/src/main/java/otter/jet/reader/ReaderService.java b/src/main/java/otter/jet/reader/ReaderService.java index 897721c..39bdf2d 100644 --- a/src/main/java/otter/jet/reader/ReaderService.java +++ b/src/main/java/otter/jet/reader/ReaderService.java @@ -6,138 +6,126 @@ import io.nats.client.Message; import io.nats.client.Nats; import io.nats.client.Subscription; + import java.io.IOException; import java.nio.ByteBuffer; -import java.util.ArrayDeque; -import java.util.List; +import java.time.LocalDateTime; import java.util.concurrent.Executor; import java.util.concurrent.Executors; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.event.EventListener; +import otter.jet.store.MessageStore; public class ReaderService { - private static final Logger LOG = LoggerFactory.getLogger(ReaderService.class); - - private final String natsServerUrl; - private final MessageDeserializer messageDeserializer; - private final String subject; - - private final Executor executorService = Executors.newSingleThreadExecutor(); - - ArrayDeque msgs = new ArrayDeque<>(); - - public ReaderService( - String natsServerUrl, MessageDeserializer messageDeserializer, String subject) { - this.natsServerUrl = natsServerUrl; - this.messageDeserializer = messageDeserializer; - this.subject = subject; - } - - @EventListener(ApplicationReadyEvent.class) - public void startReadingMessages() { - // This method will be invoked after the service is initialized - startMessageListener(); - } + private static final Logger LOG = LoggerFactory.getLogger(ReaderService.class); + private static final String NO_MATCHING_STREAM_CODE = "SUB-90007"; + + private final String natsServerUrl; + private final MessageDeserializer messageDeserializer; + private final String subject; + private final MessageStore messageStore; + private final LocalDateTime beginTimestamp; + + private final Executor executorService = Executors.newSingleThreadExecutor(); + + public ReaderService(String natsServerUrl, + MessageDeserializer messageDeserializer, + String subject, + MessageStore messageStore, + LocalDateTime beginTimestamp) { + this.natsServerUrl = natsServerUrl; + this.messageDeserializer = messageDeserializer; + this.subject = subject; + this.messageStore = messageStore; + this.beginTimestamp = beginTimestamp; + } - private void startMessageListener() { - executorService.execute( - () -> { - try { - // Connect to NATS server - try (Connection natsConnection = Nats.connect(natsServerUrl)) { - LOG.info("Connected to NATS server at: {}", natsServerUrl); + @EventListener(ApplicationReadyEvent.class) + public void startReadingMessages() { + // This method will be invoked after the service is initialized + startMessageListener(); + } - JetStream jetStream = natsConnection.jetStream(); - LOG.info("Connected to JetStream server at: {}", natsServerUrl); - // Subscribe to the subject + private void startMessageListener() { + executorService.execute( + () -> { + // Connect to NATS server + try (Connection natsConnection = Nats.connect(natsServerUrl)) { + LOG.info("Connected to NATS server at: {}", natsServerUrl); + + JetStream jetStream = natsConnection.jetStream(); + LOG.info("Connected to JetStream server at: {}", natsServerUrl); + // Subscribe to the subject + + Subscription subscription = tryToSubscribe(jetStream); + LOG.info("Subscribed to subject: {}", natsServerUrl); + + continuouslyReadMessages(subscription, messageDeserializer); + } catch (Exception e) { + LOG.error("Error during message reading: ", e); + } + }); + } - Subscription subscription = tryToSubscribe(jetStream); - LOG.info("Subscribed to subject: {}", natsServerUrl); + private Subscription tryToSubscribe(JetStream jetStream) + throws IOException, JetStreamApiException, InterruptedException { - continuouslyReadMessages(subscription, messageDeserializer); + try { + return jetStream.subscribe(subject); + } catch (IllegalStateException e) { + if (e.getMessage().contains(NO_MATCHING_STREAM_CODE)) { // No matching streams for subject + // try again after 5 seconds + LOG.warn( + "Unable to subscribe to subject: " + + subject + + " . No matching streams. Trying again in 5sec..."); + Thread.sleep(5000); + return tryToSubscribe(jetStream); } + throw new RuntimeException(e); + } + } - } catch (Exception e) { - LOG.error("Error during message reading: ", e); - } - }); - } - - private Subscription tryToSubscribe(JetStream jetStream) - throws IOException, JetStreamApiException, InterruptedException { - - Subscription subscription; - try { - subscription = jetStream.subscribe(subject); - } catch (IllegalStateException e) { - if (e.getMessage().contains("SUB-90007")) { // No matching streams for subject - // try again after 5 seconds - LOG.warn( - "Unable to subscribe to subject: " - + subject - + " . No matching streams. Trying again in 5sec..."); - Thread.sleep(5000); - return tryToSubscribe(jetStream); - } - throw new RuntimeException(e); + private void continuouslyReadMessages( + Subscription subscription, MessageDeserializer messageDeserializer) throws InterruptedException { + while (true) { + // Wait for a message + Message message = subscription.nextMessage(100); + // Print the message + if (message != null) { + LocalDateTime messageTimestamp = message + .metaData() + .timestamp() + .toLocalDateTime(); + + if (messageTimestamp.isAfter(beginTimestamp)) { + deserializeMessage(messageDeserializer, message, messageTimestamp); + } else { + LOG.warn("Timestamp from message {}, smaller then begin timestamp {}, message {} will not be process", messageTimestamp, beginTimestamp, message.getSID()); + message.ack(); + } + } + } } - return subscription; - } - - private void continuouslyReadMessages( - Subscription subscription, MessageDeserializer messageDeserializer) - throws InterruptedException { - while (true) { - // Wait for a message - Message message = subscription.nextMessage(100); - // Print the message - if (message != null) { + + private void deserializeMessage(MessageDeserializer messageDeserializer, Message message, LocalDateTime timestamp) { try { - DeserializedMessage deserializedMessage = - messageDeserializer.deserializeMessage(ByteBuffer.wrap(message.getData())); - ReadMessage msg = - new ReadMessage( - message.getSubject(), - deserializedMessage.name(), - deserializedMessage.content(), - message.metaData().timestamp().toLocalDateTime()); - msgs.addFirst(msg); - message.ack(); + DeserializedMessage deserializedMessage = + messageDeserializer.deserializeMessage(ByteBuffer.wrap(message.getData())); + ReadMessage msg = + new ReadMessage( + message.getSubject(), + deserializedMessage.name(), + deserializedMessage.content(), + timestamp); + messageStore.add(msg); + message.ack(); } catch (Exception e) { - LOG.warn("Unable to deserialize message", e); + LOG.warn("Unable to deserialize message", e); } - } } - } - - public List filter(String subject, String type, int page, int size, String bodyContent) { - return msgs.stream() - .filter( - m -> { - if (!subject.isBlank()) { - return m.subject().contains(subject); - } - return true; - }) - .filter( - m -> { - if (!type.isBlank()) { - return m.name().contains(type); - } - return true; - }) - .filter( - m -> { - if (!bodyContent.isBlank()) { - return m.body().contains(bodyContent); - } - return true; - }) - .skip((long) page * size) - .limit(size) - .toList(); - } } diff --git a/src/main/java/otter/jet/rest/MsgsController.java b/src/main/java/otter/jet/rest/MsgsController.java index da5b140..6f827ca 100644 --- a/src/main/java/otter/jet/rest/MsgsController.java +++ b/src/main/java/otter/jet/rest/MsgsController.java @@ -1,7 +1,6 @@ package otter.jet.rest; import java.util.List; -import java.util.Optional; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -9,8 +8,9 @@ import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; +import otter.jet.store.MessageStore; import otter.jet.reader.ReadMessage; -import otter.jet.reader.ReaderService; +import otter.jet.store.Filters; @Controller public class MsgsController { @@ -18,29 +18,27 @@ public class MsgsController { private static final String TEMPLATE_NAME = "msgs-page"; private static final Logger LOG = LoggerFactory.getLogger(MsgsController.class); - private final ReaderService readerService; + private final MessageStore messageStore; - public MsgsController(ReaderService readerService) { - this.readerService = readerService; + public MsgsController(MessageStore messageStore) { + this.messageStore = messageStore; } @GetMapping("/msgs") public String page( - @RequestParam(value = "subject", required = false) String subject, - @RequestParam(value = "type", required = false) String type, - @RequestParam(value = "bodyContent", required = false) String bodyContent, + @RequestParam(value = "subject", required = false, defaultValue = "") String subject, + @RequestParam(value = "type", required = false, defaultValue = "") String type, + @RequestParam(value = "bodyContent", required = false, defaultValue = "") String bodyContent, @RequestParam(value = "page", defaultValue = "0") int page, @RequestParam(value = "size", defaultValue = "10") int size, Model model) { - String subjectFilter = Optional.ofNullable(subject).orElse(""); - String typeFilter = Optional.ofNullable(type).orElse(""); - String bodyContentFilter = Optional.ofNullable(bodyContent).orElse(""); - List filteredMessages = readerService.filter(subjectFilter, typeFilter, page, size, bodyContentFilter); + Filters filters = Filters.of(subject, type, bodyContent); + List filteredMessages = messageStore.filter(filters, page, size); LOG.info("amount of read messages: " + filteredMessages.size()); model.addAttribute("messages", filteredMessages); - model.addAttribute("subject", subjectFilter); - model.addAttribute("type", typeFilter); - model.addAttribute("bodyContent", bodyContentFilter); + model.addAttribute("subject", subject); + model.addAttribute("type", type); + model.addAttribute("bodyContent", bodyContent); model.addAttribute("page", page); model.addAttribute("size", size); return TEMPLATE_NAME; diff --git a/src/main/java/otter/jet/store/DefaultMessageStore.java b/src/main/java/otter/jet/store/DefaultMessageStore.java new file mode 100644 index 0000000..14b809a --- /dev/null +++ b/src/main/java/otter/jet/store/DefaultMessageStore.java @@ -0,0 +1,41 @@ +package otter.jet.store; + +import org.springframework.beans.factory.annotation.Value; +import otter.jet.reader.ReadMessage; + +import java.util.ArrayDeque; +import java.util.Deque; +import java.util.List; +import java.util.function.Predicate; + +public class DefaultMessageStore implements MessageStore { + + private final Deque messages = new ArrayDeque<>(); + private final int limit; + + public DefaultMessageStore(@Value("${read.store.limit:1000}") int limit) { + this.limit = limit; + } + + public void add(ReadMessage message) { + if (messages.size() >= limit) { + messages.removeLast(); + } + messages.addFirst(message); + } + + public List filter(Filters filters, int page, int size) { + return filter(filters.toPredicate(), page, size); + } + + private List filter(Predicate predicate, int page, int size) { + return messages.stream() + .filter(predicate) + .skip((long) page * size) + .limit(size) + .toList(); + } + + + +} diff --git a/src/main/java/otter/jet/store/Filters.java b/src/main/java/otter/jet/store/Filters.java new file mode 100644 index 0000000..b2eac8a --- /dev/null +++ b/src/main/java/otter/jet/store/Filters.java @@ -0,0 +1,27 @@ +package otter.jet.store; + +import otter.jet.reader.ReadMessage; + +import java.util.function.Predicate; + +// For more parameters consider builder +public record Filters(String subject, String type, String bodyContent) { + + public static Filters empty() { + return new Filters("", "", ""); + } + + public static Filters of(String subject) { + return new Filters(subject, "", ""); + } + + public static Filters of(String subject, String type, String bodyContent) { + return new Filters(subject, type, bodyContent); + } + + Predicate toPredicate() { + return m -> (subject.isBlank() || m.subject().contains(subject)) && + (type.isBlank() || m.name().contains(type)) && + (bodyContent.isBlank() || m.body().contains(bodyContent)); + } +} diff --git a/src/main/java/otter/jet/store/MessageStore.java b/src/main/java/otter/jet/store/MessageStore.java new file mode 100644 index 0000000..9a8288d --- /dev/null +++ b/src/main/java/otter/jet/store/MessageStore.java @@ -0,0 +1,12 @@ +package otter.jet.store; + +import otter.jet.reader.ReadMessage; + +import java.util.List; + +public interface MessageStore { + + void add(ReadMessage message); + + List filter(Filters filters, int page, int size); +} diff --git a/src/main/java/otter/jet/store/StoreConfiguration.java b/src/main/java/otter/jet/store/StoreConfiguration.java new file mode 100644 index 0000000..1e04297 --- /dev/null +++ b/src/main/java/otter/jet/store/StoreConfiguration.java @@ -0,0 +1,15 @@ +package otter.jet.store; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +class StoreConfiguration { + + @Bean + public MessageStore messageStore( + @Value("${read.store.limit:1000}") Integer limit) { + return new DefaultMessageStore(limit); + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index d01f0ae..3e15c3b 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,8 +1,11 @@ read: mode: "proto" + beginTimestamp: "2024-06-10 10:21:20" # String in format yyyy-MM-dd HH:mm:ss empty for all messages proto: pathToDescriptor: "path_to_descriptor" subject: "*" + store: + limit: 1000 server: port: 1111 diff --git a/src/main/resources/templates/msgs-page.ftlh b/src/main/resources/templates/msgs-page.ftlh index 3c99352..3624277 100644 --- a/src/main/resources/templates/msgs-page.ftlh +++ b/src/main/resources/templates/msgs-page.ftlh @@ -147,13 +147,13 @@ } @@ -223,19 +223,19 @@ diff --git a/src/test/java/otter/jet/examples/RandomProtoPersonGenerator.java b/src/test/java/otter/jet/examples/RandomProtoPersonGenerator.java index 638fd15..1518a21 100644 --- a/src/test/java/otter/jet/examples/RandomProtoPersonGenerator.java +++ b/src/test/java/otter/jet/examples/RandomProtoPersonGenerator.java @@ -5,6 +5,7 @@ import otter.jet.examples.protobuf.PersonProtos; public class RandomProtoPersonGenerator { + @NotNull public static PersonProtos.Person randomPerson() { Faker faker = new Faker(); diff --git a/src/test/java/otter/jet/plaintext/PlainTextMessageReaderTest.java b/src/test/java/otter/jet/plaintext/PlainTextMessageReaderTest.java index aeea381..22626b4 100644 --- a/src/test/java/otter/jet/plaintext/PlainTextMessageReaderTest.java +++ b/src/test/java/otter/jet/plaintext/PlainTextMessageReaderTest.java @@ -8,55 +8,43 @@ import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneOffset; - +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.TestPropertySource; import otter.jet.AbstractIntegrationTest; import otter.jet.JetStreamContainerInitializer; import otter.jet.JetStreamUtils; +import otter.jet.assertions.ComparisonConfiguration; import otter.jet.reader.ReadMessage; import otter.jet.reader.ReaderConfigurationProperties; -import otter.jet.reader.ReaderService; -import otter.jet.assertions.ComparisonConfiguration; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.TestPropertySource; +import otter.jet.store.Filters; +import otter.jet.store.MessageStore; -@TestPropertySource(properties = {"read.mode=plaintext", "read.subject=plaintext"}) +@TestPropertySource(properties = {"read.mode=plaintext", "read.subject=plaintext", "read.beginTimestamp="}) class PlainTextMessageReaderTest extends AbstractIntegrationTest { - private static final LocalDateTime ignoredMessageTimestamp = - LocalDateTime.ofInstant(Instant.EPOCH, ZoneOffset.UTC); - @Autowired private ReaderService readerService; - @Autowired private ReaderConfigurationProperties readerConfigurationProperties; - private final String subjectFilter = ""; - private final String typeFilter = ""; + private static final LocalDateTime ignoredMessageTimestamp = LocalDateTime.ofInstant( + Instant.EPOCH, ZoneOffset.UTC); + @Autowired + private MessageStore messageStore; + @Autowired + private ReaderConfigurationProperties readerConfigurationProperties; @Test public void shouldReadMessagesSentInPlaintext() { // given - JetStreamUtils.createSubjectStream( - readerConfigurationProperties.getSubject(), - JetStreamContainerInitializer.getNatsServerUrl()); + JetStreamUtils.createSubjectStream(readerConfigurationProperties.getSubject(), JetStreamContainerInitializer.getNatsServerUrl()); String randomName = new Faker().name().fullName(); byte[] data = randomName.getBytes(StandardCharsets.UTF_8); // when - JetStreamUtils.tryToSendMessage( - data, - readerConfigurationProperties.getSubject(), - JetStreamContainerInitializer.getNatsServerUrl()); + JetStreamUtils.tryToSendMessage(data, readerConfigurationProperties.getSubject(), JetStreamContainerInitializer.getNatsServerUrl()); // then - await() - .untilAsserted( - () -> - assertThat(readerService.filter(subjectFilter, typeFilter, 0, 10, "")) - .usingRecursiveFieldByFieldElementComparator( - ComparisonConfiguration.configureReadMessageComparison()) - .contains( - new ReadMessage( - readerConfigurationProperties.getSubject(), - "", - randomName, - ignoredMessageTimestamp))); + await().untilAsserted(() -> assertThat( + messageStore.filter(Filters.empty(), 0, 10)).usingRecursiveFieldByFieldElementComparator( + ComparisonConfiguration.configureReadMessageComparison()).contains( + new ReadMessage(readerConfigurationProperties.getSubject(), "", randomName, + ignoredMessageTimestamp))); } } diff --git a/src/test/java/otter/jet/proto/AnyProtoMessageReaderTest.java b/src/test/java/otter/jet/proto/AnyProtoMessageReaderTest.java index a8f0218..5f3ee49 100644 --- a/src/test/java/otter/jet/proto/AnyProtoMessageReaderTest.java +++ b/src/test/java/otter/jet/proto/AnyProtoMessageReaderTest.java @@ -13,7 +13,6 @@ import otter.jet.JetStreamUtils; import otter.jet.reader.ReadMessage; import otter.jet.reader.ReaderConfigurationProperties; -import otter.jet.reader.ReaderService; import otter.jet.assertions.ComparisonConfiguration; import otter.jet.examples.RandomProtoPersonGenerator; import org.json.JSONArray; @@ -22,23 +21,23 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.TestPropertySource; import otter.jet.examples.protobuf.PersonProtos.Person; +import otter.jet.store.Filters; +import otter.jet.store.MessageStore; @TestPropertySource( properties = { "read.mode=proto", "read.subject=any_person", - "read.proto.pathToDescriptor=src/test/resources/person.desc" + "read.proto.pathToDescriptor=src/test/resources/person.desc", + "read.beginTimestamp=" }) class AnyProtoMessageReaderTest extends AbstractIntegrationTest { private static final LocalDateTime ignoredMessageTimestamp = LocalDateTime.ofInstant(Instant.EPOCH, ZoneOffset.UTC); - @Autowired private ReaderService readerService; + @Autowired private MessageStore messageStore; @Autowired private ReaderConfigurationProperties readerConfigurationProperties; - private final String subjectFilter = ""; - private final String typeFilter = ""; - @Test public void shouldReadProtoMessageSentAsAny() { // given @@ -58,7 +57,7 @@ public void shouldReadProtoMessageSentAsAny() { await() .untilAsserted( () -> - assertThat(readerService.filter(subjectFilter, typeFilter, 0, 10, "")) + assertThat(messageStore.filter(Filters.empty(), 0, 10)) .usingRecursiveFieldByFieldElementComparator( ComparisonConfiguration.configureReadMessageComparisonWithJSONBody()) .contains( diff --git a/src/test/java/otter/jet/proto/SimpleProtoMessageReaderTest.java b/src/test/java/otter/jet/proto/SimpleProtoMessageReaderTest.java index 43cf7b1..0927859 100644 --- a/src/test/java/otter/jet/proto/SimpleProtoMessageReaderTest.java +++ b/src/test/java/otter/jet/proto/SimpleProtoMessageReaderTest.java @@ -1,44 +1,43 @@ package otter.jet.proto; -import static org.assertj.core.api.Assertions.assertThat; -import static org.awaitility.Awaitility.await; - -import java.time.Instant; -import java.time.LocalDateTime; -import java.time.ZoneOffset; - -import otter.jet.AbstractIntegrationTest; -import otter.jet.JetStreamContainerInitializer; -import otter.jet.JetStreamUtils; -import otter.jet.reader.ReadMessage; -import otter.jet.reader.ReaderConfigurationProperties; -import otter.jet.reader.ReaderService; -import otter.jet.assertions.ComparisonConfiguration; -import otter.jet.examples.RandomProtoPersonGenerator; import org.json.JSONArray; import org.json.JSONObject; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.TestPropertySource; +import otter.jet.AbstractIntegrationTest; +import otter.jet.JetStreamContainerInitializer; +import otter.jet.JetStreamUtils; +import otter.jet.assertions.ComparisonConfiguration; +import otter.jet.examples.RandomProtoPersonGenerator; import otter.jet.examples.protobuf.PersonProtos.Person; +import otter.jet.reader.ReadMessage; +import otter.jet.reader.ReaderConfigurationProperties; +import otter.jet.store.Filters; +import otter.jet.store.MessageStore; + +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneOffset; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.awaitility.Awaitility.await; @TestPropertySource( properties = { "read.mode=proto", "read.subject=typed_person", "read.proto.messageTypeName=protobuf.Person", - "read.proto.pathToDescriptor=src/test/resources/person.desc" + "read.proto.pathToDescriptor=src/test/resources/person.desc", + "read.beginTimestamp=" }) class SimpleProtoMessageReaderTest extends AbstractIntegrationTest { private static final LocalDateTime ignoredMessageTimestamp = LocalDateTime.ofInstant(Instant.EPOCH, ZoneOffset.UTC); - @Autowired private ReaderService readerService; + @Autowired private MessageStore messageStore; @Autowired private ReaderConfigurationProperties readerConfigurationProperties; - private final String subjectFilter = ""; - private final String typeFilter = ""; - @Test public void shouldReadProtoMessageSentAsSpecificType() { // given @@ -58,7 +57,7 @@ public void shouldReadProtoMessageSentAsSpecificType() { await() .untilAsserted( () -> - assertThat(readerService.filter(subjectFilter, typeFilter, 0, 10, "")) + assertThat(messageStore.filter(Filters.empty(), 0, 10)) .usingRecursiveFieldByFieldElementComparator( ComparisonConfiguration.configureReadMessageComparisonWithJSONBody()) .contains( diff --git a/src/test/java/otter/jet/store/MessageStoreTest.java b/src/test/java/otter/jet/store/MessageStoreTest.java new file mode 100644 index 0000000..a7a2985 --- /dev/null +++ b/src/test/java/otter/jet/store/MessageStoreTest.java @@ -0,0 +1,102 @@ +package otter.jet.store; + +import org.junit.jupiter.api.Test; +import otter.jet.reader.ReadMessage; + +import java.time.LocalDateTime; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class MessageStoreTest { + + @Test + public void limitShouldWork() { + // Given + MessageStore store = new DefaultMessageStore(5); + + // When + store.add(new ReadMessage("test", "test", "1", LocalDateTime.now())); + store.add(new ReadMessage("test", "test", "2", LocalDateTime.now())); + store.add(new ReadMessage("test", "test", "3", LocalDateTime.now())); + store.add(new ReadMessage("test", "test", "4", LocalDateTime.now())); + store.add(new ReadMessage("test", "test", "5", LocalDateTime.now())); + store.add(new ReadMessage("test", "test", "6", LocalDateTime.now())); + + List filter = store.filter(Filters.empty(), 0, 10); + + // Then + assertThat(filter.get(0).body()).isEqualTo("6"); + assertThat(filter.get(filter.size() - 1).body()).isEqualTo("2"); + assertThat(filter.stream().anyMatch(e -> e.body().equals("1"))).isFalse(); + } + + @Test + public void shouldFilterStore() { + // Given + MessageStore store = new DefaultMessageStore(100); + + // When + store.add(new ReadMessage("test", "test", "1", LocalDateTime.now())); + store.add(new ReadMessage("test", "test", "2", LocalDateTime.now())); + store.add(new ReadMessage("test-1", "test", "3", LocalDateTime.now())); + store.add(new ReadMessage("test-1", "test", "4", LocalDateTime.now())); + store.add(new ReadMessage("test-2", "test", "5", LocalDateTime.now())); + store.add(new ReadMessage("test-3", "test", "6", LocalDateTime.now())); + + Filters filters = Filters.of("test-1"); + List filter = store.filter(filters, 0, 10); + + // Then + assertThat(filter).hasSize(2); + assertThat(filter.get(0).body()).isEqualTo("4"); + assertThat(filter.get(1).body()).isEqualTo("3"); + } + + @Test + public void shouldUseAllFiltersStore() { + // Given + MessageStore store = new DefaultMessageStore(100); + + // When + store.add(new ReadMessage("test", "test", "1", LocalDateTime.now())); + store.add(new ReadMessage("test", "test", "2", LocalDateTime.now())); + store.add(new ReadMessage("test-1", "test", "3", LocalDateTime.now())); + store.add(new ReadMessage("test-1", "test", "4", LocalDateTime.now())); + store.add(new ReadMessage("test-2", "test", "5", LocalDateTime.now())); + store.add(new ReadMessage("test-3", "test", "6", LocalDateTime.now())); + + Filters filters = Filters.of("test-1", "test", "3"); + Filters filtersAll = Filters.of("test-1", "test", "5"); + List filter = store.filter(filters, 0, 10); + List empty = store.filter(filtersAll, 0, 10); + + // Then + assertThat(filter).hasSize(1); + assertThat(filter.get(0).body()).isEqualTo("3"); + assertThat(empty).isEmpty(); + } + + + @Test + public void shouldUsePageAndSize() { + // Given + MessageStore store = new DefaultMessageStore(100); + + // When + store.add(new ReadMessage("test", "test", "1", LocalDateTime.now())); + store.add(new ReadMessage("test", "test", "2", LocalDateTime.now())); + store.add(new ReadMessage("test-1", "test", "3", LocalDateTime.now())); + store.add(new ReadMessage("test-1", "test", "4", LocalDateTime.now())); + store.add(new ReadMessage("test-2", "test", "5", LocalDateTime.now())); + store.add(new ReadMessage("test-3", "test", "6", LocalDateTime.now())); + + List filter = store.filter(Filters.empty(), 1, 3); + + // Then + assertThat(filter).hasSize(3); + assertThat(filter.get(0).body()).isEqualTo("3"); + assertThat(filter.get(1).body()).isEqualTo("2"); + assertThat(filter.get(2).body()).isEqualTo("1"); + } +} diff --git a/src/test/resources/application-local.yml b/src/test/resources/application-local.yml index 3c3b48b..adf5b63 100644 --- a/src/test/resources/application-local.yml +++ b/src/test/resources/application-local.yml @@ -1,5 +1,6 @@ read: mode: "proto" + beginTimestamp: "" proto: pathToDescriptor: "src/test/resources/person.desc" subject: "*"