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