/********************************************************************************** * $URL: https://source.sakaiproject.org/svn/sam/trunk/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/listener/author/ResetAssessmentAttachmentListener.java $ * $Id: ResetAssessmentAttachmentListener.java 106463 2012-04-02 12:20:09Z david.horwitz@uct.ac.za $ *********************************************************************************** * * Copyright (c) 2004, 2005, 2006, 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.sakaiproject.tool.assessment.ui.listener.author; import java.util.ArrayList; import java.util.List; import javax.faces.event.AbortProcessingException; import javax.faces.event.ActionEvent; import javax.faces.event.ActionListener; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.sakaiproject.content.api.ContentResource; import org.sakaiproject.exception.IdUnusedException; import org.sakaiproject.exception.PermissionException; import org.sakaiproject.exception.TypeException; import org.sakaiproject.tool.assessment.data.ifc.assessment.AssessmentIfc; import org.sakaiproject.tool.assessment.data.ifc.assessment.AttachmentIfc; import org.sakaiproject.tool.assessment.services.assessment.AssessmentService; import org.sakaiproject.tool.assessment.services.assessment.PublishedAssessmentService; import org.sakaiproject.tool.assessment.ui.bean.author.AssessmentSettingsBean; import org.sakaiproject.tool.assessment.ui.bean.author.AuthorBean; import org.sakaiproject.tool.assessment.ui.bean.author.PublishedAssessmentSettingsBean; import org.sakaiproject.tool.assessment.ui.listener.util.ContextUtil; /** * <p>Title: Samigo</p> * <p>Description: Sakai Assessment Manager</p> * @version $Id: ResetAssessmentAttachmentListener.java 106463 2012-04-02 12:20:09Z david.horwitz@uct.ac.za $ */ public class ResetAssessmentAttachmentListener implements ActionListener { private static Log log = LogFactory.getLog(ResetAssessmentAttachmentListener.class); public ResetAssessmentAttachmentListener() { } public void processAction(ActionEvent ae) throws AbortProcessingException { AssessmentService assessmentService = new AssessmentService(); AssessmentSettingsBean assessmentSettingsBean = (AssessmentSettingsBean) ContextUtil.lookupBean("assessmentSettings"); String assessmentId = assessmentSettingsBean.getAssessmentId().toString(); log.debug("***assessmentId="+assessmentId); if (assessmentId !=null && !("").equals(assessmentId)){ AssessmentIfc assessment = (AssessmentIfc) assessmentService.getAssessment(assessmentId); resetAssessmentAttachment(assessment.getAssessmentAttachmentList(), assessmentService); } else{ resetAssessmentAttachment(new ArrayList(), assessmentService); } } public void resetAssessmentAttachment(List attachmentList, AssessmentService assessmentService){ // 1. we need to make sure that attachment removed/added by file picker // will be restored/remove when user cancels the entire modification if (attachmentList != null){ for (int i=0; i<attachmentList.size(); i++){ AttachmentIfc attach = (AttachmentIfc) attachmentList.get(i); try{ ContentResource cr = AssessmentService.getContentHostingService().getResource(attach.getResourceId()); } catch (PermissionException e) { log.warn("PermissionException from ContentHostingService:"+e.getMessage()); } catch (IdUnusedException e) { // <-- bad sign, // use case: ContentHosting deleted the resource // and user cancel out all the modification // including those that CHS has removed // according to Glenn , it is a bug in CHS. // so we would just do clean up to avoid having attachments // points to empty resources log.warn("IdUnusedException from ContentHostingService:"+e.getMessage()); log.warn("***removing an empty assessment attachment association, attachmentId="+attach.getAttachmentId()); assessmentService.removeAssessmentAttachment(attach.getAttachmentId().toString()); /* forget it #1 if (resourceHash != null){ ContentResource old_cr = (ContentResource) resourceHash.get(attach.getResourceId()); if (old_cr!=null){ resourceHash.remove(attach.getResourceId()); } } */ } catch (TypeException e) { log.warn("TypeException from ContentHostingService:"+e.getMessage()); } } } /* forget it #2 the fact that resources belongs to other assessment get deleted is too great if there is a mistake in the code or sequence of users action that I haven't foreseen. So I am commenting this out. These resources shall remain in the DB as orphan. Let's leave the clean up for CHS. Afterall, it shan't commit before the tool tell it to. // 2. any leftover in resourceHash are files that are uploaded // but has no association with the assessment and we should remove // it. use case: add attachment and cancel the entire modification removeLeftOverResources(resourceHash); // VERY IMPORTANT to clean up bean.resourceHash bean.setResourceHash(null); */ } /* forget it #3 private void removeLeftOverResources(HashMap resourceHash){ AssessmentService assessmentService = new AssessmentService(); Set keys = resourceHash.keySet(); Iterator iter1 = keys.iterator(); while (iter1.hasNext()){ String resourceId = (String)iter1.next(); try{ log.debug("***removing left over resourceId="+resourceId); ContentHostingService.removeResource(resourceId); } catch (PermissionException e) { log.warn("PermissionException from ContentHostingService:"+e.getMessage()); } catch (IdUnusedException e) { log.warn("IdUnusedException from ContentHostingService:"+e.getMessage()); } catch (TypeException e) { log.warn("TypeException from ContentHostingService:"+e.getMessage()); } catch (InUseException e) { log.warn("InUseException from ContentHostingService:"+e.getMessage()); } } } */ }