diff --git a/otus_2019_06/hw13-maven/src/main/java/ru/deft/homework/config/WebAppInitializer.java b/otus_2019_06/hw13-maven/src/main/java/ru/deft/homework/config/WebAppInitializer.java
index c55ba4e..4d584bd 100644
--- a/otus_2019_06/hw13-maven/src/main/java/ru/deft/homework/config/WebAppInitializer.java
+++ b/otus_2019_06/hw13-maven/src/main/java/ru/deft/homework/config/WebAppInitializer.java
@@ -12,7 +12,7 @@ public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServlet
@Override
protected Class>[] getRootConfigClasses() {
- return new Class[]{SecurityConfig.class};
+ return new Class[]{/*SecurityConfig.class*/};
}
@Override
diff --git a/otus_2019_06/hw13-maven/src/main/java/ru/deft/homework/config/WebConfig.java b/otus_2019_06/hw13-maven/src/main/java/ru/deft/homework/config/WebConfig.java
index acf12fd..2fde58e 100644
--- a/otus_2019_06/hw13-maven/src/main/java/ru/deft/homework/config/WebConfig.java
+++ b/otus_2019_06/hw13-maven/src/main/java/ru/deft/homework/config/WebConfig.java
@@ -5,7 +5,6 @@
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
-import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
@@ -16,7 +15,6 @@
import ru.deft.homework.api.sessionmanager.SessionManager;
import ru.deft.homework.hibernate.dao.UserDaoHibernate;
import ru.deft.homework.hibernate.sessionmanager.SessionManagerHibernate;
-import ru.deft.homework.service.impl.UserDetailsServiceImpl;
/*
* Created by sgolitsyn on 10/14/19
diff --git a/otus_2019_06/hw13-maven/src/main/java/ru/deft/homework/service/impl/UserDetailsServiceImpl.java b/otus_2019_06/hw13-maven/src/main/java/ru/deft/homework/service/impl/UserDetailsServiceImpl.java
index 71d0068..ebc7662 100644
--- a/otus_2019_06/hw13-maven/src/main/java/ru/deft/homework/service/impl/UserDetailsServiceImpl.java
+++ b/otus_2019_06/hw13-maven/src/main/java/ru/deft/homework/service/impl/UserDetailsServiceImpl.java
@@ -1,35 +1,35 @@
-package ru.deft.homework.service.impl;
-
-import lombok.RequiredArgsConstructor;
-import lombok.extern.java.Log;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.security.core.userdetails.UserDetailsService;
-import org.springframework.security.core.userdetails.UsernameNotFoundException;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import ru.deft.homework.api.model.User;
-import ru.deft.homework.service.LoginService;
-
-/*
- * Created by sgolitsyn on 10/16/19
- */
-@Log
-@Service("userDetailsService")
-@RequiredArgsConstructor
-public class UserDetailsServiceImpl implements UserDetailsService {
-
- @Autowired
- private LoginService loginService;
-
- @Override
- @Transactional(readOnly = true)
- public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
- User user = loginService.authenticate(username);
- if (user == null) {
- throw new UsernameNotFoundException("User not found.");
- }
- log.info("loadUserByUsername() : {}" + username);
- return new org.springframework.security.core.userdetails.User(user.getName(), user.getPassword(), null);
- }
-}
+//package ru.deft.homework.service.impl;
+//
+//import lombok.RequiredArgsConstructor;
+//import lombok.extern.java.Log;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.security.core.userdetails.UserDetails;
+//import org.springframework.security.core.userdetails.UserDetailsService;
+//import org.springframework.security.core.userdetails.UsernameNotFoundException;
+//import org.springframework.stereotype.Service;
+//import org.springframework.transaction.annotation.Transactional;
+//import ru.deft.homework.api.model.User;
+//import ru.deft.homework.service.LoginService;
+//
+///*
+// * Created by sgolitsyn on 10/16/19
+// */
+//@Log
+//@Service("userDetailsService")
+//@RequiredArgsConstructor
+//public class UserDetailsServiceImpl implements UserDetailsService {
+//
+// @Autowired
+// private LoginService loginService;
+//
+// @Override
+// @Transactional(readOnly = true)
+// public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
+// User user = loginService.authenticate(username);
+// if (user == null) {
+// throw new UsernameNotFoundException("User not found.");
+// }
+// log.info("loadUserByUsername() : {}" + username);
+// return new org.springframework.security.core.userdetails.User(user.getName(), user.getPassword(), null);
+// }
+//}
diff --git a/otus_2019_06/hw13-maven/src/main/java/ru/deft/homework/controller/ChatEndpoint.java b/otus_2019_06/hw13-maven/src/main/java/ru/deft/homework/websocket/controller/ChatEndpoint.java
similarity index 98%
rename from otus_2019_06/hw13-maven/src/main/java/ru/deft/homework/controller/ChatEndpoint.java
rename to otus_2019_06/hw13-maven/src/main/java/ru/deft/homework/websocket/controller/ChatEndpoint.java
index 3086c1a..280d51d 100644
--- a/otus_2019_06/hw13-maven/src/main/java/ru/deft/homework/controller/ChatEndpoint.java
+++ b/otus_2019_06/hw13-maven/src/main/java/ru/deft/homework/websocket/controller/ChatEndpoint.java
@@ -1,4 +1,4 @@
-package ru.deft.homework.controller;
+package ru.deft.homework.websocket.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
diff --git a/otus_2019_06/hw13-maven/src/main/java/ru/deft/homework/controller/GreetingController.java b/otus_2019_06/hw13-maven/src/main/java/ru/deft/homework/websocket/controller/GreetingController.java
similarity index 90%
rename from otus_2019_06/hw13-maven/src/main/java/ru/deft/homework/controller/GreetingController.java
rename to otus_2019_06/hw13-maven/src/main/java/ru/deft/homework/websocket/controller/GreetingController.java
index 1c86914..7a7c684 100644
--- a/otus_2019_06/hw13-maven/src/main/java/ru/deft/homework/controller/GreetingController.java
+++ b/otus_2019_06/hw13-maven/src/main/java/ru/deft/homework/websocket/controller/GreetingController.java
@@ -1,4 +1,4 @@
-package ru.deft.homework.controller;
+package ru.deft.homework.websocket.controller;
import lombok.extern.java.Log;
import org.springframework.stereotype.Controller;
diff --git a/otus_2019_06/hw13-maven/src/main/java/ru/deft/homework/controller/LoginController.java b/otus_2019_06/hw13-maven/src/main/java/ru/deft/homework/websocket/controller/LoginController.java
similarity index 92%
rename from otus_2019_06/hw13-maven/src/main/java/ru/deft/homework/controller/LoginController.java
rename to otus_2019_06/hw13-maven/src/main/java/ru/deft/homework/websocket/controller/LoginController.java
index 6e1d872..0f0241e 100644
--- a/otus_2019_06/hw13-maven/src/main/java/ru/deft/homework/controller/LoginController.java
+++ b/otus_2019_06/hw13-maven/src/main/java/ru/deft/homework/websocket/controller/LoginController.java
@@ -1,4 +1,4 @@
-package ru.deft.homework.controller;
+package ru.deft.homework.websocket.controller;
/*
* Created by sgolitsyn on 10/15/19
@@ -8,13 +8,10 @@
import lombok.extern.java.Log;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
-import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;
import ru.deft.homework.api.model.User;
import ru.deft.homework.service.LoginService;
-import javax.servlet.http.HttpSession;
-
@Log
@Controller
@RequestMapping(value = "/login")
diff --git a/otus_2019_06/hw13-maven/src/main/java/ru/deft/homework/controller/UserController.java b/otus_2019_06/hw13-maven/src/main/java/ru/deft/homework/websocket/controller/UserController.java
similarity index 98%
rename from otus_2019_06/hw13-maven/src/main/java/ru/deft/homework/controller/UserController.java
rename to otus_2019_06/hw13-maven/src/main/java/ru/deft/homework/websocket/controller/UserController.java
index ff9e419..98bd554 100644
--- a/otus_2019_06/hw13-maven/src/main/java/ru/deft/homework/controller/UserController.java
+++ b/otus_2019_06/hw13-maven/src/main/java/ru/deft/homework/websocket/controller/UserController.java
@@ -1,4 +1,4 @@
-package ru.deft.homework.controller;
+package ru.deft.homework.websocket.controller;
import lombok.RequiredArgsConstructor;
import lombok.extern.java.Log;
diff --git a/otus_2019_06/hw16-maven/.gitignore b/otus_2019_06/hw16-maven/.gitignore
new file mode 100644
index 0000000..a2a3040
--- /dev/null
+++ b/otus_2019_06/hw16-maven/.gitignore
@@ -0,0 +1,31 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**
+!**/src/test/**
+
+### 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/
+
+### VS Code ###
+.vscode/
diff --git a/otus_2019_06/hw16-maven/dbservice/.gitignore b/otus_2019_06/hw16-maven/dbservice/.gitignore
new file mode 100644
index 0000000..a2a3040
--- /dev/null
+++ b/otus_2019_06/hw16-maven/dbservice/.gitignore
@@ -0,0 +1,31 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**
+!**/src/test/**
+
+### 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/
+
+### VS Code ###
+.vscode/
diff --git a/otus_2019_06/hw16-maven/dbservice/pom.xml b/otus_2019_06/hw16-maven/dbservice/pom.xml
new file mode 100644
index 0000000..426abcd
--- /dev/null
+++ b/otus_2019_06/hw16-maven/dbservice/pom.xml
@@ -0,0 +1,60 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.2.2.RELEASE
+
+
+ ru.deft
+ homework
+ 0.0.1-SNAPSHOT
+ dbservice
+ DB service for RMI
+
+
+ 11
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+
+ org.springframework.boot
+ spring-boot-devtools
+ runtime
+ true
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.junit.vintage
+ junit-vintage-engine
+
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/otus_2019_06/hw16-maven/dbservice/src/main/java/ru/deft/homework/client/DBServiceClient.java b/otus_2019_06/hw16-maven/dbservice/src/main/java/ru/deft/homework/client/DBServiceClient.java
new file mode 100644
index 0000000..0f9c757
--- /dev/null
+++ b/otus_2019_06/hw16-maven/dbservice/src/main/java/ru/deft/homework/client/DBServiceClient.java
@@ -0,0 +1,30 @@
+//package ru.deft.homework.client;
+//
+//import lombok.extern.slf4j.Slf4j;
+//import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
+//import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
+//import org.springframework.context.annotation.Bean;
+//import ru.deft.homework.rmi.DBServiceEcho;
+//
+//import java.net.MalformedURLException;
+//import java.rmi.Naming;
+//import java.rmi.NotBoundException;
+//import java.rmi.RemoteException;
+//
+///*
+// * Created by sgolitsyn on 12/6/19
+// */
+//@Slf4j
+//public class DBServiceClient {
+//
+// public static void main(String[] args) throws RemoteException, MalformedURLException, NotBoundException {
+// DBServiceEcho echoInterface = (DBServiceEcho) Naming.lookup("rmi://localhost/DBServiceServer");
+// var dataFromServer = echoInterface.requestToDBService("from DBServiceClient", "message");
+// log.info("response from the server:{}", dataFromServer);
+// }
+//
+// @Bean
+// ServletWebServerFactory servletWebServerFactory() {
+// return new TomcatServletWebServerFactory();
+// }
+//}
diff --git a/otus_2019_06/hw16-maven/dbservice/src/main/java/ru/deft/homework/db/DBService.java b/otus_2019_06/hw16-maven/dbservice/src/main/java/ru/deft/homework/db/DBService.java
new file mode 100644
index 0000000..608f97b
--- /dev/null
+++ b/otus_2019_06/hw16-maven/dbservice/src/main/java/ru/deft/homework/db/DBService.java
@@ -0,0 +1,5 @@
+package ru.deft.homework.db;
+
+public interface DBService {
+ String getUserData(long id);
+}
diff --git a/otus_2019_06/hw16-maven/dbservice/src/main/java/ru/deft/homework/db/impl/DBServiceImpl.java b/otus_2019_06/hw16-maven/dbservice/src/main/java/ru/deft/homework/db/impl/DBServiceImpl.java
new file mode 100644
index 0000000..05286a9
--- /dev/null
+++ b/otus_2019_06/hw16-maven/dbservice/src/main/java/ru/deft/homework/db/impl/DBServiceImpl.java
@@ -0,0 +1,29 @@
+package ru.deft.homework.db.impl;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import ru.deft.homework.db.DBService;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class DBServiceImpl implements DBService {
+ private static final Logger logger = LoggerFactory.getLogger(DBServiceImpl.class);
+ private final Map database = new HashMap<>();
+
+ private void initDatabase() {
+ database.put(1L, "val1");
+ database.put(2L, "val2");
+ database.put(3L, "val3");
+ }
+
+ public DBServiceImpl() {
+ initDatabase();
+ }
+
+ public String getUserData(long id) {
+ logger.info("get data for id:{}", id);
+ return database.get(id);
+ }
+
+}
diff --git a/otus_2019_06/hw16-maven/dbservice/src/main/java/ru/deft/homework/model/Message.java b/otus_2019_06/hw16-maven/dbservice/src/main/java/ru/deft/homework/model/Message.java
new file mode 100644
index 0000000..793b5c0
--- /dev/null
+++ b/otus_2019_06/hw16-maven/dbservice/src/main/java/ru/deft/homework/model/Message.java
@@ -0,0 +1,26 @@
+package ru.deft.homework.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+public class Message {
+
+ private String from;
+ private String message;
+
+ public Message(String message) {
+ this.message = message;
+ }
+
+ @Override
+ public String toString() {
+ return "Message [from=" + from + ", message=" + message + "]";
+ }
+
+}
diff --git a/otus_2019_06/hw16-maven/dbservice/src/main/java/ru/deft/homework/rmi/DBServiceEcho.java b/otus_2019_06/hw16-maven/dbservice/src/main/java/ru/deft/homework/rmi/DBServiceEcho.java
new file mode 100644
index 0000000..5ecfdaa
--- /dev/null
+++ b/otus_2019_06/hw16-maven/dbservice/src/main/java/ru/deft/homework/rmi/DBServiceEcho.java
@@ -0,0 +1,13 @@
+package ru.deft.homework.rmi;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+
+/*
+ * Created by sgolitsyn on 12/7/19
+ */
+public interface DBServiceEcho extends Remote {
+
+ String requestToDBService(String from, String message) throws RemoteException;
+
+}
diff --git a/otus_2019_06/hw16-maven/dbservice/src/main/java/ru/deft/homework/rmi/MessageSystemEcho.java b/otus_2019_06/hw16-maven/dbservice/src/main/java/ru/deft/homework/rmi/MessageSystemEcho.java
new file mode 100644
index 0000000..442864f
--- /dev/null
+++ b/otus_2019_06/hw16-maven/dbservice/src/main/java/ru/deft/homework/rmi/MessageSystemEcho.java
@@ -0,0 +1,13 @@
+package ru.deft.homework.rmi;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+
+/*
+ * Created by sgolitsyn on 12/7/19
+ */
+public interface MessageSystemEcho extends Remote {
+
+ String requestToMessageSystem(String from, String message) throws RemoteException;
+
+}
diff --git a/otus_2019_06/hw16-maven/dbservice/src/main/java/ru/deft/homework/server/DBServiceServer.java b/otus_2019_06/hw16-maven/dbservice/src/main/java/ru/deft/homework/server/DBServiceServer.java
new file mode 100644
index 0000000..ab611c3
--- /dev/null
+++ b/otus_2019_06/hw16-maven/dbservice/src/main/java/ru/deft/homework/server/DBServiceServer.java
@@ -0,0 +1,48 @@
+package ru.deft.homework.server;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import ru.deft.homework.rmi.DBServiceEcho;
+
+import javax.naming.NamingException;
+import java.rmi.Naming;
+import java.rmi.RemoteException;
+import java.rmi.server.UnicastRemoteObject;
+import java.util.Collections;
+
+/*
+ * Created by sgolitsyn on 12/6/19
+ */
+@Slf4j
+@SpringBootApplication
+public class DBServiceServer extends UnicastRemoteObject implements DBServiceEcho {
+ private static final long serialVersionUID = 1L;
+
+ private static final int SERVER_PORT = 8082;
+
+ public DBServiceServer() throws RemoteException {
+ super(8092);
+ }
+
+ @Override
+ public String requestToDBService(String from, String message) throws RemoteException {
+ // todo add save to data base or some logic
+ log.info("data from {} client:{}", from, message);
+ return message + "--> From DBServiceServer.requestToDBService";
+ }
+
+ public static void main(String[] args) throws NamingException, RemoteException {
+ try {
+ Naming.rebind("//localhost/DBServiceServer", new DBServiceServer());
+ log.info("waiting for client connection");
+ } catch (Exception ex) {
+ log.error(ex.getMessage(), ex);
+ }
+ SpringApplication springApplication = new SpringApplication(DBServiceServer.class);
+ springApplication.setDefaultProperties(Collections
+ .singletonMap("server.port", SERVER_PORT));
+ springApplication.run(args);
+ }
+
+}
diff --git a/otus_2019_06/hw16-maven/dbservice/src/main/resources/application.properties b/otus_2019_06/hw16-maven/dbservice/src/main/resources/application.properties
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/otus_2019_06/hw16-maven/dbservice/src/main/resources/application.properties
@@ -0,0 +1 @@
+
diff --git a/otus_2019_06/hw16-maven/dbservice/src/test/java/ru/deft/homework/DbserviceApplicationTests.java b/otus_2019_06/hw16-maven/dbservice/src/test/java/ru/deft/homework/DbserviceApplicationTests.java
new file mode 100644
index 0000000..9260db5
--- /dev/null
+++ b/otus_2019_06/hw16-maven/dbservice/src/test/java/ru/deft/homework/DbserviceApplicationTests.java
@@ -0,0 +1,13 @@
+package ru.deft.homework;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class DbserviceApplicationTests {
+
+ @Test
+ void contextLoads() {
+ }
+
+}
diff --git a/otus_2019_06/hw16-maven/frontend/.gitignore b/otus_2019_06/hw16-maven/frontend/.gitignore
new file mode 100644
index 0000000..a2a3040
--- /dev/null
+++ b/otus_2019_06/hw16-maven/frontend/.gitignore
@@ -0,0 +1,31 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**
+!**/src/test/**
+
+### 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/
+
+### VS Code ###
+.vscode/
diff --git a/otus_2019_06/hw16-maven/frontend/pom.xml b/otus_2019_06/hw16-maven/frontend/pom.xml
new file mode 100644
index 0000000..74e1536
--- /dev/null
+++ b/otus_2019_06/hw16-maven/frontend/pom.xml
@@ -0,0 +1,71 @@
+
+ 4.0.0
+ com.javamaster
+ websocketchat
+ 0.0.1-SNAPSHOT
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 1.5.8.RELEASE
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-websocket
+
+
+ org.webjars
+ webjars-locator
+
+
+ org.webjars
+ sockjs-client
+ 1.0.2
+
+
+ org.webjars
+ stomp-websocket
+ 2.3.3
+
+
+ org.webjars
+ bootstrap
+ 3.3.7
+
+
+ org.webjars
+ jquery
+ 3.1.0
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+ org.projectlombok
+ lombok
+ 1.18.10
+ provided
+
+
+
+
+
+ 1.8
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/otus_2019_06/hw16-maven/frontend/src/main/java/ru/deft/homework/client/IMessageSystem.java b/otus_2019_06/hw16-maven/frontend/src/main/java/ru/deft/homework/client/IMessageSystem.java
new file mode 100644
index 0000000..7218b60
--- /dev/null
+++ b/otus_2019_06/hw16-maven/frontend/src/main/java/ru/deft/homework/client/IMessageSystem.java
@@ -0,0 +1,11 @@
+package ru.deft.homework.client;
+
+import ru.deft.homework.websocket.domain.Message;
+
+/*
+ * Created by sgolitsyn on 12/7/19
+ */
+public interface IMessageSystem {
+
+ public void sendRequestToMessageSystem(Message message);
+}
diff --git a/otus_2019_06/hw16-maven/frontend/src/main/java/ru/deft/homework/client/impl/FrontendClient.java b/otus_2019_06/hw16-maven/frontend/src/main/java/ru/deft/homework/client/impl/FrontendClient.java
new file mode 100644
index 0000000..8e192f0
--- /dev/null
+++ b/otus_2019_06/hw16-maven/frontend/src/main/java/ru/deft/homework/client/impl/FrontendClient.java
@@ -0,0 +1,26 @@
+package ru.deft.homework.client.impl;
+
+import lombok.extern.slf4j.Slf4j;
+import lombok.var;
+import ru.deft.homework.rmi.FrontendEcho;
+
+import java.net.MalformedURLException;
+import java.rmi.Naming;
+import java.rmi.NotBoundException;
+import java.rmi.RemoteException;
+
+/*
+ * Created by sgolitsyn on 12/6/19
+ */
+@Slf4j
+public class FrontendClient {
+
+ public static void main(String[] args) throws RemoteException, MalformedURLException, NotBoundException {
+
+ var frontendEcho = (FrontendEcho) Naming.lookup("//localhost/FrontendServer");
+ var dataFromServer = frontendEcho.sendResponceToFrontend("from FrontendClient", "message");
+ log.info("response from the server:{}", dataFromServer);
+
+
+ }
+}
diff --git a/otus_2019_06/hw16-maven/frontend/src/main/java/ru/deft/homework/client/impl/MessageSystemClient.java b/otus_2019_06/hw16-maven/frontend/src/main/java/ru/deft/homework/client/impl/MessageSystemClient.java
new file mode 100644
index 0000000..613d60e
--- /dev/null
+++ b/otus_2019_06/hw16-maven/frontend/src/main/java/ru/deft/homework/client/impl/MessageSystemClient.java
@@ -0,0 +1,33 @@
+package ru.deft.homework.client.impl;
+
+import lombok.extern.slf4j.Slf4j;
+import lombok.var;
+import org.springframework.stereotype.Component;
+import ru.deft.homework.client.IMessageSystem;
+import ru.deft.homework.rmi.MessageSystemEcho;
+import ru.deft.homework.websocket.domain.Message;
+
+import java.net.MalformedURLException;
+import java.rmi.Naming;
+import java.rmi.NotBoundException;
+import java.rmi.RemoteException;
+
+/*
+ * Created by sgolitsyn on 12/6/19
+ */
+@Slf4j
+@Component
+public class MessageSystemClient implements IMessageSystem {
+
+ public void sendRequestToMessageSystem(Message message) {
+ MessageSystemEcho echoInterface = null;
+ var dataFromServer = "";
+ try {
+ echoInterface = (MessageSystemEcho) Naming.lookup("rmi://localhost/MessageSystemServer");
+ dataFromServer = echoInterface.requestToMessageSystem("databaseService", "From MessageSystemClient:" + message.getMessage());
+ } catch (NotBoundException | MalformedURLException | RemoteException e) {
+ e.printStackTrace();
+ }
+ log.info("response from the server:{}", dataFromServer);
+ }
+}
diff --git a/otus_2019_06/hw16-maven/frontend/src/main/java/ru/deft/homework/rmi/DBServiceEcho.java b/otus_2019_06/hw16-maven/frontend/src/main/java/ru/deft/homework/rmi/DBServiceEcho.java
new file mode 100644
index 0000000..5ecfdaa
--- /dev/null
+++ b/otus_2019_06/hw16-maven/frontend/src/main/java/ru/deft/homework/rmi/DBServiceEcho.java
@@ -0,0 +1,13 @@
+package ru.deft.homework.rmi;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+
+/*
+ * Created by sgolitsyn on 12/7/19
+ */
+public interface DBServiceEcho extends Remote {
+
+ String requestToDBService(String from, String message) throws RemoteException;
+
+}
diff --git a/otus_2019_06/hw16-maven/frontend/src/main/java/ru/deft/homework/rmi/FrontendEcho.java b/otus_2019_06/hw16-maven/frontend/src/main/java/ru/deft/homework/rmi/FrontendEcho.java
new file mode 100644
index 0000000..5b566d3
--- /dev/null
+++ b/otus_2019_06/hw16-maven/frontend/src/main/java/ru/deft/homework/rmi/FrontendEcho.java
@@ -0,0 +1,13 @@
+package ru.deft.homework.rmi;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+
+/*
+ * Created by sgolitsyn on 12/7/19
+ */
+public interface FrontendEcho extends Remote {
+
+ String sendResponceToFrontend(String from, String message) throws RemoteException;
+
+}
diff --git a/otus_2019_06/hw16-maven/frontend/src/main/java/ru/deft/homework/rmi/MessageSystemEcho.java b/otus_2019_06/hw16-maven/frontend/src/main/java/ru/deft/homework/rmi/MessageSystemEcho.java
new file mode 100644
index 0000000..442864f
--- /dev/null
+++ b/otus_2019_06/hw16-maven/frontend/src/main/java/ru/deft/homework/rmi/MessageSystemEcho.java
@@ -0,0 +1,13 @@
+package ru.deft.homework.rmi;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+
+/*
+ * Created by sgolitsyn on 12/7/19
+ */
+public interface MessageSystemEcho extends Remote {
+
+ String requestToMessageSystem(String from, String message) throws RemoteException;
+
+}
diff --git a/otus_2019_06/hw16-maven/frontend/src/main/java/ru/deft/homework/server/CustomStompSessionHandler.java b/otus_2019_06/hw16-maven/frontend/src/main/java/ru/deft/homework/server/CustomStompSessionHandler.java
new file mode 100644
index 0000000..ef0036b
--- /dev/null
+++ b/otus_2019_06/hw16-maven/frontend/src/main/java/ru/deft/homework/server/CustomStompSessionHandler.java
@@ -0,0 +1,25 @@
+package ru.deft.homework.server;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.messaging.simp.stomp.StompCommand;
+import org.springframework.messaging.simp.stomp.StompHeaders;
+import org.springframework.messaging.simp.stomp.StompSession;
+import org.springframework.messaging.simp.stomp.StompSessionHandlerAdapter;
+
+/*
+ * Created by sgolitsyn on 12/8/19
+ */
+@Slf4j
+public class CustomStompSessionHandler extends StompSessionHandlerAdapter {
+
+ @Override
+ public void afterConnected(StompSession session, StompHeaders connectedHeaders) {
+ log.info("New session established : " + session.getSessionId());
+ }
+
+ @Override
+ public void handleException(StompSession session, StompCommand command, StompHeaders headers,
+ byte[] payload, Throwable exception) {
+ log.error("Got an exception", exception);
+ }
+}
diff --git a/otus_2019_06/hw16-maven/frontend/src/main/java/ru/deft/homework/server/FrontendServer.java b/otus_2019_06/hw16-maven/frontend/src/main/java/ru/deft/homework/server/FrontendServer.java
new file mode 100644
index 0000000..f6e2be4
--- /dev/null
+++ b/otus_2019_06/hw16-maven/frontend/src/main/java/ru/deft/homework/server/FrontendServer.java
@@ -0,0 +1,78 @@
+package ru.deft.homework.server;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.messaging.simp.stomp.StompSession;
+import org.springframework.messaging.simp.stomp.StompSessionHandler;
+import org.springframework.web.socket.client.WebSocketClient;
+import org.springframework.web.socket.client.standard.StandardWebSocketClient;
+import org.springframework.web.socket.messaging.WebSocketStompClient;
+import org.springframework.web.socket.sockjs.client.SockJsClient;
+import org.springframework.web.socket.sockjs.client.Transport;
+import org.springframework.web.socket.sockjs.client.WebSocketTransport;
+import ru.deft.homework.rmi.FrontendEcho;
+
+import java.rmi.Naming;
+import java.rmi.RemoteException;
+import java.rmi.registry.LocateRegistry;
+import java.rmi.server.UnicastRemoteObject;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+
+/*
+ * Created by sgolitsyn on 12/6/19
+ */
+@Slf4j
+@SpringBootApplication(scanBasePackages = "ru.deft.homework.server")
+public class FrontendServer extends UnicastRemoteObject implements FrontendEcho {
+ private static final long serialVersionUID = 1L;
+
+ private static final int SERVER_PORT = 8091;
+ private static final int REGISTRY_PORT = 1099;
+
+
+ public FrontendServer() throws RemoteException {
+ super(SERVER_PORT);
+ }
+
+ @Override
+ public String sendResponceToFrontend(String from, String message) throws RemoteException {
+ log.info("data from {} message:{}", from, message);
+
+ try {
+ WebSocketClient simpleWebSocketClient = new StandardWebSocketClient();
+ List transports = new ArrayList<>(1);
+ transports.add(new WebSocketTransport(simpleWebSocketClient));
+ SockJsClient sockJsClient = new SockJsClient(transports);
+ WebSocketStompClient stompClient = new WebSocketStompClient(sockJsClient);
+ String url = "ws://localhost:8080/chat-messaging";
+ StompSessionHandler sessionHandler = new CustomStompSessionHandler();
+ StompSession session = stompClient.connect(url, sessionHandler).get();
+ session.send("hello", "qwe");
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ } catch (ExecutionException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ public static void main(String[] args) {
+ SpringApplication springApplication = new SpringApplication(FrontendServer.class);
+ springApplication.setDefaultProperties(Collections
+ .singletonMap("server.port", "8081"));
+ springApplication.run(args);
+ try {
+ LocateRegistry.createRegistry(REGISTRY_PORT);
+
+ Naming.rebind("//localhost/FrontendServer", new FrontendServer());
+ log.info("waiting for client connection");
+ } catch (Exception ex) {
+ log.error(ex.getMessage(), ex);
+ }
+ }
+
+}
diff --git a/otus_2019_06/hw16-maven/frontend/src/main/java/ru/deft/homework/websocket/FrontendWebSocket.java b/otus_2019_06/hw16-maven/frontend/src/main/java/ru/deft/homework/websocket/FrontendWebSocket.java
new file mode 100644
index 0000000..01a9547
--- /dev/null
+++ b/otus_2019_06/hw16-maven/frontend/src/main/java/ru/deft/homework/websocket/FrontendWebSocket.java
@@ -0,0 +1,16 @@
+package ru.deft.homework.websocket;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.domain.EntityScan;
+import org.springframework.context.annotation.ComponentScan;
+
+@SpringBootApplication
+@ComponentScan({"ru.deft.homework.websocket"})
+@EntityScan("ru.deft.homework.websocket")
+public class FrontendWebSocket {
+
+ public static void main(String[] args) {
+ SpringApplication.run(FrontendWebSocket.class, args);
+ }
+}
diff --git a/otus_2019_06/hw16-maven/frontend/src/main/java/ru/deft/homework/websocket/WebSocketConfiguration.java b/otus_2019_06/hw16-maven/frontend/src/main/java/ru/deft/homework/websocket/WebSocketConfiguration.java
new file mode 100644
index 0000000..8d03884
--- /dev/null
+++ b/otus_2019_06/hw16-maven/frontend/src/main/java/ru/deft/homework/websocket/WebSocketConfiguration.java
@@ -0,0 +1,23 @@
+package ru.deft.homework.websocket;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.messaging.simp.config.MessageBrokerRegistry;
+import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer;
+import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
+import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
+
+@Configuration
+@EnableWebSocketMessageBroker
+public class WebSocketConfiguration extends AbstractWebSocketMessageBrokerConfigurer {
+
+ public void configureMessageBroker(MessageBrokerRegistry confi) {
+ confi.enableSimpleBroker("/chat");
+ confi.setApplicationDestinationPrefixes("/app");
+ }
+
+ public void registerStompEndpoints(StompEndpointRegistry registry) {
+ registry.addEndpoint("/chat-messaging").withSockJS();
+
+ }
+
+}
diff --git a/otus_2019_06/hw16-maven/frontend/src/main/java/ru/deft/homework/websocket/client/IMessageSystem.java b/otus_2019_06/hw16-maven/frontend/src/main/java/ru/deft/homework/websocket/client/IMessageSystem.java
new file mode 100644
index 0000000..f0c7ef8
--- /dev/null
+++ b/otus_2019_06/hw16-maven/frontend/src/main/java/ru/deft/homework/websocket/client/IMessageSystem.java
@@ -0,0 +1,11 @@
+package ru.deft.homework.websocket.client;
+
+import ru.deft.homework.websocket.domain.Message;
+
+/*
+ * Created by sgolitsyn on 12/7/19
+ */
+public interface IMessageSystem {
+
+ public void sendRequestToMessageSystem(Message message);
+}
diff --git a/otus_2019_06/hw16-maven/frontend/src/main/java/ru/deft/homework/websocket/client/MessageSystemClient.java b/otus_2019_06/hw16-maven/frontend/src/main/java/ru/deft/homework/websocket/client/MessageSystemClient.java
new file mode 100644
index 0000000..27e8689
--- /dev/null
+++ b/otus_2019_06/hw16-maven/frontend/src/main/java/ru/deft/homework/websocket/client/MessageSystemClient.java
@@ -0,0 +1,32 @@
+package ru.deft.homework.websocket.client;
+
+import lombok.extern.slf4j.Slf4j;
+import lombok.var;
+import org.springframework.stereotype.Component;
+import ru.deft.homework.rmi.MessageSystemEcho;
+import ru.deft.homework.websocket.domain.Message;
+
+import java.net.MalformedURLException;
+import java.rmi.Naming;
+import java.rmi.NotBoundException;
+import java.rmi.RemoteException;
+
+/*
+ * Created by sgolitsyn on 12/6/19
+ */
+@Slf4j
+@Component
+public class MessageSystemClient implements IMessageSystem {
+
+ public void sendRequestToMessageSystem(Message message) {
+ MessageSystemEcho echoInterface = null;
+ var dataFromServer = "";
+ try {
+ echoInterface = (MessageSystemEcho) Naming.lookup("rmi://localhost/MessageSystemServer");
+ dataFromServer = echoInterface.requestToMessageSystem("databaseService", "From MessageSystemClient:" + message.getMessage());
+ } catch (NotBoundException | MalformedURLException | RemoteException e) {
+ e.printStackTrace();
+ }
+ log.info("response from the server:{}", dataFromServer);
+ }
+}
diff --git a/otus_2019_06/hw16-maven/frontend/src/main/java/ru/deft/homework/websocket/controller/ChatController.java b/otus_2019_06/hw16-maven/frontend/src/main/java/ru/deft/homework/websocket/controller/ChatController.java
new file mode 100644
index 0000000..df7ea74
--- /dev/null
+++ b/otus_2019_06/hw16-maven/frontend/src/main/java/ru/deft/homework/websocket/controller/ChatController.java
@@ -0,0 +1,35 @@
+package ru.deft.homework.websocket.controller;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.messaging.handler.annotation.MessageMapping;
+import org.springframework.messaging.handler.annotation.SendTo;
+import org.springframework.stereotype.Controller;
+
+import ru.deft.homework.websocket.client.IMessageSystem;
+import ru.deft.homework.websocket.domain.Message;
+
+@Slf4j
+@Controller
+@RequiredArgsConstructor
+public class ChatController {
+
+ @Autowired
+ private final IMessageSystem messageSystem;
+
+ @MessageMapping("/message")
+ @SendTo("/chat/messages")
+ public void getMessages(Message message) {
+ log.debug(message.toString());
+ messageSystem.sendRequestToMessageSystem(message);
+// return message;
+ }
+
+ @MessageMapping("/responce")
+ @SendTo("/chat/messages")
+ public Message sendToChat(Message message) {
+ log.debug("/chat/messages {}", message);
+ return message;
+ }
+}
diff --git a/otus_2019_06/hw16-maven/frontend/src/main/java/ru/deft/homework/websocket/domain/Message.java b/otus_2019_06/hw16-maven/frontend/src/main/java/ru/deft/homework/websocket/domain/Message.java
new file mode 100644
index 0000000..2052a9b
--- /dev/null
+++ b/otus_2019_06/hw16-maven/frontend/src/main/java/ru/deft/homework/websocket/domain/Message.java
@@ -0,0 +1,30 @@
+package ru.deft.homework.websocket.domain;
+
+public class Message {
+
+ private String from;
+ private String message;
+
+ public String getFrom() {
+ return from;
+ }
+
+ public void setFrom(String from) {
+ this.from = from;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ @Override
+ public String toString() {
+ return "Message [from=" + from + ", message=" + message + "]";
+ }
+
+
+}
diff --git a/otus_2019_06/hw16-maven/frontend/src/main/resources/static/index.html b/otus_2019_06/hw16-maven/frontend/src/main/resources/static/index.html
new file mode 100644
index 0000000..443087a
--- /dev/null
+++ b/otus_2019_06/hw16-maven/frontend/src/main/resources/static/index.html
@@ -0,0 +1,48 @@
+
+
+
+
+ Insert title here
+
+
+
+
+
+
+
+
+Simple chat
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/otus_2019_06/hw16-maven/frontend/src/main/resources/static/script.js b/otus_2019_06/hw16-maven/frontend/src/main/resources/static/script.js
new file mode 100644
index 0000000..469da4b
--- /dev/null
+++ b/otus_2019_06/hw16-maven/frontend/src/main/resources/static/script.js
@@ -0,0 +1,32 @@
+function connect() {
+ var socket = new SockJS('/chat-messaging');
+ stompClient = Stomp.over(socket);
+ stompClient.connect({}, function (frame) {
+ console.log("connected: " + frame);
+ stompClient.subscribe('/chat/messages', function (response) {
+ var data = JSON.parse(response.body);
+ draw("left", data.message);
+ });
+ });
+}
+
+function draw(side, text) {
+ console.log("drawing...");
+ var $message;
+ $message = $($('.message_template').clone().html());
+ $message.addClass(side).find('.text').html(text);
+ $('.messages').append($message);
+ return setTimeout(function () {
+ return $message.addClass('appeared');
+ }, 0);
+
+}
+
+function disconnect() {
+ stompClient.disconnect();
+}
+
+function sendMessage() {
+ stompClient.send("/app/message", {}, JSON.stringify({'message': $("#message_input_value").val()}));
+
+}
diff --git a/otus_2019_06/hw16-maven/frontend/src/main/resources/static/style.css b/otus_2019_06/hw16-maven/frontend/src/main/resources/static/style.css
new file mode 100644
index 0000000..083af23
--- /dev/null
+++ b/otus_2019_06/hw16-maven/frontend/src/main/resources/static/style.css
@@ -0,0 +1,222 @@
+* {
+ box-sizing: border-box;
+}
+
+body {
+ background-color: #edeff2;
+ font-family: "Calibri", "Roboto", sans-serif;
+}
+
+.chat_window {
+ position: absolute;
+ width: calc(100% - 20px);
+ max-width: 800px;
+ height: 500px;
+ border-radius: 10px;
+ background-color: #fff;
+ left: 50%;
+ top: 50%;
+ transform: translateX(-50%) translateY(-50%);
+ box-shadow: 0 10px 20px rgba(0, 0, 0, 0.15);
+ background-color: #f8f8f8;
+ overflow: hidden;
+}
+
+.top_menu {
+ background-color: #fff;
+ width: 100%;
+ padding: 20px 0 15px;
+ box-shadow: 0 1px 30px rgba(0, 0, 0, 0.1);
+}
+
+.top_menu .buttons {
+ margin: 3px 0 0 20px;
+ position: absolute;
+}
+
+.top_menu .buttons .button {
+ width: 16px;
+ height: 16px;
+ border-radius: 50%;
+ display: inline-block;
+ margin-right: 10px;
+ position: relative;
+}
+
+.top_menu .buttons .button.close {
+ background-color: #f5886e;
+}
+
+.top_menu .buttons .button.minimize {
+ background-color: #fdbf68;
+}
+
+.top_menu .buttons .button.maximize {
+ background-color: #a3d063;
+}
+
+.top_menu .title {
+ text-align: center;
+ color: #bcbdc0;
+ font-size: 20px;
+}
+
+.messages {
+ position: relative;
+ list-style: none;
+ padding: 20px 10px 0 10px;
+ margin: 0;
+ height: 347px;
+ overflow: scroll;
+}
+
+.messages .message {
+ clear: both;
+ overflow: hidden;
+ margin-bottom: 20px;
+ transition: all 0.5s linear;
+ opacity: 0;
+}
+
+.messages .message.left .avatar {
+ background-color: #f5886e;
+ float: left;
+}
+
+.messages .message.left .text_wrapper {
+ background-color: #ffe6cb;
+ margin-left: 20px;
+}
+
+.messages .message.left .text_wrapper::after, .messages .message.left .text_wrapper::before {
+ right: 100%;
+ border-right-color: #ffe6cb;
+}
+
+.messages .message.left .text {
+ color: #c48843;
+}
+
+.messages .message.right .avatar {
+ background-color: #fdbf68;
+ float: right;
+}
+
+.messages .message.right .text_wrapper {
+ background-color: #c7eafc;
+ margin-right: 20px;
+ float: right;
+}
+
+.messages .message.right .text_wrapper::after, .messages .message.right .text_wrapper::before {
+ left: 100%;
+ border-left-color: #c7eafc;
+}
+
+.messages .message.right .text {
+ color: #45829b;
+}
+
+.messages .message.appeared {
+ opacity: 1;
+}
+
+.messages .message .avatar {
+ width: 60px;
+ height: 60px;
+ border-radius: 50%;
+ display: inline-block;
+}
+
+.messages .message .text_wrapper {
+ display: inline-block;
+ padding: 20px;
+ border-radius: 6px;
+ width: calc(100% - 85px);
+ min-width: 100px;
+ position: relative;
+}
+
+.messages .message .text_wrapper::after, .messages .message .text_wrapper:before {
+ top: 18px;
+ border: solid transparent;
+ content: " ";
+ height: 0;
+ width: 0;
+ position: absolute;
+ pointer-events: none;
+}
+
+.messages .message .text_wrapper::after {
+ border-width: 13px;
+ margin-top: 0px;
+}
+
+.messages .message .text_wrapper::before {
+ border-width: 15px;
+ margin-top: -2px;
+}
+
+.messages .message .text_wrapper .text {
+ font-size: 18px;
+ font-weight: 300;
+}
+
+.bottom_wrapper {
+ position: relative;
+ width: 100%;
+ background-color: #fff;
+ padding: 20px 20px;
+ position: absolute;
+ bottom: 0;
+}
+
+.bottom_wrapper .message_input_wrapper {
+ display: inline-block;
+ height: 50px;
+ border-radius: 25px;
+ border: 1px solid #bcbdc0;
+ width: calc(100% - 160px);
+ position: relative;
+ padding: 0 20px;
+}
+
+.bottom_wrapper .message_input_wrapper .message_input {
+ border: none;
+ height: 100%;
+ box-sizing: border-box;
+ width: calc(100% - 40px);
+ position: absolute;
+ outline-width: 0;
+ color: gray;
+}
+
+.bottom_wrapper .send_message {
+ width: 140px;
+ height: 50px;
+ display: inline-block;
+ border-radius: 50px;
+ background-color: #a3d063;
+ border: 2px solid #a3d063;
+ color: #fff;
+ cursor: pointer;
+ transition: all 0.2s linear;
+ text-align: center;
+ float: right;
+}
+
+.bottom_wrapper .send_message:hover {
+ color: #a3d063;
+ background-color: #fff;
+}
+
+.bottom_wrapper .send_message .text {
+ font-size: 18px;
+ font-weight: 300;
+ display: inline-block;
+ line-height: 48px;
+}
+
+.message_template {
+ display: none;
+}
diff --git a/otus_2019_06/hw16-maven/messagesystem/.gitignore b/otus_2019_06/hw16-maven/messagesystem/.gitignore
new file mode 100644
index 0000000..a2a3040
--- /dev/null
+++ b/otus_2019_06/hw16-maven/messagesystem/.gitignore
@@ -0,0 +1,31 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**
+!**/src/test/**
+
+### 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/
+
+### VS Code ###
+.vscode/
diff --git a/otus_2019_06/hw16-maven/messagesystem/pom.xml b/otus_2019_06/hw16-maven/messagesystem/pom.xml
new file mode 100644
index 0000000..2547252
--- /dev/null
+++ b/otus_2019_06/hw16-maven/messagesystem/pom.xml
@@ -0,0 +1,54 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.2.2.RELEASE
+
+
+ ru.deft
+ homework
+ 0.0.1-SNAPSHOT
+ messagesystem
+ Message system for RMI
+
+
+ 11
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.junit.vintage
+ junit-vintage-engine
+
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/MessageSystemServer.java b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/MessageSystemServer.java
new file mode 100644
index 0000000..0f6c969
--- /dev/null
+++ b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/MessageSystemServer.java
@@ -0,0 +1,85 @@
+package ru.deft.homework;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import ru.deft.homework.client.FrontendServiceResponce;
+import ru.deft.homework.client.impl.FrontendServiceResponceImpl;
+import ru.deft.homework.messagesystem.db.handlers.GetUserDataRequestHandler;
+import ru.deft.homework.messagesystem.front.FrontendService;
+import ru.deft.homework.messagesystem.front.handlers.GetUserDataResponseHandler;
+import ru.deft.homework.messagesystem.front.impl.FrontendServiceImpl;
+import ru.deft.homework.messagesystem.messagesystem.MessageSystem;
+import ru.deft.homework.messagesystem.messagesystem.MsClient;
+import ru.deft.homework.messagesystem.messagesystem.impl.MessageSystemImpl;
+import ru.deft.homework.messagesystem.messagesystem.impl.MsClientImpl;
+import ru.deft.homework.messagesystem.messagesystem.model.Message;
+import ru.deft.homework.messagesystem.messagesystem.model.MessageType;
+import ru.deft.homework.rmi.MessageSystemEcho;
+import ru.deft.homework.client.impl.DBServiceClientImpl;
+
+import javax.naming.NamingException;
+import java.rmi.Naming;
+import java.rmi.RemoteException;
+import java.rmi.server.UnicastRemoteObject;
+import java.util.Collections;
+
+/*
+ * Created by sgolitsyn on 12/6/19
+ */
+@Slf4j
+@SpringBootApplication
+public class MessageSystemServer extends UnicastRemoteObject implements MessageSystemEcho {
+ private static final long serialVersionUID = 1L;
+
+ private static final int SERVER_PORT = 8083;
+
+ private final MessageSystem msClient;
+ public MessageSystemServer() throws RemoteException {
+ super(SERVER_PORT);
+ msClient = msClient();
+ msClient.start();
+ }
+
+ @Override
+ public String requestToMessageSystem(String from, String message) {
+ log.info("data from {} message:{}", from, message);
+ msClient.newMessage(new Message(from, message));
+
+ return "MessageSystemServer echo:" + from;
+
+ }
+
+ public static void main(String[] args) throws NamingException {
+
+ try {
+ Naming.rebind("//localhost/MessageSystemServer", new MessageSystemServer());
+ log.info("waiting for client connection");
+ } catch (Exception ex) {
+ log.error(ex.getMessage(), ex);
+ }
+ SpringApplication springApplication = new SpringApplication(MessageSystemServer.class);
+ springApplication.setDefaultProperties(Collections
+ .singletonMap("server.port", SERVER_PORT));
+ springApplication.run(args);
+ }
+
+ private static final String FRONTEND_SERVICE_CLIENT_NAME = "frontendService";
+ private static final String DATABASE_SERVICE_CLIENT_NAME = "databaseService";
+
+
+ public MessageSystem msClient() {
+ MessageSystem messageSystem = new MessageSystemImpl();
+
+ MsClient databaseMsClient = new MsClientImpl(DATABASE_SERVICE_CLIENT_NAME, messageSystem);
+ DBServiceClientImpl dbService = new DBServiceClientImpl();
+ databaseMsClient.addHandler(MessageType.USER_DATA, new GetUserDataRequestHandler(dbService));
+ messageSystem.addClient(databaseMsClient);
+
+
+ MsClient frontendMsClient = new MsClientImpl(FRONTEND_SERVICE_CLIENT_NAME, messageSystem);
+ frontendMsClient.addHandler(MessageType.USER_DATA, new GetUserDataResponseHandler(new FrontendServiceResponceImpl()));
+ messageSystem.addClient(frontendMsClient);
+ return messageSystem;
+ }
+}
diff --git a/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/client/DBServiceClient.java b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/client/DBServiceClient.java
new file mode 100644
index 0000000..5c40ec6
--- /dev/null
+++ b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/client/DBServiceClient.java
@@ -0,0 +1,10 @@
+package ru.deft.homework.client;
+
+import ru.deft.homework.messagesystem.messagesystem.model.Message;
+
+/*
+ * Created by sgolitsyn on 12/7/19
+ */
+public interface DBServiceClient {
+ Message saveMessageInDbRequest(Message message);
+}
diff --git a/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/client/FrontendServiceResponce.java b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/client/FrontendServiceResponce.java
new file mode 100644
index 0000000..8f13c04
--- /dev/null
+++ b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/client/FrontendServiceResponce.java
@@ -0,0 +1,10 @@
+package ru.deft.homework.client;
+
+import ru.deft.homework.messagesystem.messagesystem.model.Message;
+
+/*
+ * Created by sgolitsyn on 12/8/19
+ */
+public interface FrontendServiceResponce {
+ void sendResponceToFrontend(Message message);
+}
diff --git a/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/client/impl/DBServiceClientImpl.java b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/client/impl/DBServiceClientImpl.java
new file mode 100644
index 0000000..06a6a87
--- /dev/null
+++ b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/client/impl/DBServiceClientImpl.java
@@ -0,0 +1,34 @@
+package ru.deft.homework.client.impl;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+import ru.deft.homework.client.DBServiceClient;
+import ru.deft.homework.messagesystem.messagesystem.model.Message;
+import ru.deft.homework.rmi.DBServiceEcho;
+
+import java.net.MalformedURLException;
+import java.rmi.Naming;
+import java.rmi.NotBoundException;
+import java.rmi.RemoteException;
+
+/*
+ * Created by sgolitsyn on 12/6/19
+ */
+@Slf4j
+@Component
+public class DBServiceClientImpl implements DBServiceClient {
+
+ public Message saveMessageInDbRequest(Message message) {
+ DBServiceEcho dbServiceEcho = null;
+ String dataFromServer = null;
+ try {
+ dbServiceEcho = (DBServiceEcho) Naming.lookup("rmi://localhost/DBServiceServer");
+ dataFromServer = dbServiceEcho.requestToDBService(message.getFrom(), message.getMessage());
+ log.info("response from the server:{}", dataFromServer);
+ } catch (NotBoundException | MalformedURLException | RemoteException e) {
+ e.printStackTrace();
+ }
+ return new Message("frontendService", dataFromServer + "--> DBServiceClientImpl.saveMessageInDbRequest");
+ }
+
+}
diff --git a/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/client/impl/FrontendServiceResponceImpl.java b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/client/impl/FrontendServiceResponceImpl.java
new file mode 100644
index 0000000..a9b2d35
--- /dev/null
+++ b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/client/impl/FrontendServiceResponceImpl.java
@@ -0,0 +1,30 @@
+package ru.deft.homework.client.impl;
+
+import lombok.extern.slf4j.Slf4j;
+import ru.deft.homework.client.FrontendServiceResponce;
+import ru.deft.homework.messagesystem.messagesystem.model.Message;
+import ru.deft.homework.rmi.FrontendEcho;
+
+import java.net.MalformedURLException;
+import java.rmi.Naming;
+import java.rmi.NotBoundException;
+import java.rmi.RemoteException;
+
+/*
+ * Created by sgolitsyn on 12/8/19
+ */
+@Slf4j
+public class FrontendServiceResponceImpl implements FrontendServiceResponce {
+
+ @Override
+ public void sendResponceToFrontend(Message message) {
+ try {
+ FrontendEcho frontendEcho = (FrontendEcho) Naming.lookup("rmi://localhost/FrontendServer");
+ String text = message + "--> FrontendServiceResponceImpl.sendResponceToFrontend";
+ var dataFromServer = frontendEcho.sendResponceToFrontend("from FrontendServiceResponceImpl", text);
+ log.info("response from the server:{}", dataFromServer);
+ } catch (RemoteException | NotBoundException | MalformedURLException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/client/impl/MessageSystemClientTest.java b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/client/impl/MessageSystemClientTest.java
new file mode 100644
index 0000000..137fc20
--- /dev/null
+++ b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/client/impl/MessageSystemClientTest.java
@@ -0,0 +1,23 @@
+package ru.deft.homework.client.impl;
+
+import lombok.extern.slf4j.Slf4j;
+import ru.deft.homework.rmi.MessageSystemEcho;
+
+import java.net.MalformedURLException;
+import java.rmi.Naming;
+import java.rmi.NotBoundException;
+import java.rmi.RemoteException;
+
+/*
+ * For test
+ * Created by sgolitsyn on 12/6/19
+ */
+@Slf4j
+public class MessageSystemClientTest {
+
+ public static void main(String[] args) throws RemoteException, MalformedURLException, NotBoundException {
+ MessageSystemEcho echoInterface = (MessageSystemEcho) Naming.lookup("rmi://localhost/MessageSystemServer");
+ var dataFromServer = echoInterface.requestToMessageSystem("from", "message");
+ log.info("response from the server:{}", dataFromServer);
+ }
+}
diff --git a/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/MSClientConfig.java b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/MSClientConfig.java
new file mode 100644
index 0000000..88cb255
--- /dev/null
+++ b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/MSClientConfig.java
@@ -0,0 +1,42 @@
+package ru.deft.homework.messagesystem;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import ru.deft.homework.client.DBServiceClient;
+import ru.deft.homework.client.impl.FrontendServiceResponceImpl;
+import ru.deft.homework.messagesystem.db.handlers.GetUserDataRequestHandler;
+import ru.deft.homework.messagesystem.front.handlers.GetUserDataResponseHandler;
+import ru.deft.homework.messagesystem.messagesystem.MessageSystem;
+import ru.deft.homework.messagesystem.messagesystem.MsClient;
+import ru.deft.homework.messagesystem.messagesystem.impl.MessageSystemImpl;
+import ru.deft.homework.messagesystem.messagesystem.impl.MsClientImpl;
+import ru.deft.homework.messagesystem.messagesystem.model.MessageType;
+
+/*
+ * Created by sgolitsyn on 12/8/19
+ */
+@Configuration
+public class MSClientConfig {
+ private static final String FRONTEND_SERVICE_CLIENT_NAME = "frontendService";
+ private static final String DATABASE_SERVICE_CLIENT_NAME = "databaseService";
+
+ @Autowired
+ private DBServiceClient dbServiceClient;
+
+ @Bean
+ public MessageSystem msClient() {
+ MessageSystem messageSystem = new MessageSystemImpl();
+
+ MsClient databaseMsClient = new MsClientImpl(DATABASE_SERVICE_CLIENT_NAME, messageSystem);
+ databaseMsClient.addHandler(MessageType.USER_DATA, new GetUserDataRequestHandler(dbServiceClient));
+ messageSystem.addClient(databaseMsClient);
+
+
+ MsClient frontendMsClient = new MsClientImpl(FRONTEND_SERVICE_CLIENT_NAME, messageSystem);
+ frontendMsClient.addHandler(MessageType.USER_DATA, new GetUserDataResponseHandler(new FrontendServiceResponceImpl()));
+ messageSystem.addClient(frontendMsClient);
+ messageSystem.start();
+ return messageSystem;
+ }
+}
diff --git a/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/app/Serializers.java b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/app/Serializers.java
new file mode 100644
index 0000000..812462a
--- /dev/null
+++ b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/app/Serializers.java
@@ -0,0 +1,44 @@
+package ru.deft.homework.messagesystem.app;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
+public class Serializers {
+ private static final Logger logger = LoggerFactory.getLogger(Serializers.class);
+
+ private Serializers() {
+
+ }
+
+ public static byte[] serialize(Object data) {
+ try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ ObjectOutputStream os = new ObjectOutputStream(baos)) {
+ os.writeObject(data);
+ os.flush();
+ return baos.toByteArray();
+ } catch (Exception e) {
+ logger.error("Serialization error, data:" + data, e);
+ throw new RuntimeException("Serialization error:" + e.getMessage());
+ }
+ }
+
+ public static T deserialize(byte[] data, Class classOfT) {
+ try (ByteArrayInputStream bis = new ByteArrayInputStream(data);
+ ObjectInputStream is = new ObjectInputStream(bis)) {
+ Object obj = is.readObject();
+ return classOfT.cast(obj);
+ } catch (Exception e) {
+ logger.error("DeSerialization error, classOfT:" + classOfT, e);
+ throw new RuntimeException("DeSerialization error:" + e.getMessage());
+ }
+ }
+
+ public static T deserialize(String data, Class classOfT) {
+ return classOfT.cast(data);
+ }
+}
diff --git a/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/db/DBService.java b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/db/DBService.java
new file mode 100644
index 0000000..3bd8d49
--- /dev/null
+++ b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/db/DBService.java
@@ -0,0 +1,5 @@
+package ru.deft.homework.messagesystem.db;
+
+public interface DBService {
+ String getUserData(long id);
+}
diff --git a/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/db/handlers/GetUserDataRequestHandler.java b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/db/handlers/GetUserDataRequestHandler.java
new file mode 100644
index 0000000..4fb81ec
--- /dev/null
+++ b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/db/handlers/GetUserDataRequestHandler.java
@@ -0,0 +1,24 @@
+package ru.deft.homework.messagesystem.db.handlers;
+
+import lombok.extern.slf4j.Slf4j;
+import ru.deft.homework.client.DBServiceClient;
+import ru.deft.homework.messagesystem.messagesystem.RequestHandler;
+import ru.deft.homework.messagesystem.messagesystem.model.Message;
+
+import java.util.Optional;
+
+@Slf4j
+public class GetUserDataRequestHandler implements RequestHandler {
+ private final DBServiceClient dbService;
+
+ public GetUserDataRequestHandler(DBServiceClient dbService) {
+ this.dbService = dbService;
+ }
+
+ @Override
+ public Optional handle(Message message) {
+ log.debug("in GetUserDataRequestHandler.handle message --> {}", message);
+ return Optional.of(dbService.saveMessageInDbRequest(message));
+
+ }
+}
diff --git a/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/db/impl/DBServiceImpl.java b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/db/impl/DBServiceImpl.java
new file mode 100644
index 0000000..3fd55f6
--- /dev/null
+++ b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/db/impl/DBServiceImpl.java
@@ -0,0 +1,29 @@
+package ru.deft.homework.messagesystem.db.impl;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import ru.deft.homework.messagesystem.db.DBService;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class DBServiceImpl implements DBService {
+ private static final Logger logger = LoggerFactory.getLogger(DBServiceImpl.class);
+ private final Map database = new HashMap<>();
+
+ private void initDatabase() {
+ database.put(1L, "val1");
+ database.put(2L, "val2");
+ database.put(3L, "val3");
+ }
+
+ public DBServiceImpl() {
+ initDatabase();
+ }
+
+ public String getUserData(long id) {
+ logger.info("get data for id:{}", id);
+ return database.get(id);
+ }
+
+}
diff --git a/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/front/FrontendService.java b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/front/FrontendService.java
new file mode 100644
index 0000000..9098758
--- /dev/null
+++ b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/front/FrontendService.java
@@ -0,0 +1,20 @@
+package ru.deft.homework.messagesystem.front;
+
+
+import ru.deft.homework.messagesystem.messagesystem.MsClient;
+import ru.deft.homework.messagesystem.messagesystem.model.Message;
+
+import java.util.Optional;
+import java.util.UUID;
+import java.util.function.Consumer;
+
+public interface FrontendService {
+ void getUserData(long userId, Consumer dataConsumer);
+
+ Optional> takeConsumer(UUID sourceMessageId, Class tClass);
+
+ void setMsClient(MsClient msClient);
+
+ void getUserData(String from, String content, Consumer dataConsumer);
+}
+
diff --git a/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/front/handlers/GetUserDataResponseHandler.java b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/front/handlers/GetUserDataResponseHandler.java
new file mode 100644
index 0000000..e13df8f
--- /dev/null
+++ b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/front/handlers/GetUserDataResponseHandler.java
@@ -0,0 +1,26 @@
+package ru.deft.homework.messagesystem.front.handlers;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import ru.deft.homework.client.FrontendServiceResponce;
+import ru.deft.homework.messagesystem.messagesystem.RequestHandler;
+import ru.deft.homework.messagesystem.messagesystem.model.Message;
+
+import java.util.Optional;
+
+public class GetUserDataResponseHandler implements RequestHandler {
+ private static final Logger logger = LoggerFactory.getLogger(GetUserDataResponseHandler.class);
+
+ private final FrontendServiceResponce frontendServiceResponce;
+
+ public GetUserDataResponseHandler(FrontendServiceResponce frontendServiceResponce) {
+ this.frontendServiceResponce = frontendServiceResponce;
+ }
+
+ @Override
+ public Optional handle(Message message) {
+ logger.info("new message:{}", message);
+ frontendServiceResponce.sendResponceToFrontend(message);
+ return Optional.of(new Message("return", message.getMessage() + "--> From GetUserDataResponseHandler"));
+ }
+}
diff --git a/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/front/impl/FrontendServiceImpl.java b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/front/impl/FrontendServiceImpl.java
new file mode 100644
index 0000000..f41be40
--- /dev/null
+++ b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/front/impl/FrontendServiceImpl.java
@@ -0,0 +1,51 @@
+package ru.deft.homework.messagesystem.front.impl;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import ru.deft.homework.messagesystem.front.FrontendService;
+import ru.deft.homework.messagesystem.messagesystem.MsClient;
+import ru.deft.homework.messagesystem.messagesystem.model.Message;
+
+import java.util.Map;
+import java.util.Optional;
+import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Consumer;
+
+
+public class FrontendServiceImpl implements FrontendService {
+ private static final Logger logger = LoggerFactory.getLogger(FrontendServiceImpl.class);
+
+ private final Map> consumerMap = new ConcurrentHashMap<>();
+ private MsClient msClient;
+
+
+ public FrontendServiceImpl(MsClient msClient) {
+ this.msClient = msClient;
+ }
+
+ @Override
+ public void getUserData(long userId, Consumer dataConsumer) {
+
+ }
+
+ @Override
+ public Optional> takeConsumer(UUID sourceMessageId, Class tClass) {
+ Consumer consumer = (Consumer) consumerMap.remove(sourceMessageId);
+ if (consumer == null) {
+ logger.warn("consumer not found for:{}", sourceMessageId);
+ return Optional.empty();
+ }
+ return Optional.of(consumer);
+ }
+
+ @Override
+ public void setMsClient(MsClient msClient) {
+ this.msClient = msClient;
+ }
+
+ @Override
+ public void getUserData(String from, String content, Consumer dataConsumer) {
+
+ }
+}
diff --git a/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/messagesystem/MessageSystem.java b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/messagesystem/MessageSystem.java
new file mode 100644
index 0000000..2855ebc
--- /dev/null
+++ b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/messagesystem/MessageSystem.java
@@ -0,0 +1,18 @@
+package ru.deft.homework.messagesystem.messagesystem;
+
+
+import ru.deft.homework.messagesystem.messagesystem.model.Message;
+
+public interface MessageSystem {
+
+ void addClient(MsClient msClient);
+
+ void removeClient(String clientId);
+
+ boolean newMessage(Message msg);
+
+ void dispose() throws InterruptedException;
+
+ void start();
+}
+
diff --git a/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/messagesystem/MsClient.java b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/messagesystem/MsClient.java
new file mode 100644
index 0000000..3e22836
--- /dev/null
+++ b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/messagesystem/MsClient.java
@@ -0,0 +1,22 @@
+package ru.deft.homework.messagesystem.messagesystem;
+
+
+import ru.deft.homework.messagesystem.messagesystem.model.Message;
+import ru.deft.homework.messagesystem.messagesystem.model.MessageType;
+
+public interface MsClient {
+
+ void addHandler(MessageType type, RequestHandler requestHandler);
+
+ boolean sendMessage(Message msg);
+
+ void handle(Message msg);
+
+ String getName();
+
+ Message produceMessage(String to, T data, MessageType msgType);
+
+ void setMessageSystem(MessageSystem messageSystem);
+
+ Message produceMessage(String databaseServiceClientName, String from, String content, MessageType userData);
+}
diff --git a/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/messagesystem/RequestHandler.java b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/messagesystem/RequestHandler.java
new file mode 100644
index 0000000..764d883
--- /dev/null
+++ b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/messagesystem/RequestHandler.java
@@ -0,0 +1,11 @@
+package ru.deft.homework.messagesystem.messagesystem;
+
+
+
+import ru.deft.homework.messagesystem.messagesystem.model.Message;
+
+import java.util.Optional;
+
+public interface RequestHandler {
+ Optional handle(Message msg);
+}
diff --git a/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/messagesystem/impl/MessageSystemImpl.java b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/messagesystem/impl/MessageSystemImpl.java
new file mode 100644
index 0000000..298308e
--- /dev/null
+++ b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/messagesystem/impl/MessageSystemImpl.java
@@ -0,0 +1,145 @@
+package ru.deft.homework.messagesystem.messagesystem.impl;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import ru.deft.homework.messagesystem.messagesystem.MessageSystem;
+import ru.deft.homework.messagesystem.messagesystem.MsClient;
+import ru.deft.homework.messagesystem.messagesystem.model.Message;
+
+import java.util.Map;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+
+
+public final class MessageSystemImpl implements MessageSystem {
+ private static final Logger logger = LoggerFactory.getLogger(MessageSystemImpl.class);
+ private static final int MESSAGE_QUEUE_SIZE = 1_000;
+ private static final int MSG_HANDLER_THREAD_LIMIT = 2;
+
+ private final AtomicBoolean runFlag = new AtomicBoolean(true);
+
+ private final Map clientMap = new ConcurrentHashMap<>();
+ private final BlockingQueue messageQueue = new ArrayBlockingQueue<>(MESSAGE_QUEUE_SIZE);
+
+ private final ExecutorService msgProcessor = Executors.newSingleThreadExecutor(runnable -> {
+ Thread thread = new Thread(runnable);
+ thread.setName("msg-processor-thread");
+ return thread;
+ });
+
+ private final ExecutorService msgHandler = Executors.newFixedThreadPool(MSG_HANDLER_THREAD_LIMIT, new ThreadFactory() {
+ private final AtomicInteger threadNameSeq = new AtomicInteger(0);
+
+ @Override
+ public Thread newThread(Runnable runnable) {
+ Thread thread = new Thread(runnable);
+ thread.setName("msg-handler-thread-" + threadNameSeq.incrementAndGet());
+ return thread;
+ }
+ });
+
+ public void start() {
+ new Thread(() -> msgProcessor.submit(this::msgProcessor)).start();
+ }
+
+ private void msgProcessor() {
+ logger.info("msgProcessor started");
+ while (runFlag.get()) {
+ try {
+ if (messageQueue.peek() != null) {
+ Message msg = messageQueue.take();
+ if ("STOP".equals(msg.getMessage())) {
+ logger.info("received the stop message");
+ } else {
+ // find client to
+ MsClient clientTo = clientMap.get(msg.getFrom());
+ if (clientTo == null) {
+ logger.warn("client not found");
+ } else {
+ msgHandler.submit(() -> handleMessage(clientTo, msg));
+ }
+ }
+ }
+ } catch (InterruptedException ex) {
+ logger.error(ex.getMessage(), ex);
+ Thread.currentThread().interrupt();
+ } catch (Exception ex) {
+ logger.error(ex.getMessage(), ex);
+ }
+ }
+ msgHandler.submit(this::messageHandlerShutdown);
+ logger.info("msgProcessor finished");
+
+ }
+
+ private void messageHandlerShutdown() {
+ msgHandler.shutdown();
+ logger.info("msgHandler has been shut down");
+ }
+
+
+ private void handleMessage(MsClient msClient, Message msg) {
+ try {
+ System.out.println(msClient.getName());
+ msClient.handle(msg);
+ } catch (Exception ex) {
+ logger.error(ex.getMessage(), ex);
+ logger.error("message:{}", msg);
+ }
+ }
+
+ private void insertStopMessage() throws InterruptedException {
+ boolean result = messageQueue.offer(new Message("STOP"));
+ while (!result) {
+ Thread.sleep(100);
+ result = messageQueue.offer(new Message("STOP"));
+ }
+ }
+
+
+ @Override
+ public void addClient(MsClient msClient) {
+ logger.info("new client:{}", msClient.getName());
+ if (clientMap.containsKey(msClient.getName())) {
+ throw new IllegalArgumentException("Error. client: " + msClient.getName() + " already exists");
+ }
+ clientMap.put(msClient.getName(), msClient);
+ }
+
+ @Override
+ public void removeClient(String clientId) {
+ MsClient removedClient = clientMap.remove(clientId);
+ if (removedClient == null) {
+ logger.warn("client not found: {}", clientId);
+ } else {
+ logger.info("removed client:{}", removedClient);
+ }
+ }
+
+ @Override
+ public boolean newMessage(Message msg) {
+ if (runFlag.get()) {
+ return messageQueue.offer(msg);
+ } else {
+ logger.warn("MS is being shutting down... rejected:{}", msg);
+ return false;
+ }
+ }
+
+ @Override
+ public void dispose() throws InterruptedException {
+ runFlag.set(false);
+ insertStopMessage();
+ msgProcessor.shutdown();
+ msgHandler.awaitTermination(60, TimeUnit.SECONDS);
+ }
+
+
+}
diff --git a/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/messagesystem/impl/MsClientImpl.java b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/messagesystem/impl/MsClientImpl.java
new file mode 100644
index 0000000..d6f0a7d
--- /dev/null
+++ b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/messagesystem/impl/MsClientImpl.java
@@ -0,0 +1,98 @@
+package ru.deft.homework.messagesystem.messagesystem.impl;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import ru.deft.homework.messagesystem.messagesystem.MessageSystem;
+import ru.deft.homework.messagesystem.messagesystem.MsClient;
+import ru.deft.homework.messagesystem.messagesystem.RequestHandler;
+import ru.deft.homework.messagesystem.messagesystem.model.Message;
+import ru.deft.homework.messagesystem.messagesystem.model.MessageType;
+
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class MsClientImpl implements MsClient {
+ private static final Logger logger = LoggerFactory.getLogger(MsClientImpl.class);
+
+ private final String name;
+ private MessageSystem messageSystem;
+ private final Map handlers = new ConcurrentHashMap<>();
+
+
+ public MsClientImpl(String name) {
+ this.name = name;
+ }
+
+ public MsClientImpl(String name, MessageSystem messageSystem) {
+ this.name = name;
+ this.messageSystem = messageSystem;
+ }
+
+ @Override
+ public void addHandler(MessageType type, RequestHandler requestHandler) {
+ this.handlers.put(type.getValue(), requestHandler);
+ }
+
+ @Override
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public boolean sendMessage(Message msg) {
+ boolean result = messageSystem.newMessage(msg);
+ if (!result) {
+ logger.error("the last message was rejected: {}", msg);
+ }
+ return result;
+ }
+
+ @Override
+ public void handle(Message msg) {
+ logger.info("new message:{}", msg);
+ try {
+ // todo
+ RequestHandler requestHandler = handlers.get(MessageType.USER_DATA.getValue());
+ if (requestHandler != null) {
+ requestHandler.handle(msg).ifPresent(this::sendMessage);
+ } else {
+ logger.error("handler not found for the message type:{}", MessageType.USER_DATA);
+ }
+ } catch (Exception ex) {
+ logger.error("msg:" + msg, ex);
+ }
+ }
+
+ @Override
+ public Message produceMessage(String to, T data, MessageType msgType) {
+ return new Message(to, (String)data);
+ }
+
+ @Override
+ public void setMessageSystem(MessageSystem messageSystem) {
+ if (this.messageSystem == null) {
+ this.messageSystem = messageSystem;
+ }
+ }
+
+ @Override
+ public Message produceMessage(String to, String from, String content, MessageType userData) {
+ return new Message(to, (String) content);
+
+ }
+
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ MsClientImpl msClient = (MsClientImpl) o;
+ return Objects.equals(name, msClient.name);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(name);
+ }
+}
diff --git a/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/messagesystem/model/Message.java b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/messagesystem/model/Message.java
new file mode 100644
index 0000000..423fb8e
--- /dev/null
+++ b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/messagesystem/model/Message.java
@@ -0,0 +1,26 @@
+package ru.deft.homework.messagesystem.messagesystem.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+public class Message {
+
+ private String from;
+ private String message;
+
+ public Message(String message) {
+ this.message = message;
+ }
+
+ @Override
+ public String toString() {
+ return "Message [from=" + from + ", message=" + message + "]";
+ }
+
+}
diff --git a/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/messagesystem/model/MessageType.java b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/messagesystem/model/MessageType.java
new file mode 100644
index 0000000..2180fcf
--- /dev/null
+++ b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/messagesystem/messagesystem/model/MessageType.java
@@ -0,0 +1,15 @@
+package ru.deft.homework.messagesystem.messagesystem.model;
+
+public enum MessageType {
+ USER_DATA("UserData");
+
+ private final String value;
+
+ MessageType(String value) {
+ this.value = value;
+ }
+
+ public String getValue() {
+ return value;
+ }
+}
diff --git a/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/rmi/DBServiceEcho.java b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/rmi/DBServiceEcho.java
new file mode 100644
index 0000000..5ecfdaa
--- /dev/null
+++ b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/rmi/DBServiceEcho.java
@@ -0,0 +1,13 @@
+package ru.deft.homework.rmi;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+
+/*
+ * Created by sgolitsyn on 12/7/19
+ */
+public interface DBServiceEcho extends Remote {
+
+ String requestToDBService(String from, String message) throws RemoteException;
+
+}
diff --git a/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/rmi/FrontendEcho.java b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/rmi/FrontendEcho.java
new file mode 100644
index 0000000..5b566d3
--- /dev/null
+++ b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/rmi/FrontendEcho.java
@@ -0,0 +1,13 @@
+package ru.deft.homework.rmi;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+
+/*
+ * Created by sgolitsyn on 12/7/19
+ */
+public interface FrontendEcho extends Remote {
+
+ String sendResponceToFrontend(String from, String message) throws RemoteException;
+
+}
diff --git a/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/rmi/MessageSystemEcho.java b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/rmi/MessageSystemEcho.java
new file mode 100644
index 0000000..442864f
--- /dev/null
+++ b/otus_2019_06/hw16-maven/messagesystem/src/main/java/ru/deft/homework/rmi/MessageSystemEcho.java
@@ -0,0 +1,13 @@
+package ru.deft.homework.rmi;
+
+import java.rmi.Remote;
+import java.rmi.RemoteException;
+
+/*
+ * Created by sgolitsyn on 12/7/19
+ */
+public interface MessageSystemEcho extends Remote {
+
+ String requestToMessageSystem(String from, String message) throws RemoteException;
+
+}
diff --git a/otus_2019_06/hw16-maven/messagesystem/src/main/resources/application.properties b/otus_2019_06/hw16-maven/messagesystem/src/main/resources/application.properties
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/otus_2019_06/hw16-maven/messagesystem/src/main/resources/application.properties
@@ -0,0 +1 @@
+
diff --git a/otus_2019_06/hw16-maven/messagesystem/src/test/java/ru/deft/homework/MessagesystemApplicationTests.java b/otus_2019_06/hw16-maven/messagesystem/src/test/java/ru/deft/homework/MessagesystemApplicationTests.java
new file mode 100644
index 0000000..ca5ce97
--- /dev/null
+++ b/otus_2019_06/hw16-maven/messagesystem/src/test/java/ru/deft/homework/MessagesystemApplicationTests.java
@@ -0,0 +1,13 @@
+package ru.deft.homework;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class MessagesystemApplicationTests {
+
+ @Test
+ void contextLoads() {
+ }
+
+}
diff --git a/otus_2019_06/hw16-maven/mvnw b/otus_2019_06/hw16-maven/mvnw
new file mode 100755
index 0000000..21d3ee8
--- /dev/null
+++ b/otus_2019_06/hw16-maven/mvnw
@@ -0,0 +1,310 @@
+#!/bin/sh
+# ----------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+# ----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+# Maven2 Start Up Batch script
+#
+# Required ENV vars:
+# ------------------
+# JAVA_HOME - location of a JDK home dir
+#
+# Optional ENV vars
+# -----------------
+# M2_HOME - location of maven2's installed home dir
+# MAVEN_OPTS - parameters passed to the Java VM when running Maven
+# e.g. to debug Maven itself, use
+# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+# ----------------------------------------------------------------------------
+
+if [ -z "$MAVEN_SKIP_RC" ] ; then
+
+ if [ -f /etc/mavenrc ] ; then
+ . /etc/mavenrc
+ fi
+
+ if [ -f "$HOME/.mavenrc" ] ; then
+ . "$HOME/.mavenrc"
+ fi
+
+fi
+
+# OS specific support. $var _must_ be set to either true or false.
+cygwin=false;
+darwin=false;
+mingw=false
+case "`uname`" in
+ CYGWIN*) cygwin=true ;;
+ MINGW*) mingw=true;;
+ Darwin*) darwin=true
+ # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
+ # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
+ if [ -z "$JAVA_HOME" ]; then
+ if [ -x "/usr/libexec/java_home" ]; then
+ export JAVA_HOME="`/usr/libexec/java_home`"
+ else
+ export JAVA_HOME="/Library/Java/Home"
+ fi
+ fi
+ ;;
+esac
+
+if [ -z "$JAVA_HOME" ] ; then
+ if [ -r /etc/gentoo-release ] ; then
+ JAVA_HOME=`java-config --jre-home`
+ fi
+fi
+
+if [ -z "$M2_HOME" ] ; then
+ ## resolve links - $0 may be a link to maven's home
+ PRG="$0"
+
+ # need this for relative symlinks
+ while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG="`dirname "$PRG"`/$link"
+ fi
+ done
+
+ saveddir=`pwd`
+
+ M2_HOME=`dirname "$PRG"`/..
+
+ # make it fully qualified
+ M2_HOME=`cd "$M2_HOME" && pwd`
+
+ cd "$saveddir"
+ # echo Using m2 at $M2_HOME
+fi
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched
+if $cygwin ; then
+ [ -n "$M2_HOME" ] &&
+ M2_HOME=`cygpath --unix "$M2_HOME"`
+ [ -n "$JAVA_HOME" ] &&
+ JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+ [ -n "$CLASSPATH" ] &&
+ CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
+fi
+
+# For Mingw, ensure paths are in UNIX format before anything is touched
+if $mingw ; then
+ [ -n "$M2_HOME" ] &&
+ M2_HOME="`(cd "$M2_HOME"; pwd)`"
+ [ -n "$JAVA_HOME" ] &&
+ JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
+fi
+
+if [ -z "$JAVA_HOME" ]; then
+ javaExecutable="`which javac`"
+ if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
+ # readlink(1) is not available as standard on Solaris 10.
+ readLink=`which readlink`
+ if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
+ if $darwin ; then
+ javaHome="`dirname \"$javaExecutable\"`"
+ javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
+ else
+ javaExecutable="`readlink -f \"$javaExecutable\"`"
+ fi
+ javaHome="`dirname \"$javaExecutable\"`"
+ javaHome=`expr "$javaHome" : '\(.*\)/bin'`
+ JAVA_HOME="$javaHome"
+ export JAVA_HOME
+ fi
+ fi
+fi
+
+if [ -z "$JAVACMD" ] ; then
+ if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ else
+ JAVACMD="`which java`"
+ fi
+fi
+
+if [ ! -x "$JAVACMD" ] ; then
+ echo "Error: JAVA_HOME is not defined correctly." >&2
+ echo " We cannot execute $JAVACMD" >&2
+ exit 1
+fi
+
+if [ -z "$JAVA_HOME" ] ; then
+ echo "Warning: JAVA_HOME environment variable is not set."
+fi
+
+CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
+
+# traverses directory structure from process work directory to filesystem root
+# first directory with .mvn subdirectory is considered project base directory
+find_maven_basedir() {
+
+ if [ -z "$1" ]
+ then
+ echo "Path not specified to find_maven_basedir"
+ return 1
+ fi
+
+ basedir="$1"
+ wdir="$1"
+ while [ "$wdir" != '/' ] ; do
+ if [ -d "$wdir"/.mvn ] ; then
+ basedir=$wdir
+ break
+ fi
+ # workaround for JBEAP-8937 (on Solaris 10/Sparc)
+ if [ -d "${wdir}" ]; then
+ wdir=`cd "$wdir/.."; pwd`
+ fi
+ # end of workaround
+ done
+ echo "${basedir}"
+}
+
+# concatenates all lines of a file
+concat_lines() {
+ if [ -f "$1" ]; then
+ echo "$(tr -s '\n' ' ' < "$1")"
+ fi
+}
+
+BASE_DIR=`find_maven_basedir "$(pwd)"`
+if [ -z "$BASE_DIR" ]; then
+ exit 1;
+fi
+
+##########################################################################################
+# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+# This allows using the maven wrapper in projects that prohibit checking in binary data.
+##########################################################################################
+if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Found .mvn/wrapper/maven-wrapper.jar"
+ fi
+else
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
+ fi
+ if [ -n "$MVNW_REPOURL" ]; then
+ jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar"
+ else
+ jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar"
+ fi
+ while IFS="=" read key value; do
+ case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
+ esac
+ done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Downloading from: $jarUrl"
+ fi
+ wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
+ if $cygwin; then
+ wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
+ fi
+
+ if command -v wget > /dev/null; then
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Found wget ... using wget"
+ fi
+ if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
+ wget "$jarUrl" -O "$wrapperJarPath"
+ else
+ wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath"
+ fi
+ elif command -v curl > /dev/null; then
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Found curl ... using curl"
+ fi
+ if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
+ curl -o "$wrapperJarPath" "$jarUrl" -f
+ else
+ curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
+ fi
+
+ else
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo "Falling back to using Java to download"
+ fi
+ javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
+ # For Cygwin, switch paths to Windows format before running javac
+ if $cygwin; then
+ javaClass=`cygpath --path --windows "$javaClass"`
+ fi
+ if [ -e "$javaClass" ]; then
+ if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo " - Compiling MavenWrapperDownloader.java ..."
+ fi
+ # Compiling the Java class
+ ("$JAVA_HOME/bin/javac" "$javaClass")
+ fi
+ if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+ # Running the downloader
+ if [ "$MVNW_VERBOSE" = true ]; then
+ echo " - Running MavenWrapperDownloader.java ..."
+ fi
+ ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
+ fi
+ fi
+ fi
+fi
+##########################################################################################
+# End of extension
+##########################################################################################
+
+export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
+if [ "$MVNW_VERBOSE" = true ]; then
+ echo $MAVEN_PROJECTBASEDIR
+fi
+MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin; then
+ [ -n "$M2_HOME" ] &&
+ M2_HOME=`cygpath --path --windows "$M2_HOME"`
+ [ -n "$JAVA_HOME" ] &&
+ JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
+ [ -n "$CLASSPATH" ] &&
+ CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+ [ -n "$MAVEN_PROJECTBASEDIR" ] &&
+ MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
+fi
+
+# Provide a "standardized" way to retrieve the CLI args that will
+# work with both Windows and non-Windows executions.
+MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
+export MAVEN_CMD_LINE_ARGS
+
+WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+exec "$JAVACMD" \
+ $MAVEN_OPTS \
+ -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
+ "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
+ ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
diff --git a/otus_2019_06/hw16-maven/mvnw.cmd b/otus_2019_06/hw16-maven/mvnw.cmd
new file mode 100644
index 0000000..84d60ab
--- /dev/null
+++ b/otus_2019_06/hw16-maven/mvnw.cmd
@@ -0,0 +1,182 @@
+@REM ----------------------------------------------------------------------------
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements. See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership. The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License. You may obtain a copy of the License at
+@REM
+@REM https://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing,
+@REM software distributed under the License is distributed on an
+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+@REM KIND, either express or implied. See the License for the
+@REM specific language governing permissions and limitations
+@REM under the License.
+@REM ----------------------------------------------------------------------------
+
+@REM ----------------------------------------------------------------------------
+@REM Maven2 Start Up Batch script
+@REM
+@REM Required ENV vars:
+@REM JAVA_HOME - location of a JDK home dir
+@REM
+@REM Optional ENV vars
+@REM M2_HOME - location of maven2's installed home dir
+@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
+@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending
+@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
+@REM e.g. to debug Maven itself, use
+@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+@REM ----------------------------------------------------------------------------
+
+@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
+@echo off
+@REM set title of command window
+title %0
+@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
+@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
+
+@REM set %HOME% to equivalent of $HOME
+if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
+
+@REM Execute a user defined script before this one
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
+@REM check for pre script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
+if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
+:skipRcPre
+
+@setlocal
+
+set ERROR_CODE=0
+
+@REM To isolate internal variables from possible post scripts, we use another setlocal
+@setlocal
+
+@REM ==== START VALIDATION ====
+if not "%JAVA_HOME%" == "" goto OkJHome
+
+echo.
+echo Error: JAVA_HOME not found in your environment. >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+:OkJHome
+if exist "%JAVA_HOME%\bin\java.exe" goto init
+
+echo.
+echo Error: JAVA_HOME is set to an invalid directory. >&2
+echo JAVA_HOME = "%JAVA_HOME%" >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+@REM ==== END VALIDATION ====
+
+:init
+
+@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
+@REM Fallback to current working directory if not found.
+
+set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
+IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
+
+set EXEC_DIR=%CD%
+set WDIR=%EXEC_DIR%
+:findBaseDir
+IF EXIST "%WDIR%"\.mvn goto baseDirFound
+cd ..
+IF "%WDIR%"=="%CD%" goto baseDirNotFound
+set WDIR=%CD%
+goto findBaseDir
+
+:baseDirFound
+set MAVEN_PROJECTBASEDIR=%WDIR%
+cd "%EXEC_DIR%"
+goto endDetectBaseDir
+
+:baseDirNotFound
+set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
+cd "%EXEC_DIR%"
+
+:endDetectBaseDir
+
+IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
+
+@setlocal EnableExtensions EnableDelayedExpansion
+for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
+@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
+
+:endReadAdditionalConfig
+
+SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
+set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
+set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar"
+
+FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
+ IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
+)
+
+@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
+if exist %WRAPPER_JAR% (
+ if "%MVNW_VERBOSE%" == "true" (
+ echo Found %WRAPPER_JAR%
+ )
+) else (
+ if not "%MVNW_REPOURL%" == "" (
+ SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.5/maven-wrapper-0.5.5.jar"
+ )
+ if "%MVNW_VERBOSE%" == "true" (
+ echo Couldn't find %WRAPPER_JAR%, downloading it ...
+ echo Downloading from: %DOWNLOAD_URL%
+ )
+
+ powershell -Command "&{"^
+ "$webclient = new-object System.Net.WebClient;"^
+ "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
+ "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
+ "}"^
+ "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
+ "}"
+ if "%MVNW_VERBOSE%" == "true" (
+ echo Finished downloading %WRAPPER_JAR%
+ )
+)
+@REM End of extension
+
+@REM Provide a "standardized" way to retrieve the CLI args that will
+@REM work with both Windows and non-Windows executions.
+set MAVEN_CMD_LINE_ARGS=%*
+
+%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
+if ERRORLEVEL 1 goto error
+goto end
+
+:error
+set ERROR_CODE=1
+
+:end
+@endlocal & set ERROR_CODE=%ERROR_CODE%
+
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
+@REM check for post script, once with legacy .bat ending and once with .cmd ending
+if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
+if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
+:skipRcPost
+
+@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
+if "%MAVEN_BATCH_PAUSE%" == "on" pause
+
+if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
+
+exit /B %ERROR_CODE%
diff --git a/otus_2019_06/hw16-maven/pom.xml b/otus_2019_06/hw16-maven/pom.xml
new file mode 100644
index 0000000..76e7837
--- /dev/null
+++ b/otus_2019_06/hw16-maven/pom.xml
@@ -0,0 +1,54 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.2.2.RELEASE
+
+
+ ru.deft
+ homework
+ 0.0.1-SNAPSHOT
+ messagesystem
+ Message system for RMI
+
+
+ 11
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.junit.vintage
+ junit-vintage-engine
+
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/otus_2019_06/pom.xml b/otus_2019_06/pom.xml
index 4c2269a..75be862 100644
--- a/otus_2019_06/pom.xml
+++ b/otus_2019_06/pom.xml
@@ -25,6 +25,7 @@
hw13-maven
hw14-maven
hw15-maven
+ hw16-maven
Code examples