Commit aa193b2bfcfe1a4fcc550aa25636b18fc15d9eaa

Authored by Julien Iguchi-Cartigny
0 parents

First version

.gitignore 0 โ†’ 100644
  1 +++ a/.gitignore
... ... @@ -0,0 +1,3 @@
  1 +*.iml
  2 +.idea/
  3 +src/main/webapp/META-INF/
... ...
pom.xml 0 โ†’ 100644
  1 +++ a/pom.xml
... ... @@ -0,0 +1,141 @@
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<project xmlns="http://maven.apache.org/POM/4.0.0"
  3 + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
  5 + http://maven.apache.org/maven-v4_0_0.xsd">
  6 +
  7 + <modelVersion>4.0.0</modelVersion>
  8 + <groupId>fr.plil.sio</groupId>
  9 + <artifactId>spring-mvc-sample</artifactId>
  10 + <packaging>war</packaging>
  11 + <version>0.2</version>
  12 +
  13 + <dependencies>
  14 +
  15 + <dependency>
  16 + <groupId>org.springframework</groupId>
  17 + <artifactId>spring-webmvc</artifactId>
  18 + <version>${spring.version}</version>
  19 + </dependency>
  20 +
  21 + <dependency>
  22 + <groupId>org.springframework</groupId>
  23 + <artifactId>spring-web</artifactId>
  24 + <version>${spring.version}</version>
  25 + </dependency>
  26 +
  27 + <dependency>
  28 + <groupId>org.springframework</groupId>
  29 + <artifactId>spring-context</artifactId>
  30 + <version>${spring.version}</version>
  31 + </dependency>
  32 +
  33 + <dependency>
  34 + <groupId>javax.servlet</groupId>
  35 + <artifactId>javax.servlet-api</artifactId>
  36 + <version>${servlet.version}</version>
  37 + <scope>provided</scope>
  38 + </dependency>
  39 +
  40 + <dependency>
  41 + <groupId>javax.servlet.jsp</groupId>
  42 + <artifactId>jsp-api</artifactId>
  43 + <version>${jsp.version}</version>
  44 + <scope>provided</scope>
  45 + </dependency>
  46 +
  47 + <dependency>
  48 + <groupId>javax.el</groupId>
  49 + <artifactId>el-api</artifactId>
  50 + <version>${jsp.el.version}</version>
  51 + <scope>provided</scope>
  52 + </dependency>
  53 +
  54 + <dependency>
  55 + <groupId>javax.servlet</groupId>
  56 + <artifactId>jstl</artifactId>
  57 + <version>${jsp.jstl.version}</version>
  58 + </dependency>
  59 +
  60 + <dependency>
  61 + <groupId>junit</groupId>
  62 + <artifactId>junit</artifactId>
  63 + <version>${junit.version}</version>
  64 + <scope>test</scope>
  65 + </dependency>
  66 +
  67 + <dependency>
  68 + <groupId>org.springframework</groupId>
  69 + <artifactId>spring-test</artifactId>
  70 + <version>${spring.version}</version>
  71 + <scope>test</scope>
  72 + </dependency>
  73 +
  74 + <dependency>
  75 + <groupId>org.slf4j</groupId>
  76 + <artifactId>slf4j-api</artifactId>
  77 + <version>${slf4j.version}</version>
  78 + <scope>compile</scope>
  79 + </dependency>
  80 +
  81 + <dependency>
  82 + <groupId>ch.qos.logback</groupId>
  83 + <artifactId>logback-classic</artifactId>
  84 + <version>${logback.version}</version>
  85 + </dependency>
  86 +
  87 + <dependency>
  88 + <groupId>org.slf4j</groupId>
  89 + <artifactId>log4j-over-slf4j</artifactId>
  90 + <version>${slf4j.version}</version>
  91 + </dependency>
  92 +
  93 + <dependency>
  94 + <groupId>org.slf4j</groupId>
  95 + <artifactId>jcl-over-slf4j</artifactId>
  96 + <version>${slf4j.version}</version>
  97 + </dependency>
  98 +
  99 + <dependency>
  100 + <groupId>org.slf4j</groupId>
  101 + <artifactId>jul-to-slf4j</artifactId>
  102 + <version>${slf4j.version}</version>
  103 + </dependency>
  104 +
  105 + </dependencies>
  106 +
  107 + <build>
  108 + <plugins>
  109 + <plugin>
  110 + <groupId>org.apache.maven.plugins</groupId>
  111 + <artifactId>maven-compiler-plugin</artifactId>
  112 + <version>2.3.2</version>
  113 + <configuration>
  114 + <source>1.6</source>
  115 + <target>1.6</target>
  116 + </configuration>
  117 + </plugin>
  118 + <plugin>
  119 + <artifactId>maven-war-plugin</artifactId>
  120 + <configuration>
  121 + <failOnMissingWebXml>false</failOnMissingWebXml>
  122 + </configuration>
  123 + <version>2.1.1</version>
  124 + </plugin>
  125 + </plugins>
  126 + <finalName>spring-mvc-sample</finalName>
  127 + </build>
  128 +
  129 + <properties>
  130 + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  131 + <spring.version>3.2.5.RELEASE</spring.version>
  132 + <slf4j.version>1.7.5</slf4j.version>
  133 + <junit.version>4.10</junit.version>
  134 + <logback.version>1.0.13</logback.version>
  135 + <servlet.version>3.1.0</servlet.version>
  136 + <jsp.version>2.2</jsp.version>
  137 + <jsp.el.version>2.2</jsp.el.version>
  138 + <jsp.jstl.version>1.2</jsp.jstl.version>
  139 + </properties>
  140 +
  141 +</project>
