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/com/tutorial/controllers/LoginController.java b/src/main/java/com/tutorial/controllers/LoginController.java deleted file mode 100644 index 158dcb1..0000000 --- a/src/main/java/com/tutorial/controllers/LoginController.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.tutorial.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 LoginController { - - @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/MainController.java b/src/main/java/com/tutorial/controllers/MainController.java deleted file mode 100644 index 107ff62..0000000 --- a/src/main/java/com/tutorial/controllers/MainController.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.tutorial.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/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 dd45d84..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"> - - + + 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}
+ diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index f29e95e..123d326 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -3,17 +3,23 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> + contextConfigLocation - /WEB-INF/dispatcher-servlet.xml + /WEB-INF/applicationContext.xml org.springframework.web.context.ContextLoaderListener + dispatcher org.springframework.web.servlet.DispatcherServlet 1 + + contextConfigLocation + WEB-INF/dispatcher-servlet.xml + dispatcher diff --git a/src/main/webapp/resources/structure.css b/src/main/webapp/resources/structure.css index 559b219..de45d23 100755 --- a/src/main/webapp/resources/structure.css +++ b/src/main/webapp/resources/structure.css @@ -152,3 +152,8 @@ footer#main{ font:normal 11px/16px Arial, Helvetica, sans-serif; width:100%; } + +.errorClass { + font: normal 10px/12px Arial, Helvetica, sans-serif; + color: red; +} diff --git a/src/test/java/com/tutorial/utils/IdUserGeneratorTest.java b/src/test/java/com/tutorial/utils/IdUserGeneratorTest.java new file mode 100644 index 0000000..fdf3a2c --- /dev/null +++ b/src/test/java/com/tutorial/utils/IdUserGeneratorTest.java @@ -0,0 +1,34 @@ +package com.tutorial.utils; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.web.WebAppConfiguration; + +import javax.inject.Inject; + + +@RunWith(SpringJUnit4ClassRunner.class) +@WebAppConfiguration +@ContextConfiguration({ + "file:src/main/webapp/WEB-INF/applicationContext.xml", + "file:src/main/webapp/WEB-INF/dispatcher-servlet.xml" +}) +public class IdUserGeneratorTest { + + private static final Logger LOGGER = LogManager.getLogger(IdUserGenerator.class); + + @Inject + @Qualifier(value = "idGenerator") + private IdUserGenerator idGenerator; + + @Test + public void testGetUniqueUserID() throws Exception { + LOGGER.debug("GENERATE ID : " + idGenerator.getUniqueUserID()); + } + +} \ No newline at end of file