package edu.asu.spring.quadriga.web.workspace; import java.security.Principal; import java.util.ArrayList; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import edu.asu.spring.quadriga.accesschecks.IWSSecurityChecker; import edu.asu.spring.quadriga.aspects.IAuthorization; import edu.asu.spring.quadriga.domain.IQuadrigaRole; import edu.asu.spring.quadriga.domain.workbench.IProject; import edu.asu.spring.quadriga.domain.workbench.IProjectCollaborator; import edu.asu.spring.quadriga.domain.workspace.ITextFile; import edu.asu.spring.quadriga.domain.workspace.IWorkSpace; import edu.asu.spring.quadriga.domain.workspace.IWorkspaceCollaborator; import edu.asu.spring.quadriga.domain.workspace.IWorkspaceNetwork; import edu.asu.spring.quadriga.exceptions.Quadriga404Exception; import edu.asu.spring.quadriga.exceptions.QuadrigaAccessException; import edu.asu.spring.quadriga.exceptions.QuadrigaException; import edu.asu.spring.quadriga.exceptions.QuadrigaStorageException; import edu.asu.spring.quadriga.service.textfile.ITextFileManager; import edu.asu.spring.quadriga.service.workbench.IProjectCollaboratorManager; import edu.asu.spring.quadriga.service.workbench.IRetrieveProjectManager; import edu.asu.spring.quadriga.service.workspace.IWorkspaceManager; import edu.asu.spring.quadriga.web.login.RoleNames; /** * Controller to handle all the workspace requests for Quadriga. * * The (Dspace) design flow is to load the list of all communities accessible to * the user and then load all collections within the community selected by the * user. This second call for collection loads all the collections and the items * within them. The last call is to load the set of bitstreams within a selected * item. Any deviation from the above flow is handled by the concerned classes. * * * @author Kiran Kumar Batna * @author Ram Kumar Kumaresan */ @Controller @Scope(value = "session") public class WorkspaceController { public final static int SUCCESS = 1; public final static int FAILURE = 0; @Autowired private IWorkspaceManager wsManager; @Autowired private IWSSecurityChecker workspaceSecurity; @Autowired private ITextFileManager tfManager; @Autowired private IProjectCollaboratorManager projectCollaboratorManager; @Autowired private IRetrieveProjectManager projectManager; @Autowired @Qualifier("workspaceAuthorization") private IAuthorization authorization; private static final Logger logger = LoggerFactory.getLogger(WorkspaceController.class); /** * This will list the details of workspaces * * @param workspaceid * @param model * @return String - url of the page listing all the workspaces of the * project. * @throws QuadrigaStorageException * @author Kiran Kumar Batna * @throws QuadrigaAccessException * @throws QuadrigaException * @author Kiran Kumar Batna * @throws Quadriga404Exception */ @RequestMapping(value = "auth/workbench/workspace/{workspaceid}", method = RequestMethod.GET) public String getWorkspaceDetails(@PathVariable("workspaceid") String workspaceid, Principal principal, ModelMap model) throws QuadrigaStorageException, QuadrigaAccessException, Quadriga404Exception { String userName = principal.getName(); IWorkSpace workspace = wsManager.getWorkspaceDetails(workspaceid, userName); if (workspace == null) { throw new Quadriga404Exception("Workspace with ID " + workspaceid + " does not exist."); } String projectId = wsManager.getProjectIdFromWorkspaceId(workspaceid); IProject project = projectManager.getProjectDetails(projectId); // retrieve the collaborators associated with the workspace List<IWorkspaceCollaborator> workspaceCollaboratorList = workspace.getWorkspaceCollaborators(); workspace.setWorkspaceCollaborators(workspaceCollaboratorList); List<ITextFile> tfList = tfManager.retrieveTextFiles(workspaceid); List<IWorkspaceNetwork> workspaceNetworkList = wsManager.getWorkspaceNetworkList(workspaceid); List<IProjectCollaborator> projectCollaborators = projectCollaboratorManager.getProjectCollaborators(projectId); List<IProjectCollaborator> projectAdmins = new ArrayList<IProjectCollaborator>(); for (IProjectCollaborator collaborator : projectCollaborators) { List<IQuadrigaRole> collaboratorRoles = collaborator.getCollaborator().getCollaboratorRoles(); List<String> roleIds = new ArrayList<String>(); collaboratorRoles.forEach(collaboratorRole -> roleIds.add(collaboratorRole.getId())); if (roleIds.contains(RoleNames.ROLE_PROJ_COLLABORATOR_ADMIN)) { projectAdmins.add(collaborator); } } model.addAttribute("projectAdmins", projectAdmins); model.addAttribute("projectOwner", project.getOwner()); model.addAttribute("networkList", workspaceNetworkList); model.addAttribute("workspacedetails", workspace); model.addAttribute("textFileList", tfList); String adminRoles[] = { RoleNames.ROLE_WORKSPACE_COLLABORATOR_ADMIN }; boolean isAdmin = authorization.chkAuthorization(userName, workspaceid, adminRoles); if (workspaceSecurity.checkWorkspaceOwner(userName, workspaceid)) { model.addAttribute("owner", 1); } else { model.addAttribute("owner", 0); } if (workspaceSecurity.checkWorkspaceOwnerEditorAccess(userName, workspaceid)) { model.addAttribute("editoraccess", 1); } else { model.addAttribute("editoraccess", 0); } if (workspaceSecurity.checkWorkspaceProjectInheritOwnerEditorAccess(userName, workspaceid)) { model.addAttribute("projectinherit", 1); } else { model.addAttribute("projectinherit", 0); } if (isAdmin) { model.addAttribute("wsadmin", 1); } else { model.addAttribute("wsadmin", 0); } String projectid = wsManager.getProjectIdFromWorkspaceId(workspaceid); model.addAttribute("myprojectid", projectid); // Including a condition to check if the workspace is not deactive. If // the workspace is deactive adding attribute to make delete button // disabled model.addAttribute("isDeactivated", wsManager.getDeactiveStatus(workspaceid)); model.addAttribute("isArchived", wsManager.isWorkspaceArchived(workspaceid)); return "auth/workbench/workspace/workspacedetails"; } }