0 142 \ No newline at end of file
... ...
src/main/java/fr/plil/sio/web/mvc/CheckUserInterceptor.java 0 โ†’ 100644
  1 +++ a/src/main/java/fr/plil/sio/web/mvc/CheckUserInterceptor.java
... ... @@ -0,0 +1,44 @@
  1 +package fr.plil.sio.web.mvc;
  2 +
  3 +import java.io.IOException;import javax.annotation.Resource;
  4 +;
  5 +import javax.servlet.http.HttpServletRequest;
  6 +import javax.servlet.http.HttpServletResponse;
  7 +import org.slf4j.Logger;
  8 +import org.slf4j.LoggerFactory;
  9 +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
  10 +
  11 +public class CheckUserInterceptor extends HandlerInterceptorAdapter {
  12 +
  13 + private static final Logger logger = LoggerFactory.getLogger(CheckUserInterceptor.class);
  14 +
  15 + @Resource
  16 + private UserSession userSession;
  17 +
  18 + @Override
  19 + public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
  20 + Object handler) throws IOException {
  21 +
  22 + logger.debug("path info: " + request.getPathInfo());
  23 +
  24 + if (request.getPathInfo().equals("/login")) {
  25 + logger.debug("access granted as path is /login");
  26 + return true;
  27 + }
  28 +
  29 + String username = userSession.getUsername();
  30 +
  31 + if (username != null) {
  32 + logger.debug("authenticated");
  33 + return true;
  34 + } else {
  35 + logger.debug("not authenticated");
  36 + response.sendRedirect("login");
  37 + return false;
  38 + }
  39 + }
  40 +
  41 + void setUserSession(UserSession userSession) {
  42 + this.userSession = userSession;
  43 + }
  44 +}
... ...
src/main/java/fr/plil/sio/web/mvc/LoginController.java 0 โ†’ 100644
  1 +++ a/src/main/java/fr/plil/sio/web/mvc/LoginController.java
... ... @@ -0,0 +1,51 @@
  1 +package fr.plil.sio.web.mvc;
  2 +
  3 +import javax.annotation.Resource;
  4 +import org.springframework.stereotype.Controller;
  5 +import org.springframework.validation.BindingResult;
  6 +import org.springframework.web.bind.annotation.RequestMapping;
  7 +import org.springframework.web.bind.annotation.RequestMethod;
  8 +import org.springframework.web.servlet.ModelAndView;
  9 +
  10 +@Controller
  11 +public class LoginController {
  12 +
  13 + @Resource
  14 + private UserDao userDao;
  15 +
  16 + @Resource
  17 + private UserSession userSession;
  18 +
  19 + @RequestMapping(value = "/login", method = RequestMethod.GET)
  20 + public ModelAndView getLoginForm() {
  21 + return new ModelAndView("login", "user", new User());
  22 + }
  23 +
  24 + @RequestMapping(value = "/login", method = RequestMethod.POST)
  25 + public String postLoginCheck(User user, BindingResult result) {
  26 +
  27 + User userFromDao = userDao.getFromUsername(user.getUsername());
  28 +
  29 + if (userFromDao == null) {
  30 + result.rejectValue("username","login.form.invalid");
  31 + return "login";
  32 + }
  33 +
  34 + if(!userFromDao.getPassword().equals(user.getPassword())) {
  35 + result.rejectValue("username","login.form.invalid");
  36 + return "login";
  37 + }
  38 +
  39 + userSession.setUsername(userFromDao.getUsername());
  40 +
  41 + return "redirect:/";
  42 + }
  43 +
  44 + public void setUserDao(UserDao userDao) {
  45 + this.userDao = userDao;
  46 + }
  47 +
  48 + public void setUserSession(UserSession userSession) {
  49 + this.userSession = userSession;
  50 + }
  51 +}
0 52 \ No newline at end of file
... ...
src/main/java/fr/plil/sio/web/mvc/LogoutController.java 0 โ†’ 100644
  1 +++ a/src/main/java/fr/plil/sio/web/mvc/LogoutController.java
... ... @@ -0,0 +1,23 @@
  1 +package fr.plil.sio.web.mvc;
  2 +
  3 +import javax.annotation.Resource;
  4 +import org.springframework.stereotype.Controller;
  5 +import org.springframework.web.bind.annotation.RequestMapping;
  6 +import org.springframework.web.bind.annotation.RequestMethod;
  7 +
  8 +@Controller
  9 +public class LogoutController {
  10 +
  11 + @Resource
  12 + private UserSession userSession;
  13 +
  14 + @RequestMapping(value = {"/logout"}, method = RequestMethod.GET)
  15 + public String getLogout() {
  16 + userSession.setUsername(null);
  17 + return "redirect:/";
  18 + }
  19 +
  20 + public void setUserSession(UserSession userSession) {
  21 + this.userSession = userSession;
  22 + }
  23 +}
... ...
src/main/java/fr/plil/sio/web/mvc/NewUserController.java 0 โ†’ 100644
  1 +++ a/src/main/java/fr/plil/sio/web/mvc/NewUserController.java
