package edu.asu.spring.quadriga.dao.workspace.impl;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import edu.asu.spring.quadriga.dao.impl.BaseDAO;
import edu.asu.spring.quadriga.dao.workspace.IWorkspaceCCDAO;
import edu.asu.spring.quadriga.domain.conceptcollection.IConceptCollection;
import edu.asu.spring.quadriga.dto.ConceptCollectionDTO;
import edu.asu.spring.quadriga.dto.WorkspaceConceptcollectionDTO;
import edu.asu.spring.quadriga.dto.WorkspaceConceptcollectionDTOPK;
import edu.asu.spring.quadriga.dto.WorkspaceDTO;
import edu.asu.spring.quadriga.exceptions.QuadrigaStorageException;
import edu.asu.spring.quadriga.service.conceptcollection.mapper.IConceptCollectionShallowMapper;
@Repository
public class WorkspaceCCDAO extends BaseDAO<WorkspaceConceptcollectionDTO> implements IWorkspaceCCDAO {
@Autowired
private SessionFactory sessionFactory;
@Autowired
private IConceptCollectionShallowMapper ccShallowMapper;
/**
* {@inheritDoc}
*/
@Override
public void addWorkspaceCC(String workspaceId, String CCId, String userId) throws QuadrigaStorageException {
WorkspaceDTO workspace = (WorkspaceDTO) sessionFactory.getCurrentSession().get(WorkspaceDTO.class, workspaceId);
if (workspace == null) {
throw new QuadrigaStorageException("Invalid workspace id");
}
ConceptCollectionDTO conceptCollection = (ConceptCollectionDTO) sessionFactory.getCurrentSession().get(
ConceptCollectionDTO.class, CCId);
if (conceptCollection == null) {
throw new QuadrigaStorageException("Invalid concept collection");
}
WorkspaceConceptcollectionDTOPK wrkspaceCCDTOKey = new WorkspaceConceptcollectionDTOPK(workspaceId, CCId);
WorkspaceConceptcollectionDTO wrkspaceCCDTO = (WorkspaceConceptcollectionDTO) sessionFactory
.getCurrentSession().get(WorkspaceConceptcollectionDTO.class, wrkspaceCCDTOKey);
if (wrkspaceCCDTO != null) {
throw new QuadrigaStorageException("Workspace is already associated with the concept collection");
}
Date date = new Date();
wrkspaceCCDTO = new WorkspaceConceptcollectionDTO();
wrkspaceCCDTO.setWorkspaceConceptcollectionDTOPK(wrkspaceCCDTOKey);
wrkspaceCCDTO.setCreatedby(userId);
wrkspaceCCDTO.setCreateddate(date);
wrkspaceCCDTO.setUpdatedby(userId);
wrkspaceCCDTO.setUpdateddate(date);
wrkspaceCCDTO.setConceptCollectionDTO(conceptCollection);
wrkspaceCCDTO.setWorkspaceDTO(workspace);
sessionFactory.getCurrentSession().save(wrkspaceCCDTO);
// add the workspace concept collection mapping to workspace DTO
List<WorkspaceConceptcollectionDTO> workspaceConceptCollectionList = workspace
.getWorkspaceConceptCollectionDTOList();
if (workspaceConceptCollectionList == null) {
workspaceConceptCollectionList = new ArrayList<WorkspaceConceptcollectionDTO>();
}
workspaceConceptCollectionList.add(wrkspaceCCDTO);
sessionFactory.getCurrentSession().update(workspace);
// add the workspace concept collection mapping to the concept
// collection DTO
workspaceConceptCollectionList = conceptCollection.getWsConceptCollectionDTOList();
if (workspaceConceptCollectionList == null) {
workspaceConceptCollectionList = new ArrayList<WorkspaceConceptcollectionDTO>();
}
workspaceConceptCollectionList.add(wrkspaceCCDTO);
sessionFactory.getCurrentSession().update(conceptCollection);
}
/**
* {@inheritDoc}
*/
@Override
@SuppressWarnings("unchecked")
public List<IConceptCollection> getNonAssociatedWorkspaceConcepts(String workspaceId)
throws QuadrigaStorageException {
List<IConceptCollection> conceptCollectionList = new ArrayList<IConceptCollection>();
List<ConceptCollectionDTO> conceptCollectionDTOList = new ArrayList<ConceptCollectionDTO>();
Query query = sessionFactory
.getCurrentSession()
.createQuery(
"FROM ConceptCollectionDTO cc WHERE cc.conceptCollectionid NOT IN("
+ "SELECT w.workspaceConceptcollectionDTOPK.conceptcollectionid FROM WorkspaceConceptcollectionDTO w WHERE w.workspaceConceptcollectionDTOPK.workspaceid = :workspaceid)");
query.setParameter("workspaceid", workspaceId);
conceptCollectionDTOList = query.list();
for (ConceptCollectionDTO conceptCollectionDTO : conceptCollectionDTOList) {
IConceptCollection conceptCollection = ccShallowMapper.getConceptCollectionDetails(conceptCollectionDTO);
conceptCollectionList.add(conceptCollection);
}
return conceptCollectionList;
}
/**
* {@inheritDoc}
*/
@Override
public void deleteWorkspaceCC(String workspaceId, String userId, String CCId) throws QuadrigaStorageException {
WorkspaceDTO workspace = (WorkspaceDTO) sessionFactory.getCurrentSession().get(WorkspaceDTO.class, workspaceId);
if (workspace == null) {
throw new QuadrigaStorageException("workspaceid is invalid");
}
ConceptCollectionDTO conceptCollection = (ConceptCollectionDTO) sessionFactory.getCurrentSession().get(
ConceptCollectionDTO.class, CCId);
if (conceptCollection == null) {
throw new QuadrigaStorageException("ConceptCollection id is invalid");
}
// retrieve the concept collection associated with the workspace
WorkspaceConceptcollectionDTOPK workspaceConceptCollectionKey = new WorkspaceConceptcollectionDTOPK(
workspaceId, CCId);
WorkspaceConceptcollectionDTO workspaceConceptCollection = (WorkspaceConceptcollectionDTO) sessionFactory
.getCurrentSession().get(WorkspaceConceptcollectionDTO.class, workspaceConceptCollectionKey);
if (workspaceConceptCollection == null) {
throw new QuadrigaStorageException("Workspace is not mapped to the given concept collection");
}
sessionFactory.getCurrentSession().delete(workspaceConceptCollection);
// remove the mapping from the workspace DTO object
List<WorkspaceConceptcollectionDTO> workspaceConceptCollectionList = workspace
.getWorkspaceConceptCollectionDTOList();
if ((workspaceConceptCollectionList != null)
&& (workspaceConceptCollectionList.contains(workspaceConceptCollection))) {
workspaceConceptCollectionList.remove(workspaceConceptCollection);
}
sessionFactory.getCurrentSession().update(workspace);
// remove the mapping from the Concept Collection DTO object
workspaceConceptCollectionList = conceptCollection.getWsConceptCollectionDTOList();
if ((workspaceConceptCollectionList != null)
&& (workspaceConceptCollectionList.contains(workspaceConceptCollection))) {
workspaceConceptCollectionList.remove(workspaceConceptCollection);
}
sessionFactory.getCurrentSession().update(conceptCollection);
}
@Override
public WorkspaceConceptcollectionDTO getDTO(String id) {
return getDTO(WorkspaceConceptcollectionDTO.class, id);
}
}