package fi.otavanopisto.muikku.plugins.workspace;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.Stateful;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.commons.lang3.StringUtils;
import org.ocpsoft.rewrite.annotation.Join;
import org.ocpsoft.rewrite.annotation.Parameter;
import org.ocpsoft.rewrite.annotation.RequestAction;
import fi.otavanopisto.muikku.jsf.NavigationRules;
import fi.otavanopisto.muikku.model.workspace.WorkspaceEntity;
import fi.otavanopisto.muikku.plugins.workspace.model.WorkspaceMaterial;
import fi.otavanopisto.muikku.schooldata.CourseMetaController;
import fi.otavanopisto.muikku.schooldata.SchoolDataBridgeSessionController;
import fi.otavanopisto.muikku.schooldata.WorkspaceController;
import fi.otavanopisto.muikku.schooldata.entity.CourseLengthUnit;
import fi.otavanopisto.muikku.schooldata.entity.EducationType;
import fi.otavanopisto.muikku.schooldata.entity.Subject;
import fi.otavanopisto.muikku.schooldata.entity.Workspace;
import fi.otavanopisto.muikku.schooldata.entity.WorkspaceType;
import fi.otavanopisto.muikku.security.MuikkuPermissions;
import fi.otavanopisto.muikku.session.SessionController;
@Named
@Stateful
@RequestScoped
@Join(path = "/workspace/{workspaceUrlName}", to = "/jsf/workspace/workspace.jsf")
public class WorkspaceIndexBackingBean extends AbstractWorkspaceBackingBean {
@Parameter
private String workspaceUrlName;
@Inject
private SessionController sessionController;
@Inject
private WorkspaceController workspaceController;
@Inject
private WorkspaceMaterialController workspaceMaterialController;
@Inject
private SchoolDataBridgeSessionController schoolDataBridgeSessionController;
@Inject
@Named
private WorkspaceBackingBean workspaceBackingBean;
@Inject
private WorkspaceVisitController workspaceVisitController;
@Inject
private CourseMetaController courseMetaController;
@Inject
private Logger logger;
@RequestAction
public String init() {
String urlName = getWorkspaceUrlName();
if (StringUtils.isBlank(urlName)) {
return NavigationRules.NOT_FOUND;
}
WorkspaceEntity workspaceEntity = workspaceController.findWorkspaceEntityByUrlName(urlName);
if (workspaceEntity == null) {
return NavigationRules.NOT_FOUND;
}
canPublish = sessionController.hasWorkspacePermission(MuikkuPermissions.PUBLISH_WORKSPACE, workspaceEntity);
workspaceEntityId = workspaceEntity.getId();
published = workspaceEntity.getPublished();
if (!published) {
if (!sessionController.hasWorkspacePermission(MuikkuPermissions.ACCESS_UNPUBLISHED_WORKSPACE, workspaceEntity)) {
return NavigationRules.NOT_FOUND;
}
}
try {
WorkspaceMaterial frontPage = workspaceMaterialController.ensureWorkspaceFrontPageExists(workspaceEntity);
contentNodes = Arrays.asList(workspaceMaterialController.createContentNode(frontPage));
}
catch (WorkspaceMaterialException e) {
logger.log(Level.SEVERE, "Error loading materials", e);
return NavigationRules.INTERNAL_ERROR;
}
workspaceBackingBean.setWorkspaceUrlName(urlName);
schoolDataBridgeSessionController.startSystemSession();
try {
Workspace workspace = workspaceController.findWorkspace(workspaceEntity);
if (workspace == null) {
logger.warning(String.format("Could not find workspace for workspaceEntity #%d", workspaceEntity.getId()));
return NavigationRules.NOT_FOUND;
}
WorkspaceType workspaceType = workspaceController.findWorkspaceType(workspace.getWorkspaceTypeId());
EducationType educationTypeObject = workspace.getEducationTypeIdentifier() == null ? null : courseMetaController.findEducationType(workspace.getEducationTypeIdentifier());
Subject subjectObject = courseMetaController.findSubject(workspace.getSchoolDataSource(), workspace.getSubjectIdentifier());
CourseLengthUnit lengthUnit = null;
if ((workspace.getLength() != null) && (workspace.getLengthUnitIdentifier() != null)) {
lengthUnit = courseMetaController.findCourseLengthUnit(workspace.getSchoolDataSource(), workspace.getLengthUnitIdentifier());
}
workspaceId = workspaceEntity.getId();
workspaceName = workspace.getName();
workspaceNameExtension = workspace.getNameExtension();
subject = subjectObject != null ? subjectObject.getName() : null;
educationType = educationTypeObject != null ? educationTypeObject.getName() : null;
if (lengthUnit != null) {
courseLength = workspace.getLength();
courseLengthSymbol = lengthUnit.getSymbol();
}
beginDate = workspace.getBeginDate() != null ? Date.from(workspace.getBeginDate().toInstant()) : null;
endDate = workspace.getEndDate() != null ? Date.from(workspace.getEndDate().toInstant()) : null;
if (workspaceType != null) {
this.workspaceType = workspaceType.getName();
}
} finally {
schoolDataBridgeSessionController.endSystemSession();
}
materialsBaseUrl = String.format("/workspace/%s/materials", workspaceUrlName);
announcementsBaseUrl = String.format("/workspace/%s/announcements", workspaceUrlName);
workspaceVisitController.visit(workspaceEntity);
return null;
}
public Long getWorkspaceId() {
return workspaceId;
}
public void setWorkspaceId(Long workspaceId) {
this.workspaceId = workspaceId;
}
public String getWorkspaceUrlName() {
return workspaceUrlName;
}
public void setWorkspaceUrlName(String workspaceUrlName) {
this.workspaceUrlName = workspaceUrlName;
}
public String getWorkspaceName() {
return workspaceName;
}
public String getContents() {
return contents;
}
public long getWorkspaceMaterialId() {
return workspaceMaterialId;
}
public void setWorkspaceMaterialId(long workspaceMaterialId) {
this.workspaceMaterialId = workspaceMaterialId;
}
public long getMaterialId() {
return materialId;
}
public void setMaterialId(long materialId) {
this.materialId = materialId;
}
public String getMaterialType() {
return materialType;
}
public void setMaterialType(String materialType) {
this.materialType = materialType;
}
public String getMaterialTitle() {
return materialTitle;
}
public void setMaterialTitle(String materialTitle) {
this.materialTitle = materialTitle;
}
public long getWorkspaceEntityId() {
return workspaceEntityId;
}
public void setWorkspaceEntityId(long workspaceEntityId) {
this.workspaceEntityId = workspaceEntityId;
}
public String getWorkspaceType() {
return workspaceType;
}
public String getSubject() {
return subject;
}
public String getEducationType() {
return educationType;
}
public Double getCourseLength() {
return courseLength;
}
public String getCourseLengthSymbol() {
return courseLengthSymbol;
}
public Boolean getPublished() {
return published;
}
public Boolean getCanPublish() {
return canPublish;
}
public Date getBeginDate() {
return beginDate;
}
public Date getEndDate() {
return endDate;
}
public List<ContentNode> getContentNodes() {
return contentNodes;
}
public String getMaterialsBaseUrl() {
return materialsBaseUrl;
}
public String getWorkspaceNameExtension() {
return workspaceNameExtension;
}
public void setWorkspaceNameExtension(String workspaceNameExtension) {
this.workspaceNameExtension = workspaceNameExtension;
}
public String getAnnouncementsBaseUrl() {
return announcementsBaseUrl;
}
public void setAnnouncementsBaseUrl(String announcementsBaseUrl) {
this.announcementsBaseUrl = announcementsBaseUrl;
}
private Long workspaceId;
private String workspaceName;
private String workspaceNameExtension;
private Long workspaceEntityId;
private String contents;
private long workspaceMaterialId;
private long materialId;
private String materialType;
private String materialTitle;
private String workspaceType;
private String subject;
private String educationType;
private Double courseLength;
private String courseLengthSymbol;
private Boolean published;
private Boolean canPublish;
private Date beginDate;
private Date endDate;
private List<ContentNode> contentNodes;
private String materialsBaseUrl;
private String announcementsBaseUrl;
}