/********************************************************************************** * $URL: https://source.sakaiproject.org/svn/sam/trunk/samigo-services/src/java/org/sakaiproject/tool/assessment/services/ItemService.java $ * $Id: ItemService.java 122568 2013-04-11 09:52:12Z 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.services; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; 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.tool.assessment.data.dao.assessment.Answer; import org.sakaiproject.tool.assessment.data.dao.assessment.AnswerFeedback; import org.sakaiproject.tool.assessment.data.dao.assessment.FavoriteColChoices; import org.sakaiproject.tool.assessment.data.dao.assessment.ItemAttachment; import org.sakaiproject.tool.assessment.data.dao.assessment.ItemData; import org.sakaiproject.tool.assessment.data.dao.assessment.ItemFeedback; import org.sakaiproject.tool.assessment.data.dao.assessment.ItemMetaData; import org.sakaiproject.tool.assessment.data.dao.assessment.ItemText; import org.sakaiproject.tool.assessment.data.ifc.assessment.ItemAttachmentIfc; import org.sakaiproject.tool.assessment.data.ifc.assessment.ItemDataIfc; import org.sakaiproject.tool.assessment.facade.ItemFacade; import org.sakaiproject.tool.assessment.services.assessment.AssessmentService; /** * The ItemService calls persistent service locator to reach the * manager on the back end. */ public class ItemService { private static Log log = LogFactory.getLog(ItemService.class); /** * Creates a new ItemService object. */ public ItemService() { } /** * Get a particular item from the backend, with all questions. * @param itemId * @param agentId * @return * @deprecated */ public ItemFacade getItem(Long itemId, String agentId) { ItemFacade item = null; try { item = PersistenceService.getInstance().getItemFacadeQueries(). getItem(itemId, agentId); } catch(Exception e) { log.error(e); throw new RuntimeException(e); } return item; } /** * Delete a item */ public void deleteItem(Long itemId, String agentId) { try { //ItemFacade item= PersistenceService.getInstance(). //getItemFacadeQueries().getItem(itemId, agentId); /* do not check for owner, anyone who has maintain role can modify items see SAK-2214 // you are not allowed to delete item if you are not the owner if (!item.getData().getCreatedBy().equals(agentId)) throw new RuntimeException("you are not allowed to delete item if you are not the owner"); */ PersistenceService.getInstance().getItemFacadeQueries(). deleteItem(itemId, agentId); } catch(Exception e) { log.error(e); throw new RuntimeException(e); } } /** * Delete itemtextset for an item, used for modify */ public void deleteItemContent(Long itemId, String agentId) { try { //ItemFacade item= PersistenceService.getInstance(). //getItemFacadeQueries().getItem(itemId, agentId); /* do not check for owner, anyone who has maintain role can modify items see SAK-2214 // you are not allowed to delete item if you are not the owner if (!item.getData().getCreatedBy().equals(agentId)) throw new RuntimeException("you are not allowed to delete item if you are not the owner"); */ PersistenceService.getInstance().getItemFacadeQueries(). deleteItemContent(itemId, agentId); } catch(Exception e) { log.error(e); throw new RuntimeException(e); } } /** * Delete metadata for an item, used for modify * param: itemid, label, agentId */ public void deleteItemMetaData(Long itemId, String label, String agentId) { try { //ItemFacade item= PersistenceService.getInstance(). //getItemFacadeQueries().getItem(itemId, agentId); /* do not check for owner, anyone who has maintain role can modify items see SAK-2214 // you are not allowed to delete item if you are not the owner if (!item.getData().getCreatedBy().equals(agentId)) throw new Error(new Exception()); */ PersistenceService.getInstance().getItemFacadeQueries(). deleteItemMetaData(itemId, label); } catch(Exception e) { log.error(e); throw new RuntimeException(e); } } /** * Add metadata for an item, used for modify * param: itemid, label, value, agentId */ public void addItemMetaData(Long itemId, String label, String value, String agentId) { try { //ItemFacade item= PersistenceService.getInstance(). //getItemFacadeQueries().getItem(itemId, agentId); /* do not check for owner, anyone who has maintain role can modify items see SAK-2214 // you are not allowed to delete item if you are not the owner if (!item.getData().getCreatedBy().equals(agentId)) throw new Error(new Exception()); */ PersistenceService.getInstance().getItemFacadeQueries(). addItemMetaData(itemId, label, value); } catch(Exception e) { log.error(e); throw new RuntimeException(e); } } /** * Save a question item. */ public ItemFacade saveItem(ItemFacade item) { try { return PersistenceService.getInstance().getItemFacadeQueries().saveItem(item); } catch(Exception e) { log.error(e); return item; } } /** * Get a particular item from the backend, with all questions. * @param itemId * @return */ public ItemFacade getItem(String itemId) { try{ return PersistenceService.getInstance().getItemFacadeQueries(). getItem(new Long(itemId)); } catch(Exception e) { log.error(e); throw new RuntimeException(e); } } public HashMap getItemsByKeyword(String keyword) { keyword="%" + keyword + "%"; HashMap map= null; map= PersistenceService.getInstance().getItemFacadeQueries().getItemsByKeyword(keyword); return map; } public Long getItemTextId(Long publishedItemId) { try{ return PersistenceService.getInstance().getItemFacadeQueries(). getItemTextId(publishedItemId); } catch(Exception e) { log.error(e); return -1l; } } public ItemData cloneItem(ItemDataIfc item){ ItemData cloned= new ItemData( item.getSection(),item.getSequence(), item.getDuration(), item.getInstruction(), item.getDescription(),item.getTypeId(),item.getGrade(),item.getScore(), item.getDiscount(), item.getHint(),item.getHasRationale(),item.getStatus(),item.getCreatedBy(), item.getCreatedDate(),item.getLastModifiedBy(),item.getLastModifiedDate(), null, null, null, item.getTriesAllowed(), item.getPartialCreditFlag()); // perform deep copy, set ItemTextSet, itemMetaDataSet and itemFeedbackSet Set newItemTextSet = copyItemTextSet(cloned, item.getItemTextSet()); Set newItemMetaDataSet = copyItemMetaDataSet(cloned, item.getItemMetaDataSet()); Set newItemFeedbackSet = copyItemFeedbackSet(cloned, item.getItemFeedbackSet()); Set newItemAttachmentSet = copyItemAttachmentSet(cloned, item.getItemAttachmentSet()); cloned.setItemTextSet(newItemTextSet); cloned.setItemMetaDataSet(newItemMetaDataSet); cloned.setItemFeedbackSet(newItemFeedbackSet); cloned.setItemAttachmentSet(newItemAttachmentSet); return cloned; } private Set copyItemTextSet(ItemData cloned, Set itemTextSet) { HashSet h = new HashSet(); Iterator k = itemTextSet.iterator(); while (k.hasNext()) { ItemText itemText = (ItemText) k.next(); ItemText newItemText = new ItemText(cloned, itemText.getSequence(), itemText.getText(), null); Set newAnswerSet = copyAnswerSet(newItemText, itemText.getAnswerSet()); newItemText.setAnswerSet(newAnswerSet); h.add(newItemText); } return h; } private Set copyAnswerSet(ItemText newItemText, Set answerSet) { HashSet h = new HashSet(); Iterator l = answerSet.iterator(); while (l.hasNext()) { Answer answer = (Answer) l.next(); Answer newAnswer = new Answer( newItemText, answer.getText(), answer.getSequence(), answer.getLabel(), answer.getIsCorrect(), answer.getGrade(), answer.getScore(), answer.getPartialCredit(), answer.getDiscount(), null); Set newAnswerFeedbackSet = copyAnswerFeedbackSet( newAnswer, answer.getAnswerFeedbackSet()); newAnswer.setAnswerFeedbackSet(newAnswerFeedbackSet); h.add(newAnswer); } return h; } private Set copyAnswerFeedbackSet(Answer newAnswer, Set answerFeedbackSet) { HashSet h = new HashSet(); Iterator m = answerFeedbackSet.iterator(); while (m.hasNext()) { AnswerFeedback answerFeedback = (AnswerFeedback) m.next(); AnswerFeedback newAnswerFeedback = new AnswerFeedback( newAnswer, answerFeedback.getTypeId(), answerFeedback.getText()); h.add(newAnswerFeedback); } return h; } private Set copyItemMetaDataSet(ItemData cloned, Set itemMetaDataSet) { HashSet h = new HashSet(); Iterator n = itemMetaDataSet.iterator(); while (n.hasNext()) { ItemMetaData itemMetaData = (ItemMetaData) n.next(); ItemMetaData newItemMetaData = new ItemMetaData( cloned, itemMetaData.getLabel(), itemMetaData.getEntry()); h.add(newItemMetaData); } return h; } private Set copyItemFeedbackSet(ItemData cloned, Set itemFeedbackSet) { HashSet h = new HashSet(); Iterator o = itemFeedbackSet.iterator(); while (o.hasNext()) { ItemFeedback itemFeedback = (ItemFeedback) o.next(); ItemFeedback newItemFeedback = new ItemFeedback( cloned, itemFeedback.getTypeId(), itemFeedback.getText()); h.add(newItemFeedback); } return h; } private Set copyItemAttachmentSet(ItemData cloned, Set itemAttachmentSet) { AssessmentService service = new AssessmentService(); HashSet h = new HashSet(); Iterator n = itemAttachmentSet.iterator(); while (n.hasNext()) { ItemAttachmentIfc itemAttachment = (ItemAttachmentIfc) n.next(); ContentResource cr_copy = service.createCopyOfContentResource( itemAttachment.getResourceId(), itemAttachment.getFilename()); ItemAttachmentIfc newItemAttachment = new ItemAttachment( null, cr_copy.getId(), itemAttachment.getFilename(), itemAttachment.getMimeType(), itemAttachment.getFileSize(), itemAttachment.getDescription(), cr_copy.getUrl(), itemAttachment.getIsLink(), itemAttachment.getStatus(), itemAttachment.getCreatedBy(), itemAttachment.getCreatedDate(), itemAttachment.getLastModifiedBy(), itemAttachment.getLastModifiedDate()); newItemAttachment.setItem(cloned); h.add(newItemAttachment); } return h; } public void deleteSet(Set s) { try { PersistenceService.getInstance().getItemFacadeQueries(). deleteSet(s); } catch(Exception e) { log.error(e); throw new RuntimeException(e); } } /** * Save favorite column choices for matrix survey question. */ public void saveFavoriteColumnChoices(FavoriteColChoices choices) { try { PersistenceService.getInstance().getFavoriteColChoicesFacadeQueries().saveOrUpdate(choices); } catch(Exception e) { log.error(e); throw new RuntimeException(e); } } }