diff --git a/src/main/java/org/olat/course/assessment/manager/EfficiencyStatementManager.java b/src/main/java/org/olat/course/assessment/manager/EfficiencyStatementManager.java index fa34784eec889fc926b5871083f4fb2f1e0783b4..65c10223ca36198c8af4c89b81c309bfce520a98 100644 --- a/src/main/java/org/olat/course/assessment/manager/EfficiencyStatementManager.java +++ b/src/main/java/org/olat/course/assessment/manager/EfficiencyStatementManager.java @@ -44,7 +44,6 @@ import org.olat.core.id.OLATResourceable; import org.olat.core.logging.Tracing; import org.olat.core.util.StringHelper; import org.olat.core.util.coordinate.CoordinatorManager; -import org.olat.core.util.coordinate.SyncerExecutor; import org.olat.core.util.resource.OresHelper; import org.olat.core.util.xml.XStreamHelper; import org.olat.course.CourseFactory; @@ -115,6 +114,7 @@ public class EfficiencyStatementManager implements UserDataDeletable, UserDataEx public UserEfficiencyStatement createUserEfficiencyStatement(Date creationDate, Float score, Boolean passed, Identity identity, OLATResource resource) { UserEfficiencyStatementImpl efficiencyProperty = new UserEfficiencyStatementImpl(); + efficiencyProperty.setVersion(0); if(creationDate == null) { efficiencyProperty.setCreationDate(new Date()); efficiencyProperty.setLastModified(efficiencyProperty.getCreationDate()); @@ -211,24 +211,25 @@ public class EfficiencyStatementManager implements UserDataDeletable, UserDataEx if (efficiencyProperty == null) { // create new efficiencyProperty = new UserEfficiencyStatementImpl(); + efficiencyProperty.setVersion(0); efficiencyProperty.setCreationDate(new Date()); efficiencyProperty.setIdentity(assessedIdentity); efficiencyProperty.setCourseRepoKey(repoEntry.getKey()); - if(repoEntry != null) { - efficiencyProperty.setResource(repoEntry.getOlatResource()); - efficiencyProperty.setCourseRepoKey(repoEntry.getKey()); - } + efficiencyProperty.setResource(repoEntry.getOlatResource()); + efficiencyProperty.setCourseRepoKey(repoEntry.getKey()); efficiencyProperty.setShortTitle(courseEnv.getRunStructure().getRootNode().getShortTitle()); efficiencyProperty.setTitle(courseEnv.getRunStructure().getRootNode().getLongTitle()); fillEfficiencyStatement(efficiencyStatement, lastModifications, efficiencyProperty); dbInstance.getCurrentEntityManager().persist(efficiencyProperty); if (debug) { - log.debug("creating new efficiency statement property::" + efficiencyProperty.getKey() + " for id::" + assessedIdentity.getKey() + " repoEntry::" + repoEntry.getKey()); + log.debug("creating new efficiency statement property::{} for id::{} repoEntry:: {}", + efficiencyProperty.getKey(), assessedIdentity.getKey() , repoEntry.getKey()); } } else { // update existing if (debug) { - log.debug("updating efficiency statement property::" + efficiencyProperty.getKey() + " for id::" + assessedIdentity.getKey() + " repoEntry::" + repoEntry.getKey()); + log.debug("updating efficiency statement property::{} for id::{} repoEntry::{}", + efficiencyProperty.getKey() , assessedIdentity.getKey() , repoEntry.getKey()); } efficiencyProperty.setShortTitle(courseEnv.getRunStructure().getRootNode().getShortTitle()); efficiencyProperty.setTitle(courseEnv.getRunStructure().getRootNode().getLongTitle()); @@ -239,7 +240,8 @@ public class EfficiencyStatementManager implements UserDataDeletable, UserDataEx if (efficiencyProperty != null) { // remove existing since now empty efficiency statements if (debug) { - log.debug("removing efficiency statement property::" + efficiencyProperty.getKey() + " for id::" + assessedIdentity.getKey() + " repoEntry::" + repoEntry.getKey() + " since empty"); + log.debug("removing efficiency statement property::{} for id::{} repoEntry::{} since empty", + efficiencyProperty.getKey(), assessedIdentity.getKey(), repoEntry.getKey()); } dbInstance.getCurrentEntityManager().remove(efficiencyProperty); } @@ -728,9 +730,9 @@ public class EfficiencyStatementManager implements UserDataDeletable, UserDataEx * false: always create new one (be careful with this one!) */ public void updateEfficiencyStatements(final RepositoryEntry courseEntry, List<Identity> identities) { - if (identities.size() > 0) { + if (!identities.isEmpty()) { final ICourse course = CourseFactory.loadCourse(courseEntry); - log.info(Tracing.M_AUDIT, "Updating efficiency statements for course::" + course.getResourceableId() + ", this might produce temporary heavy load on the CPU"); + log.info(Tracing.M_AUDIT, "Updating efficiency statements for course::{}, this might produce temporary heavy load on the CPU", course.getResourceableId()); // preload cache to speed up things AssessmentManager am = course.getCourseEnvironment().getAssessmentManager(); @@ -738,13 +740,10 @@ public class EfficiencyStatementManager implements UserDataDeletable, UserDataEx for (Identity identity : identities) { //o_clusterOK: by ld OLATResourceable efficiencyStatementResourceable = am.createOLATResourceableForLocking(identity); - CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync(efficiencyStatementResourceable, new SyncerExecutor() { - @Override - public void execute() { - // create temporary user course env - UserCourseEnvironment uce = AssessmentHelper.createInitAndUpdateUserCourseEnvironment(identity, course); - updateUserEfficiencyStatement(uce, courseEntry); - } + CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync(efficiencyStatementResourceable, () -> { + // create temporary user course env + UserCourseEnvironment uce = AssessmentHelper.createInitAndUpdateUserCourseEnvironment(identity, course); + updateUserEfficiencyStatement(uce, courseEntry); }); if (Thread.interrupted()) { break; @@ -791,7 +790,7 @@ public class EfficiencyStatementManager implements UserDataDeletable, UserDataEx .setParameter("identityKey", identity.getKey()) .executeUpdate(); - if(log.isDebugEnabled()) log.debug(numOfDeletedStatements + " efficiency statements deleted for identity=" + identity); + log.debug("{} efficiency statements deleted for identity={}", numOfDeletedStatements, identity); } catch (Exception e) { log.error("deleteUserData(EfficiencyStatements): " + identity, e); } diff --git a/src/main/java/org/olat/course/assessment/model/UserEfficiencyStatementImpl.java b/src/main/java/org/olat/course/assessment/model/UserEfficiencyStatementImpl.java index 28dcb17821c6c522b95bfa723a9cfb310be315ca..e35f5949b6e194eb1c8b76f156a0462035389f03 100644 --- a/src/main/java/org/olat/course/assessment/model/UserEfficiencyStatementImpl.java +++ b/src/main/java/org/olat/course/assessment/model/UserEfficiencyStatementImpl.java @@ -31,7 +31,6 @@ import javax.persistence.ManyToOne; import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; -import javax.persistence.Version; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.NotFound; @@ -67,7 +66,8 @@ public class UserEfficiencyStatementImpl implements Persistable, UserEfficiencyS }) @Column(name="id", nullable=false, unique=true, insertable=true, updatable=false) private Long key; - @Version + + @Column(name="version", nullable=false, unique=false, insertable=true, updatable=true) private int version = 0; @Temporal(TemporalType.TIMESTAMP) @@ -126,6 +126,14 @@ public class UserEfficiencyStatementImpl implements Persistable, UserEfficiencyS this.key = key; } + public int getVersion() { + return version; + } + + public void setVersion(int version) { + this.version = version; + } + @Override public Date getCreationDate() { return creationDate;