diff --git a/data/data-mongodb/README.adoc b/data/data-mongodb/README.adoc new file mode 100644 index 0000000..7711e5a --- /dev/null +++ b/data/data-mongodb/README.adoc @@ -0,0 +1 @@ +Tests if Spring Data MongoDB with sync client is working. diff --git a/data/data-mongodb/build.gradle b/data/data-mongodb/build.gradle new file mode 100644 index 0000000..d6a8a57 --- /dev/null +++ b/data/data-mongodb/build.gradle @@ -0,0 +1,22 @@ +plugins { + id "java" + id "org.springframework.boot" + id "org.springframework.cr.smoke-test" +} + +dependencies { + implementation(platform(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES)) + implementation("org.springframework.boot:spring-boot-starter-data-mongodb") + + implementation("org.crac:crac:$cracVersion") + implementation(project(":cr-listener")) + + testImplementation("org.springframework.boot:spring-boot-starter-test") + + appTestImplementation(project(":cr-smoke-test-support")) + appTestImplementation("org.awaitility:awaitility:4.2.0") +} + +crSmokeTest { + webApplication = false +} diff --git a/data/data-mongodb/docker-compose.yml b/data/data-mongodb/docker-compose.yml new file mode 100644 index 0000000..89a9e70 --- /dev/null +++ b/data/data-mongodb/docker-compose.yml @@ -0,0 +1,6 @@ +version: '3.1' +services: + mongo: + image: 'mongo:7' + ports: + - '27017' diff --git a/data/data-mongodb/src/appTest/java/com/example/data/mongodb/DataMongondbApplicationTests.java b/data/data-mongodb/src/appTest/java/com/example/data/mongodb/DataMongondbApplicationTests.java new file mode 100644 index 0000000..f193a04 --- /dev/null +++ b/data/data-mongodb/src/appTest/java/com/example/data/mongodb/DataMongondbApplicationTests.java @@ -0,0 +1,38 @@ +/* + * Copyright 2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.example.data.mongodb; + +import static org.assertj.core.api.Assertions.*; + +import java.time.Duration; + +import org.awaitility.Awaitility; +import org.junit.jupiter.api.Test; +import org.springframework.cr.smoketest.support.assertj.AssertableOutput; +import org.springframework.cr.smoketest.support.junit.ApplicationTest; + +@ApplicationTest +public class DataMongondbApplicationTests { + + @Test + void connectionTest(AssertableOutput output) { + Awaitility.await().atMost(Duration.ofSeconds(10)).untilAsserted(() -> { + assertThat(output).hasLineMatching("Starting DataReader: was (INITIALIZED|STOPPED)"); + assertThat(output).hasLineMatching("count \\d+: Author\\{id='id-\\d', name='.*'}"); + }); + } + +} diff --git a/data/data-mongodb/src/main/java/com/example/data/mongodb/Author.java b/data/data-mongodb/src/main/java/com/example/data/mongodb/Author.java new file mode 100644 index 0000000..f04e6af --- /dev/null +++ b/data/data-mongodb/src/main/java/com/example/data/mongodb/Author.java @@ -0,0 +1,48 @@ +/* + * Copyright 2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.example.data.mongodb; + +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; + +@Document +public class Author { + + @Id + private final String id; + + private final String name; + + public Author(String id, String name) { + + this.id = id; + this.name = name; + } + + public String getId() { + return id; + } + + public String getName() { + return name; + } + + @Override + public String toString() { + return "Author{" + "id='" + id + "', name='" + name + '\'' + '}'; + } + +} diff --git a/data/data-mongodb/src/main/java/com/example/data/mongodb/AuthorRepository.java b/data/data-mongodb/src/main/java/com/example/data/mongodb/AuthorRepository.java new file mode 100644 index 0000000..e8abe8a --- /dev/null +++ b/data/data-mongodb/src/main/java/com/example/data/mongodb/AuthorRepository.java @@ -0,0 +1,22 @@ +/* + * Copyright 2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.example.data.mongodb; + +import org.springframework.data.repository.ListCrudRepository; + +public interface AuthorRepository extends ListCrudRepository { + +} diff --git a/data/data-mongodb/src/main/java/com/example/data/mongodb/DataMongodbApplication.java b/data/data-mongodb/src/main/java/com/example/data/mongodb/DataMongodbApplication.java new file mode 100644 index 0000000..a3d9883 --- /dev/null +++ b/data/data-mongodb/src/main/java/com/example/data/mongodb/DataMongodbApplication.java @@ -0,0 +1,28 @@ +/* + * Copyright 2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.example.data.mongodb; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class DataMongodbApplication { + + public static void main(String[] args) throws InterruptedException { + SpringApplication.run(DataMongodbApplication.class, args); + } + +} diff --git a/data/data-mongodb/src/main/java/com/example/data/mongodb/DataReader.java b/data/data-mongodb/src/main/java/com/example/data/mongodb/DataReader.java new file mode 100644 index 0000000..5c3e3cf --- /dev/null +++ b/data/data-mongodb/src/main/java/com/example/data/mongodb/DataReader.java @@ -0,0 +1,102 @@ +/* + * Copyright 2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.example.data.mongodb; + +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.SmartLifecycle; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import org.springframework.util.ObjectUtils; + +@Component +@EnableScheduling +class DataReader implements SmartLifecycle { + + private final Object lifecycleMonitor = new Object(); + + private final AtomicInteger counter = new AtomicInteger(0); + + private State state = State.INITIALIZED; + + private List authorIds; + + @Autowired + private AuthorRepository authorRepository; + + enum State { + + INITIALIZED, STARTED, STOPPED + + } + + @Override + public void start() { + + synchronized (lifecycleMonitor) { + switch (state) { + case INITIALIZED, STOPPED -> { + System.out.printf("Starting DataReader: was %s\n", state); + if (ObjectUtils.isEmpty(authorIds)) { + authorIds = insertAuthors().stream().map(Author::getId).collect(Collectors.toList()); + } + state = State.STARTED; + } + } + } + } + + @Scheduled(fixedDelay = 1000) + public void scheduled() { + + if (isRunning()) { + + int count = counter.incrementAndGet(); + Author author = authorRepository.findById(authorIds.get(count % 3)).orElse(null); + System.out.printf("count %03d: %s\n", count, author); + } + } + + @Override + public void stop() { + + synchronized (lifecycleMonitor) { + switch (state) { + case INITIALIZED, STARTED -> { + System.out.printf("Stopping DataReader: was %s\n", state); + state = State.STOPPED; + } + } + } + } + + @Override + public boolean isRunning() { + return State.STARTED.equals(state); + } + + private List insertAuthors() { + + return authorRepository.saveAll(List.of(new Author("id-1", "Brandon Sanderson"), // + new Author("id-2", "Brent Weeks"), // + new Author("id-3", "Peter V. Brett"))); + } + +} diff --git a/data/data-mongodb/src/main/resources/application.properties b/data/data-mongodb/src/main/resources/application.properties new file mode 100644 index 0000000..377c694 --- /dev/null +++ b/data/data-mongodb/src/main/resources/application.properties @@ -0,0 +1,2 @@ +spring.data.mongodb.host=${MONGO_HOST:localhost} +spring.data.mongodb.port=${MONGO_PORT_27017:27017}