package com.perforce.controllers;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import com.perforce.ApplicationException;
import com.perforce.P4Helper;
import com.perforce.Utility;
import com.perforce.model.UserInfo;
@Controller
public class MainController {
static Logger logger = Logger.getLogger(MainController.class.getName());
@RequestMapping(value="/login.htm", method=RequestMethod.GET)
public String login(HttpServletRequest request) {
return "login.page";
}
@RequestMapping(value="/loginfailed.htm", method=RequestMethod.GET)
public String loginFailed(HttpServletRequest request) {
return "loginfailed.page";
}
@RequestMapping(value="/unavailable.htm", method=RequestMethod.GET)
public String errorPage(HttpServletRequest request) {
return "application.unavailable.page";
}
@RequestMapping(value="/home.htm", method=RequestMethod.GET)
public String home(HttpServletRequest request) {
return "home.page";
}
@RequestMapping(value="/list.htm", method=RequestMethod.GET)
public String list(HttpServletRequest request) {
return "list.page";
}
@RequestMapping(value="/register.htm", method=RequestMethod.GET)
public String getRegisterForm(HttpServletRequest request) throws ApplicationException {
return "register.form.page";
}
@RequestMapping(value="/register.htm", method=RequestMethod.POST)
public String processRegistration(HttpServletRequest request) throws ApplicationException {
List<String> errors = new ArrayList<String>();
P4Helper helper = Utility.getHelper(request);
String username = null;
String fullname = null;
String password = null;
String confirm = null;
String email = null;
username = request.getParameter("inputUsername");
if(username == null || username.trim().length() == 0) {
errors.add("username is required");
}
if(helper.userExists(username)) {
errors.add("that username is taken... please choose another.");
}
fullname = request.getParameter("inputName");
if(fullname == null || fullname.trim().length() == 0) {
errors.add("full name is required");
}
email = request.getParameter("inputEmail");
if(email == null || email.trim().length() == 0) {
errors.add("email address is required");
}
if(helper.isEnforceUniqueEmails() && helper.userEmailExists(email)) {
errors.add("email address is already in use");
}
if(helper.isServerStoringPasswords()) {
password = request.getParameter("inputPassword");
confirm = request.getParameter("inputConfirm");
if(password == null || password.trim().length() == 0) {
errors.add("empty passwords are not allowed");
} else if(! password.equals(confirm)) {
errors.add("password mismatch");
}
}
if(errors.isEmpty()) {
UserInfo ui = new UserInfo();
ui.setFullName(fullname);
ui.setName(username);
ui.setEmail(email);
ui.setPassword(password);
if(helper.isRequireAccountApproval()) {
helper.setAccountRequest(ui);
} else {
helper.createUser(ui);
}
}
if(!errors.isEmpty()) {
Utility.transferAttribute(request, "inputName");
Utility.transferAttribute(request, "inputUsername");
Utility.transferAttribute(request, "inputEmail");
Utility.transferAttribute(request, "inputPassword");
Utility.transferAttribute(request, "inputConfirm");
request.setAttribute("errors", errors);
return "register.form.page";
} else {
return "register.submitted.page";
}
}
@RequestMapping(value="/user/groupManagement.htm", method=RequestMethod.GET)
public String manageGroups(HttpServletRequest request) throws ApplicationException {
P4Helper helper = Utility.getHelper(request);
UserInfo ui = Utility.getPrincipal();
List<String> availableGroups = helper.getGroups(false);
List<String> autosubscribeGroups = helper.getAutosubscribeGroups();
request.setAttribute("autosubscribeGroups", autosubscribeGroups);
List<String> myGroups = helper.getUserGroups(ui.getName(), false);
request.setAttribute("myGroups", myGroups);
availableGroups.removeAll(myGroups);
request.setAttribute("availableGroups", availableGroups);
return "group.management.page";
}
@RequestMapping(value = "/user/groupManagement.htm", method = RequestMethod.POST)
public String updateGroups(HttpServletRequest request) throws ApplicationException {
P4Helper helper = Utility.getHelper(request);
UserInfo ui = Utility.getPrincipal();
String type = request.getParameter("groupRequest");
List<String> autosubscribeGroups = helper.getAutosubscribeGroups();
if ("remove".equals(type)) {
String[] selected = request.getParameterValues("myGroups");
for (String groupname : selected) {
helper.removeUserFromGroup(ui.getName(), groupname);
}
} else if ("add".equals(type)) {
String[] selected = request.getParameterValues("availableGroups");
for (String groupName : selected) {
if (autosubscribeGroups.contains(groupName)) {
helper.addUserToGroup(ui.getName(), groupName);
} else {
helper.setUserGroupRequest(ui.getName(), groupName);
}
}
}
return "redirect:/user/groupManagement.htm";
}
@RequestMapping(value = "/user/notifications.htm", method = RequestMethod.GET)
public String showNotifications(HttpServletRequest request) throws ApplicationException {
return "user.notification.page";
}
@ExceptionHandler(ApplicationException.class)
public ModelAndView handleApplicationException(HttpServletRequest request, ApplicationException ex) {
logger.error("Request: " + request.getRequestURL() + " raised " + ex);
ModelAndView mav = new ModelAndView();
mav.addObject("url", request.getRequestURL());
mav.addObject("exception", ex);
mav.setViewName("application.exception.page");
return mav;
}
}