diff --git a/2022-05/spring-11-data-jpa/solution-01/src/main/java/ru/otus/springdata/repository/EmailRepository.java b/2022-05/spring-11-data-jpa/solution-01/src/main/java/ru/otus/springdata/repository/EmailRepository.java index 788feda5..50b72f9b 100644 --- a/2022-05/spring-11-data-jpa/solution-01/src/main/java/ru/otus/springdata/repository/EmailRepository.java +++ b/2022-05/spring-11-data-jpa/solution-01/src/main/java/ru/otus/springdata/repository/EmailRepository.java @@ -5,8 +5,8 @@ import ru.otus.springdata.domain.Email; import java.util.List; -public interface EmailRepository extends JpaRepository { +public interface EmailRepository { - @Override + //@Override List findAll(); } diff --git a/2022-11/spring-30/.gitignore b/2022-11/spring-30/.gitignore new file mode 100644 index 00000000..549e00a2 --- /dev/null +++ b/2022-11/spring-30/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/2022-11/spring-30/pom.xml b/2022-11/spring-30/pom.xml new file mode 100644 index 00000000..56dbc7bd --- /dev/null +++ b/2022-11/spring-30/pom.xml @@ -0,0 +1,17 @@ + + + 4.0.0 + + ru.otus + spring-30 + 1.0 + + pom + + + spring-30-exercise + spring-30-solution + + diff --git a/2022-11/spring-30/spring-30-exercise/pom.xml b/2022-11/spring-30/spring-30-exercise/pom.xml new file mode 100644 index 00000000..0ea46312 --- /dev/null +++ b/2022-11/spring-30/spring-30-exercise/pom.xml @@ -0,0 +1,54 @@ + + + 4.0.0 + + ru.otus + spring-30-exercise + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 2.7.9 + + + + + 11 + 11 + UTF-8 + + + + + org.springframework.boot + spring-boot-starter-integration + + + org.springframework + spring-messaging + + + + org.springframework.boot + spring-boot-starter-test + + + + org.projectlombok + lombok + true + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + diff --git a/2022-11/spring-30/spring-30-exercise/src/main/java/ru/otus/spring/integration/App.java b/2022-11/spring-30/spring-30-exercise/src/main/java/ru/otus/spring/integration/App.java new file mode 100644 index 00000000..f39acb46 --- /dev/null +++ b/2022-11/spring-30/spring-30-exercise/src/main/java/ru/otus/spring/integration/App.java @@ -0,0 +1,70 @@ +package ru.otus.spring.integration; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.integration.annotation.IntegrationComponentScan; +import org.springframework.integration.channel.QueueChannel; +import org.springframework.integration.dsl.MessageChannels; +import org.springframework.integration.support.MessageBuilder; +import org.springframework.messaging.PollableChannel; +import org.springframework.messaging.SubscribableChannel; + +import lombok.extern.slf4j.Slf4j; + + +@SpringBootApplication +@IntegrationComponentScan +@Slf4j +public class App { + + public static void main(String[] args) throws InterruptedException { + ConfigurableApplicationContext ctx = SpringApplication.run(App.class, args); + + PollableChannel queueChannel = ctx.getBean("queueChannel", PollableChannel.class); + SubscribableChannel directChannel = ctx.getBean("directChannel", SubscribableChannel.class); + + + log.warn("INIT"); + for (int i = 0; i < 10; i++) { + queueChannel.send(MessageBuilder.withPayload("Start " + i).build()); + } + log.warn("INIT FINISH"); + Thread.sleep(5000); + + log.warn("START"); + directChannel.subscribe((msg) -> log.warn("Receive msg: {}", msg)); + new Thread(() -> { + while (true) { + directChannel.send(queueChannel.receive()); + } + }).start(); + log.warn("START FINISH"); + Thread.sleep(5000); + + log.warn(""); + queueChannel.send(MessageBuilder.withPayload("Hello").build()); + Thread.sleep(5000); + + log.warn(""); + queueChannel.send(MessageBuilder.withPayload("Hello2").build()); + Thread.sleep(5000); + + log.warn(""); + queueChannel.send(MessageBuilder.withPayload("Hello3").build()); + + } + + @Bean + public PollableChannel queueChannel() { + return new QueueChannel(10); + } + + @Bean + public SubscribableChannel directChannel() { + return MessageChannels.direct("channel2").get(); + } + +} + diff --git a/2022-11/spring-30/spring-30-exercise/src/main/resources/application.yml b/2022-11/spring-30/spring-30-exercise/src/main/resources/application.yml new file mode 100644 index 00000000..1a9aeb48 --- /dev/null +++ b/2022-11/spring-30/spring-30-exercise/src/main/resources/application.yml @@ -0,0 +1,5 @@ +logging: + level: + root: info + + org.springframework.integration: debug \ No newline at end of file diff --git a/2022-11/spring-30/spring-30-exercise/src/test/java/ru/otus/spring/integration/MessagesTest.java b/2022-11/spring-30/spring-30-exercise/src/test/java/ru/otus/spring/integration/MessagesTest.java new file mode 100644 index 00000000..ffff36c7 --- /dev/null +++ b/2022-11/spring-30/spring-30-exercise/src/test/java/ru/otus/spring/integration/MessagesTest.java @@ -0,0 +1,98 @@ +package ru.otus.spring.integration; + + +import org.junit.jupiter.api.Test; +import org.springframework.messaging.Message; +import org.springframework.messaging.MessageHeaders; +import org.springframework.messaging.support.ErrorMessage; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.messaging.support.MessageBuilder; + +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + + +@SuppressWarnings("all") +public class MessagesTest { + + @Test + public void testCreateSimpleGenericMessage() { + // TODO: Создайте сообщение с payload-ом "Hello" с помощью конструктора + Message message = null; + + assertNotNull(message); + assertEquals(GenericMessage.class, message.getClass()); + assertNotNull(message.getPayload()); + assertEquals("Hello", message.getPayload()); + } + + @Test + public void testCreateGenericMessage() { + // TODO: Создайте сообщение с пользователем с помощью конструктора + Message message = null; + + assertNotNull(message); + assertEquals(GenericMessage.class, message.getClass()); + assertNotNull(message.getPayload()); + assertEquals(new User("John", 23), message.getPayload()); + } + + @Test + public void testGenericMessageWithHeaders() { + // TODO: Создайте сообщение с payload-ом "Hello" и header-ом "to":"World" + Map headers = null; + Message message = null; + + assertNotNull(message); + assertEquals("Hello", message.getPayload()); + assertEquals("World", message.getHeaders().get("to", String.class)); + } + + @Test + public void testGenericMessageWithMessageHeaders() { + // TODO: Создайте сообщение с payload-ом "Hello" и header-ом "to":"World" + MessageHeaders headers = null; + Message message = null; + + assertNotNull(message); + assertEquals("Hello", message.getPayload()); + assertEquals("World", message.getHeaders().get("to", String.class)); + } + + @Test + public void testErrorMessage() { + // TODO: Создайте сообщение об ошибки с объектом NullPointerException внутри + Message errorMessage = null; + + assertNotNull(errorMessage); + assertEquals(ErrorMessage.class, errorMessage.getClass()); + assertEquals(NullPointerException.class, errorMessage.getPayload().getClass()); + } + + @Test + public void testMessageBuilder() { + // TODO: Создайте сообщение с payload-ом "Hello" и header-ом "to":"World" с помощью MessageBuilder + Message message = null; + + assertNotNull(message); + assertEquals("Hello", message.getPayload()); + assertEquals("World", message.getHeaders().get("to", String.class)); + } + + @Test + public void testBuildFromMessage() { + Message original = MessageBuilder + .withPayload(new User("Kate", 30)) + .setHeader("processor", "userService") + .build(); + + // TODO: Создайте новое сообщение с теми же payload и header-ами c помощью MessageBuilder + Message newMessage = null; + + assertNotNull(newMessage); + assertEquals(original.getPayload(), newMessage.getPayload()); + assertEquals(original.getHeaders().get("processor"), newMessage.getHeaders().get("processor")); + } +} diff --git a/2022-11/spring-30/spring-30-exercise/src/test/java/ru/otus/spring/integration/User.java b/2022-11/spring-30/spring-30-exercise/src/test/java/ru/otus/spring/integration/User.java new file mode 100644 index 00000000..5dd81ef8 --- /dev/null +++ b/2022-11/spring-30/spring-30-exercise/src/test/java/ru/otus/spring/integration/User.java @@ -0,0 +1,36 @@ +package ru.otus.spring.integration; + +import java.util.Objects; + +public class User { + + private final String name; + private final int age; + + public User(String name, int age) { + this.name = name; + this.age = age; + } + + public String getName() { + return name; + } + + public int getAge() { + return age; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof User)) return false; + User user = (User) o; + return age == user.age && + Objects.equals(name, user.name); + } + + @Override + public int hashCode() { + return Objects.hash(name, age); + } +} diff --git a/2022-11/spring-30/spring-30-solution/pom.xml b/2022-11/spring-30/spring-30-solution/pom.xml new file mode 100644 index 00000000..d280368c --- /dev/null +++ b/2022-11/spring-30/spring-30-solution/pom.xml @@ -0,0 +1,52 @@ + + + 4.0.0 + + ru.otus + spring-30-solution + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 2.7.9 + + + + 11 + 11 + UTF-8 + + + + + org.springframework.boot + spring-boot-starter-integration + + + org.springframework + spring-messaging + + + + org.springframework.boot + spring-boot-starter-test + + + org.projectlombok + lombok + true + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + diff --git a/2022-11/spring-30/spring-30-solution/src/main/java/ru/otus/spring/integration/App.java b/2022-11/spring-30/spring-30-solution/src/main/java/ru/otus/spring/integration/App.java new file mode 100644 index 00000000..49630427 --- /dev/null +++ b/2022-11/spring-30/spring-30-solution/src/main/java/ru/otus/spring/integration/App.java @@ -0,0 +1,70 @@ +package ru.otus.spring.integration; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.integration.annotation.IntegrationComponentScan; +import org.springframework.integration.channel.QueueChannel; +import org.springframework.integration.dsl.MessageChannels; +import org.springframework.integration.support.MessageBuilder; +import org.springframework.messaging.PollableChannel; +import org.springframework.messaging.SubscribableChannel; + +import lombok.extern.slf4j.Slf4j; + + +@SpringBootApplication +@IntegrationComponentScan +@Slf4j +public class App { + + public static void main(String[] args) throws InterruptedException { + ConfigurableApplicationContext ctx = SpringApplication.run(App.class, args); + + PollableChannel queueChannel = ctx.getBean("queueChannel", PollableChannel.class); + SubscribableChannel directChannel = ctx.getBean("directChannel", SubscribableChannel.class); + + + log.warn("INIT"); + for (int i = 0; i < 10; i++) { + queueChannel.send(MessageBuilder.withPayload("Start " + i).build()); + } + log.warn("INIT FINISH"); + Thread.sleep(5000); + + log.warn("START"); + directChannel.subscribe((msg) -> log.warn("Receive msg: {}", msg)); + new Thread(() -> { + while (true) { + directChannel.send(queueChannel.receive()); + } + }).start(); + log.warn("START FINISH"); + Thread.sleep(5000); + + log.warn(""); + queueChannel.send(MessageBuilder.withPayload("Hello").build()); + Thread.sleep(5000); + + log.warn(""); + queueChannel.send(MessageBuilder.withPayload("Hello2").build()); + Thread.sleep(5000); + + log.warn(""); + queueChannel.send(MessageBuilder.withPayload("Hello3").build()); + + } + + @Bean + public PollableChannel queueChannel() { + return new QueueChannel(10); + } + + @Bean + public SubscribableChannel directChannel() { + return MessageChannels.direct("channel2").get(); + } + +} + diff --git a/2022-11/spring-30/spring-30-solution/src/main/resources/application.yml b/2022-11/spring-30/spring-30-solution/src/main/resources/application.yml new file mode 100644 index 00000000..1a9aeb48 --- /dev/null +++ b/2022-11/spring-30/spring-30-solution/src/main/resources/application.yml @@ -0,0 +1,5 @@ +logging: + level: + root: info + + org.springframework.integration: debug \ No newline at end of file diff --git a/2022-11/spring-30/spring-30-solution/src/test/java/ru/otus/spring/integration/MessagesTest.java b/2022-11/spring-30/spring-30-solution/src/test/java/ru/otus/spring/integration/MessagesTest.java new file mode 100644 index 00000000..496c003f --- /dev/null +++ b/2022-11/spring-30/spring-30-solution/src/test/java/ru/otus/spring/integration/MessagesTest.java @@ -0,0 +1,101 @@ +package ru.otus.spring.integration; + + +import org.junit.jupiter.api.Test; +import org.springframework.messaging.Message; +import org.springframework.messaging.MessageHeaders; +import org.springframework.messaging.support.ErrorMessage; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.messaging.support.MessageBuilder; + +import java.util.Collections; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + + +@SuppressWarnings("all") +public class MessagesTest { + + @Test + public void testCreateSimpleGenericMessage() { + // TODO: Создайте сообщение с payload-ом "Hello" с помощью конструктора + Message message = new GenericMessage("Hello"); + + assertNotNull(message); + assertEquals(GenericMessage.class, message.getClass()); + assertNotNull(message.getPayload()); + assertEquals("Hello", message.getPayload()); + } + + @Test + public void testCreateGenericMessage() { + // TODO: Создайте сообщение с пользователем с помощью конструктора + Message message = new GenericMessage(new User("John", 23)); + + assertNotNull(message); + assertEquals(GenericMessage.class, message.getClass()); + assertNotNull(message.getPayload()); + assertEquals(new User("John", 23), message.getPayload()); + } + + @Test + public void testGenericMessageWithHeaders() { + // TODO: Создайте сообщение с payload-ом "Hello" и header-ом "to":"World" + Map headers = Collections.singletonMap("to", "World"); + Message message = new GenericMessage<>("Hello", headers); + + assertNotNull(message); + assertEquals("Hello", message.getPayload()); + assertEquals("World", message.getHeaders().get("to", String.class)); + } + + @Test + public void testGenericMessageWithMessageHeaders() { + // TODO: Создайте сообщение с payload-ом "Hello" и header-ом "to":"World" + MessageHeaders headers = new MessageHeaders(Collections.singletonMap("to", "World")); + Message message = new GenericMessage<>("Hello", headers); + + assertNotNull(message); + assertEquals("Hello", message.getPayload()); + assertEquals("World", message.getHeaders().get("to", String.class)); + } + + @Test + public void testErrorMessage() { + // TODO: Создайте сообщение об ошибки с объектом NullPointerException внутри + Message errorMessage = new ErrorMessage(new NullPointerException()); + + assertNotNull(errorMessage); + assertEquals(ErrorMessage.class, errorMessage.getClass()); + assertEquals(NullPointerException.class, errorMessage.getPayload().getClass()); + } + + @Test + public void testMessageBuilder() { + // TODO: Создайте сообщение с payload-ом "Hello" и header-ом "to":"World" с помощью MessageBuilder + Message message = MessageBuilder.withPayload("Hello") + .setHeader("to", "World") + .build(); + + assertNotNull(message); + assertEquals("Hello", message.getPayload()); + assertEquals("World", message.getHeaders().get("to", String.class)); + } + + @Test + public void testBuildFromMessage() { + Message original = MessageBuilder + .withPayload(new User("Kate", 30)) + .setHeader("processor", "userService") + .build(); + + // TODO: Создайте новое сообщение с теми же payload и header-ами c помощью MessageBuilder + Message newMessage = MessageBuilder.fromMessage(original).build(); + + assertNotNull(newMessage); + assertEquals(original.getPayload(), newMessage.getPayload()); + assertEquals(original.getHeaders().get("processor"), newMessage.getHeaders().get("processor")); + } +} diff --git a/2022-11/spring-30/spring-30-solution/src/test/java/ru/otus/spring/integration/User.java b/2022-11/spring-30/spring-30-solution/src/test/java/ru/otus/spring/integration/User.java new file mode 100644 index 00000000..5dd81ef8 --- /dev/null +++ b/2022-11/spring-30/spring-30-solution/src/test/java/ru/otus/spring/integration/User.java @@ -0,0 +1,36 @@ +package ru.otus.spring.integration; + +import java.util.Objects; + +public class User { + + private final String name; + private final int age; + + public User(String name, int age) { + this.name = name; + this.age = age; + } + + public String getName() { + return name; + } + + public int getAge() { + return age; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof User)) return false; + User user = (User) o; + return age == user.age && + Objects.equals(name, user.name); + } + + @Override + public int hashCode() { + return Objects.hash(name, age); + } +} diff --git a/2023-01/spring-15/spring-data-keyvalue-class-work/pom.xml b/2023-01/spring-15/spring-data-keyvalue-class-work/pom.xml new file mode 100644 index 00000000..b2fbb1c3 --- /dev/null +++ b/2023-01/spring-15/spring-data-keyvalue-class-work/pom.xml @@ -0,0 +1,17 @@ + + + 4.0.0 + + ru.otus + spring-data-keyvalue-class-work + 1.0 + + pom + + + spring-data-keyvalue-exercise + spring-data-keyvalue-solution + + diff --git a/2023-01/spring-15/spring-data-keyvalue-class-work/spring-data-keyvalue-exercise/pom.xml b/2023-01/spring-15/spring-data-keyvalue-class-work/spring-data-keyvalue-exercise/pom.xml new file mode 100644 index 00000000..180b1a60 --- /dev/null +++ b/2023-01/spring-15/spring-data-keyvalue-class-work/spring-data-keyvalue-exercise/pom.xml @@ -0,0 +1,43 @@ + + + 4.0.0 + + ru.otus + spring-data-keyvalue-exercise + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 2.2.1.RELEASE + + + + + 11 + 11 + + + + + org.springframework.boot + spring-boot-starter + + + + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + diff --git a/2023-01/spring-15/spring-data-keyvalue-class-work/spring-data-keyvalue-exercise/src/main/java/ru/otus/spring/Main.java b/2023-01/spring-15/spring-data-keyvalue-class-work/spring-data-keyvalue-exercise/src/main/java/ru/otus/spring/Main.java new file mode 100644 index 00000000..d0d34e97 --- /dev/null +++ b/2023-01/spring-15/spring-data-keyvalue-class-work/spring-data-keyvalue-exercise/src/main/java/ru/otus/spring/Main.java @@ -0,0 +1,29 @@ +package ru.otus.spring; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.data.map.repository.config.EnableMapRepositories; +import ru.otus.spring.domain.Person; +import ru.otus.spring.repostory.PersonRepository; + +import javax.annotation.PostConstruct; + +@SpringBootApplication +public class Main { + + public static void main(String[] args) { + SpringApplication.run(Main.class); + } + + @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection") + @Autowired + private PersonRepository repository; + + @PostConstruct + public void init() { + repository.save(new Person(1, "Pushkin")); + + repository.findAll(); + } +} diff --git a/2023-01/spring-15/spring-data-keyvalue-class-work/spring-data-keyvalue-exercise/src/main/java/ru/otus/spring/domain/Email.java b/2023-01/spring-15/spring-data-keyvalue-class-work/spring-data-keyvalue-exercise/src/main/java/ru/otus/spring/domain/Email.java new file mode 100644 index 00000000..c1e24a7d --- /dev/null +++ b/2023-01/spring-15/spring-data-keyvalue-class-work/spring-data-keyvalue-exercise/src/main/java/ru/otus/spring/domain/Email.java @@ -0,0 +1,25 @@ +package ru.otus.spring.domain; + +public class Email { + + private int id; + + private String email; + + public Email(String email) { + this.email = email; + } + + public Email(int id, String email) { + this.id = id; + this.email = email; + } + + public int getId() { + return id; + } + + public String getEmail() { + return email; + } +} diff --git a/2023-01/spring-15/spring-data-keyvalue-class-work/spring-data-keyvalue-exercise/src/main/java/ru/otus/spring/domain/Person.java b/2023-01/spring-15/spring-data-keyvalue-class-work/spring-data-keyvalue-exercise/src/main/java/ru/otus/spring/domain/Person.java new file mode 100644 index 00000000..f707e14e --- /dev/null +++ b/2023-01/spring-15/spring-data-keyvalue-class-work/spring-data-keyvalue-exercise/src/main/java/ru/otus/spring/domain/Person.java @@ -0,0 +1,35 @@ +package ru.otus.spring.domain; + +import org.springframework.data.annotation.Id; +import org.springframework.data.keyvalue.annotation.KeySpace; + +public class Person { + + private int id; + private String name; + + public Person(String name) { + this.name = name; + } + + public Person(int id, String name) { + this.id = id; + this.name = name; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/2023-01/spring-15/spring-data-keyvalue-class-work/spring-data-keyvalue-exercise/src/main/java/ru/otus/spring/repostory/PersonRepository.java b/2023-01/spring-15/spring-data-keyvalue-class-work/spring-data-keyvalue-exercise/src/main/java/ru/otus/spring/repostory/PersonRepository.java new file mode 100644 index 00000000..4b20e5b7 --- /dev/null +++ b/2023-01/spring-15/spring-data-keyvalue-class-work/spring-data-keyvalue-exercise/src/main/java/ru/otus/spring/repostory/PersonRepository.java @@ -0,0 +1,11 @@ +package ru.otus.spring.repostory; + +import org.springframework.data.repository.CrudRepository; +import ru.otus.spring.domain.Person; + +import java.util.List; + +public interface PersonRepository extends CrudRepository { + + List findAll(); +} diff --git a/2023-01/spring-15/spring-data-keyvalue-class-work/spring-data-keyvalue-solution/pom.xml b/2023-01/spring-15/spring-data-keyvalue-class-work/spring-data-keyvalue-solution/pom.xml new file mode 100644 index 00000000..7d0041e8 --- /dev/null +++ b/2023-01/spring-15/spring-data-keyvalue-class-work/spring-data-keyvalue-solution/pom.xml @@ -0,0 +1,43 @@ + + + 4.0.0 + + ru.otus + spring-data-keyvalue-solution + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 2.2.1.RELEASE + + + + + 11 + 11 + + + + + org.springframework.boot + spring-boot-starter + + + org.springframework.data + spring-data-keyvalue + 2.2.1.RELEASE + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + diff --git a/2023-01/spring-15/spring-data-keyvalue-class-work/spring-data-keyvalue-solution/src/main/java/ru/otus/spring/Main.java b/2023-01/spring-15/spring-data-keyvalue-class-work/spring-data-keyvalue-solution/src/main/java/ru/otus/spring/Main.java new file mode 100644 index 00000000..42d9078f --- /dev/null +++ b/2023-01/spring-15/spring-data-keyvalue-class-work/spring-data-keyvalue-solution/src/main/java/ru/otus/spring/Main.java @@ -0,0 +1,39 @@ +package ru.otus.spring; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.data.map.repository.config.EnableMapRepositories; +import ru.otus.spring.domain.Email; +import ru.otus.spring.domain.Person; +import ru.otus.spring.repostory.EmailRepository; +import ru.otus.spring.repostory.PersonRepository; + +import javax.annotation.PostConstruct; + +@SpringBootApplication +@EnableMapRepositories +public class Main { + + public static void main(String[] args) { + SpringApplication.run(Main.class); + } + + @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection") + @Autowired + private PersonRepository repository; + + @Autowired + private EmailRepository emailRepository; + + @PostConstruct + public void init() { + repository.save(new Person(1, "Pushkin")); + repository.save(new Person(2, "Lermontov")); + System.out.println(repository.findAll()); + + emailRepository.save(new Email(1, "alex@pushkin.com")); + emailRepository.save(new Email(2, "micha@pushkin.com")); + System.out.println(emailRepository.findAll()); + } +} diff --git a/2023-01/spring-15/spring-data-keyvalue-class-work/spring-data-keyvalue-solution/src/main/java/ru/otus/spring/domain/Email.java b/2023-01/spring-15/spring-data-keyvalue-class-work/spring-data-keyvalue-solution/src/main/java/ru/otus/spring/domain/Email.java new file mode 100644 index 00000000..86ddb0c1 --- /dev/null +++ b/2023-01/spring-15/spring-data-keyvalue-class-work/spring-data-keyvalue-solution/src/main/java/ru/otus/spring/domain/Email.java @@ -0,0 +1,37 @@ +package ru.otus.spring.domain; + +import org.springframework.data.annotation.Id; +import org.springframework.data.keyvalue.annotation.KeySpace; + +@KeySpace("email") +public class Email { + @Id + private int id; + + private String email; + + public Email(int id, String email) { + this.id = id; + this.email = email; + } + + public Email(String email) { + this.email = email; + } + + public int getId() { + return id; + } + + public String getEmail() { + return email; + } + + @Override + public String toString() { + return "Email{" + + "id=" + id + + ", email='" + email + '\'' + + '}'; + } +} diff --git a/2023-01/spring-15/spring-data-keyvalue-class-work/spring-data-keyvalue-solution/src/main/java/ru/otus/spring/domain/Person.java b/2023-01/spring-15/spring-data-keyvalue-class-work/spring-data-keyvalue-solution/src/main/java/ru/otus/spring/domain/Person.java new file mode 100644 index 00000000..b0181bd1 --- /dev/null +++ b/2023-01/spring-15/spring-data-keyvalue-class-work/spring-data-keyvalue-solution/src/main/java/ru/otus/spring/domain/Person.java @@ -0,0 +1,45 @@ +package ru.otus.spring.domain; + +import org.springframework.data.annotation.Id; +import org.springframework.data.keyvalue.annotation.KeySpace; + +@KeySpace("person") +public class Person { + + @Id + private int id; + private String name; + + public Person(int id, String name) { + this.id = id; + this.name = name; + } + + public Person(String name) { + this.name = name; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String toString() { + return "Person{" + + "id=" + id + + ", name='" + name + '\'' + + '}'; + } +} diff --git a/2023-01/spring-15/spring-data-keyvalue-class-work/spring-data-keyvalue-solution/src/main/java/ru/otus/spring/repostory/EmailRepository.java b/2023-01/spring-15/spring-data-keyvalue-class-work/spring-data-keyvalue-solution/src/main/java/ru/otus/spring/repostory/EmailRepository.java new file mode 100644 index 00000000..6ce870a2 --- /dev/null +++ b/2023-01/spring-15/spring-data-keyvalue-class-work/spring-data-keyvalue-solution/src/main/java/ru/otus/spring/repostory/EmailRepository.java @@ -0,0 +1,14 @@ +package ru.otus.spring.repostory; + +import org.springframework.data.keyvalue.repository.KeyValueRepository; +import org.springframework.stereotype.Repository; +import ru.otus.spring.domain.Email; +import ru.otus.spring.domain.Person; + +import java.util.List; + +public interface EmailRepository { + + List findAll(); + Email save(Email email); +} diff --git a/2023-01/spring-15/spring-data-keyvalue-class-work/spring-data-keyvalue-solution/src/main/java/ru/otus/spring/repostory/EmailRepositoryImpl.java b/2023-01/spring-15/spring-data-keyvalue-class-work/spring-data-keyvalue-solution/src/main/java/ru/otus/spring/repostory/EmailRepositoryImpl.java new file mode 100644 index 00000000..e2aa75a1 --- /dev/null +++ b/2023-01/spring-15/spring-data-keyvalue-class-work/spring-data-keyvalue-solution/src/main/java/ru/otus/spring/repostory/EmailRepositoryImpl.java @@ -0,0 +1,27 @@ +package ru.otus.spring.repostory; + +import org.springframework.data.keyvalue.core.KeyValueOperations; +import org.springframework.stereotype.Repository; +import ru.otus.spring.domain.Email; + +import java.util.List; + +@Repository +public class EmailRepositoryImpl implements EmailRepository { + + final private KeyValueOperations keyValueTemplate; + + public EmailRepositoryImpl(KeyValueOperations keyValueTemplate) { + this.keyValueTemplate = keyValueTemplate; + } + + @Override + public List findAll() { + return (List) keyValueTemplate.findAll(Email.class); + } + + @Override + public Email save(Email email) { + return keyValueTemplate.insert(email); + } +} diff --git a/2023-01/spring-15/spring-data-keyvalue-class-work/spring-data-keyvalue-solution/src/main/java/ru/otus/spring/repostory/PersonRepository.java b/2023-01/spring-15/spring-data-keyvalue-class-work/spring-data-keyvalue-solution/src/main/java/ru/otus/spring/repostory/PersonRepository.java new file mode 100644 index 00000000..99a93c24 --- /dev/null +++ b/2023-01/spring-15/spring-data-keyvalue-class-work/spring-data-keyvalue-solution/src/main/java/ru/otus/spring/repostory/PersonRepository.java @@ -0,0 +1,12 @@ +package ru.otus.spring.repostory; + +import org.springframework.data.keyvalue.repository.KeyValueRepository; +import org.springframework.data.repository.CrudRepository; +import ru.otus.spring.domain.Person; + +import java.util.List; + +public interface PersonRepository extends KeyValueRepository { + + List findAll(); +} diff --git a/2023-01/spring-15/spring-data-mongo-class-work/pom.xml b/2023-01/spring-15/spring-data-mongo-class-work/pom.xml new file mode 100644 index 00000000..a13c15b7 --- /dev/null +++ b/2023-01/spring-15/spring-data-mongo-class-work/pom.xml @@ -0,0 +1,17 @@ + + + 4.0.0 + + ru.otus + spring-data-mongo-class-work + 1.0 + + pom + + + spring-data-mongo-exercise + spring-data-mongo-solution + + diff --git a/2023-01/spring-15/spring-data-mongo-class-work/spring-data-mongo-exercise/pom.xml b/2023-01/spring-15/spring-data-mongo-class-work/spring-data-mongo-exercise/pom.xml new file mode 100644 index 00000000..5cb9d0e1 --- /dev/null +++ b/2023-01/spring-15/spring-data-mongo-class-work/spring-data-mongo-exercise/pom.xml @@ -0,0 +1,46 @@ + + + 4.0.0 + + ru.otus + spring-data-mongo-exercise + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 2.3.4.RELEASE + + + + + 11 + 11 + + + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-data-mongodb + + + de.flapdoodle.embed + de.flapdoodle.embed.mongo + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + diff --git a/2023-01/spring-15/spring-data-mongo-class-work/spring-data-mongo-exercise/src/main/java/ru/otus/spring/Main.java b/2023-01/spring-15/spring-data-mongo-class-work/spring-data-mongo-exercise/src/main/java/ru/otus/spring/Main.java new file mode 100644 index 00000000..d67d7972 --- /dev/null +++ b/2023-01/spring-15/spring-data-mongo-class-work/spring-data-mongo-exercise/src/main/java/ru/otus/spring/Main.java @@ -0,0 +1,31 @@ +package ru.otus.spring; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ApplicationContext; +import ru.otus.spring.domain.Person; +import ru.otus.spring.repostory.PersonRepository; + +@SpringBootApplication +public class Main { + + @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection") + @Autowired + private PersonRepository repository; + + public static void main(String[] args) throws InterruptedException { + ApplicationContext context = SpringApplication.run(Main.class); + + PersonRepository repository = context.getBean(PersonRepository.class); + + repository.save(new Person("Dostoevsky")); + + Thread.sleep(3000); + + System.out.println("\n\n\n----------------------------------------------\n\n"); + System.out.println("Авторы в БД:"); + repository.findAll().forEach(p -> System.out.println(p.getName())); + System.out.println("\n\n----------------------------------------------\n\n\n"); + } +} diff --git a/2023-01/spring-15/spring-data-mongo-class-work/spring-data-mongo-exercise/src/main/java/ru/otus/spring/domain/Person.java b/2023-01/spring-15/spring-data-mongo-class-work/spring-data-mongo-exercise/src/main/java/ru/otus/spring/domain/Person.java new file mode 100644 index 00000000..2bdc3894 --- /dev/null +++ b/2023-01/spring-15/spring-data-mongo-class-work/spring-data-mongo-exercise/src/main/java/ru/otus/spring/domain/Person.java @@ -0,0 +1,27 @@ +package ru.otus.spring.domain; + +public class Person { + + private String id; + private String name; + + public Person(String name) { + this.name = name; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/2023-01/spring-15/spring-data-mongo-class-work/spring-data-mongo-exercise/src/main/java/ru/otus/spring/repostory/PersonRepository.java b/2023-01/spring-15/spring-data-mongo-class-work/spring-data-mongo-exercise/src/main/java/ru/otus/spring/repostory/PersonRepository.java new file mode 100644 index 00000000..763a2288 --- /dev/null +++ b/2023-01/spring-15/spring-data-mongo-class-work/spring-data-mongo-exercise/src/main/java/ru/otus/spring/repostory/PersonRepository.java @@ -0,0 +1,12 @@ +package ru.otus.spring.repostory; + +import org.springframework.data.repository.CrudRepository; +import ru.otus.spring.domain.Person; + +import java.util.List; + + +public interface PersonRepository extends CrudRepository { + + List findAll(); +} diff --git a/2023-01/spring-15/spring-data-mongo-class-work/spring-data-mongo-exercise/src/main/resources/application.yml b/2023-01/spring-15/spring-data-mongo-class-work/spring-data-mongo-exercise/src/main/resources/application.yml new file mode 100644 index 00000000..9bffd5dc --- /dev/null +++ b/2023-01/spring-15/spring-data-mongo-class-work/spring-data-mongo-exercise/src/main/resources/application.yml @@ -0,0 +1,4 @@ +spring: + data: + mongodb: + database: company diff --git a/2023-01/spring-15/spring-data-mongo-class-work/spring-data-mongo-solution/pom.xml b/2023-01/spring-15/spring-data-mongo-class-work/spring-data-mongo-solution/pom.xml new file mode 100644 index 00000000..6045db5d --- /dev/null +++ b/2023-01/spring-15/spring-data-mongo-class-work/spring-data-mongo-solution/pom.xml @@ -0,0 +1,61 @@ + + + 4.0.0 + + ru.otus + spring-data-mongo-solution + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 2.3.4.RELEASE + + + + + 11 + 11 + 4.1.17 + + + + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-data-mongodb + + + de.flapdoodle.embed + de.flapdoodle.embed.mongo + + + + com.github.cloudyrock.mongock + mongock-spring-v5 + ${mongock.version} + + + + com.github.cloudyrock.mongock + mongodb-springdata-v3-driver + ${mongock.version} + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + diff --git a/2023-01/spring-15/spring-data-mongo-class-work/spring-data-mongo-solution/src/main/java/ru/otus/spring/Main.java b/2023-01/spring-15/spring-data-mongo-class-work/spring-data-mongo-solution/src/main/java/ru/otus/spring/Main.java new file mode 100644 index 00000000..fb0e8a60 --- /dev/null +++ b/2023-01/spring-15/spring-data-mongo-class-work/spring-data-mongo-solution/src/main/java/ru/otus/spring/Main.java @@ -0,0 +1,35 @@ +package ru.otus.spring; + +import com.github.cloudyrock.spring.v5.EnableMongock; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ApplicationContext; +import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; +import ru.otus.spring.domain.Person; +import ru.otus.spring.repostory.PersonRepository; + +@EnableMongock +@EnableMongoRepositories +@SpringBootApplication +public class Main { + + @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection") + @Autowired + private PersonRepository repository; + + public static void main(String[] args) throws InterruptedException { + ApplicationContext context = SpringApplication.run(Main.class); + + PersonRepository repository = context.getBean(PersonRepository.class); + + repository.save(new Person("Dostoevsky")); + + Thread.sleep(3000); + + System.out.println("\n\n\n----------------------------------------------\n\n"); + System.out.println("Авторы в БД:"); + repository.findAll().forEach(p -> System.out.println(p.getName())); + System.out.println("\n\n----------------------------------------------\n\n\n"); + } +} diff --git a/2023-01/spring-15/spring-data-mongo-class-work/spring-data-mongo-solution/src/main/java/ru/otus/spring/domain/Person.java b/2023-01/spring-15/spring-data-mongo-class-work/spring-data-mongo-solution/src/main/java/ru/otus/spring/domain/Person.java new file mode 100644 index 00000000..12cf6355 --- /dev/null +++ b/2023-01/spring-15/spring-data-mongo-class-work/spring-data-mongo-solution/src/main/java/ru/otus/spring/domain/Person.java @@ -0,0 +1,32 @@ +package ru.otus.spring.domain; + +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; + +@Document(collection = "persons") +public class Person { + + @Id + private String id; + private String name; + + public Person(String name) { + this.name = name; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/2023-01/spring-15/spring-data-mongo-class-work/spring-data-mongo-solution/src/main/java/ru/otus/spring/mongock/changelog/DatabaseChangelog.java b/2023-01/spring-15/spring-data-mongo-class-work/spring-data-mongo-solution/src/main/java/ru/otus/spring/mongock/changelog/DatabaseChangelog.java new file mode 100644 index 00000000..f9226e50 --- /dev/null +++ b/2023-01/spring-15/spring-data-mongo-class-work/spring-data-mongo-solution/src/main/java/ru/otus/spring/mongock/changelog/DatabaseChangelog.java @@ -0,0 +1,30 @@ +package ru.otus.spring.mongock.changelog; + +import com.github.cloudyrock.mongock.ChangeLog; +import com.github.cloudyrock.mongock.ChangeSet; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoDatabase; +import org.bson.Document; +import ru.otus.spring.domain.Person; +import ru.otus.spring.repostory.PersonRepository; + +@ChangeLog +public class DatabaseChangelog { + + @ChangeSet(order = "001", id = "dropDb", author = "stvort", runAlways = true) + public void dropDb(MongoDatabase db) { + db.drop(); + } + + @ChangeSet(order = "002", id = "insertLermontov", author = "ydvorzhetskiy") + public void insertLermontov(MongoDatabase db) { + MongoCollection myCollection = db.getCollection("persons"); + var doc = new Document().append("name", "Lermontov"); + myCollection.insertOne(doc); + } + + @ChangeSet(order = "003", id = "insertPushkin", author = "stvort") + public void insertPushkin(PersonRepository repository) { + repository.save(new Person("Pushkin")); + } +} diff --git a/2023-01/spring-15/spring-data-mongo-class-work/spring-data-mongo-solution/src/main/java/ru/otus/spring/repostory/PersonRepository.java b/2023-01/spring-15/spring-data-mongo-class-work/spring-data-mongo-solution/src/main/java/ru/otus/spring/repostory/PersonRepository.java new file mode 100644 index 00000000..763a2288 --- /dev/null +++ b/2023-01/spring-15/spring-data-mongo-class-work/spring-data-mongo-solution/src/main/java/ru/otus/spring/repostory/PersonRepository.java @@ -0,0 +1,12 @@ +package ru.otus.spring.repostory; + +import org.springframework.data.repository.CrudRepository; +import ru.otus.spring.domain.Person; + +import java.util.List; + + +public interface PersonRepository extends CrudRepository { + + List findAll(); +} diff --git a/2023-01/spring-15/spring-data-mongo-class-work/spring-data-mongo-solution/src/main/resources/application.yml b/2023-01/spring-15/spring-data-mongo-class-work/spring-data-mongo-solution/src/main/resources/application.yml new file mode 100644 index 00000000..dd00fa36 --- /dev/null +++ b/2023-01/spring-15/spring-data-mongo-class-work/spring-data-mongo-solution/src/main/resources/application.yml @@ -0,0 +1,10 @@ +spring: + data: + mongodb: + database: company + +mongock: + runner-type: "ApplicationRunner" # default + #runner-type: "InitializingBean" + change-logs-scan-package: + - ru.otus.spring.mongock.changelog