package fi.otavanopisto.muikku.dao.workspace;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import fi.otavanopisto.muikku.model.workspace.WorkspaceEntity_;
import fi.otavanopisto.muikku.model.workspace.WorkspaceAccess;
import fi.otavanopisto.muikku.dao.CoreDAO;
import fi.otavanopisto.muikku.model.base.SchoolDataSource;
import fi.otavanopisto.muikku.model.workspace.WorkspaceEntity;
public class WorkspaceEntityDAO extends CoreDAO<WorkspaceEntity> {
private static final long serialVersionUID = -5129003092406973620L;
public WorkspaceEntity create(SchoolDataSource dataSource, String identifier, String urlName, WorkspaceAccess access, Boolean published, Boolean archived) {
WorkspaceEntity workspaceEntity = new WorkspaceEntity();
workspaceEntity.setDataSource(dataSource);
workspaceEntity.setIdentifier(identifier);
workspaceEntity.setUrlName(urlName);
workspaceEntity.setAccess(access);
workspaceEntity.setArchived(archived);
workspaceEntity.setPublished(published);
return persist(workspaceEntity);
}
public WorkspaceEntity findByDataSourceAndIdentifier(SchoolDataSource schoolDataSource, String identifier) {
EntityManager entityManager = getEntityManager();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<WorkspaceEntity> criteria = criteriaBuilder.createQuery(WorkspaceEntity.class);
Root<WorkspaceEntity> root = criteria.from(WorkspaceEntity.class);
criteria.select(root);
criteria.where(
criteriaBuilder.and(
criteriaBuilder.equal(root.get(WorkspaceEntity_.dataSource), schoolDataSource),
criteriaBuilder.equal(root.get(WorkspaceEntity_.identifier), identifier)
)
);
return getSingleResult( entityManager.createQuery(criteria) );
}
public WorkspaceEntity findByUrlName(String urlName) {
EntityManager entityManager = getEntityManager();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<WorkspaceEntity> criteria = criteriaBuilder.createQuery(WorkspaceEntity.class);
Root<WorkspaceEntity> root = criteria.from(WorkspaceEntity.class);
criteria.select(root);
criteria.where(
criteriaBuilder.equal(root.get(WorkspaceEntity_.urlName), urlName)
);
return getSingleResult(entityManager.createQuery(criteria));
}
public WorkspaceEntity findByUrlNameAndArchived(String urlName, Boolean archived) {
EntityManager entityManager = getEntityManager();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<WorkspaceEntity> criteria = criteriaBuilder.createQuery(WorkspaceEntity.class);
Root<WorkspaceEntity> root = criteria.from(WorkspaceEntity.class);
criteria.select(root);
criteria.where(
criteriaBuilder.and(
criteriaBuilder.equal(root.get(WorkspaceEntity_.urlName), urlName),
criteriaBuilder.equal(root.get(WorkspaceEntity_.archived), archived)
)
);
return getSingleResult(entityManager.createQuery(criteria));
}
public List<WorkspaceEntity> listByDataSource(SchoolDataSource dataSource) {
return listByDataSource(dataSource, null, null);
}
public List<WorkspaceEntity> listByDataSource(SchoolDataSource dataSource, Integer firstResult, Integer maxResults) {
EntityManager entityManager = getEntityManager();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<WorkspaceEntity> criteria = criteriaBuilder.createQuery(WorkspaceEntity.class);
Root<WorkspaceEntity> root = criteria.from(WorkspaceEntity.class);
criteria.select(root);
criteria.where(
criteriaBuilder.equal(root.get(WorkspaceEntity_.dataSource), dataSource)
);
TypedQuery<WorkspaceEntity> query = entityManager.createQuery(criteria);
if (firstResult != null) {
query.setFirstResult(firstResult);
}
if (maxResults != null) {
query.setMaxResults(maxResults);
}
return query.getResultList();
}
public List<String> listIdentifiersByDataSource(SchoolDataSource dataSource) {
return listIdentifiersByDataSource(dataSource, null, null);
}
public List<String> listIdentifiersByDataSource(SchoolDataSource dataSource, Integer firstResult, Integer maxResults) {
EntityManager entityManager = getEntityManager();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<String> criteria = criteriaBuilder.createQuery(String.class);
Root<WorkspaceEntity> root = criteria.from(WorkspaceEntity.class);
criteria.select(root.get(WorkspaceEntity_.identifier));
criteria.where(
criteriaBuilder.equal(root.get(WorkspaceEntity_.dataSource), dataSource)
);
TypedQuery<String> query = entityManager.createQuery(criteria);
if (firstResult != null) {
query.setFirstResult(firstResult);
}
if (maxResults != null) {
query.setMaxResults(maxResults);
}
return query.getResultList();
}
public List<String> listIdentifiersByDataSourceAndArchived(SchoolDataSource dataSource, Boolean archived) {
EntityManager entityManager = getEntityManager();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<String> criteria = criteriaBuilder.createQuery(String.class);
Root<WorkspaceEntity> root = criteria.from(WorkspaceEntity.class);
criteria.select(root.get(WorkspaceEntity_.identifier));
criteria.where(
criteriaBuilder.and(
criteriaBuilder.equal(root.get(WorkspaceEntity_.archived), archived),
criteriaBuilder.equal(root.get(WorkspaceEntity_.dataSource), dataSource)
)
);
return entityManager.createQuery(criteria).getResultList();
}
public List<WorkspaceEntity> listByPublished(Boolean published) {
return listByPublishedAndArchived(published, Boolean.FALSE);
}
public List<WorkspaceEntity> listByPublishedAndArchived(Boolean published, Boolean archived) {
EntityManager entityManager = getEntityManager();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<WorkspaceEntity> criteria = criteriaBuilder.createQuery(WorkspaceEntity.class);
Root<WorkspaceEntity> root = criteria.from(WorkspaceEntity.class);
criteria.select(root);
criteria.where(
criteriaBuilder.and(
criteriaBuilder.equal(root.get(WorkspaceEntity_.published), published),
criteriaBuilder.equal(root.get(WorkspaceEntity_.archived), archived)
)
);
return entityManager.createQuery(criteria).getResultList();
}
public List<Long> listPublishedWorkspaceEntityIds() {
EntityManager entityManager = getEntityManager();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Long> criteria = criteriaBuilder.createQuery(Long.class);
Root<WorkspaceEntity> root = criteria.from(WorkspaceEntity.class);
criteria.select(root.get(WorkspaceEntity_.id));
criteria.where(
criteriaBuilder.and(
criteriaBuilder.equal(root.get(WorkspaceEntity_.archived), Boolean.FALSE),
criteriaBuilder.equal(root.get(WorkspaceEntity_.published), Boolean.TRUE)
)
);
return entityManager.createQuery(criteria).getResultList();
}
public List<Long> listIdsByDataSourceAndIdentifiers(SchoolDataSource dataSource, Collection<String> groupIdentifiers) {
if (groupIdentifiers == null || groupIdentifiers.isEmpty()) {
return Collections.emptyList();
}
EntityManager entityManager = getEntityManager();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Long> criteria = criteriaBuilder.createQuery(Long.class);
Root<WorkspaceEntity> root = criteria.from(WorkspaceEntity.class);
criteria.select(root.get(WorkspaceEntity_.id));
criteria.where(
criteriaBuilder.and(
criteriaBuilder.equal(root.get(WorkspaceEntity_.dataSource), dataSource),
root.get(WorkspaceEntity_.identifier).in(groupIdentifiers)
)
);
return entityManager.createQuery(criteria).getResultList();
}
public WorkspaceEntity updateAccess(WorkspaceEntity workspaceEntity, WorkspaceAccess access) {
workspaceEntity.setAccess(access);
return persist(workspaceEntity);
}
public WorkspaceEntity updateDefaultMaterialLicense(WorkspaceEntity workspaceEntity, String defaultMaterialLicense) {
workspaceEntity.setDefaultMaterialLicense(defaultMaterialLicense);
return persist(workspaceEntity);
}
public WorkspaceEntity updatePublished(WorkspaceEntity workspaceEntity, Boolean published) {
workspaceEntity.setPublished(published);
return persist(workspaceEntity);
}
public WorkspaceEntity updateArchived(WorkspaceEntity workspaceEntity, Boolean archived) {
workspaceEntity.setArchived(archived);
return persist(workspaceEntity);
}
public void delete(WorkspaceEntity workspaceEntity) {
super.delete(workspaceEntity);
}
}