package edu.asu.spring.quadriga.dao.workspace.impl; import java.util.List; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.SessionFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; import edu.asu.spring.quadriga.dao.impl.BaseDAO; import edu.asu.spring.quadriga.dao.workbench.IProjectDAO; import edu.asu.spring.quadriga.dao.workspace.IWorkspaceDAO; import edu.asu.spring.quadriga.dto.ConceptCollectionDTO; import edu.asu.spring.quadriga.dto.DictionaryDTO; import edu.asu.spring.quadriga.dto.NetworkWorkspaceDTO; import edu.asu.spring.quadriga.dto.ProjectDTO; import edu.asu.spring.quadriga.dto.ProjectWorkspaceDTO; import edu.asu.spring.quadriga.dto.WorkspaceConceptcollectionDTO; import edu.asu.spring.quadriga.dto.WorkspaceDTO; import edu.asu.spring.quadriga.dto.WorkspaceDictionaryDTO; import edu.asu.spring.quadriga.dto.WorkspaceEditorDTO; import edu.asu.spring.quadriga.exceptions.QuadrigaStorageException; @Repository @Transactional public class WorkspaceDAO extends BaseDAO<WorkspaceDTO> implements IWorkspaceDAO { @Autowired private SessionFactory sessionFactory; @Autowired private IProjectDAO projectDAO; private static final Logger logger = LoggerFactory.getLogger(WorkspaceDAO.class); @Override public WorkspaceDTO getDTO(String id) { return getDTO(WorkspaceDTO.class, id); } @Override public String getIdPrefix() { return messages.getProperty("workspace_id.prefix"); } @Override public boolean deleteWorkspace(String wsId) { WorkspaceDTO workspace = getDTO(wsId); if (workspace == null) { logger.error("Workspace does not exist."); return false; } deleteWorkspaceProjectMappings(workspace); deleteWorkspaceConceptCollectionMappings(workspace); deleteWorkspaceDictionaryMappings(workspace); deleteWorkspaceEditorMappings(workspace); deleteWorkspaceNetworkMappings(workspace); // save the above changes // updateDTO(workspace); // then delete deleteDTO(workspace); return true; } /* * ================================================================= Listing * Workspaces Methods * ================================================================= */ /** * {@inheritDoc} */ @SuppressWarnings("unchecked") @Override public List<WorkspaceDTO> listWorkspaceDTO(String projectid) throws QuadrigaStorageException { try { Query query = sessionFactory.getCurrentSession().createQuery( "Select projWork.workspaceDTO from ProjectWorkspaceDTO projWork where projWork.projectDTO.projectid =:projectid"); query.setParameter("projectid", projectid); return query.list(); } catch (HibernateException e) { throw new QuadrigaStorageException(e); } } /** * {@inheritDoc} */ @SuppressWarnings("unchecked") @Override public List<WorkspaceDTO> listWorkspaceDTO(String projectid, String userName) throws QuadrigaStorageException { List<WorkspaceDTO> workspaceDTOList = null; try { Query query = sessionFactory.getCurrentSession().createQuery( "Select projWork.workspaceDTO from ProjectWorkspaceDTO projWork where projWork.projectDTO.projectid =:projectid and projWork.workspaceDTO.workspaceowner.username =:username"); query.setParameter("username", userName); query.setParameter("projectid", projectid); workspaceDTOList = query.list(); } catch (HibernateException e) { throw new QuadrigaStorageException(e); } return workspaceDTOList; } /** * {@inheritDoc} */ @SuppressWarnings("unchecked") @Override public List<WorkspaceDTO> listWorkspaceDTOofCollaborator(String projectid, String username) throws QuadrigaStorageException { try { Query query = sessionFactory.getCurrentSession().createQuery( "Select projWork.workspaceDTO from ProjectWorkspaceDTO projWork INNER JOIN projWork.workspaceDTO.workspaceCollaboratorDTOList workcollab where workcollab.quadrigaUserDTO.username =:username and projWork.projectDTO.projectid =:projectid"); query.setParameter("username", username); query.setParameter("projectid", projectid); return query.list(); } catch (HibernateException e) { throw new QuadrigaStorageException(e); } } /** * {@inheritDoc} */ @SuppressWarnings("unchecked") @Override public List<WorkspaceDTO> listActiveWorkspaceDTOofOwner(String projectid, String username) throws QuadrigaStorageException { List<WorkspaceDTO> workspaceDTOList = null; try { Query query = sessionFactory.getCurrentSession().createQuery( "Select projWork.workspaceDTO from ProjectWorkspaceDTO projWork where projWork.projectDTO.projectid =:projectid and projWork.workspaceDTO.workspaceowner.username =:username and projWork.workspaceDTO.isarchived =:isarchived and projWork.workspaceDTO.isdeactivated =:isdeactivated"); query.setParameter("username", username); query.setParameter("projectid", projectid); query.setParameter("isdeactivated", false); query.setParameter("isarchived", false); workspaceDTOList = query.list(); } catch (HibernateException e) { throw new QuadrigaStorageException(e); } return workspaceDTOList; } /** * {@inheritDoc} */ @SuppressWarnings("unchecked") @Override public List<WorkspaceDTO> listActiveWorkspaceDTOofCollaborator(String projectid, String username) throws QuadrigaStorageException { List<WorkspaceDTO> workspaceDTOList = null; try { Query query = sessionFactory.getCurrentSession() .createQuery("Select distinct projWork.workspaceDTO from ProjectWorkspaceDTO projWork INNER JOIN " + "projWork.projectDTO.projectCollaboratorDTOList projcollab where projWork.workspaceDTO.createdby !=:username and projWork.projectDTO.projectid =:projectid " + "and projWork.workspaceDTO.isarchived =:isarchived and projWork.workspaceDTO.isdeactivated =:isdeactivated"); query.setParameter("username", username); query.setParameter("projectid", projectid); query.setParameter("isdeactivated", false); query.setParameter("isarchived", false); workspaceDTOList = query.list(); } catch (HibernateException e) { throw new QuadrigaStorageException(e); } return workspaceDTOList; } /** * {@inheritDoc} */ @SuppressWarnings("unchecked") @Override public List<WorkspaceDTO> listArchivedWorkspaceDTO(String projectid, String username) throws QuadrigaStorageException { List<WorkspaceDTO> workspaceDTOList = null; try { String value = "SELECT projWork.workspaceDTO from ProjectWorkspaceDTO projWork WHERE projWork.projectWorkspaceDTOPK.projectid =:projectid" + " AND projWork.workspaceDTO.isdeactivated =:isdeactivated AND projWork.workspaceDTO.isarchived = :isarchived" + " AND ((projWork.workspaceDTO.workspaceowner.username = :username) OR (projWork.workspaceDTO.workspaceid IN (" + " SELECT wsc.collaboratorDTOPK.workspaceid FROM WorkspaceCollaboratorDTO wsc WHERE wsc.collaboratorDTOPK.collaboratoruser =:username)))"; Query query = sessionFactory.getCurrentSession().createQuery(value); query.setParameter("username", username); query.setParameter("projectid", projectid); query.setParameter("isdeactivated", false); query.setParameter("isarchived", true); workspaceDTOList = query.list(); } catch (HibernateException e) { throw new QuadrigaStorageException(e); } return workspaceDTOList; } /** * {@inheritDoc} */ @SuppressWarnings("unchecked") @Override public List<WorkspaceDTO> listDeactivatedWorkspaceDTO(String projectid, String username) throws QuadrigaStorageException { List<WorkspaceDTO> workspaceDTOList = null; try { String value = "SELECT projWork.workspaceDTO from ProjectWorkspaceDTO projWork WHERE projWork.projectWorkspaceDTOPK.projectid =:projectid" + " AND projWork.workspaceDTO.isdeactivated =:isdeactivated " + " AND ((projWork.workspaceDTO.workspaceowner.username = :username) OR (projWork.workspaceDTO.workspaceid IN (" + " SELECT wsc.collaboratorDTOPK.workspaceid FROM WorkspaceCollaboratorDTO wsc WHERE wsc.collaboratorDTOPK.collaboratoruser =:username)))"; Query query = sessionFactory.getCurrentSession().createQuery(value); query.setParameter("username", username); query.setParameter("projectid", projectid); query.setParameter("isdeactivated", true); workspaceDTOList = query.list(); } catch (HibernateException e) { throw new QuadrigaStorageException(e); } return workspaceDTOList; } /* * ================================================================= Private * Methods ================================================================= */ /** * Method to delete workspace-project mapping objects. First, the * {@link ProjectWorkspaceDTO} mapping object is deleted from the list of * workspaces of a project, then the object is deleted. Last, the object is * set to null on the respective workspace. * * @param wsDTO * The workspace DTO for which the mapping objects should be * deleted. */ private void deleteWorkspaceProjectMappings(WorkspaceDTO wsDTO) { ProjectWorkspaceDTO pwDTO = wsDTO.getProjectWorkspaceDTO(); // delete mapping project-workspace from project ProjectDTO project = pwDTO.getProjectDTO(); if (project.getProjectWorkspaceDTOList() != null) { project.getProjectWorkspaceDTOList().remove(pwDTO); updateObject(project); } deleteObject(pwDTO); // assigning the workspace project mapping to null for workspace object wsDTO.setProjectWorkspaceDTO(null); } /** * Method to delete workspace-concept collection mapping objects. First the * mapping objects ({@link WorkspaceConceptcollectionDTO}) are removed from * the respective concept collections, then the mapping objects are deleted. * Last, the variable in the workspace object is set to null. * * @param wsDTO * Workspace for which the mapping objects should be deleted. */ private void deleteWorkspaceConceptCollectionMappings(WorkspaceDTO wsDTO) { // delete all mapping objects from workspace list of concept collections // and delete mapping objects List<WorkspaceConceptcollectionDTO> workspaceConceptCollectionList = wsDTO .getWorkspaceConceptCollectionDTOList(); for (WorkspaceConceptcollectionDTO workspaceConceptCollection : workspaceConceptCollectionList) { ConceptCollectionDTO conceptCollection = workspaceConceptCollection.getConceptCollectionDTO(); if (conceptCollection.getWsConceptCollectionDTOList() != null) { conceptCollection.getWsConceptCollectionDTOList().remove(workspaceConceptCollection); updateObject(conceptCollection); } deleteObject(workspaceConceptCollection); } // set the workspace concept collection mapping to null for workspace // object wsDTO.setWorkspaceConceptCollectionDTOList(null); } /** * Method to delete workspace-dictionary mapping objects ( * {@link WorkspaceDictionaryDTO}). First the mapping objects are removed * from the respective Dictionaries, then the mapping objects are deleted. * Last the reference to the mapping objects in the workspace object is set * to null. * * @param wsDTO * The workspace DTO ({@link WorkspaceDTO}) for which the mapping * objects should be deleted. */ private void deleteWorkspaceDictionaryMappings(WorkspaceDTO wsDTO) { List<WorkspaceDictionaryDTO> workspaceDictionaryList = wsDTO.getWorkspaceDictionaryDTOList(); for (WorkspaceDictionaryDTO workspaceDictionary : workspaceDictionaryList) { DictionaryDTO dictionary = workspaceDictionary.getDictionaryDTO(); if (dictionary.getWsDictionaryDTOList() != null) { dictionary.getWsDictionaryDTOList().remove(workspaceDictionary); updateObject(dictionary); } deleteObject(workspaceDictionary); } // assigning the dictionary workspace mapping for workspace object to // null wsDTO.setWorkspaceDictionaryDTOList(null); } /** * Method to delete workspace-editor mapping objects ( * {@link WorkspaceEditorDTO}). First the mapping objects are deleted. Then * the reference to the mapping objects in the workspace object is set to * null. * * @param wsDTO * The workspace DTO ({@link WorkspaceDTO}) for which the mapping * objects should be deleted. */ private void deleteWorkspaceEditorMappings(WorkspaceDTO wsDTO) { List<WorkspaceEditorDTO> workspaceEditorList = wsDTO.getWorkspaceEditorDTOList(); for (WorkspaceEditorDTO workspaceEditor : workspaceEditorList) { deleteObject(workspaceEditor); } // set the editor workspace mapping to null in workspace object wsDTO.setWorkspaceEditorDTOList(null); } /** * Method to delete workspace-network mapping objects ( * {@link NetworkWorkspaceDTO}). First the mapping objects are deleted. Then * the reference to the mapping objects in the workspace object is set to * null. * * @param wsDTO * The workspace DTO ({@link WorkspaceDTO}) for which the mapping * objects should be deleted. */ private void deleteWorkspaceNetworkMappings(WorkspaceDTO wsDTO) { List<NetworkWorkspaceDTO> workspaceNetworksList = wsDTO.getWorkspaceNetworkDTOList(); for (NetworkWorkspaceDTO workspaceNetwork : workspaceNetworksList) { deleteObject(workspaceNetwork); } // set the workspace network mapping to null in workspace object wsDTO.setWorkspaceNetworkDTOList(null); } }