EditProjectAction.java

  1. /*
  2.  * This software was designed and created by Jason Carroll.
  3.  * Copyright (c) 2002, 2003, 2004 Jason Carroll.
  4.  * The author can be reached at jcarroll@cowsultants.com
  5.  * ITracker website: http://www.cowsultants.com
  6.  * ITracker forums: http://www.cowsultants.com/phpBB/index.php
  7.  *
  8.  * This program is free software; you can redistribute it and/or modify
  9.  * it only under the terms of the GNU General Public License as published by
  10.  * the Free Software Foundation; either version 2 of the License, or
  11.  * (at your option) any later version.
  12.  *
  13.  * This program is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  * GNU General Public License for more details.
  17.  */

  18. package org.itracker.web.actions.admin.project;

  19. import org.apache.commons.beanutils.PropertyUtils;
  20. import org.apache.log4j.Logger;
  21. import org.apache.struts.action.*;
  22. import org.itracker.model.PermissionType;
  23. import org.itracker.model.Project;
  24. import org.itracker.model.User;
  25. import org.itracker.model.util.UserUtilities;
  26. import org.itracker.services.ProjectService;
  27. import org.itracker.services.UserService;
  28. import org.itracker.web.actions.base.ItrackerBaseAction;
  29. import org.itracker.web.util.*;

  30. import javax.servlet.ServletException;
  31. import javax.servlet.http.HttpServletRequest;
  32. import javax.servlet.http.HttpServletResponse;
  33. import javax.servlet.http.HttpSession;
  34. import java.io.IOException;
  35. import java.lang.reflect.InvocationTargetException;
  36. import java.util.Arrays;
  37. import java.util.HashSet;
  38. import java.util.Map;
  39. import java.util.Set;

  40. public class EditProjectAction extends ItrackerBaseAction {
  41.     private static final Logger log = Logger.getLogger(EditProjectAction.class);

  42.     public ActionForward execute(ActionMapping mapping, ActionForm form,
  43.                                  HttpServletRequest request, HttpServletResponse response)
  44.             throws ServletException, IOException {

  45.         ActionMessages errors = new ActionMessages();

  46.         if (!isTokenValid(request)) {
  47.             log.debug("Invalid request token while editing project.");
  48.             errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(
  49.                     "itracker.web.error.transaction"));
  50.             saveErrors(request, errors);
  51.             saveToken(request);
  52.             return mapping.getInputForward();

  53.         }
  54.         resetToken(request);

  55.         try {
  56.             ProjectService projectService = ServletContextUtils.getItrackerServices()
  57.                     .getProjectService();
  58.             UserService userService = ServletContextUtils.getItrackerServices().getUserService();

  59.             HttpSession session = request.getSession(true);
  60.             User user = LoginUtilities.getCurrentUser(request);

  61.             String action = request.getParameter("action");

  62.             if ("update".equals(action)) {

  63.                 Map<Integer, Set<PermissionType>> userPermissions = RequestHelper.getUserPermissions(session);


  64.                 Project project = projectService.getProject((Integer) PropertyUtils
  65.                         .getSimpleProperty(form, "id"));
  66.                 if (!UserUtilities.hasPermission(userPermissions, project
  67.                         .getId(), PermissionType.PRODUCT_ADMIN)) {
  68.                     return mapping.findForward("unauthorized");
  69.                 }
  70.                 AdminProjectUtilities.setFormProperties(project,
  71.                         projectService, form, errors);
  72.                 if (!errors.isEmpty()) {
  73.                     saveErrors(request, errors);
  74.                     return mapping.getInputForward();
  75.                 } else {
  76.                     Integer[] ownersArray = (Integer[]) PropertyUtils
  77.                             .getSimpleProperty(form, "owners");
  78.                     Set<Integer> ownerIds = null == ownersArray ? new HashSet<Integer>()
  79.                             : new HashSet<Integer>(Arrays.asList(ownersArray));
  80.                     AdminProjectUtilities.updateProjectOwners(project,
  81.                             ownerIds, projectService, userService);

  82.                     if (log.isDebugEnabled()) {
  83.                         log.debug("execute: updating existing project: "
  84.                                 + project);
  85.                     }
  86.                     projectService.updateProject(project, user
  87.                             .getId());
  88.                 }
  89.             } else if ("create".equals(action)) {
  90.                 if (!user.isSuperUser()) {
  91.                     return mapping.findForward("unauthorized");
  92.                 }

  93.                 Project project = new Project();
  94.                 AdminProjectUtilities.setFormProperties(project,
  95.                         projectService, form, errors);
  96.                 if (!errors.isEmpty()) {
  97.                     saveErrors(request, errors);
  98.                     return mapping.getInputForward();
  99.                 }
  100.                 project = projectService.createProject(project, user.getId());

  101.                 if (log.isDebugEnabled()) {
  102.                     log.debug("execute: created new project: " + project);
  103.                 }

  104.                 Integer[] users = (Integer[]) PropertyUtils.getSimpleProperty(
  105.                         form, "users");
  106.                 if (users != null) {
  107.                     // get the initial project members from create-form
  108.                     Set<Integer> userIds = new HashSet<Integer>(Arrays
  109.                             .asList(users));
  110.                     // get the permissions-set for initial project members
  111.                     Integer[] permissionArray = (Integer[]) PropertyUtils
  112.                             .getSimpleProperty(form, "permissions");
  113.                     Set<Integer> permissions = null == permissionArray ? new HashSet<Integer>(
  114.                             0)
  115.                             : new HashSet<Integer>(Arrays
  116.                             .asList(permissionArray));

  117.                     Integer[] ownersArray = (Integer[]) PropertyUtils
  118.                             .getSimpleProperty(form, "owners");
  119.                     Set<Integer> ownerIds = null == ownersArray ? new HashSet<Integer>()
  120.                             : new HashSet<Integer>(Arrays.asList(ownersArray));

  121.                     // if admin-permission is selected, all permissions will be
  122.                     // granted and users added as project owners
  123.                     if (permissions
  124.                             .contains(UserUtilities.PERMISSION_PRODUCT_ADMIN)) {
  125.                         ownerIds.addAll(userIds);
  126.                     } else {
  127.                         // handle special initial user-/permissions-set
  128.                         AdminProjectUtilities.handleInitialProjectMembers(
  129.                                 project, userIds, permissions, projectService,
  130.                                 userService);
  131.                     }

  132.                     // set project owners with all permissions
  133.                     AdminProjectUtilities.updateProjectOwners(project,
  134.                             ownerIds, projectService, userService);
  135.                 }

  136.                 if (log.isDebugEnabled()) {
  137.                     log.debug("execute: updating new project: " + project);
  138.                 }
  139.                 session.removeAttribute(Constants.PROJECT_KEY);
  140.             }
  141.         } catch (RuntimeException e) {
  142.             log.error("execute: Exception processing form data", e);
  143.             errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(
  144.                     "itracker.web.error.system"));
  145.         } catch (IllegalAccessException e) {
  146.             log.error("execute: Exception processing form data", e);
  147.             errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(
  148.                     "itracker.web.error.system"));
  149.         } catch (InvocationTargetException e) {
  150.             log.error("execute: Exception processing form data", e);
  151.             errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(
  152.                     "itracker.web.error.system"));
  153.         } catch (NoSuchMethodException e) {
  154.             log.error("execute: Exception processing form data", e);
  155.             errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(
  156.                     "itracker.web.error.system"));
  157.         }

  158.         if (!errors.isEmpty()) {
  159.             saveErrors(request, errors);
  160.             if (log.isDebugEnabled()) {
  161.                 log.debug("execute: got errors in action-messages: " + errors);
  162.             }
  163.             return mapping.findForward("error");
  164.         }

  165.         return mapping.findForward("listprojectsadmin");
  166.     }

  167. }