package org.theospi.portfolio.presentation.control; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.sakaiproject.metaobj.shared.FormHelper; import org.sakaiproject.metaobj.shared.mgt.IdManager; import org.theospi.portfolio.presentation.model.Presentation; import org.theospi.portfolio.presentation.model.PresentationItem; import org.theospi.portfolio.presentation.model.PresentationItemDefinition; public class EditPresentationFormController extends AbstractCalloutController { //NOTE: This controller handles the creation/edits of forms from the context // of an existing presentation. It sets the return view to the contents // of that presentation. protected static final String PROP_PRESENTATION_ITEM_DEF_ID = "_PresentationItemDef:Id"; protected IdManager idManager; public EditPresentationFormController() { setReturnView("editContentRedirect"); } @Override protected Map<String, Object> getSessionParams(String presentationId, HttpServletRequest request) { String formTypeId = request.getParameter("formTypeId"); String formId = request.getParameter("formId"); String itemDefId = request.getParameter("itemDefId"); String formCopy = request.getParameter("formCopy"); if (formCopy != null && "true".equals(formCopy) && formId != null) { Map<String, Object> retMap = presentationService.copyForm(presentationId, formTypeId, formId); retMap.put(PROP_PRESENTATION_ITEM_DEF_ID, itemDefId); return retMap; } else if (formId != null) return presentationService.editForm(presentationId, formTypeId, formId, itemDefId); else { return presentationService.createForm(presentationId, formTypeId, itemDefId); } } @Override protected void save(String presentationId, String reference, HttpSession session) { String itemDefId = (String) session.getAttribute(FormHelper.PRESENTATION_ITEM_DEF_ID); //Check for an itemDefId...if none, was an edit and don't need to do anything if (itemDefId != null) { Presentation presentation = presentationService.getPresentation(presentationId); PresentationItemDefinition itemDef = presentationService.getPresentationItemDefinition(itemDefId); PresentationItem pi = new PresentationItem(); pi.setArtifactId(idManager.getId(reference)); pi.setDefinition(itemDef); Set<PresentationItem> items = (Set<PresentationItem>)presentation.getPresentationItems(); int size = items.size(); if (!itemDef.isAllowMultiple() && size > 0) { //If I can only have one item and there is already one, clear it so the new one wins clearItemsByType(itemDef, items); } items.add(pi); presentationService.savePresentation(presentation, false, true); } return; } /** * Iterate through the presentation items and remove the once that match the passed item definition * @param itemDef * @param items * @return The number of items removed */ private int clearItemsByType(PresentationItemDefinition itemDef, Set<PresentationItem> items) { int countRemoved = 0; List<PresentationItem> toRemove = new ArrayList<PresentationItem>(); for (PresentationItem item : items) { if (item.getDefinition() == itemDef) { toRemove.add(item); } } for (PresentationItem item : toRemove) { items.remove(item); countRemoved++; } return countRemoved; } @Override protected void cleanUpSession(HttpSession session) { super.cleanUpSession(session); session.removeAttribute(FormHelper.PRESENTATION_ITEM_DEF_ID); session.removeAttribute(FormHelper.PRESENTATION_ID); session.removeAttribute(FormHelper.PRESENTATION_ITEM_DEF_NAME); session.removeAttribute(FormHelper.PRESENTATION_TEMPLATE_ID); } public void setIdManager(IdManager idManager) { this.idManager = idManager; } }