diff --git a/src/main/java/org/olat/modules/scorm/ScormAPIMapper.java b/src/main/java/org/olat/modules/scorm/ScormAPIMapper.java index 9ed64022bfa0ad908f20534bb208785f5828da70..e016fe7e75bed932e5b34f36e618177d21274b43 100644 --- a/src/main/java/org/olat/modules/scorm/ScormAPIMapper.java +++ b/src/main/java/org/olat/modules/scorm/ScormAPIMapper.java @@ -80,7 +80,9 @@ public class ScormAPIMapper implements Mapper, ScormAPICallback, Serializable { private String credit_mode; private boolean isAssessable; private String assessableType; - private boolean attemptsIncremeted; + private boolean attemptsIncremented; + private Float currentScore; + private Boolean currentPassed; private File cpRoot; public ScormAPIMapper() { @@ -88,7 +90,7 @@ public class ScormAPIMapper implements Mapper, ScormAPICallback, Serializable { } public ScormAPIMapper(Identity identity, String resourceId, String courseIdNodeId, String assessableType, - File cpRoot, OLATApiAdapter scormAdapter, boolean attemptsIncremeted) { + File cpRoot, OLATApiAdapter scormAdapter, boolean attemptsIncremented) { this.scormAdapter = scormAdapter; this.identity = identity; this.identityKey = identity.getKey(); @@ -100,7 +102,22 @@ public class ScormAPIMapper implements Mapper, ScormAPICallback, Serializable { this.lesson_mode = scormAdapter.getLessonMode(); this.credit_mode = scormAdapter.getCreditMode(); this.scormAdapter.addAPIListener(this); - this.attemptsIncremeted = attemptsIncremeted; + this.attemptsIncremented = attemptsIncremented; + + //setup the current score + currentScore(); + } + + private void currentScore() { + if(isAssessable) { + checkForLms(); + if(scormNode.hasScoreConfigured()) { + currentScore = scormNode.getUserScoreEvaluation(userCourseEnv).getScore(); + } + if(scormNode.hasPassedConfigured()) { + currentPassed = scormNode.getUserScoreEvaluation(userCourseEnv).getPassed(); + } + } } private final void check() { @@ -144,7 +161,7 @@ public class ScormAPIMapper implements Mapper, ScormAPICallback, Serializable { public void lmsCommit(String olatSahsId, Properties scoreProp, Properties lessonStatusProp) { if (isAssessable) { checkForLms(); - calculateResults(olatSahsId, scoreProp, lessonStatusProp); + calculateResults(olatSahsId, scoreProp, lessonStatusProp, false); } } @@ -152,19 +169,19 @@ public class ScormAPIMapper implements Mapper, ScormAPICallback, Serializable { public void lmsFinish(String olatSahsId, Properties scoreProp, Properties lessonStatusProp) { if (isAssessable) { checkForLms(); - calculateResults(olatSahsId, scoreProp, lessonStatusProp); + calculateResults(olatSahsId, scoreProp, lessonStatusProp, true); } } - private void calculateResults(String olatSahsId, Properties scoreProp, Properties lessonStatusProp) { + private void calculateResults(String olatSahsId, Properties scoreProp, Properties lessonStatusProp, boolean finish) { if(ScormEditController.CONFIG_ASSESSABLE_TYPE_PASSED.equals(assessableType)) { - calculatePassed(olatSahsId, lessonStatusProp); + calculatePassed(olatSahsId, lessonStatusProp, finish); } else { - calculateScorePassed(olatSahsId, scoreProp); + calculateScorePassed(olatSahsId, scoreProp, finish); } } - private void calculatePassed(String olatSahsId, Properties lessonStatusProp) { + private void calculatePassed(String olatSahsId, Properties lessonStatusProp, boolean finish) { int found = 0; boolean passedScos = true; for (Iterator<Object> it_status = lessonStatusProp.values().iterator(); it_status.hasNext();) { @@ -178,24 +195,32 @@ public class ScormAPIMapper implements Mapper, ScormAPICallback, Serializable { // <OLATEE-27> ModuleConfiguration config = scormNode.getModuleConfiguration(); if (config.getBooleanSafe(ScormEditController.CONFIG_ADVANCESCORE, true)) { - Boolean currentPassed = scormNode.getUserScoreEvaluation(userCourseEnv).getPassed(); if (currentPassed == null || !currentPassed.booleanValue()) { // </OLATEE-27> - if(!attemptsIncremeted && config.getBooleanSafe(ScormEditController.CONFIG_ATTEMPTSDEPENDONSCORE, false)) { - attemptsIncremeted = true; - } + boolean increment = !attemptsIncremented && finish; ScoreEvaluation sceval = new ScoreEvaluation(new Float(0.0f), Boolean.valueOf(passed)); - scormNode.updateUserScoreEvaluation(sceval, userCourseEnv, identity, attemptsIncremeted); + scormNode.updateUserScoreEvaluation(sceval, userCourseEnv, identity, increment); userCourseEnv.getScoreAccounting().scoreInfoChanged(scormNode, sceval); + if(increment) { + attemptsIncremented = true; + } } else if (!config.getBooleanSafe(ScormEditController.CONFIG_ATTEMPTSDEPENDONSCORE, false)) { + boolean increment = !attemptsIncremented && finish; ScoreEvaluation sceval = scormNode.getUserScoreEvaluation(userCourseEnv); - scormNode.updateUserScoreEvaluation(sceval, userCourseEnv, identity, false); + scormNode.updateUserScoreEvaluation(sceval, userCourseEnv, identity, increment); userCourseEnv.getScoreAccounting().scoreInfoChanged(scormNode, sceval); + if(increment) { + attemptsIncremented = true; + } } } else { + boolean increment = !attemptsIncremented && finish; ScoreEvaluation sceval = new ScoreEvaluation(new Float(0.0f), Boolean.valueOf(passed)); scormNode.updateUserScoreEvaluation(sceval, userCourseEnv, identity, false); userCourseEnv.getScoreAccounting().scoreInfoChanged(scormNode, sceval); + if(increment) { + attemptsIncremented = true; + } } if (log.isDebug()) { @@ -206,7 +231,7 @@ public class ScormAPIMapper implements Mapper, ScormAPICallback, Serializable { } } - private void calculateScorePassed(String olatSahsId, Properties scoProperties) { + private void calculateScorePassed(String olatSahsId, Properties scoProperties, boolean finish) { // do a sum-of-scores over all sco scores // <OLATEE-27> float score = -1f; @@ -228,19 +253,23 @@ public class ScormAPIMapper implements Mapper, ScormAPICallback, Serializable { // <OLATEE-27> ModuleConfiguration config = scormNode.getModuleConfiguration(); if (config.getBooleanSafe(ScormEditController.CONFIG_ADVANCESCORE, true)) { - Float currentScore = scormNode.getUserScoreEvaluation(userCourseEnv).getScore(); if (score > (currentScore != null ? currentScore : -1f)) { // </OLATEE-27> - if(!attemptsIncremeted && config.getBooleanSafe(ScormEditController.CONFIG_ATTEMPTSDEPENDONSCORE, false)) { - attemptsIncremeted = true; - } + boolean increment = !attemptsIncremented && finish; ScoreEvaluation sceval = new ScoreEvaluation(new Float(score), Boolean.valueOf(passed)); - scormNode.updateUserScoreEvaluation(sceval, userCourseEnv, identity, attemptsIncremeted); + scormNode.updateUserScoreEvaluation(sceval, userCourseEnv, identity, increment); userCourseEnv.getScoreAccounting().scoreInfoChanged(scormNode, sceval); + if(increment) { + attemptsIncremented = true; + } } else if (!config.getBooleanSafe(ScormEditController.CONFIG_ATTEMPTSDEPENDONSCORE, false)) { + boolean increment = !attemptsIncremented && finish; ScoreEvaluation sceval = scormNode.getUserScoreEvaluation(userCourseEnv); - scormNode.updateUserScoreEvaluation(sceval, userCourseEnv, identity, false); + scormNode.updateUserScoreEvaluation(sceval, userCourseEnv, identity, increment); userCourseEnv.getScoreAccounting().scoreInfoChanged(scormNode, sceval); + if(increment) { + attemptsIncremented = true; + } } } else { // <OLATEE-27> @@ -248,9 +277,13 @@ public class ScormAPIMapper implements Mapper, ScormAPICallback, Serializable { score = 0f; } // </OLATEE-27> + boolean increment = !attemptsIncremented && finish; ScoreEvaluation sceval = new ScoreEvaluation(new Float(score), Boolean.valueOf(passed)); scormNode.updateUserScoreEvaluation(sceval, userCourseEnv, identity, false); userCourseEnv.getScoreAccounting().scoreInfoChanged(scormNode, sceval); + if(increment) { + attemptsIncremented = true; + } } if (log.isDebug()) {