package edu.asu.spring.quadriga.service.workbench.impl; import java.security.Principal; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Properties; import javax.annotation.Resource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import edu.asu.spring.quadriga.accesschecks.IProjectSecurityChecker; import edu.asu.spring.quadriga.dao.resolver.IProjectHandleResolverDAO; import edu.asu.spring.quadriga.dao.workbench.IProjectCollaboratorDAO; import edu.asu.spring.quadriga.dao.workbench.IProjectConceptCollectionDAO; import edu.asu.spring.quadriga.dao.workbench.IProjectDAO; import edu.asu.spring.quadriga.dao.workbench.IProjectDictionaryDAO; import edu.asu.spring.quadriga.dao.workbench.IProjectEditorDAO; import edu.asu.spring.quadriga.dao.workbench.IProjectWorkspaceDAO; import edu.asu.spring.quadriga.domain.resolver.IProjectHandleResolver; import edu.asu.spring.quadriga.domain.workbench.IProject; import edu.asu.spring.quadriga.dto.ProjectCollaboratorDTO; import edu.asu.spring.quadriga.dto.ProjectConceptCollectionDTO; import edu.asu.spring.quadriga.dto.ProjectDTO; import edu.asu.spring.quadriga.dto.ProjectDictionaryDTO; import edu.asu.spring.quadriga.dto.ProjectEditorDTO; import edu.asu.spring.quadriga.dto.ProjectEditorDTOPK; import edu.asu.spring.quadriga.dto.ProjectHandleResolverDTO; import edu.asu.spring.quadriga.dto.ProjectWorkspaceDTO; import edu.asu.spring.quadriga.exceptions.QuadrigaStorageException; import edu.asu.spring.quadriga.mapper.workbench.IProjectDeepMapper; import edu.asu.spring.quadriga.service.impl.BaseManager; import edu.asu.spring.quadriga.service.workbench.IModifyProjectManager; /** * This class add/update/delete a project * * @author kbatna, Julia Damerow */ @Service public class ModifyProjectManager extends BaseManager implements IModifyProjectManager { @Autowired private IProjectSecurityChecker projectSecurity; @Autowired private IProjectDAO projectDao; @Autowired private IProjectDeepMapper projectDTOMapper; @Autowired private IProjectWorkspaceDAO projectWorkspaceDao; @Autowired private IProjectDictionaryDAO projectDictionaryDao; @Autowired private IProjectConceptCollectionDAO projectCCDao; @Autowired private IProjectCollaboratorDAO projectCollabDao; @Autowired private IProjectEditorDAO projectEditorDao; @Autowired private IProjectHandleResolverDAO projectHandleDao; @Resource(name = "projectconstants") private Properties messages; private static final Logger logger = LoggerFactory.getLogger(ModifyProjectManager.class); /** * {@inheritDoc} */ @Override @Transactional public void addNewProject(IProject project, String userName) { project.setProjectId(projectDao.generateUniqueID()); project.setCreatedBy(userName); project.setUpdatedBy(userName); ProjectDTO projectDTO = projectDTOMapper.getProjectDTO(project); projectDao.saveNewDTO(projectDTO); } /** * {@inheritDoc} */ @Override @Transactional public void updateProject(String projID, String projName, String projDesc, String projectAccess, String userName) throws QuadrigaStorageException { ProjectDTO projectDTO = projectDao.getProjectDTO(projID); projectDTO.setProjectname(projName); projectDTO.setDescription(projDesc); projectDTO.setUpdatedby(userName); projectDTO.setAccessibility(projectAccess); projectDTO.setUpdateddate(new Date()); projectDao.updateDTO(projectDTO); } @Override @Transactional public void updateProjectURL(String projID, String unixName, String userName) throws QuadrigaStorageException { ProjectDTO projectDTO = projectDao.getProjectDTO(projID); projectDTO.setUnixname(unixName); projectDTO.setUpdatedby(userName); projectDTO.setUpdateddate(new Date()); projectDao.updateDTO(projectDTO); } /** * This method deletes a project into the database. * * @param project * @return String - error message blank on success and contains error on * failure. * @throws QuadrigaStorageException * @author Karthik Jayaraman, Julia Damerow */ @Override @Transactional public void deleteProjectRequest(List<String> projectIdList, Principal principal) throws QuadrigaStorageException { for (String projectId : projectIdList) { boolean checkAuthorization = projectSecurity.isProjectOwner(principal.getName(), projectId); if (checkAuthorization) { ProjectDTO project = projectDao.getProjectDTO(projectId); // retrieve all the foreign key tables associated with them // delete the project workspace DTO deleteProjectWorkspaceMapping(project); deleteProjectDictionaryMapping(project); deleteProjectConceptCollectionMapping(project); deleteProjectCollaboratorMapping(project); deleteProjectEditorMapping(project); projectDao.updateDTO(project); projectDao.deleteDTO(project); } } } /** * This method will provide owner editor role to the project * * @param projectId * @param owner * @throws QuadrigaStorageException * @author Lohith Dwaraka */ @Override @Transactional public void assignEditorRole(String projectId, String editor) throws QuadrigaStorageException { ProjectEditorDTOPK projectEditorKey = new ProjectEditorDTOPK(projectId, editor); ProjectEditorDTO projectEditor = projectEditorDao.getProjectEditorDTO(projectEditorKey); // if user is not editor yet, make him editor if (projectEditor == null) { ProjectDTO project = projectDao.getProjectDTO(projectId); projectEditor = projectDTOMapper.getProjectEditor(project, editor); projectEditorDao.saveNewDTO(projectEditor); } } /** * This method will remove owner editor role from the project * * @param projectId * @param owner * @throws QuadrigaStorageException * @author Lohith Dwaraka */ @Override @Transactional public void removeEditorRole(String projectId, String editor) throws QuadrigaStorageException { ProjectEditorDTOPK projectEditorKey = new ProjectEditorDTOPK(projectId, editor); ProjectEditorDTO projectEditor = projectEditorDao.getProjectEditorDTO(projectEditorKey); if (projectEditor != null) { projectEditorDao.deleteDTO(projectEditor); } } @Override @Transactional public void addResolverToProject(String resolverId, IProject project) { ProjectHandleResolverDTO resolverDto = projectHandleDao.getDTO(resolverId); ProjectDTO projectDto = projectDao.getDTO(project.getProjectId()); projectDto.setResolvers(new ArrayList<ProjectHandleResolverDTO>()); projectDto.getResolvers().add(resolverDto); projectDao.updateDTO(projectDto); } /* * ================================================== Private Methods * ================================================== */ private void deleteProjectWorkspaceMapping(ProjectDTO project) { List<ProjectWorkspaceDTO> projectWorkspaceList = project.getProjectWorkspaceDTOList(); if (projectWorkspaceList != null) { for (ProjectWorkspaceDTO projectWorkspace : projectWorkspaceList) { projectWorkspaceDao.deleteDTO(projectWorkspace); } } project.setProjectWorkspaceDTOList(null); } private void deleteProjectDictionaryMapping(ProjectDTO project) { List<ProjectDictionaryDTO> projectDictionaryList = project.getProjectDictionaryDTOList(); if (projectDictionaryList != null) { for (ProjectDictionaryDTO projectDictionary : projectDictionaryList) { projectDictionaryDao.deleteDTO(projectDictionary); ; } } project.setProjectDictionaryDTOList(null); } private void deleteProjectConceptCollectionMapping(ProjectDTO project) { List<ProjectConceptCollectionDTO> projectConceptCollectionList = project.getProjectConceptCollectionDTOList(); if (projectConceptCollectionList != null) { for (ProjectConceptCollectionDTO projectConceptCollection : projectConceptCollectionList) { projectCCDao.deleteDTO(projectConceptCollection); } } project.setProjectConceptCollectionDTOList(null); } private void deleteProjectCollaboratorMapping(ProjectDTO project) { List<ProjectCollaboratorDTO> projectCollaboratorList = project.getProjectCollaboratorDTOList(); if (projectCollaboratorList != null) { for (ProjectCollaboratorDTO projectCollaborator : projectCollaboratorList) { projectCollabDao.deleteDTO(projectCollaborator); } } project.setProjectConceptCollectionDTOList(null); } private void deleteProjectEditorMapping(ProjectDTO project) { List<ProjectEditorDTO> projectEditorList = project.getProjectEditorDTOList(); if (projectEditorList != null) { for (ProjectEditorDTO projectEditor : projectEditorList) { projectEditorDao.deleteDTO(projectEditor); } } project.setProjectEditorDTOList(null); } }