... ... @@ -0,0 +1,60 @@
  1 +package fr.plil.sio.web.mvc;
  2 +
  3 +import javax.annotation.Resource;
  4 +import org.springframework.stereotype.Controller;
  5 +import org.springframework.validation.BindingResult;
  6 +import org.springframework.web.bind.annotation.RequestMapping;
  7 +import org.springframework.web.bind.annotation.RequestMethod;
  8 +import org.springframework.web.servlet.ModelAndView;
  9 +
  10 +@Controller
  11 +public class NewUserController {
  12 +
  13 + @Resource
  14 + private UserDao userDao;
  15 + @Resource
  16 + private UserSession userSession;
  17 + @Resource
  18 + private UserValidator userValidator;
  19 +
  20 + @RequestMapping(value = {"/newUser"}, method = RequestMethod.GET)
  21 + public ModelAndView getNewUserForm() {
  22 + return new ModelAndView("newUser", "user", new User());
  23 + }
  24 +
  25 + @RequestMapping(value = {"/newUser"}, method = RequestMethod.POST)
  26 + public String postNewUser(User user, BindingResult result) {
  27 +
  28 + if (!userSession.getUsername().equals("admin")) {
  29 + result.rejectValue("username", "new.user.only.admin");
  30 + }
  31 +
  32 + userValidator.validate(user, result);
  33 +
  34 + boolean present = (userDao.getFromUsername(user.getUsername()) != null);
  35 +
  36 + if (present) {
  37 + result.rejectValue("username", "new.user.form.present");
  38 + }
  39 +
  40 + if(result.hasErrors()) {
  41 + return "newUser";
  42 + }
  43 +
  44 + userDao.save(user);
  45 +
  46 + return "redirect:/";
  47 + }
  48 +
  49 + public void setUserDao(UserDao userDao) {
  50 + this.userDao = userDao;
  51 + }
  52 +
  53 + public void setUserSession(UserSession userSession) {
  54 + this.userSession = userSession;
  55 + }
  56 +
  57 + public void setUserValidator(UserValidator userValidator) {
  58 + this.userValidator = userValidator;
  59 + }
  60 +}
... ...
src/main/java/fr/plil/sio/web/mvc/User.java 0 โ†’ 100644
  1 +++ a/src/main/java/fr/plil/sio/web/mvc/User.java
... ... @@ -0,0 +1,42 @@
  1 +package fr.plil.sio.web.mvc;
  2 +
  3 +public class User {
  4 +
  5 + private String username;
  6 + private String password;
  7 +
  8 + public String getUsername() {
  9 + return username;
  10 + }
  11 +
  12 + public void setUsername(String username) {
  13 + this.username = username;
  14 + }
  15 +
  16 + public String getPassword() {
  17 + return password;
  18 + }
  19 +
  20 + public void setPassword(String password) {
  21 + this.password = password;
  22 + }
  23 +
  24 + @Override
  25 + public boolean equals(Object obj) {
  26 + if (obj == null) {
  27 + return false;
  28 + }
  29 + if (getClass() != obj.getClass()) {
  30 + return false;
  31 + }
  32 + final User other = (User) obj;
  33 + return !((this.username == null) ? (other.username != null) : !this.username.equals(other.username));
  34 + }
  35 +
  36 + @Override
  37 + public int hashCode() {
  38 + int hash = 7;
  39 + hash = 29 * hash + (this.username != null ? this.username.hashCode() : 0);
  40 + return hash;
  41 + }
  42 +}
... ...
src/main/java/fr/plil/sio/web/mvc/UserDao.java 0 โ†’ 100644
  1 +++ a/src/main/java/fr/plil/sio/web/mvc/UserDao.java
... ... @@ -0,0 +1,16 @@
  1 +package fr.plil.sio.web.mvc;
  2 +
  3 +import java.util.Set;
  4 +
  5 +public interface UserDao {
  6 +
  7 + boolean save(User user);
  8 +
  9 + User getFromUsername(String username);
  10 +
  11 + Set<User> getAllUsers();
  12 +
  13 + boolean update(User user);
  14 +
  15 + boolean delete(User user);
  16 +}
... ...
src/main/java/fr/plil/sio/web/mvc/UserDaoImpl.java 0 โ†’ 100644
  1 +++ a/src/main/java/fr/plil/sio/web/mvc/UserDaoImpl.java
... ... @@ -0,0 +1,48 @@
  1 +package fr.plil.sio.web.mvc;
  2 +
  3 +import java.util.HashSet;
  4 +import java.util.Set;
  5 +import org.springframework.stereotype.Repository;
  6 +
  7 +@Repository(value = "userDao")
  8 +public class UserDaoImpl implements UserDao {
  9 +
  10 + private Set<User> users = new HashSet<User>();
  11 +
  12 + public UserDaoImpl() {
  13 + User user = new User();
  14 + user.setUsername("admin");
  15 + user.setPassword("admin");
  16 + users.add(user);
  17 + }
  18 +
  19 + @Override
  20 + public boolean save(User user) {
  21 + return users.add(user);
  22 + }
  23 +
  24 + @Override
  25 + public User getFromUsername(String username) {
  26 + for (User user : users) {
  27 + if (user.getUsername().equals(username)) {
  28 + return user;
  29 + }
  30 + }
  31 + return null;
  32 + }
  33 +
  34 + @Override
  35 + public Set<User> getAllUsers() {
  36 + return users;
  37 + }
  38 +
  39 + @Override
  40 + public boolean update(User user) {
  41 + throw new UnsupportedOperationException("Not supported.");
  42 + }
  43 +
  44 + @Override
  45 + public boolean delete(User user) {
  46 + throw new UnsupportedOperationException("Not supported.");
  47 + }
  48 +}
