/********************************************************************************** * $URL: https://source.sakaiproject.org/svn/sam/trunk/samigo-services/src/java/org/sakaiproject/tool/assessment/facade/AssessmentFacadeQueries.java $ * $Id: AssessmentFacadeQueries.java 121508 2013-03-20 22:29:31Z ktsao@stanford.edu $ *********************************************************************************** * * 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.ArrayList; 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.component.cover.ServerConfigurationService; import org.sakaiproject.content.api.ContentResource; import org.sakaiproject.entity.api.ResourceProperties; import org.sakaiproject.exception.IdUnusedException; import org.sakaiproject.exception.PermissionException; import org.sakaiproject.exception.TypeException; import org.sakaiproject.service.gradebook.shared.GradebookExternalAssessmentService; import org.sakaiproject.service.gradebook.shared.GradebookService; import org.sakaiproject.site.api.Site; import org.sakaiproject.site.cover.SiteService; import org.sakaiproject.spring.SpringBeanLocator; 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.AssessmentAccessControl; import org.sakaiproject.tool.assessment.data.dao.assessment.AssessmentAttachment; import org.sakaiproject.tool.assessment.data.dao.assessment.AssessmentBaseData; import org.sakaiproject.tool.assessment.data.dao.assessment.AssessmentData; import org.sakaiproject.tool.assessment.data.dao.assessment.AssessmentFeedback; import org.sakaiproject.tool.assessment.data.dao.assessment.AssessmentMetaData; import org.sakaiproject.tool.assessment.data.dao.assessment.AssessmentTemplateData; import org.sakaiproject.tool.assessment.data.dao.assessment.AttachmentData; import org.sakaiproject.tool.assessment.data.dao.assessment.EvaluationModel; 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.dao.assessment.PublishedItemAttachment; import org.sakaiproject.tool.assessment.data.dao.assessment.SectionAttachment; import org.sakaiproject.tool.assessment.data.dao.assessment.SectionData; import org.sakaiproject.tool.assessment.data.dao.assessment.SectionMetaData; import org.sakaiproject.tool.assessment.data.dao.assessment.SecuredIPAddress; import org.sakaiproject.tool.assessment.data.dao.authz.AuthorizationData; import org.sakaiproject.tool.assessment.data.dao.shared.TypeD; import org.sakaiproject.tool.assessment.data.ifc.assessment.AssessmentAccessControlIfc; import org.sakaiproject.tool.assessment.data.ifc.assessment.AssessmentAttachmentIfc; import org.sakaiproject.tool.assessment.data.ifc.assessment.AssessmentBaseIfc; import org.sakaiproject.tool.assessment.data.ifc.assessment.AssessmentIfc; import org.sakaiproject.tool.assessment.data.ifc.assessment.AssessmentMetaDataIfc; import org.sakaiproject.tool.assessment.data.ifc.assessment.EvaluationModelIfc; import org.sakaiproject.tool.assessment.data.ifc.assessment.ItemAttachmentIfc; 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.SectionAttachmentIfc; import org.sakaiproject.tool.assessment.data.ifc.assessment.SectionDataIfc; import org.sakaiproject.tool.assessment.facade.util.PagingUtilQueriesAPI; import org.sakaiproject.tool.assessment.integration.context.IntegrationContextFactory; import org.sakaiproject.tool.assessment.integration.helper.ifc.GradebookServiceHelper; import org.sakaiproject.tool.assessment.osid.shared.impl.IdImpl; import org.sakaiproject.tool.assessment.qti.constants.AuthoringConstantStrings; import org.sakaiproject.tool.assessment.services.PersistenceService; import org.sakaiproject.tool.assessment.services.QuestionPoolService; import org.sakaiproject.tool.assessment.services.assessment.AssessmentService; import org.springframework.dao.DataAccessException; import org.springframework.orm.hibernate3.HibernateCallback; import org.springframework.orm.hibernate3.HibernateQueryException; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; public class AssessmentFacadeQueries extends HibernateDaoSupport implements AssessmentFacadeQueriesAPI { private static Log log = LogFactory.getLog(AssessmentFacadeQueries.class); // private ResourceBundle rb = // ResourceBundle.getBundle("org.sakaiproject.tool.assessment.bundle.Messages"); public static final String TITLE = "title"; public AssessmentFacadeQueries() { } public IdImpl getId(String id) { return new IdImpl(id); } public IdImpl getId(Long id) { return new IdImpl(id); } public IdImpl getId(long id) { return new IdImpl(id); } public IdImpl getAssessmentId(String id) { return new IdImpl(id); } public IdImpl getAssessmentId(Long id) { return new IdImpl(id); } public IdImpl getAssessmentId(long id) { return new IdImpl(id); } public IdImpl getAssessmentTemplateId(String id) { return new IdImpl(id); } public IdImpl getAssessmentTemplateId(Long id) { return new IdImpl(id); } public IdImpl getAssessmentTemplateId(long id) { return new IdImpl(id); } public Long addTemplate() { AssessmentTemplateData assessmentTemplate = new AssessmentTemplateData( Long.valueOf(0), "title", "description", "comments", TypeD.HOMEWORK, Integer.valueOf(1), Integer.valueOf(1), Integer.valueOf(1), Integer.valueOf(1), "1", new Date(), "1", new Date()); AssessmentAccessControl s = new AssessmentAccessControl(Integer.valueOf(0), Integer.valueOf(0), Integer.valueOf(0), Integer.valueOf(0), Integer.valueOf(0), Integer.valueOf(0), Integer.valueOf(0), Integer.valueOf(0), new Date(), new Date(), new Date(), new Date(), new Date(), Integer.valueOf(1), Integer.valueOf(1), Integer.valueOf(1), "Thanks for submitting", "anonymous"); s.setAssessmentBase(assessmentTemplate); assessmentTemplate .setAssessmentAccessControl((AssessmentAccessControlIfc) s); assessmentTemplate.addAssessmentMetaData( "ASSESSMENTTEMPLATE_OBJECTIVES", " assesmentT: the objective is to ..."); // take default submission model int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount() .intValue(); while (retryCount > 0) { try { getHibernateTemplate().save(assessmentTemplate); retryCount = 0; } catch (Exception e) { log.warn("problem saving template: " + e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper().retryDeadlock(e, retryCount); } } return assessmentTemplate.getAssessmentTemplateId(); } public void removeTemplate(Long assessmentId) { AssessmentTemplateData assessment = (AssessmentTemplateData) getHibernateTemplate() .load(AssessmentTemplateData.class, assessmentId); int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount() .intValue(); while (retryCount > 0) { try { getHibernateTemplate().delete(assessment); retryCount = 0; } catch (Exception e) { log.warn("problem delete template: " + e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper().retryDeadlock(e, retryCount); } } } public Long addAssessment(Long assessmentTemplateId) { AssessmentData assessment = new AssessmentData( Long.valueOf(0), "assessment title", "assessment description", "assessment acomments", assessmentTemplateId, TypeD.HOMEWORK, Integer.valueOf(1), Integer.valueOf(1), Integer.valueOf(1), Integer.valueOf(1), "1", new Date(), "1", new Date()); AssessmentAccessControl s = new AssessmentAccessControl(Integer.valueOf(1), Integer.valueOf(1), Integer.valueOf(1), Integer.valueOf(1), Integer.valueOf(1), Integer.valueOf(1), Integer.valueOf(1), Integer.valueOf(1), new Date(), new Date(), new Date(), new Date(), new Date(), Integer.valueOf(1), Integer.valueOf(1), Integer.valueOf(1), "Thanks for submitting", "anonymous"); s.setAssessmentBase(assessment); assessment.setAssessmentAccessControl((AssessmentAccessControlIfc) s); assessment.addAssessmentMetaData("ASSESSMENT_OBJECTIVES", " assesment: the objective is to ..."); int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount() .intValue(); while (retryCount > 0) { try { getHibernateTemplate().save(assessment); retryCount = 0; } catch (Exception e) { log.warn("problem saving assessment: " + e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper().retryDeadlock(e, retryCount); } } return assessment.getAssessmentId(); } public AssessmentBaseData load(Long id) { AssessmentBaseData a = (AssessmentBaseData) getHibernateTemplate() .load(AssessmentBaseData.class, id); if (a.getIsTemplate().equals(Boolean.TRUE)) { return (AssessmentTemplateData) a; } else { return (AssessmentData) a; } } public AssessmentTemplateData loadTemplate(Long assessmentTemplateId) { return (AssessmentTemplateData) getHibernateTemplate().load( AssessmentTemplateData.class, assessmentTemplateId); } public AssessmentData loadAssessment(Long assessmentId) { return (AssessmentData) getHibernateTemplate().load( AssessmentData.class, assessmentId); } /* * The following methods are real * */ public AssessmentTemplateFacade getAssessmentTemplate( Long assessmentTemplateId) { AssessmentTemplateData template = (AssessmentTemplateData) getHibernateTemplate() .load(AssessmentTemplateData.class, assessmentTemplateId); return new AssessmentTemplateFacade(template); } // sakai2.0 we want to scope it by creator, users can only see their // templates plus the "Default Template" public ArrayList getAllAssessmentTemplates() { final String agent = AgentFacade.getAgentString(); final Long typeId = TypeD.TEMPLATE_SYSTEM_DEFINED; final String query = "select new AssessmentTemplateData(a.assessmentBaseId, a.title, a.lastModifiedDate, a.typeId)" + " from AssessmentTemplateData a where a.assessmentBaseId=? or" + " a.createdBy=? or a.typeId=? order by a.title"; HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery(query); q.setLong(0, Long.valueOf(1)); q.setString(1, agent); q.setLong(2, typeId.longValue()); return q.list(); }; }; List list = getHibernateTemplate().executeFind(hcb); // List list = getHibernateTemplate().find(query, // new Object[]{agent}, // new org.hibernate.type.Type[] {Hibernate.STRING}); ArrayList templateList = new ArrayList(); for (int i = 0; i < list.size(); i++) { AssessmentTemplateData a = (AssessmentTemplateData) list.get(i); AssessmentTemplateFacade f = new AssessmentTemplateFacade(a); templateList.add(f); } return templateList; } // sakai2.0 we want to scope it by creator, users can only see their // templates plus the "Default Template" public ArrayList getAllActiveAssessmentTemplates() { final String agent = AgentFacade.getAgentString(); final Long typeId = TypeD.TEMPLATE_SYSTEM_DEFINED; final String query = "select new AssessmentTemplateData(a.assessmentBaseId, a.title, a.lastModifiedDate, a.typeId)" + " from AssessmentTemplateData a where a.status=? and (a.assessmentBaseId=? or" + " a.createdBy=? or a.typeId=?) order by a.title"; HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery(query); q.setInteger(0, 1); q.setLong(1, Long.valueOf(1)); q.setString(2, agent); q.setLong(3, typeId.longValue()); return q.list(); }; }; List list = getHibernateTemplate().executeFind(hcb); // List list = getHibernateTemplate().find(query, // new Object[]{agent}, // new org.hibernate.type.Type[] {Hibernate.STRING}); ArrayList templateList = new ArrayList(); for (int i = 0; i < list.size(); i++) { AssessmentTemplateData a = (AssessmentTemplateData) list.get(i); AssessmentTemplateFacade f = new AssessmentTemplateFacade(a); templateList.add(f); } return templateList; } /** * * @return a list of AssessmentTemplateFacade. However, it is IMPORTANT to * note that it is not a full object, it contains merely * assessmentBaseId (which is the templateId) & title. This methods * is used when a list of template titles is required for displaying * purposes. In Sakai2.0, template are scoped by creator, i.e. users * can only see their own template plus the "Default Template" */ public ArrayList getTitleOfAllActiveAssessmentTemplates() { final String agent = AgentFacade.getAgentString(); final Long typeId = TypeD.TEMPLATE_SYSTEM_DEFINED; final String query = "select new AssessmentTemplateData(a.assessmentBaseId, a.title) " + " from AssessmentTemplateData a where a.status=? and " + " (a.assessmentBaseId=? or a.createdBy=? or typeId=?) order by a.title"; HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery(query); q.setInteger(0, 1); q.setLong(1, Long.valueOf(1)); q.setString(2, agent); q.setLong(3, typeId.longValue()); return q.list(); }; }; List list = getHibernateTemplate().executeFind(hcb); // List list = getHibernateTemplate().find(query, // new Object[]{agent}, // new org.hibernate.type.Type[] {Hibernate.STRING}); ArrayList templateList = new ArrayList(); for (int i = 0; i < list.size(); i++) { AssessmentTemplateData a = (AssessmentTemplateData) list.get(i); a.setAssessmentTemplateId(a.getAssessmentBaseId()); AssessmentTemplateFacade f = new AssessmentTemplateFacade(a .getAssessmentBaseId(), a.getTitle()); templateList.add(f); } return templateList; } public AssessmentFacade getAssessment(Long assessmentId) { try { AssessmentData assessment = (AssessmentData) getHibernateTemplate() .load(AssessmentData.class, assessmentId); assessment.setSectionSet(getSectionSetForAssessment(assessment)); return new AssessmentFacade(assessment); } catch (DataAccessException e) { log.warn("error retieving assemement: " + assessmentId.toString() + " " + e.getMessage()); } return null; } /** * IMPORTANT: 1. we have declared SectionData as lazy loading, so we need to * initialize it using getHibernateTemplate().initialize(java.lang.Object). * Unfortunately, we are using Spring 1.0.2 which does not support this * Hibernate feature. I tried upgrading Spring to 1.1.3. Then it failed to * load all the OR maps correctly. So for now, I am just going to initialize * it myself. I will take a look at it again next year. - daisyf (12/13/04) */ private HashSet getSectionSetForAssessment(AssessmentData assessment) { List sectionList = getHibernateTemplate().find( "from SectionData s where s.assessment.assessmentBaseId=?", assessment.getAssessmentBaseId()); HashSet set = new HashSet(); for (int j = 0; j < sectionList.size(); j++) { set.add((SectionData) sectionList.get(j)); } return set; } public void removeAssessment(Long assessmentId) { AssessmentData assessment = (AssessmentData) getHibernateTemplate() .load(AssessmentData.class, assessmentId); // if pubAssessment exist, simply set assessment to inactive // else delete assessment List count = getHibernateTemplate() .find( "select count(p) from PublishedAssessmentData p where p.assessmentId=?", assessmentId); // log.debug("no. of pub Assessment =" + count.size()); Iterator iter = count.iterator(); int i = ((Integer) iter.next()).intValue(); if (i > 0) { assessment.setStatus(AssessmentIfc.DEAD_STATUS); int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount() .intValue(); while (retryCount > 0) { try { getHibernateTemplate().update(assessment); retryCount = 0; } catch (Exception e) { log.warn("problem updating assessment: " + e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper() .retryDeadlock(e, retryCount); } } } else { // need to check if item in sections belongs to any QuestionPool QuestionPoolService qpService = new QuestionPoolService(); HashMap h = qpService.getQuestionPoolItemMap(); checkForQuestionPoolItem(assessment, h); Set sectionSet = getSectionSetForAssessment(assessment); assessment.setSectionSet(sectionSet); // removal of resource should be done here but for some reason it // doesn't work. // Debugging log in Content doesn't show anything. // So I am doing it in RemoveAssessmentListener // #2 - remove any resources attachment AssessmentService s = new AssessmentService(); List resourceIdList = s.getAssessmentResourceIdList(assessment); log.debug("*** we have no. of resource in assessment=" + resourceIdList.size()); s.deleteResources(resourceIdList); int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount() .intValue(); while (retryCount > 0) { try { getHibernateTemplate().delete(assessment); retryCount = 0; } catch (Exception e) { log.warn("problem deleting assessment: " + e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper() .retryDeadlock(e, retryCount); } } // true below => regular assessment (not published assessment) PersistenceService.getInstance().getAuthzQueriesFacade() .removeAuthorizationByQualifier( assessment.getAssessmentId().toString(), false); } } /* this assessment comes with a default section */ public AssessmentData cloneAssessmentFromTemplate(AssessmentTemplateData t) { // log.debug("**** DEFAULT templateId inside clone" + // t.getAssessmentTemplateId()); AssessmentData assessment = new AssessmentData(t.getParentId(), "Assessment created with" + t.getTitle(), t.getDescription(), t .getComments(), t.getAssessmentTemplateId(), TypeD.HOMEWORK, // by default for now t.getInstructorNotification(), t.getTesteeNotification(), t .getMultipartAllowed(), t.getStatus(), AgentFacade .getAgentString(), new Date(), AgentFacade .getAgentString(), new Date()); try { // deal with Access Control AssessmentAccessControl controlOrig = (AssessmentAccessControl) t .getAssessmentAccessControl(); if (controlOrig != null) { AssessmentAccessControl control = (AssessmentAccessControl) controlOrig .clone(); control.setAssessmentBase(assessment); assessment.setAssessmentAccessControl(control); } // deal with feedback AssessmentFeedback feedbackOrig = (AssessmentFeedback) t .getAssessmentFeedback(); if (feedbackOrig != null) { AssessmentFeedback feedback = (AssessmentFeedback) feedbackOrig .clone(); feedback.setAssessmentBase(assessment); assessment.setAssessmentFeedback(feedback); } // deal with evaluation EvaluationModel evalOrig = (EvaluationModel) t.getEvaluationModel(); if (evalOrig != null) { EvaluationModel eval = (EvaluationModel) evalOrig.clone(); eval.setAssessmentBase(assessment); assessment.setEvaluationModel(eval); } // deal with MetaData HashSet h = new HashSet(); Set s = t.getAssessmentMetaDataSet(); Iterator iter = s.iterator(); while (iter.hasNext()) { AssessmentMetaData mOrig = (AssessmentMetaData) iter.next(); if (mOrig.getLabel() != null) { AssessmentMetaData m = new AssessmentMetaData(assessment, mOrig.getLabel(), mOrig.getEntry()); h.add(m); } } assessment.setAssessmentMetaDataSet(h); // we need to add the FIRST section to an assessment // it is a requirement that each assesment must have at least one // section HashSet sh = new HashSet(); SectionData section = new SectionData( null, new Integer("1"), // FIRST section "Default", "", TypeD.DEFAULT_SECTION, SectionData.ACTIVE_STATUS, AgentFacade.getAgentString(), new Date(), AgentFacade.getAgentString(), new Date()); section.setAssessment(assessment); // add default part type, and question Ordering section.addSectionMetaData(SectionDataIfc.AUTHOR_TYPE, SectionDataIfc.QUESTIONS_AUTHORED_ONE_BY_ONE.toString()); section.addSectionMetaData(SectionDataIfc.QUESTIONS_ORDERING, SectionDataIfc.AS_LISTED_ON_ASSESSMENT_PAGE.toString()); sh.add(section); assessment.setSectionSet(sh); } catch (CloneNotSupportedException ex) { ex.printStackTrace(); } return assessment; } /** * This method is the same as createAssessment() except that no default * section will be created with the assessment. */ public AssessmentFacade createAssessmentWithoutDefaultSection(String title, String description, Long typeId, Long templateId) throws Exception { return createAssessmentWithoutDefaultSection(title, description, typeId, templateId, null); } public AssessmentFacade createAssessmentWithoutDefaultSection(String title, String description, Long typeId, Long templateId, String siteId) throws Exception { // this assessment came with one default section AssessmentData assessment = null; try { assessment = prepareAssessment(title, description, typeId, templateId, siteId); } catch (Exception e) { throw new Exception(e); } assessment.setSectionSet(new HashSet()); getHibernateTemplate().save(assessment); // register assessment with current site registerWithSite(assessment.getAssessmentId().toString(), siteId); return new AssessmentFacade(assessment); } private AssessmentData prepareAssessment(String title, String description, Long typeId, Long templateId, String siteId) throws Exception { // #1 - get the template (a facade) and create Assessment based on it AssessmentTemplateFacade template = getAssessmentTemplate(templateId); AssessmentData assessment = cloneAssessmentFromTemplate((AssessmentTemplateData) template .getData()); assessment.setTitle(title); assessment.setDescription(description); assessment.setTypeId(typeId); AssessmentAccessControl control = (AssessmentAccessControl) assessment .getAssessmentAccessControl(); if (control == null) { control = new AssessmentAccessControl(); } // set accessControl.releaseTo based on default setting in metaData String defaultReleaseTo = template .getAssessmentMetaDataByLabel("releaseTo"); if (("ANONYMOUS_USERS").equals(defaultReleaseTo)) { control.setReleaseTo("Anonymous Users"); } else { if (siteId == null || siteId.length() == 0) { control.setReleaseTo(AgentFacade.getCurrentSiteName()); } else { control.setReleaseTo(AgentFacade.getSiteName(siteId)); } } /* * if (AgentFacade.isStandaloneEnvironment()) * control.setReleaseTo("Authenticated Users"); else * control.setReleaseTo(AgentFacade.getCurrentSiteName()); */ EvaluationModel evaluation = (EvaluationModel) assessment .getEvaluationModel(); if (evaluation == null) { evaluation = new EvaluationModel(); } GradebookExternalAssessmentService g = null; boolean integrated = IntegrationContextFactory.getInstance() .isIntegrated(); try { if (integrated) { g = (GradebookExternalAssessmentService) SpringBeanLocator.getInstance().getBean( "org.sakaiproject.service.gradebook.GradebookExternalAssessmentService"); } GradebookServiceHelper gbsHelper = IntegrationContextFactory .getInstance().getGradebookServiceHelper(); if (!gbsHelper .gradebookExists(GradebookFacade.getGradebookUId(siteId), g)) evaluation .setToGradeBook(EvaluationModelIfc.GRADEBOOK_NOT_AVAILABLE .toString()); } catch (HibernateQueryException e) { log.warn("Gradebook Error: " + e.getMessage()); evaluation .setToGradeBook(EvaluationModelIfc.GRADEBOOK_NOT_AVAILABLE.toString()); throw new Exception(e); } return assessment; } public AssessmentFacade createAssessment(String title, String description, Long typeId, Long templateId) throws Exception { return createAssessment(title, description, typeId, templateId, null); } public AssessmentFacade createAssessment(String title, String description, Long typeId, Long templateId, String siteId) throws Exception { // this assessment comes with a default section AssessmentData assessment = null; try { assessment = prepareAssessment(title, description, typeId, templateId, siteId); } catch (Exception e) { throw new Exception(e); } int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount() .intValue(); while (retryCount > 0) { try { getHibernateTemplate().save(assessment); retryCount = 0; } catch (Exception e) { log.warn("problem saving assessment: " + e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper().retryDeadlock(e, retryCount); } } // register assessmnet with current site registerWithSite(assessment.getAssessmentId().toString(), siteId); return new AssessmentFacade(assessment); } private void registerWithSite(String qualifierIdString, String siteId) { if (siteId == null || siteId.length() == 0) { PersistenceService.getInstance().getAuthzQueriesFacade() .createAuthorization(AgentFacade.getCurrentSiteId(), "EDIT_ASSESSMENT", qualifierIdString); } else { PersistenceService.getInstance().getAuthzQueriesFacade() .createAuthorization(siteId, "EDIT_ASSESSMENT", qualifierIdString); } } private void registerWithCurrentSite(String qualifierIdString) { registerWithSite(qualifierIdString, null); } public ArrayList getAllAssessments(String orderBy) { List list = getHibernateTemplate().find( "from AssessmentData a order by a." + orderBy); ArrayList assessmentList = new ArrayList(); for (int i = 0; i < list.size(); i++) { AssessmentData a = (AssessmentData) list.get(i); AssessmentFacade f = new AssessmentFacade(a); assessmentList.add(f); } return assessmentList; } public ArrayList getAllActiveAssessments(String orderBy) { List list = getHibernateTemplate().find( "from AssessmentData a where a.status=? order by a." + orderBy, Integer.valueOf(1)); ArrayList assessmentList = new ArrayList(); for (int i = 0; i < list.size(); i++) { AssessmentData a = (AssessmentData) list.get(i); a.setSectionSet(getSectionSetForAssessment(a)); AssessmentFacade f = new AssessmentFacade(a); assessmentList.add(f); } return assessmentList; } public ArrayList getBasicInfoOfAllActiveAssessments(String orderBy, boolean ascending) { String query = "select new AssessmentData(a.assessmentBaseId, a.title, a.lastModifiedDate)from AssessmentData a where a.status=? order by a." + orderBy; if (ascending) { query += " asc"; } else { query += " desc"; } List list = getHibernateTemplate().find(query, Integer.valueOf(1)); ArrayList assessmentList = new ArrayList(); for (int i = 0; i < list.size(); i++) { AssessmentData a = (AssessmentData) list.get(i); AssessmentFacade f = new AssessmentFacade(a.getAssessmentBaseId(), a.getTitle(), a.getLastModifiedDate()); assessmentList.add(f); } return assessmentList; } public ArrayList getBasicInfoOfAllActiveAssessmentsByAgent(String orderBy, final String siteAgentId, boolean ascending) { // Get the list of assessment StringBuilder sb = new StringBuilder("select new AssessmentData(a.assessmentBaseId, a.title, a.lastModifiedDate, a.lastModifiedBy) "); sb.append("from AssessmentData a, AuthorizationData z where a.status=? and "); sb.append("a.assessmentBaseId=z.qualifierId and z.functionId=? "); sb.append("and z.agentIdString=? order by a."); sb.append(orderBy); String query = sb.toString(); if (ascending) query += " asc"; else query += " desc"; final String hql = query; HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery(hql); q.setInteger(0, 1); q.setString(1, "EDIT_ASSESSMENT"); q.setString(2, siteAgentId); return q.list(); }; }; List list = getHibernateTemplate().executeFind(hcb); // Get the number of question in each assessment HashMap questionSizeMap = new HashMap(); HibernateCallback hcb2 = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { StringBuilder sb2 = new StringBuilder("select a.assessmentBaseId, count(*) "); sb2.append("from ItemData i, SectionData s, AssessmentData a, AuthorizationData z "); sb2.append("where a = s.assessment and s = i.section and a.assessmentBaseId = z.qualifierId "); sb2.append("and z.functionId=? and z.agentIdString=? "); sb2.append("group by a.assessmentBaseId "); Query q2 = session.createQuery(sb2.toString()); q2.setString(0, "EDIT_ASSESSMENT"); q2.setString(1, siteAgentId); return q2.list(); }; }; List questionSizeList = getHibernateTemplate().executeFind(hcb2); Iterator iter = questionSizeList.iterator(); while (iter.hasNext()) { Object o[] = (Object[]) iter.next(); questionSizeMap.put(o[0], o[1]); } ArrayList assessmentList = new ArrayList(); String lastModifiedBy = ""; AgentFacade agent = null; for (int i = 0; i < list.size(); i++) { AssessmentData a = (AssessmentData) list.get(i); agent = new AgentFacade(a.getLastModifiedBy()); if (agent != null) { lastModifiedBy = agent.getDisplayName(); } int questionSize = 0; if (questionSizeMap.get(a.getAssessmentBaseId()) != null) { questionSize = (Integer) questionSizeMap.get(a.getAssessmentBaseId()); } AssessmentFacade f = new AssessmentFacade(a.getAssessmentBaseId(), a.getTitle(), a.getLastModifiedDate(), lastModifiedBy, questionSize); assessmentList.add(f); } return assessmentList; } public ArrayList getBasicInfoOfAllActiveAssessmentsByAgent(String orderBy, final String siteAgentId) { final String query = "select new AssessmentData(a.assessmentBaseId, a.title, a.lastModifiedDate) " + " from AssessmentData a, AuthorizationData z where a.status=? and " + " a.assessmentBaseId=z.qualifierId and z.functionId=? " + " and z.agentIdString=? order by a." + orderBy; HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery(query); q.setInteger(0, 1); q.setString(1, "EDIT_ASSESSMENT"); q.setString(2, siteAgentId); return q.list(); }; }; List list = getHibernateTemplate().executeFind(hcb); // List list = getHibernateTemplate().find(query, // new Object[] {siteAgentId}, // new org.hibernate.type.Type[] {Hibernate.STRING}); ArrayList assessmentList = new ArrayList(); for (int i = 0; i < list.size(); i++) { AssessmentData a = (AssessmentData) list.get(i); AssessmentFacade f = new AssessmentFacade(a.getAssessmentBaseId(), a.getTitle(), a.getLastModifiedDate()); assessmentList.add(f); } return assessmentList; } public AssessmentFacade getBasicInfoOfAnAssessment(Long assessmentId) { AssessmentData a = (AssessmentData) getHibernateTemplate().load( AssessmentData.class, assessmentId); AssessmentFacade f = new AssessmentFacade(a.getAssessmentBaseId(), a .getTitle(), a.getLastModifiedDate()); f.setCreatedBy(a.getCreatedBy()); return f; } public ArrayList getSettingsOfAllActiveAssessments(String orderBy) { List list = getHibernateTemplate().find( "from AssessmentData a where a.status=? order by a." + orderBy, 1); ArrayList assessmentList = new ArrayList(); // IMPORTANT: // 1. we do not want any Section info, so set loadSection to false // 2. We have also declared SectionData as lazy loading. If loadSection // is set // to true, we will see null pointer Boolean loadSection = Boolean.FALSE; for (int i = 0; i < list.size(); i++) { AssessmentData a = (AssessmentData) list.get(i); AssessmentFacade f = new AssessmentFacade(a, loadSection); assessmentList.add(f); } return assessmentList; } public ArrayList getAllAssessments(int pageSize, int pageNumber, String orderBy) { String queryString = "from AssessmentData a order by a." + orderBy; PagingUtilQueriesAPI pagingUtilQueries = PersistenceService .getInstance().getPagingUtilQueries(); List pageList = pagingUtilQueries.getAll(pageSize, pageNumber, queryString); ArrayList assessmentList = new ArrayList(); for (int i = 0; i < pageList.size(); i++) { AssessmentData a = (AssessmentData) pageList.get(i); AssessmentFacade f = new AssessmentFacade(a); // log.debug("**** assessment facade Id=" + f.getAssessmentId()); assessmentList.add(f); } return assessmentList; } public int getQuestionSize(final Long assessmentId) { HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session .createQuery("select count(i) from ItemData i, SectionData s, AssessmentData a where a = s.assessment and s = i.section and a.assessmentBaseId=?"); q.setLong(0, assessmentId.longValue()); return q.list(); }; }; List size = getHibernateTemplate().executeFind(hcb); // List size = getHibernateTemplate().find( // "select count(i) from ItemData i, SectionData s, AssessmentData a // where a = s.assessment and s = i.section and a.assessmentBaseId=?", // new Object[] {assessmentId} // , new org.hibernate.type.Type[] {Hibernate.LONG}); Iterator iter = size.iterator(); if (iter.hasNext()) { int i = ((Integer) iter.next()).intValue(); return i; } else { return 0; } } public void deleteAllSecuredIP(AssessmentIfc assessment) { int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount() .intValue(); while (retryCount > 0) { try { Long assessmentId = assessment.getAssessmentId(); List ip = getHibernateTemplate() .find( "from SecuredIPAddress s where s.assessment.assessmentBaseId=?", assessmentId); if (ip.size() > 0) { SecuredIPAddress s = (SecuredIPAddress) ip.get(0); AssessmentData a = (AssessmentData) s.getAssessment(); a.setSecuredIPAddressSet(new HashSet()); getHibernateTemplate().deleteAll(ip); retryCount = 0; } else retryCount = 0; } catch (Exception e) { log.warn("problem deleting ip address: " + e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper().retryDeadlock(e, retryCount); } } } public void saveOrUpdate(AssessmentFacade assessment) { AssessmentData data = (AssessmentData) assessment.getData(); data.setLastModifiedBy(AgentFacade.getAgentString()); data.setLastModifiedDate(new Date()); int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount() .intValue(); while (retryCount > 0) { try { getHibernateTemplate().saveOrUpdate(data); retryCount = 0; } catch (Exception e) { log.warn("problem save new settings: " + e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper().retryDeadlock(e, retryCount); } } } public void deleteAllMetaData(AssessmentBaseIfc t) { int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount() .intValue(); while (retryCount > 0) { try { List metadatas = getHibernateTemplate() .find( "from AssessmentMetaData a where a.assessment.assessmentBaseId = ?", t.getAssessmentBaseId()); if (metadatas.size() > 0) { AssessmentMetaDataIfc m = (AssessmentMetaDataIfc) metadatas .get(0); AssessmentBaseIfc a = (AssessmentBaseIfc) m.getAssessment(); a.setAssessmentMetaDataSet(new HashSet()); getHibernateTemplate().deleteAll(metadatas); retryCount = 0; } else retryCount = 0; } catch (Exception e) { log.warn("problem deleting metadata: " + e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper().retryDeadlock(e, retryCount); } } } public void saveOrUpdate(final AssessmentTemplateData template) { template.setLastModifiedBy(AgentFacade.getAgentString()); template.setLastModifiedDate(new Date()); int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount() .intValue(); while (retryCount > 0) { try { getHibernateTemplate().saveOrUpdate(template); retryCount = 0; } catch (Exception e) { log.warn("problem save or update template: " + e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper().retryDeadlock(e, retryCount); } } } public void deleteTemplate(Long templateId) { int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount() .intValue(); while (retryCount > 0) { try { getHibernateTemplate().delete( getAssessmentTemplate(templateId).getData()); retryCount = 0; } catch (Exception e) { log.warn("problem delete template: " + e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper().retryDeadlock(e, retryCount); } } } public SectionFacade addSection(Long assessmentId) { // #1 - get the assessment and attach teh new section to it // we are working with Data instead of Facade in this method but should // return // SectionFacade at the end AssessmentData assessment = loadAssessment(assessmentId); // lazy loading on sectionSet, so need to initialize it Set sectionSet = getSectionSetForAssessment(assessment); assessment.setSectionSet(sectionSet); // #2 - will called the section "Section d" here d is the total no. of // section in // this assessment // #2 section has no default name - per Marc's new mockup SectionData section = new SectionData(null, Integer.valueOf(sectionSet.size() + 1), // NEXT section "", "", TypeD.DEFAULT_SECTION, SectionData.ACTIVE_STATUS, AgentFacade.getAgentString(), new Date(), AgentFacade .getAgentString(), new Date()); section.setAssessment(assessment); section.setAssessmentId(assessment.getAssessmentId()); // add default part type, and question Ordering section.addSectionMetaData(SectionDataIfc.AUTHOR_TYPE, SectionDataIfc.QUESTIONS_AUTHORED_ONE_BY_ONE.toString()); section.addSectionMetaData(SectionDataIfc.QUESTIONS_ORDERING, SectionDataIfc.AS_LISTED_ON_ASSESSMENT_PAGE.toString()); sectionSet.add(section); int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount() .intValue(); while (retryCount > 0) { try { getHibernateTemplate().saveOrUpdate(section); retryCount = 0; } catch (Exception e) { log .warn("problem save or update assessment: " + e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper().retryDeadlock(e, retryCount); } } return new SectionFacade(section); } public SectionFacade getSection(Long sectionId) { SectionData section = (SectionData) getHibernateTemplate().load( SectionData.class, sectionId); return new SectionFacade(section); } public void removeSection(Long sectionId) { SectionData section = loadSection(sectionId); if (section != null) { // need to check that items in the selected section is not // associated // with any pool QuestionPoolService qpService = new QuestionPoolService(); HashMap h = qpService.getQuestionPoolItemMap(); checkForQuestionPoolItem(section, h); AssessmentData assessment = (AssessmentData) section .getAssessment(); assessment.setLastModifiedBy(AgentFacade.getAgentString()); assessment.setLastModifiedDate(new Date()); // lazy loading on sectionSet, so need to initialize it Set sectionSet = getSectionSetForAssessment(assessment); assessment.setSectionSet(sectionSet); ArrayList sections = assessment.getSectionArraySorted(); // need to reorder the remaining section HashSet set = new HashSet(); int count = 1; for (int i = 0; i < sections.size(); i++) { SectionData s = (SectionData) sections.get(i); if (!(s.getSectionId()).equals(section.getSectionId())) { s.setSequence(Integer.valueOf(count++)); set.add(s); } } assessment.setSectionSet(set); int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount() .intValue(); while (retryCount > 0) { try { getHibernateTemplate().update(assessment); // sections // reordered retryCount = 0; } catch (Exception e) { log.warn("problem updating asssessment: " + e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper() .retryDeadlock(e, retryCount); } } // get list of attachment in section AssessmentService service = new AssessmentService(); List sectionAttachmentList = service .getSectionResourceIdList(section); service.deleteResources(sectionAttachmentList); // remove assessment retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount() .intValue(); while (retryCount > 0) { try { getHibernateTemplate().delete(section); retryCount = 0; } catch (Exception e) { log.warn("problem deletint section: " + e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper() .retryDeadlock(e, retryCount); } } } } public SectionData loadSection(Long sectionId) { return (SectionData) getHibernateTemplate().load(SectionData.class, sectionId); } public void saveOrUpdateSection(SectionFacade section) { int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount() .intValue(); while (retryCount > 0) { try { getHibernateTemplate().saveOrUpdate(section.getData()); retryCount = 0; } catch (Exception e) { log.warn("problem save or update section: " + e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper().retryDeadlock(e, retryCount); } } } /** * This method return a list of ItemData belings to the section with the * given sectionId * * @param sectionId * @return */ private List loadAllItems(Long sectionId) { return getHibernateTemplate().find( "from ItemData i where i.section.sectionId=" + sectionId); } /** * This method move a set of questions form one section to another * * @param sourceSectionId * @param destSectionId */ public void moveAllItems(Long sourceSectionId, Long destSectionId) { SectionData destSection = loadSection(destSectionId); List list = loadAllItems(sourceSectionId); Set set = destSection.getItemSet(); if (set == null) { set = new HashSet(); } int itemNum = set.size(); for (int i = 0; i < list.size(); i++) { ItemDataIfc a = (ItemDataIfc) list.get(i); a.setSection(destSection); a.setSequence(Integer.valueOf(++itemNum)); set.add(a); } destSection.setItemSet(set); int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount() .intValue(); while (retryCount > 0) { try { getHibernateTemplate().update(destSection); retryCount = 0; } catch (Exception e) { log.warn("problem updating section: " + e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper().retryDeadlock(e, retryCount); } } } /** * This method remove a set of questions form one section that is random * draw * * @param sourceSectionId */ public void removeAllItems(Long sourceSectionId) { SectionData section = loadSection(sourceSectionId); AssessmentData assessment = (AssessmentData) section.getAssessment(); assessment.setLastModifiedBy(AgentFacade.getAgentString()); assessment.setLastModifiedDate(new Date()); Set itemSet = section.getItemSet(); // HashSet newItemSet = new HashSet(); Iterator iter = itemSet.iterator(); // log.debug("***itemSet before=" + itemSet.size()); while (iter.hasNext()) { ItemData item = (ItemData) iter.next(); // item belongs to a pool, set section=null so // item won't get deleted during section deletion item.setSection(null); int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount() .intValue(); while (retryCount > 0) { try { getHibernateTemplate().update(item); retryCount = 0; } catch (Exception e) { log.warn("problem updating item: " + e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper() .retryDeadlock(e, retryCount); } } } // update assessment info (LastModifiedBy and LastModifiedDate) int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount() .intValue(); while (retryCount > 0) { try { getHibernateTemplate().update(assessment); // sections // reordered retryCount = 0; } catch (Exception e) { log.warn("problem updating asssessment: " + e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper().retryDeadlock(e, retryCount); } } // need to reload the section again. // section= loadSection(sourceSectionId); // section.setItemSet(newItemSet); // getHibernateTemplate().update(section); } // sakai2.0 we want to scope it by creator, users can only see their // templates plus the "Default Template" public ArrayList getBasicInfoOfAllActiveAssessmentTemplates(String orderBy) { final String agent = AgentFacade.getAgentString(); final Long typeId = TypeD.TEMPLATE_SYSTEM_DEFINED; final String query = "select new AssessmentTemplateData(a.assessmentBaseId, a.title, a.lastModifiedDate, a.typeId)" + " from AssessmentTemplateData a where a.status=1 and (a.assessmentBaseId=? or" + " a.createdBy=? or typeId=?) order by a." + orderBy; HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery(query); q.setLong(0, Long.valueOf(1)); q.setString(1, agent); q.setLong(2, typeId.longValue()); return q.list(); }; }; List list = getHibernateTemplate().executeFind(hcb); // List list = getHibernateTemplate().find(query, // new Object[]{agent}, // new org.hibernate.type.Type[] {Hibernate.STRING}); ArrayList assessmentList = new ArrayList(); for (int i = 0; i < list.size(); i++) { AssessmentTemplateData a = (AssessmentTemplateData) list.get(i); AssessmentTemplateFacade f = new AssessmentTemplateFacade(a .getAssessmentBaseId(), a.getTitle(), a .getLastModifiedDate(), a.getTypeId()); assessmentList.add(f); } return assessmentList; } public void checkForQuestionPoolItem(AssessmentData assessment, HashMap qpItemHash) { Set sectionSet = getSectionSetForAssessment(assessment); Iterator iter = sectionSet.iterator(); while (iter.hasNext()) { SectionData s = (SectionData) iter.next(); checkForQuestionPoolItem(s, qpItemHash); } } public void checkForQuestionPoolItem(SectionData section, HashMap qpItemHash) { Set itemSet = section.getItemSet(); HashSet newItemSet = new HashSet(); Iterator iter = itemSet.iterator(); // log.debug("***itemSet before=" + itemSet.size()); while (iter.hasNext()) { ItemData item = (ItemData) iter.next(); if (qpItemHash.get(item.getItemId().toString()) != null) { // item belongs to a pool, in this case, set section=null so // item won't get deleted during section deletion item.setSection(null); int retryCount = PersistenceService.getInstance().getPersistenceHelper() .getRetryCount().intValue(); while (retryCount > 0) { try { getHibernateTemplate().update(item); retryCount = 0; } catch (Exception e) { log.warn("problem updating item: " + e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper() .retryDeadlock(e, retryCount); } } } else { newItemSet.add(item); } } // log.debug("***itemSet after=" + newItemSet.size()); section.setItemSet(newItemSet); int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount() .intValue(); while (retryCount > 0) { try { getHibernateTemplate().update(section); retryCount = 0; } catch (Exception e) { log.warn("problem updating section: " + e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper().retryDeadlock(e, retryCount); } } } public boolean assessmentTitleIsUnique(final Long assessmentBaseId, String title, Boolean isTemplate) { title = title.trim(); final String currentSiteId = AgentFacade.getCurrentSiteId(); final String agentString = AgentFacade.getAgentString(); List list; boolean isUnique = true; String query = ""; if (isTemplate.booleanValue()) { // templates are person scoped query = "select new AssessmentTemplateData(a.assessmentBaseId, a.title, a.lastModifiedDate)" + " from AssessmentTemplateData a, AuthorizationData z where " + " a.title=? and a.assessmentBaseId!=? and a.createdBy=? and a.status=?"; final String hql = query; final String titlef = title; HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery(hql); q.setString(0, titlef); q.setLong(1, assessmentBaseId.longValue()); q.setString(2, agentString); q.setInteger(3,1); return q.list(); }; }; list = getHibernateTemplate().executeFind(hcb); // list = getHibernateTemplate().find(query, // new Object[]{title,assessmentBaseId,agentString}, // new org.hibernate.type.Type[] {Hibernate.STRING, Hibernate.LONG, // Hibernate.STRING}); } else { // assessments are site scoped query = "select new AssessmentData(a.assessmentBaseId, a.title, a.lastModifiedDate)" + " from AssessmentData a, AuthorizationData z where " + " a.title=? and a.assessmentBaseId!=? and z.functionId=? and " + " a.assessmentBaseId=z.qualifierId and z.agentIdString=? and a.status=?"; final String hql = query; final String titlef = title; HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery(hql); q.setString(0, titlef); q.setLong(1, assessmentBaseId.longValue()); q.setString(2, "EDIT_ASSESSMENT"); q.setString(3, currentSiteId); q.setInteger(4,1); return q.list(); }; }; list = getHibernateTemplate().executeFind(hcb); // list = getHibernateTemplate().find(query, // new Object[]{title,assessmentBaseId,currentSiteId}, // new org.hibernate.type.Type[] {Hibernate.STRING, Hibernate.LONG, // Hibernate.STRING}); } if (list.size() > 0) { // query in mysql & hsqldb are not case sensitive, check that title // found is indeed what we // are looking for (int i = 0; i < list.size(); i++) { AssessmentBaseIfc a = (AssessmentBaseIfc) list.get(i); if ((title).equals(a.getTitle().trim())) { isUnique = false; break; } } } return isUnique; } public List getAssessmentByTemplate(final Long templateId) { final String query = "select new AssessmentData(a.assessmentBaseId, a.title, a.lastModifiedDate) " + " from AssessmentData a where a.assessmentTemplateId=?"; HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery(query); q.setLong(0, templateId.longValue()); return q.list(); }; }; return getHibernateTemplate().executeFind(hcb); // return getHibernateTemplate().find(query, // new Object[]{ templateId }, // new org.hibernate.type.Type[] { Hibernate.LONG }); } public List getDefaultMetaDataSet() { final String query = " from AssessmentMetaData m where m.assessment.assessmentBaseId=?"; HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery(query); q.setLong(0, 1L); return q.list(); }; }; return getHibernateTemplate().executeFind(hcb); // return getHibernateTemplate().find(query, // new Object[]{ new Long(1) }, // new org.hibernate.type.Type[] { Hibernate.LONG }); } public long fileSizeInKB(long fileSize) { return fileSize / 1024; } public String getRelativePath(String url, String protocol) { // replace whitespace with %20 url = replaceSpace(url); int index = url.lastIndexOf(protocol); if (index == 0) { url = url.substring(protocol.length()); } return url; } private String replaceSpace(String tempString) { String newString = ""; char[] oneChar = new char[1]; for (int i = 0; i < tempString.length(); i++) { if (tempString.charAt(i) != ' ') { oneChar[0] = tempString.charAt(i); String concatString = new String(oneChar); newString = newString.concat(concatString); } else { newString = newString.concat("%20"); } } return newString; } public void removeItemAttachment(Long itemAttachmentId) { ItemAttachment itemAttachment = (ItemAttachment) getHibernateTemplate() .load(ItemAttachment.class, itemAttachmentId); ItemDataIfc item = itemAttachment.getItem(); // String resourceId = itemAttachment.getResourceId(); 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.getItemAttachmentSet(); set.remove(itemAttachment); getHibernateTemplate().delete(itemAttachment); retryCount = 0; } } catch (Exception e) { log.warn("problem delete itemAttachment: " + e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper().retryDeadlock(e, retryCount); } } } public void updateAssessmentLastModifiedInfo( AssessmentFacade assessment) { int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount() .intValue(); AssessmentData data = (AssessmentData) assessment.getData(); data.setLastModifiedBy(AgentFacade.getAgentString()); data.setLastModifiedDate(new Date()); retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount() .intValue(); while (retryCount > 0) { try { getHibernateTemplate().update(data); retryCount = 0; } catch (Exception e) { log.warn("problem update assessment: " + e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper().retryDeadlock(e, retryCount); } } } public ItemAttachmentIfc createItemAttachment(ItemDataIfc item, String resourceId, String filename, String protocol, boolean isEditPendingAssessmentFlow) { ItemAttachmentIfc attach = null; Boolean isLink = Boolean.FALSE; try { ContentResource cr = AssessmentService.getContentHostingService().getResource(resourceId); if (cr != null) { ResourceProperties p = cr.getProperties(); if (isEditPendingAssessmentFlow) { attach = new ItemAttachment(); } else { attach = new PublishedItemAttachment(); } attach.setItem(item); attach.setResourceId(resourceId); attach.setMimeType(cr.getContentType()); // we want to display kb, so divide by 1000 and round the result attach.setFileSize(fileSizeInKB(cr.getContentLength())); if (cr.getContentType().lastIndexOf("url") > -1) { isLink = Boolean.TRUE; if (!filename.toLowerCase().startsWith("http")) { String adjustedFilename = "http://" + filename; attach.setFilename(adjustedFilename); } else { attach.setFilename(filename); } } else { attach.setFilename(filename); } attach.setIsLink(isLink); attach.setStatus(ItemAttachmentIfc.ACTIVE_STATUS); attach.setCreatedBy(p.getProperty(p.getNamePropCreator())); attach.setCreatedDate(new Date()); attach.setLastModifiedBy(p.getProperty(p .getNamePropModifiedBy())); attach.setLastModifiedDate(new Date()); attach.setLocation(getRelativePath(cr.getUrl(), protocol)); // getHibernateTemplate().save(attach); } } catch (PermissionException pe) { pe.printStackTrace(); } catch (IdUnusedException ie) { ie.printStackTrace(); } catch (TypeException te) { te.printStackTrace(); } return attach; } public SectionAttachmentIfc createSectionAttachment(SectionDataIfc section, String resourceId, String filename, String protocol) { SectionAttachment attach = null; Boolean isLink = Boolean.FALSE; try { ContentResource cr = AssessmentService.getContentHostingService().getResource(resourceId); if (cr != null) { ResourceProperties p = cr.getProperties(); attach = new SectionAttachment(); attach.setSection(section); attach.setResourceId(resourceId); attach.setMimeType(cr.getContentType()); // we want to display kb, so divide by 1000 and round the result attach.setFileSize(fileSizeInKB(cr.getContentLength())); if (cr.getContentType().lastIndexOf("url") > -1) { isLink = Boolean.TRUE; if (!filename.toLowerCase().startsWith("http")) { String adjustedFilename = "http://" + filename; attach.setFilename(adjustedFilename); } else { attach.setFilename(filename); } } else { attach.setFilename(filename); } attach.setIsLink(isLink); attach.setStatus(SectionAttachmentIfc.ACTIVE_STATUS); attach.setCreatedBy(p.getProperty(p.getNamePropCreator())); attach.setCreatedDate(new Date()); attach.setLastModifiedBy(p.getProperty(p .getNamePropModifiedBy())); attach.setLastModifiedDate(new Date()); attach.setLocation(getRelativePath(cr.getUrl(), protocol)); // getHibernateTemplate().save(attach); } } catch (PermissionException pe) { pe.printStackTrace(); } catch (IdUnusedException ie) { ie.printStackTrace(); } catch (TypeException te) { te.printStackTrace(); } return attach; } public void removeSectionAttachment(Long sectionAttachmentId) { SectionAttachment sectionAttachment = (SectionAttachment) getHibernateTemplate() .load(SectionAttachment.class, sectionAttachmentId); SectionDataIfc section = sectionAttachment.getSection(); // String resourceId = sectionAttachment.getResourceId(); int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount() .intValue(); while (retryCount > 0) { try { if (section != null) { // need to dissociate with section // before deleting in Hibernate 3 Set set = section.getSectionAttachmentSet(); set.remove(sectionAttachment); getHibernateTemplate().delete(sectionAttachment); retryCount = 0; } } catch (Exception e) { log.warn("problem delete sectionAttachment: " + e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper().retryDeadlock(e, retryCount); } } } public AssessmentAttachmentIfc createAssessmentAttachment( AssessmentIfc assessment, String resourceId, String filename, String protocol) { AssessmentAttachment attach = null; Boolean isLink = Boolean.FALSE; try { ContentResource cr = AssessmentService.getContentHostingService().getResource(resourceId); if (cr != null) { ResourceProperties p = cr.getProperties(); attach = new AssessmentAttachment(); attach.setAssessment(assessment); attach.setResourceId(resourceId); attach.setFilename(filename); attach.setMimeType(cr.getContentType()); // we want to display kb, so divide by 1000 and round the result attach.setFileSize(fileSizeInKB(cr.getContentLength())); if (cr.getContentType().lastIndexOf("url") > -1) { isLink = Boolean.TRUE; if (!filename.toLowerCase().startsWith("http")) { String adjustedFilename = "http://" + filename; attach.setFilename(adjustedFilename); } else { attach.setFilename(filename); } } else { attach.setFilename(filename); } attach.setIsLink(isLink); attach.setStatus(AssessmentAttachmentIfc.ACTIVE_STATUS); attach.setCreatedBy(p.getProperty(p.getNamePropCreator())); attach.setCreatedDate(new Date()); attach.setLastModifiedBy(p.getProperty(p .getNamePropModifiedBy())); attach.setLastModifiedDate(new Date()); attach.setLocation(getRelativePath(cr.getUrl(), protocol)); // getHibernateTemplate().save(attach); } } catch (PermissionException pe) { pe.printStackTrace(); } catch (IdUnusedException ie) { ie.printStackTrace(); } catch (TypeException te) { te.printStackTrace(); } return attach; } public void removeAssessmentAttachment(Long assessmentAttachmentId) { AssessmentAttachment assessmentAttachment = (AssessmentAttachment) getHibernateTemplate() .load(AssessmentAttachment.class, assessmentAttachmentId); AssessmentIfc assessment = assessmentAttachment.getAssessment(); // String resourceId = assessmentAttachment.getResourceId(); int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount() .intValue(); while (retryCount > 0) { try { if (assessment != null) { // need to dissociate with // assessment before deleting in // Hibernate 3 Set set = assessment.getAssessmentAttachmentSet(); set.remove(assessmentAttachment); getHibernateTemplate().delete(assessmentAttachment); retryCount = 0; } } catch (Exception e) { log.warn("problem delete assessmentAttachment: " + e.getMessage()); retryCount = PersistenceService.getInstance().getPersistenceHelper().retryDeadlock(e, retryCount); } } } public AttachmentData createEmailAttachment(String resourceId, String filename, String protocol) { AttachmentData attach = null; Boolean isLink = Boolean.FALSE; try { ContentResource cr = AssessmentService.getContentHostingService().getResource(resourceId); if (cr != null) { ResourceProperties p = cr.getProperties(); attach = new AttachmentData(); attach.setResourceId(resourceId); attach.setMimeType(cr.getContentType()); // we want to display kb, so divide by 1000 and round // the result attach.setFileSize(fileSizeInKB(cr.getContentLength())); if (cr.getContentType().lastIndexOf("url") > -1) { isLink = Boolean.TRUE; if (!filename.toLowerCase().startsWith("http")) { String adjustedFilename = "http://" + filename; attach.setFilename(adjustedFilename); } else { attach.setFilename(filename); } } else { attach.setFilename(filename); } attach.setIsLink(isLink); attach.setStatus(SectionAttachmentIfc.ACTIVE_STATUS); attach.setCreatedBy(p.getProperty(p.getNamePropCreator())); attach.setCreatedDate(new Date()); attach.setLastModifiedBy(p.getProperty(p .getNamePropModifiedBy())); attach.setLastModifiedDate(new Date()); attach.setLocation(getRelativePath(cr.getUrl(), protocol)); } } catch (PermissionException pe) { pe.printStackTrace(); } catch (IdUnusedException ie) { ie.printStackTrace(); } catch (TypeException te) { te.printStackTrace(); } return attach; } public void saveOrUpdateAttachments(List list) { getHibernateTemplate().saveOrUpdateAll(list); } public List getAllActiveAssessmentsByAgent(final String siteAgentId) { final String query = "select a " + " from AssessmentData a,AuthorizationData z where a.status=? and " + "a.assessmentBaseId=z.qualifierId and z.functionId=? " + " and z.agentIdString=?"; HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery(query); q.setInteger(0, 1); q.setString(1, "EDIT_ASSESSMENT"); q.setString(2, siteAgentId); return q.list(); }; }; return getHibernateTemplate().executeFind(hcb); } public void copyAllAssessments(String fromContext, String toContext) { List list = getAllActiveAssessmentsByAgent(fromContext); ArrayList newList = new ArrayList(); for (int i = 0; i < list.size(); i++) { AssessmentData a = (AssessmentData) list.get(i); log.debug("****protocol:" + ServerConfigurationService.getServerUrl()); AssessmentData new_a = prepareAssessment(a, ServerConfigurationService.getServerUrl(), toContext); newList.add(new_a); } getHibernateTemplate().saveOrUpdateAll(newList); // write // authorization for (int i = 0; i < newList.size(); i++) { AssessmentData a = (AssessmentData) newList.get(i); PersistenceService.getInstance().getAuthzQueriesFacade() .createAuthorization(toContext, "EDIT_ASSESSMENT", a.getAssessmentId().toString()); HashMap assessmentMetaDataMap = a.getAssessmentMetaDataMap(); if (!assessmentMetaDataMap.containsKey("markForReview_isInstructorEditable")) { a.addAssessmentMetaData("markForReview_isInstructorEditable", "true"); a.getAssessmentAccessControl().setMarkForReview(1); } // reset PARTID in ItemMetaData to the section of the newly created section Set sectionSet = a.getSectionSet(); Iterator sectionIter = sectionSet.iterator(); while (sectionIter.hasNext()) { SectionData section = (SectionData) sectionIter.next(); Set itemSet = section.getItemSet(); Iterator itemIter = itemSet.iterator(); while (itemIter.hasNext()) { ItemData item = (ItemData) itemIter.next(); Set itemMetaDataSet = item.getItemMetaDataSet(); Iterator itemMetaDataIter = itemMetaDataSet.iterator(); while (itemMetaDataIter.hasNext()) { ItemMetaData itemMetaData = (ItemMetaData) itemMetaDataIter.next(); if (itemMetaData.getLabel() != null && itemMetaData.getLabel().equals(ItemMetaDataIfc.PARTID)) { log.debug("sectionId = " + section.getSectionId()); itemMetaData.setEntry(section.getSectionId().toString()); } } } } } getHibernateTemplate().saveOrUpdateAll(newList); // write } public void copyAssessment(String assessmentId, String apepndCopyTitle) { AssessmentData assessmentData = loadAssessment(Long.valueOf(assessmentId)); assessmentData.setSectionSet(getSectionSetForAssessment(assessmentData)); AssessmentData newAssessmentData = prepareAssessment(assessmentData, ServerConfigurationService.getServerUrl(), AgentFacade.getCurrentSiteId()); updateTitleForCopy(newAssessmentData, apepndCopyTitle); getHibernateTemplate().saveOrUpdate(newAssessmentData); // authorization PersistenceService.getInstance().getAuthzQueriesFacade() .createAuthorization(AgentFacade.getCurrentSiteId(), "EDIT_ASSESSMENT", newAssessmentData.getAssessmentId().toString()); // reset PARTID in ItemMetaData to the section of the newly created section Set sectionSet = newAssessmentData.getSectionSet(); Iterator sectionIter = sectionSet.iterator(); while (sectionIter.hasNext()) { SectionData section = (SectionData) sectionIter.next(); Set itemSet = section.getItemSet(); Iterator itemIter = itemSet.iterator(); while (itemIter.hasNext()) { ItemData item = (ItemData) itemIter.next(); Set itemMetaDataSet = item.getItemMetaDataSet(); Iterator itemMetaDataIter = itemMetaDataSet.iterator(); while (itemMetaDataIter.hasNext()) { ItemMetaData itemMetaData = (ItemMetaData) itemMetaDataIter.next(); if (itemMetaData.getLabel() != null && itemMetaData.getLabel().equals(ItemMetaDataIfc.PARTID)) { log.debug("sectionId = " + section.getSectionId()); itemMetaData.setEntry(section.getSectionId().toString()); } } } } getHibernateTemplate().saveOrUpdate(newAssessmentData); } private void updateTitleForCopy(AssessmentData assessmentData, String apepndCopyTitle){ //String apepndCopyTitle = ContextUtil.getLocalizedString("org.sakaiproject.tool.assessment.bundle.AuthorMessages", "append_copy_title"); StringBuffer sb = new StringBuffer(assessmentData.getTitle()); sb.append(" "); sb.append(apepndCopyTitle); String newTitle = getNewAssessmentTitleForCopy(sb.toString()); assessmentData.setTitle(newTitle); } private String getNewAssessmentTitleForCopy(String title) { title = title.trim(); log.debug(title); final String currentSiteId = AgentFacade.getCurrentSiteId(); String query = "select a.title" + " from AssessmentData a, AuthorizationData z where " + " a.title like ? and z.functionId='EDIT_ASSESSMENT' and " + " a.assessmentBaseId=z.qualifierId and z.agentIdString=?"; final String hql = query; final String titlef = title + "%"; HibernateCallback hcb = new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery(hql); q.setString(0, titlef); q.setString(1, currentSiteId); return q.list(); }; }; List list = getHibernateTemplate().executeFind(hcb); int startIndex = title.length(); int maxNumCopy = 0; if (list.size() > 0) { // query in mysql & hsqldb are not case sensitive, check that title // found is indeed what we // are looking for (int i = 0; i < list.size(); i++) { String existingTitle = ((String) list.get(i)).trim(); if (existingTitle.startsWith(title)) { try{ int numCopy = Integer.parseInt(existingTitle.substring(startIndex)); if (numCopy > maxNumCopy) { maxNumCopy = numCopy; } } catch(NumberFormatException e){ log.error("existingTitle = " + existingTitle + ", title = " + title + ", startIndex = " + startIndex + ", error message: " + e.getMessage()); } } } } log.debug("maxNumCopy = " + maxNumCopy); int nextNumCopy = maxNumCopy + 1; String newAssessmentTitle = title + nextNumCopy; return newAssessmentTitle; } public AssessmentData prepareAssessment(AssessmentData a, String protocol, String toContext) { AssessmentData newAssessment = new AssessmentData(new Long("0"), a .getTitle(), a.getDescription(), a.getComments(), a.getAssessmentTemplateId(), TypeFacade.HOMEWORK, a.getInstructorNotification(), a .getTesteeNotification(), a.getMultipartAllowed(), a .getStatus(), AgentFacade.getAgentString(), new Date(), AgentFacade.getAgentString(), new Date()); // section set Set newSectionSet = prepareSectionSet(newAssessment, a.getSectionSet(), protocol, toContext); newAssessment.setSectionSet(newSectionSet); // access control AssessmentAccessControl newAccessControl = prepareAssessmentAccessControl( newAssessment, (AssessmentAccessControl) a .getAssessmentAccessControl()); newAssessment.setAssessmentAccessControl(newAccessControl); // evaluation model EvaluationModel newEvaluationModel = prepareEvaluationModel( newAssessment, (EvaluationModel) a.getEvaluationModel()); newAssessment.setEvaluationModel(newEvaluationModel); // feedback AssessmentFeedback newFeedback = prepareAssessmentFeedback( newAssessment, (AssessmentFeedback) a.getAssessmentFeedback()); newAssessment.setAssessmentFeedback(newFeedback); // metadata Set newMetaDataSet = prepareAssessmentMetaDataSet(newAssessment, a .getAssessmentMetaDataSet()); log.debug(" metadata set" + a.getAssessmentMetaDataSet()); log.debug(" new metadata set" + newMetaDataSet); newAssessment.setAssessmentMetaDataSet(newMetaDataSet); // let's check if we need a newUrl String releaseTo = newAccessControl.getReleaseTo(); if (releaseTo != null) { boolean anonymousAllowed = ((releaseTo) .indexOf(AuthoringConstantStrings.ANONYMOUS) > -1); if (anonymousAllowed) { // generate an alias to the pub assessment String alias = AgentFacade.getAgentString() + (new Date()).getTime(); AssessmentMetaData meta = new AssessmentMetaData(newAssessment, "ALIAS", alias); newMetaDataSet.add(meta); newAssessment.setAssessmentMetaDataSet(newMetaDataSet); } else { // if it's not anonymous, then set it to the whole site (removes group access too) if(toContext != null){ releaseTo = toContext; try{ Site toSite = SiteService.getSite(toContext); releaseTo = toSite.getTitle(); }catch (IdUnusedException e) { log.debug("IdUnusedException: " + e.getMessage()); } newAccessControl.setReleaseTo(releaseTo); } } } else { releaseTo = toContext; try{ Site toSite = SiteService.getSite(toContext); releaseTo = toSite.getTitle(); }catch (IdUnusedException e) { log.debug("IdUnusedException: " + e.getMessage()); } newAccessControl.setReleaseTo(releaseTo); } // IPAddress Set newIPSet = prepareSecuredIPSet(newAssessment, a .getSecuredIPAddressSet()); newAssessment.setSecuredIPAddressSet(newIPSet); // attachmentSet Set newAssessmentAttachmentSet = prepareAssessmentAttachmentSet( newAssessment, a.getAssessmentAttachmentSet(), protocol, toContext); newAssessment.setAssessmentAttachmentSet(newAssessmentAttachmentSet); return newAssessment; } public AssessmentData prepareAssessment(AssessmentData a, String protocol) { return prepareAssessment(a, protocol, null); } public AssessmentFeedback prepareAssessmentFeedback(AssessmentData p, AssessmentFeedback a) { if (a == null) { return null; } AssessmentFeedback newFeedback = new AssessmentFeedback(a .getFeedbackDelivery(), a.getFeedbackComponentOption(),a.getFeedbackAuthoring(), a .getEditComponents(), a.getShowQuestionText(), a .getShowStudentResponse(), a.getShowCorrectResponse(), a .getShowStudentScore(), a.getShowStudentQuestionScore(), a .getShowQuestionLevelFeedback(), a .getShowSelectionLevelFeedback(), a.getShowGraderComments(), a .getShowStatistics()); newFeedback.setAssessmentBase(p); return newFeedback; } public AssessmentAccessControl prepareAssessmentAccessControl( AssessmentData p, AssessmentAccessControl a) { if (a == null) { return new AssessmentAccessControl(); } AssessmentAccessControl newAccessControl = new AssessmentAccessControl( a.getSubmissionsAllowed(), a.getSubmissionsSaved(), a .getAssessmentFormat(), a.getBookMarkingItem(), a .getTimeLimit(), a.getTimedAssessment(), a .getRetryAllowed(), a.getLateHandling(), a .getStartDate(), a.getDueDate(), a.getScoreDate(), a .getFeedbackDate(), a.getRetractDate(), a .getAutoSubmit(), a.getItemNavigation(), a .getItemNumbering(), a.getSubmissionMessage(), a .getReleaseTo()); newAccessControl.setUsername(a.getUsername()); newAccessControl.setPassword(a.getPassword()); newAccessControl.setFinalPageUrl(a.getFinalPageUrl()); newAccessControl.setUnlimitedSubmissions(a.getUnlimitedSubmissions()); newAccessControl.setAssessmentBase(p); newAccessControl.setMarkForReview(a.getMarkForReview()); return newAccessControl; } public EvaluationModel prepareEvaluationModel(AssessmentData p, EvaluationModel e) { if (e == null) { return null; } EvaluationModel newEvaluationModel = new EvaluationModel(e .getEvaluationComponents(), e.getScoringType(), e .getNumericModelId(), e.getFixedTotalScore(), e .getGradeAvailable(), e.getIsStudentIdPublic(), e .getAnonymousGrading(), e.getAutoScoring(), e.getToGradeBook()); newEvaluationModel.setAssessmentBase(p); return newEvaluationModel; } public Set prepareAssessmentMetaDataSet(AssessmentData p, Set metaDataSet) { HashSet h = new HashSet(); Iterator i = metaDataSet.iterator(); while (i.hasNext()) { AssessmentMetaData metaData = (AssessmentMetaData) i.next(); AssessmentMetaData newMetaData = new AssessmentMetaData(p, metaData .getLabel(), metaData.getEntry()); h.add(newMetaData); } return h; } public Set prepareSecuredIPSet(AssessmentData p, Set ipSet) { HashSet h = new HashSet(); Iterator i = ipSet.iterator(); while (i.hasNext()) { SecuredIPAddress ip = (SecuredIPAddress) i.next(); SecuredIPAddress newIP = new SecuredIPAddress(p, ip.getHostname(), ip.getIpAddress()); h.add(newIP); } return h; } public Set prepareSectionSet(AssessmentData newAssessment, Set sectionSet, String protocol, String toContext) { log.debug("new section size = " + sectionSet.size()); HashSet h = new HashSet(); Iterator i = sectionSet.iterator(); while (i.hasNext()) { SectionData section = (SectionData) i.next(); // TODO note: 4/28 need to check if a part is random draw , if it is // then need to add questions from pool to this section, at this // point, SectionData newSection = new SectionData(section.getDuration(), section.getSequence(), section.getTitle(), section .getDescription(), section.getTypeId(), section .getStatus(), section.getCreatedBy(), section .getCreatedDate(), section.getLastModifiedBy(), section.getLastModifiedDate()); Set newSectionAttachmentSet = prepareSectionAttachmentSet( newSection, section.getSectionAttachmentSet(), protocol, toContext); newSection.setSectionAttachmentSet(newSectionAttachmentSet); Set newItemSet = prepareItemSet(newSection, section.getItemSet(), protocol, toContext); newSection.setItemSet(newItemSet); Set newMetaDataSet = prepareSectionMetaDataSet(newSection, section .getSectionMetaDataSet()); newSection.setSectionMetaDataSet(newMetaDataSet); newSection.setAssessment(newAssessment); h.add(newSection); } return h; } public Set prepareSectionSet(AssessmentData newAssessment, Set sectionSet, String protocol) { return prepareSectionSet(newAssessment, sectionSet, protocol, null); } public Set prepareSectionMetaDataSet(SectionData newSection, Set metaDataSet) { HashSet h = new HashSet(); Iterator n = metaDataSet.iterator(); while (n.hasNext()) { SectionMetaData sectionMetaData = (SectionMetaData) n.next(); SectionMetaData newSectionMetaData = new SectionMetaData( newSection, sectionMetaData.getLabel(), sectionMetaData .getEntry()); h.add(newSectionMetaData); } return h; } public Set prepareItemSet(SectionData newSection, Set itemSet, String protocol, String toContext) { log.debug("new item size = " + itemSet.size()); HashSet h = new HashSet(); Iterator j = itemSet.iterator(); while (j.hasNext()) { ItemData item = (ItemData) j.next(); ItemData newItem = new ItemData(newSection, 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, // set ItemTextSet, itemMetaDataSet and // itemFeedbackSet later item.getTriesAllowed(), item.getPartialCreditFlag()); Set newItemTextSet = prepareItemTextSet(newItem, item .getItemTextSet()); Set newItemMetaDataSet = prepareItemMetaDataSet(newItem, item .getItemMetaDataSet()); Set newItemFeedbackSet = prepareItemFeedbackSet(newItem, item .getItemFeedbackSet()); Set newItemAttachmentSet = prepareItemAttachmentSet(newItem, item .getItemAttachmentSet(), protocol, toContext); newItem.setItemTextSet(newItemTextSet); newItem.setItemMetaDataSet(newItemMetaDataSet); newItem.setItemFeedbackSet(newItemFeedbackSet); newItem.setItemAttachmentSet(newItemAttachmentSet); h.add(newItem); } return h; } public Set prepareItemSet(SectionData newSection, Set itemSet, String protocol) { return prepareItemSet(newSection, itemSet, protocol, null); } public Set prepareItemTextSet(ItemData newItem, Set itemTextSet) { log.debug("new item text size = " + itemTextSet.size()); HashSet h = new HashSet(); Iterator k = itemTextSet.iterator(); while (k.hasNext()) { ItemText itemText = (ItemText) k.next(); log.debug("item text id =" + itemText.getId()); ItemText newItemText = new ItemText(newItem, itemText.getSequence(), itemText.getText(), null); Set newAnswerSet = prepareAnswerSet(newItemText, itemText .getAnswerSet()); newItemText.setAnswerSet(newAnswerSet); h.add(newItemText); } return h; } public Set prepareItemMetaDataSet(ItemData newItem, Set itemMetaDataSet) { HashSet h = new HashSet(); Iterator n = itemMetaDataSet.iterator(); while (n.hasNext()) { ItemMetaData itemMetaData = (ItemMetaData) n.next(); ItemMetaData newItemMetaData = new ItemMetaData(newItem, itemMetaData.getLabel(), itemMetaData.getEntry()); h.add(newItemMetaData); } return h; } public Set prepareItemFeedbackSet(ItemData newItem, Set itemFeedbackSet) { HashSet h = new HashSet(); Iterator o = itemFeedbackSet.iterator(); while (o.hasNext()) { ItemFeedback itemFeedback = (ItemFeedback) o.next(); ItemFeedback newItemFeedback = new ItemFeedback(newItem, itemFeedback.getTypeId(), itemFeedback.getText()); h.add(newItemFeedback); } return h; } public Set prepareItemAttachmentSet(ItemData newItem, Set itemAttachmentSet, String protocol, String toContext) { HashSet h = new HashSet(); Iterator o = itemAttachmentSet.iterator(); while (o.hasNext()) { ItemAttachment itemAttachment = (ItemAttachment) o.next(); try { // create a copy of the resource AssessmentService service = new AssessmentService(); ContentResource cr_copy = service.createCopyOfContentResource( itemAttachment.getResourceId(), itemAttachment .getFilename(), toContext); // get relative path String url = getRelativePath(cr_copy.getUrl(), protocol); ItemAttachment newItemAttachment = new ItemAttachment(null, newItem, cr_copy.getId(), itemAttachment.getFilename(), itemAttachment.getMimeType(), itemAttachment .getFileSize(), itemAttachment.getDescription(), url, itemAttachment .getIsLink(), itemAttachment.getStatus(), itemAttachment.getCreatedBy(), itemAttachment .getCreatedDate(), itemAttachment .getLastModifiedBy(), itemAttachment .getLastModifiedDate()); h.add(newItemAttachment); } catch (Exception e) { log.warn(e.getMessage()); } } return h; } public Set prepareItemAttachmentSet(ItemData newItem, Set itemAttachmentSet, String protocol) { return prepareItemAttachmentSet(newItem, itemAttachmentSet, protocol, null); } public Set prepareSectionAttachmentSet(SectionData newSection, Set sectionAttachmentSet, String protocol, String toContext) { HashSet h = new HashSet(); Iterator o = sectionAttachmentSet.iterator(); while (o.hasNext()) { SectionAttachment sectionAttachment = (SectionAttachment) o.next(); // create a copy of the resource AssessmentService service = new AssessmentService(); ContentResource cr_copy = service.createCopyOfContentResource( sectionAttachment.getResourceId(), sectionAttachment .getFilename(), toContext); // get relative path String url = getRelativePath(cr_copy.getUrl(), protocol); SectionAttachment newSectionAttachment = new SectionAttachment( null, newSection, cr_copy.getId(), sectionAttachment .getFilename(), sectionAttachment.getMimeType(), sectionAttachment.getFileSize(), sectionAttachment .getDescription(), url, sectionAttachment .getIsLink(), sectionAttachment.getStatus(), sectionAttachment.getCreatedBy(), sectionAttachment .getCreatedDate(), sectionAttachment .getLastModifiedBy(), sectionAttachment .getLastModifiedDate()); h.add(newSectionAttachment); } return h; } public Set prepareSectionAttachmentSet(SectionData newSection, Set sectionAttachmentSet, String protocol) { return prepareSectionAttachmentSet(newSection, sectionAttachmentSet, protocol, null); } public Set prepareAssessmentAttachmentSet(AssessmentData newAssessment, Set assessmentAttachmentSet, String protocol, String toContext) { HashSet h = new HashSet(); Iterator o = assessmentAttachmentSet.iterator(); while (o.hasNext()) { AssessmentAttachment assessmentAttachment = (AssessmentAttachment) o .next(); // create a copy of the resource AssessmentService service = new AssessmentService(); ContentResource cr_copy = service.createCopyOfContentResource( assessmentAttachment.getResourceId(), assessmentAttachment .getFilename(), toContext); // get relative path String url = getRelativePath(cr_copy.getUrl(), protocol); AssessmentAttachment newAssessmentAttachment = new AssessmentAttachment( null, newAssessment, cr_copy.getId(), assessmentAttachment .getFilename(), assessmentAttachment.getMimeType(), assessmentAttachment.getFileSize(), assessmentAttachment .getDescription(), url, assessmentAttachment .getIsLink(), assessmentAttachment.getStatus(), assessmentAttachment.getCreatedBy(), assessmentAttachment .getCreatedDate(), assessmentAttachment .getLastModifiedBy(), assessmentAttachment .getLastModifiedDate()); h.add(newAssessmentAttachment); } return h; } public Set prepareAssessmentAttachmentSet(AssessmentData newAssessment, Set assessmentAttachmentSet, String protocol) { return prepareAssessmentAttachmentSet(newAssessment, assessmentAttachmentSet, protocol, null); } public Set prepareAnswerSet(ItemText newItemText, Set answerSet) { log.debug("new answer size = " + answerSet.size()); 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 = prepareAnswerFeedbackSet(newAnswer, answer.getAnswerFeedbackSet()); newAnswer.setAnswerFeedbackSet(newAnswerFeedbackSet); h.add(newAnswer); } return h; } public Set prepareAnswerFeedbackSet(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; } public String getAssessmentSiteId (String assessmentId){ String query = "select a from AuthorizationData a where "+ " a.functionId=? and a.qualifierId=?"; Object [] values = {"EDIT_ASSESSMENT", assessmentId}; List l = getHibernateTemplate().find(query, values); if (l.size()>0){ AuthorizationData a = (AuthorizationData) l.get(0); return a.getAgentIdString(); } else return null; } public String getAssessmentCreatedBy(String assessmentId) { String query = "select a from AssessmentData a where a.assessmentBaseId = ?"; List l = getHibernateTemplate().find(query, Long.valueOf(assessmentId)); if (l.size()>0){ AssessmentData a = (AssessmentData) l.get(0); return a.getCreatedBy(); } else return null; } public Set copyItemAttachmentSet(ItemData newItem, Set itemAttachmentSet) { HashSet h = new HashSet(); Iterator o = itemAttachmentSet.iterator(); while (o.hasNext()) { ItemAttachment itemAttachment = (ItemAttachment) o.next(); try { // create a copy of the resource AssessmentService service = new AssessmentService(); ContentResource cr_copy = service.createCopyOfContentResource( itemAttachment.getResourceId(), itemAttachment .getFilename()); // get relative path String url = getRelativePath(cr_copy.getUrl(), ServerConfigurationService.getServerUrl()); ItemAttachment newItemAttachment = new ItemAttachment(null, newItem, cr_copy.getId(), itemAttachment.getFilename(), itemAttachment.getMimeType(), itemAttachment.getFileSize(), itemAttachment.getDescription(), url, itemAttachment.getIsLink(), itemAttachment.getStatus(), AgentFacade.getAgentString(), new Date(), AgentFacade.getAgentString(), new Date()); h.add(newItemAttachment); } catch (Exception e) { log.warn(e.getMessage()); } } return h; } }