From bebccd26df53e2299a6bfe9f7d2ed60301b40f0e Mon Sep 17 00:00:00 2001 From: srosse <stephane.rosse@frentix.com> Date: Sun, 15 Mar 2020 09:35:00 +0100 Subject: [PATCH] OO-4576: use an update statement to append log to user's course node log --- .../auditing/UserNodeAuditManagerImpl.java | 8 ++- .../properties/CoursePropertyManager.java | 3 + .../PersistingCoursePropertyManager.java | 6 ++ .../preview/PreviewCoursePropertyManager.java | 5 ++ .../properties/NarrowedPropertyManager.java | 4 ++ .../org/olat/properties/PropertyManager.java | 41 +++++++++++++ .../assessment/AssessmentManagerTest.java | 1 - .../auditing/UserNodeAuditManagerTest.java | 60 ++++++++++++++----- 8 files changed, 110 insertions(+), 18 deletions(-) diff --git a/src/main/java/org/olat/course/auditing/UserNodeAuditManagerImpl.java b/src/main/java/org/olat/course/auditing/UserNodeAuditManagerImpl.java index fb578521393..af9e4d80ecb 100644 --- a/src/main/java/org/olat/course/auditing/UserNodeAuditManagerImpl.java +++ b/src/main/java/org/olat/course/auditing/UserNodeAuditManagerImpl.java @@ -61,7 +61,10 @@ public class UserNodeAuditManagerImpl implements UserNodeAuditManager { @Override public void appendToUserNodeLog(CourseNode courseNode, Identity identity, Identity assessedIdentity, String logText, Role by) { String text = formatMessage(identity, logText, by) ; + cpm.appendText(courseNode, assessedIdentity, null, LOG_IDENTIFYER, text); + + /* Property logProperty = cpm.findCourseNodeProperty(courseNode, assessedIdentity, null, LOG_IDENTIFYER); if (logProperty == null) { logProperty = cpm.createCourseNodePropertyInstance(courseNode, assessedIdentity, null, LOG_IDENTIFYER, null, null, null, text); @@ -72,12 +75,14 @@ public class UserNodeAuditManagerImpl implements UserNodeAuditManager { logProperty.setTextValue(limitedLogContent); cpm.updateProperty(logProperty); } + */ } @Override public void appendToUserNodeLog(CourseNode courseNode, Identity identity, BusinessGroup assessedGroup, String logText, Role by) { String text = formatMessage(identity, logText, by) ; - + cpm.appendText(courseNode, null, assessedGroup, LOG_IDENTIFYER, text); + /* Property logProperty = cpm.findCourseNodeProperty(courseNode, null, assessedGroup, LOG_IDENTIFYER); if (logProperty == null) { logProperty = cpm.createCourseNodePropertyInstance(courseNode, null, assessedGroup, LOG_IDENTIFYER, null, null, null, text); @@ -88,6 +93,7 @@ public class UserNodeAuditManagerImpl implements UserNodeAuditManager { logProperty.setTextValue(limitedLogContent); cpm.updateProperty(logProperty); } + */ } private String formatMessage(Identity identity, String logText, Role by) { diff --git a/src/main/java/org/olat/course/properties/CoursePropertyManager.java b/src/main/java/org/olat/course/properties/CoursePropertyManager.java index 611a280a085..0ba01ab0106 100644 --- a/src/main/java/org/olat/course/properties/CoursePropertyManager.java +++ b/src/main/java/org/olat/course/properties/CoursePropertyManager.java @@ -114,6 +114,9 @@ public interface CoursePropertyManager extends IdentityAnonymizerCallback { */ public Property findCourseNodeProperty(CourseNode node, Identity identity, BusinessGroup grp, String name); + + public void appendText(CourseNode node, Identity identity, BusinessGroup grp, String name, String text); + /** * Find a specific course node property (exact match. I.e. null values are taken into account) * @param node diff --git a/src/main/java/org/olat/course/properties/PersistingCoursePropertyManager.java b/src/main/java/org/olat/course/properties/PersistingCoursePropertyManager.java index 64fd304e37e..8ef7b4e290d 100644 --- a/src/main/java/org/olat/course/properties/PersistingCoursePropertyManager.java +++ b/src/main/java/org/olat/course/properties/PersistingCoursePropertyManager.java @@ -150,6 +150,12 @@ public class PersistingCoursePropertyManager implements CoursePropertyManager { return pm.findProperty(identity, grp, myCategory, name); } + @Override + public void appendText(CourseNode node, Identity identity, BusinessGroup grp, String name, String text) { + String myCategory = buildCourseNodePropertyCategory(node); + pm.appendTextToProperty(identity, grp, myCategory, name, text); + } + @Override public Property findCourseNodeProperty(CourseNode node, BusinessGroup grp, String name) { String myCategory = buildCourseNodePropertyCategory(node); diff --git a/src/main/java/org/olat/course/run/preview/PreviewCoursePropertyManager.java b/src/main/java/org/olat/course/run/preview/PreviewCoursePropertyManager.java index ae560504112..7fa18554f8d 100644 --- a/src/main/java/org/olat/course/run/preview/PreviewCoursePropertyManager.java +++ b/src/main/java/org/olat/course/run/preview/PreviewCoursePropertyManager.java @@ -121,6 +121,11 @@ final class PreviewCoursePropertyManager implements CoursePropertyManager { return propertiesList; } + @Override + public void appendText(CourseNode node, Identity identity, BusinessGroup grp, String name, String text) { + // Not implemented + } + @Override public Property findCourseNodeProperty(CourseNode node, BusinessGroup grp, String name) { List<Property> propertyList = properties.get(buildPropertyHashKey(buildCourseNodePropertyCategory(node), null, grp, name)); diff --git a/src/main/java/org/olat/properties/NarrowedPropertyManager.java b/src/main/java/org/olat/properties/NarrowedPropertyManager.java index 391ee4696aa..0dea06cfe9c 100644 --- a/src/main/java/org/olat/properties/NarrowedPropertyManager.java +++ b/src/main/java/org/olat/properties/NarrowedPropertyManager.java @@ -150,6 +150,10 @@ public class NarrowedPropertyManager { return pm.findProperty(identity, grp, resourceable, category, name); } + public void appendTextToProperty(Identity identity, BusinessGroup grp, String category, String name, String text) { + pm.appendTextProperty(identity, grp, resourceable, category, name, text); + } + /** * Exact match * @param grp diff --git a/src/main/java/org/olat/properties/PropertyManager.java b/src/main/java/org/olat/properties/PropertyManager.java index 62ca71c8a59..af372b0f8f4 100644 --- a/src/main/java/org/olat/properties/PropertyManager.java +++ b/src/main/java/org/olat/properties/PropertyManager.java @@ -34,6 +34,7 @@ import javax.persistence.TypedQuery; import org.olat.basesecurity.IdentityRef; import org.olat.core.commons.persistence.DBFactory; +import org.olat.core.commons.persistence.QueryBuilder; import org.olat.core.id.Identity; import org.olat.core.id.OLATResourceable; import org.olat.core.logging.AssertException; @@ -604,6 +605,46 @@ public class PropertyManager implements UserDataDeletable { return props.get(0); } + public void appendTextProperty(Identity identity, BusinessGroup grp, + OLATResourceable resourceable, String category, String name, String textValue) { + QueryBuilder sb = new QueryBuilder(); + sb.append("update ").append(Property.class.getName()).append(" v ") + .append(" set v.textValue=concat(v.textValue,:text), lastModified=:now"); + + if (identity != null) { + sb.and().append(" v.identity.key=:identityKey"); + } else if(grp != null) { + sb.and().append(" v.grp.key=:groupKey"); + } + + sb + .and().append("v.resourceTypeName=:resName") + .and().append("v.resourceTypeId=:resId") + .and().append("v.category=:cat") + .and().append("v.name=:name"); + + Query query = DBFactory.getInstance().getCurrentEntityManager() + .createQuery(sb.toString()) + .setParameter("resName", resourceable.getResourceableTypeName()) + .setParameter("resId", resourceable.getResourceableId()) + .setParameter("cat", category) + .setParameter("name", name) + .setParameter("text", textValue) + .setParameter("now", new Date()); + if (identity != null) { + query.setParameter("identityKey", identity.getKey()); + } else if(grp != null) { + query.setParameter("groupKey", grp.getKey()); + } + + int row = query.executeUpdate(); + if(row == 0) { + Property prop = createPropertyInstance(identity, grp, resourceable, category, name, null, null, null, textValue); + saveProperty(prop); + } + DBFactory.getInstance().commit(); + } + /** * The query is an exact match where null value are NOT allowed. * @param businessGroup diff --git a/src/test/java/org/olat/course/assessment/AssessmentManagerTest.java b/src/test/java/org/olat/course/assessment/AssessmentManagerTest.java index 94f6b478107..e2b9ab7b66a 100644 --- a/src/test/java/org/olat/course/assessment/AssessmentManagerTest.java +++ b/src/test/java/org/olat/course/assessment/AssessmentManagerTest.java @@ -87,7 +87,6 @@ public class AssessmentManagerTest extends OlatTestCase { private Identity student; private final Float score = new Float(10); private final Boolean passed = Boolean.TRUE; - private final Boolean fullyAssessed = Boolean.TRUE; @Autowired private EfficiencyStatementManager efficiencyStatementManager; diff --git a/src/test/java/org/olat/course/auditing/UserNodeAuditManagerTest.java b/src/test/java/org/olat/course/auditing/UserNodeAuditManagerTest.java index 93fee4e22cb..ce8ecf704ca 100644 --- a/src/test/java/org/olat/course/auditing/UserNodeAuditManagerTest.java +++ b/src/test/java/org/olat/course/auditing/UserNodeAuditManagerTest.java @@ -29,18 +29,20 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; -import java.util.UUID; - +import org.apache.logging.log4j.Logger; +import org.junit.Assert; import org.junit.Test; -import org.olat.core.commons.persistence.DBFactory; +import org.olat.core.commons.persistence.DB; import org.olat.core.id.Identity; -import org.apache.logging.log4j.Logger; import org.olat.core.logging.Tracing; import org.olat.course.CourseFactory; import org.olat.course.ICourse; +import org.olat.course.nodes.CourseNode; +import org.olat.modules.assessment.Role; import org.olat.repository.RepositoryEntry; import org.olat.test.JunitTestHelper; import org.olat.test.OlatTestCase; +import org.springframework.beans.factory.annotation.Autowired; /** * @author Christian Guretzki @@ -48,16 +50,42 @@ import org.olat.test.OlatTestCase; public class UserNodeAuditManagerTest extends OlatTestCase { private static final Logger log = Tracing.createLoggerFor(UserNodeAuditManagerTest.class); + + @Autowired + private DB dbInstance; + + @Test + public void appendToUserNodeLog() { + //import a course + Identity author = JunitTestHelper.createAndPersistIdentityAsRndUser("Auth-"); + Identity assessedIdentity = JunitTestHelper.createAndPersistIdentityAsRndUser("Logger-"); + RepositoryEntry repositoryEntry = JunitTestHelper.deployDemoCourse(author); + Long resourceableId = repositoryEntry.getOlatResource().getResourceableId(); + ICourse course = CourseFactory.loadCourse(resourceableId); + dbInstance.commitAndCloseSession(); + + CourseNode courseNode = course.getRunStructure().getRootNode(); + UserNodeAuditManager userNodeAuditManager = course.getCourseEnvironment().getAuditManager(); + userNodeAuditManager.appendToUserNodeLog(courseNode, author, assessedIdentity, "Hello", Role.coach); + dbInstance.commitAndCloseSession(); + userNodeAuditManager.appendToUserNodeLog(courseNode, assessedIdentity, assessedIdentity, " world", Role.user); + dbInstance.commitAndCloseSession(); + + String logText = userNodeAuditManager.getUserNodeLog(courseNode, assessedIdentity); + Assert.assertTrue(logText.contains("Hello")); + Assert.assertTrue(logText.contains("world")); + } + @Test public void testCreateLimitedLogContent() { //import a course - Identity author = JunitTestHelper.createAndPersistIdentityAsUser("Auth-" + UUID.randomUUID()); + Identity author = JunitTestHelper.createAndPersistIdentityAsRndUser("Auth-"); RepositoryEntry repositoryEntry = JunitTestHelper.deployDemoCourse(author); Long resourceableId = repositoryEntry.getOlatResource().getResourceableId(); log.info("Demo course imported - resourceableId: " + resourceableId); ICourse course = CourseFactory.loadCourse(resourceableId); - DBFactory.getInstance().commitAndCloseSession(); + dbInstance.commitAndCloseSession(); log.info("Start testCreateLimitedLogContent"); @@ -67,20 +95,20 @@ public class UserNodeAuditManagerTest extends OlatTestCase { logContent.append( createTestLogContent(1) ); String limitedLogContent = userNodeAuditManagerImpl.createLimitedLogContent(logContent.toString(), 400); assertEquals("logContent should not be limited", logContent.toString(), limitedLogContent); - log.info("limitedLogContent:\n" + limitedLogContent); - log.info("limitedLogContent.length=" + limitedLogContent.length()); + log.info("limitedLogContent: {}", limitedLogContent); + log.info("limitedLogContent.length= {}", limitedLogContent.length()); logContent.append( createTestLogContent(2) ); limitedLogContent = userNodeAuditManagerImpl.createLimitedLogContent(logContent.toString(), 400); assertEquals("logContent should not be limited", logContent.toString(), limitedLogContent); - log.info("limitedLogContent:\n" + limitedLogContent); - log.info("limitedLogContent.length=" + limitedLogContent.length()); + log.info("limitedLogContent: {}", limitedLogContent); + log.info("limitedLogContent.length={}", limitedLogContent.length()); logContent.append( createTestLogContent(3) ); limitedLogContent = userNodeAuditManagerImpl.createLimitedLogContent(logContent.toString(), 400); assertEquals("logContent should not be limited", logContent.toString(), limitedLogContent); - log.info("limitedLogContent:\n" + limitedLogContent); - log.info("limitedLogContent.length=" + limitedLogContent.length()); + log.info("limitedLogContent: {}", limitedLogContent); + log.info("limitedLogContent.length={}", limitedLogContent.length()); logContent.append( createTestLogContent(4) ); log.info("logContent.length()=" + logContent.length()); @@ -90,8 +118,8 @@ public class UserNodeAuditManagerTest extends OlatTestCase { assertTrue("Missing Log entry2",limitedLogContent.contains("LogEntry #2")); assertTrue("Missing Log entry3",limitedLogContent.contains("LogEntry #3")); assertTrue("Missing Log entry4",limitedLogContent.contains("LogEntry #4")); - log.info("limitedLogContent:\n" + limitedLogContent); - log.info("limitedLogContent.length=" + limitedLogContent.length()); + log.info("limitedLogContent: {}", limitedLogContent); + log.info("limitedLogContent.length={}", limitedLogContent.length()); logContent.append( createTestLogContent(5) ); limitedLogContent = userNodeAuditManagerImpl.createLimitedLogContent(logContent.toString(), 400); @@ -100,8 +128,8 @@ public class UserNodeAuditManagerTest extends OlatTestCase { assertTrue("Missing Log entry3",limitedLogContent.contains("LogEntry #3")); assertTrue("Missing Log entry4",limitedLogContent.contains("LogEntry #4")); assertTrue("Missing Log entry5",limitedLogContent.contains("LogEntry #5")); - log.info("limitedLogContent:\n" + limitedLogContent); - log.info("limitedLogContent.length=" + limitedLogContent.length()); + log.info("limitedLogContent: {}", limitedLogContent); + log.info("limitedLogContent.length={}", limitedLogContent.length()); } private String createTestLogContent(int entryNumber) { -- GitLab