diff --git a/.idea/artifacts/ProjectMVC_war_exploded.xml b/.idea/artifacts/ProjectMVC_war_exploded.xml
new file mode 100644
index 0000000..964a8c3
--- /dev/null
+++ b/.idea/artifacts/ProjectMVC_war_exploded.xml
@@ -0,0 +1,39 @@
+
+
+ $PROJECT_DIR$/target/SpringBasicProjectMVC-1.0-SNAPSHOT
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/artifacts/SpringFirst_war.xml b/.idea/artifacts/SpringFirst_war.xml
deleted file mode 100644
index 0002a93..0000000
--- a/.idea/artifacts/SpringFirst_war.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
- $PROJECT_DIR$/target
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/artifacts/SpringFirst_war_exploded.xml b/.idea/artifacts/SpringFirst_war_exploded.xml
deleted file mode 100644
index bec8269..0000000
--- a/.idea/artifacts/SpringFirst_war_exploded.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
- $PROJECT_DIR$/target/SpringFirst-1.0-SNAPSHOT
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/artifacts/SpringMVC_FirstProject_war.xml b/.idea/artifacts/SpringMVC_FirstProject_war.xml
deleted file mode 100644
index 866001f..0000000
--- a/.idea/artifacts/SpringMVC_FirstProject_war.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
- $PROJECT_DIR$/target
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/artifacts/SpringMVC_FirstProject_war_exploded.xml b/.idea/artifacts/SpringMVC_FirstProject_war_exploded.xml
deleted file mode 100644
index 5475d55..0000000
--- a/.idea/artifacts/SpringMVC_FirstProject_war_exploded.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
- $PROJECT_DIR$/target/SpringBasicProjectMVC-1.0-SNAPSHOT
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 547d99c..d8e1291 100644
--- a/pom.xml
+++ b/pom.xml
@@ -12,6 +12,8 @@
1.8
4.3.9.RELEASE
4.2.3.RELEASE
+ 4.12
+ 2.8.2
UTF-8
@@ -35,6 +37,11 @@
spring-webmvc
${spring.version}
+
+ org.springframework
+ spring-expression
+ ${spring.version}
+
javax.servlet
javax.servlet-api
@@ -46,6 +53,72 @@
jstl
1.2
+
+ org.projectlombok
+ lombok
+ 1.16.16
+ provided
+
+
+ javax.inject
+ javax.inject
+ 1
+
+
+
+
+ org.springframework
+ spring-aop
+ ${spring.version}
+
+
+ org.aspectj
+ aspectjweaver
+ 1.8.10
+
+
+
+
+
+ junit
+ junit
+ ${junit.version}
+ test
+
+
+ org.springframework
+ spring-test
+ ${spring.version}
+
+
+
+
+
+ org.hibernate.validator
+ hibernate-validator
+ 6.0.0.CR3
+
+
+
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ 2.7.5
+
+
+
+
+
+ org.apache.logging.log4j
+ log4j-api
+ ${log4j.version}
+
+
+ org.apache.logging.log4j
+ log4j-core
+ ${log4j.version}
+
diff --git a/src/main/java/app/controllers/MainController.java b/src/main/java/app/controllers/MainController.java
deleted file mode 100644
index 10cf339..0000000
--- a/src/main/java/app/controllers/MainController.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package app.controllers;
-
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.servlet.ModelAndView;
-
-@Controller
-public class MainController {
-
- @RequestMapping(
- method = {RequestMethod.GET},
- value = {"/main"}
- )
- public ModelAndView showLoginPage(ModelAndView model) {
- model.setViewName("main");
- return model;
- }
-}
diff --git a/src/main/java/app/controllers/UserController.java b/src/main/java/app/controllers/UserController.java
deleted file mode 100644
index 12d19ae..0000000
--- a/src/main/java/app/controllers/UserController.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package app.controllers;
-
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.servlet.ModelAndView;
-
-@Controller
-public class UserController {
-
- @RequestMapping(
- method = {RequestMethod.GET},
- value = {"/password/restore"}
- )
- public ModelAndView showPasswordRecoveryPage(ModelAndView model) {
- model.setViewName("menu");
- model.addObject("message", "This page is used for password recovery");
- return model;
- }
-}
diff --git a/src/main/java/com/tutorial/controllers/UserController.java b/src/main/java/com/tutorial/controllers/UserController.java
new file mode 100644
index 0000000..7585c9f
--- /dev/null
+++ b/src/main/java/com/tutorial/controllers/UserController.java
@@ -0,0 +1,93 @@
+package com.tutorial.controllers;
+
+import com.tutorial.dao.DataSource;
+import com.tutorial.entities.user.User;
+import com.tutorial.entities.user.UserListJAXB;
+import com.tutorial.utils.UsersListJAXBCreator;
+import lombok.Setter;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.inject.Inject;
+import javax.validation.Valid;
+import java.math.BigInteger;
+import java.util.List;
+
+@Controller("userController")
+public class UserController {
+
+ private static final Logger LOGGER = LogManager.getLogger(UserController.class);
+
+ @Setter
+ @Inject
+ private DataSource dataSource;
+
+ @RequestMapping(
+ method = {RequestMethod.GET},
+ value = {"/"}
+ )
+ public ModelAndView showMainPage() {
+ ModelAndView model = new ModelAndView("main", "user", new User());
+ return model;
+ }
+
+ @RequestMapping(
+ method = {RequestMethod.POST},
+ value = {"/check-user"}
+ )
+ public ModelAndView checkUser(@Valid @ModelAttribute("user") User user, BindingResult bindingResult, Model modelFromView) {
+ ModelAndView model = new ModelAndView();
+ if (bindingResult.hasErrors()) {
+ model.setViewName("/main");
+ return model;
+ }
+
+ model.setViewName("menu");
+ model.addObject(user);
+ return model;
+ }
+
+
+ //REST-ful WEB-SERVICES
+ @RequestMapping(value = "json/user/{id}", method = RequestMethod.GET, produces = "application/json")
+ @ResponseBody
+ public User getJsonUser(@PathVariable("id") BigInteger userId) {
+ LOGGER.debug("GET : json/user/{}", userId);
+ return dataSource.getUserById(userId);
+ }
+
+ @RequestMapping(value = "json/users", method = RequestMethod.GET, produces = "application/json")
+ @ResponseBody
+ public List getJsonUsers() {
+ LOGGER.debug("GET : json/users");
+ return dataSource.getUsers();
+ }
+
+ @RequestMapping(value = "xml/user/{id}", method = RequestMethod.GET, produces = "application/xml")
+ @ResponseBody
+ public User getXmlUser(@PathVariable("id") BigInteger userId) {
+ LOGGER.debug("GET : xml/user/{}", userId);
+ return dataSource.getUserById(userId);
+ }
+
+ @RequestMapping(value = "xml/users", method = RequestMethod.GET, produces = "application/xml")
+ @ResponseBody
+ public UserListJAXB getXmlUsers() {
+ LOGGER.debug("GET : xml/users");
+ return UsersListJAXBCreator.createUserList(dataSource.getUsers());
+ }
+
+ @RequestMapping(value = "/user", method = RequestMethod.POST, consumes = "application/json")
+ public ResponseEntity addUser(@RequestBody User user) {
+ LOGGER.debug("POST : /user");
+ dataSource.addUser(user);
+ return ResponseEntity.status(HttpStatus.CREATED).build();
+ }
+}
diff --git a/src/main/java/com/tutorial/dao/DataSource.java b/src/main/java/com/tutorial/dao/DataSource.java
new file mode 100644
index 0000000..d1944c8
--- /dev/null
+++ b/src/main/java/com/tutorial/dao/DataSource.java
@@ -0,0 +1,16 @@
+package com.tutorial.dao;
+
+import com.tutorial.entities.user.User;
+
+import java.math.BigInteger;
+import java.util.List;
+
+public interface DataSource {
+
+ List getUsers();
+
+ void addUser(User user);
+
+ User getUserById(BigInteger userIdToFind);
+
+}
diff --git a/src/main/java/com/tutorial/dao/DataSourceImpl.java b/src/main/java/com/tutorial/dao/DataSourceImpl.java
new file mode 100644
index 0000000..98a795e
--- /dev/null
+++ b/src/main/java/com/tutorial/dao/DataSourceImpl.java
@@ -0,0 +1,37 @@
+package com.tutorial.dao;
+
+import com.tutorial.entities.user.User;
+import lombok.Setter;
+import org.springframework.stereotype.Repository;
+
+import javax.annotation.Resource;
+import java.math.BigInteger;
+import java.util.List;
+
+@Repository
+public class DataSourceImpl implements DataSource {
+
+ @Setter
+ @Resource(name = "userInitDBMock")
+ private List users;
+
+ @Override
+ public List getUsers() {
+ return users;
+ }
+
+ @Override
+ public void addUser(User user) {
+ users.add(user);
+ }
+
+ @Override
+ public User getUserById(BigInteger userIdToFind) {
+ try {
+ User user = users.stream().filter(o -> o.getUserId().equals(userIdToFind)).findFirst().get();
+ return user;
+ } catch (Exception e) {
+ return null;
+ }
+ }
+}
diff --git a/src/main/java/com/tutorial/entities/user/User.java b/src/main/java/com/tutorial/entities/user/User.java
new file mode 100644
index 0000000..e2ca0f7
--- /dev/null
+++ b/src/main/java/com/tutorial/entities/user/User.java
@@ -0,0 +1,26 @@
+package com.tutorial.entities.user;
+
+
+import lombok.Data;
+
+import javax.xml.bind.annotation.*;
+import java.io.Serializable;
+import java.math.BigInteger;
+
+@XmlRootElement(name = "user")
+@XmlType(propOrder = {"userId", "login", "password"})
+@XmlAccessorType(XmlAccessType.FIELD)
+@Data
+public class User implements Serializable {
+
+ @XmlElement(name = "id")
+ private BigInteger userId;
+
+ private String login;
+
+ @XmlElement
+ private String password;
+
+ @XmlAttribute
+ private boolean keepLoggedIn;
+}
diff --git a/src/main/java/com/tutorial/entities/user/UserListJAXB.java b/src/main/java/com/tutorial/entities/user/UserListJAXB.java
new file mode 100644
index 0000000..8298391
--- /dev/null
+++ b/src/main/java/com/tutorial/entities/user/UserListJAXB.java
@@ -0,0 +1,21 @@
+package com.tutorial.entities.user;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlSeeAlso;
+import java.io.Serializable;
+import java.util.List;
+
+@XmlRootElement(name = "users")
+@XmlSeeAlso(User.class)
+@Data
+@NoArgsConstructor(force = true)
+@AllArgsConstructor
+public class UserListJAXB implements Serializable {
+
+ private List users;
+}
diff --git a/src/main/java/com/tutorial/utils/IdUserGenerator.java b/src/main/java/com/tutorial/utils/IdUserGenerator.java
new file mode 100644
index 0000000..96ee236
--- /dev/null
+++ b/src/main/java/com/tutorial/utils/IdUserGenerator.java
@@ -0,0 +1,49 @@
+package com.tutorial.utils;
+
+import com.tutorial.entities.user.User;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.springframework.stereotype.Service;
+
+import java.math.BigInteger;
+import java.nio.ByteBuffer;
+import java.util.UUID;
+
+@Service("idGenerator")
+public class IdUserGenerator {
+
+ public static final int RANDOM_START_VALUE = -1;
+ public static final int BUFFER_SIZE = 16;
+ public static final int ZERO_VALUE = 0;
+
+ private static final Logger LOGGER = LogManager.getLogger(IdUserGenerator.class);
+ public static final int USER_ARG = 0;
+
+ public BigInteger getUniqueUserID() {
+ long val = RANDOM_START_VALUE;
+ do {
+ final UUID uid = UUID.randomUUID();
+ final ByteBuffer buffer = ByteBuffer.wrap(new byte[BUFFER_SIZE]);
+ buffer.putLong(uid.getLeastSignificantBits());
+ buffer.putLong(uid.getMostSignificantBits());
+ final BigInteger bi = new BigInteger(buffer.array());
+ val = bi.longValue();
+ } while (val < ZERO_VALUE);
+
+ BigInteger uniqueId = BigInteger.valueOf(val);
+ LOGGER.debug("GENERATE Unique User ID = " + uniqueId);
+ return uniqueId;
+ }
+
+ public Object fillUniqueId(ProceedingJoinPoint joinPoint) throws Throwable {
+ Object[] args = joinPoint.getArgs();
+ User user = (User) args[USER_ARG];
+ BigInteger uniqueId = getUniqueUserID();
+ user.setUserId(uniqueId);
+ LOGGER.debug("Generate id = {} for user with login : {}", uniqueId, user.getLogin());
+ Object output = joinPoint.proceed();
+ return output;
+ }
+
+}
diff --git a/src/main/java/com/tutorial/utils/UsersListJAXBCreator.java b/src/main/java/com/tutorial/utils/UsersListJAXBCreator.java
new file mode 100644
index 0000000..7a68039
--- /dev/null
+++ b/src/main/java/com/tutorial/utils/UsersListJAXBCreator.java
@@ -0,0 +1,16 @@
+package com.tutorial.utils;
+
+import com.tutorial.entities.user.User;
+import com.tutorial.entities.user.UserListJAXB;
+
+import java.util.List;
+
+/**
+ * Created def327 on 8/7/17.
+ */
+public class UsersListJAXBCreator {
+
+ public static UserListJAXB createUserList(List users) {
+ return new UserListJAXB(users);
+ }
+}
diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml
new file mode 100644
index 0000000..df0007f
--- /dev/null
+++ b/src/main/resources/log4j2.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/applicationContext.xml b/src/main/webapp/WEB-INF/applicationContext.xml
index 142def2..cf9f257 100644
--- a/src/main/webapp/WEB-INF/applicationContext.xml
+++ b/src/main/webapp/WEB-INF/applicationContext.xml
@@ -1,6 +1,38 @@
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:utils="http://www.springframework.org/schema/util"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xmlns:aop="http://www.springframework.org/schema/aop"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/dispatcher-servlet.xml b/src/main/webapp/WEB-INF/dispatcher-servlet.xml
index 9684ea0..eb38f37 100644
--- a/src/main/webapp/WEB-INF/dispatcher-servlet.xml
+++ b/src/main/webapp/WEB-INF/dispatcher-servlet.xml
@@ -2,17 +2,32 @@
+ xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
-
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/views/main.jsp b/src/main/webapp/WEB-INF/views/main.jsp
index f18c8b2..9272b71 100644
--- a/src/main/webapp/WEB-INF/views/main.jsp
+++ b/src/main/webapp/WEB-INF/views/main.jsp
@@ -1,27 +1,38 @@
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
+<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
Main page
" rel="stylesheet">
" rel="stylesheet">
-
-
+ Keep me logged in
+
+
+
+
+
+
+
+
diff --git a/src/main/webapp/WEB-INF/views/menu.jsp b/src/main/webapp/WEB-INF/views/menu.jsp
index cc36074..8450015 100644
--- a/src/main/webapp/WEB-INF/views/menu.jsp
+++ b/src/main/webapp/WEB-INF/views/menu.jsp
@@ -4,7 +4,15 @@
Title
-Password recovery
-${message}
+Hello ${user.login}
+Your password is ${user.password}
+Keep user to be logged is ${user.keepLoggedIn}
+
+To check the bean defenition
+
+Name : ${complexUser2.login}
+Password : ${complexUser2.password}
+Be logged: ${complexUser2.keepLoggedIn}
+