server/src/jetbrains/buildServer/vsoRooms/controllers/VSONotifierSettingsPageExtension.java (115 lines of code) (raw):
package jetbrains.buildServer.vsoRooms.controllers;
import jetbrains.buildServer.controllers.*;
import jetbrains.buildServer.users.SUser;
import jetbrains.buildServer.users.User;
import jetbrains.buildServer.users.UserModel;
import jetbrains.buildServer.users.UserNotFoundException;
import jetbrains.buildServer.vsoRooms.Constants;
import jetbrains.buildServer.vsoRooms.rest.impl.VSOTeamRoomsAPIImpl;
import jetbrains.buildServer.web.openapi.PlaceId;
import jetbrains.buildServer.web.openapi.PluginDescriptor;
import jetbrains.buildServer.web.openapi.SimplePageExtension;
import jetbrains.buildServer.web.openapi.WebControllerManager;
import jetbrains.buildServer.web.util.SessionUser;
import jetbrains.buildServer.web.util.WebUtil;
import org.apache.log4j.Logger;
import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
/**
* @author Evgeniy.Koshkin
*/
public class VSONotifierSettingsPageExtension extends SimplePageExtension {
private static final Logger LOG = Logger.getLogger(VSONotifierSettingsPageExtension.class);
private final UserModel myUserModel;
public VSONotifierSettingsPageExtension(@NotNull WebControllerManager web,
@NotNull UserModel userModel,
@NotNull PluginDescriptor pluginDescriptor) {
super(web);
myUserModel = userModel;
setPluginName(Constants.NOTIFICATOR_TYPE);
setIncludeUrl(pluginDescriptor.getPluginResourcesPath("editUserSettings.jsp"));
setPlaceId(PlaceId.NOTIFIER_SETTINGS_FRAGMENT);
register();
web.registerController("/vso/userSettings.html", new EditUserSettingsController());
}
@Override
public boolean isAvailable(@NotNull HttpServletRequest request) {
return "/profile.html".equals(WebUtil.getPathWithoutContext(request)) || getPluginName().equals(request.getParameter("notificatorType"));
}
@Override
public void fillModel(@NotNull Map<String, Object> model, @NotNull HttpServletRequest request) {
User user = SessionUser.getUser(request);
final String userIdStr = request.getParameter("userId");
if (userIdStr != null) {
long userId = Long.parseLong(userIdStr);
user = myUserModel.findUserById(userId);
if (user == null) throw new UserNotFoundException(userId, "User with id " + userIdStr + " does not exist");
}
model.put("settingsBean", VSONotificationUserSettingsBean.createFromUserSettings(user));
}
private class EditUserSettingsController extends BaseFormXmlController {
@Override
protected ModelAndView doGet(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response) {
return null;
}
@Override
protected void doPost(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull Element xmlResponse) {
if (PublicKeyUtil.isPublicKeyExpired(request)) {
PublicKeyUtil.writePublicKeyExpiredError(xmlResponse);
return;
}
final VSONotificationUserSettingsBean bean = new VSONotificationUserSettingsBean();
FormUtil.bindFromRequest(request, bean);
if (isStoreInSessionRequest(request)) {
XmlResponseUtil.writeFormModifiedIfNeeded(xmlResponse, bean);
return;
}
ActionErrors errors = validate(bean);
if (errors.hasNoErrors()) {
if (isTestConnectionRequest(request)) {
String testResult = testSettings(bean);
XmlResponseUtil.writeTestResult(xmlResponse, testResult);
}
else {
SUser user = SessionUser.getUser(request);
final String userIdStr = request.getParameter("userId");
if (userIdStr != null) {
long userId = Long.parseLong(userIdStr);
user = myUserModel.findUserById(userId);
if (user == null) throw new UserNotFoundException(userId, "User with id " + userIdStr + " does not exist");
}
VSONotificationUserSettingsBean.saveAsUserSettings(bean, user);
FormUtil.removeAllFromSession(request.getSession(), bean.getClass());
writeRedirect(xmlResponse, request.getContextPath() + "/profile.html?tab=userNotifications¬ificatorType=" + Constants.NOTIFICATOR_TYPE);
}
}
writeErrors(xmlResponse, errors);
}
private boolean isStoreInSessionRequest(final HttpServletRequest request) {
return "storeInSession".equals(request.getParameter("submitSettings"));
}
private boolean isTestConnectionRequest(final HttpServletRequest request) {
return "testConnection".equals(request.getParameter("submitSettings"));
}
private ActionErrors validate(VSONotificationUserSettingsBean settingsBean) {
final ActionErrors errors = new ActionErrors();
if (settingsBean.getAccount() == null || settingsBean.getAccount().trim().length() == 0) {
errors.addError("emptyAccount", "Account must not be empty");
}
if (settingsBean.getTeamRoomName() == null || settingsBean.getTeamRoomName().trim().length() == 0) {
errors.addError("emptyTeamRoomName", "Team room name must not be empty");
}
if (settingsBean.getUsername() == null || settingsBean.getUsername().trim().length() == 0) {
errors.addError("emptyUsername", "Username must not be empty");
}
if (settingsBean.getPassword() == null || settingsBean.getPassword().trim().length() == 0) {
errors.addError("emptyPassword", "Password must not be empty");
}
return errors;
}
private String testSettings(@NotNull VSONotificationUserSettingsBean settingsBean) {
return new VSOTeamRoomsAPIImpl().testConnection(settingsBean.getAccount(), settingsBean.getUsername(), settingsBean.getPassword());
}
}
}