... ...
src/main/java/fr/plil/sio/web/mvc/UserSession.java 0 โ†’ 100644
  1 +++ a/src/main/java/fr/plil/sio/web/mvc/UserSession.java
... ... @@ -0,0 +1,17 @@
  1 +package fr.plil.sio.web.mvc;
  2 +
  3 +import java.io.Serializable;
  4 +import org.springframework.stereotype.Component;
  5 +
  6 +public class UserSession implements Serializable {
  7 +
  8 + private String username;
  9 +
  10 + public String getUsername() {
  11 + return username;
  12 + }
  13 +
  14 + public void setUsername(String username) {
  15 + this.username = username;
  16 + }
  17 +}
... ...
src/main/java/fr/plil/sio/web/mvc/UserValidator.java 0 โ†’ 100644
  1 +++ a/src/main/java/fr/plil/sio/web/mvc/UserValidator.java
... ... @@ -0,0 +1,28 @@
  1 +package fr.plil.sio.web.mvc;
  2 +
  3 +import org.springframework.stereotype.Component;
  4 +import org.springframework.validation.Errors;
  5 +import org.springframework.validation.Validator;
  6 +
  7 +@Component
  8 +public class UserValidator implements Validator {
  9 +
  10 + @Override
  11 + public boolean supports(Class<?> clazz) {
  12 + return User.class.equals(clazz);
  13 + }
  14 +
  15 + @Override
  16 + public void validate(Object target, Errors errors) {
  17 + User user = (User)target;
  18 +
  19 + if (user.getUsername().length() < 3) {
  20 + errors.rejectValue("username", "validator.user.username.minimal.size");
  21 + }
  22 +
  23 + if (user.getPassword().length() < 3) {
  24 + errors.rejectValue("password", "validator.user.password.minimal.size");
  25 + }
  26 + }
  27 +
  28 +}
... ...
src/main/java/fr/plil/sio/web/mvc/ViewUsersController.java 0 โ†’ 100644
  1 +++ a/src/main/java/fr/plil/sio/web/mvc/ViewUsersController.java
... ... @@ -0,0 +1,41 @@
  1 +package fr.plil.sio.web.mvc;
  2 +
  3 +import java.util.Set;
  4 +import javax.annotation.Resource;
  5 +import org.springframework.stereotype.Controller;
  6 +import org.springframework.web.bind.annotation.ModelAttribute;
  7 +import org.springframework.web.bind.annotation.RequestMapping;
  8 +import org.springframework.web.bind.annotation.RequestMethod;
  9 +
  10 +@Controller
  11 +public class ViewUsersController {
  12 +
  13 + @Resource
  14 + private UserDao userDao;
  15 +
  16 + @Resource
  17 + private UserSession userSession;
  18 +
  19 + @ModelAttribute("users")
  20 + public Set<User> populateUsers() {
  21 + return userDao.getAllUsers();
  22 + }
  23 +
  24 + @ModelAttribute("userSession")
  25 + public UserSession populateUser() {
  26 + return userSession;
  27 + }
  28 +
  29 + @RequestMapping(value={"/"},method=RequestMethod.GET)
  30 + public String getViewUsers() {
  31 + return "viewUsers";
  32 + }
  33 +
  34 + public void setUserDao(UserDao userDao) {
  35 + this.userDao = userDao;
  36 + }
  37 +
  38 + public void setUserSession(UserSession userSession) {
  39 + this.userSession = userSession;
  40 + }
  41 +}
... ...
src/main/java/fr/plil/sio/web/mvc/WebAppConfig.java 0 โ†’ 100644
  1 +++ a/src/main/java/fr/plil/sio/web/mvc/WebAppConfig.java
... ... @@ -0,0 +1,62 @@
  1 +package fr.plil.sio.web.mvc;
  2 +
  3 +import org.springframework.context.MessageSource;
  4 +import org.springframework.context.annotation.Bean;
  5 +import org.springframework.context.annotation.ComponentScan;
  6 +import org.springframework.context.annotation.Configuration;
  7 +import org.springframework.context.annotation.Scope;
  8 +import org.springframework.context.annotation.ScopedProxyMode;
  9 +import org.springframework.context.support.ResourceBundleMessageSource;
  10 +import org.springframework.web.servlet.ViewResolver;
  11 +import org.springframework.web.servlet.config.annotation.EnableWebMvc;
  12 +import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
  13 +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
  14 +import org.springframework.web.servlet.view.InternalResourceViewResolver;
  15 +import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
  16 +
  17 +@EnableWebMvc
  18 +@ComponentScan(basePackages = {"fr.plil.sio.web.mvc"}, scopedProxy = ScopedProxyMode.TARGET_CLASS)
  19 +@Configuration
  20 +public class WebAppConfig extends WebMvcConfigurationSupport {
  21 +
  22 + @Bean
  23 + @Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
  24 + public UserSession userSession() {
  25 + return new UserSession();
  26 + }
  27 +
  28 + @Bean
  29 + public CheckUserInterceptor checkUserInterceptor() {
  30 + return new CheckUserInterceptor();
  31 + }
  32 +
  33 + @Override
  34 + public void addInterceptors(InterceptorRegistry registry) {
  35 + CheckUserInterceptor interceptor = checkUserInterceptor();
  36 + interceptor.setUserSession(userSession());
  37 + registry.addInterceptor(interceptor);
  38 + }
  39 +
  40 + @Bean
  41 + public MessageSource messageSource() {
  42 + ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
  43 + messageSource.setBasename("messages");
  44 + return messageSource;
  45 + }
  46 +
  47 + @Bean
  48 + public ViewResolver viewResolver() {
  49 + InternalResourceViewResolver resolver = new InternalResourceViewResolver();
  50 + resolver.setPrefix("/WEB-INF/jsp/");
  51 + resolver.setSuffix(".jsp");
  52 + return resolver;
  53 + }
  54 +
  55 + @Bean
  56 + public RequestMappingHandlerMapping requestMappingHandlerMapping() {
  57 + RequestMappingHandlerMapping handlerMapping = super.requestMappingHandlerMapping();
  58 + handlerMapping.setUseSuffixPatternMatch(false);
  59 + handlerMapping.setUseTrailingSlashMatch(false);
  60 + return handlerMapping;
  61 + }
  62 +}
