package org.sakaiproject.tool.assessment.util;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.sakaiproject.content.api.ContentResource;
import org.sakaiproject.content.api.FilePickerHelper;
import org.sakaiproject.content.cover.ContentHostingService;
import org.sakaiproject.entity.api.Reference;
import org.sakaiproject.entity.cover.EntityManager;
import org.sakaiproject.exception.IdUnusedException;
import org.sakaiproject.exception.PermissionException;
import org.sakaiproject.exception.TypeException;
import org.sakaiproject.tool.api.ToolSession;
import org.sakaiproject.tool.assessment.data.dao.grading.ItemGradingAttachment;
import org.sakaiproject.tool.assessment.data.dao.grading.ItemGradingData;
import org.sakaiproject.tool.assessment.data.ifc.assessment.AttachmentIfc;
import org.sakaiproject.tool.assessment.services.GradingService;
import org.sakaiproject.tool.assessment.ui.listener.util.ContextUtil;
import org.sakaiproject.tool.cover.SessionManager;
public class AttachmentUtil {
private static Log log = LogFactory.getLog(AttachmentUtil.class);
public AttachmentUtil() {}
private HashMap getResourceIdHash(Set attachmentSet){
HashMap map = new HashMap();
if (attachmentSet !=null ){
Iterator iter = attachmentSet.iterator();
while (iter.hasNext()){
ItemGradingAttachment attach = (ItemGradingAttachment) iter.next();
map.put(attach.getResourceId(), attach);
}
}
return map;
}
public List prepareAssessmentAttachment(ItemGradingData itemGradingData, Set itemGradingAttachmentSet){
ToolSession session = SessionManager.getCurrentToolSession();
if (session.getAttribute(FilePickerHelper.FILE_PICKER_ATTACHMENTS) != null) {
GradingService gradingService = new GradingService();
HashMap map = getResourceIdHash(itemGradingAttachmentSet);
ArrayList newAttachmentList = new ArrayList();
String protocol = ContextUtil.getProtocol();
List refs = (List)session.getAttribute(FilePickerHelper.FILE_PICKER_ATTACHMENTS);
if (refs != null && refs.size() > 0){
Reference ref;
for(int i = 0; i < refs.size(); i++) {
ref = (Reference) refs.get(i);
String resourceId = ref.getId();
if (map.get(resourceId) == null){
// new attachment, add
log.debug("**** ref.Id="+ref.getId());
log.debug("**** ref.name="+ref.getProperties().getProperty(ref.getProperties().getNamePropDisplayName()));
ItemGradingAttachment newAttach = gradingService.createItemGradingAttachment(
itemGradingData,
ref.getId(), ref.getProperties().getProperty(
ref.getProperties().getNamePropDisplayName()),
protocol);
newAttachmentList.add(newAttach);
}
else{
// attachment already exist, let's add it to new list and check it off from map
newAttachmentList.add((ItemGradingAttachment)map.get(resourceId));
map.remove(resourceId);
}
}
}
session.removeAttribute(FilePickerHelper.FILE_PICKER_ATTACHMENTS);
session.removeAttribute(FilePickerHelper.FILE_PICKER_CANCEL);
return newAttachmentList;
}
return new ArrayList();
}
public List prepareReferenceList(List attachmentList){
List list = new ArrayList();
for (int i=0; i<attachmentList.size(); i++){
ContentResource cr = null;
AttachmentIfc attach = (AttachmentIfc) attachmentList.get(i);
try{
cr = ContentHostingService.getResource(attach.getResourceId());
}
catch (PermissionException e) {
log.warn("PermissionException from ContentHostingService:"+e.getMessage());
}
catch (IdUnusedException e) {
log.warn("IdUnusedException from ContentHostingService:"+e.getMessage());
// <-- bad sign, some left over association of assessment and resource,
// use case: user remove resource in file picker, then exit modification without
// proper cancellation by clicking at the left nav instead of "cancel".
// Also in this use case, any added resource would be left orphan.
GradingService gradingService = new GradingService();
gradingService.removeItemGradingAttachment(attach.getAttachmentId().toString());
}
catch (TypeException e) {
log.warn("TypeException from ContentHostingService:"+e.getMessage());
}
if (cr!=null){
Reference ref = EntityManager.newReference(cr.getReference());
if (ref !=null ) list.add(ref);
}
}
return list;
}
}