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

+
+
+
+
+
+
+
+
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