... ...
src/main/java/fr/plil/sio/web/mvc/WebAppInitializer.java 0 โ†’ 100644
  1 +++ a/src/main/java/fr/plil/sio/web/mvc/WebAppInitializer.java
... ... @@ -0,0 +1,28 @@
  1 +package fr.plil.sio.web.mvc;
  2 +
  3 +import javax.servlet.ServletContext;
  4 +import javax.servlet.ServletException;
  5 +import javax.servlet.ServletRegistration;
  6 +import org.springframework.web.WebApplicationInitializer;
  7 +import org.springframework.web.servlet.DispatcherServlet;
  8 +import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
  9 +import org.springframework.web.context.ContextLoaderListener;
  10 +import org.springframework.web.context.WebApplicationContext;
  11 +
  12 +public class WebAppInitializer implements WebApplicationInitializer {
  13 +
  14 + @Override
  15 + public void onStartup(ServletContext servletContext) throws ServletException {
  16 + WebApplicationContext context = getContext();
  17 + servletContext.addListener(new ContextLoaderListener(context));
  18 + ServletRegistration.Dynamic dispatcher = servletContext.addServlet("DispatcherServlet", new DispatcherServlet(context));
  19 + dispatcher.setLoadOnStartup(1);
  20 + dispatcher.addMapping("/*");
  21 + }
  22 +
  23 + private AnnotationConfigWebApplicationContext getContext() {
  24 + AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
  25 + context.register(WebAppConfig.class);
  26 + return context;
  27 + }
  28 +}
... ...
src/main/resources/messages.properties 0 โ†’ 100644
  1 +++ a/src/main/resources/messages.properties
... ... @@ -0,0 +1,21 @@
  1 +domain.user.username=Username
  2 +domain.user.password=Password
  3 +
  4 +validator.user.username.minimal.size=Username must be at least 3 characters
  5 +validator.user.password.minimal.size=Password must be at least 3 characters
  6 +
  7 +login.page.title=Login Page
  8 +login.main.header=Please login...
  9 +login.form.submit=login
  10 +login.form.invalid=Invalid username and/or password
  11 +
  12 +view.users.page.title=User List
  13 +view.users.main.header=List of users
  14 +view.users.greetings=Hello
  15 +view.users.main.logout=Logout
  16 +
  17 +new.user.page.title=New user
  18 +new.user.main.header=Add a new user
  19 +new.user.form.submit=Add the user
  20 +new.user.only.admin=Only administrator user can do it
  21 +new.user.form.present=user already present
0 22 \ No newline at end of file
... ...
src/main/webapp/WEB-INF/jsp/login.jsp 0 โ†’ 100644
  1 +++ a/src/main/webapp/WEB-INF/jsp/login.jsp
... ... @@ -0,0 +1,33 @@
  1 +<%@ page contentType="text/html" pageEncoding="UTF-8" %>
  2 +<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>
  3 +<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
  4 +
  5 +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
  6 + "http://www.w3.org/TR/html4/strict.dtd">
  7 +
  8 +<html>
  9 + <head>
  10 + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  11 + <title><spring:message code="login.page.title"/></title>
  12 + </head>
  13 + <body>
  14 + <h1><spring:message code="login.main.header"/></h1>
  15 + <form:form commandName="user" method="POST">
  16 + <table id="login" class="box">
  17 + <tr>
  18 + <td><form:errors path="*"/></td>
  19 + </tr>
  20 + <tr>
  21 + <td><spring:message code="domain.user.username"/></td>
  22 + <td><form:input path="username"/></td>
  23 + </tr>
  24 + <tr>
  25 + <td><spring:message code="domain.user.password"/></td>
  26 + <td><form:password path="password"/></td></tr>
  27 + <tr>
  28 + <td><input type="submit" value="<spring:message code="login.form.submit"/>"/></td>
  29 + </tr>
  30 + </table>
  31 + </form:form>
  32 + </body>
  33 +</html>
0 34 \ No newline at end of file
... ...
src/main/webapp/WEB-INF/jsp/newUser.jsp 0 โ†’ 100644
  1 +++ a/src/main/webapp/WEB-INF/jsp/newUser.jsp
