package springmvc.controller; import springmvc.context.BooleanPropertyEditor; import springmvc.context.DatePropertyEditor; import springmvc.context.OpenIdUserInfo; import springmvc.model.Member; import java.security.Principal; import java.util.Date; import java.util.List; import java.util.concurrent.Callable; import javax.servlet.http.HttpServletRequest; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; import org.springframework.mobile.device.Device; import org.springframework.security.openid.OpenIDAuthenticationToken; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import springdao.DaoManager; import springdao.RepositoryManager; import springdao.support.DaoPropertyEditor; /** * * @author Kent Yeh */ @Controller public class DefaultController { private static Logger logger = LogManager.getLogger(DefaultController.class); @DaoManager private RepositoryManager<Member> memberManager; @InitBinder public void initBinder(WebDataBinder binder) { binder.registerCustomEditor(Date.class, new DatePropertyEditor()); binder.registerCustomEditor(Date.class, new BooleanPropertyEditor()); binder.registerCustomEditor(Member.class, new DaoPropertyEditor(memberManager)); } @RequestMapping("/") public Callable<String> root(final Device device, final Model model) { return new Callable<String>() { @Override public String call() throws Exception { if (device.isMobile()) { logger.debug("Connect devcie is mobile"); model.addAttribute("device", "mobile"); //return "mobileIndex"; } else if (device.isTablet()) { logger.debug("Connect devcie is tablet"); model.addAttribute("device", "tablet"); //return "tabletIndex"; } else { model.addAttribute("device", "normal"); logger.debug("Connect device is normal device."); } return "index"; } }; } private String getPrincipalId(Principal principal) { Object p = principal instanceof OpenIDAuthenticationToken ? ((OpenIDAuthenticationToken) principal).getPrincipal() : principal; return p instanceof OpenIdUserInfo ? ((OpenIdUserInfo) p).getId() : principal.getName(); } /** * Response all users' data as json. * * @return */ @RequestMapping(value = "/admin/users", method = RequestMethod.POST, produces = "application/json;charset=UTF-8") @ResponseBody public Callable<String> listuser() { return new Callable<String>() { @Override public String call() throws Exception { List<Member> users = memberManager.findByCriteria("WHERE enabled=?1 ORDER BY name", "Y"); if (users == null || users.isEmpty()) { return "{\"total\":0,\"users\":[]}"; } else { StringBuilder sb = new StringBuilder("{\"total\":").append(users.size()).append(",\"users\":["); boolean isFirst = true; for (Member user : users) { if (!isFirst) { sb.append(","); } sb.append("{\"account\":\"").append(user.getId()).append("\",\"name\":\"").append(user.getName()) .append("\",\"birthday\":\"").append(String.format("%tF", user.getBirthDay())).append("\"}"); isFirst = false; } sb.append("]}"); return sb.toString(); } } }; } /** * display current user's info. * * @param request * @param principal * @return */ @RequestMapping("/user/myinfo") public Callable<String> myinfo(final HttpServletRequest request, final Principal principal) { return new Callable<String>() { @Override public String call() throws Exception { request.setAttribute("member", memberManager.findByPrimaryKey(getPrincipalId(principal))); return "index"; } }; } /** * Only adminstrator could display any user's info. * * @param account * @param request * @return */ @RequestMapping("/admin/user/{account}") public Callable<String> userinfo(final @PathVariable Member account, final HttpServletRequest request) { return new Callable<String>() { @Override public String call() throws Exception { if (account != null) { request.setAttribute("member", account); } return "index"; } }; } }