package fi.otavanopisto.muikku.plugins.workspace; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; 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.Matches; import org.ocpsoft.rewrite.annotation.Parameter; import org.ocpsoft.rewrite.annotation.RequestAction; import fi.otavanopisto.muikku.jsf.NavigationRules; import fi.otavanopisto.muikku.model.users.UserEntity; import fi.otavanopisto.muikku.model.workspace.WorkspaceEntity; import fi.otavanopisto.muikku.model.workspace.WorkspaceRoleArchetype; import fi.otavanopisto.muikku.plugins.workspace.model.WorkspaceJournalEntry; import fi.otavanopisto.muikku.schooldata.SchoolDataBridgeSessionController; import fi.otavanopisto.muikku.schooldata.WorkspaceController; import fi.otavanopisto.muikku.schooldata.entity.User; import fi.otavanopisto.muikku.security.MuikkuPermissions; import fi.otavanopisto.muikku.session.SessionController; import fi.otavanopisto.muikku.users.UserController; import fi.otavanopisto.muikku.users.UserEntityController; import fi.otavanopisto.security.LoggedIn; @Named @Stateful @RequestScoped @Join(path = "/workspace/{workspaceUrlName}/journal", to = "/jsf/workspace/journal.jsf") @LoggedIn public class WorkspaceJournalBackingBean extends AbstractWorkspaceBackingBean { public static int PAGE_SIZE = 25; public static final class UserView { private final User user; private final UserEntity userEntity; private final boolean selected; public UserView(User user, UserEntity entity, boolean selected) { this.user = user; this.userEntity = entity; this.selected = selected; } public User getUser() { return user; } public UserEntity getUserEntity() { return userEntity; } public boolean isSelected() { return selected; } } @Parameter private String workspaceUrlName; @Parameter @Matches("\\d+") private Long studentId; @Parameter @Matches("\\d+") private Long page; @Inject private SessionController sessionController; @Inject private UserController userController; @Inject private UserEntityController userEntityController; @Inject private WorkspaceController workspaceController; @Inject private WorkspaceJournalController workspaceJournalController; @Inject private SchoolDataBridgeSessionController schoolDataBridgeSessionController; @Inject @Named private WorkspaceBackingBean workspaceBackingBean; @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; } if (!sessionController.hasWorkspacePermission(MuikkuPermissions.ACCESS_WORKSPACE_JOURNAL, workspaceEntity)) { return NavigationRules.ACCESS_DENIED; } if (studentId != null && !sessionController.hasWorkspacePermission(MuikkuPermissions.LIST_ALL_JOURNAL_ENTRIES, workspaceEntity)){ return NavigationRules.ACCESS_DENIED; } workspaceBackingBean.setWorkspaceUrlName(urlName); workspaceEntityId = workspaceEntity.getId(); posters = new HashMap<Long, String>(); canListAllEntries = sessionController.hasWorkspacePermission(MuikkuPermissions.LIST_ALL_JOURNAL_ENTRIES, workspaceEntity); workspaceStudents = prepareWorkspaceStudents(); journalEntries = prepareJournalEntries(); schoolDataBridgeSessionController.startSystemSession(); try { for (WorkspaceJournalEntry journalEntry : journalEntries) { if (!posters.containsKey(journalEntry.getUserEntityId())) { UserEntity userEntity = userEntityController.findUserEntityById(journalEntry.getUserEntityId()); User user = userController.findUserByUserEntityDefaults(userEntity); String fullName; if (user != null) { fullName = user.getFirstName() + " " + user.getLastName(); } else { fullName = "Anonymous"; } posters.put(journalEntry.getUserEntityId(), fullName); } } } finally { schoolDataBridgeSessionController.endSystemSession(); } return null; } public String posterOf(WorkspaceJournalEntry entry) { return posters.get(entry.getUserEntityId()); } public void addWorkspaceJournalEntry() { workspaceJournalController.createJournalEntry(workspaceController.findWorkspaceEntityById(workspaceEntityId), sessionController.getLoggedUserEntity(), workspaceJournalEntryHtml, workspaceJournalEntryTitle); workspaceJournalEntryTitle = ""; workspaceJournalEntryHtml = ""; } public void editWorkspaceJournalEntry(Long workspaceJournalEntryId) { workspaceJournalController.updateJournalEntry(workspaceJournalEntryId, workspaceJournalEntryTitle, workspaceJournalEntryHtml); workspaceJournalEntryTitle = ""; workspaceJournalEntryHtml = ""; } public String getWorkspaceUrlName() { return workspaceUrlName; } public void setWorkspaceUrlName(String workspaceUrlName) { this.workspaceUrlName = workspaceUrlName; } public Long getWorkspaceEntityId() { return workspaceEntityId; } public String getWorkspaceJournalEntryTitle() { return workspaceJournalEntryTitle; } public void setWorkspaceJournalEntryTitle(String workspaceJournalEntryTitle) { this.workspaceJournalEntryTitle = workspaceJournalEntryTitle; } public String getWorkspaceJournalEntryHtml() { return workspaceJournalEntryHtml; } public void setWorkspaceJournalEntryHtml(String workspaceJournalEntryHtml) { this.workspaceJournalEntryHtml = workspaceJournalEntryHtml; } public Long getWorkspaceJournalEntryId() { return workspaceJournalEntryId; } public void setWorkspaceJournalEntryId(Long workspaceJournalEntryId) { this.workspaceJournalEntryId = workspaceJournalEntryId; } public void setStudentId(Long studentId) { this.studentId = studentId; } public Long getStudentId() { return studentId; } public Long getPage() { return page == null ? 1l : page; } public void setPage(Long page) { this.page = page; } public boolean isMyJournal() { return studentId == null; } public boolean isCanListAllEntries() { return canListAllEntries; } public List<UserView> getWorkspaceStudents() { return workspaceStudents; } public List<WorkspaceJournalEntry> getJournalEntries() { return journalEntries; } private List<UserView> prepareWorkspaceStudents() { if (!canListAllEntries) { return Collections.emptyList(); } ArrayList<UserView> result = new ArrayList<>(); WorkspaceEntity workspaceEntity = workspaceController.findWorkspaceEntityById(workspaceEntityId); List<User> userList = workspaceController.listUsersByWorkspaceEntityAndRoleArchetype( workspaceEntity, WorkspaceRoleArchetype.STUDENT); for (User user : userList) { UserEntity userEntity = userEntityController.findUserEntityByDataSourceAndIdentifier( user.getSchoolDataSource(), user.getIdentifier()); result.add( new UserView(user, userEntity, userEntity.getId().equals(studentId)) ); } Collections.sort(result, new Comparator<UserView>() { @Override public int compare(UserView o1, UserView o2) { String s1 = o1.getUser().getLastName(); String s2 = o2.getUser().getLastName(); s1 = s1 == null ? "" : s1; s2 = s2 == null ? "" : s2; int result = s1.compareTo(s2); if (result == 0) { s1 = o1.getUser().getFirstName(); s2 = o2.getUser().getFirstName(); result = s1.compareTo(s2); } return result; } }); return result; } private List<WorkspaceJournalEntry> prepareJournalEntries() { int page = getPage().intValue() - 1; WorkspaceEntity workspaceEntity = workspaceController.findWorkspaceEntityById(workspaceEntityId); UserEntity userEntity = sessionController.getLoggedUserEntity(); if (studentId == null) { if (sessionController.hasWorkspacePermission(MuikkuPermissions.LIST_ALL_JOURNAL_ENTRIES, workspaceEntity)) { return workspaceJournalController.listEntries(workspaceEntity, page, PAGE_SIZE); } else { return workspaceJournalController.listEntriesByWorkspaceEntityAndUserEntity(workspaceEntity, userEntity, page, PAGE_SIZE); } } else { if (sessionController.hasWorkspacePermission(MuikkuPermissions.LIST_ALL_JOURNAL_ENTRIES, workspaceEntity)) { UserEntity studentEntity = userEntityController.findUserEntityById(studentId); return workspaceJournalController.listEntriesByWorkspaceEntityAndUserEntity(workspaceEntity, studentEntity, page, PAGE_SIZE); } else { return Arrays.asList(); } } } private Long workspaceEntityId; private String workspaceJournalEntryTitle; private String workspaceJournalEntryHtml; private Long workspaceJournalEntryId; private boolean canListAllEntries; private List<UserView> workspaceStudents; private List<WorkspaceJournalEntry> journalEntries; private Map<Long, String> posters; }