From 3041f2637bb83f4adf280ad3019ebbd6e549c152 Mon Sep 17 00:00:00 2001 From: Leonardo Canessa Date: Thu, 15 Sep 2016 17:11:48 -0400 Subject: [PATCH] SAM-2970 Refactor Extended Time Front end is working. Jquery date selector only for new items. When saving the extended time entries, all new entries are compared to what is in the database by ID. If there are no matches than (that is an old entry is not present in the new ones), than that entry is removed. (see saveExtendedTimeEntriesHelper within ExtendedTimeFacade.java). ExtendedTimeDeliveryService is used as a medium for the delivery aspect of the assessments. This has been modified to use the new ExtendedTime entries. This should reduce the testing load necessary. Entries are validating when an assessment is published / all ready published exam is saved. All done except for auto-submit. Minor testing done KNOWN BUG (probably all ready present): When viewing the submissions on the totalScores.jsp page, assessments will be marked LATE even though they where submitted within the users extended time window. --- .../sass/modules/tool/samigo/_samigo.scss | 47 ++ .../PublishedAssessmentServiceAPI.java | 4 +- samigo/samigo-app/pom.xml | 6 +- .../AssessmentSettingsMessages.properties | 27 +- .../bean/author/AssessmentSettingsBean.java | 220 ++++--- .../PublishedAssessmentSettingsBean.java | 216 ++++--- .../ui/bean/delivery/DeliveryBean.java | 38 +- .../ConfirmPublishAssessmentListener.java | 160 ++++- .../author/PublishAssessmentListener.java | 16 +- .../author/SaveAssessmentSettings.java | 60 +- .../author/SavePublishedSettingsListener.java | 217 +++++-- .../delivery/BeginDeliveryActionListener.java | 27 +- .../delivery/DeliveryActionListener.java | 17 +- .../listener/select/SelectActionListener.java | 83 ++- .../samigo-app/src/webapp/js/extendedTime.js | 295 --------- .../src/webapp/jsf/author/authorSettings.jsp | 26 +- .../webapp/jsf/author/inc/extendedTime.jspf | 147 ++++- .../jsf/author/inc/publishedExtendedTime.jspf | 149 ++++- .../webapp/jsf/author/publishedSettings.jsp | 1 - .../data/dao/assessment/ExtendedTime.hbm.xml | 42 ++ .../data/dao/assessment/ExtendedTime.java | 111 ++++ samigo/samigo-impl/pom.xml | 4 + .../src/webapp/WEB-INF/components.xml | 25 +- .../AssessmentGradingFacadeQueries.java | 22 +- .../assessment/facade/ExtendedTimeFacade.java | 129 ++++ .../facade/ExtendedTimeQueries.java | 159 +++++ .../facade/ExtendedTimeQueriesAPI.java | 92 +++ .../PublishedAssessmentFacadeQueries.java | 577 ++---------------- .../PublishedAssessmentFacadeQueriesAPI.java | 76 +-- .../services/PersistenceService.java | 22 +- .../PublishedAssessmentService.java | 85 +-- .../PublishedAssessmentServiceImpl.java | 21 +- .../util/ExtendedTimeDeliveryService.java | 211 +++++++ .../assessment/util/ExtendedTimeService.java | 262 -------- 34 files changed, 1828 insertions(+), 1766 deletions(-) delete mode 100644 samigo/samigo-app/src/webapp/js/extendedTime.js create mode 100644 samigo/samigo-hibernate/src/java/org/sakaiproject/tool/assessment/data/dao/assessment/ExtendedTime.hbm.xml create mode 100644 samigo/samigo-hibernate/src/java/org/sakaiproject/tool/assessment/data/dao/assessment/ExtendedTime.java create mode 100644 samigo/samigo-services/src/java/org/sakaiproject/tool/assessment/facade/ExtendedTimeFacade.java create mode 100644 samigo/samigo-services/src/java/org/sakaiproject/tool/assessment/facade/ExtendedTimeQueries.java create mode 100644 samigo/samigo-services/src/java/org/sakaiproject/tool/assessment/facade/ExtendedTimeQueriesAPI.java create mode 100644 samigo/samigo-services/src/java/org/sakaiproject/tool/assessment/util/ExtendedTimeDeliveryService.java delete mode 100644 samigo/samigo-services/src/java/org/sakaiproject/tool/assessment/util/ExtendedTimeService.java diff --git a/reference/library/src/morpheus-master/sass/modules/tool/samigo/_samigo.scss b/reference/library/src/morpheus-master/sass/modules/tool/samigo/_samigo.scss index 88221886ae..9393882820 100644 --- a/reference/library/src/morpheus-master/sass/modules/tool/samigo/_samigo.scss +++ b/reference/library/src/morpheus-master/sass/modules/tool/samigo/_samigo.scss @@ -199,4 +199,51 @@ text-decoration:underline; } } + + .extendedTimeDataTable { + margin-bottom: .5em; + } + + .extendedTimeDataTable thead tr th { + padding-left: .5em; + border-bottom: 1px solid black; + } + + .extendedTime-user { + min-width: 130px; + } + + .extendedTime-group { + min-width: 130px; + } + + .extendedTime-start { + min-width: 250px; + } + .extendedTime-due { + min-width: 250px; + } + .extendedTime-retract { + min-width: 250px; + } + .extendedTime-hours { + min-width: 70px; + } + .extendedTime-mins { + min-width: 70px; + } + + .extendedTimeDataTable tr { + border-bottom: 1px solid lightgrey; + } + + .extendedTimeDataTable tr td { + padding-left: .25em; + padding-right: .25em; + } + + .extendedTimeEntryTable tr td { + padding-left: .25em; + padding-right: .25em; + } } diff --git a/samigo/samigo-api/src/java/org/sakaiproject/tool/assessment/shared/api/assessment/PublishedAssessmentServiceAPI.java b/samigo/samigo-api/src/java/org/sakaiproject/tool/assessment/shared/api/assessment/PublishedAssessmentServiceAPI.java index 81f0586404..0a8ccce9b7 100755 --- a/samigo/samigo-api/src/java/org/sakaiproject/tool/assessment/shared/api/assessment/PublishedAssessmentServiceAPI.java +++ b/samigo/samigo-api/src/java/org/sakaiproject/tool/assessment/shared/api/assessment/PublishedAssessmentServiceAPI.java @@ -61,9 +61,7 @@ public List getAllPublishedAssessments( public PublishedAssessmentIfc getPublishedAssessment(String assessmentId); public Long getPublishedAssessmentId(String assessmentId); - - public PublishedAssessmentIfc publishAssessment(AssessmentIfc assessment); - + public PublishedAssessmentIfc publishPreviewAssessment(AssessmentIfc assessment, String protocol); diff --git a/samigo/samigo-app/pom.xml b/samigo/samigo-app/pom.xml index c810e89c51..3b28d327ee 100644 --- a/samigo/samigo-app/pom.xml +++ b/samigo/samigo-app/pom.xml @@ -252,7 +252,11 @@ jar compile - + + org.sakaiproject.samigo + samigo-impl + + diff --git a/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/bundle/AssessmentSettingsMessages.properties b/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/bundle/AssessmentSettingsMessages.properties index a7424a92d5..9a8357ce7d 100755 --- a/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/bundle/AssessmentSettingsMessages.properties +++ b/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/bundle/AssessmentSettingsMessages.properties @@ -306,7 +306,32 @@ selectFromFavorites=Select from Favorites # Extended time extendedTimeHeading=Exceptions to Time Limit and Delivery Date -extendedTimeAdd=Add a Time Limit/Delivery Date Exception. +extendedTimeAdd=Add a Time Limit/Delivery Date Exception +extendedTimeEdit=Update a Time Limit / Delivery Date Exception +extendedTimeCancel=Cancel +header_extendedTime_user=User +header_extendedTime_group=Group +header_extendedTime_start_date=Start Date +header_extendedTime_due_date=Due Date +header_extendedTime_retract_date=Retract Date +header_extendedTime_hours=Hours +header_extendedTime_minutes=Minutes +header_extendedTime_delete=Delete +header_extendedTime_edit=Edit +extendedTime_select_group=Select Group +extendedTime_select_User=Select User +extendedTime_data_table_title=Extended time entry data table. +extendedTime_entry_table_title=Add/edit an extended time entry. + +# Extended Time Errors +extended_time_user_and_group_set=User OR group must be set for extended time entry, with user '{0}' and group '{1}'. +extended_time_due_earlier_than_available=The Due Date cannot be earlier than the Start Date for extended time entry user '{0}' / group '{1}'. +extended_time_retract_earlier_than_available=The Retract Date cannot be earlier than the Available Date / Due Date for extended time entry user '{0}' / group '{1}'. +extended_time_due_same_as_available=The Due Date cannot be the same as the Available Date for extended time entry user '{0}' / group '{1}'. +extended_time_name_not_found=N/A +extended_time_duplicate_users=Entries may not be duplicated. Duplicate extended time entries detected for the following users: {0}. +extended_time_duplicate_groups=Entries may not be duplicated. Duplicate extended time entries detected for the following groups: {0}. +extended_time_and=& # Expand Collapse expandAll=Expand All diff --git a/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/bean/author/AssessmentSettingsBean.java b/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/bean/author/AssessmentSettingsBean.java index f9d7fcf1e2..1bc8e62024 100644 --- a/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/bean/author/AssessmentSettingsBean.java +++ b/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/bean/author/AssessmentSettingsBean.java @@ -1,15 +1,11 @@ -/********************************************************************************** - * $URL$ - * $Id$ - *********************************************************************************** - * - * Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009 The Sakai Foundation +/* + * Copyright (c) 2016, The Apereo 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 + * http://opensource.org/licenses/ecl2 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -17,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - **********************************************************************************/ + */ @@ -35,7 +31,6 @@ import java.util.Map; import java.util.Set; import java.util.TreeMap; -import java.util.TimeZone; import javax.faces.application.FacesMessage; import javax.faces.context.ExternalContext; import javax.faces.context.FacesContext; @@ -50,6 +45,7 @@ import org.sakaiproject.exception.IdUnusedException; import org.sakaiproject.exception.PermissionException; import org.sakaiproject.exception.TypeException; +import org.sakaiproject.tool.assessment.facade.*; import org.sakaiproject.samigo.util.SamigoConstants; import org.sakaiproject.section.api.SectionAwareness; import org.sakaiproject.section.api.coursemanagement.EnrollmentRecord; @@ -60,6 +56,7 @@ import org.sakaiproject.tool.api.ToolSession; import org.sakaiproject.tool.assessment.api.SamigoApiFactory; import org.sakaiproject.tool.assessment.data.dao.assessment.AssessmentAccessControl; +import org.sakaiproject.tool.assessment.data.dao.assessment.ExtendedTime; import org.sakaiproject.tool.assessment.data.dao.authz.AuthorizationData; import org.sakaiproject.tool.assessment.data.ifc.assessment.AssessmentAccessControlIfc; import org.sakaiproject.tool.assessment.data.ifc.assessment.AssessmentFeedbackIfc; @@ -69,9 +66,6 @@ import org.sakaiproject.tool.assessment.data.ifc.assessment.EvaluationModelIfc; import org.sakaiproject.tool.assessment.data.ifc.assessment.RegisteredSecureDeliveryModuleIfc; import org.sakaiproject.tool.assessment.data.ifc.assessment.SecuredIPAddressIfc; -import org.sakaiproject.tool.assessment.facade.AgentFacade; -import org.sakaiproject.tool.assessment.facade.AssessmentFacade; -import org.sakaiproject.tool.assessment.facade.AuthzQueriesFacadeAPI; import org.sakaiproject.tool.assessment.integration.context.IntegrationContextFactory; import org.sakaiproject.tool.assessment.integration.helper.ifc.GradebookServiceHelper; import org.sakaiproject.tool.assessment.integration.helper.ifc.PublishingTargetHelper; @@ -85,8 +79,6 @@ import org.sakaiproject.tool.cover.ToolManager; import org.sakaiproject.util.FormattedText; import org.sakaiproject.util.ResourceLoader; -import org.sakaiproject.time.cover.TimeService; -import org.sakaiproject.tool.assessment.util.ExtendedTimeService; /** * @@ -210,8 +202,10 @@ public class AssessmentSettingsBean private String releaseToGroupsAsString; private String blockDivs; - private String extendedTimes; - private SelectItem[] extendedTimeTargets; + private List extendedTimes; + private ExtendedTime extendedTime; + private ExtendedTime transitoryExtendedTime; + private boolean editingExtendedTime = false; // SAM-2323 jQuery-UI datepicker private final TimeUtil tu = new TimeUtil(); @@ -222,10 +216,13 @@ public class AssessmentSettingsBean private SimpleDateFormat displayFormat; + private ResourceLoader assessmentSettingMessages; + /* * Creates a new AssessmentBean object. */ public AssessmentSettingsBean() { + this.assessmentSettingMessages = new ResourceLoader("org.sakaiproject.tool.assessment.bundle.AssessmentSettingsMessages"); } public AssessmentFacade getAssessment() { @@ -283,19 +280,10 @@ public void setAssessment(AssessmentFacade assessment) { this.bgImageSelect=null; this.bgColorSelect="1"; } - - // Get the extended time information for this assessment - short extendedTimeCount = 1; - String extendedTimeLabel = "extendedTime" + extendedTimeCount; - this.extendedTimes = ""; - while ((assessment.getAssessmentMetaDataByLabel(extendedTimeLabel) != null) - && (!assessment.getAssessmentMetaDataByLabel(extendedTimeLabel).equals(""))) { - // server stores in JVM's time zone, convert to user's time zone - String extendedTimeValue = ExtendedTimeService.convertZones(assessment.getAssessmentMetaDataByLabel(extendedTimeLabel), TimeZone.getDefault(), TimeService.getLocalTimeZone()); - this.extendedTimes = this.extendedTimes.concat(extendedTimeValue + "^"); - extendedTimeCount++; - extendedTimeLabel = "extendedTime" + extendedTimeCount; - } + ExtendedTimeFacade extendedTimeFacade = PersistenceService.getInstance().getExtendedTimeFacade(); + this.extendedTimes = extendedTimeFacade.getEntriesForAss(assessment.getData()); + + resetExtendedTime(); // these are properties in AssessmentAccessControl AssessmentAccessControlIfc accessControl; @@ -398,20 +386,6 @@ public void setAssessment(AssessmentFacade assessment) { String currentSiteId = AgentFacade.getCurrentSiteId(); this.gradebookExists = gbsHelper.isGradebookExist(currentSiteId); - - this.extendedTimeTargets = initExtendedTimeTargets(); - - /* - GradebookService g = null; - if (integrated) - { - g = (GradebookService) SpringBeanLocator.getInstance(). - getBean("org.sakaiproject.service.gradebook.GradebookService"); - } - - this.gradebookExists = gbsHelper.gradebookExists( - GradebookFacade.getGradebookUId(), g); - */ } // ip addresses @@ -1296,17 +1270,17 @@ public SelectItem[] getPublishingTargets(){ Iterator iter = e.iterator(); int numSelections = getNumberOfGroupsForSite() > 0 ? 3 : 2; SelectItem[] target = new SelectItem[numSelections]; - ResourceLoader rb = new ResourceLoader("org.sakaiproject.tool.assessment.bundle.AssessmentSettingsMessages"); + while (iter.hasNext()){ String t = (String)iter.next(); if ("Anonymous Users".equals(t)) { - target[0] = new SelectItem(t, rb.getString("anonymous_users")); + target[0] = new SelectItem(t, assessmentSettingMessages.getString("anonymous_users")); } else if (numSelections == 3 && t.equals(AssessmentAccessControl.RELEASE_TO_SELECTED_GROUPS)) { - target[2] = new SelectItem(t, rb.getString("selected_groups")); + target[2] = new SelectItem(t, assessmentSettingMessages.getString("selected_groups")); } else if (t.equals(AgentFacade.getCurrentSiteName())) { - target[1] = new SelectItem(t, rb.getString("entire_site")); + target[1] = new SelectItem(t, assessmentSettingMessages.getString("entire_site")); } } return target; @@ -1544,6 +1518,17 @@ public SelectItem[] getGroupsForSite(){ } return groupSelectItems; } + + public SelectItem[] getGroupsForSiteWithNoGroup() { + SelectItem[] items = getGroupsForSite(); + SelectItem[] itemsWithNoGroup = new SelectItem[items.length + 1]; + itemsWithNoGroup[0] = new SelectItem("", assessmentSettingMessages.getString("extendedTime_select_group")); + for(int i = 1; i <= items.length; i++) { + itemsWithNoGroup[i] = items[i-1]; + } + + return itemsWithNoGroup; + } /** @@ -1662,47 +1647,36 @@ public SelectItem[] getSecureDeliverModuleSelections() { return selections; } - public void setExtendedTimes(String extendedTimes) { + + public void setExtendedTimes(List extendedTimes) { this.extendedTimes = extendedTimes; } - public String getExtendedTimes() { + public List getExtendedTimes() { return extendedTimes; } + public int getExtendedTimesSize() { + return this.extendedTimes.size(); + } + /** - * Populate the select item list of extended time targets - * + * * @return */ - public SelectItem[] initExtendedTimeTargets() { - SelectItem[] extTimeSelectItems = null; + public SelectItem[] getUsersInSite() { + SelectItem[] usersInSite = null; Site site; try { site = SiteService.getSite(ToolManager.getCurrentPlacement().getContext()); - Collection groups = site.getGroups(); SectionAwareness sectionAwareness = PersistenceService.getInstance().getSectionAwareness(); // List sections = sectionAwareness.getSections(site.getId()); List enrollments = sectionAwareness.getSiteMembersInRole(site.getId(), Role.STUDENT); // Treemaps are used here because they auto-sort - TreeMap groupTargets = new TreeMap<>(); TreeMap studentTargets = new TreeMap<>(); - // Add groups to target set - if (groups != null && groups.size() > 0) { - Iterator groupIter = groups.iterator(); - while (groupIter.hasNext()) { - Group group = (Group) groupIter.next(); - if (!group.getTitle().startsWith("Access: ")) // do not - // include - // Lessons - // groups - groupTargets.put("Group: " + group.getTitle(), group.getId()); - } - } - // Add students to target set if (enrollments != null && enrollments.size() > 0) { for (Iterator iter = enrollments.iterator(); iter.hasNext();) { @@ -1717,40 +1691,106 @@ public SelectItem[] initExtendedTimeTargets() { // key so it would // be alphabetized. Now we pull it out and build the select item // list. - int listSize = 1 + groupTargets.size() + studentTargets.size(); - extTimeSelectItems = new SelectItem[listSize]; - extTimeSelectItems[0] = new SelectItem("1", "Select User/Group"); + int listSize = 1 + studentTargets.size(); + usersInSite = new SelectItem[listSize]; + usersInSite[0] = new SelectItem("", assessmentSettingMessages.getString("extendedTime_select_User")); int selectCount = 1; - // Add in groups to select item list - Set keySet = groupTargets.keySet(); - Iterator iter = keySet.iterator(); - while (iter.hasNext()) { - String alphaName = (String) iter.next(); - String sakaiId = (String) groupTargets.get(alphaName); - extTimeSelectItems[selectCount++] = new SelectItem(sakaiId, alphaName); - } - // Add in students to select item list - keySet = studentTargets.keySet(); - iter = keySet.iterator(); + Set keySet = studentTargets.keySet(); + Iterator iter = keySet.iterator(); while (iter.hasNext()) { String alphaName = (String) iter.next(); String sakaiId = (String) studentTargets.get(alphaName); - extTimeSelectItems[selectCount++] = new SelectItem(sakaiId, alphaName); + usersInSite[selectCount++] = new SelectItem(sakaiId, alphaName); } } catch (IdUnusedException ex) { // No site available } - return extTimeSelectItems; + return usersInSite; } - public SelectItem[] getExtendedTimeTargets() { - return extendedTimeTargets; - } + public ExtendedTime getExtendedTime() { + return this.extendedTime; + } - public void setExtendedTimeTargets(SelectItem[] targets) { - this.extendedTimeTargets = targets; - } + public String getExtendedTimeStartString() { + return getDisplayFormatFromDate(this.extendedTime.getStartDate()); + } + + public void setExtendedTimeStartString(String exTimeStartString) { + Date tempDate = tu.parseISO8601String(ContextUtil.lookupParam("newEntry-start_date-iso8601")); + if(tempDate != null) { + this.extendedTime.setStartDate(tempDate); + } + } + + public String getExtendedTimeDueString() { + return getDisplayFormatFromDate(this.extendedTime.getDueDate()); + } + + public void setExtendedTimeDueString(String exTimeDueString) { + Date tempDate = tu.parseISO8601String(ContextUtil.lookupParam("newEntry-due_date-iso8601")); + if(tempDate != null) { + this.extendedTime.setDueDate(tempDate); + } + } + + public String getExtendedTimeRetractString() { + return getDisplayFormatFromDate(this.extendedTime.getRetractDate()); + } + + public void setExtendedTimeRetractString(String exTimeRetractString) { + Date tempDate = tu.parseISO8601String(ContextUtil.lookupParam("newEntry-retract_date-iso8601")); + if(tempDate != null) { + this.extendedTime.setRetractDate(tempDate); + } + } + + public void setTransitoryExtendedTime(ExtendedTime newExTime) { + this.transitoryExtendedTime = newExTime; + } + + public void addExtendedTime() { + this.extendedTimes.add(this.extendedTime); + resetExtendedTime(); + } + + public void deleteExtendedTime() { + this.extendedTimes.remove(this.transitoryExtendedTime); + this.transitoryExtendedTime = null; + } + + public void editExtendedTime() { + this.editingExtendedTime = true; + this.extendedTime = new ExtendedTime(this.transitoryExtendedTime); + this.transitoryExtendedTime = null; + } + + public void saveEditedExtendedTime() { + this.editingExtendedTime = false; + Integer oldIndex = null; + // is there a more efficient way? + for(ExtendedTime entry : extendedTimes) { + if(entry.getId().equals(this.extendedTime.getId())) { + oldIndex = this.extendedTimes.indexOf(entry); + break; + } + } + this.extendedTimes.set(oldIndex, this.extendedTime); + resetExtendedTime(); + } + + public void cancelEdit() { + resetExtendedTime(); + } + + public boolean getEditingExtendedTime() { + return this.editingExtendedTime; + } + + private void resetExtendedTime() { + this.extendedTime = new ExtendedTime(this.getAssessment().getData()); + } } diff --git a/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/bean/author/PublishedAssessmentSettingsBean.java b/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/bean/author/PublishedAssessmentSettingsBean.java index 687c9d13b4..4eaf356794 100644 --- a/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/bean/author/PublishedAssessmentSettingsBean.java +++ b/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/bean/author/PublishedAssessmentSettingsBean.java @@ -35,7 +35,6 @@ import java.util.Map; import java.util.Set; import java.util.TreeMap; -import java.util.TimeZone; import javax.faces.context.ExternalContext; import javax.faces.context.FacesContext; import javax.faces.model.SelectItem; @@ -43,10 +42,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.sakaiproject.exception.IdUnusedException; +import org.sakaiproject.tool.assessment.facade.*; import org.sakaiproject.site.api.Group; import org.sakaiproject.site.api.Site; import org.sakaiproject.site.cover.SiteService; import org.sakaiproject.tool.assessment.api.SamigoApiFactory; +import org.sakaiproject.tool.assessment.data.dao.assessment.ExtendedTime; import org.sakaiproject.tool.assessment.data.dao.authz.AuthorizationData; import org.sakaiproject.content.api.ContentResource; import org.sakaiproject.content.api.FilePickerHelper; @@ -67,9 +68,6 @@ import org.sakaiproject.tool.assessment.data.ifc.assessment.EvaluationModelIfc; import org.sakaiproject.tool.assessment.data.ifc.assessment.RegisteredSecureDeliveryModuleIfc; import org.sakaiproject.tool.assessment.data.ifc.assessment.SecuredIPAddressIfc; -import org.sakaiproject.tool.assessment.facade.AgentFacade; -import org.sakaiproject.tool.assessment.facade.AuthzQueriesFacadeAPI; -import org.sakaiproject.tool.assessment.facade.PublishedAssessmentFacade; import org.sakaiproject.tool.assessment.integration.context.IntegrationContextFactory; import org.sakaiproject.tool.assessment.integration.helper.ifc.GradebookServiceHelper; import org.sakaiproject.tool.assessment.integration.helper.ifc.PublishingTargetHelper; @@ -84,8 +82,6 @@ import org.sakaiproject.tool.cover.SessionManager; import org.sakaiproject.util.ResourceLoader; import org.sakaiproject.util.FormattedText; -import org.sakaiproject.time.cover.TimeService; -import org.sakaiproject.tool.assessment.util.ExtendedTimeService; public class PublishedAssessmentSettingsBean implements Serializable { @@ -97,9 +93,6 @@ public class PublishedAssessmentSettingsBean integrationContextFactory.getPublishingTargetHelper(); private static final GradebookServiceHelper gbsHelper = integrationContextFactory.getGradebookServiceHelper(); - private static final boolean integrated = - integrationContextFactory.isIntegrated(); - private String displayDateFormat; private SimpleDateFormat displayFormat; @@ -202,8 +195,10 @@ public class PublishedAssessmentSettingsBean private String bgColorSelect; private String bgImageSelect; - private String extendedTimes; - private SelectItem[] extendedTimeTargets; + private List extendedTimes; + private ExtendedTime extendedTime; + private ExtendedTime transitoryExtendedTime; + private boolean editingExtendedTime = false; // SAM-2323 jQuery-UI datepicker private final TimeUtil tu = new TimeUtil(); @@ -211,11 +206,14 @@ public class PublishedAssessmentSettingsBean private final String HIDDEN_END_DATE_FIELD = "endDateISO8601"; private final String HIDDEN_RETRACT_DATE_FIELD = "retractDateISO8601"; private final String HIDDEN_FEEDBACK_DATE_FIELD = "feedbackDateISO8601"; + + private ResourceLoader assessmentSettingMessages; /* * Creates a new AssessmentBean object. */ public PublishedAssessmentSettingsBean() { + this.assessmentSettingMessages = new ResourceLoader("org.sakaiproject.tool.assessment.bundle.AssessmentSettingsMessages"); } public PublishedAssessmentFacade getAssessment() { @@ -254,20 +252,10 @@ public void setAssessment(PublishedAssessmentFacade assessment) { this.bgImageSelect=null; this.bgColorSelect="1"; } - // Get the extended time information for this assessment - short extendedTimeCount = 1; - String extendedTimeLabel = "extendedTime" + extendedTimeCount; - this.extendedTimes = ""; - while ((assessment.getAssessmentMetaDataByLabel(extendedTimeLabel) != null) - && (!assessment.getAssessmentMetaDataByLabel(extendedTimeLabel).equals(""))) { - // server stores in JVM's time zone, convert to user's time zone - String extendedTimeValue = ExtendedTimeService.convertZones(assessment.getAssessmentMetaDataByLabel(extendedTimeLabel), TimeZone.getDefault(), TimeService.getLocalTimeZone()); - // this.extendedTimes.add(extendedTimeValue); - // TODO: switch this back to being a list or hashmap - this.extendedTimes = this.extendedTimes.concat(extendedTimeValue + "^"); - extendedTimeCount++; - extendedTimeLabel = "extendedTime" + extendedTimeCount; - } + ExtendedTimeFacade extendedTimeFacade = PersistenceService.getInstance().getExtendedTimeFacade(); + this.extendedTimes = extendedTimeFacade.getEntriesForPub(this.assessment.getData()); + + resetExtendedTime(); setDisplayFormat(ContextUtil.getLocalizedString("org.sakaiproject.tool.assessment.bundle.GeneralMessages","output_data_picker_w_sec")); resetIsValidDate(); @@ -367,20 +355,6 @@ public void setAssessment(PublishedAssessmentFacade assessment) { String currentSiteId = AgentFacade.getCurrentSiteId(); this.gradebookExists = gbsHelper.isGradebookExist(currentSiteId); - - this.extendedTimeTargets = initExtendedTimeTargets(); - - /* - GradebookService g = null; - if (integrated) - { - g = (GradebookService) SpringBeanLocator.getInstance(). - getBean("org.sakaiproject.service.gradebook.GradebookService"); - } - - this.gradebookExists = gbsHelper.gradebookExists( - GradebookFacade.getGradebookUId(), g); - */ } //set IPAddresses @@ -405,7 +379,7 @@ public void setAssessment(PublishedAssessmentFacade assessment) { this.secureDeliveryModuleSelections = getSecureDeliverModuleSelections(); this.secureDeliveryModule = (String) values.get( SecureDeliveryServiceAPI.MODULE_KEY ); this.secureDeliveryModuleExitPassword = secureDeliveryService.decryptPassword( this.secureDeliveryModule, - (String) assessment.getAssessmentMetaDataByLabel( SecureDeliveryServiceAPI.EXITPWD_KEY ) ); + assessment.getAssessmentMetaDataByLabel( SecureDeliveryServiceAPI.EXITPWD_KEY ) ); if ( secureDeliveryModule == null ) { this.secureDeliveryModule = SecureDeliveryServiceAPI.NONE_ID; @@ -915,9 +889,7 @@ public void setValueMap(HashMap newMap) { Map.Entry entry = (Map.Entry) it.next(); String key = (String) entry.getKey(); Object o = entry.getValue(); - if (("ASSESSMENT_AUTHORS".equals(key))) - ; - else { + if (!("ASSESSMENT_AUTHORS".equals(key))) { h.put(key, o); } } @@ -1196,17 +1168,16 @@ public SelectItem[] getPublishingTargets() { Iterator iter = e.iterator(); int numSelections = getNumberOfGroupsForSite() > 0 ? 3 : 2; SelectItem[] target = new SelectItem[numSelections]; - ResourceLoader rb = new ResourceLoader("org.sakaiproject.tool.assessment.bundle.AssessmentSettingsMessages"); while (iter.hasNext()){ String t = (String)iter.next(); if (t.equals("Anonymous Users")) { - target[0] = new SelectItem(t, rb.getString("anonymous_users")); + target[0] = new SelectItem(t, assessmentSettingMessages.getString("anonymous_users")); } else if (numSelections == 3 && t.equals(AssessmentAccessControl.RELEASE_TO_SELECTED_GROUPS)) { - target[2] = new SelectItem(t, rb.getString("selected_groups")); + target[2] = new SelectItem(t, assessmentSettingMessages.getString("selected_groups")); } else if (t.equals(AgentFacade.getCurrentSiteName())) { - target[1] = new SelectItem(t, rb.getString("entire_site")); + target[1] = new SelectItem(t, assessmentSettingMessages.getString("entire_site")); } } return target; @@ -1355,6 +1326,17 @@ public SelectItem[] getGroupsForSite() { return groupSelectItems; } + public SelectItem[] getGroupsForSiteWithNoGroup() { + SelectItem[] items = getGroupsForSite(); + SelectItem[] itemsWithNoGroup = new SelectItem[items.length + 1]; + itemsWithNoGroup[0] = new SelectItem("", assessmentSettingMessages.getString("extendedTime_select_group")); + for(int i = 1; i <= items.length; i++) { + itemsWithNoGroup[i] = items[i-1]; + } + + return itemsWithNoGroup; + } + /** * Returns the total number of groups for this site * @return @@ -1555,47 +1537,35 @@ public SelectItem[] getSecureDeliverModuleSelections() { return selections; } - public void setExtendedTimes(String extendedTimes) { + public void setExtendedTimes(List extendedTimes) { this.extendedTimes = extendedTimes; } - public String getExtendedTimes() { + public List getExtendedTimes() { return extendedTimes; } + public int getExtendedTimesSize() { + return this.extendedTimes.size(); + } + /** - * Popluate the select item list of extended time targets - * + * * @return */ - public SelectItem[] initExtendedTimeTargets() { - SelectItem[] extTimeSelectItems = null; + public SelectItem[] getUsersInSite() { + SelectItem[] usersInSite = null; Site site; try { site = SiteService.getSite(ToolManager.getCurrentPlacement().getContext()); - Collection groups = site.getGroups(); SectionAwareness sectionAwareness = PersistenceService.getInstance().getSectionAwareness(); // List sections = sectionAwareness.getSections(site.getId()); List enrollments = sectionAwareness.getSiteMembersInRole(site.getId(), Role.STUDENT); // Treemaps are used here because they auto-sort - TreeMap groupTargets = new TreeMap<>(); TreeMap studentTargets = new TreeMap<>(); - // Add groups to target set - if (groups != null && groups.size() > 0) { - Iterator groupIter = groups.iterator(); - while (groupIter.hasNext()) { - Group group = (Group) groupIter.next(); - if (!group.getTitle().startsWith("Access: ")) // do not - // include - // Lessons - // groups - groupTargets.put("Group: " + group.getTitle(), group.getId()); - } - } - // Add students to target set if (enrollments != null && enrollments.size() > 0) { for (Iterator iter = enrollments.iterator(); iter.hasNext();) { @@ -1610,42 +1580,108 @@ public SelectItem[] initExtendedTimeTargets() { // key so it would // be alphabetized. Now we pull it out and build the select item // list. - int listSize = 1 + groupTargets.size() + studentTargets.size(); - extTimeSelectItems = new SelectItem[listSize]; - extTimeSelectItems[0] = new SelectItem("1", "Select User/Group"); + int listSize = 1 + studentTargets.size(); + usersInSite = new SelectItem[listSize]; + usersInSite[0] = new SelectItem("1", "Select User/Group"); int selectCount = 1; - // Add in groups to select item list - Set keySet = groupTargets.keySet(); - Iterator iter = keySet.iterator(); - while (iter.hasNext()) { - String alphaName = (String) iter.next(); - String sakaiId = (String) groupTargets.get(alphaName); - extTimeSelectItems[selectCount++] = new SelectItem(sakaiId, alphaName); - } - // Add in students to select item list - keySet = studentTargets.keySet(); - iter = keySet.iterator(); + Set keySet = studentTargets.keySet(); + Iterator iter = keySet.iterator(); while (iter.hasNext()) { String alphaName = (String) iter.next(); String sakaiId = (String) studentTargets.get(alphaName); - extTimeSelectItems[selectCount++] = new SelectItem(sakaiId, alphaName); + usersInSite[selectCount++] = new SelectItem(sakaiId, alphaName); } } catch (IdUnusedException ex) { // No site available } - return extTimeSelectItems; + return usersInSite; } - public SelectItem[] getExtendedTimeTargets() { - return extendedTimeTargets; - } + public ExtendedTime getExtendedTime() { + return this.extendedTime; + } - public void setExtendedTimeTargets(SelectItem[] targets) { - this.extendedTimeTargets = targets; - } + public String getExtendedTimeStartString() { + return getDisplayFormatFromDate(this.extendedTime.getStartDate()); + } + + public void setExtendedTimeStartString(String exTimeStartString) { + Date tempDate = tu.parseISO8601String(ContextUtil.lookupParam("newEntry-start_date-iso8601")); + if(tempDate != null) { + this.extendedTime.setStartDate(tempDate); + } + } + + public String getExtendedTimeDueString() { + return getDisplayFormatFromDate(this.extendedTime.getDueDate()); + } + + public void setExtendedTimeDueString(String exTimeDueString) { + Date tempDate = tu.parseISO8601String(ContextUtil.lookupParam("newEntry-due_date-iso8601")); + if(tempDate != null) { + this.extendedTime.setDueDate(tempDate); + } + } + + public String getExtendedTimeRetractString() { + return getDisplayFormatFromDate(this.extendedTime.getRetractDate()); + } + + public void setExtendedTimeRetractString(String exTimeRetractString) { + Date tempDate = tu.parseISO8601String(ContextUtil.lookupParam("newEntry-retract_date-iso8601")); + if(tempDate != null) { + this.extendedTime.setRetractDate(tempDate); + } + } + + public void setTransitoryExtendedTime(ExtendedTime newExTime) { + this.transitoryExtendedTime = newExTime; + } + + public void addExtendedTime() { + this.extendedTimes.add(this.extendedTime); + resetExtendedTime(); + } + + public void deleteExtendedTime() { + this.extendedTimes.remove(this.transitoryExtendedTime); + this.transitoryExtendedTime = null; + } + + public void editExtendedTime() { + this.editingExtendedTime = true; + this.extendedTime = new ExtendedTime(this.transitoryExtendedTime); + this.transitoryExtendedTime = null; + } + + public void saveEditedExtendedTime() { + this.editingExtendedTime = false; + Integer oldIndex = null; + // is there a more efficient way? + for(ExtendedTime entry : extendedTimes) { + if(entry.getId().equals(this.extendedTime.getId())) { + oldIndex = this.extendedTimes.indexOf(entry); + break; + } + } + this.extendedTimes.set(oldIndex, this.extendedTime); + resetExtendedTime(); + } + + public void cancelEdit() { + resetExtendedTime(); + } + + public boolean getEditingExtendedTime() { + return this.editingExtendedTime; + } + + private void resetExtendedTime() { + this.extendedTime = new ExtendedTime(this.getAssessment().getData()); + } public String getDisplayScoreDuringAssessments(){ return displayScoreDuringAssessments; diff --git a/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/bean/delivery/DeliveryBean.java b/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/bean/delivery/DeliveryBean.java index f1f48ae0fa..c9dab1ff96 100755 --- a/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/bean/delivery/DeliveryBean.java +++ b/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/bean/delivery/DeliveryBean.java @@ -1,15 +1,11 @@ -/********************************************************************************** - * $URL$ - * $Id$ - *********************************************************************************** - * - * Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009 The Sakai Foundation +/* + * Copyright (c) 2016, The Apereo 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 + * http://opensource.org/licenses/ecl2 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -17,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - **********************************************************************************/ + */ @@ -25,7 +21,6 @@ import java.io.File; -import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.Serializable; @@ -88,7 +83,7 @@ import org.sakaiproject.tool.assessment.ui.model.delivery.TimedAssessmentGradingModel; import org.sakaiproject.tool.assessment.ui.queue.delivery.TimedAssessmentQueue; import org.sakaiproject.tool.assessment.ui.web.session.SessionUtil; -import org.sakaiproject.tool.assessment.util.ExtendedTimeService; +import org.sakaiproject.tool.assessment.util.ExtendedTimeDeliveryService; import org.sakaiproject.tool.assessment.util.MimeTypesLocator; import org.sakaiproject.tool.cover.SessionManager; import org.sakaiproject.tool.cover.ToolManager; @@ -218,7 +213,6 @@ public class DeliveryBean // publishedUrl private boolean anonymousLogin = false; private String contextPath; - private boolean initAgentAccessString = false; // daisyf added this for timed assessment for SAK-6990, to check if mutiple windows were open // during timed assessment @@ -277,7 +271,7 @@ public class DeliveryBean private boolean isFromPrint; - private ExtendedTimeService extendedTimeService = null; + private ExtendedTimeDeliveryService extendedTimeDeliveryService = null; private boolean showTimeWarning; private boolean hasShowTimeWarning; @@ -295,8 +289,6 @@ public class DeliveryBean private static ResourceBundle eventLogMessages = ResourceBundle.getBundle("org.sakaiproject.tool.assessment.bundle.EventLogMessages"); - private static String EXTENDED_TIME_KEY = "extendedTime"; - private static String questionProgressUnansweredPath = ServerConfigurationService.getString("samigo.questionprogress.unansweredpath", "/images/whiteBubble15.png"); private static String questionProgressAnsweredPath = ServerConfigurationService.getString("samigo.questionprogress.answeredpath", "/images/blackBubble15.png"); private static String questionProgressMardPath = ServerConfigurationService.getString("samigo.questionprogress.mardpath", "/images/questionMarkBubble15.png"); @@ -965,7 +957,7 @@ public void setFeedbackComponentOption(String feedbackComponentOption) this.feedbackComponentOption = feedbackComponentOption; } - /** + /* * Types of feedback in FeedbackComponent: * * SHOW CORRECT SCORE @@ -976,7 +968,7 @@ public void setFeedbackComponentOption(String feedbackComponentOption) * SHOW STATS * SHOW QUESTION * SHOW RESPONSE - **/ + */ /** * @return @@ -3206,7 +3198,7 @@ public String checkBeforeProceed(boolean isSubmitForGrade, boolean isFromTimer, assessmentGrading = service.load(adata.getAssessmentGradingId().toString(), false); } - extendedTimeService = new ExtendedTimeService(publishedAssessment); + extendedTimeDeliveryService = new ExtendedTimeDeliveryService(publishedAssessment); // log.debug("check 0"); if (isRemoved()){ @@ -3369,8 +3361,8 @@ private boolean isAvailable(){ boolean isAvailable = true; Date currentDate = new Date(); Date startDate; - if (extendedTimeService.hasExtendedTime()) { - startDate = extendedTimeService.getStartDate(); + if (extendedTimeDeliveryService.hasExtendedTime()) { + startDate = extendedTimeDeliveryService.getStartDate(); } else { startDate = publishedAssessment.getAssessmentAccessControl().getStartDate(); } @@ -3384,8 +3376,8 @@ private boolean pastDueDate(){ boolean pastDue = true; Date currentDate = new Date(); Date dueDate; - if (extendedTimeService.hasExtendedTime()) { - dueDate = extendedTimeService.getDueDate(); + if (extendedTimeDeliveryService.hasExtendedTime()) { + dueDate = extendedTimeDeliveryService.getDueDate(); } else { dueDate = publishedAssessment.getAssessmentAccessControl().getDueDate(); } @@ -3399,8 +3391,8 @@ private boolean isRetracted(boolean isSubmitForGrade){ boolean isRetracted = true; Date currentDate = new Date(); Date retractDate; - if (extendedTimeService.hasExtendedTime()) { - retractDate = extendedTimeService.getRetractDate(); + if (extendedTimeDeliveryService.hasExtendedTime()) { + retractDate = extendedTimeDeliveryService.getRetractDate(); } else { retractDate = publishedAssessment.getAssessmentAccessControl().getRetractDate(); diff --git a/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/listener/author/ConfirmPublishAssessmentListener.java b/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/listener/author/ConfirmPublishAssessmentListener.java index d9d7f363bd..9902363339 100644 --- a/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/listener/author/ConfirmPublishAssessmentListener.java +++ b/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/listener/author/ConfirmPublishAssessmentListener.java @@ -23,8 +23,7 @@ package org.sakaiproject.tool.assessment.ui.listener.author; -import java.util.ArrayList; -import java.util.Date; +import java.util.*; import javax.faces.application.FacesMessage; import javax.faces.context.ExternalContext; @@ -32,17 +31,17 @@ import javax.faces.event.AbortProcessingException; import javax.faces.event.ActionEvent; import javax.faces.event.ActionListener; +import javax.faces.model.SelectItem; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.sakaiproject.component.cover.ServerConfigurationService; import org.sakaiproject.service.gradebook.shared.GradebookExternalAssessmentService; -import org.sakaiproject.service.gradebook.shared.GradebookService; import org.sakaiproject.spring.SpringBeanLocator; import org.sakaiproject.tool.assessment.data.dao.assessment.AssessmentAccessControl; +import org.sakaiproject.tool.assessment.data.dao.assessment.ExtendedTime; import org.sakaiproject.tool.assessment.data.ifc.assessment.AssessmentAccessControlIfc; -import org.sakaiproject.tool.assessment.data.ifc.assessment.AssessmentMetaDataIfc; import org.sakaiproject.tool.assessment.data.ifc.assessment.EvaluationModelIfc; import org.sakaiproject.tool.assessment.facade.AgentFacade; import org.sakaiproject.tool.assessment.facade.AssessmentFacade; @@ -95,7 +94,7 @@ public void processAction(ActionEvent ae) throws AbortProcessingException { // Check permissions AuthorizationBean authzBean = (AuthorizationBean) ContextUtil.lookupBean("authorization"); if (!authzBean.isUserAllowedToPublishAssessment(assessmentId, assessment.getCreatedBy(), false)) { - String err=(String)ContextUtil.getLocalizedString("org.sakaiproject.tool.assessment.bundle.AuthorMessages", "denied_publish_assessment_error"); + String err=ContextUtil.getLocalizedString("org.sakaiproject.tool.assessment.bundle.AuthorMessages", "denied_publish_assessment_error"); context.addMessage(null,new FacesMessage(err)); assessmentSettings.setOutcomePublish("editAssessmentSettings"); author.setIsErrorInSettings(true); @@ -169,6 +168,110 @@ public void processAction(ActionEvent ae) throws AbortProcessingException { error=true; } } + + if(dueDate != null && startDate != null && dueDate.equals(startDate)) { + String dateError4 = ContextUtil.getLocalizedString("org.sakaiproject.tool.assessment.bundle.AssessmentSettingsMessages", "due_same_as_available"); + context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, dateError4, null)); + error=true; + } + + List extendedTimeList = assessmentSettings.getExtendedTimes(); + List extendedTimeUsers = new ArrayList<>(extendedTimeList.size()); + List extendedTimeGroups = new ArrayList<>(extendedTimeList.size()); + for(ExtendedTime entry : extendedTimeList) { + Date entryStartDate = entry.getStartDate(); + Date entryDueDate = entry.getDueDate(); + Date entryRetractDate = entry.getRetractDate(); + if(!"".equals(entry.getUser())) { + extendedTimeUsers.add(entry.getUser()); + } + + if(!"".equals(entry.getGroup())) { + extendedTimeGroups.add(entry.getGroup()); + } + boolean isEntryRetractEarlierThanAvailable = false; + + if(!entry.getUser().isEmpty() && !entry.getGroup().isEmpty()) { + String extendedTimeError1 = getExtendedTimeErrorString("extended_time_user_and_group_set", entry, assessmentSettings); + context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, extendedTimeError1, null)); + error = true; + } + if((entryStartDate != null && entryDueDate !=null && entryDueDate.before(entryStartDate)) || + (entryStartDate == null && entryDueDate != null && entryDueDate.before(new Date()))) { + String extendedTimeError2 = getExtendedTimeErrorString("extended_time_due_earlier_than_available", entry, assessmentSettings); + context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, extendedTimeError2, null)); + error = true; + entry.setStartDate(new Date()); + } + if(assessmentSettings.getLateHandling() != null && AssessmentAccessControlIfc.ACCEPT_LATE_SUBMISSION.toString().equals(assessmentSettings.getLateHandling())){ + if( (entryRetractDate != null && entryStartDate != null && entryRetractDate.before(entryStartDate)) || + (entryRetractDate !=null && entryStartDate == null && entryRetractDate.before(new Date())) ) { + String extendedTimeError3 = getExtendedTimeErrorString("extended_time_retract_earlier_than_available", entry, assessmentSettings); + context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, extendedTimeError3, null)); + error = true; + isEntryRetractEarlierThanAvailable = true; + entry.setStartDate(new Date()); + } + if(!isEntryRetractEarlierThanAvailable && (entryRetractDate != null && entryDueDate != null && entryRetractDate.before(entryDueDate))) { + String extendedTimeError4 = getExtendedTimeErrorString("extended_time_retract_earlier_than_due", entry, assessmentSettings); + context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, extendedTimeError4, null)); + error = true; + } + } + if(entryDueDate != null && entryStartDate != null && entryDueDate.equals(entryStartDate)) { + String extendedTimeError5 = getExtendedTimeErrorString("extended_time_due_same_as_available", entry, assessmentSettings); + context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, extendedTimeError5, null)); + error = true; + } + } + + Set duplicateExtendedTimeUsers = findDuplicates(extendedTimeUsers); + if(!duplicateExtendedTimeUsers.isEmpty()) { + String users = ""; + int count = 0; + int end = extendedTimeUsers.size(); + for(String entry : duplicateExtendedTimeUsers) { + if(count == 0) { + users = "'" + getUserName(entry, assessmentSettings) + "'"; + } else if(count < (end - 1)) { + users = users + ", '" + getUserName(entry, assessmentSettings) + "'"; + } else { + String and = ContextUtil.getLocalizedString("org.sakaiproject.tool.assessment.bundle.AssessmentSettingsMessages","extended_time_and"); + users = users + ", " + and + " '" + getUserName(entry, assessmentSettings); + } + + count++; + } + + String extendedTimeError6 = ContextUtil.getLocalizedString("org.sakaiproject.tool.assessment.bundle.AssessmentSettingsMessages","extended_time_duplicate_users"); + extendedTimeError6 = extendedTimeError6.replace("{0}", users); + context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, extendedTimeError6, null)); + error = true; + } + + Set duplicateExtendedTimeGroups = findDuplicates(extendedTimeGroups); + if(!duplicateExtendedTimeGroups.isEmpty()) { + String groups = ""; + int count = 0; + int end = extendedTimeUsers.size(); + for(String entry : duplicateExtendedTimeGroups) { + if(count == 0) { + groups = "'" + getGroupName(entry, assessmentSettings) + "'"; + } else if(count < (end - 1)) { + groups = groups + ", '" + getGroupName(entry, assessmentSettings) + "'"; + } else { + String and = ContextUtil.getLocalizedString("org.sakaiproject.tool.assessment.bundle.AssessmentSettingsMessages","extended_time_and"); + groups = groups + ", " + and + " '" + getGroupName(entry, assessmentSettings); + } + + count++; + } + + String extendedTimeError7 = ContextUtil.getLocalizedString("org.sakaiproject.tool.assessment.bundle.AssessmentSettingsMessages","extended_time_duplicate_groups"); + extendedTimeError7 = extendedTimeError7.replace("{0}", groups); + context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, extendedTimeError7, null)); + error = true; + } // if due date is null we cannot have late submissions if (assessmentSettings.getDueDate() == null && assessmentSettings.getLateHandling() != null && AssessmentAccessControlIfc.ACCEPT_LATE_SUBMISSION.toString().equals(assessmentSettings.getLateHandling()) && @@ -222,12 +325,12 @@ public void processAction(ActionEvent ae) throws AbortProcessingException { isTime = Boolean.getBoolean((String) time); } else if (time instanceof java.lang.Boolean) { - isTime=((Boolean)time).booleanValue(); + isTime=((Boolean)time); } } - if ((isTime) &&((assessmentSettings.getTimeLimit().intValue())==0)){ + if ((isTime) &&((assessmentSettings.getTimeLimit())==0)){ String time_err=ContextUtil.getLocalizedString("org.sakaiproject.tool.assessment.bundle.AssessmentSettingsMessages","timeSelect_error"); context.addMessage(null,new FacesMessage(time_err)); error=true; @@ -313,7 +416,7 @@ else if (time instanceof java.lang.Boolean) { { if(assessmentBean.getTotalScore()<=0) { - String gb_err=(String)ContextUtil.getLocalizedString("org.sakaiproject.tool.assessment.bundle.AuthorMessages", "gradebook_exception_min_points"); + String gb_err=ContextUtil.getLocalizedString("org.sakaiproject.tool.assessment.bundle.AuthorMessages", "gradebook_exception_min_points"); context.addMessage(null, new FacesMessage(gb_err)); error=true; } @@ -410,4 +513,45 @@ else if (time instanceof java.lang.Boolean) { public void setIsFromActionSelect(boolean isFromActionSelect){ this.isFromActionSelect = isFromActionSelect; } + + private String getExtendedTimeErrorString(String key, ExtendedTime entry, AssessmentSettingsBean settings) { + String errorString = ContextUtil.getLocalizedString("org.sakaiproject.tool.assessment.bundle.AssessmentSettingsMessages", key); + errorString = errorString.replace("{0}", getUserName(entry.getUser(), settings)).replace("{1}", getGroupName(entry.getGroup(), settings)); + return errorString; + } + + private String getUserName(String userId, AssessmentSettingsBean settings) { + return getName(userId, settings.getUsersInSite()); + } + + private String getGroupName(String groupId, AssessmentSettingsBean settings) { + return getName(groupId, settings.getGroupsForSite()); + } + + private String getName(String parameter, SelectItem[] entries) { + if(parameter == null || parameter.isEmpty()) { + return ""; + } + + for(SelectItem item : entries) { + if(item.getValue().equals(parameter)) { + return item.getLabel(); + } + } + + return ContextUtil.getLocalizedString("org.sakaiproject.tool.assessment.bundle.AssessmentSettingsMessages","extended_time_name_not_found"); + } + + private Set findDuplicates(List list) { + final Set setToReturn = new HashSet<>(); + final Set set1 = new HashSet<>(); + + for (String value : list) { + if (!set1.add(value)) { + setToReturn.add(value); + } + } + + return setToReturn; + } } diff --git a/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/listener/author/PublishAssessmentListener.java b/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/listener/author/PublishAssessmentListener.java index ac98a1f39e..ea033afee4 100644 --- a/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/listener/author/PublishAssessmentListener.java +++ b/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/listener/author/PublishAssessmentListener.java @@ -28,7 +28,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Iterator; -import java.util.Collection; import java.util.Map; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; @@ -45,12 +44,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.sakaiproject.tool.assessment.facade.ExtendedTimeFacade; import org.sakaiproject.tool.assessment.integration.helper.ifc.CalendarServiceHelper; import org.sakaiproject.component.cover.ServerConfigurationService; import org.sakaiproject.event.cover.EventTrackingService; import org.sakaiproject.service.gradebook.shared.AssignmentHasIllegalPointsException; import org.sakaiproject.service.gradebook.shared.GradebookExternalAssessmentService; -import org.sakaiproject.service.gradebook.shared.GradebookService; import org.sakaiproject.spring.SpringBeanLocator; import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedMetaData; import org.sakaiproject.tool.assessment.data.ifc.assessment.AssessmentAccessControlIfc; @@ -62,6 +61,7 @@ import org.sakaiproject.tool.assessment.integration.context.IntegrationContextFactory; import org.sakaiproject.tool.assessment.integration.helper.ifc.GradebookServiceHelper; import org.sakaiproject.tool.assessment.services.GradingService; +import org.sakaiproject.tool.assessment.services.PersistenceService; import org.sakaiproject.tool.assessment.services.assessment.AssessmentService; import org.sakaiproject.tool.assessment.services.assessment.PublishedAssessmentService; import org.sakaiproject.tool.assessment.ui.bean.author.AssessmentSettingsBean; @@ -207,6 +207,10 @@ private void publish(AssessmentFacade assessment, sendNotification(pub, publishedAssessmentService, subject, notificationMessage, assessmentSettings.getReleaseTo()); } + + ExtendedTimeFacade extendedTimeFacade = PersistenceService.getInstance().getExtendedTimeFacade(); + extendedTimeFacade.copyEntriesToPub(pub.getData(), assessmentSettings.getExtendedTimes()); + EventTrackingService.post(EventTrackingService.newEvent("sam.assessment.publish", "siteId=" + AgentFacade.getCurrentSiteId() + ", assessmentId=" + assessment.getAssessmentId() + ", publishedAssessmentId=" + pub.getPublishedAssessmentId(), true)); //update Calendar Events boolean addDueDateToCalendar = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("publishAssessmentForm:calendarDueDate") != null; @@ -303,15 +307,15 @@ public void sendNotification(PublishedAssessmentFacade pub, PublishedAssessmentS totalScoresBean.setPublishedId(pub.getPublishedAssessmentId().toString()); Map useridMap= totalScoresBean.getUserIdMap(TotalScoresBean.CALLED_FROM_NOTIFICATION_LISTENER); AgentFacade agent = null; - int size = useridMap.size() + 1; - ArrayList toIAList = new ArrayList(); + + ArrayList toIAList = new ArrayList<>(); try { toIAList.add(new InternetAddress(instructor.getEmail())); // send one copy to instructor } catch (AddressException e) { log.warn("AddressException encountered when constructing instructor's email."); } Iterator iter = useridMap.keySet().iterator(); - int i = 1; + while (iter.hasNext()) { String userUid = (String) iter.next(); agent = new AgentFacade(userUid); @@ -344,7 +348,7 @@ public void sendNotification(PublishedAssessmentFacade pub, PublishedAssessmentS List headers = new ArrayList(); headers.add("Content-Type: text/html"); - EmailService.sendMail(fromIA, toIA, subject.toString(), message, noReply, noReply, headers); + EmailService.sendMail(fromIA, toIA, subject, message, noReply, noReply, headers); } public String getNotificationMessage(PublishRepublishNotificationBean publishRepublishNotification, String title, String releaseTo, String startDateString, String publishedURL, String releaseToGroupsAsString, String dueDateString, Integer timedHours, Integer timedMinutes, String unlimitedSubmissions, String submissionsAllowed, String scoringType, String feedbackDelivery, String feedbackDateString){ diff --git a/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/listener/author/SaveAssessmentSettings.java b/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/listener/author/SaveAssessmentSettings.java index cc5d61eeba..b5181f8e70 100644 --- a/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/listener/author/SaveAssessmentSettings.java +++ b/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/listener/author/SaveAssessmentSettings.java @@ -34,7 +34,6 @@ import java.util.Map; import java.util.Set; import java.util.TreeMap; -import java.util.TimeZone; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; @@ -46,10 +45,7 @@ import org.sakaiproject.site.api.Site; import org.sakaiproject.site.cover.SiteService; import org.sakaiproject.tool.assessment.api.SamigoApiFactory; -import org.sakaiproject.tool.assessment.data.dao.assessment.AssessmentAccessControl; -import org.sakaiproject.tool.assessment.data.dao.assessment.AssessmentFeedback; -import org.sakaiproject.tool.assessment.data.dao.assessment.EvaluationModel; -import org.sakaiproject.tool.assessment.data.dao.assessment.SecuredIPAddress; +import org.sakaiproject.tool.assessment.data.dao.assessment.*; import org.sakaiproject.tool.assessment.data.ifc.assessment.AssessmentAccessControlIfc; import org.sakaiproject.tool.assessment.data.ifc.assessment.AssessmentIfc; import org.sakaiproject.tool.assessment.data.ifc.assessment.AssessmentAttachmentIfc; @@ -57,6 +53,7 @@ import org.sakaiproject.tool.assessment.facade.AgentFacade; import org.sakaiproject.tool.assessment.facade.AssessmentFacade; import org.sakaiproject.tool.assessment.facade.AuthzQueriesFacadeAPI; +import org.sakaiproject.tool.assessment.facade.ExtendedTimeFacade; import org.sakaiproject.tool.assessment.services.PersistenceService; import org.sakaiproject.tool.assessment.services.assessment.AssessmentService; import org.sakaiproject.tool.assessment.services.assessment.PublishedAssessmentService; @@ -66,8 +63,6 @@ import org.sakaiproject.tool.cover.ToolManager; import org.sakaiproject.tool.assessment.util.TextFormat; import org.sakaiproject.util.ResourceLoader; -import org.sakaiproject.time.cover.TimeService; -import org.sakaiproject.tool.assessment.util.ExtendedTimeService; /** *

Title: Samigo

2 @@ -88,17 +83,12 @@ public AssessmentFacade save(AssessmentSettingsBean assessmentSettings, boolean // template selected // #1 - set Assessment Long assessmentId = assessmentSettings.getAssessmentId(); - //log.info("**** save assessment assessmentId ="+assessmentId.toString()); ItemAuthorBean iAuthor=new ItemAuthorBean(); - //System.out.println("assessmentSettings.getFeedbackAuthoring: "+assessmentSettings.getFeedbackAuthoring()); - iAuthor.setShowFeedbackAuthoring(assessmentSettings.getFeedbackAuthoring()); - //System.out.println("iAuthor.getShowFeedbackAuthoring :"+iAuthor.getShowFeedbackAuthoring()); + iAuthor.setShowFeedbackAuthoring(assessmentSettings.getFeedbackAuthoring());; AssessmentService assessmentService = new AssessmentService(); AssessmentFacade assessment = assessmentService.getAssessment( assessmentId.toString()); - //log.info("** assessment = "+assessment); assessment.setTitle(TextFormat.convertPlaintextToFormattedTextNoHighUnicode(LOG, assessmentSettings.getTitle())); - //assessment.setTitle(assessmentSettings.getTitle()); assessment.setDescription(assessmentSettings.getDescription()); assessment.updateAssessmentMetaData(AssessmentMetaDataIfc.AUTHORS, TextFormat.convertPlaintextToFormattedTextNoHighUnicode(LOG, assessmentSettings.getAuthors())); @@ -141,11 +131,8 @@ public AssessmentFacade save(AssessmentSettingsBean assessmentSettings, boolean } control.setFeedbackDate(assessmentSettings.getFeedbackDate()); control.setReleaseTo(assessmentSettings.getReleaseTo()); - //log.info("control RELEASETO ="+control.getReleaseTo()); - //log.info("settings RELEASETO ="+assessmentSettings.getReleaseTo()); // b. set Timed Assessment - //log.info("** Time limit update to = "+assessmentSettings.getTimeLimit().intValue()); control.setTimeLimit(assessmentSettings.getTimeLimit()); if (assessmentSettings.getTimedAssessment()) control.setTimedAssessment(AssessmentAccessControl.TIMED_ASSESSMENT); @@ -316,9 +303,11 @@ public AssessmentFacade save(AssessmentSettingsBean assessmentSettings, boolean // hasUsernamePassword, // hasTimeAssessment,hasAutoSubmit, hasPartMetaData, hasQuestionMetaData HashMap h = assessmentSettings.getValueMap(); - addExtendedTimeValuesToMetaData(assessment, assessmentSettings, h); updateMetaWithValueMap(assessment, h); + ExtendedTimeFacade extendedTimeFacade = PersistenceService.getInstance().getExtendedTimeFacade(); + extendedTimeFacade.saveEntries(assessment, assessmentSettings.getExtendedTimes()); + // i. set Graphics assessment.updateAssessmentMetaData(AssessmentMetaDataIfc.BGCOLOR, TextFormat.convertPlaintextToFormattedTextNoHighUnicode(LOG, assessmentSettings.getBgColor())); assessment.updateAssessmentMetaData(AssessmentMetaDataIfc.BGIMAGE, TextFormat.convertPlaintextToFormattedTextNoHighUnicode(LOG, assessmentSettings.getBgImage())); @@ -567,41 +556,4 @@ private String getReleaseToGroupsAsString(TreeMap groupsForSiteMap, String [] gr return releaseToGroupsAsString.toString(); } - - /** - * This will clear out the old extended time values and update them with new - * ones. - * - * @param assessment - * @param assessmentSettings - * @return - */ - private HashMap addExtendedTimeValuesToMetaData(AssessmentFacade assessment, - AssessmentSettingsBean assessmentSettings, HashMap metaDataMap) { - - String[] allExtendedTimeEntries = assessmentSettings.getExtendedTimes().split("\\^"); - String metaKey; - - // clear out the old extended Time values - int itemNum = 1; - String extendedTimeData = assessment.getAssessmentMetaDataByLabel(EXTENDED_TIME_KEY + itemNum); - while ((extendedTimeData != null) && (!extendedTimeData.equals(""))) { - metaKey = EXTENDED_TIME_KEY + itemNum; - metaDataMap.put(metaKey, ""); // set to empty string TODO: actually - // delete it. - extendedTimeData = assessment.getAssessmentMetaDataByLabel(EXTENDED_TIME_KEY + itemNum); - itemNum++; - } - - for (itemNum = 0; itemNum < allExtendedTimeEntries.length; itemNum++) { - String extendedTimeEntry = ExtendedTimeService.convertZones(allExtendedTimeEntries[itemNum], TimeService.getLocalTimeZone(), TimeZone.getDefault()); - metaKey = "extendedTime" + (itemNum + 1); - - // Add in the new extended time values - metaDataMap.put(metaKey, extendedTimeEntry); - } - - return metaDataMap; - } - } diff --git a/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/listener/author/SavePublishedSettingsListener.java b/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/listener/author/SavePublishedSettingsListener.java index 8ad7e823d2..836863e9fa 100644 --- a/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/listener/author/SavePublishedSettingsListener.java +++ b/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/listener/author/SavePublishedSettingsListener.java @@ -23,18 +23,14 @@ package org.sakaiproject.tool.assessment.ui.listener.author; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.TimeZone; +import java.util.*; import javax.faces.application.FacesMessage; import javax.faces.context.FacesContext; import javax.faces.event.AbortProcessingException; import javax.faces.event.ActionEvent; import javax.faces.event.ActionListener; +import javax.faces.model.SelectItem; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; @@ -45,13 +41,7 @@ import org.sakaiproject.service.gradebook.shared.GradebookExternalAssessmentService; import org.sakaiproject.spring.SpringBeanLocator; import org.sakaiproject.tool.assessment.api.SamigoApiFactory; -import org.sakaiproject.tool.assessment.data.dao.assessment.AssessmentAccessControl; -import org.sakaiproject.tool.assessment.data.dao.assessment.AssessmentFeedback; -import org.sakaiproject.tool.assessment.data.dao.assessment.EvaluationModel; -import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedAccessControl; -import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedAssessmentData; -import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedEvaluationModel; -import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedSecuredIPAddress; +import org.sakaiproject.tool.assessment.data.dao.assessment.*; import org.sakaiproject.tool.assessment.data.dao.grading.AssessmentGradingData; import org.sakaiproject.tool.assessment.data.ifc.assessment.AssessmentAccessControlIfc; import org.sakaiproject.tool.assessment.data.ifc.assessment.AssessmentBaseIfc; @@ -59,26 +49,18 @@ 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.facade.AgentFacade; -import org.sakaiproject.tool.assessment.facade.GradebookFacade; -import org.sakaiproject.tool.assessment.facade.PublishedAssessmentFacade; -import org.sakaiproject.tool.assessment.facade.PublishedAssessmentFacadeQueries; +import org.sakaiproject.tool.assessment.facade.*; import org.sakaiproject.tool.assessment.integration.context.IntegrationContextFactory; import org.sakaiproject.tool.assessment.integration.helper.ifc.GradebookServiceHelper; import org.sakaiproject.tool.assessment.services.GradingService; import org.sakaiproject.tool.assessment.services.PersistenceService; import org.sakaiproject.tool.assessment.services.assessment.PublishedAssessmentService; import org.sakaiproject.tool.assessment.shared.api.assessment.SecureDeliveryServiceAPI; -import org.sakaiproject.tool.assessment.ui.bean.author.AssessmentBean; -import org.sakaiproject.tool.assessment.ui.bean.author.AuthorBean; -import org.sakaiproject.tool.assessment.ui.bean.author.PublishedAssessmentSettingsBean; +import org.sakaiproject.tool.assessment.ui.bean.author.*; import org.sakaiproject.tool.assessment.ui.listener.util.ContextUtil; import org.sakaiproject.tool.assessment.util.TextFormat; import org.sakaiproject.util.ResourceLoader; import org.sakaiproject.tool.assessment.integration.helper.ifc.CalendarServiceHelper; -import org.sakaiproject.tool.assessment.ui.bean.author.PublishRepublishNotificationBean; -import org.sakaiproject.time.cover.TimeService; -import org.sakaiproject.tool.assessment.util.ExtendedTimeService; /** *

Title: Samigo

2 @@ -98,8 +80,6 @@ public class SavePublishedSettingsListener private CalendarServiceHelper calendarService = IntegrationContextFactory.getInstance().getCalendarServiceHelper(); private final ResourceLoader rb= new ResourceLoader("org.sakaiproject.tool.assessment.bundle.AssessmentSettingsMessages"); - private static final String EXTENDED_TIME_KEY = "extendedTime"; - public SavePublishedSettingsListener() { } @@ -146,7 +126,10 @@ public void processAction(ActionEvent ae) throws AbortProcessingException assessmentSettings.setOutcome("editPublishedAssessmentSettings"); return; } - + + ExtendedTimeFacade extendedTimeFacade = PersistenceService.getInstance().getExtendedTimeFacade(); + extendedTimeFacade.saveEntriesPub(assessmentService.getBasicInfoOfPublishedAssessment(assessmentId.toString()), assessmentSettings.getExtendedTimes()); + assessment.setLastModifiedBy(AgentFacade.getAgentString()); assessment.setLastModifiedDate(new Date()); assessmentService.saveAssessment(assessment); @@ -306,9 +289,107 @@ public boolean checkPublishedSettings(PublishedAssessmentService assessmentServi } + List extendedTimeList = assessmentSettings.getExtendedTimes(); + List extendedTimeUsers = new ArrayList<>(extendedTimeList.size()); + List extendedTimeGroups = new ArrayList<>(extendedTimeList.size()); + for(ExtendedTime entry : extendedTimeList) { + Date entryStartDate = entry.getStartDate(); + Date entryDueDate = entry.getDueDate(); + Date entryRetractDate = entry.getRetractDate(); + if(!"".equals(entry.getUser())) { + extendedTimeUsers.add(entry.getUser()); + } + + if(!"".equals(entry.getGroup())) { + extendedTimeGroups.add(entry.getGroup()); + } + boolean isEntryRetractEarlierThanAvailable = false; + + if(!entry.getUser().isEmpty() && !entry.getGroup().isEmpty()) { + String extendedTimeError1 = getExtendedTimeErrorString("extended_time_user_and_group_set", entry, assessmentSettings); + context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, extendedTimeError1, null)); + error = true; + } + if((entryStartDate != null && entryDueDate !=null && entryDueDate.before(entryStartDate)) || + (entryStartDate == null && entryDueDate != null && entryDueDate.before(new Date()))) { + String extendedTimeError2 = getExtendedTimeErrorString("extended_time_due_earlier_than_available", entry, assessmentSettings); + context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, extendedTimeError2, null)); + error = true; + entry.setStartDate(new Date()); + } + if(assessmentSettings.getLateHandling() != null && AssessmentAccessControlIfc.ACCEPT_LATE_SUBMISSION.toString().equals(assessmentSettings.getLateHandling())){ + if( (entryRetractDate != null && entryStartDate != null && entryRetractDate.before(entryStartDate)) || + (entryRetractDate !=null && entryStartDate == null && entryRetractDate.before(new Date())) ) { + String extendedTimeError3 = getExtendedTimeErrorString("extended_time_retract_earlier_than_available", entry, assessmentSettings); + context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, extendedTimeError3, null)); + error = true; + isEntryRetractEarlierThanAvailable = true; + entry.setStartDate(new Date()); + } + if(!isEntryRetractEarlierThanAvailable && (entryRetractDate != null && entryDueDate != null && entryRetractDate.before(entryDueDate))) { + String extendedTimeError4 = getExtendedTimeErrorString("extended_time_retract_earlier_than_due", entry, assessmentSettings); + context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, extendedTimeError4, null)); + error = true; + } + } + if(entryDueDate != null && entryStartDate != null && entryDueDate.equals(entryStartDate)) { + String extendedTimeError5 = getExtendedTimeErrorString("extended_time_due_same_as_available", entry, assessmentSettings); + context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, extendedTimeError5, null)); + error = true; + } + } + + Set duplicateExtendedTimeUsers = findDuplicates(extendedTimeUsers); + if(!duplicateExtendedTimeUsers.isEmpty()) { + String users = ""; + int count = 0; + int end = extendedTimeUsers.size(); + for(String entry : duplicateExtendedTimeUsers) { + if(count == 0) { + users = "'" + getUserName(entry, assessmentSettings) + "'"; + } else if(count < (end - 1)) { + users = users + ", '" + getUserName(entry, assessmentSettings) + "'"; + } else { + String and = ContextUtil.getLocalizedString("org.sakaiproject.tool.assessment.bundle.AssessmentSettingsMessages","extended_time_and"); + users = users + ", " + and + " '" + getUserName(entry, assessmentSettings); + } + + count++; + } + + String extendedTimeError6 = ContextUtil.getLocalizedString("org.sakaiproject.tool.assessment.bundle.AssessmentSettingsMessages","extended_time_duplicate_users"); + extendedTimeError6 = extendedTimeError6.replace("{0}", users); + context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, extendedTimeError6, null)); + error = true; + } + + Set duplicateExtendedTimeGroups = findDuplicates(extendedTimeGroups); + if(!duplicateExtendedTimeGroups.isEmpty()) { + String groups = ""; + int count = 0; + int end = extendedTimeUsers.size(); + for(String entry : duplicateExtendedTimeGroups) { + if(count == 0) { + groups = "'" + getGroupName(entry, assessmentSettings) + "'"; + } else if(count < (end - 1)) { + groups = groups + ", '" + getGroupName(entry, assessmentSettings) + "'"; + } else { + String and = ContextUtil.getLocalizedString("org.sakaiproject.tool.assessment.bundle.AssessmentSettingsMessages","extended_time_and"); + groups = groups + ", " + and + " '" + getGroupName(entry, assessmentSettings); + } + + count++; + } + + String extendedTimeError7 = ContextUtil.getLocalizedString("org.sakaiproject.tool.assessment.bundle.AssessmentSettingsMessages","extended_time_duplicate_groups"); + extendedTimeError7 = extendedTimeError7.replace("{0}", groups); + context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, extendedTimeError7, null)); + error = true; + } + // SAM-1088 // if late submissions not allowed and late submission date is null, set late submission date to due date - if (assessmentSettings.getLateHandling() != null && AssessmentAccessControlIfc.NOT_ACCEPT_LATE_SUBMISSION.equals(assessmentSettings.getLateHandling()) && + if (assessmentSettings.getLateHandling() != null && AssessmentAccessControlIfc.NOT_ACCEPT_LATE_SUBMISSION.equals(Integer.valueOf(assessmentSettings.getLateHandling())) && retractDate == null && dueDate != null && assessmentSettings.getAutoSubmit()) { boolean autoSubmitEnabled = ServerConfigurationService.getBoolean("samigo.autoSubmit.enabled", false); if (autoSubmitEnabled) { @@ -575,7 +656,7 @@ else if (assessmentSettings.getRetractDate() == null control.setFinalPageUrl(finalPageUrl); // set Feedback - AssessmentFeedbackIfc feedback = (AssessmentFeedbackIfc) assessment.getAssessmentFeedback(); + AssessmentFeedbackIfc feedback = assessment.getAssessmentFeedback(); if (feedback == null){ feedback = new AssessmentFeedback(); // need to fix feeback so it can take AssessmentFacade later @@ -620,7 +701,7 @@ else if (assessmentSettings.getRetractDate() == null assessment.setAssessmentFeedback(feedback); // set Grading - EvaluationModelIfc evaluation = (EvaluationModelIfc) assessment.getEvaluationModel(); + EvaluationModelIfc evaluation = assessment.getEvaluationModel(); if (evaluation == null){ evaluation = new EvaluationModel(); evaluation.setAssessmentBase(assessment.getData()); @@ -651,9 +732,11 @@ else if (assessmentSettings.getRetractDate() == null // hasRetractDate, hasAnonymous, hasAuthenticatedUser, hasIpAddress, // hasUsernamePassword, hasTimeAssessment,hasAutoSubmit, hasPartMetaData, // hasQuestionMetaData - HashMap h = assessmentSettings.getValueMap(); - addExtendedTimeValuesToMetaData(assessment, assessmentSettings,h); + HashMap h = assessmentSettings.getValueMap(); saveAssessmentSettings.updateMetaWithValueMap(assessment, h); + + ExtendedTimeFacade extendedTimeFacade = PersistenceService.getInstance().getExtendedTimeFacade(); + extendedTimeFacade.saveEntriesPub(assessment.getData(), assessmentSettings.getExtendedTimes()); // i. set Graphics assessment.updateAssessmentMetaData(AssessmentMetaDataIfc.BGCOLOR, TextFormat.convertPlaintextToFormattedTextNoHighUnicode(LOG, assessmentSettings.getBgColor())); @@ -821,41 +904,63 @@ public void resetPublishedAssessmentsList(AuthorBean author, authorActionListener.prepareAllPublishedAssessmentsList(author, gradingService, publishedAssessmentList); } + private String getExtendedTimeErrorString(String key, ExtendedTime entry, PublishedAssessmentSettingsBean settings) { + String errorString = ContextUtil.getLocalizedString("org.sakaiproject.tool.assessment.bundle.AssessmentSettingsMessages", key); + errorString = errorString.replace("{0}", getUserName(entry.getUser(), settings)).replace("{1}", getGroupName(entry.getGroup(), settings)); + return errorString; + } + /** - * This will clear out the old extended time values and update them with new - * ones. - * - * @param assessment - * @param assessmentSettings + * gets a user name from an id and the settings bean + * @param userId + * @param settings * @return */ - private HashMap addExtendedTimeValuesToMetaData(PublishedAssessmentFacade assessment, - PublishedAssessmentSettingsBean assessmentSettings,HashMap metaDataMap) { + private String getUserName(String userId, PublishedAssessmentSettingsBean settings) { + return getName(userId, settings.getUsersInSite()); + } - String[] allExtendedTimeEntries = assessmentSettings.getExtendedTimes().split("\\^"); - String metaKey; + /** + * Gets a group name from a groupID and a settings Bean + * @param groupId + * @param settings + * @return + */ + private String getGroupName(String groupId, PublishedAssessmentSettingsBean settings) { + return getName(groupId, settings.getGroupsForSite()); + } - // clear out the old extended Time values - int itemNum = 1; - String extendedTimeData = assessment.getAssessmentMetaDataByLabel(EXTENDED_TIME_KEY + itemNum); - while ((extendedTimeData != null) && (!extendedTimeData.equals(""))) { - metaKey = EXTENDED_TIME_KEY + itemNum; - metaDataMap.put(metaKey, ""); // set to empty string TODO: actually - // delete it. - extendedTimeData = assessment.getAssessmentMetaDataByLabel(EXTENDED_TIME_KEY + itemNum); - itemNum++; + /** + * helper function for getUserName / getGroupname + * @param parameter + * @param entries + * @return + */ + private String getName(String parameter, SelectItem[] entries) { + if("".equals(parameter) || entries.length == 0) { + return ""; } - for (itemNum = 0; itemNum < allExtendedTimeEntries.length; itemNum++) { - // server stores in JVM's time one, convert from user's zone to that - String extendedTimeEntry = ExtendedTimeService.convertZones(allExtendedTimeEntries[itemNum], TimeService.getLocalTimeZone(), TimeZone.getDefault()); - metaKey = "extendedTime" + (itemNum + 1); + for(SelectItem item : entries) { + if(item.getValue().equals(parameter)) { + return item.getLabel(); + } + } + + return ContextUtil.getLocalizedString("org.sakaiproject.tool.assessment.bundle.AssessmentSettingsMessages","extended_time_name_not_found"); + } - // Add in the new extended time values - metaDataMap.put(metaKey, extendedTimeEntry); + private Set findDuplicates(List list) { + final Set setToReturn = new HashSet<>(); + final Set set1 = new HashSet<>(); + + for (String value : list) { + if (!set1.add(value)) { + setToReturn.add(value); + } } - return metaDataMap; + return setToReturn; } } diff --git a/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/listener/delivery/BeginDeliveryActionListener.java b/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/listener/delivery/BeginDeliveryActionListener.java index a1d2aa4ca4..2bb77ad5f5 100755 --- a/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/listener/delivery/BeginDeliveryActionListener.java +++ b/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/listener/delivery/BeginDeliveryActionListener.java @@ -23,7 +23,6 @@ package org.sakaiproject.tool.assessment.ui.listener.delivery; -import java.text.SimpleDateFormat; import java.util.List; import java.util.Date; @@ -32,20 +31,15 @@ import javax.faces.event.AbortProcessingException; import javax.faces.event.ActionEvent; import javax.faces.event.ActionListener; -import javax.faces.application.FacesMessage; import javax.faces.context.ExternalContext; -import javax.faces.context.FacesContext; import javax.servlet.ServletContext; -import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.sakaiproject.component.cover.ServerConfigurationService; import org.sakaiproject.tool.assessment.data.dao.assessment.AssessmentAccessControl; import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedFeedback; -import org.sakaiproject.tool.assessment.data.dao.authz.AuthorizationData; import org.sakaiproject.tool.assessment.data.dao.grading.AssessmentGradingData; import org.sakaiproject.tool.assessment.data.ifc.assessment.AssessmentAccessControlIfc; import org.sakaiproject.tool.assessment.data.ifc.assessment.AssessmentFeedbackIfc; @@ -59,21 +53,18 @@ import org.sakaiproject.tool.assessment.services.GradingService; import org.sakaiproject.tool.assessment.services.assessment.AssessmentService; import org.sakaiproject.tool.assessment.services.assessment.PublishedAssessmentService; -import org.sakaiproject.tool.assessment.services.PersistenceService; import org.sakaiproject.tool.assessment.ui.bean.author.AssessmentBean; import org.sakaiproject.tool.assessment.ui.bean.author.AuthorBean; import org.sakaiproject.tool.assessment.ui.bean.authz.AuthorizationBean; -import org.sakaiproject.tool.assessment.ui.bean.cms.CourseManagementBean; import org.sakaiproject.tool.assessment.ui.bean.delivery.DeliveryBean; import org.sakaiproject.tool.assessment.ui.bean.delivery.FeedbackComponent; import org.sakaiproject.tool.assessment.ui.bean.delivery.SectionContentsBean; import org.sakaiproject.tool.assessment.ui.bean.delivery.SettingsDeliveryBean; import org.sakaiproject.tool.assessment.ui.bean.shared.PersonBean; import org.sakaiproject.tool.assessment.ui.listener.util.ContextUtil; -import org.sakaiproject.tool.assessment.ui.listener.util.TimeUtil; import org.sakaiproject.tool.assessment.ui.model.delivery.TimedAssessmentGradingModel; import org.sakaiproject.tool.assessment.ui.queue.delivery.TimedAssessmentQueue; -import org.sakaiproject.tool.assessment.util.ExtendedTimeService; +import org.sakaiproject.tool.assessment.util.ExtendedTimeDeliveryService; import org.sakaiproject.tool.assessment.ui.listener.author.RemovePublishedAssessmentThread; import org.sakaiproject.util.ResourceLoader; /** @@ -264,7 +255,7 @@ public void populateBeanFromPub(DeliveryBean delivery, private FeedbackComponent populateFeedbackComponent(PublishedAssessmentFacade pubAssessment) { FeedbackComponent component = new FeedbackComponent(); - AssessmentFeedbackIfc info = (AssessmentFeedbackIfc) pubAssessment.getAssessmentFeedback(); + AssessmentFeedbackIfc info = pubAssessment.getAssessmentFeedback(); if ( info != null) { component.setAssessmentFeedback(info); } @@ -274,12 +265,12 @@ private FeedbackComponent populateFeedbackComponent(PublishedAssessmentFacade pu public void populateSubmissionsRemaining(PublishedAssessmentService service, PublishedAssessmentIfc pubAssessment, DeliveryBean delivery) { AssessmentAccessControlIfc control = pubAssessment.getAssessmentAccessControl(); - int totalSubmissions = service.getTotalSubmission(AgentFacade.getAgentString(), pubAssessment.getPublishedAssessmentId().toString()).intValue(); + int totalSubmissions = service.getTotalSubmission(AgentFacade.getAgentString(), pubAssessment.getPublishedAssessmentId().toString()); delivery.setTotalSubmissions(totalSubmissions); if (!(Boolean.TRUE).equals(control.getUnlimitedSubmissions())){ // when re-takes are allowed always display 1 as number of remaining submission - int submissionsRemaining = control.getSubmissionsAllowed().intValue() - totalSubmissions; + int submissionsRemaining = control.getSubmissionsAllowed() - totalSubmissions; if (submissionsRemaining < 1) { submissionsRemaining = 1; } @@ -333,7 +324,7 @@ private void populateDelivery(DeliveryBean delivery, PublishedAssessmentIfc pubA delivery.setQuestionIndex(0); delivery.setBeginTime(null); delivery.setFeedbackOnDate(false); - ExtendedTimeService extTimeService = new ExtendedTimeService(delivery.getPublishedAssessment()); + ExtendedTimeDeliveryService extTimeService = new ExtendedTimeDeliveryService(delivery.getPublishedAssessment()); PublishedAssessmentFacade paFacade = delivery.getPublishedAssessment(); if (extTimeService.hasExtendedTime()) { @@ -379,7 +370,7 @@ private void populateDelivery(DeliveryBean delivery, PublishedAssessmentIfc pubA delivery.setDeadline(); } - private void setTimedAssessment(DeliveryBean delivery, PublishedAssessmentIfc pubAssessment, ExtendedTimeService extTimeService, AssessmentGradingData unSubmittedAssessmentGrading){ + private void setTimedAssessment(DeliveryBean delivery, PublishedAssessmentIfc pubAssessment, ExtendedTimeDeliveryService extTimeService, AssessmentGradingData unSubmittedAssessmentGrading){ AssessmentAccessControlIfc control = pubAssessment.getAssessmentAccessControl(); // check if we need to time the assessment, i.e.hasTimeassessment="true" @@ -462,7 +453,7 @@ else if (minute > 1) { if((now - start) > (timeLimitInSetting*1000)) { // check if the queue is ahead and already submitted it TimedAssessmentQueue queue = TimedAssessmentQueue.getInstance(); - TimedAssessmentGradingModel timedAG = (TimedAssessmentGradingModel)queue. + TimedAssessmentGradingModel timedAG = queue. get(unSubmittedAssessmentGrading.getAssessmentGradingId()); // if it was submitted (race condition) while checking, unblock it - sam will synch soon if(timedAG != null && !timedAG.getSubmittedForGrade()) { @@ -569,12 +560,12 @@ private int updateQuestionPoolQuestions(String assessmentId, AssessmentService a AssessmentBean assessmentBean = (AssessmentBean) ContextUtil.lookupBean("assessmentBean"); if(assessmentBean != null && assessmentBean.getSections() != null){ for(int i = 0; i < assessmentBean.getSections().size(); i++){ - SectionContentsBean sectionBean = (SectionContentsBean) assessmentBean.getSections().get(i); + SectionContentsBean sectionBean = assessmentBean.getSections().get(i); if((sectionBean.getSectionAuthorTypeString() != null) && (sectionBean.getSectionAuthorTypeString().equals(SectionDataIfc.RANDOM_DRAW_FROM_QUESTIONPOOL .toString()))){ //this has been updated so we need to reset it - assessmentBean.getSections().set(i, new SectionContentsBean(assessmentService.getSection(sectionBean.getSectionId().toString()))); + assessmentBean.getSections().set(i, new SectionContentsBean(assessmentService.getSection(sectionBean.getSectionId()))); } } } diff --git a/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/listener/delivery/DeliveryActionListener.java b/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/listener/delivery/DeliveryActionListener.java index efabf5d45f..367c742515 100755 --- a/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/listener/delivery/DeliveryActionListener.java +++ b/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/listener/delivery/DeliveryActionListener.java @@ -35,7 +35,6 @@ import java.util.Random; import java.util.ResourceBundle; import java.util.Set; -import java.util.StringTokenizer; import javax.faces.context.FacesContext; import javax.faces.event.AbortProcessingException; @@ -101,7 +100,7 @@ import org.sakaiproject.tool.assessment.ui.model.delivery.TimedAssessmentGradingModel; import org.sakaiproject.tool.assessment.ui.queue.delivery.TimedAssessmentQueue; import org.sakaiproject.tool.assessment.ui.web.session.SessionUtil; -import org.sakaiproject.tool.assessment.util.ExtendedTimeService; +import org.sakaiproject.tool.assessment.util.ExtendedTimeDeliveryService; import org.sakaiproject.tool.assessment.util.FormatException; import org.sakaiproject.tool.assessment.util.SamigoLRSStatements; import org.sakaiproject.util.FormattedText; @@ -2675,12 +2674,12 @@ protected void setTimer(DeliveryBean delivery, PublishedAssessmentFacade publish delivery.setBeginTime(ag.getAttemptDate()); // Handle Extended Time Information - ExtendedTimeService extendedTimeService = new ExtendedTimeService(publishedAssessment); - if (extendedTimeService.hasExtendedTime()) { - if (extendedTimeService.getTimeLimit() > 0) - publishedAssessment.setTimeLimit(extendedTimeService.getTimeLimit()); - publishedAssessment.setDueDate(extendedTimeService.getDueDate()); - publishedAssessment.setRetractDate(extendedTimeService.getRetractDate()); + ExtendedTimeDeliveryService extendedTimeDeliveryService = new ExtendedTimeDeliveryService(publishedAssessment); + if (extendedTimeDeliveryService.hasExtendedTime()) { + if (extendedTimeDeliveryService.getTimeLimit() > 0) + publishedAssessment.setTimeLimit(extendedTimeDeliveryService.getTimeLimit()); + publishedAssessment.setDueDate(extendedTimeDeliveryService.getDueDate()); + publishedAssessment.setRetractDate(extendedTimeDeliveryService.getRetractDate()); } String timeLimitInSetting = control.getTimeLimit() == null ? "0" : control.getTimeLimit().toString(); @@ -2722,7 +2721,7 @@ protected void setTimer(DeliveryBean delivery, PublishedAssessmentFacade publish // timeLimit = Integer.parseInt(delivery.getTimeLimit()); // } // } - timeLimit = delivery.evaluateTimeLimit(publishedAssessment,fromBeginAssessment, extendedTimeService.getTimeLimit()); + timeLimit = delivery.evaluateTimeLimit(publishedAssessment,fromBeginAssessment, extendedTimeDeliveryService.getTimeLimit()); } else if (delivery.getTurnIntoTimedAssessment()) { timeLimit = Integer.parseInt(delivery.updateTimeLimit(timeLimitInSetting)); diff --git a/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/listener/select/SelectActionListener.java b/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/listener/select/SelectActionListener.java index 643b87d6f3..e9246caeb9 100755 --- a/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/listener/select/SelectActionListener.java +++ b/samigo/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/listener/select/SelectActionListener.java @@ -1,15 +1,11 @@ -/********************************************************************************** - * $URL$ - * $Id$ - *********************************************************************************** - * - * Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009 The Sakai Foundation +/* + * Copyright (c) 2016, The Apereo 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 + * http://opensource.org/licenses/ecl2 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -17,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - **********************************************************************************/ + */ @@ -61,7 +57,7 @@ import org.sakaiproject.tool.assessment.ui.bean.shared.PersonBean; import org.sakaiproject.tool.assessment.ui.listener.util.ContextUtil; import org.sakaiproject.tool.assessment.util.BeanSort; -import org.sakaiproject.tool.assessment.util.ExtendedTimeService; +import org.sakaiproject.tool.assessment.util.ExtendedTimeDeliveryService; import org.sakaiproject.util.ResourceLoader; /** @@ -75,12 +71,6 @@ public class SelectActionListener implements ActionListener { private static Logger log = LoggerFactory.getLogger(SelectActionListener.class); - //private static ContextUtil cu; - private static BeanSort bs; - private static BeanSort bs2; - private static ExtendedTimeService extendedTimeService = null; - private static String EXTENDED_TIME_KEY = "extendedTime"; - private static final String AVG_SCORE = EvaluationModelIfc.AVERAGE_SCORE.toString(); private static final String HIGH_SCORE = EvaluationModelIfc.HIGHEST_SCORE.toString(); private static final String LAST_SCORE = EvaluationModelIfc.LAST_SCORE.toString(); @@ -206,13 +196,11 @@ public void processAction(ActionEvent ae) throws HashMap publishedAssessmentHash = getPublishedAssessmentHash(publishedAssessmentList); ArrayList submittedAssessmentGradingList = new ArrayList(); - //log.info("recentSubmittedList size="+recentSubmittedList.size()); - boolean hasHighest = false; - boolean hasMultipleSubmission = false; + + boolean hasHighest; + boolean hasMultipleSubmission; HashMap feedbackHash = publishedAssessmentService.getFeedbackHash(); - DeliveryBeanie deliveryAnt = null; - boolean isUnique = true; - HashSet recentSubmittedIds = new HashSet(); + HashSet recentSubmittedIds = new HashSet<>(); select.setHasAnyAssessmentRetractForEdit(false); for (int k = 0; k < recentSubmittedList.size(); k++) { AssessmentGradingData g = (AssessmentGradingData) @@ -234,19 +222,19 @@ public void processAction(ActionEvent ae) throws delivery.setAssessmentId(g.getPublishedAssessmentId().toString()); Integer submissionAllowed = getSubmissionAllowed(g.getPublishedAssessmentId(), publishedAssessmentHash); - if (submissionAllowed.intValue() == -1) { + if (submissionAllowed == -1) { log.debug("submissionAllowed == -1"); continue; } - if (submissionAllowed.intValue() == 0) { // unlimited submissions + if (submissionAllowed == 0) { // unlimited submissions delivery.setMultipleSubmissions(true); hasMultipleSubmission=true; } - else if (submissionAllowed.intValue() == 1) { + else if (submissionAllowed == 1) { delivery.setMultipleSubmissions(false); hasMultipleSubmission=false; } - else if (submissionAllowed.intValue() > 1) { + else if (submissionAllowed > 1) { delivery.setMultipleSubmissions(true); hasMultipleSubmission=true; } @@ -338,13 +326,13 @@ else if (submissionAllowed.intValue() > 1) { totalSubmissions++; if (i == averageScoreAssessmentGradingList.size() - 1) { averageScore = totalScores/totalSubmissions; - averageScoreMap.put(db.getAssessmentId(), Double.valueOf(averageScore)); + averageScoreMap.put(db.getAssessmentId(), averageScore); } } else { if (i > 0) { averageScore = totalScores/totalSubmissions; - averageScoreMap.put(lastPublishedAssessmentId, Double.valueOf(averageScore)); + averageScoreMap.put(lastPublishedAssessmentId, averageScore); } lastPublishedAssessmentId = db.getAssessmentId(); totalScores = Double.parseDouble(db.getFinalScore()); @@ -352,7 +340,7 @@ else if (submissionAllowed.intValue() > 1) { if (i == averageScoreAssessmentGradingList.size() - 1) { averageScore = totalScores/totalSubmissions; - averageScoreMap.put(db.getAssessmentId(), Double.valueOf(averageScore)); + averageScoreMap.put(db.getAssessmentId(), averageScore); } } } @@ -537,7 +525,7 @@ private void processSortInfo(SelectAssessmentBean bean) { if (takeAscending != null && !takeAscending.trim().equals("") && !takeAscending.equals("null")) { try { - bean.setTakeableAscending((Boolean.valueOf(takeAscending)).booleanValue()); + bean.setTakeableAscending((Boolean.valueOf(takeAscending))); } catch (Exception ex) { //skip log.warn(ex.getMessage()); @@ -550,7 +538,7 @@ private void processSortInfo(SelectAssessmentBean bean) { if (reviewAscending != null && !reviewAscending.trim().equals("")) { try { - bean.setReviewableAscending(Boolean.valueOf(reviewAscending).booleanValue()); + bean.setReviewableAscending(Boolean.valueOf(reviewAscending)); } catch (Exception ex) { //skip log.warn(ex.getMessage()); @@ -572,20 +560,21 @@ private ArrayList getTakeableList(ArrayList assessmentList, HashMap h, List upda GradingService gradingService = new GradingService(); HashMap numberRetakeHash = gradingService.getNumberRetakeHash(AgentFacade.getAgentString()); HashMap actualNumberRetake = gradingService.getActualNumberRetakeHash(AgentFacade.getAgentString()); + ExtendedTimeDeliveryService extendedTimeDeliveryService; for (int i = 0; i < assessmentList.size(); i++) { PublishedAssessmentFacade f = (PublishedAssessmentFacade)assessmentList.get(i); // Handle extended time info - extendedTimeService = new ExtendedTimeService(f); - if (extendedTimeService.hasExtendedTime()) { - f.setStartDate(extendedTimeService.getStartDate()); - f.setDueDate(extendedTimeService.getDueDate()); - f.setRetractDate(extendedTimeService.getRetractDate()); - if (extendedTimeService.getTimeLimit() != 0) { - f.setTimeLimit(extendedTimeService.getTimeLimit()); + extendedTimeDeliveryService = new ExtendedTimeDeliveryService(f); + if (extendedTimeDeliveryService.hasExtendedTime()) { + f.setStartDate(extendedTimeDeliveryService.getStartDate()); + f.setDueDate(extendedTimeDeliveryService.getDueDate()); + f.setRetractDate(extendedTimeDeliveryService.getRetractDate()); + if (extendedTimeDeliveryService.getTimeLimit() != 0) { + f.setTimeLimit(extendedTimeDeliveryService.getTimeLimit()); } } if (f.getReleaseTo()!=null && !("").equals(f.getReleaseTo()) - && f.getReleaseTo().indexOf("Anonymous Users") == -1 ) { + && !f.getReleaseTo().contains("Anonymous Users") ) { if (isAvailable(f, h, numberRetakeHash, actualNumberRetake, updatedAssessmentNeedResubmitList, updatedAssessmentList)) { takeableList.add(f); } @@ -624,19 +613,18 @@ public boolean isAvailable(PublishedAssessmentFacade f, HashMap h, HashMap numbe int maxSubmissionsAllowed = 9999; if ( (Boolean.FALSE).equals(f.getUnlimitedSubmissions())){ - maxSubmissionsAllowed = f.getSubmissionsAllowed().intValue(); + maxSubmissionsAllowed = f.getSubmissionsAllowed(); } int numberRetake = 0; if (numberRetakeHash.get(f.getPublishedAssessmentId()) != null) { - numberRetake = (((StudentGradingSummaryData) numberRetakeHash.get(f.getPublishedAssessmentId())).getNumberRetake()).intValue(); + numberRetake = (((StudentGradingSummaryData) numberRetakeHash.get(f.getPublishedAssessmentId())).getNumberRetake()); } int totalSubmitted = 0; //boolean notSubmitted = false; if (h.get(f.getPublishedAssessmentId()) != null){ - totalSubmitted = ( (Integer) h.get(f.getPublishedAssessmentId())). - intValue(); + totalSubmitted = ( (Integer) h.get(f.getPublishedAssessmentId())); } //2. time to go through all the criteria @@ -653,7 +641,7 @@ public boolean isAvailable(PublishedAssessmentFacade f, HashMap h, HashMap numbe } else { int actualNumberRetake = 0; if (actualNumberRetakeHash.get(f.getPublishedAssessmentId()) != null) { - actualNumberRetake = ((Integer) actualNumberRetakeHash.get(f.getPublishedAssessmentId())).intValue(); + actualNumberRetake = ((Integer) actualNumberRetakeHash.get(f.getPublishedAssessmentId())); } if (actualNumberRetake < numberRetake) { returnValue = true; @@ -666,7 +654,7 @@ public boolean isAvailable(PublishedAssessmentFacade f, HashMap h, HashMap numbe if (retractDate == null || retractDate.after(currentDate)) { int actualNumberRetake = 0; if (actualNumberRetakeHash.get(f.getPublishedAssessmentId()) != null) { - actualNumberRetake = ((Integer) actualNumberRetakeHash.get(f.getPublishedAssessmentId())).intValue(); + actualNumberRetake = ((Integer) actualNumberRetakeHash.get(f.getPublishedAssessmentId())); } if (actualNumberRetake < numberRetake) { returnValue = true; @@ -725,10 +713,7 @@ private boolean isAssessmentRetractForEdit(PublishedAssessmentFacade p){ return false; } - if (AssessmentIfc.RETRACT_FOR_EDIT_STATUS.equals(p.getStatus())) { - return true; - } - return false; + return AssessmentIfc.RETRACT_FOR_EDIT_STATUS.equals(p.getStatus()); } private String hasStats(AssessmentGradingData a, HashMap feedbackHash){ @@ -856,7 +841,7 @@ public HashMap getPublishedAssessmentHash(ArrayList publishedAssessmentList){ private void setTimedAssessment(DeliveryBeanie delivery, PublishedAssessmentFacade pubAssessment){ if (pubAssessment.getTimeLimit() != null) { - int seconds = pubAssessment.getTimeLimit().intValue(); + int seconds = pubAssessment.getTimeLimit(); int hour = 0; int minute = 0; if (seconds>=3600) { diff --git a/samigo/samigo-app/src/webapp/js/extendedTime.js b/samigo/samigo-app/src/webapp/js/extendedTime.js deleted file mode 100644 index 0c5b649a43..0000000000 --- a/samigo/samigo-app/src/webapp/js/extendedTime.js +++ /dev/null @@ -1,295 +0,0 @@ -var MAXITEMS = 10; // Max amount of extended time items allowed. We're capping this at 10 for now - -var activeExtTimeEntries = 0; - -// This is the method called from authorSettings.jsp to set up all the extended time stuff -function extendedTimeInitialize() { - addAllExtendedTimeItems(); - allExtendedTimeEntries = document.getElementById("assessmentSettingsAction\:xt1").value.split("^"); - - for (var itemNum = 1; itemNum <= MAXITEMS; itemNum++) { - copyListValuesForExtTime(itemNum); - } - - var itemNum = 1; - do { - activeExtTimeEntries++; - fullExtendedTimeString = allExtendedTimeEntries[itemNum-1].split("|"); - initializeExtTimeValues(fullExtendedTimeString,itemNum); - showActiveExtTimeEntities(fullExtendedTimeString,itemNum); - itemNum++; - - } while(itemNum < allExtendedTimeEntries.length); -} - -// We secretly store the extended time info in a hidden JSF input field. Whenever a user edits an -// extended time value this method gets called on save and updates the hidden field with everything -// that has been entered. When the form is submitted Java sorts it all out. - -// back end expects normal English format, user's time zone -function makeServerDate(s, itemNum) { - return formatOrNull($('#'+s+itemNum).datetimepicker('getDate')); -} - -function extendedTimeCombine() { - document.getElementById("assessmentSettingsAction\:xt1").value = ""; - for (var itemNum = 1; itemNum <= MAXITEMS; itemNum++) { - var target = document.getElementById("xt_id"+itemNum).value; - var hasdates = (document.getElementById("xt_datesToggle"+itemNum).checked); - - if(target != "1"){ // don't add empties - var minutes = (parseInt(document.getElementById("xt_hours"+itemNum).value) * 3600) + parseInt(document.getElementById("xt_minutes"+itemNum).value) * 60; - var code = target+"|" + minutes; - if (hasdates) - code = code + "|" - + makeServerDate("xt_open", itemNum) + "|" + makeServerDate("xt_due", itemNum) + "|" + makeServerDate("xt_retract", itemNum); - code = code + "^"; - document.getElementById("assessmentSettingsAction\:xt1").value = document.getElementById("assessmentSettingsAction\:xt1").value.concat(code); - } // end if(target != "0") - } //end for - -} - -// Each Extended time item needs to either bring in existing values or -// sync with values already on the page. -function initializeExtTimeValues(fullExtendedTimeString,itemNum) { - //document.getElementById("xt_id"+itemNum).value = fullExtendedTimeString[0]; - var targetId = fullExtendedTimeString[0]; - var seconds = fullExtendedTimeString[1]; - var hours = Math.floor(seconds / (60 * 60)); - var divisor_for_minutes = seconds % (60 * 60); - var minutes = Math.floor(divisor_for_minutes / 60); - - initializeSelectList("xt_id"+itemNum, targetId); - initializeSelectList("xt_hours"+itemNum, hours); - initializeSelectList("xt_minutes"+itemNum, minutes); - - document.getElementById("xt_open"+itemNum).value = evaluateDate(fullExtendedTimeString[2]); - document.getElementById("xt_due"+itemNum).value = evaluateDate(fullExtendedTimeString[3]); - document.getElementById("xt_retract"+itemNum).value = evaluateDate(fullExtendedTimeString[4]); - - addExtDatePickers(itemNum); -} - -// Avoid undefined date values -function evaluateDate(dateVal) { - if(dateVal == null) return ""; - else return dateVal; -} - -// If there are already values for extended time, go ahead and show them; otherwise -// hide them until the user activates them. -function showActiveExtTimeEntities(fullExtendedTimeString,itemNum) { - if(document.getElementById("xt_id"+itemNum).value.length > 1) { - document.getElementById("extendedTimeEntries").style.display = 'block'; - document.getElementById("xt"+itemNum).style.display = 'block'; - document.getElementById("xt_show").style.display = 'none'; - - if(fullExtendedTimeString.length > 2) { - document.getElementById("xt_dates"+itemNum).style.display = 'block'; - document.getElementById("xt_datesToggle"+itemNum).checked=true; - } - } else if(itemNum == 1){ // if nothing is set, allow the first one to show so the user can add input - document.getElementById("xt"+itemNum).style.display = 'block'; - } -} - -// Default a select list to a particular value -function initializeSelectList(listName, val) { - var sel = document.getElementById(listName); - for(var i = 0, j = sel.options.length; i < j; ++i) { - if(sel.options[i].value == val) { - sel.selectedIndex = i; - break; - } - } -} - -// Rather than building lists independently. We'll guarantee consistency by copying them from the page. -function copyListValuesForExtTime(itemNum) { - - var srcTargetList = document.getElementById("assessmentSettingsAction\:extendedTimeTarget"); - var options = srcTargetList.innerHTML; - document.getElementById("xt_id"+itemNum).innerHTML = options; - - var srcHoursList = document.getElementById("assessmentSettingsAction\:timedHours"); - options = srcHoursList.innerHTML; - document.getElementById("xt_hours"+itemNum).innerHTML = options; - - var srcMinutesList = document.getElementById("assessmentSettingsAction\:timedMinutes"); - - options = srcMinutesList.innerHTML; - document.getElementById("xt_minutes"+itemNum).innerHTML = options; - -} - -function formatOrNull(date) { - if (date != null) { - return moment(date).format('YYYY-MM-DD HH:mm:ss'); - } else { - return ''; - } -} - -// Control to allow checkboxes to toggle whether a div displays or not. -// This sets up data for new entries. They get reasonable default values -function toggleExtendedTimeEntity(it, itemNum, box) { - var vis = (box.checked) ? "block" : "none"; - document.getElementById(it).style.display = vis; - - var defaultStartDate = $('#assessmentSettingsAction\\:startDate').datetimepicker('getDate'); - $('#xt_open'+itemNum).datetimepicker('setDate',defaultStartDate); - - var defaultDueDate = $('#assessmentSettingsAction\\:endDate').datetimepicker('getDate'); - $('#xt_due'+itemNum).datetimepicker('setDate',defaultDueDate); - - var defaultRetractDate = $('#assessmentSettingsAction\\:retractDate').datetimepicker('getDate'); - $('#xt_retract'+itemNum).datetimepicker('setDate',defaultRetractDate); - - // They are clearing out the list - if(vis == "none" && it == "extendedTimeEntries") { - deleteAllExtTimeEntries(); - } -} - -// Action whent he first add link is clicked -function showExtendedTime() { - document.getElementById('xt_show').style.display = "none"; - document.getElementById('extendedTimeEntries').style.display = "block"; -} - -// Action when a user clicks to add a new extended time entry -function addExtTimeEntry() { - activeExtTimeEntries++; - document.getElementById("xt"+activeExtTimeEntries).style.display = "block"; - addExtDatePickers(activeExtTimeEntries); - if(activeExtTimeEntries == MAXITEMS) { // prevents them from adding more than max - document.getElementById("addExtTimeControl").style.display = "none"; - } -} - -// Delete Extended Time entry when a user clicks the button -function deleteExtTimeEntry(itemNum) { - document.getElementById("xt_id"+itemNum).value = "1"; - document.getElementById("xt_hours"+itemNum).value = "0"; - document.getElementById("xt_minutes"+itemNum).value = "0"; - deleteExtTimeDates(itemNum); - extendedTimeCombine(); // updates the form input - document.getElementById("xt"+itemNum).style.display = "none"; -} - -function deleteExtTimeDates(itemNum) { - document.getElementById("xt_open"+itemNum).value = ""; - document.getElementById("xt_due"+itemNum).value = ""; - document.getElementById("xt_retract"+itemNum).value = ""; -} - -function deleteAllExtTimeEntries() { - for (var itemNum = 1; itemNum <= MAXITEMS; itemNum++) { - deleteExtTimeEntry(itemNum); - } - - // we need to keep one around for re-adding potientially - activeExtTimeEntries = 1; - document.getElementById("xt1").style.display = "block"; -} - -// Add scripts to DOM by creating a script tag dynamically. -// @param {String=} itemNum itemNum -// this sets up values for entries where we have data; if the data is '' we retain it except that -// start always has to be defined -function addExtDatePickers(itemNum) { - - var s = document.createElement("script"); - s.type = "text/javascript"; - - var defaultStartDate; - if(document.getElementById("xt_open"+itemNum).value == ''){ - defaultStartDate = moment($('#assessmentSettingsAction\\:startDate').datetimepicker('getDate')).format('YYYY-MM-DD HH:mm:ss'); - } else { - defaultStartDate = moment(document.getElementById("xt_open"+itemNum).value).format('YYYY-MM-DD HH:mm:ss'); - } - var startDatePickerOptions = { input: '#xt_open' + itemNum , - useTime: 1, - parseFormat: 'YYYY-MM-DD HH:mm:ss', - val: defaultStartDate, - ashidden: { iso8601: 'xt_open' + itemNum + 'ISO8601' } - } - localDatePicker(startDatePickerOptions); - - var formattedDueDate; - if(document.getElementById("xt_due"+itemNum).value == ''){ - formattedDueDate = ''; - } else { - formattedDueDate = moment(document.getElementById("xt_due"+itemNum).value).format('YYYY-MM-DD HH:mm:ss'); - } - var dueDatePickerOptions = { input: '#xt_due' + itemNum , - useTime: 1, - parseFormat: 'YYYY-MM-DD HH:mm:ss', - allowEmptyDate: true, - val: formattedDueDate, - ashidden: { iso8601: 'xt_due' + itemNum + 'ISO8601' } - } - localDatePicker(dueDatePickerOptions); - - var formattedRetractDate; - if(document.getElementById("xt_retract"+itemNum).value == ''){ - formattedRetractDate = ''; - } else { - formattedRetractDate = moment(document.getElementById("xt_retract"+itemNum).value).format('YYYY-MM-DD HH:mm:ss'); - } - var retractDatePickerOptions = { input: '#xt_retract' + itemNum , - useTime: 1, - parseFormat: 'YYYY-MM-DD HH:mm:ss', - allowEmptyDate: true, - val: formattedRetractDate, - ashidden: { iso8601: 'xt_retract' + itemNum + 'ISO8601' } - } - localDatePicker(retractDatePickerOptions); - s.innerHTML = ''; - document.getElementsByTagName("head")[0].appendChild(s); -} - -// Dynamically create a div for each potential extended time item. Most will be hidden. -function addAllExtendedTimeItems() { - var xtItem = document.getElementById("extendedTimeEntries"); - xtItem.innerHTML = ""; - - for (var itemNum = 1; itemNum <= MAXITEMS; itemNum++) { - - var code = "
"+ // none display by default - "
"+ - "  "+ - "hrs. "+ - "min. "+ - "         "+ // delete button - "
"+ - "Change Delivery Dates for this group/student."+ - "
"+ // dates don't display by default - "
"+ - "Available Date"+ - " "+ - - "
"+ - "Due Date"+ - " "+ - - "
"+ - "Retract Date"+ - " "+ - - "
"+ - "
"+ - "
"+ - "
"; - - xtItem.innerHTML = xtItem.innerHTML.concat(code); - } // end for - - // Add the link for allowing the user to add additional extended time entries - var addLinkCode = ""; - xtItem.innerHTML = xtItem.innerHTML.concat(addLinkCode); - -} \ No newline at end of file diff --git a/samigo/samigo-app/src/webapp/jsf/author/authorSettings.jsp b/samigo/samigo-app/src/webapp/jsf/author/authorSettings.jsp index 04bc863515..a76c49bafe 100755 --- a/samigo/samigo-app/src/webapp/jsf/author/authorSettings.jsp +++ b/samigo/samigo-app/src/webapp/jsf/author/authorSettings.jsp @@ -42,7 +42,6 @@ <%= request.getAttribute("html.head") %> <h:outputText value="#{assessmentSettingsMessages.sakai_assessment_manager} #{assessmentSettingsMessages.dash} #{assessmentSettingsMessages.settings}" /> - @@ -92,6 +91,30 @@ val: '', ashidden: { iso8601: 'feedbackDateISO8601' } }); + localDatePicker({ + input: '#assessmentSettingsAction\\:newEntry-start_date', + useTime: 1, + parseFormat: 'YYYY-MM-DD HH:mm:ss', + allowEmptyDate: true, + val: '', + ashidden: { iso8601: 'newEntry-start_date-iso8601' } + }); + localDatePicker({ + input: '#assessmentSettingsAction\\:newEntry-due_date', + useTime: 1, + parseFormat: 'YYYY-MM-DD HH:mm:ss', + allowEmptyDate: true, + val: '', + ashidden: { iso8601: 'newEntry-due_date-iso8601' } + }); + localDatePicker({ + input: '#assessmentSettingsAction\\:newEntry-retract_date', + useTime: 1, + parseFormat: 'YYYY-MM-DD HH:mm:ss', + allowEmptyDate: true, + val: '', + ashidden: { iso8601: 'newEntry-retract_date-iso8601' } + }); // SAM-2121: Lockdown the question layout and mark for review if necessary var navVal = $('#assessmentSettingsAction\\:itemNavigation input:radio:checked').val(); @@ -103,7 +126,6 @@ lockdownGradebook(releaseToVal); showHideReleaseGroups(); initTimedCheckBox(); - extendedTimeInitialize(); checkUncheckTimeBox(); checkLastHandling(); }); diff --git a/samigo/samigo-app/src/webapp/jsf/author/inc/extendedTime.jspf b/samigo/samigo-app/src/webapp/jsf/author/inc/extendedTime.jspf index e9f40abf67..744f90cd2e 100644 --- a/samigo/samigo-app/src/webapp/jsf/author/inc/extendedTime.jspf +++ b/samigo/samigo-app/src/webapp/jsf/author/inc/extendedTime.jspf @@ -1,36 +1,119 @@ - -
- - - - - - - - - - - - -
-
- - - -
-
- - -
- - - - - -
-
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + +
diff --git a/samigo/samigo-app/src/webapp/jsf/author/inc/publishedExtendedTime.jspf b/samigo/samigo-app/src/webapp/jsf/author/inc/publishedExtendedTime.jspf index ee66f6ddae..c5a08ff3b8 100644 --- a/samigo/samigo-app/src/webapp/jsf/author/inc/publishedExtendedTime.jspf +++ b/samigo/samigo-app/src/webapp/jsf/author/inc/publishedExtendedTime.jspf @@ -1,36 +1,119 @@ #{assessmentSettingsMessages.extendedTimeHeading} " escape="false"/> - - - - - - - - - - - - - -
-
- - - -
-
- - -
- - - - - -
-
-
\ No newline at end of file +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ diff --git a/samigo/samigo-app/src/webapp/jsf/author/publishedSettings.jsp b/samigo/samigo-app/src/webapp/jsf/author/publishedSettings.jsp index b4f6cb6314..8aa44ba9e3 100644 --- a/samigo/samigo-app/src/webapp/jsf/author/publishedSettings.jsp +++ b/samigo/samigo-app/src/webapp/jsf/author/publishedSettings.jsp @@ -43,7 +43,6 @@ <%= request.getAttribute("html.head") %> <h:outputText value="#{assessmentSettingsMessages.sakai_assessment_manager} #{assessmentSettingsMessages.dash} #{assessmentSettingsMessages.settings}" /> - diff --git a/samigo/samigo-hibernate/src/java/org/sakaiproject/tool/assessment/data/dao/assessment/ExtendedTime.hbm.xml b/samigo/samigo-hibernate/src/java/org/sakaiproject/tool/assessment/data/dao/assessment/ExtendedTime.hbm.xml new file mode 100644 index 0000000000..6ef7067681 --- /dev/null +++ b/samigo/samigo-hibernate/src/java/org/sakaiproject/tool/assessment/data/dao/assessment/ExtendedTime.hbm.xml @@ -0,0 +1,42 @@ + + + + + + + + + SAM_EXTENDEDTIME_S + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/samigo/samigo-hibernate/src/java/org/sakaiproject/tool/assessment/data/dao/assessment/ExtendedTime.java b/samigo/samigo-hibernate/src/java/org/sakaiproject/tool/assessment/data/dao/assessment/ExtendedTime.java new file mode 100644 index 0000000000..658837cdc8 --- /dev/null +++ b/samigo/samigo-hibernate/src/java/org/sakaiproject/tool/assessment/data/dao/assessment/ExtendedTime.java @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2016, The Apereo 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://opensource.org/licenses/ecl2 + * + * 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.data.dao.assessment; + +import lombok.*; +import org.apache.commons.lang.builder.EqualsBuilder; +import org.apache.commons.lang.builder.HashCodeBuilder; +import org.sakaiproject.tool.assessment.data.ifc.assessment.AssessmentBaseIfc; +import org.sakaiproject.tool.assessment.data.ifc.assessment.PublishedAssessmentIfc; + +import java.io.Serializable; +import java.util.Date; + +/** + * Created by Leonardo Canessa [lcanessa1 (at) udayton (dot) edu] + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +public class ExtendedTime implements Serializable { + private static final long serialVersionUID = 1L; + + private Long id; + private AssessmentBaseIfc assessment; + private PublishedAssessmentIfc pubAssessment; + private String user; + private String group; + private Date startDate; + private Date dueDate; + private Date retractDate; + private Integer timeHours; + private Integer timeMinutes; + + public ExtendedTime (AssessmentBaseIfc ass) { + this.assessment = ass; + } + + public ExtendedTime (PublishedAssessmentIfc pub) { + this.pubAssessment = pub; + } + + public ExtendedTime (ExtendedTime source) { + this(source.id, source.assessment, source.pubAssessment, source.user, source.group, source.startDate, source.dueDate, source.retractDate, source.timeHours, source.timeMinutes); + } + + public Long getAssessmentId () { + if(assessment == null) { + return null; + } + return assessment.getAssessmentBaseId(); + } + + public Long getPubAssessmentId () { + if(pubAssessment == null) { + return null; + } + return pubAssessment.getPublishedAssessmentId(); + } + + @Override + public boolean equals (final Object obj) { + if(obj == this) return true; // test for reference equality + if(obj == null) return false; // test for null + if(obj instanceof ExtendedTime) { + final ExtendedTime other = (ExtendedTime) obj; + return new EqualsBuilder() + .append(assessment.getAssessmentBaseId(), other.assessment.getAssessmentBaseId()) + .append(pubAssessment.getPublishedAssessmentId(), other.getPubAssessmentId()) + .append(user, other.user) + .append(group, other.group) + .append(startDate, other.startDate) + .append(dueDate, other.dueDate) + .append(retractDate, other.retractDate) + .append(timeHours, other.timeHours) + .append(timeMinutes, other.timeMinutes) + .isEquals(); + } else{ + return false; + } + } + + @Override + public int hashCode () { + return new HashCodeBuilder() + .append(assessment.getAssessmentBaseId()) + .append(pubAssessment.getPublishedAssessmentId()) + .append(user) + .append(group) + .append(startDate) + .append(dueDate) + .append(retractDate) + .append(timeHours) + .append(timeMinutes) + .toHashCode(); + } +} diff --git a/samigo/samigo-impl/pom.xml b/samigo/samigo-impl/pom.xml index 8f3957274e..dca4de107e 100644 --- a/samigo/samigo-impl/pom.xml +++ b/samigo/samigo-impl/pom.xml @@ -37,6 +37,10 @@ ${project.groupId} samigo-services + + ${project.groupId} + samigo-hibernate + org.sakaiproject.message sakai-message-api diff --git a/samigo/samigo-pack/src/webapp/WEB-INF/components.xml b/samigo/samigo-pack/src/webapp/WEB-INF/components.xml index 43febc4217..f08bd3deba 100644 --- a/samigo/samigo-pack/src/webapp/WEB-INF/components.xml +++ b/samigo/samigo-pack/src/webapp/WEB-INF/components.xml @@ -25,6 +25,7 @@ org/sakaiproject/tool/assessment/data/dao/grading/MediaData.hbm.xml org/sakaiproject/tool/assessment/data/dao/authz/AuthorizationData.hbm.xml org/sakaiproject/tool/assessment/data/dao/assessment/FavoriteColChoices.hbm.xml + org/sakaiproject/tool/assessment/data/dao/assessment/ExtendedTime.hbm.xml @@ -54,6 +55,7 @@ + true + + + + + + + - + + + + + + + PROPAGATION_REQUIRED + + + diff --git a/samigo/samigo-services/src/java/org/sakaiproject/tool/assessment/facade/AssessmentGradingFacadeQueries.java b/samigo/samigo-services/src/java/org/sakaiproject/tool/assessment/facade/AssessmentGradingFacadeQueries.java index 12a52ae458..55c7370859 100644 --- a/samigo/samigo-services/src/java/org/sakaiproject/tool/assessment/facade/AssessmentGradingFacadeQueries.java +++ b/samigo/samigo-services/src/java/org/sakaiproject/tool/assessment/facade/AssessmentGradingFacadeQueries.java @@ -1,16 +1,11 @@ - -/********************************************************************************** - * $URL$ - * $Id$ - *********************************************************************************** - * - * Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009 The Sakai Foundation +/* + * Copyright (c) 2016, The Apereo 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 + * http://opensource.org/licenses/ecl2 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -18,8 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - **********************************************************************************/ - + */ package org.sakaiproject.tool.assessment.facade; import java.io.File; @@ -50,6 +44,7 @@ import java.util.TreeMap; import java.util.TreeSet; +import org.sakaiproject.tool.assessment.util.ExtendedTimeDeliveryService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.hibernate.Criteria; @@ -74,11 +69,9 @@ import org.sakaiproject.exception.IdUnusedException; import org.sakaiproject.exception.PermissionException; import org.sakaiproject.exception.TypeException; -import org.sakaiproject.samigo.util.SamigoConstants; import org.sakaiproject.service.gradebook.shared.GradebookExternalAssessmentService; import org.sakaiproject.spring.SpringBeanLocator; import org.sakaiproject.tool.assessment.data.dao.assessment.EvaluationModel; -import org.sakaiproject.tool.assessment.data.dao.assessment.EventLogData; import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedItemData; import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedSectionData; import org.sakaiproject.tool.assessment.data.dao.grading.AssessmentGradingAttachment; @@ -104,12 +97,9 @@ import org.sakaiproject.tool.assessment.services.PersistenceHelper; import org.sakaiproject.tool.assessment.services.assessment.EventLogService; import org.sakaiproject.tool.assessment.services.assessment.PublishedAssessmentService; -import org.sakaiproject.tool.assessment.util.ExtendedTimeService; -import org.sakaiproject.tool.assessment.services.AutoSubmitAssessmentsJob; import org.sakaiproject.user.api.UserDirectoryService; import org.springframework.orm.hibernate3.HibernateCallback; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; -import org.sakaiproject.event.cover.EventTrackingService; import org.sakaiproject.exception.IdInvalidException; import org.sakaiproject.exception.IdUsedException; import org.sakaiproject.exception.InUseException; @@ -3525,7 +3515,7 @@ public int autoSubmitAssessments() { // SAM-1088 getting the assessment so we can check to see if last user attempt was after due date PublishedAssessmentFacade assessment = (PublishedAssessmentFacade)publishedAssessmentService.getAssessment(adata.getPublishedAssessmentId()); Date dueDate = assessment.getAssessmentAccessControl().getDueDate(); - ExtendedTimeService assessmentExtended = new ExtendedTimeService(assessment,adata.getAgentId()); + ExtendedTimeDeliveryService assessmentExtended = new ExtendedTimeDeliveryService(assessment, adata.getAgentId()); //If it has extended time, just continue for now, no method to tell if the time is passed if (assessmentExtended.hasExtendedTime()) { //If the due date or retract date hasn't passed yet, go on to the next one, don't consider it yet diff --git a/samigo/samigo-services/src/java/org/sakaiproject/tool/assessment/facade/ExtendedTimeFacade.java b/samigo/samigo-services/src/java/org/sakaiproject/tool/assessment/facade/ExtendedTimeFacade.java new file mode 100644 index 0000000000..0b4c9c77da --- /dev/null +++ b/samigo/samigo-services/src/java/org/sakaiproject/tool/assessment/facade/ExtendedTimeFacade.java @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2016, The Apereo 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://opensource.org/licenses/ecl2 + * + * 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 lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import org.sakaiproject.tool.assessment.data.dao.assessment.ExtendedTime; +import org.sakaiproject.tool.assessment.data.ifc.assessment.AssessmentBaseIfc; +import org.sakaiproject.tool.assessment.data.ifc.assessment.PublishedAssessmentIfc; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Leonardo Canessa [lcanessa1 (at) udayton (dot) edu] + */ +@Slf4j +public class ExtendedTimeFacade { + public void init() { + log.info("init"); + } + + public List getEntriesForAss (AssessmentBaseIfc ass) { + return getEntriesForX(ass, null); + } + + public List getEntriesForPub (PublishedAssessmentIfc pub) { + return getEntriesForX(null, pub); + } + + public ExtendedTime getEntryForPubAndUser (PublishedAssessmentIfc pub, String user) { + return extendedTimeQueries.getEntryForPubAndUser(pub, user); + } + + public ExtendedTime getEntryForPubAndGroup (PublishedAssessmentIfc pub, String group) { + return extendedTimeQueries.getEntryForPubAndGroup(pub, group); + } + + public void saveEntriesPub (PublishedAssessmentIfc p, List entries) { + saveExtendedTimeEntriesHelper(null, p, entries); + } + + public void saveEntries (AssessmentFacade aFacade, List entries) { + saveExtendedTimeEntriesHelper(aFacade, null, entries); + } + + public void copyEntriesToPub (PublishedAssessmentIfc pub, List entries) { + List publishedTimes = new ArrayList<>(entries.size()); + + for(ExtendedTime entry : entries) { + ExtendedTime pubEntry = new ExtendedTime(entry); + + pubEntry.setAssessment(null); + pubEntry.setPubAssessment(pub); + + publishedTimes.add(pubEntry); + } + + saveEntriesPub(pub, publishedTimes); + } + + private List getEntriesForX (AssessmentBaseIfc ass, PublishedAssessmentIfc pub) { + List results; + if(ass == null) { + results = extendedTimeQueries.getEntriesForPub(pub); + } else { + results = extendedTimeQueries.getEntriesForAss(ass); + } + + if(results == null ) { + results = new ArrayList<>(0); + } + return results; + } + + /** + * A Helper method to save extended time entries. The following must be true: + * ( assFacade != null || pubAssFac != null ) + * @param assFacade + * @param p + * @param newExtendedTime + */ + private void saveExtendedTimeEntriesHelper (AssessmentFacade assFacade, PublishedAssessmentIfc p, List newExtendedTime) { + List oldExtendedTime; + if(assFacade == null) { + oldExtendedTime = extendedTimeQueries.getEntriesForPub(p); + } else { + oldExtendedTime = extendedTimeQueries.getEntriesForAss(assFacade.getData()); + } + + List extraneousInOld = new ArrayList<>(); + for(ExtendedTime old : oldExtendedTime) { + boolean matched = false; + for(ExtendedTime newET : newExtendedTime) { + if(old.getId().equals(newET.getId())) { + matched = true; + } + } + + if(!matched) { + extraneousInOld.add(old); + } + } + + for(ExtendedTime item : extraneousInOld) { + extendedTimeQueries.deleteEntry(item); + } + + extendedTimeQueries.updateEntries(newExtendedTime); + } + + @Setter + private ExtendedTimeQueriesAPI extendedTimeQueries; +} diff --git a/samigo/samigo-services/src/java/org/sakaiproject/tool/assessment/facade/ExtendedTimeQueries.java b/samigo/samigo-services/src/java/org/sakaiproject/tool/assessment/facade/ExtendedTimeQueries.java new file mode 100644 index 0000000000..6126ecac84 --- /dev/null +++ b/samigo/samigo-services/src/java/org/sakaiproject/tool/assessment/facade/ExtendedTimeQueries.java @@ -0,0 +1,159 @@ +/* + * Copyright (c) 2016, The Apereo 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://opensource.org/licenses/ecl2 + * + * 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 lombok.extern.slf4j.Slf4j; +import org.hibernate.Query; +import org.hibernate.Session; +import org.hibernate.type.ManyToOneType; +import org.hibernate.type.StringType; +import org.sakaiproject.tool.assessment.data.dao.assessment.ExtendedTime; +import org.sakaiproject.tool.assessment.data.ifc.assessment.AssessmentBaseIfc; +import org.sakaiproject.tool.assessment.data.ifc.assessment.PublishedAssessmentIfc; +import org.springframework.dao.DataAccessException; +import org.springframework.orm.hibernate3.HibernateCallback; +import org.springframework.orm.hibernate3.support.HibernateDaoSupport; + +import java.util.List; + +/** + * @author Leonardo Canessa [lcanessa1 (at) udayton (dot) edu] + */ +@Slf4j +public class ExtendedTimeQueries extends HibernateDaoSupport implements ExtendedTimeQueriesAPI { + + /** + * init + */ + public void init () { + log.info("init()"); + } + + /** + * {@inheritDoc} + */ + @SuppressWarnings("unchecked") + public List getEntriesForAss (AssessmentBaseIfc ass) { + log.debug("getEntriesForAss " + ass.getAssessmentBaseId()); + + try { + HibernateCallback hcb = (Session s) -> { + Query q = s.getNamedQuery(QUERY_GET_ENTRIES_FOR_ASSESSMENT); + q.setParameter(ASSESSMENT_ID, ass, new ManyToOneType(null, "org.sakaiproject.tool.assessment.data.dao.assessment.AssessmentBaseData")); + return q.list(); + }; + return (List) getHibernateTemplate().execute(hcb); + } catch (DataAccessException e) { + log.error("Failed to get Extended TimeEntries for Assessment: " + ass.getAssessmentBaseId(), e); + return null; + } + } + + /** + * {@inheritDoc} + */ + @SuppressWarnings("unchecked") + public List getEntriesForPub (PublishedAssessmentIfc pub) { + log.debug("getEntriesForPub " + pub.getPublishedAssessmentId()); + + try { + HibernateCallback hcb = (Session s) -> { + Query q = s.getNamedQuery(QUERY_GET_ENTRIES_FOR_PUBLISHED); + q.setParameter(PUBLISHED_ID, pub, new ManyToOneType(null, "org.sakaiproject.tool.assessment.data.dao.assessment.PublishedAssessmentData")); + return q.list(); + }; + + return (List) getHibernateTemplate().execute(hcb); + } catch (DataAccessException e) { + log.error("Failed to get Extended Time Entries for Published Assessment: " + pub.getPublishedAssessmentId(), e); + return null; + } + } + + /** + * {@inheritDoc} + */ + public ExtendedTime getEntryForPubAndUser (PublishedAssessmentIfc pub, String userId) { + log.debug("getEntryForPubAndUser, pub: '" + pub.getPublishedAssessmentId() + "' User: " + userId); + + return getPubAndX(QUERY_GET_ENTRY_FOR_PUB_N_USER, pub, USER_ID, userId); + } + + /** + * {@inheritDoc} + */ + public ExtendedTime getEntryForPubAndGroup (PublishedAssessmentIfc pub, String groupId) { + log.debug("getEntryForPubAndGroup, pub: '" + pub.getPublishedAssessmentId() + "' group: " + groupId); + + return getPubAndX(QUERY_GET_ENTRY_FOR_PUB_N_GROUP, pub, GROUP, groupId); + } + + /** + * {@inheritDoc} + */ + public boolean updateEntry (ExtendedTime e) { + log.debug("updating entry assessment: '" + e.getAssessmentId() + "' pubId: '" + e.getPubAssessmentId() + "' user: '" + e.getUser() + "' group: " + e.getGroup()); + + try { + getHibernateTemplate().saveOrUpdate(e); + return true; + } catch (DataAccessException de) { + log.error("Error updating extended time entry" , de); + return false; + } + } + + /** + * {@inheritDoc} + */ + public void updateEntries (List entries) { + entries.forEach(this::updateEntry); + } + + /** + * {@inheritDoc} + */ + public boolean deleteEntry (final ExtendedTime e) { + log.debug("Removing ExtendedTime entry id: " + e.getId()); + + try { + getHibernateTemplate().delete(e); + return true; + } catch (DataAccessException de) { + log.error("Failed to delete extendedTime entry, id: " + e.getId() + ".", de); + return false; + } + } + + @SuppressWarnings("unchecked") + private ExtendedTime getPubAndX (final String query, final PublishedAssessmentIfc pub, final String secondParam, final String secondParamValue) { + try{ + HibernateCallback hcb = (Session s) -> { + Query q = s.getNamedQuery(query); + q.setParameter(PUBLISHED_ID, pub, new ManyToOneType(null, "org.sakaiproject.tool.assessment.data.dao.assessment.PublishedAssessmentData")); + q.setParameter(secondParam, secondParamValue, new StringType()); + return q.uniqueResult(); + }; + + return (ExtendedTime) getHibernateTemplate().execute(hcb); + } catch (DataAccessException e) { + log.error("Failed to get extended time for pub: " + pub.getPublishedAssessmentId() + " and user/group: " + secondParamValue, e); + return null; + } + } +} diff --git a/samigo/samigo-services/src/java/org/sakaiproject/tool/assessment/facade/ExtendedTimeQueriesAPI.java b/samigo/samigo-services/src/java/org/sakaiproject/tool/assessment/facade/ExtendedTimeQueriesAPI.java new file mode 100644 index 0000000000..6602648ff0 --- /dev/null +++ b/samigo/samigo-services/src/java/org/sakaiproject/tool/assessment/facade/ExtendedTimeQueriesAPI.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2016, The Apereo 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://opensource.org/licenses/ecl2 + * + * 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 org.sakaiproject.tool.assessment.data.dao.assessment.ExtendedTime; +import org.sakaiproject.tool.assessment.data.ifc.assessment.AssessmentBaseIfc; +import org.sakaiproject.tool.assessment.data.ifc.assessment.PublishedAssessmentIfc; + +import java.util.List; + +/** + * @author Leonardo Canessa [lcanessa1 (at) udayton (dot) edu] + */ +public interface ExtendedTimeQueriesAPI { + // Hibernate Named Queries + String QUERY_GET_ENTRIES_FOR_ASSESSMENT = "getEntriesForAss"; + String QUERY_GET_ENTRIES_FOR_PUBLISHED = "getEntriesForPub"; + String QUERY_GET_ENTRY_FOR_PUB_N_USER = "getEntriesForPubNUser"; + String QUERY_GET_ENTRY_FOR_PUB_N_GROUP = "getEntriesForPubNGroup"; + + // Hibernate Object Fields + String ASSESSMENT_ID = "assessmentId"; + String PUBLISHED_ID = "publishedId"; + String USER_ID = "userId"; + String GROUP = "groupId"; + + /** + * + * @param ass + * @return + */ + List getEntriesForAss (AssessmentBaseIfc ass); + + /** + * + * @param pub + * @return + */ + List getEntriesForPub (PublishedAssessmentIfc pub); + + /** + * + * @param pub + * @param userId + * @return + */ + ExtendedTime getEntryForPubAndUser (PublishedAssessmentIfc pub, String userId); + + /** + * + * @param pub + * @param groupId + * @return + */ + ExtendedTime getEntryForPubAndGroup (PublishedAssessmentIfc pub, String groupId); + + /** + * + * @param e + * @return + */ + boolean updateEntry (ExtendedTime e); + + /** + * + * @param entries + * @return + */ + void updateEntries (List entries); + + /** + * + * @param e + * @return + */ + boolean deleteEntry (ExtendedTime e); +} diff --git a/samigo/samigo-services/src/java/org/sakaiproject/tool/assessment/facade/PublishedAssessmentFacadeQueries.java b/samigo/samigo-services/src/java/org/sakaiproject/tool/assessment/facade/PublishedAssessmentFacadeQueries.java index 9a2d949d8f..a9c9dc48e9 100644 --- a/samigo/samigo-services/src/java/org/sakaiproject/tool/assessment/facade/PublishedAssessmentFacadeQueries.java +++ b/samigo/samigo-services/src/java/org/sakaiproject/tool/assessment/facade/PublishedAssessmentFacadeQueries.java @@ -53,43 +53,7 @@ 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.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.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.ItemTextAttachment; -import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedAccessControl; -import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedAnswer; -import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedAnswerFeedback; -import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedAssessmentAttachment; -import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedAssessmentData; -import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedAttachmentData; -import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedEvaluationModel; -import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedFeedback; -import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedItemAttachment; -import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedItemData; -import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedItemFeedback; -import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedItemMetaData; -import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedItemText; -import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedItemTextAttachment; -import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedMetaData; -import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedSectionAttachment; -import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedSectionData; -import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedSectionMetaData; -import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedSecuredIPAddress; -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.assessment.*; import org.sakaiproject.tool.assessment.data.dao.authz.AuthorizationData; import org.sakaiproject.tool.assessment.data.dao.grading.AssessmentGradingData; import org.sakaiproject.tool.assessment.data.dao.shared.TypeD; @@ -705,7 +669,7 @@ public Long getPublishedAssessmentId(Long assessmentId) { .find( "from PublishedAssessmentData as p where p.assessmentId=? order by p.createdDate desc", assessmentId); - Long publishedId = Long.valueOf(0); + Long publishedId = 0L; if (!list.isEmpty()) { PublishedAssessmentData f = (PublishedAssessmentData) list.get(0); publishedId = f.getPublishedAssessmentId(); @@ -929,7 +893,7 @@ public ArrayList getAllTakeableAssessments(String orderBy, public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery(hql); - q.setInteger(0, status.intValue()); + q.setInteger(0, status); return q.list(); }; }; @@ -1075,7 +1039,7 @@ public Object doInHibernate(Session session) Query q = session .createQuery("from PublishedAssessmentData as p where p.status=? order by p." + orderBy); - q.setInteger(0, status.intValue()); + q.setInteger(0, status); return q.list(); }; }; @@ -1169,8 +1133,7 @@ private String getOrderBy(String sortString) { } public void deleteAllSecuredIP(PublishedAssessmentIfc assessment) { - int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount() - .intValue(); + int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount(); while (retryCount > 0) { try { Long assessmentId = assessment.getPublishedAssessmentId(); @@ -1203,8 +1166,7 @@ public void saveOrUpdate(PublishedAssessmentIfc assessment) else data = (PublishedAssessmentData) assessment; - int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount() - .intValue(); + int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount(); while (retryCount > 0) { try { getHibernateTemplate().saveOrUpdate(data); @@ -1234,7 +1196,7 @@ public ArrayList getBasicInfoOfAllActivePublishedAssessments( //+ " and (z.agentIdString=:siteId or z.agentIdString in (:groupIds)) " + " and z.agentIdString=:siteId " + " order by p." + orderBy; - if (ascending == true) + if (ascending) query += " asc"; else query += " desc"; @@ -1354,7 +1316,7 @@ public Object doInHibernate(Session session) TreeMap groupsForSite = null; String releaseToGroups; String lastModifiedBy = ""; - AgentFacade agent = null; + AgentFacade agent; for (int i = 0; i < list.size(); i++) { PublishedAssessmentData p = (PublishedAssessmentData) list.get(i); releaseToGroups = null; @@ -1430,7 +1392,6 @@ public PublishedItemText loadPublishedItemText(Long itemTextId) { * * @param orderBy * @param ascending - * @param status * @param siteId * @return */ @@ -1650,8 +1611,7 @@ public HashMap getTotalSubmissionPerAssessment(String agentId) { HashMap h = new HashMap(); for (int i = 0; i < l.size(); i++) { AssessmentGradingData d = (AssessmentGradingData) l.get(i); - h.put(d.getPublishedAssessmentId(), Integer.valueOf(d - .getTotalSubmitted())); + h.put(d.getPublishedAssessmentId(), d.getTotalSubmitted()); log.debug("pId=" + d.getPublishedAssessmentId() + " submitted=" + d.getTotalSubmitted()); } @@ -1663,8 +1623,7 @@ public HashMap getTotalSubmissionPerAssessment(String agentId, String siteId) { HashMap h = new HashMap(); for (int i = 0; i < l.size(); i++) { AssessmentGradingData d = (AssessmentGradingData) l.get(i); - h.put(d.getPublishedAssessmentId(), Integer.valueOf(d - .getTotalSubmitted())); + h.put(d.getPublishedAssessmentId(), d.getTotalSubmitted()); log.debug("pId=" + d.getPublishedAssessmentId() + " submitted=" + d.getTotalSubmitted()); } @@ -1686,7 +1645,7 @@ public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery(query); q.setBoolean(0, true); - q.setLong(1, publishedAssessmentId.longValue()); + q.setLong(1, publishedAssessmentId); return q.list(); }; }; @@ -1706,7 +1665,7 @@ public Object doInHibernate(Session session) Query q = session.createQuery(query); q.setBoolean(0, true); q.setString(1, agentId); - q.setLong(2, publishedAssessmentId.longValue()); + q.setLong(2, publishedAssessmentId); return q.list(); }; }; @@ -1760,8 +1719,7 @@ public Object doInHibernate(Session session) } public void saveOrUpdateMetaData(PublishedMetaData meta) { - int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount() - .intValue(); + int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount(); while (retryCount > 0) { try { getHibernateTemplate().saveOrUpdate(meta); @@ -1875,7 +1833,7 @@ public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery(query); q.setString(0, title); - q.setLong(1, assessmentBaseId.longValue()); + q.setLong(1, assessmentBaseId); q.setInteger(2, 2); q.setString(3, "OWN_PUBLISHED_ASSESSMENT"); q.setString(4, currentSiteId); @@ -1906,7 +1864,7 @@ public boolean hasRandomPart(final Long publishedAssessmentId) { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery(query); - q.setLong(0, publishedAssessmentId.longValue()); + q.setLong(0, publishedAssessmentId); q.setString(1, key); q.setString(2, value); return q.list(); @@ -1959,7 +1917,7 @@ public PublishedItemData getFirstPublishedItem( public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery(query); - q.setLong(0, publishedAssessmentId.longValue()); + q.setLong(0, publishedAssessmentId); return q.list(); }; }; @@ -1975,7 +1933,7 @@ public Object doInHibernate(Session session) public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery(query2); - q.setLong(0, publishedAssessmentId.longValue()); + q.setLong(0, publishedAssessmentId); //q.setString(1, key); //q.setString(2, value); return q.list(); @@ -2015,7 +1973,7 @@ public Object doInHibernate(Session session) .createQuery("select i.itemId from PublishedItemData i, PublishedSectionData s, " + " PublishedAssessmentData p where p.publishedAssessmentId=? and " + " p = s.assessment and i.section = s"); - q.setLong(0, publishedAssessmentId.longValue()); + q.setLong(0, publishedAssessmentId); return q.list(); }; }; @@ -2038,8 +1996,8 @@ public Object doInHibernate(Session session) .createQuery("select i from PublishedItemData i, PublishedSectionData s, " + " PublishedAssessmentData p where p.publishedAssessmentId=? " + " and i.section.id=? and p = s.assessment and i.section = s"); - q.setLong(0, publishedAssessmentId.longValue()); - q.setLong(1, sectionId.longValue()); + q.setLong(0, publishedAssessmentId); + q.setLong(1, sectionId); return q.list(); }; }; @@ -2064,7 +2022,7 @@ public Long getItemType(final Long publishedItemId) { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery(query); - q.setLong(0, publishedItemId.longValue()); + q.setLong(0, publishedItemId); return q.list(); }; }; @@ -2101,8 +2059,7 @@ public void delete(PublishedAssessmentIfc assessment) { else data = (PublishedAssessmentData) assessment; - int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount() - .intValue(); + int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount(); while (retryCount > 0) { try { getHibernateTemplate().delete(data); @@ -2156,8 +2113,8 @@ public boolean isRandomDrawPart(final Long publishedAssessmentId, public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery(query); - q.setLong(0, publishedAssessmentId.longValue()); - q.setLong(1, sectionId.longValue()); + q.setLong(0, publishedAssessmentId); + q.setLong(1, sectionId); q.setString(2, key); q.setString(3, value); return q.list(); @@ -2407,7 +2364,7 @@ public PublishedAssessmentData getBasicInfoOfPublishedAssessment( public Object doInHibernate(Session session) throws HibernateException, SQLException { Query q = session.createQuery(hql); - q.setLong(0, publishedId.longValue()); + q.setLong(0, publishedId); return q.list(); }; }; @@ -2448,21 +2405,6 @@ public String getPublishedAssessmentSiteId(String publishedAssessmentId) { public Integer getPublishedItemCount(final Long publishedAssessmentId) { return getPublishedItemCountForNonRandomSections(publishedAssessmentId) + getPublishedItemCountForRandomSections(publishedAssessmentId); -/* - final HibernateCallback hcb = new HibernateCallback() { - public Object doInHibernate(Session session) - throws HibernateException, SQLException { - Query q = session - .createQuery("select count(i) from PublishedItemData i, PublishedSectionData s, " - + " PublishedAssessmentData p where p.publishedAssessmentId=? and " - + " p = s.assessment and i.section = s"); - q.setLong(0, publishedAssessmentId.longValue()); - return q.list(); - }; - }; - List list = getHibernateTemplate().executeFind(hcb); - return (Integer) list.get(0); -*/ } /** @@ -2478,7 +2420,7 @@ public Object doInHibernate(Session session) + " PublishedAssessmentData p, PublishedSectionMetaData m " + " where p.publishedAssessmentId=:publishedAssessmentId and m.label=:metaDataLabel and " + " p = s.assessment and m.section = s "); - q.setLong("publishedAssessmentId", publishedAssessmentId.longValue()); + q.setLong("publishedAssessmentId", publishedAssessmentId); q.setString("metaDataLabel", SectionDataIfc.NUM_QUESTIONS_DRAWN); //q.setString("metaDataEntry", SectionDataIfc.RANDOM_DRAW_FROM_QUESTIONPOOL.toString()); return q.list(); @@ -2509,10 +2451,9 @@ public Object doInHibernate(Session session) + " where p.publishedAssessmentId=:publishedAssessmentId and m.label=:metaDataLabel and " + " p = s.assessment and i.section = s and m.section = s and m.entry=:metaDataEntry "); - q.setLong("publishedAssessmentId", publishedAssessmentId.longValue()); + q.setLong("publishedAssessmentId", publishedAssessmentId); q.setString("metaDataLabel", SectionDataIfc.AUTHOR_TYPE); q.setString("metaDataEntry", SectionDataIfc.QUESTIONS_AUTHORED_ONE_BY_ONE.toString()); - //q.setLong(0, publishedAssessmentId.longValue()); return q.list(); }; }; @@ -2528,7 +2469,7 @@ public Object doInHibernate(Session session) .createQuery("select count(s) from PublishedSectionData s, " + " PublishedAssessmentData p where p.publishedAssessmentId=? and " + " p = s.assessment"); - q.setLong(0, publishedAssessmentId.longValue()); + q.setLong(0, publishedAssessmentId); return q.list(); }; }; @@ -2548,13 +2489,10 @@ public PublishedAttachmentData getPublishedAttachmentData(Long attachmentId) { public void updateAssessmentLastModifiedInfo( PublishedAssessmentFacade publishedAssessmentFacade) { - int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount() - .intValue(); AssessmentBaseIfc data = publishedAssessmentFacade.getData(); data.setLastModifiedBy(AgentFacade.getAgentString()); data.setLastModifiedDate(new Date()); - retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount() - .intValue(); + int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount(); while (retryCount > 0) { try { getHibernateTemplate().update(data); @@ -2568,8 +2506,7 @@ public void updateAssessmentLastModifiedInfo( } public void saveOrUpdateSection(SectionFacade section) { - int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount() - .intValue(); + int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount(); while (retryCount > 0) { try { getHibernateTemplate().saveOrUpdate(section.getData()); @@ -2586,8 +2523,7 @@ public void removeItemAttachment(Long itemAttachmentId) { PublishedItemAttachment itemAttachment = (PublishedItemAttachment) getHibernateTemplate() .load(PublishedItemAttachment.class, itemAttachmentId); ItemDataIfc item = itemAttachment.getItem(); - int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount() - .intValue(); + int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount(); while (retryCount > 0) { try { if (item != null) { // need to dissociate with item before @@ -2620,7 +2556,7 @@ public PublishedSectionFacade addSection(Long publishedAssessmentId) { // #2 section has no default name - per Marc's new mockup PublishedSectionData section = new PublishedSectionData( null, - Integer.valueOf(sectionSet.size() + 1), // NEXT section + sectionSet.size() + 1, // NEXT section "", "", TypeD.DEFAULT_SECTION, SectionData.ACTIVE_STATUS, AgentFacade.getAgentString(), new Date(), AgentFacade .getAgentString(), new Date()); @@ -2634,8 +2570,7 @@ public PublishedSectionFacade addSection(Long publishedAssessmentId) { SectionDataIfc.AS_LISTED_ON_ASSESSMENT_PAGE.toString()); sectionSet.add(section); - int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount() - .intValue(); + int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount(); while (retryCount > 0) { try { getHibernateTemplate().saveOrUpdate(section); @@ -2671,8 +2606,7 @@ public AssessmentAccessControlIfc loadPublishedAccessControl( public void saveOrUpdatePublishedAccessControl( AssessmentAccessControlIfc publishedAccessControl) { - int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount() - .intValue(); + int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount(); while (retryCount > 0) { try { getHibernateTemplate().saveOrUpdate(publishedAccessControl); @@ -2786,7 +2720,7 @@ private String getReleaseToGroupsAsString(TreeMap groupsForSite, Long assessment */ private TreeMap getGroupsForSite(String siteId){ TreeMap sortedGroups = new TreeMap(); - Site site = null; + Site site; try { site = SiteService.getSite(siteId); Collection groups = site.getGroups(); @@ -2843,7 +2777,7 @@ public Integer getPublishedAssessmentStatus(Long publishedAssessmentId) { return status; } else { // just set to AssessmentBaseIfc.DEAD_STATUS - return Integer.valueOf(2); + return AssessmentBaseIfc.DEAD_STATUS; } } @@ -2903,8 +2837,7 @@ public void removeAssessmentAttachment(Long assessmentAttachmentId) { .load(PublishedAssessmentAttachment.class, assessmentAttachmentId); AssessmentIfc assessment = assessmentAttachment.getAssessment(); // String resourceId = assessmentAttachment.getResourceId(); - int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount() - .intValue(); + int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount(); while (retryCount > 0) { try { if (assessment != null) { // need to dissociate with @@ -2976,8 +2909,7 @@ public void removeSectionAttachment(Long sectionAttachmentId) { .load(PublishedSectionAttachment.class, sectionAttachmentId); SectionDataIfc section = sectionAttachment.getSection(); // String resourceId = sectionAttachment.getResourceId(); - int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount() - .intValue(); + int retryCount = PersistenceService.getInstance().getPersistenceHelper().getRetryCount(); while (retryCount > 0) { try { if (section != null) { // need to dissociate with section @@ -3044,439 +2976,6 @@ public Object doInHibernate(Session session) throws HibernateException, SQLExcep return getHibernateTemplate().executeFind(hcb); } - /** - * return an array list of the AssessmentGradingData that a user has - * submitted for grade. one per published assessment. If an assessment - * allows multiple submissions and its grading option is to send highest, - * then return only the submission with highest finalScore. If an assessment - * allows multiple submissions and its grading option is to send last, then - * return only the last submission. - * @author Mustansar Mehmood mustansar@rice.edu - * @param agentId - * @param siteId - * @return - */ - /* - public ArrayList getBasicInfoOfLastOrHighestOrAverageSubmittedAssessmentsByScoringOption( - final String agentId, final String siteId) { - // Get total no. of submission per assessment by the given agent - // sorted by submittedData DESC - final String last_query = "select new AssessmentGradingData(" - + " a.assessmentGradingId, p.publishedAssessmentId, p.title, a.agentId," - + " a.submittedDate, a.isLate," - + " a.forGrade, a.totalAutoScore, a.totalOverrideScore,a.finalScore," - + " a.comments, a.status, a.gradedBy, a.gradedDate, a.attemptDate," - + " a.timeElapsed) " - + " from AssessmentGradingData a, PublishedAssessmentData p, AuthorizationData az" - + " where a.publishedAssessmentId = p.publishedAssessmentId" - + " and a.forGrade=? and a.agentId=? and az.agentIdString=? " - + " and az.functionId=? and az.qualifierId=p.publishedAssessmentId" - + " order by p.publishedAssessmentId DESC, a.submittedDate DESC"; - - // Get total no. of submission per assessment by the given agent - // sorted by finalScore DESC - - final String highest_query = "select new AssessmentGradingData(" - + " a.assessmentGradingId, p.publishedAssessmentId, p.title, a.agentId," - + " a.submittedDate, a.isLate," - + " a.forGrade, a.totalAutoScore, a.totalOverrideScore,a.finalScore," - + " a.comments, a.status, a.gradedBy, a.gradedDate, a.attemptDate," - + " a.timeElapsed) " - + " from AssessmentGradingData a, PublishedAssessmentData p, AuthorizationData az" - + " where a.publishedAssessmentId = p.publishedAssessmentId" - + " and a.forGrade=? and a.agentId=? and az.agentIdString=? " - + " and az.functionId=? and az.qualifierId=p.publishedAssessmentId" - + " order by p.publishedAssessmentId DESC, a.finalScore DESC, a.submittedDate DESC"; - - final HibernateCallback hcb_last = new HibernateCallback() { - public Object doInHibernate(Session session) - throws HibernateException, SQLException { - Query q = session.createQuery(last_query); - q.setBoolean(0, true); - q.setString(1, agentId); - q.setString(2, siteId); - q.setString(3, "TAKE_PUBLISHED_ASSESSMENT"); - return q.list(); - }; - }; - - // this list is sorted by submittedDate desc. - List last_list = getHibernateTemplate().executeFind(hcb_last); - - final HibernateCallback hcb_highest = new HibernateCallback() { - public Object doInHibernate(Session session) - throws HibernateException, SQLException { - Query q = session.createQuery(highest_query); - q.setBoolean(0, true); - q.setString(1, agentId); - q.setString(2, siteId); - q.setString(3, "TAKE_PUBLISHED_ASSESSMENT"); - return q.list(); - }; - }; - - // this list is sorted by finalScore desc. - - List highest_list = getHibernateTemplate().executeFind(hcb_highest); - - //getEvaluationModel(); - String query = "select a.publishedAssessmentId, e.scoringType, ac.submissionsAllowed " + - "from PublishedEvaluationModel e, PublishedAccessControl ac, PublishedAssessmentData a " + - "where e.assessment.publishedAssessmentId = a.publishedAssessmentId " + - "and ac.assessment.publishedAssessmentId = a.publishedAssessmentId "; - - List l = getHibernateTemplate().find(query); - HashMap scoringTypeMap = new HashMap(); - HashMap subissionAllowedMap = new HashMap(); - Iterator iter = l.iterator(); - while (iter.hasNext()) { - Object o[] = (Object[]) iter.next(); - scoringTypeMap.put(o[0], o[1]); - subissionAllowedMap.put(o[0], o[2]); - } - - // The sorting for each column will be done in the action listener. - ArrayList assessmentList = new ArrayList(); - Long currentid = new Long("0"); - Integer scoringOption = EvaluationModelIfc.LAST_SCORE; // use Last as - Integer submissionAllowed = null; - boolean multiSubmissionAllowed = false; - - // now go through the last_list, and get the first entry in the list for - // each publishedAssessment, if - // not - - for (int i = 0; i < last_list.size(); i++) { - AssessmentGradingData a = (AssessmentGradingData) last_list.get(i); - - // get the scoring option - if (scoringTypeMap.get(a.getPublishedAssessmentId()) != null) { - scoringOption = (Integer) scoringTypeMap.get(a.getPublishedAssessmentId()); - } - else { - // I use Last as default because it is what set above - scoringOption = EvaluationModelIfc.LAST_SCORE; - } - if (subissionAllowedMap.get(a.getPublishedAssessmentId()) != null) { - submissionAllowed = (Integer) subissionAllowedMap.get(a.getPublishedAssessmentId()); - } - else { - submissionAllowed = null; - } - if (submissionAllowed != null) { - if (submissionAllowed.intValue() == 1) { - scoringOption = EvaluationModelIfc.LAST_SCORE; - } - } - - - if (EvaluationModelIfc.LAST_SCORE.equals(scoringOption) && !a.getPublishedAssessmentId().equals(currentid)) { - currentid = a.getPublishedAssessmentId(); - AssessmentGradingData f = new AssessmentGradingData(a); - assessmentList.add(f); - } - - } - - // now go through the highest_list ,and get the first entry in the list - // for each publishedAssessment. - - for (int i = 0; i < highest_list.size(); i++) { - AssessmentGradingData a = (AssessmentGradingData) highest_list - .get(i); - - // get the scoring option - if (scoringTypeMap.get(a.getPublishedAssessmentId()) != null) { - scoringOption = (Integer) scoringTypeMap.get(a.getPublishedAssessmentId()); - } - else { - // I use Last as default because it is what set above - scoringOption = EvaluationModelIfc.LAST_SCORE; - } - if (subissionAllowedMap.get(a.getPublishedAssessmentId()) != null) { - submissionAllowed = (Integer) subissionAllowedMap.get(a.getPublishedAssessmentId()); - } - else { - submissionAllowed = null; - } - if (submissionAllowed != null) { - if (submissionAllowed.intValue() > 1) { - multiSubmissionAllowed = true; - } - else { - multiSubmissionAllowed = false; - } - } - else { - multiSubmissionAllowed = true; - } - - if ((multiSubmissionAllowed) - && (EvaluationModelIfc.HIGHEST_SCORE.equals(scoringOption)) - && (!a.getPublishedAssessmentId().equals(currentid))) { - currentid = a.getPublishedAssessmentId(); - AssessmentGradingData f = new AssessmentGradingData(a); - assessmentList.add(f); - } - - } - //*assessments with average grades - - for (int i = 0; i < highest_list.size(); i++) { - AssessmentGradingData a = (AssessmentGradingData) highest_list.get(i); - - // get the scoring option - if (scoringTypeMap.get(a.getPublishedAssessmentId()) != null) { - scoringOption = (Integer) scoringTypeMap.get(a.getPublishedAssessmentId()); - } - else { - // I use Last as default because it is what set above --mustansar - scoringOption = EvaluationModelIfc.LAST_SCORE; - } - if (subissionAllowedMap.get(a.getPublishedAssessmentId()) != null) { - submissionAllowed = (Integer) subissionAllowedMap.get(a.getPublishedAssessmentId()); - } - else { - submissionAllowed = null; - } - if (submissionAllowed != null) { - if (submissionAllowed.intValue() > 1) { - multiSubmissionAllowed = true; - } - else { - multiSubmissionAllowed = false; - } - } - else { - multiSubmissionAllowed = true; - } - - if ((multiSubmissionAllowed) - && (EvaluationModelIfc.AVERAGE_SCORE.equals(scoringOption)) - && (!a.getPublishedAssessmentId().equals(currentid))) { - currentid = a.getPublishedAssessmentId(); - - AssessmentGradingData f = new AssessmentGradingData(a); - assessmentList.add(f); - } - - } - //end of finding assessments with average grades - //return assessmentList; - return null; - } - */ - - /** - * return an array list of the AssessmentGradingData that a user has - * submitted for grade. one per published assessment. If an assessment - * allows multiple submissions and its grading option is to send highest, - * then return only the submission with highest finalScore. If an assessment - * allows multiple submissions and its grading option is to send last, then - * return only the last submission. - * @author Mustansar Mehmood mustansar@rice.edu - * @param agentId - * @param siteId - * @param allAssessments - * @return - */ - /* - public ArrayList getBasicInfoOfLastOrHighestOrAverageSubmittedAssessmentsByScoringOption( - final String agentId, final String siteId, boolean allAssessments) { - // Get total no. of submission per assessment by the given agent - // sorted by submittedData DESC - final String last_query = "select new AssessmentGradingData(" - + " a.assessmentGradingId, p.publishedAssessmentId, p.title, a.agentId," - + " a.submittedDate, a.isLate," - + " a.forGrade, a.totalAutoScore, a.totalOverrideScore,a.finalScore," - + " a.comments, a.status, a.gradedBy, a.gradedDate, a.attemptDate," - + " a.timeElapsed) " - + " from AssessmentGradingData a, PublishedAssessmentData p, AuthorizationData az" - + " where a.publishedAssessmentId = p.publishedAssessmentId" - + " and a.forGrade=? and a.agentId=? and az.agentIdString=? " - + " and az.functionId=? and az.qualifierId=p.publishedAssessmentId" - + " order by p.publishedAssessmentId DESC, a.submittedDate DESC"; - - // Get total no. of submission per assessment by the given agent - // sorted by finalScore DESC - - final String highest_query = "select new AssessmentGradingData(" - + " a.assessmentGradingId, p.publishedAssessmentId, p.title, a.agentId," - + " a.submittedDate, a.isLate," - + " a.forGrade, a.totalAutoScore, a.totalOverrideScore,a.finalScore," - + " a.comments, a.status, a.gradedBy, a.gradedDate, a.attemptDate," - + " a.timeElapsed) " - + " from AssessmentGradingData a, PublishedAssessmentData p, AuthorizationData az" - + " where a.publishedAssessmentId = p.publishedAssessmentId" - + " and a.forGrade=? and a.agentId=? and az.agentIdString=? " - + " and az.functionId=? and az.qualifierId=p.publishedAssessmentId" - + " order by p.publishedAssessmentId DESC, a.finalScore DESC, a.submittedDate DESC"; - - final HibernateCallback hcb_last = new HibernateCallback() { - public Object doInHibernate(Session session) - throws HibernateException, SQLException { - Query q = session.createQuery(last_query); - q.setBoolean(0, true); - q.setString(1, agentId); - q.setString(2, siteId); - q.setString(3, "TAKE_PUBLISHED_ASSESSMENT"); - return q.list(); - }; - }; - - // this list is sorted by submittedDate desc. - List last_list = getHibernateTemplate().executeFind(hcb_last); - - final HibernateCallback hcb_highest = new HibernateCallback() { - public Object doInHibernate(Session session)throws HibernateException, SQLException { - Query q = session.createQuery(highest_query); - q.setBoolean(0, true); - q.setString(1, agentId); - q.setString(2, siteId); - q.setString(3, "TAKE_PUBLISHED_ASSESSMENT"); - return q.list(); - }; - }; - - // this list is sorted by finalScore desc. - List highest_list = getHibernateTemplate().executeFind(hcb_highest); - String query = "select a.publishedAssessmentId, e.scoringType, ac.submissionsAllowed " - + "from PublishedEvaluationModel e, PublishedAccessControl ac, PublishedAssessmentData a " - + "where e.assessment.publishedAssessmentId = a.publishedAssessmentId " - + "and ac.assessment.publishedAssessmentId = a.publishedAssessmentId "; - - List l = getHibernateTemplate().find(query); - HashMap scoringTypeMap = new HashMap(); - HashMap subissionAllowedMap = new HashMap(); - Iterator iter = l.iterator(); - while (iter.hasNext()) { - Object o[] = (Object[]) iter.next(); - scoringTypeMap.put(o[0], o[1]); - subissionAllowedMap.put(o[0], o[2]); - } - // The sorting for each column will be done in the action listener. - ArrayList assessmentList = new ArrayList(); - Long currentid = new Long("0"); - Integer scoringOption = EvaluationModelIfc.LAST_SCORE; // use Last as defaut - Integer submissionAllowed = null; - boolean multiSubmissionAllowed = false; - - // now go through the last_list, and get the first entry in the list for - // each publishedAssessment, if not - - for (int i = 0; i < last_list.size(); i++) { - AssessmentGradingData a = (AssessmentGradingData) last_list.get(i); - - // get the scoring option - if (scoringTypeMap.get(a.getPublishedAssessmentId()) != null) { - scoringOption = (Integer) scoringTypeMap.get(a - .getPublishedAssessmentId()); - } else { - // I use Last as default because it is what set above - scoringOption = EvaluationModelIfc.LAST_SCORE; - } - if (subissionAllowedMap.get(a.getPublishedAssessmentId()) != null) { - submissionAllowed = (Integer) subissionAllowedMap.get(a - .getPublishedAssessmentId()); - } else { - submissionAllowed = null; - } - if (submissionAllowed != null) { - if (submissionAllowed.intValue() == 1) { - scoringOption = EvaluationModelIfc.LAST_SCORE; - } - } - if (EvaluationModelIfc.LAST_SCORE.equals(scoringOption) - && (!a.getPublishedAssessmentId().equals(currentid) - || allAssessments)) { - currentid = a.getPublishedAssessmentId(); - AssessmentGradingData f = new AssessmentGradingData(a); - assessmentList.add(f); - } - - } - - // now go through the highest_list ,and get the first entry in the list - // for each publishedAssessment. - - for (int i = 0; i < highest_list.size(); i++) { - AssessmentGradingData a = (AssessmentGradingData) highest_list.get(i); - - // get the scoring option - if (scoringTypeMap.get(a.getPublishedAssessmentId()) != null) { - scoringOption = (Integer) scoringTypeMap.get(a - .getPublishedAssessmentId()); - } else { - // I use Last as default because it is what set above - scoringOption = EvaluationModelIfc.LAST_SCORE; - } - if (subissionAllowedMap.get(a.getPublishedAssessmentId()) != null) { - submissionAllowed = (Integer) subissionAllowedMap.get(a - .getPublishedAssessmentId()); - } else { - submissionAllowed = null; - } - if (submissionAllowed != null) { - if (submissionAllowed.intValue() > 1) { - multiSubmissionAllowed = true; - } else { - multiSubmissionAllowed = false; - } - } else { - multiSubmissionAllowed = true; - } - - if ((multiSubmissionAllowed) - && (EvaluationModelIfc.HIGHEST_SCORE.equals(scoringOption)) - && ((!a.getPublishedAssessmentId().equals(currentid)) - || allAssessments)) { - currentid = a.getPublishedAssessmentId(); - AssessmentGradingData f = new AssessmentGradingData(a); - assessmentList.add(f); - } - } - - // assessments with average grades - - for (int i = 0; i < last_list.size(); i++) { - AssessmentGradingData a = (AssessmentGradingData) last_list.get(i); - // get the scoring option - if (scoringTypeMap.get(a.getPublishedAssessmentId()) != null) { - scoringOption = (Integer) scoringTypeMap.get(a.getPublishedAssessmentId()); - } else { - // I use Last as default because it is what set above - // --mustansar - scoringOption = EvaluationModelIfc.LAST_SCORE; - } - if (subissionAllowedMap.get(a.getPublishedAssessmentId()) != null) { - submissionAllowed = (Integer) subissionAllowedMap.get(a.getPublishedAssessmentId()); - } else { - submissionAllowed = null; - } - if (submissionAllowed != null) { - if (submissionAllowed.intValue() > 1) { - multiSubmissionAllowed = true; - } else { - multiSubmissionAllowed = false; - } - } else { - multiSubmissionAllowed = true; - } - if ( - (multiSubmissionAllowed) - && (EvaluationModelIfc.AVERAGE_SCORE.equals(scoringOption))&& (!a.getPublishedAssessmentId().equals(currentid)|| allAssessments)) { - currentid = a.getPublishedAssessmentId(); - AssessmentGradingData f = new AssessmentGradingData(a); - assessmentList.add(f); - } - } - - // end of finding assessments with average grades - - return assessmentList; - } - */ - /** * Replaces embedded site ids for Items. * Helper method for replaceEmbeddedSiteIds(); handles the question (item) level. This diff --git a/samigo/samigo-services/src/java/org/sakaiproject/tool/assessment/facade/PublishedAssessmentFacadeQueriesAPI.java b/samigo/samigo-services/src/java/org/sakaiproject/tool/assessment/facade/PublishedAssessmentFacadeQueriesAPI.java index 929cbe62ed..a365936e44 100644 --- a/samigo/samigo-services/src/java/org/sakaiproject/tool/assessment/facade/PublishedAssessmentFacadeQueriesAPI.java +++ b/samigo/samigo-services/src/java/org/sakaiproject/tool/assessment/facade/PublishedAssessmentFacadeQueriesAPI.java @@ -29,20 +29,7 @@ import java.util.TreeMap; import java.util.Collection; -import org.sakaiproject.tool.assessment.data.dao.assessment.AssessmentAccessControl; -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.EvaluationModel; -import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedAccessControl; -import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedAnswer; -import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedAssessmentData; -import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedAttachmentData; -import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedEvaluationModel; -import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedFeedback; -import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedItemData; -import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedItemText; -import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedMetaData; -import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedSectionData; +import org.sakaiproject.tool.assessment.data.dao.assessment.*; import org.sakaiproject.tool.assessment.data.ifc.assessment.AssessmentAttachmentIfc; import org.sakaiproject.tool.assessment.data.ifc.assessment.AssessmentIfc; import org.sakaiproject.tool.assessment.data.ifc.assessment.AttachmentIfc; @@ -139,72 +126,11 @@ public Set preparePublishedAnswerFeedbackSet(PublishedAnswer publishedAnswer, public ArrayList getAllTakeableAssessments(String orderBy, boolean ascending, Integer status); - /** - public ArrayList getAllPublishedAssessmentId() { - - ArrayList list = getBasicInfoOfAllActivePublishedAssessments("title", true); - ArrayList publishedIds = new ArrayList(); - for (int i = 0; i < list.size(); i++) { - PublishedAssessmentFacade f = (PublishedAssessmentFacade) list.get(i); - Long publishedId = f.getPublishedAssessmentId(); - publishedIds.add(publishedId); - } - return publishedIds; - - } - */ - public Integer getNumberOfSubmissions(String publishedAssessmentId, String agentId); public List getNumberOfSubmissionsOfAllAssessmentsByAgent(String agentId); - /** - public ArrayList getAllReviewableAssessments(String orderBy, - boolean ascending) { - - ArrayList publishedIds = getAllPublishedAssessmentId(); - ArrayList newlist = new ArrayList(); - for (int i = 0; i < publishedIds.size(); i++) { - String publishedId = ( (Long) publishedIds.get(i)).toString(); - String query = "from AssessmentGradingData a where a.publishedAssessment.publishedAssessmentId=? order by agentId ASC," + - orderBy; - if (ascending) { - query += " asc,"; - } - else { - query += " desc,"; - } - query += "submittedDate DESC"; - List list = getHibernateTemplate().find(query, new Long(publishedId), - Hibernate.LONG); - if (!list.isEmpty()) { - Iterator items = list.iterator(); - String agentid = null; - AssessmentGradingData data = (AssessmentGradingData) items.next(); - agentid = data.getAgentId(); - newlist.add(data); - while (items.hasNext()) { - while (items.hasNext()) { - data = (AssessmentGradingData) items.next(); - if (!data.getAgentId().equals(agentid)) { - agentid = data.getAgentId(); - newlist.add(data); - break; - } - } - } - } - } - ArrayList assessmentList = new ArrayList(); - for (int i = 0; i < newlist.size(); i++) { - AssessmentGradingData a = (AssessmentGradingData) newlist.get(i); - AssessmentGradingFacade f = new AssessmentGradingFacade(a); - assessmentList.add(f); - } - return assessmentList; - } - */ public ArrayList getAllPublishedAssessments(String sortString); public ArrayList getAllPublishedAssessments(String sortString, Integer status); diff --git a/samigo/samigo-services/src/java/org/sakaiproject/tool/assessment/services/PersistenceService.java b/samigo/samigo-services/src/java/org/sakaiproject/tool/assessment/services/PersistenceService.java index c2e1b1cc31..54feff77f5 100644 --- a/samigo/samigo-services/src/java/org/sakaiproject/tool/assessment/services/PersistenceService.java +++ b/samigo/samigo-services/src/java/org/sakaiproject/tool/assessment/services/PersistenceService.java @@ -26,18 +26,7 @@ import org.slf4j.LoggerFactory; import org.sakaiproject.component.cover.ComponentManager; import org.sakaiproject.section.api.SectionAwareness; -import org.sakaiproject.tool.assessment.facade.AssessmentFacadeQueriesAPI; -import org.sakaiproject.tool.assessment.facade.AssessmentGradingFacadeQueriesAPI; -import org.sakaiproject.tool.assessment.facade.AuthzQueriesFacadeAPI; -import org.sakaiproject.tool.assessment.facade.FavoriteColChoicesFacadeQueriesAPI; -import org.sakaiproject.tool.assessment.facade.EventLogFacadeQueriesAPI; -import org.sakaiproject.tool.assessment.facade.ItemFacadeQueriesAPI; -import org.sakaiproject.tool.assessment.facade.PublishedAssessmentFacadeQueriesAPI; -import org.sakaiproject.tool.assessment.facade.PublishedItemFacadeQueriesAPI; -import org.sakaiproject.tool.assessment.facade.PublishedSectionFacadeQueriesAPI; -import org.sakaiproject.tool.assessment.facade.QuestionPoolFacadeQueriesAPI; -import org.sakaiproject.tool.assessment.facade.SectionFacadeQueriesAPI; -import org.sakaiproject.tool.assessment.facade.TypeFacadeQueriesAPI; +import org.sakaiproject.tool.assessment.facade.*; import org.sakaiproject.tool.assessment.facade.authz.AuthorizationFacadeQueriesAPI; import org.sakaiproject.tool.assessment.facade.util.PagingUtilQueriesAPI; import org.sakaiproject.tool.assessment.facade.util.autosubmit.AutoSubmitQueriesAPI; @@ -67,6 +56,7 @@ public class PersistenceService{ private SectionAwareness sectionAwareness; private FavoriteColChoicesFacadeQueriesAPI favoriteColChoicesFacadeQueries; private PersistenceHelper persistenceHelper; + private ExtendedTimeFacade extendedTimeFacade; private EventLogFacadeQueriesAPI eventLogFacadeQueries; @@ -262,6 +252,14 @@ public void setFavoriteColChoicesFacadeQueries(FavoriteColChoicesFacadeQueriesAP public FavoriteColChoicesFacadeQueriesAPI getFavoriteColChoicesFacadeQueries(){ return favoriteColChoicesFacadeQueries; } + + public void setExtendedTimeFacade(ExtendedTimeFacade extendedTimeFacade) { + this.extendedTimeFacade = extendedTimeFacade; + } + + public ExtendedTimeFacade getExtendedTimeFacade() { + return extendedTimeFacade; + } } diff --git a/samigo/samigo-services/src/java/org/sakaiproject/tool/assessment/services/assessment/PublishedAssessmentService.java b/samigo/samigo-services/src/java/org/sakaiproject/tool/assessment/services/assessment/PublishedAssessmentService.java index 91ad3e3bd1..fb38f15026 100644 --- a/samigo/samigo-services/src/java/org/sakaiproject/tool/assessment/services/assessment/PublishedAssessmentService.java +++ b/samigo/samigo-services/src/java/org/sakaiproject/tool/assessment/services/assessment/PublishedAssessmentService.java @@ -1,15 +1,11 @@ -/********************************************************************************** - * $URL$ - * $Id$ - *********************************************************************************** - * - * Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009 The Sakai Foundation +/* + * Copyright (c) 2016, The Apereo 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 + * http://opensource.org/licenses/ecl2 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -17,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. * - **********************************************************************************/ + */ package org.sakaiproject.tool.assessment.services.assessment; @@ -33,12 +29,7 @@ import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.sakaiproject.tool.assessment.data.dao.assessment.AssessmentAccessControl; -import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedAssessmentData; -import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedAttachmentData; -import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedItemData; -import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedItemText; -import org.sakaiproject.tool.assessment.data.dao.assessment.PublishedMetaData; +import org.sakaiproject.tool.assessment.data.dao.assessment.*; import org.sakaiproject.tool.assessment.data.ifc.assessment.AnswerIfc; import org.sakaiproject.tool.assessment.data.ifc.assessment.AssessmentAccessControlIfc; import org.sakaiproject.tool.assessment.data.ifc.assessment.AssessmentAttachmentIfc; @@ -96,47 +87,6 @@ public ArrayList getBasicInfoOfAllPublishedAssessments2(String orderBy, getBasicInfoOfAllPublishedAssessments2(orderBy, ascending, siteId); } -/** - public ArrayList getAllReviewableAssessments(String agentId, String orderBy, - boolean ascending) { - - // 1. get total no. of submission per assessment by the given agent - HashMap h = getTotalSubmissionPerAssessment(agentId); - - ArrayList assessmentList = PersistenceService.getInstance(). - getPublishedAssessmentFacadeQueries(). - getAllReviewableAssessments(orderBy, ascending); - assessmentList.size()); - ArrayList reviewableAssessmentList = new ArrayList(); - for (int i = 0; i < assessmentList.size(); i++) { - AssessmentGradingFacade f = (AssessmentGradingFacade) assessmentList.get( - i); - - Integer NumberOfSubmissions = (Integer) h.get( - f.getPublishedAssessment().getPublishedAssessmentId()); - if (NumberOfSubmissions == null) { - NumberOfSubmissions = new Integer(0); - } - try { - if (!PersistenceService.getInstance().getAuthzQueriesFacade().isAuthorized(null, "VIEW_PUBLISHED_ASSESSMENT", - f.getPublishedAssessment(). - getPublishedAssessmentId(). - toString())) { - break; - } - } - catch (Exception e1) { - log.fatal("Wrapping Error around unhandled Exception: " - + e1.getMessage()); - throw new RuntimeException(e1.getMessage()); - } - // for testing only - reviewableAssessmentList.add(f); - } - return reviewableAssessmentList; - } -*/ - public ArrayList getAllActivePublishedAssessments(String orderBy) { return getAllPublishedAssessments(orderBy, PublishedAssessmentFacade.ACTIVE_STATUS); @@ -449,7 +399,7 @@ public Long getItemType(String publishedItemId){ } public HashMap preparePublishedItemTextHash(PublishedAssessmentIfc publishedAssessment){ - HashMap map = new HashMap(); + HashMap map = new HashMap<>(); List sectionArray = publishedAssessment.getSectionArray(); for (int i=0;i preparePublishedItemTextHash(PublishedAssessme } public HashMap preparePublishedItemHash(PublishedAssessmentIfc publishedAssessment){ - HashMap map = new HashMap(); + HashMap map = new HashMap<>(); List sectionArray = publishedAssessment.getSectionArray(); for (int i=0;i preparePublishedItemHash(PublishedAssessmentIf } public HashMap preparePublishedAnswerHash(PublishedAssessmentIfc publishedAssessment){ - HashMap map = new HashMap(); + HashMap map = new HashMap<>(); ArrayList sectionArray = publishedAssessment.getSectionArray(); for (int i=0;i preparePublishedAnswerHash(PublishedAssessmentIf } public HashMap prepareFIBItemHash(PublishedAssessmentIfc publishedAssessment){ - HashMap map = new HashMap(); + HashMap map = new HashMap<>(); ArrayList sectionArray = publishedAssessment.getSectionArray(); for (int i=0;i prepareFIBItemHash(PublishedAssessmentIfc publ } public HashMap prepareFINItemHash(PublishedAssessmentIfc publishedAssessment){ - HashMap map = new HashMap(); + HashMap map = new HashMap<>(); ArrayList sectionArray = publishedAssessment.getSectionArray(); for (int i=0;i prepareFINItemHash(PublishedAssessmentIfc publ */ public Map prepareCalcQuestionItemHash(PublishedAssessmentIfc publishedAssessment){ // CALCULATED_QUESTION - Map map = new HashMap(); + Map map = new HashMap<>(); List sectionArray = publishedAssessment.getSectionArray(); for (int i=0;i prepareCalcQuestionItemHash(PublishedAssessmentIfc */ public Map prepareImagQuestionItemHash(PublishedAssessmentIfc publishedAssessment){ // CALCULATED_QUESTION - Map map = new HashMap(); + Map map = new HashMap<>(); List sectionArray = publishedAssessment.getSectionArray(); for (int i=0;i prepareImagQuestionItemHash(PublishedAssessmentIfc public HashMap prepareMCMRItemHash(PublishedAssessmentIfc publishedAssessment){ - HashMap map = new HashMap(); + HashMap map = new HashMap<>(); ArrayList sectionArray = publishedAssessment.getSectionArray(); for (int i=0;i prepareMCMRItemHash(PublishedAssessmentIfc pub } public HashMap prepareEMIItemHash(PublishedAssessmentIfc publishedAssessment){ - HashMap map = new HashMap(); + HashMap map = new HashMap<>(); List sectionArray = publishedAssessment.getSectionArray(); for (int i=0;i extendedTimes = extendedTimeFacade.getEntriesForPub(pubData); + List groups = getGroups(extendedTimes); + String group = isUserInGroups(groups); + + ExtendedTime extendedTime = extendedTimeFacade.getEntryForPubAndUser(pubData, agentId); + ExtendedTime groupExtendedTime = null; + if(!group.isEmpty()) { + groupExtendedTime = extendedTimeFacade.getEntryForPubAndGroup(pubData, group); + } + + this.hasExtendedTime = (extendedTime != null || groupExtendedTime != null); + if (this.hasExtendedTime) { + ExtendedTime useMe; + if(extendedTime != null) { + useMe = extendedTime; + } else { + useMe = groupExtendedTime; + } + + this.timeLimit = useMe.getTimeHours() * MINS_IN_HOUR * SECONDS_IN_MIN + useMe.getTimeMinutes() * SECONDS_IN_MIN; + this.startDate = useMe.getStartDate(); + this.dueDate = useMe.getDueDate(); + this.retractDate = useMe.getRetractDate(); + } else { + this.timeLimit = 0; + this.startDate = publishedAssessment.getStartDate(); + this.dueDate = publishedAssessment.getDueDate(); + this.retractDate = publishedAssessment.getRetractDate(); + } + } + + private List getGroups(List extendedTimeList) { + List list = new ArrayList<>(); + extendedTimeList.forEach(extendedTime -> { + if(!"".equals(extendedTime.getGroup())) { + list.add(extendedTime.getGroup()); + } + }); + + return list; + } + + // Depending on the scope the assessment info sometimes is not initialized. + private boolean assessmentInitialized(PublishedAssessmentFacade publishedAssessment) { + if (publishedAssessment == null) { + return false; + } + if (publishedAssessment.getStartDate() != null) { + return true; + } + if (publishedAssessment.getDueDate() != null) { + return true; + } + if (publishedAssessment.getRetractDate() != null) { + return true; + } + + return publishedAssessment.getTimeLimit() != null; + } + + private String isUserInGroups(List groups) { + String returnString = ""; + if(groups != null && !groups.isEmpty()) { + for(String group : groups) { + if(isUserInGroup(group)) { + returnString = group; + } + } + } + + return returnString; + } + + private boolean isUserInGroup(String groupId) { + String realmId = "/site/" + siteId + "/group/" + groupId; + boolean isMember = false; + try { + AuthzGroup group = authzGroupService.getAuthzGroup(realmId); + if (group.getUserRole(AgentFacade.getAgentString()) != null) + isMember = true; + } catch (Exception e) { + return false; // this isn't a group + } + return isMember; + } + + public Integer getTimeLimit() { + return timeLimit; + } + + public void setTimeLimit(Integer timeLimit) { + this.timeLimit = timeLimit; + } + + public Date getStartDate() { + return startDate; + } + + public void setStartDate(Date startDate) { + this.startDate = startDate; + } + + public Date getDueDate() { + return dueDate; + } + + public void setDueDate(Date dueDate) { + this.dueDate = dueDate; + } + + public Date getRetractDate() { + return retractDate; + } + + public void setRetractDate(Date retractDate) { + this.retractDate = retractDate; + } + + public boolean hasExtendedTime() { + return hasExtendedTime; + } + + public void setHasExtendedTime(boolean hasExtendedTime) { + this.hasExtendedTime = hasExtendedTime; + } +} \ No newline at end of file diff --git a/samigo/samigo-services/src/java/org/sakaiproject/tool/assessment/util/ExtendedTimeService.java b/samigo/samigo-services/src/java/org/sakaiproject/tool/assessment/util/ExtendedTimeService.java deleted file mode 100644 index c6303aedc5..0000000000 --- a/samigo/samigo-services/src/java/org/sakaiproject/tool/assessment/util/ExtendedTimeService.java +++ /dev/null @@ -1,262 +0,0 @@ -package org.sakaiproject.tool.assessment.util; - -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Locale; -import java.util.TimeZone; - -import org.sakaiproject.authz.api.AuthzGroup; -import org.sakaiproject.authz.api.AuthzGroupService; -import org.sakaiproject.component.cover.ComponentManager; -import org.sakaiproject.tool.assessment.facade.AgentFacade; -import org.sakaiproject.tool.assessment.facade.PublishedAssessmentFacade; -import org.sakaiproject.tool.assessment.services.assessment.PublishedAssessmentService; -import org.sakaiproject.time.cover.TimeService; - -/** - * This class will instantiate with all the proper values for the current user's - * extended time values for the given published assessment. - * - * @author pdagnall1 - * - */ -public class ExtendedTimeService { - - private static String EXTENDED_TIME_KEY = "extendedTime"; - private static String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"; - private String siteId; - private AuthzGroupService authzGroupService; - - private boolean hasExtendedTime; - private Integer timeLimit; - private Date startDate; - private Date dueDate; - private Date retractDate; - private String metaString; // holds the extended time info for the current - // user - - /** - * Creates an ExtendedTimeService object using the userId in the agentFacade as the current user - * @param publishedAssessment a published assessment object - */ - public ExtendedTimeService(PublishedAssessmentFacade publishedAssessment) { - this(publishedAssessment,AgentFacade.getAgentString()); - - } - - /** - * Creates an ExtendedTimeService object based on a specific agentId (userId) - * @param publishedAssessment a published assessment object - * @param agentId a specific userId to look up - * - */ - public ExtendedTimeService(PublishedAssessmentFacade publishedAssessment, String agentId) { - PublishedAssessmentService publishedAssessmentService = new PublishedAssessmentService(); - if (!assessmentInitialized(publishedAssessment)) { - PublishedAssessmentFacade metaPublishedAssessment = publishedAssessmentService - .getPublishedAssessmentQuick(publishedAssessment.getPublishedAssessmentId().toString()); - publishedAssessment = metaPublishedAssessment; - } - authzGroupService = ComponentManager.get(AuthzGroupService.class); - - // Grab the site id from the publishedAssessment because the user may - // not be in a site - // if they're taking the test via url. - String pubId = publishedAssessment.getPublishedAssessmentId().toString(); - siteId = publishedAssessmentService.getPublishedAssessmentSiteId(pubId); - - this.metaString = extractMetaString(publishedAssessment, agentId); - this.hasExtendedTime = (metaString != null); - if (this.hasExtendedTime) { - this.timeLimit = extractExtendedTime(); - this.startDate = determineDate(1, publishedAssessment.getStartDate()); - this.dueDate = determineDate(2, publishedAssessment.getDueDate()); - this.retractDate = determineDate(3, publishedAssessment.getRetractDate()); - } else { - this.timeLimit = 0; - this.startDate = publishedAssessment.getStartDate(); - this.dueDate = publishedAssessment.getDueDate(); - this.retractDate = publishedAssessment.getRetractDate(); - } - } - - // Depending on the scope the assessment info sometimes is not initialized. - private boolean assessmentInitialized(PublishedAssessmentFacade publishedAssessment) { - if (publishedAssessment == null) - return false; - if (publishedAssessment.getStartDate() != null) - return true; - if (publishedAssessment.getDueDate() != null) - return true; - if (publishedAssessment.getRetractDate() != null) - return true; - if (publishedAssessment.getTimeLimit() != null) - return true; - return false; - } - - // This sets the metString that holds the extended time info for the user - private String extractMetaString(PublishedAssessmentFacade publishedAssessment, String userId) { - short itemNum = 1; - String meta = null; - String extendedTimeData = publishedAssessment.getAssessmentMetaDataByLabel(EXTENDED_TIME_KEY + itemNum); - while ((extendedTimeData != null) && (!extendedTimeData.equals(""))) { - - String[] extendedTimeItems = extendedTimeData.split("[|]"); - - // Get target user/group value - String target = extendedTimeItems[0]; - - // If it's a group determine if user is a member - boolean isMember = isUserInGroup(target); - - if (target.equals(userId) || isMember) { - meta = extendedTimeData; - } - itemNum++; - extendedTimeData = publishedAssessment.getAssessmentMetaDataByLabel(EXTENDED_TIME_KEY + itemNum); - } - return meta; - } - - /** - * If this user has been assigned an extended time then we'll return the - * time value. Otherwise we'll return null. - * - * @param delivery - * @param publishedAssessment - * @return - */ - private int extractExtendedTime() { - int extendedTime = 0; - String[] extendedTimeItems = metaString.split("[|]"); - extendedTime = Integer.parseInt(extendedTimeItems[1]); - return extendedTime; - } - - /** - * Return the default date unless there are extended time dates we should - * use instead. - * - * @param dateType - * - 1: Start Date, 2. Due Date 3. Retract Date - * @param defaultDate - * @return - */ - private Date determineDate(int dateType, Date defaultDate) { - Date xtDate = defaultDate; - - String[] extendedTimeItems = metaString.split("\\|", -1); - - // no entry means user has chosen not to override, use default - if (extendedTimeItems.length < dateType + 2) { // check for no entry - return defaultDate; - } - - // blank entry means user wants no limit, except start always has to be defined - String dateString = extendedTimeItems[dateType + 1]; - if (dateString == null || dateString.equals("")) { // check for blanks - if (dateType == 1) // start - return defaultDate; - else - return null; - } - - return parseDate(dateString, xtDate); - } - - private Date parseDate(String dateString, Date xtDate) { - try { - //xtDate = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss aa", Locale.ENGLISH).parse(dateString); - xtDate = new SimpleDateFormat(DATE_FORMAT, Locale.ENGLISH).parse(dateString); - this.hasExtendedTime = true; - } catch (ParseException e) { - e.printStackTrace(); - } - return xtDate; - } - - private boolean isUserInGroup(String groupId) { - String realmId = "/site/" + siteId + "/group/" + groupId; - boolean isMember = false; - try { - AuthzGroup group = authzGroupService.getAuthzGroup(realmId); - if (group.getUserRole(AgentFacade.getAgentString()) != null) - isMember = true; - } catch (Exception e) { - return false; // this isn't a group - } - return isMember; - } - - // convert extended time string between two time zones - - public static String convertZones(String times, TimeZone fromZone, TimeZone toZone) { - if (times == null || times.equals("")) { - return times; - } - String[] values = times.split("\\|", -1); - String ret = values[0] + "|" + values[1]; - // if < 5, this is version with no dates, so nothing to convert - if (values.length != 5) { - return times; - } - for (int i = 2; i < 5; i++) { - String timeString = values[i]; - if (!timeString.equals("")) { - try { - SimpleDateFormat df = new SimpleDateFormat(DATE_FORMAT, Locale.ENGLISH); - df.setTimeZone(fromZone); - Date timeDate = df.parse(timeString); - df.setTimeZone(toZone); - timeString = df.format(timeDate); - } catch (Exception e) { - // leaves string alone - } - } - ret += "|" + timeString; - } - return ret; - } - - public Integer getTimeLimit() { - return timeLimit; - } - - public void setTimeLimit(Integer timeLimit) { - this.timeLimit = timeLimit; - } - - public Date getStartDate() { - return startDate; - } - - public void setStartDate(Date startDate) { - this.startDate = startDate; - } - - public Date getDueDate() { - return dueDate; - } - - public void setDueDate(Date dueDate) { - this.dueDate = dueDate; - } - - public Date getRetractDate() { - return retractDate; - } - - public void setRetractDate(Date retractDate) { - this.retractDate = retractDate; - } - - public boolean hasExtendedTime() { - return hasExtendedTime; - } - - public void setHasExtendedTime(boolean hasExtendedTime) { - this.hasExtendedTime = hasExtendedTime; - } -} \ No newline at end of file