/********************************************************************************** * $URL: https://source.sakaiproject.org/svn/sam/trunk/samigo-services/src/java/org/sakaiproject/tool/assessment/facade/QuestionPoolFacadeQueries.java $ * $Id: QuestionPoolFacadeQueries.java 106463 2012-04-02 12:20:09Z 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.math.BigDecimal; import java.math.BigInteger; import java.sql.SQLException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; 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 java.util.Vector; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.SQLQuery; 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.questionpool.QuestionPoolAccessData; import org.sakaiproject.tool.assessment.data.dao.questionpool.QuestionPoolData; import org.sakaiproject.tool.assessment.data.dao.questionpool.QuestionPoolItemData; import org.sakaiproject.tool.assessment.data.ifc.assessment.ItemDataIfc; import org.sakaiproject.tool.assessment.data.ifc.assessment.ItemMetaDataIfc; import org.sakaiproject.tool.assessment.data.model.Tree; import org.sakaiproject.tool.assessment.osid.shared.impl.IdImpl; import org.sakaiproject.tool.assessment.services.ItemService; 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 QuestionPoolFacadeQueries extends HibernateDaoSupport implements QuestionPoolFacadeQueriesAPI { private static Log log = LogFactory.getLog(QuestionPoolFacadeQueries.class); public QuestionPoolFacadeQueries() { } public IdImpl getQuestionPoolId(String id) { return new IdImpl(id); } public IdImpl getQuestionPoolId(Long id) { return new IdImpl(id); } public IdImpl getQuestionPoolId(long id) { return new IdImpl(id); } /** * Get a list of all the pools in the site. Note that questions in each pool will not * be populated. We must keep this list updated. */ public List getAllPools() { return getHibernateTemplate().find("from QuestionPoolData"); } public List getAllPoolsByAgent(final String agentId) { final HibernateCallback hcb = new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery("from QuestionPoolData a where a.questionPoolId in (select ac.questionPoolId from QuestionPoolAccessData ac where agentId= ?) "); q.setString(0, agentId); return q.list(); }; }; List list = getHibernateTemplate().executeFind(hcb); // List list = getHibernateTemplate().find( // "from QuestionPoolData a where a.ownerId= ? ", // new Object[] {agentId} // , new org.hibernate.type.Type[] {Hibernate.STRING}); return list; } /** * Get all the pools that the agent has access to. The easiest way seems to be * #1. get all the existing pool * #2. get all the QuestionPoolAccessData record of the agent * #3. go through the existing pools and check it against the QuestionPoolAccessData (qpa) record to see if * the agent is granted access to it. qpa record (if exists) always trumps the default access right set * up for a pool * e.g. if the defaultAccessType for a pool is ACCESS_DENIED but the qpa record say ADMIN, then access=ADMIN * e.g. if the defaultAccessType for a pool is ADMIN but the qpa record say ACCESS_DENIED, then access=ACCESS_DENIED * e.g. if no qpa record exists, then access rule will follow the defaultAccessType set by the pool */ public QuestionPoolIteratorFacade getAllPools(String agentId) { ArrayList qpList = new ArrayList(); // #1. // lydial: 9/22/05 we are not really using QuestionPoolAccessData, so filter by ownerid //List poolList = getAllPools(); List poolList = getHibernateTemplate().find( "from QuestionPoolData a where a.ownerId= ? ", new Object[] {agentId}); /* // #2. get all the QuestionPoolAccessData record belonging to the agent List questionPoolAccessList = getHibernateTemplate().find( "from QuestionPoolAccessData as qpa where qpa.agentId=?", new Object[] {agentId} , new org.hibernate.type.Type[] {Hibernate.STRING}); HashMap h = new HashMap(); // prepare a hashMap with (poolId, qpa) Iterator i = questionPoolAccessList.iterator(); while (i.hasNext()) { QuestionPoolAccessData qpa = (QuestionPoolAccessData) i.next(); h.put(qpa.getQuestionPoolId(), qpa); } // #3. We need to go through the existing QuestionPool and the QuestionPoolAccessData record // to determine the access type */ try { // counts is a hashmap going from poolid to number of subpools. It is significantly // faster to build this with a single SQL query and then look up data in it. HashMap counts = new HashMap(); // hibernate returns a list of arrays, the arrays being the values // returned by the query, in this case poolid and count. Both are // returned as BigInteger. We need Long and Integer. Iterator i1 = getSubPoolSizes(agentId).iterator(); while (i1.hasNext()) { Object[]result = (Object [])i1.next(); //counts.put( Long.valueOf(((Integer)result[0]).longValue()), Integer.valueOf(((Integer)result[1]).intValue())); counts.put((Long) result[0], (Integer)result[1]); } Iterator j = poolList.iterator(); while (j.hasNext()) { QuestionPoolData qpp = (QuestionPoolData) j.next(); // I really wish we don't need to populate the questionpool size & subpool size for JSF // watch this for performance. hope Hibernate is smart enough not to load the entire question // - daisy, 10/04/04 // populateQuestionPoolItemDatas(qpp); // lookup number of subpools for this pool in our handy hash table Integer subPoolSize = (Integer)counts.get( Long.valueOf(qpp.getQuestionPoolId())); if (subPoolSize == null) qpp.setSubPoolSize( Integer.valueOf(0)); else qpp.setSubPoolSize(subPoolSize); qpList.add(getQuestionPool(qpp)); } } catch (Exception e) { log.warn(e.getMessage()); } return new QuestionPoolIteratorFacade(qpList); } public QuestionPoolIteratorFacade getAllPoolsWithAccess(String agentId) { ArrayList qpList = new ArrayList(); List poolList = getAllPoolsByAgent(agentId); try { Iterator j = poolList.iterator(); while (j.hasNext()) { QuestionPoolData qpp = (QuestionPoolData) j.next(); // I really wish we don't need to populate the questionpool size & subpool size for JSF // watch this for performance. hope Hibernate is smart enough not to load the entire question // - daisy, 10/04/04 // The comment below is to not recover all questions of items //populateQuestionPoolItemDatas(qpp); // I do this call, after it did in populateQuestionPoolItemData, to recover the number of subpools that will be show in the root of pools. qpp.setSubPoolSize( Integer.valueOf(getSubPoolSize(qpp.getQuestionPoolId()))); qpList.add(getQuestionPool(qpp)); } } catch (Exception e) { log.warn(e.getMessage()); log.warn(e.getStackTrace()); } return new QuestionPoolIteratorFacade(qpList); } public ArrayList getBasicInfoOfAllPools(final String agentId) { final HibernateCallback hcb = new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery("select new QuestionPoolData(a.questionPoolId, a.title)from QuestionPoolData a where a.questionPoolId " + "in (select ac.questionPoolId from QuestionPoolAccessData ac where agentId= ?)"); q.setString(0, agentId); return q.list(); }; }; List list = getHibernateTemplate().executeFind(hcb); // List list = getHibernateTemplate().find( // "select new QuestionPoolData(a.questionPoolId, a.title)from QuestionPoolData a where a.ownerId= ? ", // new Object[] {agentId} // , new org.hibernate.type.Type[] {Hibernate.STRING}); ArrayList poolList = new ArrayList(); for (int i = 0; i < list.size(); i++) { QuestionPoolData a = (QuestionPoolData) list.get(i); QuestionPoolFacade f = new QuestionPoolFacade(a.getQuestionPoolId(), a.getTitle()); poolList.add(f); } return poolList; } private QuestionPoolFacade getQuestionPool(QuestionPoolData qpp) { try { return new QuestionPoolFacade(qpp); } catch (Exception e) { log.warn(e.getMessage()); return null; } } private List getAllItemsInThisPoolOnlyAndDetachFromAssessment(final Long questionPoolId) { // return items that belong to this pool and this pool only. These items can not be part of any assessment either. List list = getAllItemsInThisPoolOnly(questionPoolId); ArrayList newlist = new ArrayList(); for (int i = 0; i < list.size(); i++) { ItemData itemdata = (ItemData) list.get(i); if (itemdata.getSection()==null ) { // these items do not belong to any assessments, so add them to the list newlist.add(itemdata); } else { // do not add these items to the list, but we need to remove the POOLID metadata // this item still links to an assessment // remove this item's POOLID itemmetadata itemdata.removeMetaDataByType(ItemMetaDataIfc.POOLID); getHibernateTemplate().saveOrUpdate(itemdata); //save itemdata after removing metadata } } return newlist; } private List getAllItemsInThisPoolOnly(final Long questionPoolId) { // return items that belong to this pool and this pool only. final HibernateCallback hcb = new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery("select ab from ItemData ab, QuestionPoolItemData qpi where ab.itemId=qpi.itemId and qpi.questionPoolId = ?"); q.setLong(0, questionPoolId.longValue()); return q.list(); }; }; List list = getHibernateTemplate().executeFind(hcb); ArrayList newlist = new ArrayList(); for (int i = 0; i < list.size(); i++) { ItemData itemdata = (ItemData) list.get(i); String itemId = itemdata.getItemId().toString(); if (getPoolIdsByItem(itemId).size() == 1) { newlist.add(itemdata); } else { // this item still links to other pool(s) } } return newlist; } public List getAllItems(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, QuestionPoolItemData qpi where ab.itemId=qpi.itemId and qpi.questionPoolId = ?"); q.setLong(0, questionPoolId.longValue()); return q.list(); }; }; List list = getHibernateTemplate().executeFind(hcb); // List list = getHibernateTemplate().find("select ab from ItemData ab, QuestionPoolItemData qpi where ab.itemId=qpi.itemId and qpi.questionPoolId = ?", // new Object[] {questionPoolId} // , // new org.hibernate.type.Type[] {Hibernate. // LONG}); return list; } public List getAllItemFacadesOrderByItemText(final Long questionPoolId, final String orderBy, final String ascending) { // Fixed for bug 3559 log.debug("QuestionPoolFacadeQueries: getAllItemFacadesOrderByItemText:: orderBy=" + orderBy); List list = getAllItems(questionPoolId); log.debug("QuestionPoolFacadeQueries: getAllItemFacadesOrderByItemText:: size = " + list.size()); HashMap hp = new HashMap(); Vector origValueV; ItemData itemData; ItemFacade itemFacade; Vector facadeVector = new Vector(); String text; for (int i = 0; i < list.size(); i++) { log.debug("QuestionPoolFacadeQueries: getAllItemFacadesOrderByItemText:: i = " + i); itemData = (ItemData) list.get(i); itemFacade = new ItemFacade(itemData); facadeVector.add(itemFacade); log.debug("QuestionPoolFacadeQueries: getAllItemFacadesOrderByItemText:: getItemId = " + itemData.getItemId()); log.debug("QuestionPoolFacadeQueries: getAllItemFacadesOrderByItemText:: getText = " + itemData.getText()); text = itemFacade.getTextHtmlStrippedAll(); log.debug("QuestionPoolFacadeQueries: getAllItemFacadesOrderByItemText:: getTextHtmlStrippedAll = '" + text + "'"); origValueV = (Vector) hp.get(text); if (origValueV == null) { log.debug("QuestionPoolFacadeQueries: getAllItemFacadesOrderByItemText:: origValueV is null "); origValueV = new Vector(); } origValueV.add( Integer.valueOf(i)); hp.put(text, origValueV); } Vector v = new Vector(hp.keySet()); Collections.sort(v, String.CASE_INSENSITIVE_ORDER); ArrayList itemList = new ArrayList(); Iterator it = v.iterator(); Vector orderdValueV; Integer value; String key; if( (ascending!=null)&&("false").equals(ascending)) {//sort descending for(int l=v.size()-1;l>=0;l--){ key = (String)v.get(l); orderdValueV = (Vector) hp.get(key); Iterator iter = orderdValueV.iterator(); while (iter.hasNext()) { value = (Integer)iter.next(); ItemData itemdata = (ItemData) list.get(value.intValue()); ItemFacade f = new ItemFacade(itemdata); itemList.add(f); } } } else{//sort ascending while (it.hasNext()) { key = (String)it.next(); orderdValueV = (Vector) hp.get(key); Iterator iter = orderdValueV.iterator(); while (iter.hasNext()) { value = (Integer)iter.next(); log.debug("QuestionPoolFacadeQueries: getAllItemFacadesOrderByItemText:: sorted (value) = " + value); itemFacade = (ItemFacade) facadeVector.get(value.intValue()); itemList.add(itemFacade); } } } return itemList; } public List getAllItemFacadesOrderByItemType(final Long questionPoolId, final String orderBy, final String ascending) { log.debug("QuestionPoolFacadeQueries: getAllItemFacadesOrderByItemType:: orderBy=" + orderBy); final HibernateCallback hcb = new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q; if("false".equals(ascending)){ q = session.createQuery("select ab from ItemData ab, QuestionPoolItemData qpi, TypeD t where ab.itemId=qpi.itemId and ab.typeId=t.typeId and qpi.questionPoolId = ? order by t." + orderBy + " desc"); } else{ q = session.createQuery("select ab from ItemData ab, QuestionPoolItemData qpi, TypeD t where ab.itemId=qpi.itemId and ab.typeId=t.typeId and qpi.questionPoolId = ? order by t." + orderBy); } q.setLong(0, questionPoolId.longValue()); log.debug("QuestionPoolFacadeQueries: getAllItemFacadesOrderByItemType:: getQueryString() = " + q.getQueryString()); return q.list(); }; }; List list = getHibernateTemplate().executeFind(hcb); // List list = getHibernateTemplate().find("select ab from ItemData ab, QuestionPoolItemData qpi, TypeD t where ab.itemId=qpi.itemId and ab.typeId=t.typeId and qpi.questionPoolId = ? order by t." + // orderBy, // new Object[] {questionPoolId} // , // new org.hibernate.type.Type[] {Hibernate. // LONG}); log.debug("QuestionPoolFacadeQueries: getAllItemFacadesOrderByItemType:: size = " + list.size()); ArrayList itemList = new ArrayList(); for (int i = 0; i < list.size(); i++) { ItemData itemdata = (ItemData) list.get(i); ItemFacade f = new ItemFacade(itemdata); itemList.add(f); } return itemList; } public List getAllItemFacades(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, QuestionPoolItemData qpi where ab.itemId=qpi.itemId and qpi.questionPoolId = ?"); q.setLong(0, questionPoolId.longValue()); return q.list(); }; }; List list = getHibernateTemplate().executeFind(hcb); // List list = getHibernateTemplate().find("select ab from ItemData ab, QuestionPoolItemData qpi where ab.itemId=qpi.itemId and qpi.questionPoolId = ?", // new Object[] {questionPoolId} // , // new org.hibernate.type.Type[] {Hibernate. // LONG}); ArrayList itemList = new ArrayList(); for (int i = 0; i < list.size(); i++) { ItemData itemdata = (ItemData) list.get(i); ItemFacade f = new ItemFacade(itemdata); itemList.add(f); } return itemList; } private void populateQuestionPoolItemDatas(QuestionPoolData qpp) { try { Set questionPoolItems = qpp.getQuestionPoolItems(); if (questionPoolItems != null) { // let's get all the items for the specified pool in one shot HashMap h = new HashMap(); List itemList = getAllItems(qpp.getQuestionPoolId()); Iterator j = itemList.iterator(); while (j.hasNext()) { ItemData itemData = (ItemData) j.next(); h.put(itemData.getItemIdString(), itemData); } ArrayList itemArrayList = new ArrayList(); Iterator i = questionPoolItems.iterator(); while (i.hasNext()) { QuestionPoolItemData questionPoolItem = (QuestionPoolItemData) i.next(); ItemData itemData_0 = (ItemData) h.get(questionPoolItem.getItemId()); /* Set itemTextSet = itemData_0.getItemTextSet(); Iterator k = itemTextSet.iterator(); while (k.hasNext()) { ItemText itemText = (ItemText) k.next(); } */ itemArrayList.add(itemData_0); } qpp.setQuestions(itemArrayList); qpp.setSubPoolSize( Integer.valueOf(getSubPoolSize(qpp.getQuestionPoolId()))); } } catch (Exception e) { e.printStackTrace(); } } /** * This method returns an ItemFacade that we can use to construct our ItemImpl */ public ItemFacade getItem(String id) { ItemData item = (ItemData) getHibernateTemplate().load(ItemData.class, id); return new ItemFacade(item); } /** * Get a pool based on poolId. I am not sure why agent is not used though is being parsed. * * @param poolid DOCUMENTATION PENDING * @param agent DOCUMENTATION PENDING * * @return DOCUMENTATION PENDING */ public QuestionPoolFacade getPool(Long poolId, String agent) { try { QuestionPoolData qpp = (QuestionPoolData) getHibernateTemplate().load( QuestionPoolData.class, poolId); // setAccessType setPoolAccessType(qpp, agent); // QuestionPoolItemData's identifier is a compsite identifier made up of // poolId and itemId <-- is regarded as "legacy DB" in Hibernate language. // We need to construct the properties for such as object ourselves. populateQuestionPoolItemDatas(qpp); return getQuestionPool(qpp); } catch (Exception e) { log.error(e); return null; } } public void setPoolAccessType(QuestionPoolData qpp, String agentId) { try { QuestionPoolAccessData qpa = getQuestionPoolAccessData(qpp. getQuestionPoolId(), agentId); if (qpa == null) { // if (qpa == null), take what is set for pool. } else { qpp.setAccessTypeId(qpa.getAccessTypeId()); } } catch (Exception e) { log.warn(e.getMessage()); } } public QuestionPoolAccessData getQuestionPoolAccessData(final Long poolId, final String agentId) { final HibernateCallback hcb = new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery("from QuestionPoolAccessData as qpa where qpa.questionPoolId =? and qpa.agentId=?"); q.setLong(0, poolId.longValue()); q.setString(1, agentId); return q.list(); }; }; List list = getHibernateTemplate().executeFind(hcb); // List list = getHibernateTemplate().find("from QuestionPoolAccessData as qpa where qpa.questionPoolId =? and qpa.agentId=?", // new Object[] {poolId, agentId} // , // new org.hibernate.type.Type[] {Hibernate. // LONG, Hibernate.STRING}); return (QuestionPoolAccessData) list.get(0); } /** * DOCUMENTATION PENDING * * @param ids DOCUMENTATION PENDING * @param sectionId DOCUMENTATION PENDING */ public void addItemsToSection(Collection ids, long sectionId) { } /** * add a question to a pool * * @param itemId DOCUMENTATION PENDING * @param poolId DOCUMENTATION PENDING */ public void addItemToPool(QuestionPoolItemData qpi) { int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount().intValue(); while (retryCount > 0){ try { getHibernateTemplate().save(qpi); retryCount = 0; } catch (Exception e) { log.warn("problem saving item to pool: "+e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper().retryDeadlock(e, retryCount); } } } /** * Delete pool and questions attached to it plus any subpool under it * * @param itemId DOCUMENTATION PENDING * @param poolId DOCUMENTATION PENDING */ public void deletePool(final Long poolId, final String agent, Tree tree) { try { QuestionPoolData questionPool = (QuestionPoolData) getHibernateTemplate().load(QuestionPoolData.class, poolId); // #1. delete all questions which mean AssetBeanie (not ItemImpl) 'cos AssetBeanie // is the one that is associated with the DB // lydial: getting list of items that only belong to this pool and not linked to any assessments. List itemList = getAllItemsInThisPoolOnlyAndDetachFromAssessment(poolId); int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount().intValue(); while (retryCount > 0){ try { getHibernateTemplate().deleteAll(itemList); // delete all AssetBeanie retryCount = 0; } catch (DataAccessException e) { log.warn("problem delete all items in pool: "+e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper().retryDeadlock(e, retryCount); } } // #2. delete question and questionpool map. retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount().intValue(); while (retryCount > 0){ try { final HibernateCallback hcb = new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery("select qpi from QuestionPoolItemData as qpi where qpi.questionPoolId= ?"); q.setLong(0, poolId.longValue()); return q.list(); }; }; List list = getHibernateTemplate().executeFind(hcb); // a. delete item and pool association in SAM_ITEMMETADATA_T - this is the primary // pool that item is attached to ArrayList metaList = new ArrayList(); for (int j=0; j<list.size(); j++){ String itemId = ((QuestionPoolItemData)list.get(j)).getItemId(); String query = "from ItemMetaData as meta where meta.item.itemId=? and meta.label=?"; Object [] values = {Long.valueOf(itemId), ItemMetaDataIfc.POOLID}; List m = getHibernateTemplate().find(query, values); if (m.size()>0){ ItemMetaDataIfc meta = (ItemMetaDataIfc)m.get(0); meta.setEntry(null); } } try{ getHibernateTemplate().saveOrUpdateAll(metaList); retryCount = 0; } catch (DataAccessException e) { log.warn("problem delete question and questionpool map inside itemMetaData: "+e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper().retryDeadlock(e, retryCount); } // b. delete item and pool association in SAM_QUESTIONPOOLITEM_T if (list.size() > 0) { questionPool.setQuestionPoolItems(new HashSet()); getHibernateTemplate().deleteAll(list); retryCount = 0; } else retryCount = 0; } catch (DataAccessException e) { log.warn("problem delete question and questionpool map: "+e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper().retryDeadlock(e, retryCount); } } // #3. Pool is owned by one but can be shared by multiple agents. So need to // delete all QuestionPoolAccessData record first. This seems to be missing in Navigo, nope? - daisyf // Actually, I don't think we have ever implemented sharing between agents. So we may wnat to // clean up this bit of code - daisyf 07/07/06 // #3a. Delete all shared pool by him sons final HibernateCallback hcb = new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery("select qpa from QuestionPoolAccessData as qpa, QuestionPoolData as qpp " + "where qpa.questionPoolId = qpp.questionPoolId and (qpp.questionPoolId=? or qpp.parentPoolId=?) "); q.setLong(0, poolId.longValue()); q.setLong(1, poolId.longValue()); return q.list(); }; }; List qpaList = getHibernateTemplate().executeFind(hcb); retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount().intValue(); while (retryCount > 0){ try { getHibernateTemplate().deleteAll(qpaList); retryCount = 0; } catch (DataAccessException e) { log.warn("problem delete question pool access data: "+e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper().retryDeadlock(e, retryCount); } } // #4. Ready! delete pool now final HibernateCallback hcb2 = new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery("select qp from QuestionPoolData as qp where qp.id= ?"); q.setLong(0, poolId.longValue()); return q.list(); }; }; List qppList = getHibernateTemplate().executeFind(hcb2); retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount().intValue(); while (retryCount > 0){ try { getHibernateTemplate().deleteAll(qppList); retryCount = 0; } catch (DataAccessException e) { log.warn("problem delete all pools: "+e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper().retryDeadlock(e, retryCount); } } // #5. delete all subpools if any, this is recursive Iterator citer = (tree.getChildList(poolId)).iterator(); while (citer.hasNext()) { deletePool( (Long) citer.next(), agent, tree); } } catch (DataAccessException e) { log.warn("error deleting pool. " + e.getMessage()); } } /** * Move pool under another pool. The dest pool must not be the * descendant of the source nor can they be the same pool . */ public void movePool(String agentId, Long sourcePoolId, Long destPoolId) { try { QuestionPoolFacade sourcePool = getPool(sourcePoolId, agentId); if (destPoolId.equals(QuestionPoolFacade.ROOT_POOL) && !sourcePoolId.equals(QuestionPoolFacade.ROOT_POOL)) { sourcePool.setParentPoolId(QuestionPoolFacade.ROOT_POOL); int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount().intValue(); while (retryCount > 0){ try { getHibernateTemplate().update( (QuestionPoolData) sourcePool.getData()); retryCount = 0; } catch (DataAccessException e) { log.warn("problem moving pool: "+e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper().retryDeadlock(e, retryCount); } } } else { QuestionPoolFacade destPool = getPool(destPoolId, agentId); sourcePool.setParentPoolId(destPool.getQuestionPoolId()); int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount().intValue(); while (retryCount > 0){ try { getHibernateTemplate().update( (QuestionPoolData) sourcePool.getData()); retryCount = 0; } catch (DataAccessException e) { log.warn("problem update source pool: "+e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper().retryDeadlock(e, retryCount); } } } } catch (RuntimeException e) { log.warn(e.getMessage()); } } /** * Is destination a descendant of the source? */ public boolean isDescendantOf(QuestionPoolFacade destPool, QuestionPoolFacade sourcePool) { Long tempPoolId = destPool.getQuestionPoolId(); try { while((tempPoolId != null) && (!tempPoolId.equals(QuestionPoolFacade.ROOT_POOL))) { QuestionPoolFacade tempPool = getPoolById(tempPoolId); if (tempPool.getParentPoolId().equals(sourcePool.getQuestionPoolId())) { return true; } tempPoolId = tempPool.getParentPoolId(); } return false; } catch (Exception e) { log.warn(e.getMessage()); return false; } } /** * DOCUMENTATION PENDING * * @param itemId DOCUMENTATION PENDING * @param poolId DOCUMENTATION PENDING */ public void removeItemFromPool(String itemId, Long poolId) { QuestionPoolItemData qpi = new QuestionPoolItemData(poolId, itemId); int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount().intValue(); while (retryCount > 0){ try { getHibernateTemplate().delete(qpi); retryCount = 0; } catch (Exception e) { log.warn("problem delete item from pool: "+e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper().retryDeadlock(e, retryCount); } } } /** * DOCUMENTATION PENDING * * @param itemId DOCUMENTATION PENDING * @param poolId DOCUMENTATION PENDING */ public void moveItemToPool(String itemId, Long sourceId, Long destId) { QuestionPoolItemData qpi = new QuestionPoolItemData(sourceId, itemId); int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount().intValue(); while (retryCount > 0){ try { getHibernateTemplate().delete(qpi); retryCount = 0; } catch (Exception e) { log.warn("problem delete old mapping: "+e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper().retryDeadlock(e, retryCount); } } QuestionPoolItemData qpi2 = new QuestionPoolItemData(destId, itemId); retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount().intValue(); while (retryCount > 0){ try { getHibernateTemplate().save(qpi2); retryCount = 0; } catch (Exception e) { log.warn("problem saving new mapping: "+e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper().retryDeadlock(e, retryCount); } } } /** * DOCUMENTATION PENDING * * @param pool DOCUMENTATION PENDING */ public QuestionPoolFacade savePool(QuestionPoolFacade pool) { boolean insert = false; try { QuestionPoolData qpp = (QuestionPoolData) pool.getData(); qpp.setLastModified(new Date()); qpp.setLastModifiedById(AgentFacade.getAgentString()); int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount().intValue(); if (qpp.getQuestionPoolId() == null || qpp.getQuestionPoolId().equals(new Long("0"))) { // indicate a new pool insert = true; } while (retryCount > 0){ try { getHibernateTemplate().saveOrUpdate(qpp); retryCount = 0; } catch (DataAccessException e) { log.warn("problem saving Or Update pool: "+e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper().retryDeadlock(e, retryCount); } } if (insert) { // add a QuestionPoolAccessData record for the owner who should have ADMIN access to the pool QuestionPoolAccessData qpa = new QuestionPoolAccessData(qpp. getQuestionPoolId(), qpp.getOwnerId(), QuestionPoolData.ADMIN); retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount().intValue(); while (retryCount > 0){ try { getHibernateTemplate().save(qpa); retryCount = 0; } catch (DataAccessException e) { log.warn("problem saving pool: "+e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper().retryDeadlock(e, retryCount); } } // add a QuestionPoolAccessData record for all users who are sharing the subpool final long parentPoolId = qpp.getParentPoolId(); final String ownerId = qpp.getOwnerId(); if (parentPoolId != 0) { List<QuestionPoolAccessData> listSubpool = new ArrayList(); try { listSubpool = getHibernateTemplate().find("from QuestionPoolAccessData as qpa where qpa.questionPoolId=? and qpa.agentId<>?", new Object[] { Long.valueOf(parentPoolId), ownerId}); } catch (Exception e1) { log.warn("problem finding pool: "+e1.getMessage()); } for (QuestionPoolAccessData questioPoolData : listSubpool) { qpa = new QuestionPoolAccessData(qpp.getQuestionPoolId(), questioPoolData.getAgentId(), QuestionPoolData.READ_COPY); retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount().intValue(); while (retryCount > 0){ try { getHibernateTemplate().save(qpa); retryCount = 0; } catch (DataAccessException e) { log.warn("problem saving pool: "+e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper().retryDeadlock(e, retryCount); } } } } } return pool; } catch (RuntimeException e) { log.warn(e.getMessage()); return null; } } /** * Get all the children pools of a pool. Return a list of QuestionPoolData * should return QuestionPool instead - need fixing, daisyf * * @param itemId DOCUMENTATION PENDING * @param poolId DOCUMENTATION PENDING */ public List getSubPools(final Long poolId) { final HibernateCallback hcb = new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery("from QuestionPoolData as qpp where qpp.parentPoolId=?"); q.setLong(0, poolId.longValue()); return q.list(); }; }; return getHibernateTemplate().executeFind(hcb); } // get number of subpools for each pool in a single query. // returns a List of arrays. Each array is 0: poolid, 1: count of subpools // both are BigInteger. public List getSubPoolSizes(final String agent) { final HibernateCallback hcb = new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException { //SQLQuery q = session.createSQLQuery("select a.QUESTIONPOOLID,(select count(*) from SAM_QUESTIONPOOL_T b where b.PARENTPOOLID=a.QUESTIONPOOLID) from SAM_QUESTIONPOOL_T a where a.OWNERID=?"); Query q = session.createQuery("select a.questionPoolId, (select count(*) from QuestionPoolData b where b.parentPoolId=a.questionPoolId) " + "from QuestionPoolData a where a.ownerId=?"); q.setString(0, agent); return q.list(); }; }; return getHibernateTemplate().executeFind(hcb); } //number of subpools for this pool. But consider getSubPoolSizes if you're going to // need this for all the pools. public int getSubPoolSize(final Long poolId) { final HibernateCallback hcb = new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery("select count(qpp) from QuestionPoolData qpp where qpp.parentPoolId=?"); q.setLong(0, poolId.longValue()); return q.uniqueResult(); }; }; Integer count = (Integer)getHibernateTemplate().execute(hcb); return count.intValue(); } /** * DOCUMENTATION PENDING * * @param itemId DOCUMENTATION PENDING * @param poolId DOCUMENTATION PENDING */ // Note that this is going to do a database query. If you need to do this // for lots of pools consider doing getSubPoolSizes, saving the results // and then testing. public boolean hasSubPools(final Long poolId) { int poolSize = getSubPoolSize(poolId); if (poolSize >= 0) return true; else return false; } public boolean poolIsUnique(final Long questionPoolId, final String title, final Long parentPoolId, final String agentId) { final HibernateCallback hcb = new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery("select new QuestionPoolData(a.questionPoolId, a.title, a.parentPoolId)from QuestionPoolData a where a.questionPoolId!= ? and a.title=? and a.parentPoolId=? and a.ownerId = ? "); q.setLong(0, questionPoolId.longValue()); q.setString(1, title); q.setLong(2, parentPoolId.longValue()); q.setString(3, agentId); return q.list(); }; }; List list = getHibernateTemplate().executeFind(hcb); // List list = getHibernateTemplate().find( // "select new QuestionPoolData(a.questionPoolId, a.title, a.parentPoolId)from QuestionPoolData a where a.questionPoolId!= ? and a.title=? and a.parentPoolId=?", // new Object[] {questionPoolId,title,parentPoolId} // , new org.hibernate.type.Type[] {Hibernate.LONG,Hibernate.STRING, Hibernate.LONG}); boolean isUnique = true; if(list.size()>0) { // query in mysql & hsqldb are not case sensitive, check that title found is indeed what we // are looking (SAK-3110) for (int i=0; i<list.size();i++){ QuestionPoolData q = (QuestionPoolData) list.get(i); if ((title).equals(q.getTitle().trim())){ isUnique = false; break; } } } return isUnique; } /** * Return a list of questionPoolId (java.lang.Long) * * @param itemId DOCUMENTATION PENDING * @param poolId DOCUMENTATION PENDING */ public List getPoolIdsByAgent(final String agentId) { ArrayList idList = new ArrayList(); final HibernateCallback hcb = new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery("select qpa from QuestionPoolAccessData as qpa where qpa.agentId= ?"); q.setString(0, agentId); return q.list(); }; }; List qpaList = getHibernateTemplate().executeFind(hcb); // List qpaList = getHibernateTemplate().find( // "select qpa from QuestionPoolAccessData as qpa where qpa.agentId= ?", // new Object[] {agentId} // , new org.hibernate.type.Type[] {Hibernate.STRING}); try { Iterator iter = qpaList.iterator(); while (iter.hasNext()) { QuestionPoolAccessData qpa = (QuestionPoolAccessData) iter.next(); idList.add(qpa.getQuestionPoolId()); // return a list of poolId (java.lang.Long) } return idList; } catch (RuntimeException e) { return null; } } /** * Return a list of questionPoolId (java.lang.Long) * * @param itemId DOCUMENTATION PENDING * @param poolId DOCUMENTATION PENDING */ public List getPoolIdsByItem(final String itemId) { ArrayList idList = new ArrayList(); final HibernateCallback hcb = new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery("select qpi from QuestionPoolItemData as qpi where qpi.itemId= ?"); q.setString(0, itemId); return q.list(); }; }; List qpiList = getHibernateTemplate().executeFind(hcb); // List qpiList = getHibernateTemplate().find( // "select qpi from QuestionPoolItemData as qpi where qpi.itemId= ?", // new Object[] {itemId} // , new org.hibernate.type.Type[] {Hibernate.STRING}); try { Iterator iter = qpiList.iterator(); while (iter.hasNext()) { QuestionPoolItemData qpa = (QuestionPoolItemData) iter.next(); idList.add(qpa.getQuestionPoolId()); // return a list of poolId (java.lang.Long) } return idList; } catch (Exception e) { e.printStackTrace(); return null; } } /** * Copy a pool to a new location. */ public void copyPool(Tree tree, String agentId, Long sourceId, Long destId, String prependString1, String prependString2) { try { boolean haveCommonRoot = false; boolean duplicate = false; // Get the Pools QuestionPoolFacade oldPool = getPool(sourceId, agentId); String oldPoolName= oldPool.getDisplayName(); // Are we creating a duplicate under the same parent? if (destId.equals(oldPool.getParentPoolId())) { duplicate = true; } // Determine if the Pools are in the same tree // If so, make sure the source level is not higher(up the tree) // than the dest. to avoid the endless loop. if (!duplicate) { haveCommonRoot = tree.haveCommonRoot(sourceId, destId); } if (haveCommonRoot && (tree.poolLevel(sourceId) <= tree.poolLevel(destId))) { return; // Since otherwise it would cause an infinite loop. // We should revisit this. } QuestionPoolFacade newPool = (QuestionPoolFacade) oldPool.clone(); newPool.setParentPoolId(destId); newPool.setQuestionPoolId( Long.valueOf(0)); newPool.setOwnerId(AgentFacade.getAgentString()); // If Pools in same trees, if (!haveCommonRoot) { // If Pools in different trees, // Copy to a Pool outside the same root // Copy *this* Pool first if (duplicate) resetTitle(destId, newPool, oldPoolName, prependString1, prependString2); else newPool.updateDisplayName(oldPoolName); } newPool = savePool(newPool); Iterator iter = oldPool.getQuestions().iterator(); ArrayList itemDataArray = new ArrayList(); while (iter.hasNext()) { ItemDataIfc itemData = (ItemDataIfc) iter.next(); ItemFacade itemFacade = copyItemFacade2(itemData); ItemDataIfc newItemData = itemFacade.getData(); itemDataArray.add(newItemData); } // then save question to pool newPool.setQuestionPoolItems(prepareQuestions(newPool.getQuestionPoolId(), itemDataArray)); newPool.setQuestions(itemDataArray); newPool = savePool(newPool); // Get the SubPools of oldPool Iterator citer = (tree.getChildList(sourceId)).iterator(); while (citer.hasNext()) { Long childPoolId = (Long) citer.next(); copyPool(tree, agentId, childPoolId, newPool.getQuestionPoolId(), prependString1, prependString2); } } catch (Exception e) { e.printStackTrace(); } } /* public static void main(String[] args) throws DataFacadeException { QuestionPoolFacadeQueriesAPI instance = new QuestionPoolFacadeQueries(); // add an item if (args[0].equals("add")) { Long questionPoolId = instance.add(); } if (args[0].equals("getQPItems")) { List items = instance.getAllItems(new Long(args[1])); // poolId for (int i = 0; i < items.size(); i++) { ItemData item = (ItemData) items.get(i); } } System.exit(0); } */ public Long add() { QuestionPoolData questionPool = new QuestionPoolData(); questionPool.setTitle("Daisy Happy Pool"); questionPool.setOwnerId("1"); questionPool.setDateCreated(new Date()); questionPool.setLastModifiedById("1"); questionPool.setLastModified(new Date()); getHibernateTemplate().save(questionPool); return questionPool.getQuestionPoolId(); } public QuestionPoolFacade getPoolById(Long questionPoolId) { QuestionPoolFacade questionPoolFacade = null; try { if (!questionPoolId.equals(QuestionPoolFacade.ROOT_POOL)) { QuestionPoolData questionPool = (QuestionPoolData) getHibernateTemplate(). load(QuestionPoolData.class, questionPoolId); if (questionPool != null) { questionPoolFacade = new QuestionPoolFacade(questionPool); } } } catch (Exception e) { e.printStackTrace(); } return questionPoolFacade; } public HashMap getQuestionPoolItemMap(){ HashMap h = new HashMap(); String query = "from QuestionPoolItemData"; List l = getHibernateTemplate().find(query); for (int i = 0; i < l.size(); i++) { QuestionPoolItemData q = (QuestionPoolItemData) l.get(i); h.put(q.getItemId(), q); } return h; } public HashSet prepareQuestions(Long questionPoolId, ArrayList itemDataArray){ HashSet set = new HashSet(); Iterator iter = itemDataArray.iterator(); while (iter.hasNext()){ ItemDataIfc itemData = (ItemDataIfc) iter.next(); set.add(new QuestionPoolItemData(questionPoolId, itemData.getItemIdString(), (ItemData) itemData)); } return set; } /* public HashSet prepareQuestions(Long questionPoolId, Set questionSet){ HashSet set = new HashSet(); Iterator iter = questionSet.iterator(); while (iter.hasNext()){ QuestionPoolItemData i = (QuestionPoolItemData)iter.next(); set.add(new QuestionPoolItemData(questionPoolId, i.getItemId())); } return set; } */ private void resetTitle(Long destId, QuestionPoolFacade newPool, String oldPoolName, String prependString1, String prependString2){ //find name by loop through sibslings List siblings=getSubPools(destId); int num=0; int startIndex = 0; int endIndex = 0; int maxNum=0; StringBuilder prependString = new StringBuilder(prependString1); prependString.append(" "); prependString.append(prependString2); prependString.append(" "); for (int l = 0; l < siblings.size(); l++) { QuestionPoolData a = (QuestionPoolData)siblings.get(l); String n=a.getTitle(); if(n.startsWith(prependString.toString())){ if(n.equals(prependString + oldPoolName)){ if (maxNum<1) maxNum=1; } } if(n.startsWith(prependString1 + "(")){ startIndex = n.indexOf("("); endIndex=n.indexOf(")"); try{ String partialPoolName = n.substring(endIndex + 2).replaceFirst(prependString2 + " ", "").trim(); num = Integer.parseInt(n.substring(startIndex + 1, endIndex)); if(oldPoolName.equals(partialPoolName)){ if (num>maxNum) maxNum=num; } } catch(NumberFormatException e){ log.warn("rename title of duplicate pool:"+ e.getMessage()); } } } if(maxNum==0) newPool.updateDisplayName(prependString + oldPoolName); else newPool.updateDisplayName(prependString1 + "(" + (maxNum+1) + ") " + prependString2 + " " + oldPoolName); } public Long copyItemFacade(ItemDataIfc itemData) { ItemFacade item = getItemFacade(itemData); ItemService itemService = new ItemService(); Long itemId = itemService.saveItem(item).getItemId(); return itemId; } public ItemFacade copyItemFacade2(ItemDataIfc itemData) { ItemFacade item = getItemFacade(itemData); ItemService itemService = new ItemService(); return itemService.saveItem(item); } private ItemFacade getItemFacade(ItemDataIfc itemData) { ItemFacade item = new ItemFacade(); item.setScore(itemData.getScore()); item.setDiscount(itemData.getDiscount()); item.setHint(itemData.getHint()); item.setStatus(itemData.getStatus()); item.setTypeId(itemData.getTypeId()); item.setCreatedBy(AgentFacade.getAgentString()); item.setCreatedDate(new Date()); item.setLastModifiedBy(AgentFacade.getAgentString()); item.setLastModifiedDate(new Date()); item.setInstruction(itemData.getInstruction()); item.setHasRationale(itemData.getHasRationale()); item.setTriesAllowed(itemData.getTriesAllowed()); item.setDuration(itemData.getDuration()); item.setItemTextSet(copyItemText(item.getData(), itemData)); item.setItemMetaDataSet(copyMetaData(item.getData(), itemData)); item.setItemAttachmentSet(copyAttachment(item.getData(), itemData)); if (itemData.getCorrectItemFeedback() != null && !itemData.getCorrectItemFeedback().equals("")) { item.setCorrectItemFeedback(itemData.getCorrectItemFeedback()); } if (itemData.getInCorrectItemFeedback() != null && !itemData.getInCorrectItemFeedback().equals("")) { item.setInCorrectItemFeedback(itemData.getInCorrectItemFeedback()); } if (itemData.getGeneralItemFeedback() != null && !itemData.getGeneralItemFeedback().equals("")) { item.setGeneralItemFeedback(itemData.getGeneralItemFeedback()); } return item; } private HashSet copyItemText(ItemDataIfc toItemData, ItemDataIfc fromItemData) { HashSet toItemTextSet = new HashSet(); Set fromItemTextSet = fromItemData.getItemTextSet(); Iterator itemTextIter = fromItemTextSet.iterator(); while (itemTextIter.hasNext()) { ItemText fromItemText = (ItemText) itemTextIter.next(); ItemText toItemText = new ItemText(); toItemText.setItem(toItemData); toItemText.setSequence(fromItemText.getSequence()); toItemText.setText(fromItemText.getText()); HashSet toAnswerSet = new HashSet(); Set fromAnswerSet = fromItemText.getAnswerSet(); Iterator answerIter = fromAnswerSet.iterator(); while (answerIter.hasNext()) { Answer fromAnswer = (Answer) answerIter.next(); Answer toAnswer = new Answer(toItemText, fromAnswer.getText(), fromAnswer.getSequence(), fromAnswer.getLabel(), fromAnswer.getIsCorrect(), fromAnswer.getGrade(), fromAnswer.getScore(), fromAnswer.getPartialCredit(), fromAnswer.getDiscount()); HashSet toAnswerFeedbackSet = new HashSet(); Set fromAnswerFeedbackSet = fromAnswer.getAnswerFeedbackSet(); Iterator answerFeedbackIter = fromAnswerFeedbackSet.iterator(); while (answerFeedbackIter.hasNext()) { AnswerFeedback fromAnswerFeedback = (AnswerFeedback) answerFeedbackIter.next(); toAnswerFeedbackSet.add(new AnswerFeedback(toAnswer, fromAnswerFeedback.getTypeId(), fromAnswerFeedback.getText())); toAnswer.setAnswerFeedbackSet(toAnswerFeedbackSet); } toAnswerSet.add(toAnswer); toItemText.setAnswerSet(toAnswerSet); } toItemTextSet.add(toItemText); } return toItemTextSet; } private HashSet copyMetaData(ItemDataIfc toItemData, ItemDataIfc fromItemData) { HashSet toSet = new HashSet(); Set fromSet = fromItemData.getItemMetaDataSet(); Iterator iter = fromSet.iterator(); while (iter.hasNext()) { ItemMetaData itemMetaData = (ItemMetaData) iter.next(); toSet.add(new ItemMetaData(toItemData, itemMetaData.getLabel(), itemMetaData.getEntry())); } return toSet; } private Set copyAttachment(ItemDataIfc toItemData, ItemDataIfc fromItemData) { AssessmentService assessmentService = new AssessmentService(); Set toSet = assessmentService.copyItemAttachmentSet((ItemData) toItemData, fromItemData.getItemAttachmentSet()); return toSet; } public Integer getCountItemFacades(final Long questionPoolId) { final HibernateCallback hcb = new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery("select count(ab) from ItemData ab, QuestionPoolItemData qpi where ab.itemId=qpi.itemId and qpi.questionPoolId = ?"); q.setLong(0, questionPoolId.longValue()); return q.uniqueResult(); }; }; Integer count = (Integer)getHibernateTemplate().execute(hcb); return count; } /** * Shared Pools with other user */ public void addQuestionPoolAccess(Tree tree, String user, final Long questionPoolId, Long accessTypeId) { QuestionPoolAccessData qpad = new QuestionPoolAccessData(questionPoolId, user, accessTypeId); getHibernateTemplate().saveOrUpdate(qpad); Iterator citer = (tree.getChildList(questionPoolId)).iterator(); while (citer.hasNext()) { Long childPoolId = (Long) citer.next(); addQuestionPoolAccess(tree, user, childPoolId, accessTypeId); } } public void removeQuestionPoolAccess(Tree tree, String user, final Long questionPoolId, Long accessTypeId) { QuestionPoolAccessData qpad = new QuestionPoolAccessData(questionPoolId, user, accessTypeId); getHibernateTemplate().delete(qpad); Iterator citer = (tree.getChildList(questionPoolId)).iterator(); while (citer.hasNext()) { Long childPoolId = (Long) citer.next(); removeQuestionPoolAccess(tree, user, childPoolId, accessTypeId); } } public List<AgentFacade> getAgentsWithAccess(final Long questionPoolId) { final HibernateCallback hcb = new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery("select qpa from QuestionPoolAccessData as qpa where qpa.questionPoolId= ?"); q.setLong(0, questionPoolId.longValue()); return q.list(); }; }; List<QuestionPoolAccessData> qpaList = getHibernateTemplate().executeFind(hcb); List<AgentFacade> agents = new ArrayList(); for (QuestionPoolAccessData pool : qpaList) { AgentFacade agent = new AgentFacade(pool.getAgentId()); agents.add(agent); } return agents; } }