... ... @@ -0,0 +1,36 @@
  1 +<%@ page contentType="text/html" pageEncoding="UTF-8" %>
  2 +<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
  3 +<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>
  4 +
  5 +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
  6 + "http://www.w3.org/TR/html4/strict.dtd">
  7 +
  8 +<html>
  9 + <head>
  10 + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  11 + <title><spring:message code="new.user.page.title"/></title>
  12 + </head>
  13 + <body>
  14 + <h1><spring:message code="new.user.main.header"/></h1>
  15 + <form:form commandName="user" method="POST">
  16 + <table>
  17 + <tr>
  18 + <td><form:errors path="username"/></td>
  19 + </tr>
  20 + <tr>
  21 + <td><spring:message code="domain.user.username"/></td>
  22 + <td><form:input path="username"/></td>
  23 + </tr>
  24 + <tr>
  25 + <td><form:errors path="password"/></td>
  26 + </tr>
  27 + <tr>
  28 + <td><spring:message code="domain.user.password"/></td>
  29 + <td><form:password path="password"/></td></tr>
  30 + <tr>
  31 + <td><input type="submit" value="<spring:message code="new.user.form.submit"/>"/></td>
  32 + </tr>
  33 + </table>
  34 + </form:form>
  35 + </body>
  36 +</html>
... ...
src/main/webapp/WEB-INF/jsp/viewUsers.jsp 0 โ†’ 100644
  1 +++ a/src/main/webapp/WEB-INF/jsp/viewUsers.jsp
... ... @@ -0,0 +1,39 @@
  1 +<%@ page contentType="text/html" pageEncoding="UTF-8" %>
  2 +<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>
  3 +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  4 +
  5 +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
  6 + "http://www.w3.org/TR/html4/strict.dtd">
  7 +
  8 +<html>
  9 + <head>
  10 + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  11 + <title><spring:message code="view.users.page.title"/></title>
  12 + </head>
  13 + <body>
  14 + <h1><spring:message code="view.users.main.header"/></h1>
  15 +
  16 + <h4><spring:message code="view.users.greetings"/> ${userSession.username} !</h4>
  17 +
  18 + <table>
  19 + <thead>
  20 + <tr>
  21 + <td><spring:message code="domain.user.username"/></td>
  22 + </tr>
  23 + </thead>
  24 + <tbody>
  25 + <c:forEach items="${users}" var="user">
  26 + <tr>
  27 + <td>${user.username}</td>
  28 + </tr>
  29 + </c:forEach>
  30 + </tbody>
  31 + </table>
  32 +
  33 + <ul>
  34 + <li><a href="newUser"><spring:message code="new.user.main.header"/></a></li>
  35 + <li><a href="logout"><spring:message code="view.users.main.logout"/></a></li>
  36 + </ul>
  37 +
  38 +</body>
  39 +</html>
... ...
src/test/java/fr/plil/sio/web/mvc/CheckUserInterceptorTest.java 0 โ†’ 100644
  1 +++ a/src/test/java/fr/plil/sio/web/mvc/CheckUserInterceptorTest.java
... ... @@ -0,0 +1,45 @@
  1 +package fr.plil.sio.web.mvc;
  2 +
  3 +import java.io.IOException;
  4 +import static org.junit.Assert.*;
  5 +import org.junit.Before;
  6 +import org.junit.Test;
  7 +import org.springframework.mock.web.MockHttpServletRequest;
  8 +import org.springframework.mock.web.MockHttpServletResponse;
  9 +
  10 +public class CheckUserInterceptorTest {
  11 +
  12 + private CheckUserInterceptor interceptor;
  13 + private UserSession userSession;
  14 + private MockHttpServletRequest request;
  15 + private MockHttpServletResponse response;
  16 +
  17 + @Before
  18 + public void createInstances() {
  19 + interceptor = new CheckUserInterceptor();
  20 + userSession = new UserSession();
  21 + interceptor.setUserSession(userSession);
  22 + request = new MockHttpServletRequest();
  23 + response = new MockHttpServletResponse();
  24 + }
  25 +
  26 + @Test
  27 + public void checkPreHandleServletPathIsLogin() throws IOException {
  28 + request.setPathInfo("/login");
  29 + assertTrue(interceptor.preHandle(request, response, null));
  30 + }
  31 +
  32 + @Test
  33 + public void checkPreHandleUsernameInSession() throws IOException {
  34 + userSession.setUsername("admin");
  35 + request.setPathInfo("/blabla");
  36 + assertTrue(interceptor.preHandle(request, response, null));
  37 + }
  38 +
  39 + @Test
  40 + public void checkPreHandleUsernameNotInSession() throws IOException {
  41 + request.setPathInfo("/blabla");
  42 + assertFalse(interceptor.preHandle(request, response, null));
  43 + assertEquals(response.getRedirectedUrl(),"login");
  44 + }
  45 +}
... ...
src/test/java/fr/plil/sio/web/mvc/LoginControllerTest.java 0 โ†’ 100644
  1 +++ a/src/test/java/fr/plil/sio/web/mvc/LoginControllerTest.java
