package fi.otavanopisto.muikku.schooldata;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.inject.Inject;
import fi.otavanopisto.muikku.dao.base.SchoolDataSourceDAO;
import fi.otavanopisto.muikku.dao.users.RoleSchoolDataIdentifierDAO;
import fi.otavanopisto.muikku.dao.workspace.WorkspaceEntityDAO;
import fi.otavanopisto.muikku.dao.workspace.WorkspaceMaterialProducerDAO;
import fi.otavanopisto.muikku.dao.workspace.WorkspaceSettingsDAO;
import fi.otavanopisto.muikku.dao.workspace.WorkspaceUserEntityDAO;
import fi.otavanopisto.muikku.dao.workspace.WorkspaceUserSignupDAO;
import fi.otavanopisto.muikku.model.base.SchoolDataSource;
import fi.otavanopisto.muikku.model.users.RoleEntity;
import fi.otavanopisto.muikku.model.users.RoleSchoolDataIdentifier;
import fi.otavanopisto.muikku.model.users.UserEntity;
import fi.otavanopisto.muikku.model.users.UserRoleType;
import fi.otavanopisto.muikku.model.workspace.WorkspaceEntity;
import fi.otavanopisto.muikku.model.workspace.WorkspaceMaterialProducer;
import fi.otavanopisto.muikku.model.workspace.WorkspaceRoleArchetype;
import fi.otavanopisto.muikku.model.workspace.WorkspaceRoleEntity;
import fi.otavanopisto.muikku.model.workspace.WorkspaceSettings;
import fi.otavanopisto.muikku.model.workspace.WorkspaceUserEntity;
import fi.otavanopisto.muikku.model.workspace.WorkspaceUserSignup;
import fi.otavanopisto.muikku.schooldata.entity.CourseIdentifier;
import fi.otavanopisto.muikku.schooldata.entity.Role;
import fi.otavanopisto.muikku.schooldata.entity.User;
import fi.otavanopisto.muikku.schooldata.entity.Workspace;
import fi.otavanopisto.muikku.schooldata.entity.WorkspaceType;
import fi.otavanopisto.muikku.schooldata.entity.WorkspaceUser;
import fi.otavanopisto.muikku.users.UserController;
import fi.otavanopisto.muikku.users.UserEntityController;
import fi.otavanopisto.muikku.users.WorkspaceUserEntityController;
public class WorkspaceController {
@Inject
private Logger logger;
@Inject
private UserController userController;
@Inject
private UserEntityController userEntityController;
@Inject
private RoleController roleController;
@Inject
private WorkspaceUserEntityController workspaceUserEntityController;
@Inject
private WorkspaceSchoolDataController workspaceSchoolDataController;
@Inject
private WorkspaceEntityDAO workspaceEntityDAO;
@Inject
private WorkspaceUserEntityDAO workspaceUserEntityDAO;
@Inject
private SchoolDataSourceDAO schoolDataSourceDAO;
@Inject
private WorkspaceSettingsDAO workspaceSettingsDAO;
@Inject
private WorkspaceUserSignupDAO workspaceUserSignupDAO;
@Inject
private RoleSchoolDataIdentifierDAO roleSchoolDataIdentifierDAO;
@Inject
private WorkspaceMaterialProducerDAO workspaceMaterialProducerDAO;
/* Workspace */
public Workspace createWorkspace(String schoolDataSource, String name, String description, WorkspaceType type,
String courseIdentifierIdentifier) {
return workspaceSchoolDataController.createWorkspace(schoolDataSource, name, description, type,
courseIdentifierIdentifier);
}
public Workspace findWorkspace(WorkspaceEntity workspaceEntity) {
return workspaceSchoolDataController.findWorkspace(workspaceEntity);
}
public Workspace findWorkspace(SchoolDataIdentifier workspaceIdentifier) {
SchoolDataSource schoolDataSource = schoolDataSourceDAO.findByIdentifier(workspaceIdentifier.getDataSource());
if (schoolDataSource == null) {
logger.severe(String.format("Could not find school data source %s", workspaceIdentifier.getDataSource()));
return null;
}
return findWorkspace(schoolDataSource, workspaceIdentifier.getIdentifier());
}
public Workspace findWorkspace(SchoolDataSource schoolDataSource, String identifier) {
return workspaceSchoolDataController.findWorkspace(schoolDataSource, identifier);
}
public List<Workspace> listWorkspaces() {
return workspaceSchoolDataController.listWorkspaces();
}
public List<Workspace> listWorkspacesByCourseIdentifier(CourseIdentifier courseIdentifier) {
return workspaceSchoolDataController.listWorkspacesByCourseIdentifier(courseIdentifier);
}
public List<Workspace> listWorkspaces(String schoolDataSource) {
return workspaceSchoolDataController.listWorkspaces(schoolDataSource);
}
public Workspace copyWorkspace(SchoolDataIdentifier workspaceIdentifier, String name, String nameExtension, String description) {
return workspaceSchoolDataController.copyWorkspace(workspaceIdentifier, name, nameExtension, description);
}
public Workspace updateWorkspace(Workspace workspace) {
return workspaceSchoolDataController.updateWorkspace(workspace);
}
public void updateWorkspaceStudentActivity(WorkspaceUser workspaceUser, boolean active) {
workspaceSchoolDataController.updateWorkspaceStudentActivity(workspaceUser, active);
}
public void archiveWorkspace(Workspace workspace) {
WorkspaceEntity workspaceEntity = workspaceSchoolDataController.findWorkspaceEntity(workspace);
if (workspaceEntity != null) {
archiveWorkspaceEntity(workspaceEntity);
}
workspaceSchoolDataController.removeWorkspace(workspace);
}
public void deleteWorkspace(Workspace workspace) {
WorkspaceEntity workspaceEntity = workspaceSchoolDataController.findWorkspaceEntity(workspace);
if (workspaceEntity != null) {
deleteWorkspaceEntity(workspaceEntity);
}
workspaceSchoolDataController.removeWorkspace(workspace);
}
/* WorkspaceType */
public WorkspaceType findWorkspaceType(SchoolDataIdentifier identifier) {
if (identifier == null) {
return null;
}
return workspaceSchoolDataController.findWorkspaceTypeByDataSourceAndIdentifier(identifier.getDataSource(), identifier.getIdentifier());
}
public List<WorkspaceType> listWorkspaceTypes() {
return workspaceSchoolDataController.listWorkspaceTypes();
}
/* Workspace Entity */
public WorkspaceEntity findWorkspaceEntity(Workspace workspace) {
return workspaceSchoolDataController.findWorkspaceEntity(workspace);
}
public WorkspaceEntity findWorkspaceEntityById(Long workspaceId) {
return workspaceEntityDAO.findById(workspaceId);
}
public WorkspaceEntity findWorkspaceEntityByUrlName(String urlName) {
return workspaceEntityDAO.findByUrlNameAndArchived(urlName, Boolean.FALSE);
}
public WorkspaceEntity findWorkspaceEntityByDataSourceAndIdentifier(SchoolDataSource dataSource, String identifier) {
return workspaceEntityDAO.findByDataSourceAndIdentifier(dataSource, identifier);
}
public WorkspaceEntity findWorkspaceEntityByDataSourceAndIdentifier(String schoolDataSource, String identifier) {
SchoolDataSource dataSource = schoolDataSourceDAO.findByIdentifier(schoolDataSource);
if (dataSource != null) {
return findWorkspaceEntityByDataSourceAndIdentifier(dataSource, identifier);
} else {
logger.log(Level.SEVERE, "Could not find school data source '" + schoolDataSource + "'");
return null;
}
}
public List<WorkspaceEntity> listWorkspaceEntities() {
return workspaceEntityDAO.listAll();
}
public List<WorkspaceEntity> listPublishedWorkspaceEntities() {
return workspaceEntityDAO.listByPublished(Boolean.TRUE);
}
public List<WorkspaceEntity> listWorkspaceEntitiesByUser(UserEntity userEntity) {
return listWorkspaceEntitiesByUser(userEntity, false);
}
public List<WorkspaceEntity> listWorkspaceEntitiesByUser(UserEntity userEntity, boolean includeUnpublished) {
List<WorkspaceEntity> result = new ArrayList<>();
List<WorkspaceUserEntity> workspaceUserEntities = workspaceUserEntityController.listWorkspaceUserEntitiesByUserEntity(userEntity);
for (WorkspaceUserEntity workspaceUserEntity : workspaceUserEntities) {
if (includeUnpublished || workspaceUserEntity.getWorkspaceEntity().getPublished()) {
if (!result.contains(workspaceUserEntity.getWorkspaceEntity())) {
result.add(workspaceUserEntity.getWorkspaceEntity());
}
}
}
return result;
}
public List<WorkspaceUserEntity> listWorkspaceUserEnitiesByWorkspaceRoleArchetype(WorkspaceEntity workspaceEntity, WorkspaceRoleArchetype archtype, Integer firstResult, Integer maxResults) {
List<WorkspaceRoleEntity> workspaceRoles = roleController.listWorkspaceRoleEntitiesByArchetype(archtype);
if (workspaceRoles.isEmpty()) {
return Collections.emptyList();
}
return workspaceUserEntityController.listWorkspaceUserEntitiesByRoles(workspaceEntity, workspaceRoles, firstResult, maxResults);
}
public Long countWorkspaceUserEntitiesByWorkspaceRoleArchetype(WorkspaceEntity workspaceEntity, WorkspaceRoleArchetype archtype) {
List<WorkspaceRoleEntity> workspaceRoles = roleController.listWorkspaceRoleEntitiesByArchetype(archtype);
if (workspaceRoles.isEmpty()) {
return 0l;
}
return workspaceUserEntityController.countWorkspaceUserEntitiesByRoles(workspaceEntity, workspaceRoles);
}
public List<WorkspaceEntity> listWorkspaceEntitiesBySchoolDataSource(String schoolDataSource) {
SchoolDataSource dataSource = schoolDataSourceDAO.findByIdentifier(schoolDataSource);
if (dataSource != null) {
return listWorkspaceEntitiesBySchoolDataSource(dataSource);
} else {
logger.log(Level.SEVERE, "Could not find school data source '" + schoolDataSource
+ "' while listing workspaceEntities by school data source");
return null;
}
}
public List<WorkspaceEntity> listWorkspaceEntitiesBySchoolDataSource(SchoolDataSource schoolDataSource) {
return workspaceEntityDAO.listByDataSource(schoolDataSource);
}
public WorkspaceEntity archiveWorkspaceEntity(WorkspaceEntity workspaceEntity) {
return workspaceEntityDAO.updateArchived(workspaceEntity, Boolean.TRUE);
}
private void deleteWorkspaceEntity(WorkspaceEntity workspaceEntity) {
// Delete settings
WorkspaceSettings workspaceSettings = findWorkspaceSettings(workspaceEntity);
if (workspaceSettings != null) {
workspaceSettingsDAO.delete(workspaceSettings);
}
// Workspace Users
List<WorkspaceUserEntity> workspaceUserEntities = workspaceUserEntityDAO.listByWorkspaceIncludeArchived(workspaceEntity);
for (WorkspaceUserEntity workspaceUserEntity : workspaceUserEntities) {
workspaceUserEntityDAO.delete(workspaceUserEntity);
}
workspaceEntityDAO.delete(workspaceEntity);
}
/* WorkspaceUsers */
public WorkspaceUser createWorkspaceUser(Workspace workspace, User user, Role role) {
return workspaceSchoolDataController.createWorkspaceUser(workspace, user, role.getSchoolDataSource(),
role.getIdentifier());
}
public List<WorkspaceUser> listWorkspaceStudents(WorkspaceEntity workspaceEntity) {
Workspace workspace = findWorkspace(workspaceEntity);
if (workspace != null) {
return workspaceSchoolDataController.listWorkspaceStudents(workspace);
}
else {
logger.severe(String.format("Workspace not found for workspace entity %s", workspaceEntity == null ? "-" : workspaceEntity.getId()));
}
return Collections.emptyList();
}
public List<WorkspaceUser> listWorkspaceStudents(WorkspaceEntity workspaceEntity, boolean active) {
Workspace workspace = findWorkspace(workspaceEntity);
if (workspace != null) {
return workspaceSchoolDataController.listWorkspaceStudents(workspace, active);
}
else {
logger.severe(String.format("Workspace not found for workspace entity %s", workspaceEntity == null ? "-" : workspaceEntity.getId()));
}
return Collections.emptyList();
}
public List<WorkspaceUser> listWorkspaceStaffMembers(WorkspaceEntity workspaceEntity) {
Workspace workspace = findWorkspace(workspaceEntity);
if (workspace != null) {
return workspaceSchoolDataController.listWorkspaceStaffMembers(workspace);
}
else {
logger.severe(String.format("Workspace not found for workspace entity %s", workspaceEntity == null ? "-" : workspaceEntity.getId()));
}
return Collections.emptyList();
}
public WorkspaceUser findWorkspaceUserByWorkspaceAndUser(SchoolDataIdentifier workspaceIdentifier, SchoolDataIdentifier userIdentifier) {
return workspaceSchoolDataController.findWorkspaceUserByWorkspaceAndUser(workspaceIdentifier, userIdentifier);
}
public WorkspaceUser findWorkspaceUserByWorkspaceEntityAndUser(WorkspaceEntity workspaceEntity, SchoolDataIdentifier userIdentifier) {
SchoolDataIdentifier workspaceIdentifier = new SchoolDataIdentifier(workspaceEntity.getIdentifier(), workspaceEntity.getDataSource().getIdentifier());
return findWorkspaceUserByWorkspaceAndUser(workspaceIdentifier, userIdentifier);
}
public WorkspaceUser findWorkspaceUser(WorkspaceUserEntity workspaceUserEntity) {
return workspaceSchoolDataController.findWorkspaceUser(workspaceUserEntity);
}
public WorkspaceUser findWorkspaceUser(SchoolDataIdentifier workspaceIdentifier, SchoolDataIdentifier workspaceUserIdentifier) {
return workspaceSchoolDataController.findWorkspaceUser(workspaceIdentifier, workspaceUserIdentifier);
}
public List<WorkspaceUserEntity> listWorkspaceUserEntitiesByWorkspaceEntityAndRoleArchetype(WorkspaceEntity workspaceEntity, WorkspaceRoleArchetype roleArchetype) {
List<WorkspaceRoleEntity> workspaceRoles = roleController.listWorkspaceRoleEntitiesByArchetype(roleArchetype);
if (workspaceRoles.isEmpty()) {
return Collections.emptyList();
}
return workspaceUserEntityController.listWorkspaceUserEntitiesByRoles(workspaceEntity, workspaceRoles);
}
public List<User> listUsersByWorkspaceEntityAndRoleArchetype(WorkspaceEntity workspaceEntity, WorkspaceRoleArchetype roleArchetype) {
List<WorkspaceUserEntity> workspaceUserEntities = listWorkspaceUserEntitiesByWorkspaceEntityAndRoleArchetype(workspaceEntity, roleArchetype);
List<User> result = new ArrayList<>(workspaceUserEntities.size());
for (WorkspaceUserEntity workspaceUserEntity : workspaceUserEntities) {
User user = userController.findUserByDataSourceAndIdentifier(workspaceEntity.getDataSource().getIdentifier(), workspaceUserEntity.getUserSchoolDataIdentifier().getIdentifier());
if (user != null) {
result.add(user);
}
}
return result;
}
public List<UserEntity> listUserEntitiesByWorkspaceEntityAndRoleArchetype(WorkspaceEntity workspaceEntity, WorkspaceRoleArchetype roleArchetype) {
List<User> users = listUsersByWorkspaceEntityAndRoleArchetype(workspaceEntity, roleArchetype);
List<UserEntity> result = new ArrayList<>();
for (User user : users) {
UserEntity userEntity = userEntityController.findUserEntityByUser(user);
if (userEntity != null) {
result.add(userEntity);
}
}
return result;
}
/* WorkspaceRoleEntity */
public WorkspaceRoleEntity findWorkspaceRoleEntityByDataSourceAndIdentifier(String schoolDataSource,
String roleIdentifier) {
SchoolDataSource dataSource = schoolDataSourceDAO.findByIdentifier(schoolDataSource);
if (dataSource == null) {
logger.log(Level.SEVERE, "Could not find school data source '" + schoolDataSource + "'");
return null;
}
RoleSchoolDataIdentifier roleSchoolDataIdentifier = roleSchoolDataIdentifierDAO.findByDataSourceAndIdentifier(
dataSource, roleIdentifier);
if (roleSchoolDataIdentifier != null) {
RoleEntity roleEntity = roleSchoolDataIdentifier.getRoleEntity();
if (roleEntity.getType() == UserRoleType.WORKSPACE) {
return (WorkspaceRoleEntity) roleEntity;
}
}
return null;
}
/* WorkspaceSettings */
public WorkspaceSettings findWorkspaceSettings(WorkspaceEntity workspaceEntity) {
return workspaceSettingsDAO.findByWorkspaceEntity(workspaceEntity);
}
/* WorkspaceUserSignup */
public WorkspaceUserSignup createWorkspaceUserSignup(WorkspaceEntity workspaceEntity, UserEntity userEntity,
Date date, String message) {
return workspaceUserSignupDAO.create(workspaceEntity, userEntity, date, message);
}
/* WorkspaceMaterialProducer */
public WorkspaceMaterialProducer createWorkspaceMaterialProducer(WorkspaceEntity workspaceEntity, String name) {
return workspaceMaterialProducerDAO.create(workspaceEntity, name);
}
public WorkspaceMaterialProducer findWorkspaceMaterialProducer(Long workspaceMaterialProducerId) {
return workspaceMaterialProducerDAO.findById(workspaceMaterialProducerId);
}
public List<WorkspaceMaterialProducer> listWorkspaceMaterialProducers(WorkspaceEntity workspaceEntity) {
return workspaceMaterialProducerDAO.listByWorkspaceEntity(workspaceEntity);
}
public void deleteWorkspaceMaterialProducer(WorkspaceMaterialProducer workspaceMaterialProducer) {
workspaceMaterialProducerDAO.delete(workspaceMaterialProducer);
}
}