package edu.asu.spring.quadriga.web.workbench; import java.security.Principal; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import org.codehaus.jettison.json.JSONException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; 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.servlet.ModelAndView; import edu.asu.spring.quadriga.accesschecks.IProjectSecurityChecker; import edu.asu.spring.quadriga.aspects.annotations.AccessPolicies; import edu.asu.spring.quadriga.aspects.annotations.CheckedElementType; import edu.asu.spring.quadriga.aspects.annotations.ElementAccessPolicy; import edu.asu.spring.quadriga.domain.workbench.IProject; import edu.asu.spring.quadriga.domain.workspace.IWorkSpace; import edu.asu.spring.quadriga.exceptions.NoSuchRoleException; import edu.asu.spring.quadriga.exceptions.QuadrigaAccessException; import edu.asu.spring.quadriga.exceptions.QuadrigaStorageException; import edu.asu.spring.quadriga.service.passthroughproject.IPassThroughProjectManager; import edu.asu.spring.quadriga.service.workbench.IProjectCollaboratorManager; import edu.asu.spring.quadriga.service.workbench.IRetrieveProjectManager; import edu.asu.spring.quadriga.service.workspace.IListWSManager; import edu.asu.spring.quadriga.web.login.RoleNames; @Controller public class RetrieveProjectController { @Autowired private IRetrieveProjectManager projectManager; @Autowired private IPassThroughProjectManager passThroughManager; @Autowired private IProjectSecurityChecker projectSecurity; @Autowired private IListWSManager wsManager; @Autowired private IProjectCollaboratorManager projectCollaboratorManager; /** * this method acts as a controller for handling all the activities on the * workbench home page * * @param principal * @return string for workbench url * @throws QuadrigaStorageException * @author rohit sukleshwar pendbhaje * @throws JSONException */ @RequestMapping(value = "auth/workbench", method = RequestMethod.GET) public ModelAndView getProjectList(Principal principal) throws QuadrigaStorageException, JSONException { String userName; ModelAndView model; userName = principal.getName(); List<IProject> projectListAsOwner = projectManager.getProjectList(userName); List<IProject> fullProjects = new ArrayList<IProject>(); model = new ModelAndView("auth/workbench"); List<String> projectIds = new ArrayList<String>(); Map<String, Boolean> accessibleProjects = new HashMap<String, Boolean>(); if (projectListAsOwner != null) { for (IProject p : projectListAsOwner) { fullProjects.add(projectManager.getProjectDetails(p.getProjectId())); projectIds.add(p.getProjectId()); accessibleProjects.put(p.getProjectId(), true); } } // Fetch all the projects for which the user is collaborator List<IProject> projectListAsCollaborator = projectManager.getCollaboratorProjectList(userName); if (projectListAsCollaborator != null) { for (IProject p : projectListAsCollaborator) { if (!projectIds.contains(p.getProjectId())) { fullProjects.add(projectManager.getProjectDetails(p.getProjectId())); projectIds.add(p.getProjectId()); accessibleProjects.put(p.getProjectId(), true); } } } // Fetch all the projects for which the user is associated workspace // owner List<IProject> projectListAsWorkspaceOwner = projectManager.getProjectListAsWorkspaceOwner(userName); if (projectListAsWorkspaceOwner != null) { for (IProject p : projectListAsWorkspaceOwner) { if (!projectIds.contains(p.getProjectId())) { fullProjects.add(projectManager.getProjectDetails(p.getProjectId())); projectIds.add(p.getProjectId()); accessibleProjects.put(p.getProjectId(), false); } } } // Fetch all the projects for which the user is associated workspace // collaborator List<IProject> projectListAsWSCollaborator = projectManager.getProjectListAsWorkspaceCollaborator(userName); if (projectListAsWSCollaborator != null) { for (IProject p : projectListAsWSCollaborator) { if (!projectIds.contains(p.getProjectId())) { fullProjects.add(projectManager.getProjectDetails(p.getProjectId())); projectIds.add(p.getProjectId()); accessibleProjects.put(p.getProjectId(), false); } } } Collections.sort(fullProjects, new Comparator<IProject>() { @Override public int compare(IProject o1, IProject o2) { return o1.getProjectName().compareTo(o2.getProjectName()); } }); model.getModelMap().put("projects", fullProjects); model.getModelMap().put("accessibleProjects", accessibleProjects); return model; } @RequestMapping(value = "auth/workbench/projects/{extId:[0-9a-zA-Z-_]+}+{client:[0-9a-zA-Z-]+}", method = RequestMethod.GET) public String getProjectByExternalId(@PathVariable String extId, @PathVariable String client) throws QuadrigaStorageException { IProject project = passThroughManager.getPassthroughProject(extId, client); if (project == null) { return "auth/404"; } return "redirect:/auth/workbench/projects/" + project.getProjectId(); } @AccessPolicies({ @ElementAccessPolicy(type = CheckedElementType.PROJECT, paramIndex = 1, userRole = { RoleNames.ROLE_COLLABORATOR_OWNER, RoleNames.ROLE_PROJ_COLLABORATOR_ADMIN, RoleNames.ROLE_PROJ_COLLABORATOR_CONTRIBUTOR, RoleNames.ROLE_WORKSPACE_COLLABORATOR_EDITOR }) }) @RequestMapping(value = "auth/workbench/projects/{projectid:[0-9a-zA-Z-_]+}", method = RequestMethod.GET) public String getProjectDetails(@PathVariable("projectid") String projectid, Principal principal, Model model) throws QuadrigaStorageException, NoSuchRoleException, QuadrigaAccessException { String userName = principal.getName(); IProject project = projectManager.getProjectDetails(projectid); // retrieve all the workspaces associated with the project List<IWorkSpace> workspaceList = wsManager.listActiveWorkspace(projectid, userName); List<IWorkSpace> collaboratorWorkspaceList = wsManager.listActiveWorkspaceByCollaborator(projectid, userName); List<IWorkSpace> deactiveWorkspaceList = wsManager.listDeactivatedWorkspace(projectid, userName); List<IWorkSpace> archivedWorkspaceList = wsManager.listArchivedWorkspace(projectid, userName); int deactivatedWSSize = deactiveWorkspaceList == null ? 0 : deactiveWorkspaceList.size(); int archivedWSSize = archivedWorkspaceList == null ? 0 : archivedWorkspaceList.size(); model.addAttribute("project", project); model.addAttribute("workspaceList", workspaceList); model.addAttribute("collabworkspacelist", collaboratorWorkspaceList); model.addAttribute("deactivatedWSSize", deactivatedWSSize); model.addAttribute("archivedWSSize", archivedWSSize); List<String> collaboratorRoles = projectSecurity.getCollaboratorRoles(userName, projectid); if (projectSecurity.isProjectOwner(userName, projectid)) { model.addAttribute("owner", true); } else { model.addAttribute("owner", false); } if (collaboratorRoles.contains(RoleNames.ROLE_PROJ_COLLABORATOR_EDITOR)) { model.addAttribute("isProjectEditor", true); } else { model.addAttribute("isProjectEditor", false); } if (collaboratorRoles.contains(RoleNames.ROLE_PROJ_COLLABORATOR_ADMIN)) { model.addAttribute("isProjectAdmin", true); } else { model.addAttribute("isProjectAdmin", false); } if (collaboratorRoles.contains(RoleNames.ROLE_PROJ_COLLABORATOR_CONTRIBUTOR)) { model.addAttribute("isProjectContributor", true); } else { model.addAttribute("isProjectContributor", false); } return "auth/workbench/project"; } }