... ... @@ -0,0 +1,55 @@
  1 +package fr.plil.sio.web.mvc;
  2 +
  3 +import static org.junit.Assert.*;
  4 +import org.junit.Before;
  5 +import org.junit.Test;
  6 +import org.springframework.validation.BeanPropertyBindingResult;
  7 +import org.springframework.validation.BindingResult;
  8 +import org.springframework.web.servlet.ModelAndView;
  9 +
  10 +public class LoginControllerTest {
  11 +
  12 + private LoginController loginController;
  13 + private BindingResult results;
  14 + private User user;
  15 + private UserDao userDao;
  16 + private UserSession userSession;
  17 +
  18 + @Before
  19 + public void createInstances() {
  20 + loginController = new LoginController();
  21 + user = new User();
  22 + results = new BeanPropertyBindingResult(user, "user");
  23 + userDao = new UserDaoImpl();
  24 + loginController.setUserDao(userDao);
  25 + userSession = new UserSession();
  26 + loginController.setUserSession(userSession);
  27 + }
  28 +
  29 + @Test
  30 + public void testGetLoginForm() {
  31 + ModelAndView mav = loginController.getLoginForm();
  32 + assertEquals("login", mav.getViewName());
  33 + assertEquals(1, mav.getModelMap().size());
  34 + assertTrue(mav.getModel().containsKey("user"));
  35 + assertTrue(mav.getModel().get("user") instanceof User);
  36 + }
  37 +
  38 + @Test
  39 + public void testPostLoginCheckSucceed() {
  40 + user.setUsername("admin");
  41 + user.setPassword("admin");
  42 + String view = loginController.postLoginCheck(user, results);
  43 + assertFalse(results.hasErrors());
  44 + assertEquals("redirect:/",view);
  45 + }
  46 +
  47 + @Test
  48 + public void testPostLoginCheckFailed() {
  49 + user.setUsername("abc");
  50 + user.setPassword("abc");
  51 + String view = loginController.postLoginCheck(user, results);
  52 + assertTrue(results.hasErrors());
  53 + assertEquals("login",view);
  54 + }
  55 +}
... ...
src/test/java/fr/plil/sio/web/mvc/LogoutControllerTest.java 0 โ†’ 100644
  1 +++ a/src/test/java/fr/plil/sio/web/mvc/LogoutControllerTest.java
... ... @@ -0,0 +1,18 @@
  1 +package fr.plil.sio.web.mvc;
  2 +
  3 +import static org.junit.Assert.*;
  4 +import org.junit.Test;
  5 +
  6 +public class LogoutControllerTest {
  7 +
  8 + @Test
  9 + public void testGetLogout() {
  10 + LogoutController logoutController = new LogoutController();
  11 + UserSession userSession = new UserSession();
  12 + userSession.setUsername("blabla");
  13 + logoutController.setUserSession(userSession);
  14 + String view = logoutController.getLogout();
  15 + assertNull(userSession.getUsername());
  16 + assertEquals("redirect:/",view);
  17 + }
  18 +}
... ...
src/test/java/fr/plil/sio/web/mvc/NewUserControllerTest.java 0 โ†’ 100644
  1 +++ a/src/test/java/fr/plil/sio/web/mvc/NewUserControllerTest.java
... ... @@ -0,0 +1,78 @@
  1 +package fr.plil.sio.web.mvc;
  2 +
  3 +import static org.junit.Assert.*;
  4 +import org.junit.Before;
  5 +import org.junit.Test;
  6 +import org.springframework.validation.BeanPropertyBindingResult;
  7 +import org.springframework.validation.BindingResult;
  8 +import org.springframework.web.servlet.ModelAndView;
  9 +
  10 +public class NewUserControllerTest {
  11 +
  12 + private NewUserController newUserController;
  13 + private BindingResult results;
  14 + private User user;
  15 + private UserDao userDao;
  16 + private UserSession userSession;
  17 + private UserValidator userValidator;
  18 +
  19 + @Before
  20 + public void createInstances() {
  21 + newUserController = new NewUserController();
  22 + user = new User();
  23 + results = new BeanPropertyBindingResult(user, "user");
  24 + userDao = new UserDaoImpl();
  25 + newUserController.setUserDao(userDao);
  26 + userSession = new UserSession();
  27 + userSession.setUsername("admin");
  28 + newUserController.setUserSession(userSession);
  29 + userValidator = new UserValidator();
  30 + newUserController.setUserValidator(userValidator);
  31 + }
  32 +
  33 + @Test
  34 + public void testGetNewUserForm() {
  35 + ModelAndView mav = newUserController.getNewUserForm();
  36 + assertEquals("newUser", mav.getViewName());
  37 + assertEquals(1, mav.getModelMap().size());
  38 + assertTrue(mav.getModel().containsKey("user"));
  39 + assertTrue(mav.getModel().get("user") instanceof User);
  40 + }
  41 +
  42 + @Test
  43 + public void testPostNewUserSucceed() {
  44 + user.setUsername("abc");
  45 + user.setPassword("abc");
  46 + String view = newUserController.postNewUser(user, results);
  47 + assertFalse(results.hasErrors());
  48 + assertEquals("redirect:/",view);
  49 + }
  50 +
  51 + @Test
  52 + public void testPostNewUserFailedNotAdmin() {
  53 + user.setUsername("abc");
  54 + user.setPassword("abc");
  55 + userSession.setUsername("blabla");
  56 + String view = newUserController.postNewUser(user, results);
  57 + assertTrue(results.hasErrors());
  58 + assertEquals("newUser",view);
  59 + }
  60 +
  61 + @Test
  62 + public void testPostNewUserFailedValidate() {
  63 + user.setUsername("a");
  64 + user.setPassword("abc");
  65 + String view = newUserController.postNewUser(user, results);
  66 + assertTrue(results.hasErrors());
  67 + assertEquals("newUser",view);
  68 + }
  69 +
  70 + @Test
  71 + public void testPostNewUserFailedAlreadyPresent() {
  72 + user.setUsername("admin");
  73 + user.setPassword("blabla");
  74 + String view = newUserController.postNewUser(user, results);
  75 + assertTrue(results.hasErrors());
  76 + assertEquals("newUser",view);
  77 + }
  78 +}
... ...
src/test/java/fr/plil/sio/web/mvc/UserDaoTest.java 0 โ†’ 100644
  1 +++ a/src/test/java/fr/plil/sio/web/mvc/UserDaoTest.java
