package org.sakaiproject.tool.assessment.facade; import java.io.Serializable; import java.util.HashMap; import java.util.HashSet; import java.util.Set; import org.osid.assessment.AssessmentException; import org.osid.assessment.Item; import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedItemData; import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedItemFeedback; import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedItemMetaData; import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedItemText; import org.sakaiproject.tool.assessment.data.ifc.assessment.ItemDataIfc; import org.sakaiproject.tool.assessment.data.ifc.assessment.SectionDataIfc; import org.sakaiproject.tool.assessment.osid.assessment.impl.ItemImpl; public class PublishedItemFacade extends ItemFacade implements Serializable, ItemDataIfc, Comparable { private static final long serialVersionUID = -1711478342512505707L; private PublishedSectionFacade section; /** ItemFacade is the class that is exposed to developer * It contains some of the useful methods specified in * org.osid.assessment.Item and it implements * org.sakaiproject.tool.assessment.ifc. * When new methods is added to osid api, this code is still workable. * If signature in any of the osid methods that we mirrored changes, * we only need to modify those particular methods. * - daisyf */ public PublishedItemFacade(){ // need to hook PublishedItemFacade.data to ItemData, our POJO for Hibernate // persistence this.data = new PublishedItemData(); ItemImpl itemImpl = new ItemImpl(); //<-- place holder item = (Item)itemImpl; try { item.updateData(this.data); } catch (AssessmentException ex) { throw new DataFacadeException(ex.getMessage()); } } /** * This is a very important constructor. Please make sure that you have * set all the properties (declared above as private) of ItemFacade using * the "data" supplied. "data" is a org.osid.assessment.Item properties * and I use it to store info about an item. * @param data */ public PublishedItemFacade(ItemDataIfc data){ this.data = data; ItemImpl itemImpl = new ItemImpl(); // place holder item = (Item)itemImpl; try { item.updateData(this.data); } catch (AssessmentException ex) { throw new DataFacadeException(ex.getMessage()); } this.id = getId(); this.description = getDescription(); this.itemType = getItemType(); this.itemTextSet = getItemTextSet(); this.itemMetaDataSet = getItemMetaDataSet(); this.itemFeedbackSet = getItemFeedbackSet(); this.hasRationale= data.getHasRationale();//rshastri :SAK-1824 this.itemAttachmentSet = getItemAttachmentSet(); } // the following method's signature has a one to one relationship to // org.sakaiproject.tool.assessment.osid.item.ItemImpl // which implements org.osid.assessment.Item /** * Get the Id for this ItemFacade. * @return org.osid.shared.Id */ org.osid.shared.Id getId(){ try { this.data = (ItemDataIfc) item.getData(); } catch (AssessmentException ex) { throw new DataFacadeException(ex.getMessage()); } PublishedItemFacadeQueries publishedItemFacadeQueries = new PublishedItemFacadeQueries(); return publishedItemFacadeQueries.getItemId(this.data.getItemId()); } /** * Set itemId for ItemFacade * @param itemId */ public void setItemIdString(String itemIdString) { this.itemIdString = itemIdString; this.data.setItemIdString(itemIdString); } // expect a return of SectionFacade from this method public SectionDataIfc getSection() throws DataFacadeException { try { this.data = (ItemDataIfc) item.getData(); } catch (AssessmentException ex) { throw new DataFacadeException(ex.getMessage()); } if (this.data.getSection()!= null) { return new PublishedSectionFacade(this.data.getSection()); } else { return null; } } // section is SectionFacade not SectionData public void setSection(SectionDataIfc section) { this.section = (PublishedSectionFacade) section; if (this.section != null) { this.data.setSection(this.section.getData()); } else { this.data.setSection(null); } } /** * Add item text (question text) to ItemFacade (question). For multiple * choice, multiple correct, survey, matching & fill in the blank, you can * specify a set of acceptable answers. Usually, the purpose for this is * to facilitate auto-grading. * @param text * @param answerSet */ public void addItemText(String text, Set answerSet) { if (this.data.getItemTextSet() == null) { this.data.setItemTextSet(new HashSet()); } Long sequence = Long.valueOf(this.data.getItemTextSet().size()+1); PublishedItemText itemText = new PublishedItemText((PublishedItemData)this.data, sequence, text, answerSet); this.data.getItemTextSet().add(itemText); this.itemTextSet = this.data.getItemTextSet(); } /** * Add a Meta Data to ItemFacade * @param label * @param entry */ public void addItemMetaData(String label, String entry) { if (this.itemMetaDataSet == null) { setItemMetaDataSet(new HashSet()); } this.data.getItemMetaDataSet().add(new PublishedItemMetaData((PublishedItemData)this.data, label, entry)); this.itemMetaDataSet = this.data.getItemMetaDataSet(); } /** * Add feedback of a specified feedback type (e.g. CORRECT, INCORRECT) * to ItemFacade * @param feedbackTypeId * @param text */ public void addItemFeedback(String feedbackTypeId, String text) { if (this.itemFeedbackSet == null) { setItemFeedbackSet(new HashSet()); } this.data.getItemFeedbackSet().add(new PublishedItemFeedback((PublishedItemData)this.data, feedbackTypeId, text)); this.itemFeedbackSet = this.data.getItemFeedbackSet(); } }