Index: samigo-api/src/java/org/sakaiproject/tool/assessment/data/exception/SamigoDataAccessException.java =================================================================== --- samigo-api/src/java/org/sakaiproject/tool/assessment/data/exception/SamigoDataAccessException.java (revision 0) +++ samigo-api/src/java/org/sakaiproject/tool/assessment/data/exception/SamigoDataAccessException.java (working copy) @@ -0,0 +1,39 @@ +/********************************************************************************** + * $URL: https://source.sakaiproject.org/svn/sam/trunk/samigo-services/src/java/org/sakaiproject/tool/assessment/facade/AssessmentGradingFacadeQueriesAPI.java $ + * $Id: AssessmentGradingFacadeQueriesAPI.java 120911 2013-03-07 22:32:47Z ktsao@stanford.edu $ + *********************************************************************************** + * + * Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009 The Sakai Foundation + * + * Licensed under the Educational Community License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.opensource.org/licenses/ECL-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + **********************************************************************************/ +package org.sakaiproject.tool.assessment.data.exception; + +public class SamigoDataAccessException extends Exception { + + /** + * + */ + private static final long serialVersionUID = 8292080017823847011L; + + /** + * + * @param cause + */ + public SamigoDataAccessException(Throwable cause) { + super(cause); + } + + +} Index: samigo-services/src/java/org/sakaiproject/tool/assessment/facade/AssessmentGradingFacadeQueries.java =================================================================== --- samigo-services/src/java/org/sakaiproject/tool/assessment/facade/AssessmentGradingFacadeQueries.java (revision 121354) +++ samigo-services/src/java/org/sakaiproject/tool/assessment/facade/AssessmentGradingFacadeQueries.java (working copy) @@ -71,6 +71,7 @@ import org.sakaiproject.tool.assessment.data.dao.grading.ItemGradingData; import org.sakaiproject.tool.assessment.data.dao.grading.MediaData; import org.sakaiproject.tool.assessment.data.dao.grading.StudentGradingSummaryData; +import org.sakaiproject.tool.assessment.data.exception.SamigoDataAccessException; import org.sakaiproject.tool.assessment.data.ifc.assessment.AnswerIfc; import org.sakaiproject.tool.assessment.data.ifc.assessment.AssessmentAttachmentIfc; import org.sakaiproject.tool.assessment.data.ifc.assessment.EvaluationModelIfc; @@ -711,7 +712,11 @@ if (itemGradingId != null) { ItemGradingData itemGradingData = getItemGrading(itemGradingId); itemGradingData.setAutoScore(Double.valueOf(0)); - saveItemGrading(itemGradingData); + try { + saveItemGrading(itemGradingData); + } catch (SamigoDataAccessException e) { + log.warn("error updating Item after media deletion", e); + } } } @@ -1020,7 +1025,7 @@ } - public void saveItemGrading(ItemGradingData item) { + public void saveItemGrading(ItemGradingData item) throws SamigoDataAccessException { int retryCount = persistenceHelper.getRetryCount().intValue(); while (retryCount > 0){ try { @@ -1030,11 +1035,14 @@ catch (Exception e) { log.warn("problem saving itemGrading: "+e.getMessage()); retryCount = persistenceHelper.retryDeadlock(e, retryCount); + if (retryCount == 0) { + throw new SamigoDataAccessException(e); + } } } } - public void saveOrUpdateAssessmentGrading(AssessmentGradingData assessment) { + public void saveOrUpdateAssessmentGrading(AssessmentGradingData assessment) throws SamigoDataAccessException { int retryCount = persistenceHelper.getRetryCount().intValue(); while (retryCount > 0){ try { @@ -1048,6 +1056,9 @@ catch (Exception e) { log.warn("problem inserting/updating assessmentGrading: "+e.getMessage()); retryCount = persistenceHelper.retryDeadlock(e, retryCount); + if (retryCount == 0) { + throw new SamigoDataAccessException(e); + } } } } @@ -1550,7 +1561,7 @@ } - public void saveOrUpdateAll(Collection c) { + public void saveOrUpdateAll(Collection c) throws SamigoDataAccessException { int retryCount = persistenceHelper.getRetryCount().intValue(); while (retryCount > 0){ try { @@ -1560,6 +1571,9 @@ catch (Exception e) { log.warn("problem inserting assessmentGrading: "+e.getMessage()); retryCount = persistenceHelper.retryDeadlock(e, retryCount); + if (retryCount == 0) { + throw new SamigoDataAccessException(e); + } } } } @@ -2923,7 +2937,12 @@ adata.setStatus(Integer.valueOf(1)); toBeAutoSubmittedList.add(adata); hasAutoSubmisionRunUpdateList.remove(adata); // for performance. don't update the same record twice - completeItemGradingData(adata, sectionSetMap); + try { + completeItemGradingData(adata, sectionSetMap); + } catch (SamigoDataAccessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } updateGradebookMap(adata, studentUidsToScores, gradebookMap); List eventLogDataList = eventService.getEventLogData(adata.getAssessmentGradingId()); @@ -2972,7 +2991,12 @@ adata.setStatus(Integer.valueOf(1)); toBeAutoSubmittedList.add(adata); hasAutoSubmisionRunUpdateList.remove(adata); // for performance. don't update the same record twice - completeItemGradingData(adata, sectionSetMap); + try { + completeItemGradingData(adata, sectionSetMap); + } catch (SamigoDataAccessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } updateGradebookMap(adata, studentUidsToScores, gradebookMap); EventTrackingService.post(EventTrackingService.newEvent("sam.auto-submit.job", AutoSubmitAssessmentsJob.safeEventLength("publishedAssessmentId=" + adata.getPublishedAssessmentId() + @@ -2997,8 +3021,15 @@ } } - this.saveOrUpdateAll(toBeAutoSubmittedList); - this.saveOrUpdateAll(hasAutoSubmisionRunUpdateList); + + try { + this.saveOrUpdateAll(toBeAutoSubmittedList); + this.saveOrUpdateAll(hasAutoSubmisionRunUpdateList); + } catch (SamigoDataAccessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + notifyGradebook(gradebookMap); } @@ -3177,12 +3208,12 @@ return startedCountsMap; } - public void completeItemGradingData(AssessmentGradingData assessmentGradingData) { + public void completeItemGradingData(AssessmentGradingData assessmentGradingData) throws SamigoDataAccessException { completeItemGradingData(assessmentGradingData, null); } - public void completeItemGradingData(AssessmentGradingData assessmentGradingData, HashMap sectionSetMap) { + private void completeItemGradingData(AssessmentGradingData assessmentGradingData, HashMap sectionSetMap) throws SamigoDataAccessException { ArrayList answeredPublishedItemIdList = new ArrayList(); List publishedItemIds = getPublishedItemIds(assessmentGradingData.getAssessmentGradingId()); Iterator iter = publishedItemIds.iterator(); @@ -3261,7 +3292,7 @@ } } - private void saveItemGradingData(AssessmentGradingData assessmentGradingData, Long publishedItemId) { + private void saveItemGradingData(AssessmentGradingData assessmentGradingData, Long publishedItemId) throws SamigoDataAccessException { log.debug("Adding one ItemGradingData..."); ItemGradingData itemGradingData = new ItemGradingData(); itemGradingData.setAssessmentGradingId(assessmentGradingData.getAssessmentGradingId()); Index: samigo-services/src/java/org/sakaiproject/tool/assessment/facade/AssessmentGradingFacadeQueriesAPI.java =================================================================== --- samigo-services/src/java/org/sakaiproject/tool/assessment/facade/AssessmentGradingFacadeQueriesAPI.java (revision 121354) +++ samigo-services/src/java/org/sakaiproject/tool/assessment/facade/AssessmentGradingFacadeQueriesAPI.java (working copy) @@ -34,6 +34,7 @@ import org.sakaiproject.tool.assessment.data.dao.grading.ItemGradingAttachment; import org.sakaiproject.tool.assessment.data.dao.grading.ItemGradingData; import org.sakaiproject.tool.assessment.data.dao.grading.MediaData; +import org.sakaiproject.tool.assessment.data.exception.SamigoDataAccessException; import org.sakaiproject.tool.assessment.data.ifc.assessment.PublishedAssessmentIfc; import org.sakaiproject.tool.assessment.data.ifc.grading.StudentGradingSummaryIfc; @@ -152,10 +153,20 @@ public List getLastSubmittedOrGradedAssessmentGradingList(Long publishedAssessmentId); - public void saveItemGrading(ItemGradingData item); + /** + * Save an itemgrading item + * @param item + * @throws SamigoDataAccessException + */ + public void saveItemGrading(ItemGradingData item) throws SamigoDataAccessException; + + /** + * Save or update an AssementGrading item + * @param assessment + * @throws SamigoDataAccessException + */ + public void saveOrUpdateAssessmentGrading(AssessmentGradingData assessment) throws SamigoDataAccessException; - public void saveOrUpdateAssessmentGrading(AssessmentGradingData assessment); - //public void setIsLate(AssessmentGradingData assessment); public List getAssessmentGradingIds(Long publishedItemId); @@ -180,7 +191,12 @@ public void deleteAll(Collection c); - public void saveOrUpdateAll(Collection c); + /** + * Save or update all objects + * @param c + * @throws SamigoDataAccessException + */ + public void saveOrUpdateAll(Collection c) throws SamigoDataAccessException; public PublishedAssessmentIfc getPublishedAssessmentByAssessmentGradingId(Long assessmentGradingId); @@ -245,7 +261,12 @@ public HashMap getSubmittedCounts(String siteId); - public void completeItemGradingData(AssessmentGradingData assessmentGradingData); + /** + * Fully populate an item grading item and perform the initial save + * @param assessmentGradingData + * @throws SamigoDataAccessException + */ + public void completeItemGradingData(AssessmentGradingData assessmentGradingData) throws SamigoDataAccessException; public List getHighestSubmittedAssessmentGradingList(final Long publishedAssessmentId); public Double getAverageSubmittedAssessmentGrading( final Long publishedAssessmentId, final String agentId); Index: samigo-services/src/java/org/sakaiproject/tool/assessment/services/GradingService.java =================================================================== --- samigo-services/src/java/org/sakaiproject/tool/assessment/services/GradingService.java (revision 121354) +++ samigo-services/src/java/org/sakaiproject/tool/assessment/services/GradingService.java (working copy) @@ -56,6 +56,7 @@ import org.sakaiproject.tool.assessment.data.dao.grading.ItemGradingAttachment; import org.sakaiproject.tool.assessment.data.dao.grading.ItemGradingData; import org.sakaiproject.tool.assessment.data.dao.grading.MediaData; +import org.sakaiproject.tool.assessment.data.exception.SamigoDataAccessException; import org.sakaiproject.tool.assessment.data.ifc.assessment.AnswerIfc; import org.sakaiproject.tool.assessment.data.ifc.assessment.AssessmentIfc; import org.sakaiproject.tool.assessment.data.ifc.assessment.EvaluationModelIfc; @@ -74,7 +75,6 @@ import org.sakaiproject.tool.assessment.services.assessment.PublishedAssessmentService; import org.sakaiproject.tool.assessment.util.SamigoExpressionError; import org.sakaiproject.tool.assessment.util.SamigoExpressionParser; -import org.sakaiproject.tool.assessment.util.TextFormat; /** @@ -1830,7 +1830,8 @@ PersistenceService.getInstance(). getAssessmentGradingFacadeQueries().saveOrUpdateAll(c); } catch (Exception e) { - e.printStackTrace(); + //FIXME this should be a declared exception so calling code can handle + throw new RuntimeException(e); } } @@ -2671,8 +2672,13 @@ } public void completeItemGradingData(AssessmentGradingData assessmentGradingData) { - PersistenceService.getInstance().getAssessmentGradingFacadeQueries(). - completeItemGradingData(assessmentGradingData); + try { + PersistenceService.getInstance().getAssessmentGradingFacadeQueries(). + completeItemGradingData(assessmentGradingData); + } catch (SamigoDataAccessException e) { + //Fixme this should be escalalted as a named exception so calling code handles it + throw new RuntimeException(e); + } } /** Index: samigo-services/src/test/org/sakaiproject/assessment/facade/test/AssessmentGradingFacadeQueriesTest.java =================================================================== --- samigo-services/src/test/org/sakaiproject/assessment/facade/test/AssessmentGradingFacadeQueriesTest.java (revision 121354) +++ samigo-services/src/test/org/sakaiproject/assessment/facade/test/AssessmentGradingFacadeQueriesTest.java (working copy) @@ -27,6 +27,7 @@ import org.hibernate.SessionFactory; import org.sakaiproject.tool.assessment.data.dao.grading.AssessmentGradingData; import org.sakaiproject.tool.assessment.data.dao.grading.ItemGradingData; +import org.sakaiproject.tool.assessment.data.exception.SamigoDataAccessException; import org.sakaiproject.tool.assessment.facade.AssessmentGradingFacadeQueries; import org.sakaiproject.tool.assessment.services.PersistenceHelper; import org.springframework.test.AbstractTransactionalSpringContextTests; @@ -58,27 +59,34 @@ public void testSaveAssesmentGradingData() { //A AssemementGradingData to work with - AssessmentGradingData data = new AssessmentGradingData(); + AssessmentGradingData dataBad = new AssessmentGradingData(); //we expect a failure on this one /*FIXME this test should fail with an exception - * currently the exceptions are quietly swallowed + * currently the exceptions are quietly swallowed */ try { - queries.saveOrUpdateAssessmentGrading(data); - fail(); + queries.saveOrUpdateAssessmentGrading(dataBad); + //fail(); } catch (Exception e) { - //we expect this + //we expect this + //e.printStackTrace(); } - */ + AssessmentGradingData data = new AssessmentGradingData(); data.setPublishedAssessmentId(Long.valueOf(1)); data.setAgentId("agent"); data.setIsLate(false); data.setForGrade(false); data.setStatus(Integer.valueOf(0)); - queries.saveOrUpdateAssessmentGrading(data); + try { + queries.saveOrUpdateAssessmentGrading(data); + } catch (SamigoDataAccessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + fail(); + } assertNotNull(data.getAssessmentGradingId()); @@ -91,7 +99,13 @@ item1.setPublishedItemId(1L); item1.setPublishedItemTextId(1L); //saving the item should add an ID - queries.saveItemGrading(item1); + try { + queries.saveItemGrading(item1); + } catch (SamigoDataAccessException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + fail(); + } assertNotNull(item1.getItemGradingId()); @@ -107,7 +121,13 @@ /** saving the parent should save the children **/ - queries.saveOrUpdateAssessmentGrading(data); + try { + queries.saveOrUpdateAssessmentGrading(data); + } catch (SamigoDataAccessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + fail(); + } assertNotNull(item1.getItemGradingId()); @@ -141,7 +161,13 @@ data.setIsLate(false); data.setForGrade(false); data.setStatus(Integer.valueOf(0)); - queries.saveOrUpdateAssessmentGrading(data); + try { + queries.saveOrUpdateAssessmentGrading(data); + } catch (SamigoDataAccessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + fail(); + } AssessmentGradingData data2 = new AssessmentGradingData(); @@ -150,7 +176,13 @@ data2.setIsLate(false); data2.setForGrade(true); data2.setStatus(0); - queries.saveOrUpdateAssessmentGrading(data2); + try { + queries.saveOrUpdateAssessmentGrading(data2); + } catch (SamigoDataAccessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + fail(); + } @@ -160,7 +192,13 @@ data3.setIsLate(false); data3.setForGrade(true); data3.setStatus(0); - queries.saveOrUpdateAssessmentGrading(data3); + try { + queries.saveOrUpdateAssessmentGrading(data3); + } catch (SamigoDataAccessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + fail(); + } ItemGradingData item1 = new ItemGradingData(); item1.setAgentId(data.getAgentId()); @@ -180,7 +218,13 @@ data.getItemGradingSet().add(item2); data.getItemGradingSet().add(item1); - queries.saveOrUpdateAssessmentGrading(data); + try { + queries.saveOrUpdateAssessmentGrading(data); + } catch (SamigoDataAccessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + fail(); + } savedId = data.getAssessmentGradingId();