... ... @@ -0,0 +1,63 @@
  1 +package fr.plil.sio.web.mvc;
  2 +
  3 +import static org.junit.Assert.*;
  4 +import org.junit.Before;
  5 +import org.junit.Test;
  6 +
  7 +public class UserDaoTest {
  8 +
  9 + private UserDao userDao;
  10 +
  11 + @Before
  12 + public void createInstances() {
  13 + userDao = new UserDaoImpl();
  14 + }
  15 +
  16 + @Test
  17 + public void testAdminPresent() {
  18 + assertEquals(1, userDao.getAllUsers().size());
  19 + assertNotNull(userDao.getFromUsername("admin"));
  20 + assertEquals("admin", userDao.getFromUsername("admin").getUsername());
  21 + }
  22 +
  23 + @Test
  24 + public void testSaveSucceed() {
  25 + User user = new User();
  26 + user.setUsername("abc");
  27 + user.setPassword("abc");
  28 + assertTrue(userDao.save(user));
  29 + }
  30 +
  31 + @Test
  32 + public void testSaveFailed() {
  33 + User user = new User();
  34 + user.setUsername("admin");
  35 + user.setPassword("abc");
  36 + assertFalse(userDao.save(user));
  37 + }
  38 +
  39 + @Test
  40 + public void testGetFromUsernameFound() {
  41 + User user = new User();
  42 + user.setUsername("abc");
  43 + user.setPassword("abc");
  44 + userDao.save(user);
  45 + assertNotNull(userDao.getFromUsername("admin"));
  46 + assertEquals("admin",userDao.getFromUsername("admin").getUsername());
  47 + }
  48 +
  49 + @Test
  50 + public void testGetFromUsernameNotFound() {
  51 + assertNull(userDao.getFromUsername("abc"));
  52 + }
  53 +
  54 + @Test
  55 + public void testGetAllUsers() {
  56 + assertEquals(1,userDao.getAllUsers().size());
  57 + User user = new User();
  58 + user.setUsername("abc");
  59 + user.setPassword("abc");
  60 + assertTrue(userDao.save(user));
  61 + assertEquals(2,userDao.getAllUsers().size());
  62 + }
  63 +}
0 64 \ No newline at end of file
... ...
src/test/java/fr/plil/sio/web/mvc/UserValidatorTest.java 0 โ†’ 100644
  1 +++ a/src/test/java/fr/plil/sio/web/mvc/UserValidatorTest.java
... ... @@ -0,0 +1,48 @@
  1 +package fr.plil.sio.web.mvc;
  2 +
  3 +import static org.junit.Assert.*;
  4 +import org.junit.Before;
  5 +import org.junit.Test;
  6 +import org.springframework.validation.BeanPropertyBindingResult;
  7 +import org.springframework.validation.Errors;
  8 +
  9 +public class UserValidatorTest {
  10 +
  11 + private User user;
  12 + private UserValidator validator;
  13 + private Errors results;
  14 +
  15 + @Before
  16 + public void createInstances() {
  17 + validator = new UserValidator();
  18 + user = new User();
  19 + user.setUsername("abc");
  20 + user.setPassword("abc");
  21 + results = new BeanPropertyBindingResult(user, "user");
  22 + }
  23 +
  24 + @Test
  25 + public void testSupports() {
  26 + assertTrue(validator.supports(User.class));
  27 + }
  28 +
  29 + @Test
  30 + public void testValidateCorrect() {
  31 + validator.validate(user,results);
  32 + assertFalse(results.hasErrors());
  33 + }
  34 +
  35 + @Test
  36 + public void testValidatePasswordTooShort() {
  37 + user.setPassword("ab");
  38 + validator.validate(user,results);
  39 + assertTrue(results.hasErrors());
  40 + }
  41 +
  42 + @Test
  43 + public void testValidateUsernameTooShort() {
  44 + user.setUsername("ab");
  45 + validator.validate(user,results);
  46 + assertTrue(results.hasErrors());
  47 + }
  48 +}
... ...
src/test/java/fr/plil/sio/web/mvc/ViewUsersControllerTest.java 0 โ†’ 100644
  1 +++ a/src/test/java/fr/plil/sio/web/mvc/ViewUsersControllerTest.java
... ... @@ -0,0 +1,37 @@
  1 +package fr.plil.sio.web.mvc;
  2 +
  3 +import static org.junit.Assert.*;
  4 +import org.junit.Before;
  5 +import org.junit.Test;
  6 +
  7 +public class ViewUsersControllerTest {
  8 +
  9 + private ViewUsersController viewUsersController;
  10 + private UserDao userDao;
  11 + private UserSession userSession;
  12 +
  13 + @Before
  14 + public void createInstances() {
  15 + viewUsersController = new ViewUsersController();
  16 + userDao = new UserDaoImpl();
  17 + viewUsersController.setUserDao(userDao);
  18 + userSession = new UserSession();
  19 + userSession.setUsername("admin");
  20 + viewUsersController.setUserSession(userSession);
  21 + }
  22 +
  23 + @Test
  24 + public void testPopulateUsers() {
  25 + assertEquals(1, viewUsersController.populateUsers().size());
  26 + }
  27 +
  28 + @Test
  29 + public void testPopulateUser() {
  30 + assertEquals("admin", viewUsersController.populateUser().getUsername());
  31 + }
  32 +
  33 + @Test
  34 + public void testGetViewUsers() {
  35 + assertEquals("viewUsers",viewUsersController.getViewUsers());
  36 + }
  37 +}
... ...