/********************************************************************************** * $URL: https://source.sakaiproject.org/svn/osp/trunk/matrix/tool/src/java/org/theospi/portfolio/matrix/control/ManageCellStatusController.java $ * $Id: ManageCellStatusController.java 131548 2013-11-14 16:42:13Z dsobiera@indiana.edu $ *********************************************************************************** * * Copyright (c) 2005, 2006, 2007, 2008 The Sakai Foundation * * Licensed under the Educational Community License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.opensource.org/licenses/ECL-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * **********************************************************************************/ package org.theospi.portfolio.matrix.control; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.sakaiproject.authz.api.Member; import org.sakaiproject.content.api.LockManager; import org.sakaiproject.exception.IdUnusedException; import org.sakaiproject.metaobj.shared.mgt.AgentManager; import org.sakaiproject.metaobj.shared.mgt.IdManager; import org.sakaiproject.metaobj.shared.model.Agent; import org.sakaiproject.metaobj.shared.model.Id; import org.sakaiproject.metaobj.utils.mvc.intf.Controller; import org.sakaiproject.site.api.Group; import org.sakaiproject.site.api.Site; import org.sakaiproject.site.cover.SiteService; import org.springframework.validation.Errors; import org.springframework.web.servlet.ModelAndView; import org.theospi.portfolio.matrix.MatrixFunctionConstants; import org.theospi.portfolio.matrix.MatrixManager; import org.theospi.portfolio.matrix.WizardPageHelper; import org.theospi.portfolio.matrix.model.Attachment; import org.theospi.portfolio.matrix.model.Matrix; import org.theospi.portfolio.matrix.model.ScaffoldingCell; import org.theospi.portfolio.matrix.model.WizardPage; import org.theospi.portfolio.matrix.model.WizardPageDefinition; import org.theospi.portfolio.matrix.model.WizardPageForm; import org.theospi.portfolio.matrix.model.impl.MatrixContentEntityProducer; import org.theospi.portfolio.review.mgt.ReviewManager; import org.theospi.portfolio.review.model.Review; import org.theospi.portfolio.wizard.mgt.WizardManager; import org.theospi.portfolio.wizard.model.CompletedWizard; public class ManageCellStatusController implements Controller { private MatrixManager matrixManager = null; private IdManager idManager = null; private LockManager lockManager = null; private ReviewManager reviewManager = null; private AgentManager agentManager = null; private WizardManager wizardManager = null; /* (non-Javadoc) * @see org.theospi.utils.mvc.intf.Controller#handleRequest(java.lang.Object, java.util.Map, java.util.Map, java.util.Map, org.springframework.validation.Errors) */ public ModelAndView handleRequest(Object requestModel, Map request, Map session, Map application, Errors errors) { String viewName = "success"; String viewAppend = ""; Id id = idManager.getId((String)request.get("page_id")); Map<String, Object> model = new HashMap<String, Object>(); model.put("page_id", id); WizardPage page = getMatrixManager().getWizardPage(id); List<String> statusArray = new ArrayList<String>(4); statusArray.add(MatrixFunctionConstants.READY_STATUS); statusArray.add(MatrixFunctionConstants.PENDING_STATUS); statusArray.add(MatrixFunctionConstants.COMPLETE_STATUS); statusArray.add(MatrixFunctionConstants.LOCKED_STATUS); statusArray.add(MatrixFunctionConstants.RETURNED_STATUS); model.put("statuses", statusArray); model.put("readOnlyMatrix", (String)request.get("readOnlyMatrix")); Site site = null; try { site = SiteService.getSite(page.getPageDefinition().getSiteId()); if (site.hasGroups()) { List<Group> groups = new ArrayList<Group>(site.getGroups()); Collections.sort(groups, new Comparator<Group>() { public int compare(Group arg0, Group arg1) { return arg0.getTitle().toLowerCase().compareTo(arg1.getTitle().toLowerCase()); }}); model.put("groups", groups); } } catch (IdUnusedException e) { // TODO Auto-generated catch block e.printStackTrace(); } String cancel = (String)request.get("cancel"); String next = (String)request.get("continue"); String changeOption = (String)request.get("changeOption"); boolean setSingle = "changeUserOnly".equalsIgnoreCase(changeOption) ? true : false; boolean setAll = "changeAll".equalsIgnoreCase(changeOption) ? true : false; boolean setGroup = "changeGroup".equalsIgnoreCase(changeOption) ? true : false; String groupId = (String)request.get("groupId"); String newStatusValue = (String)request.get("newStatusValue"); String isWizard = (String)request.get("isWizard"); String sequential = (String)request.get("sequential"); if (isWizard != null) { model.put("isWizard", isWizard); } if (sequential == null || sequential.equals("")) { sequential = "false"; } if (sequential != null) { model.put("sequential", sequential); if (Boolean.parseBoolean(isWizard) && !Boolean.parseBoolean(sequential)) { viewAppend = "Hier"; } } if (cancel != null) { viewName = "done"; } else if (next != null && setSingle) { viewName = "done" + viewAppend; setPageStatus(page, newStatusValue); } else if (next != null && setAll) { ensureUserDataExists(page.getPageDefinition().getSiteId(), page, null); List<WizardPage> allPages = getMatrixManager().getPagesByPageDef(page.getPageDefinition().getId()); viewName = "done" + viewAppend; for (WizardPage iterPage : allPages) { setPageStatus(iterPage, newStatusValue); } } else if (next != null && setGroup && groupId != null) { ensureUserDataExists(site.getId(), page, groupId); Group group = site.getGroup(groupId); boolean ungrouped = group == null && groupId.equalsIgnoreCase("ungrouped"); List<WizardPage> allPages = getMatrixManager().getPagesByPageDef(page.getPageDefinition().getId()); viewName = "done" + viewAppend; for (WizardPage iterPage : allPages) { String userId = iterPage.getOwner().getId().getValue(); if ((ungrouped && site.getGroupsWithMember(userId).isEmpty()) || (group != null && group.getMember(userId) != null)) { setPageStatus(iterPage, newStatusValue); } } } session.put(WizardPageHelper.WIZARD_OWNER, page.getOwner()); return new ModelAndView(viewName, model); } protected void setPageStatus(WizardPage page, String status) { //Set the status only if it needs to be changed if (!page.getStatus().equals(status)) { page.setStatus(status); getMatrixManager().storePage(page); if (status.equals(MatrixFunctionConstants.READY_STATUS)) { //Unlock page's content for (Iterator<Attachment> iter = page.getAttachments().iterator(); iter.hasNext();) { Attachment att = (Attachment) iter.next(); getLockManager().removeLock(att.getArtifactId().getValue(), page.getId().getValue()); } for (Iterator<WizardPageForm> iter2 = page.getPageForms().iterator(); iter2.hasNext();) { WizardPageForm form = (WizardPageForm) iter2.next(); getLockManager().removeLock(form.getArtifactId().getValue(), page.getId().getValue()); } //unlock reflection form too List<Review> reflections = getReviewManager().getReviewsByParentAndType(page.getId().getValue(), Review.REFLECTION_TYPE, page.getPageDefinition().getSiteId(), MatrixContentEntityProducer.MATRIX_PRODUCER); for (Iterator<Review> iter3 = reflections.iterator(); iter3.hasNext();) { Review review = (Review)iter3.next(); getLockManager().removeLock(review.getReviewContent().getValue(), page.getId().getValue()); } } else { //lock everything for (Iterator<Attachment> iter = page.getAttachments().iterator(); iter.hasNext();) { Attachment att = (Attachment) iter.next(); getLockManager().lockObject(att.getArtifactId().getValue(), page.getId().getValue(), "locked by status manager", true); } for (Iterator<WizardPageForm> iter2 = page.getPageForms().iterator(); iter2.hasNext();) { WizardPageForm form = (WizardPageForm) iter2.next(); getLockManager().lockObject(form.getArtifactId().getValue(), page.getId().getValue(), "locked by status manager", true); } //lock reflection form too List<Review> reflections = getReviewManager().getReviewsByParentAndType(page.getId().getValue(), Review.REFLECTION_TYPE, page.getPageDefinition().getSiteId(), MatrixContentEntityProducer.MATRIX_PRODUCER); for (Iterator<Review> iter3 = reflections.iterator(); iter3.hasNext();) { Review review = (Review)iter3.next(); getLockManager().lockObject(review.getReviewContent().getValue(), page.getId().getValue(), "locked by status manager", true); } } } } protected void ensureUserDataExists(String siteId, WizardPage page, String groupId) { String type = page.getPageDefinition().getType(); try { Site site = SiteService.getSite(siteId); Set<Member> members = new HashSet<Member>(); if (groupId == null) { members = site.getMembers(); } else { Group group = site.getGroup(groupId); if (group != null) { members = group.getMembers(); } } if (WizardPageDefinition.WPD_MATRIX_TYPE.equals(type)) { createMissingMatrices(members, page); } else { createMissingCompletedWizards(members, page); } } catch (IdUnusedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } protected void createMissingMatrices(Set<Member> members, WizardPage page) { ScaffoldingCell sCell = getMatrixManager().getScaffoldingCellByWizardPageDef(page.getPageDefinition().getId()); Set<Agent> agentsToCreate = getAgentsWithNoMatrix(convertMembersToAgents(members), sCell.getScaffolding().getId()); for (Agent agent : agentsToCreate) { getMatrixManager().createMatrix(agent, sCell.getScaffolding()); } } protected void createMissingCompletedWizards(Set<Member> members, WizardPage page) { CompletedWizard cw = getWizardManager().getCompletedWizardByPage(page.getId()); Set<Agent> agentsToCreate = getAgentsWithNoWizard(convertMembersToAgents(members), cw.getWizard().getId()); for (Agent agent : agentsToCreate) { getWizardManager().getCompletedWizard(cw.getWizard(), agent.getId().getValue(), true); } } protected Set<Agent> convertMembersToAgents(Set<Member> members) { Set<Agent> agents = new HashSet<Agent>(members.size()); for (Member member : members) { Agent agent = getAgentManager().getAgent(member.getUserId()); agents.add(agent); } return agents; } /** * Lookup all matrices and then remove the ones found from the passed agents list * @param agents All current members of the site containing the passed scaffolding id * @param scaffoldingId * @return */ protected Set<Agent> getAgentsWithNoMatrix(Set<Agent> agents, Id scaffoldingId) { Set<Agent> agentsLeft = agents; List<Matrix> matrices = getMatrixManager().getMatrices(scaffoldingId); for (Matrix matrix : matrices) { agentsLeft.remove(matrix.getOwner()); } return agentsLeft; } /** * Lookup all completed wizards and then remove the ones found from the passed agents list * @param agents All current members of the site containing the passed wizard id * @param wizardId * @return */ protected Set<Agent> getAgentsWithNoWizard(Set<Agent> agents, Id wizardId) { Set<Agent> agentsLeft = agents; List<CompletedWizard> cWizards = getWizardManager().getCompletedWizardsByWizardId(wizardId.getValue()); for (CompletedWizard cw : cWizards) { agentsLeft.remove(cw.getOwner()); } return agentsLeft; } public IdManager getIdManager() { return idManager; } public void setIdManager(IdManager idManager) { this.idManager = idManager; } public MatrixManager getMatrixManager() { return matrixManager; } public void setMatrixManager(MatrixManager matrixManager) { this.matrixManager = matrixManager; } public LockManager getLockManager() { return lockManager; } public void setLockManager(LockManager lockManager) { this.lockManager = lockManager; } /** * @return the reviewManager */ public ReviewManager getReviewManager() { return reviewManager; } /** * @param reviewManager the reviewManager to set */ public void setReviewManager(ReviewManager reviewManager) { this.reviewManager = reviewManager; } public AgentManager getAgentManager() { return agentManager; } public void setAgentManager(AgentManager agentManager) { this.agentManager = agentManager; } public WizardManager getWizardManager() { return wizardManager; } public void setWizardManager(WizardManager wizardManager) { this.wizardManager = wizardManager; } }