/********************************************************************************** * $URL: https://source.sakaiproject.org/svn/sam/trunk/samigo-services/src/java/org/sakaiproject/tool/assessment/facade/ItemFacadeQueries.java $ * $Id: ItemFacadeQueries.java 122568 2013-04-11 09:52:12Z david.horwitz@uct.ac.za $ *********************************************************************************** * * Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009 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.facade; import java.sql.SQLException; import java.util.Date; import java.util.HashMap; import java.util.HashSet; 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.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.Session; 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.ItemData; import org.sakaiproject.tool.assessment.data.dao.assessment.ItemMetaData; import org.sakaiproject.tool.assessment.data.dao.assessment.ItemText; import org.sakaiproject.tool.assessment.data.dao.shared.TypeD; import org.sakaiproject.tool.assessment.data.ifc.assessment.AssessmentIfc; import org.sakaiproject.tool.assessment.data.ifc.assessment.ItemDataIfc; import org.sakaiproject.tool.assessment.data.ifc.assessment.ItemMetaDataIfc; import org.sakaiproject.tool.assessment.data.ifc.assessment.SectionDataIfc; import org.sakaiproject.tool.assessment.osid.shared.impl.IdImpl; import org.sakaiproject.tool.assessment.services.PersistenceService; import org.sakaiproject.tool.assessment.services.assessment.AssessmentService; import org.springframework.dao.DataAccessException; import org.springframework.orm.hibernate3.HibernateCallback; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; public class ItemFacadeQueries extends HibernateDaoSupport implements ItemFacadeQueriesAPI { private static Log log = LogFactory.getLog(ItemFacadeQueries.class); public ItemFacadeQueries() { } public IdImpl getItemId(String id){ return new IdImpl(id); } public IdImpl getItemId(Long id){ return new IdImpl(id); } public IdImpl getItemId(long id){ return new IdImpl(id); } public Long add() { ItemData item = new ItemData(); item.setInstruction("Matching game"); item.setTypeId(TypeFacade.MATCHING); item.setScore( Double.valueOf(10)); item.setDiscount(Double.valueOf(0)); item.setHasRationale(Boolean.FALSE); item.setStatus( Integer.valueOf(1)); item.setCreatedBy("1"); item.setCreatedDate(new Date()); item.setLastModifiedBy("1"); item.setLastModifiedDate(new Date()); // prepare itemText item.setItemTextSet(prepareText(item)); // prepare MetaData item.setItemMetaDataSet(prepareMetaData(item)); item.addItemMetaData("ITEM_OBJECTIVE", "the objective is to ..."); // prepare feedback item.setCorrectItemFeedback("well done!"); item.setInCorrectItemFeedback("better luck next time!"); int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount().intValue(); while (retryCount > 0){ try { getHibernateTemplate().save(item); retryCount = 0; } catch (Exception e) { log.warn("problem saving item: "+e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper().retryDeadlock(e, retryCount); } } return item.getItemId(); } public List getQPItems(final Long questionPoolId) { final HibernateCallback hcb = new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery("select ab from ItemData ab, QuestionPoolItem qpi where qpi.itemId=ab.itemIdString and qpi.questionPoolId = ?"); q.setLong(0, questionPoolId.longValue()); return q.list(); }; }; return getHibernateTemplate().executeFind(hcb); // return getHibernateTemplate().find("select ab from ItemData ab, QuestionPoolItem qpi where qpi.itemId=ab.itemIdString and qpi.questionPoolId = ?", // new Object[] { questionPoolId }, new org.hibernate.type.Type[] { Hibernate.LONG }); } public List list() { return getHibernateTemplate().find("from ItemData"); } public void show(Long itemId) { getHibernateTemplate().load(ItemData.class, itemId); } public ItemFacade getItem(Long itemId, String agent) { return getItem(itemId); } public void showType(Long typeId) { getHibernateTemplate().load(TypeD.class, typeId); } public void listType() { TypeFacadeQueriesAPI typeFacadeQueries = PersistenceService.getInstance().getTypeFacadeQueries(); TypeFacade f = typeFacadeQueries.getTypeFacadeById( Long.valueOf(1)); log.debug("***facade: "+f.getAuthority()); } public void remove(Long itemId) { ItemData item = (ItemData)getHibernateTemplate().load(ItemData.class, itemId); // get list of attachment in section AssessmentService service = new AssessmentService(); List itemAttachmentList = service.getItemResourceIdList(item); service.deleteResources(itemAttachmentList); int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount().intValue(); while (retryCount > 0){ try { getHibernateTemplate().delete(item); retryCount = 0; } catch (Exception e) { log.warn("problem deleting item : "+e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper().retryDeadlock(e, retryCount); } } if (item != null) { printItem(item); } } public void deleteItem(Long itemId, String agent) { ItemData item = (ItemData)getHibernateTemplate().load(ItemData.class, itemId); // get list of attachment in item AssessmentService service = new AssessmentService(); List itemAttachmentList = service.getItemResourceIdList(item); service.deleteResources(itemAttachmentList); int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount().intValue(); while (retryCount > 0){ try { SectionDataIfc section = item.getSection(); // section might be null if you are deleting an item created inside a pool, that's not linked to any assessment. if (section !=null) { Set set = section.getItemSet(); set.remove(item); } getHibernateTemplate().delete(item); retryCount = 0; } catch (Exception e) { log.warn("problem deleting item: "+e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper().retryDeadlock(e, retryCount); } } } // is this used by ItemAddListener to save item? -daisyf public void deleteItemContent(Long itemId, String agent) { ItemData item = (ItemData)getHibernateTemplate().load(ItemData.class, itemId); int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount().intValue(); while (retryCount > 0){ try { if (item!=null){ // need to dissociate with item before deleting in Hibernate 3 Set set = item.getItemTextSet(); item.setItemTextSet(new HashSet()); getHibernateTemplate().deleteAll(set); retryCount = 0; } else retryCount=0; } catch (Exception e) { log.warn("problem deleteItemTextSet: "+e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper().retryDeadlock(e, retryCount); } } retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount().intValue(); while (retryCount > 0){ try { if (item!=null){ // need to dissociate with item before deleting in Hibernate 3 Set set = item.getItemMetaDataSet(); item.setItemMetaDataSet(new HashSet()); getHibernateTemplate().deleteAll(set); retryCount = 0; } else retryCount=0; } catch (Exception e) { log.warn("problem deleteItemMetaDataSet: "+e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper().retryDeadlock(e, retryCount); } } retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount().intValue(); while (retryCount > 0){ try { if (item!=null){ // need to dissociate with item before deleting in Hibernate 3 Set set = item.getItemFeedbackSet(); item.setItemFeedbackSet(new HashSet()); getHibernateTemplate().deleteAll(set); retryCount = 0; } else retryCount=0; } catch (Exception e) { log.warn("problem deleting ItemFeedbackSet: "+e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper().retryDeadlock(e, retryCount); } } } public void deleteItemMetaData(final Long itemId, final String label) { // delete metadata by label ItemData item = (ItemData)getHibernateTemplate().load(ItemData.class, itemId); final String query = "from ItemMetaData imd where imd.item.itemId=? and imd.label= ?"; final HibernateCallback hcb = new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery(query); q.setLong(0, itemId.longValue()); q.setString(1, label); return q.list(); }; }; List itemmetadatalist = getHibernateTemplate().executeFind(hcb); int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount().intValue(); while (retryCount > 0){ try { if (item!=null){ // need to dissociate with item before deleting in Hibernate 3 Iterator iter = itemmetadatalist.iterator(); while (iter.hasNext()){ ItemMetaDataIfc meta= (ItemMetaDataIfc) iter.next(); meta.setItem(null); } Set set = item.getItemMetaDataSet(); set.removeAll(itemmetadatalist); item.setItemMetaDataSet(set); getHibernateTemplate().deleteAll(itemmetadatalist); retryCount = 0; } else retryCount=0; } catch (Exception e) { log.warn("problem delete itemmetadatalist: "+e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper().retryDeadlock(e, retryCount); } } } public void addItemMetaData(Long itemId, String label, String value) { ItemData item = (ItemData)getHibernateTemplate().load(ItemData.class, itemId); if (item != null) { printItem(item); ItemMetaData itemmetadata = new ItemMetaData(item, label, value); int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount().intValue(); while (retryCount > 0){ try { getHibernateTemplate().save(itemmetadata); retryCount = 0; } catch (Exception e) { log.warn("problem saving itemmetadata: "+e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper().retryDeadlock(e, retryCount); } } //item.addItemMetaData(label, value); //getHibernateTemplate().saveOrUpdate(item); } } private HashSet prepareText(ItemData item) { HashSet textSet = new HashSet(); ItemText text1 = new ItemText(); text1.setItem(item); text1.setSequence( Long.valueOf(1)); text1.setText("cat has"); HashSet answerSet1 = new HashSet(); HashSet answerFeedbackSet1 = new HashSet(); Answer answer1 = new Answer(text1, "2 legs", Long.valueOf(1), "i", Boolean.FALSE, null, Double.valueOf(0), Double.valueOf(0), Double.valueOf(0)); answerFeedbackSet1.add(new AnswerFeedback(answer1, "incorrect", "sorry")); answer1.setAnswerFeedbackSet(answerFeedbackSet1); answerSet1.add(answer1); answerSet1.add(new Answer(text1, "3 legs", Long.valueOf(2), "ii", Boolean.FALSE, null, Double.valueOf(0), Double.valueOf(0), Double.valueOf(0))); answerSet1.add(new Answer(text1, "4 legs", Long.valueOf(3), "iii", Boolean.TRUE, null, Double.valueOf(5), Double.valueOf(0), Double.valueOf(0))); text1.setAnswerSet(answerSet1); textSet.add(text1); ItemText text2 = new ItemText(); text2.setItem(item); text2.setSequence( Long.valueOf(2)); text2.setText("chicken has"); HashSet answerSet2 = new HashSet(); answerSet2.add(new Answer(text2, "2 legs", Long.valueOf(1), "i", Boolean.TRUE, null, Double.valueOf(5), Double.valueOf(0), Double.valueOf(0))); answerSet2.add(new Answer(text2, "3 legs", Long.valueOf(2), "ii", Boolean.FALSE, null, Double.valueOf(0), Double.valueOf(0), Double.valueOf(0))); answerSet2.add(new Answer(text2, "4 legs", Long.valueOf(3), "iii", Boolean.FALSE, null, Double.valueOf(0), Double.valueOf(0), Double.valueOf(0))); text2.setAnswerSet(answerSet2); textSet.add(text2); ItemText text3 = new ItemText(); text3.setItem(item); text3.setSequence(Long.valueOf(3)); text3.setText("baby has"); HashSet answerSet3 = new HashSet(); answerSet3.add(new Answer(text3, "2 legs", Long.valueOf(1), "i", Boolean.FALSE, null, Double.valueOf(0), Double.valueOf(0), Double.valueOf(0))); answerSet3.add(new Answer(text3, "3 legs", Long.valueOf(2), "ii", Boolean.FALSE, null, Double.valueOf(0), Double.valueOf(0), Double.valueOf(0))); answerSet3.add(new Answer(text3, "4 legs", Long.valueOf(3), "iii", Boolean.TRUE, null, Double.valueOf(5), Double.valueOf(0), Double.valueOf(0))); text3.setAnswerSet(answerSet3); textSet.add(text3); return textSet; } private HashSet prepareMetaData(ItemData item) { HashSet set = new HashSet(); set.add(new ItemMetaData(item, "qmd_itemtype", "Matching")); set.add(new ItemMetaData(item, "TEXT_FORMAT", "HTML")); set.add(new ItemMetaData(item, "MUTUALLY_EXCLUSIVE", "True")); return set; } private void printItem(ItemData item) { log.debug("**Id = " + item.getItemId()); log.debug("**score = " + item.getScore()); log.debug("**grade = " + item.getGrade()); log.debug("**CorrectFeedback is lazy = " + item.getCorrectItemFeedback()); log.debug("**Objective not lazy = " + item.getItemMetaDataByLabel("ITEM_OBJECTIVE")); } public Long facadeAdd() throws DataFacadeException { ItemFacade item = new ItemFacade(); item.setInstruction("Matching game"); item.setTypeId(Long.valueOf(9)); item.setScore( Double.valueOf(10)); item.setDiscount(Double.valueOf(0)); item.setHasRationale(Boolean.FALSE); item.setStatus( Integer.valueOf(1)); item.setCreatedBy("1"); item.setCreatedDate(new Date()); item.setLastModifiedBy("1"); item.setLastModifiedDate(new Date()); // prepare itemText item.setItemTextSet(prepareText((ItemData)item.getData())); item.addItemText("I have",new HashSet()); // prepare MetaData item.setItemMetaDataSet(prepareMetaData((ItemData)item.getData())); item.addItemMetaData("ITEM_OBJECTIVE", "the objective is to ..."); // prepare feedback item.setCorrectItemFeedback("well done!"); item.setInCorrectItemFeedback("better luck next time!"); getHibernateTemplate().save(item.getData()); return item.getData().getItemId(); } public void ifcShow(Long itemId) { ItemDataIfc itemData = (ItemDataIfc) getHibernateTemplate().load(ItemData.class, itemId); if (itemData != null) { printIfcItem(itemData); printFacadeItem(itemData); //exportXml(itemData); } } public ItemFacade saveItem(ItemFacade item) throws DataFacadeException { try{ ItemDataIfc itemdata = (ItemDataIfc) item.getData(); itemdata.setLastModifiedDate(new Date()); itemdata.setLastModifiedBy(AgentFacade.getAgentString()); int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount().intValue(); while (retryCount > 0){ try { getHibernateTemplate().saveOrUpdate(itemdata); item.setItemId(itemdata.getItemId()); retryCount = 0; } catch (Exception e) { log.warn("problem save or update itemdata: "+e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper().retryDeadlock(e, retryCount); } } if ((item.getData()!= null) && (item.getData().getSection()!= null)) { AssessmentIfc assessment = item.getData().getSection().getAssessment(); assessment.setLastModifiedBy(AgentFacade.getAgentString()); assessment.setLastModifiedDate(new Date()); retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount().intValue(); while (retryCount > 0){ try { getHibernateTemplate().update(assessment); retryCount = 0; } catch (Exception e) { log.warn("problem updating asssessment: "+e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper().retryDeadlock(e, retryCount); } } } return item; } catch(Exception e){ e.printStackTrace(); return null; } } private void printIfcItem(ItemDataIfc item) { log.debug("**Id = " + item.getItemId()); log.debug("**score = " + item.getScore()); log.debug("**grade = " + item.getGrade()); log.debug("**CorrectFeedback is lazy = " + item.getCorrectItemFeedback()); log.debug("**Objective not lazy = " + item.getItemMetaDataByLabel("ITEM_OBJECTIVE")); log.debug("**createdDate = " + item.getCreatedDate()); } private void printFacadeItem(ItemDataIfc item) { ItemFacade f = new ItemFacade(item); log.debug("****Id = " + f.getItemId()); log.debug("****score = " + f.getScore()); log.debug("****grade = " + f.getGrade()); log.debug("****CorrectFeedback is lazy = " + f.getCorrectItemFeedback()); log.debug("****Objective not lazy = " + f.getItemMetaDataByLabel("ITEM_OBJECTIVE")); log.debug("****createdDate = " + f.getCreatedDate()); log.debug("****ItemType = " + f.getItemType().getKeyword()); } public ItemFacade getItem(Long itemId) { ItemData item = null; try { item = (ItemData) getHibernateTemplate().load(ItemData.class, itemId); } catch (DataAccessException e) { log.warn("unable to retrieve item " + itemId + " due to:" + e); return null; } return new ItemFacade(item); } public HashMap getItemsByKeyword(final String keyword) { final HibernateCallback hcb = new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery("select ab from ItemData ab, ItemText itext where itext.item=ab and itext.text like ? "); q.setString(0, keyword); return q.list(); }; }; List list1 = getHibernateTemplate().executeFind(hcb); // List list1 = getHibernateTemplate().find("select ab from ItemData ab, ItemText itext where itext.item=ab and itext.text like ? ",new Object[] { keyword}, new org.hibernate.type.Type[] { Hibernate.STRING }); final HibernateCallback hcb2 = new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery("select distinct ab from ItemData ab, Answer answer where answer.item=ab and answer.text like ? "); q.setString(0, keyword); return q.list(); }; }; List list2 = getHibernateTemplate().executeFind(hcb2); // List list2 = getHibernateTemplate().find("select distinct ab from ItemData ab, Answer answer where answer.item=ab and answer.text like ? ",new Object[] { keyword}, new org.hibernate.type.Type[] { Hibernate.STRING }); final HibernateCallback hcb3 = new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery("select ab from ItemData ab, ItemMetaData md where md.item=ab and md.entry like ? and md.label= ? "); q.setString(0, keyword); q.setString(1, "KEYWORD"); return q.list(); }; }; List list3 = getHibernateTemplate().executeFind(hcb3); // List list3 = getHibernateTemplate().find("select ab from ItemData ab, ItemMetaData metadata where metadata.item=ab and metadata.entry like ? and metadata.label= 'KEYWORD' ", new Object[] { keyword}, new org.hibernate.type.Type[] { Hibernate.STRING }); final HibernateCallback hcb4 = new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery("select ab from ItemData ab where ab.instruction like ? "); q.setString(0, keyword); return q.list(); }; }; List list4 = getHibernateTemplate().executeFind(hcb4); // List list4 = getHibernateTemplate().find("select ab from ItemData ab where ab.instruction like ? ", new Object[] { keyword}, new org.hibernate.type.Type[] { Hibernate.STRING }); HashMap itemfacadeMap = new HashMap(); for (int i = 0; i < list1.size(); i++) { ItemData a = (ItemData) list1.get(i); ItemFacade f = new ItemFacade(a); itemfacadeMap.put(f.getItemIdString(),f); } for (int i = 0; i < list2.size(); i++) { ItemData a = (ItemData) list2.get(i); ItemFacade f = new ItemFacade(a); itemfacadeMap.put(f.getItemIdString(),f); } for (int i = 0; i < list3.size(); i++) { ItemData a = (ItemData) list3.get(i); ItemFacade f = new ItemFacade(a); itemfacadeMap.put(f.getItemIdString(),f); } for (int i = 0; i < list4.size(); i++) { ItemData a = (ItemData) list4.get(i); ItemFacade f = new ItemFacade(a); itemfacadeMap.put(f.getItemIdString(),f); } log.debug("Search for keyword, found: " + itemfacadeMap.size()); return itemfacadeMap; } /* * This API is for linear access to create a dummy record to indicate the student * has taken action on the item (question). Therefore, we just need one itemTextId * for recording - use the first one (index 0). */ public Long getItemTextId(final Long publishedItemId) { final HibernateCallback hcb = new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery("select i.id from PublishedItemText i where i.item.itemId = ?"); q.setLong(0, publishedItemId.longValue()); return q.list(); }; }; List list = getHibernateTemplate().executeFind(hcb); log.debug("list.size() = " + list.size()); Long itemTextId = (Long) list.get(0); log.debug("itemTextId" + itemTextId); return itemTextId; } public void deleteSet(Set s) { int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount() .intValue(); while (retryCount > 0) { try { if (s != null) { // need to dissociate with item before deleting in Hibernate 3 getHibernateTemplate().deleteAll(s); retryCount = 0; } else { retryCount = 0; } } catch (Exception e) { log.warn("problem deleteSet: " + e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper().retryDeadlock(e, retryCount); } } } }