diff --git a/src/main/java/org/olat/admin/user/delete/service/UserDeletionManager.java b/src/main/java/org/olat/admin/user/delete/service/UserDeletionManager.java index a261b2f8442dd2ed1a68fd29f9a9aee154c42c3e..914715f89d6a97fc08146795531e1c6d497adf8a 100644 --- a/src/main/java/org/olat/admin/user/delete/service/UserDeletionManager.java +++ b/src/main/java/org/olat/admin/user/delete/service/UserDeletionManager.java @@ -28,7 +28,9 @@ package org.olat.admin.user.delete.service; import java.io.File; import java.text.DateFormat; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Calendar; +import java.util.Comparator; import java.util.Date; import java.util.Iterator; import java.util.List; @@ -39,12 +41,12 @@ import javax.persistence.TemporalType; import org.olat.admin.user.delete.SelectionController; import org.olat.basesecurity.Authentication; import org.olat.basesecurity.BaseSecurity; -import org.olat.basesecurity.BaseSecurityManager; import org.olat.basesecurity.IdentityImpl; import org.olat.basesecurity.SecurityGroup; import org.olat.basesecurity.manager.GroupDAO; import org.olat.commons.lifecycle.LifeCycleManager; import org.olat.core.CoreSpringFactory; +import org.olat.core.commons.persistence.DB; import org.olat.core.commons.persistence.DBFactory; import org.olat.core.commons.persistence.DBQuery; import org.olat.core.gui.translator.Translator; @@ -59,7 +61,6 @@ import org.olat.core.util.mail.MailBundle; import org.olat.core.util.mail.MailManager; import org.olat.core.util.mail.MailTemplate; import org.olat.core.util.mail.MailerResult; -import org.olat.course.assessment.manager.EfficiencyStatementManager; import org.olat.properties.Property; import org.olat.properties.PropertyManager; import org.olat.registration.RegistrationManager; @@ -71,6 +72,8 @@ import org.olat.user.propertyhandlers.UserPropertyHandler; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import edu.emory.mathcs.backport.java.util.Collections; + /** * Manager for user-deletion. @@ -108,6 +111,8 @@ public class UserDeletionManager extends BasicManager { private MailManager mailManager; @Autowired private GroupDAO groupDao; + @Autowired + private DB dbInstance; /** * [used by spring] @@ -192,7 +197,7 @@ public class UserDeletionManager extends BasicManager { sb.append("select ident from ").append(IdentityImpl.class.getName()).append(" as ident") .append(" inner join fetch ident.user as user") .append(" where ident.status=").append(Identity.STATUS_ACTIV).append(" and (ident.lastLogin = null or ident.lastLogin < :lastLogin)"); - List<Identity> identities = DBFactory.getInstance().getCurrentEntityManager() + List<Identity> identities = dbInstance.getCurrentEntityManager() .createQuery(sb.toString(), Identity.class) .setParameter("lastLogin", lastLoginLimit.getTime(), TemporalType.TIMESTAMP) .getResultList(); @@ -261,27 +266,23 @@ public class UserDeletionManager extends BasicManager { logInfo("Start deleteIdentity for identity=" + identity); String newName = getBackupStringWithDate(identity.getName()); - - - // TODO: chg: Workaround: instances each manager which implements UaserDataDeletable interface - // Each manager register themself as deletable - // Should be better with new config concept - - logInfo("Start EfficiencyStatementManager.archiveUserData for identity=" + identity); - CoreSpringFactory.getImpl(EfficiencyStatementManager.class).archiveUserData(identity, getArchivFilePath(identity) ); logInfo("Start Deleting user=" + identity); - Map<String,UserDataDeletable> userDataDeletableResources = CoreSpringFactory.getBeansOfType(UserDataDeletable.class); - for (UserDataDeletable element : userDataDeletableResources.values()) { + File archiveFilePath = getArchivFilePath(identity); + Map<String,UserDataDeletable> userDataDeletableResourcesMap = CoreSpringFactory.getBeansOfType(UserDataDeletable.class); + List<UserDataDeletable> userDataDeletableResources = new ArrayList<>(userDataDeletableResourcesMap.values()); + Collections.sort(userDataDeletableResources, new UserDataDeletableComparator()); + System.out.println(""); + for (UserDataDeletable element : userDataDeletableResources) { logInfo("UserDataDeletable-Loop element=" + element); - element.deleteUserData(identity, newName); + element.deleteUserData(identity, newName, archiveFilePath); } + // Delete all authentications for certain identity List<Authentication> authentications = securityManager.getAuthentications(identity); - for (Iterator<Authentication> iter = authentications.iterator(); iter.hasNext();) { - Authentication auth = iter.next(); + for (Authentication auth:authentications) { logInfo("deleteAuthentication auth=" + auth); - BaseSecurityManager.getInstance().deleteAuthentication(auth); + securityManager.deleteAuthentication(auth); logDebug("Delete auth=" + auth + " of identity=" + identity); } @@ -326,7 +327,7 @@ public class UserDeletionManager extends BasicManager { UserManager.getInstance().updateUserFromIdentity(identity); logInfo("deleteUserProperties user=" + persistedUser); - DBFactory.getInstance().commit(); + dbInstance.commit(); identity = securityManager.loadIdentityByKey(identity.getKey()); //keep email only -> change login-name if (!keepUserEmailAfterDeletion) { @@ -340,7 +341,6 @@ public class UserDeletionManager extends BasicManager { LifeCycleManager.createInstanceFor(identity).deleteTimestampFor(SEND_DELETE_EMAIL_ACTION); LifeCycleManager.createInstanceFor(identity).markTimestampFor(USER_DELETED_ACTION, createLifeCycleLogDataFor(identity)); - // TODO: chg: ev. logAudit at another place logAudit("User-Deletion: Delete all userdata for identity=" + identity); } @@ -447,5 +447,13 @@ public class UserDeletionManager extends BasicManager { public static boolean isKeepUserLoginAfterDeletion() { return keepUserLoginAfterDeletion; } - + + public static class UserDataDeletableComparator implements Comparator<UserDataDeletable> { + @Override + public int compare(UserDataDeletable o1, UserDataDeletable o2) { + int p1 = o1.deleteUserDataPriority(); + int p2 = o2.deleteUserDataPriority(); + return -Integer.compare(p1, p2); + } + } } diff --git a/src/main/java/org/olat/admin/user/delete/service/UserFileDeletionManager.java b/src/main/java/org/olat/admin/user/delete/service/UserFileDeletionManager.java index c46bfcd0f3ebcf33f754803eab936361e493a17b..91ae05e23c15b53775a72b57f66fee9eb541bf2c 100644 --- a/src/main/java/org/olat/admin/user/delete/service/UserFileDeletionManager.java +++ b/src/main/java/org/olat/admin/user/delete/service/UserFileDeletionManager.java @@ -25,6 +25,8 @@ package org.olat.admin.user.delete.service; +import java.io.File; + import org.olat.core.commons.services.taskexecutor.TaskExecutorManager; import org.olat.core.id.Identity; import org.olat.user.UserDataDeletable; @@ -44,7 +46,7 @@ public class UserFileDeletionManager implements UserDataDeletable { private TaskExecutorManager taskExecutorManager; @Override - public void deleteUserData(final Identity identity, final String newDeletedUserName) { + public void deleteUserData(final Identity identity, final String newDeletedUserName, File archivePath) { taskExecutorManager.execute(new DeleteUserDataTask(identity.getKey(), identity.getName())); } } diff --git a/src/main/java/org/olat/commons/calendar/manager/ICalFileCalendarUserDeleteManager.java b/src/main/java/org/olat/commons/calendar/manager/ICalFileCalendarUserDeleteManager.java index a2b775fcf6bb6f85982bd293249c397af9dd3b25..eaf82a91bb71b806807ec083070d2e93035541ef 100644 --- a/src/main/java/org/olat/commons/calendar/manager/ICalFileCalendarUserDeleteManager.java +++ b/src/main/java/org/olat/commons/calendar/manager/ICalFileCalendarUserDeleteManager.java @@ -19,6 +19,8 @@ */ package org.olat.commons.calendar.manager; +import java.io.File; + import org.olat.commons.calendar.CalendarManager; import org.olat.core.id.Identity; import org.olat.core.logging.OLog; @@ -42,7 +44,7 @@ public class ICalFileCalendarUserDeleteManager implements UserDataDeletable { private CalendarManager calendarManager; @Override - public void deleteUserData(Identity identity, String newDeletedUserName) { + public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath) { calendarManager.deletePersonalCalendar(identity); log.debug("Personal calendar deleted for identity=" + identity); } diff --git a/src/main/java/org/olat/core/commons/services/notifications/NotificationsManager.java b/src/main/java/org/olat/core/commons/services/notifications/NotificationsManager.java index dd08b127cf22b6a1610f87c634082ba36d467d14..0bbb0f85e874b2e33973742724df22bebb18261d 100644 --- a/src/main/java/org/olat/core/commons/services/notifications/NotificationsManager.java +++ b/src/main/java/org/olat/core/commons/services/notifications/NotificationsManager.java @@ -262,11 +262,6 @@ public abstract class NotificationsManager extends BasicManager { public abstract SubscriptionInfo getNoSubscriptionInfo(); - /** - * Delete all subscribers for certain identity. - * @param identity - */ - public abstract void deleteUserData(Identity identity, String newDeletedUserName); /** * subscribers for ONE person (e.g. subscribed to 5 forums -> 5 subscribers diff --git a/src/main/java/org/olat/core/commons/services/notifications/manager/NotificationsManagerImpl.java b/src/main/java/org/olat/core/commons/services/notifications/manager/NotificationsManagerImpl.java index cf07db61650bfa40996077d8d8c4b852c2fba154..ff4c67ca9d086bfd8da2b617c66d54a57ba35e26 100644 --- a/src/main/java/org/olat/core/commons/services/notifications/manager/NotificationsManagerImpl.java +++ b/src/main/java/org/olat/core/commons/services/notifications/manager/NotificationsManagerImpl.java @@ -25,6 +25,7 @@ package org.olat.core.commons.services.notifications.manager; +import java.io.File; import java.util.ArrayList; import java.util.Calendar; import java.util.Collection; @@ -1209,7 +1210,8 @@ public class NotificationsManagerImpl extends NotificationsManager implements Us * Delete all subscribers for certain identity. * @param identity */ - public void deleteUserData(Identity identity, String newDeletedUserName) { + @Override + public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath) { List<Subscriber> subscribers = getSubscribers(identity); for (Iterator<Subscriber> iter = subscribers.iterator(); iter.hasNext();) { deleteSubscriber( iter.next() ); diff --git a/src/main/java/org/olat/core/util/coordinate/DBPersistentLockManager.java b/src/main/java/org/olat/core/util/coordinate/DBPersistentLockManager.java index 3253425cdee91a94f6645fa484b6779275d6ff41..fff5639dc5a1a03cf63095a88de614d866f289b5 100644 --- a/src/main/java/org/olat/core/util/coordinate/DBPersistentLockManager.java +++ b/src/main/java/org/olat/core/util/coordinate/DBPersistentLockManager.java @@ -24,6 +24,8 @@ */ package org.olat.core.util.coordinate; +import java.io.File; + import org.hibernate.type.StandardBasicTypes; import org.hibernate.type.Type; import org.olat.basesecurity.BaseSecurityManager; @@ -51,18 +53,12 @@ public class DBPersistentLockManager implements PersistentLockManager, UserDataD private static final OLog log = Tracing.createLoggerFor(DBPersistentLockManager.class); private static final String CATEGORY_PERSISTENTLOCK = "o_lock"; - /** - * [used by spring] - * @param userDeletionManager - */ - private DBPersistentLockManager() { - // - } /** * @see org.olat.core.util.locks.PersistentLockManager#aquirePersistentLock(org.olat.core.id.OLATResourceable, * org.olat.core.id.Identity, java.lang.String) */ + @Override public LockResult aquirePersistentLock(OLATResourceable ores, Identity ident, String locksubkey) { //synchronisation is solved in the LockManager LockResult lres; @@ -109,6 +105,7 @@ public class DBPersistentLockManager implements PersistentLockManager, UserDataD /** * @see org.olat.core.util.locks.PersistentLockManager#releasePersistentLock(org.olat.core.util.locks.LockEntry) */ + @Override public void releasePersistentLock(LockResult le) { //synchronisation is solved in the LockManager String derivedLockString = ((LockResultImpl)le).getLockEntry().getKey(); @@ -126,7 +123,8 @@ public class DBPersistentLockManager implements PersistentLockManager, UserDataD * Delete all persisting-locks for certain identity. * @see org.olat.user.UserDataDeletable#deleteUserData(org.olat.core.id.Identity) */ - public void deleteUserData(Identity identity, String newDeletedUserName) { + @Override + public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath) { String query = "from v in class org.olat.properties.Property where v.category = ? and v.longValue = ?"; DBFactory.getInstance().delete(query, new Object[] { CATEGORY_PERSISTENTLOCK, identity.getKey() }, new Type[] { StandardBasicTypes.STRING, StandardBasicTypes.LONG }); diff --git a/src/main/java/org/olat/core/util/mail/MailBoxExtension.java b/src/main/java/org/olat/core/util/mail/MailBoxExtension.java index 5d0e681930e18e08e5147218f683625acd5e5c96..648970272bf4d05b67c3c5b64f9f1fab072e6eef 100644 --- a/src/main/java/org/olat/core/util/mail/MailBoxExtension.java +++ b/src/main/java/org/olat/core/util/mail/MailBoxExtension.java @@ -19,6 +19,7 @@ */ package org.olat.core.util.mail; +import java.io.File; import java.util.Collection; import java.util.Collections; import java.util.HashSet; @@ -75,7 +76,7 @@ public class MailBoxExtension implements MailContextResolver, UserDataDeletable, } @Override - public void deleteUserData(Identity identity, String newDeletedUserName) { + public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath) { //set as deleted all recipients log.info("Delete intern messages"); diff --git a/src/main/java/org/olat/course/assessment/manager/AssessmentToolManagerImpl.java b/src/main/java/org/olat/course/assessment/manager/AssessmentToolManagerImpl.java index dced06eca948647bc55491dd814f608986eb031a..bfc8e3bd90891bb8a724db96efd30b6f0101f80f 100644 --- a/src/main/java/org/olat/course/assessment/manager/AssessmentToolManagerImpl.java +++ b/src/main/java/org/olat/course/assessment/manager/AssessmentToolManagerImpl.java @@ -332,7 +332,7 @@ public class AssessmentToolManagerImpl implements AssessmentToolManager { sb.append("count(ident.key)").append(" from ").append(IdentityImpl.class.getName()).append(" as ident ") .append(" inner join ident.user user "); } - sb.append(" where "); + sb.append(" where ident.status<").append(Identity.STATUS_DELETED).append(" and"); if(params.getBusinessGroupKeys() != null && params.getBusinessGroupKeys().size() > 0) { sb.append(" ident.key in (select participant.identity.key from repoentrytogroup as rel, businessgroup bgi, bgroupmember as participant") .append(" where rel.entry.key=:repoEntryKey and rel.group=bgi.baseGroup and rel.group=participant.group and bgi.key in (:businessGroupKeys) ") 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 e21c54fb5cac528b4319b36566d14959e9a3f789..6dc72a23526dcec97efe52343bb1c80d69cb3eaa 100644 --- a/src/main/java/org/olat/course/assessment/manager/EfficiencyStatementManager.java +++ b/src/main/java/org/olat/course/assessment/manager/EfficiencyStatementManager.java @@ -710,11 +710,17 @@ public class EfficiencyStatementManager implements UserDataDeletable { } /** - * Delete all efficiency-statements for certain identity. + * Archive efficiency statement and than delete them for the specified identity. + * * @param identity Delete data for this identity. */ @Override - public void deleteUserData(Identity identity, String newDeletedUserName) { + public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath) { + archiveUserData(identity, archivePath); + deleteEfficientyStatement(identity); + } + + public void deleteEfficientyStatement(Identity identity) { try { StringBuilder sb = new StringBuilder(); sb.append("delete from ").append(UserEfficiencyStatementImpl.class.getName()).append(" as statement ") diff --git a/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java b/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java index ff562a682a854e00170fd8911712531c440d32f4..5cef78b7fa898f45193f066841ff8a2a3ced3281 100644 --- a/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java +++ b/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java @@ -168,7 +168,7 @@ public class BusinessGroupServiceImpl implements BusinessGroupService, UserDataD private DB dbInstance; @Override - public void deleteUserData(Identity identity, String newDeletedUserName) { + public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath) { // remove as Participant List<BusinessGroup> attendedGroups = findBusinessGroupsAttendedBy(identity); for (Iterator<BusinessGroup> iter = attendedGroups.iterator(); iter.hasNext();) { diff --git a/src/main/java/org/olat/ims/qti/QTIResultManager.java b/src/main/java/org/olat/ims/qti/QTIResultManager.java index 0ad0aba96f0aa679cd584b702bf4be0db3c680dd..57f3aa97f3496f232b2512c0e28141e26ff28a62 100644 --- a/src/main/java/org/olat/ims/qti/QTIResultManager.java +++ b/src/main/java/org/olat/ims/qti/QTIResultManager.java @@ -25,6 +25,7 @@ package org.olat.ims.qti; +import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -335,7 +336,8 @@ public class QTIResultManager implements UserDataDeletable { * Delete all ResultSet for certain identity. * @param identity */ - public void deleteUserData(Identity identity, String newDeletedUserName) { + @Override + public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath) { List<QTIResultSet> qtiResults = findQtiResultSets(identity); for (QTIResultSet set:qtiResults) { deleteResultSet(set); diff --git a/src/main/java/org/olat/ims/qti21/manager/AssessmentTestSessionDAO.java b/src/main/java/org/olat/ims/qti21/manager/AssessmentTestSessionDAO.java index cde3cd51bc0e8d4d95c0684f9e3dc4d55db03578..053582b7822fdc7d57f35a7d6335bfbe461c4546 100644 --- a/src/main/java/org/olat/ims/qti21/manager/AssessmentTestSessionDAO.java +++ b/src/main/java/org/olat/ims/qti21/manager/AssessmentTestSessionDAO.java @@ -50,7 +50,6 @@ import org.springframework.stereotype.Service; @Service public class AssessmentTestSessionDAO { - private final DateFormat formater = new SimpleDateFormat("yyyyMMdd'T'HHmmss"); @Autowired @@ -319,6 +318,18 @@ public class AssessmentTestSessionDAO { } return query.getResultList(); } + + public List<AssessmentTestSession> getUserTestSessions(IdentityRef identity) { + StringBuilder sb = new StringBuilder(); + sb.append("select session from qtiassessmenttestsession session") + .append(" left join fetch session.testEntry testEntry") + .append(" left join fetch testEntry.olatResource testResource") + .append(" where session.identity.key=:identityKey ");; + return dbInstance.getCurrentEntityManager() + .createQuery(sb.toString(), AssessmentTestSession.class) + .setParameter("identityKey", identity.getKey()) + .getResultList(); + } public List<AssessmentTestSession> getUserTestSessions(RepositoryEntryRef courseEntry, String courseSubIdent, IdentityRef identity) { StringBuilder sb = new StringBuilder(); diff --git a/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java b/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java index 918ee6b3798305b27ffb5d832369391eb4d568a2..07909101ab8b294dbc65c03bfad84f7585168f6e 100644 --- a/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java +++ b/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java @@ -86,6 +86,7 @@ import org.olat.modules.assessment.AssessmentEntry; import org.olat.modules.assessment.manager.AssessmentEntryDAO; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryEntryRef; +import org.olat.user.UserDataDeletable; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; @@ -144,7 +145,7 @@ import uk.ac.ed.ph.qtiworks.mathassess.MathAssessExtensionPackage; * */ @Service -public class QTI21ServiceImpl implements QTI21Service, InitializingBean, DisposableBean { +public class QTI21ServiceImpl implements QTI21Service, UserDataDeletable, InitializingBean, DisposableBean { private static final OLog log = Tracing.createLoggerFor(QTI21ServiceImpl.class); @@ -361,7 +362,20 @@ public class QTI21ServiceImpl implements QTI21Service, InitializingBean, Disposa } }); } - + + @Override + public int deleteUserDataPriority() { + return 10; + } + + @Override + public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath) { + List<AssessmentTestSession> sessions = testSessionDao.getUserTestSessions(identity); + for(AssessmentTestSession session:sessions) { + testSessionDao.deleteTestSession(session); + } + } + @Override public boolean deleteAssessmentTestSession(List<Identity> identities, RepositoryEntryRef testEntry, RepositoryEntryRef entry, String subIdent) { Set<AssessmentEntry> entries = new HashSet<>(); diff --git a/src/main/java/org/olat/modules/assessment/manager/AssessmentEntryDAO.java b/src/main/java/org/olat/modules/assessment/manager/AssessmentEntryDAO.java index b4192c06797b45dc1f2eff8f327aaa17fcb184a2..04ec3455b6e6b84afde1e1d54b4bf258a66f81be 100644 --- a/src/main/java/org/olat/modules/assessment/manager/AssessmentEntryDAO.java +++ b/src/main/java/org/olat/modules/assessment/manager/AssessmentEntryDAO.java @@ -289,11 +289,18 @@ public class AssessmentEntryDAO { * @return */ public int deleteEntryForRepositoryEntry(RepositoryEntryRef entry) { - StringBuilder sb = new StringBuilder(); - sb.append("delete from assessmententry data where data.repositoryEntry.key=:entryKey"); + String query = "delete from assessmententry data where data.repositoryEntry.key=:entryKey"; return dbInstance.getCurrentEntityManager() - .createQuery(sb.toString()) + .createQuery(query) .setParameter("entryKey", entry.getKey()) .executeUpdate(); } + + public int deleteEntryForIdentity(IdentityRef identity) { + String query = "delete from assessmententry data where data.identity.key=:identityKey"; + return dbInstance.getCurrentEntityManager() + .createQuery(query) + .setParameter("identityKey", identity.getKey()) + .executeUpdate(); + } } diff --git a/src/main/java/org/olat/modules/assessment/manager/AssessmentServiceImpl.java b/src/main/java/org/olat/modules/assessment/manager/AssessmentServiceImpl.java index c2c654dd74ed85e34e60a366db1e574dce413cda..267ebcabe641b999e08b1155850e6a89f4209933 100644 --- a/src/main/java/org/olat/modules/assessment/manager/AssessmentServiceImpl.java +++ b/src/main/java/org/olat/modules/assessment/manager/AssessmentServiceImpl.java @@ -19,6 +19,7 @@ */ package org.olat.modules.assessment.manager; +import java.io.File; import java.util.Collections; import java.util.List; @@ -30,6 +31,7 @@ import org.olat.modules.assessment.AssessmentService; import org.olat.modules.assessment.model.AssessmentEntryStatus; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryEntryRef; +import org.olat.user.UserDataDeletable; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -40,7 +42,7 @@ import org.springframework.stereotype.Service; * */ @Service -public class AssessmentServiceImpl implements AssessmentService { +public class AssessmentServiceImpl implements AssessmentService, UserDataDeletable { @Autowired private DB dbInstance; @@ -110,4 +112,9 @@ public class AssessmentServiceImpl implements AssessmentService { RepositoryEntry referenceEntry, AssessmentEntryStatus status) { return Collections.emptyList(); } + + @Override + public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath) { + assessmentEntryDao.deleteEntryForIdentity(identity); + } } diff --git a/src/main/java/org/olat/modules/iq/IQManager.java b/src/main/java/org/olat/modules/iq/IQManager.java index b4929e0231e63448aba0ed29edf66fd68adaa94e..e3da8f052c85c50b219e0cbcd8c5402c386e52e0 100644 --- a/src/main/java/org/olat/modules/iq/IQManager.java +++ b/src/main/java/org/olat/modules/iq/IQManager.java @@ -438,7 +438,8 @@ public class IQManager implements UserDataDeletable { * Delete all qti.ser and qti-resreporting files. * @see org.olat.user.UserDataDeletable#deleteUserData(org.olat.core.id.Identity) */ - public void deleteUserData(Identity identity, String newDeletedUserName) { + @Override + public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath) { FilePersister.deleteUserData(identity); if(log.isDebug()) log.debug("Delete all qti.ser data and qti-resreporting data for identity=" + identity); diff --git a/src/main/java/org/olat/modules/openmeetings/manager/OpenMeetingsManagerImpl.java b/src/main/java/org/olat/modules/openmeetings/manager/OpenMeetingsManagerImpl.java index a2a105f058571ad1136c65a8aa0b59d6f6a4c875..5ce16dd722c63046c8d2ac2ff0d09123fc45c9d8 100644 --- a/src/main/java/org/olat/modules/openmeetings/manager/OpenMeetingsManagerImpl.java +++ b/src/main/java/org/olat/modules/openmeetings/manager/OpenMeetingsManagerImpl.java @@ -707,7 +707,7 @@ public class OpenMeetingsManagerImpl implements OpenMeetingsManager, UserDataDel } @Override - public void deleteUserData(Identity identity, String newDeletedUserName) { + public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath) { // } diff --git a/src/main/java/org/olat/modules/vitero/manager/ViteroManager.java b/src/main/java/org/olat/modules/vitero/manager/ViteroManager.java index 1a5450b6ba63d0ac94f1deb3835398524090be44..645998abda0e1d024c760f66baeded1e1bd76587 100644 --- a/src/main/java/org/olat/modules/vitero/manager/ViteroManager.java +++ b/src/main/java/org/olat/modules/vitero/manager/ViteroManager.java @@ -719,7 +719,7 @@ public class ViteroManager implements UserDataDeletable { } @Override - public void deleteUserData(Identity identity, String newDeletedUserName) { + public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath) { if(!viteroModule.isDeleteVmsUserOnUserDelete()) return; try { diff --git a/src/main/java/org/olat/note/NoteManager.java b/src/main/java/org/olat/note/NoteManager.java index 34034bd2f7a415070a094b401637f8791816c0eb..fe39d28a3fa8dc9beae64617bf55edbc0d897e0f 100644 --- a/src/main/java/org/olat/note/NoteManager.java +++ b/src/main/java/org/olat/note/NoteManager.java @@ -25,6 +25,7 @@ package org.olat.note; +import java.io.File; import java.util.Date; import java.util.Iterator; import java.util.List; @@ -155,7 +156,7 @@ public class NoteManager implements UserDataDeletable { * @param identity Delete notes for this identity. */ @Override - public void deleteUserData(Identity identity, String newDeletedUserName) { + public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath) { List<Note> userNotes = listUserNotes(identity); for (Iterator<Note> iter = userNotes.iterator(); iter.hasNext();) { deleteNote( iter.next() ); diff --git a/src/main/java/org/olat/portfolio/manager/EPFrontendManager.java b/src/main/java/org/olat/portfolio/manager/EPFrontendManager.java index 434744cd21d45f8ada89dd90e552ccf7a25e2d6f..846445fd0ccc2c1b6fb084c54bd9daadfeb448bb 100755 --- a/src/main/java/org/olat/portfolio/manager/EPFrontendManager.java +++ b/src/main/java/org/olat/portfolio/manager/EPFrontendManager.java @@ -19,6 +19,7 @@ */ package org.olat.portfolio.manager; +import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.Date; @@ -171,7 +172,7 @@ public class EPFrontendManager implements UserDataDeletable, DeletableGroupData } @Override - public void deleteUserData(Identity identity, String newDeletedUserName) { + public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath) { deleteUsersArtefacts(identity); List<PortfolioStructure> userPersonalMaps = getStructureElementsForUser(identity, ElementType.DEFAULT_MAP, ElementType.STRUCTURED_MAP); diff --git a/src/main/java/org/olat/properties/PropertyManager.java b/src/main/java/org/olat/properties/PropertyManager.java index b2d5375e7fc3e1f93442feb747ae9e3a1db072fc..0952507d845263304ee1b719d8ab630b7815a1c8 100644 --- a/src/main/java/org/olat/properties/PropertyManager.java +++ b/src/main/java/org/olat/properties/PropertyManager.java @@ -25,6 +25,7 @@ package org.olat.properties; +import java.io.File; import java.util.Collections; import java.util.Date; import java.util.Iterator; @@ -726,7 +727,7 @@ public class PropertyManager extends BasicManager implements UserDataDeletable { * @see org.olat.user.UserDataDeletable#deleteUserData(org.olat.core.id.Identity) */ @Override - public void deleteUserData(Identity identity, String newDeletedUserName) { + public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath) { List<Property> userProperterties = listProperties(identity, null, null, null, null, null); for (Iterator<Property> iter = userProperterties.iterator(); iter.hasNext(); ) { deleteProperty( iter.next()); diff --git a/src/main/java/org/olat/repository/manager/CatalogManager.java b/src/main/java/org/olat/repository/manager/CatalogManager.java index 57764236435bb2a2204a229aee3205acf0708280..0559f906c21b19e22766c8dd3311ccd85cacba12 100644 --- a/src/main/java/org/olat/repository/manager/CatalogManager.java +++ b/src/main/java/org/olat/repository/manager/CatalogManager.java @@ -650,7 +650,7 @@ public class CatalogManager implements UserDataDeletable, InitializingBean { * @see org.olat.user.UserDataDeletable#deleteUserData(org.olat.core.id.Identity) */ @Override - public void deleteUserData(Identity identity, String newDeletedUserName) { + public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath) { // Remove as owner List<CatalogEntry> catalogEntries = getCatalogEntriesOwnedBy(identity); for (CatalogEntry catalogEntry:catalogEntries) { diff --git a/src/main/java/org/olat/repository/manager/RepositoryDeletionManager.java b/src/main/java/org/olat/repository/manager/RepositoryDeletionManager.java index bef0547530d2a008a7c8373186c1ab7212a8801e..c6d0fd2f86f3cd6eda205934ba40beac687f2cce 100644 --- a/src/main/java/org/olat/repository/manager/RepositoryDeletionManager.java +++ b/src/main/java/org/olat/repository/manager/RepositoryDeletionManager.java @@ -25,6 +25,7 @@ package org.olat.repository.manager; +import java.io.File; import java.util.Iterator; import java.util.List; @@ -73,7 +74,7 @@ public class RepositoryDeletionManager implements UserDataDeletable { * @see org.olat.user.UserDataDeletable#deleteUserData(org.olat.core.id.Identity) */ @Override - public void deleteUserData(Identity identity, String newDeletedUserName) { + public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath) { // Remove as owner List<RepositoryEntry> repoEntries = RepositoryManager.getInstance().queryByOwner(identity, new String[] {}/*no type limit*/); for (Iterator<RepositoryEntry> iter = repoEntries.iterator(); iter.hasNext();) { diff --git a/src/main/java/org/olat/user/DisplayPortraitManager.java b/src/main/java/org/olat/user/DisplayPortraitManager.java index c49ec2e8778002d885ff32cc469efc6e3597823d..eb01ca3cf823f893e8e879e71093c0c1e47c89f9 100644 --- a/src/main/java/org/olat/user/DisplayPortraitManager.java +++ b/src/main/java/org/olat/user/DisplayPortraitManager.java @@ -275,7 +275,7 @@ public class DisplayPortraitManager extends BasicManager implements UserDataDele * @see org.olat.user.UserDataDeletable#deleteUserData(org.olat.core.id.Identity) */ @Override - public void deleteUserData(Identity identity, String newDeletedUserName) { + public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath) { String userHomePage = FolderConfig.getCanonicalRoot() + FolderConfig.getUserHomePage(identity.getName()); File portraitDir = new File(userHomePage, "portrait"); if(portraitDir.exists()) { diff --git a/src/main/java/org/olat/user/HomePageConfigManagerImpl.java b/src/main/java/org/olat/user/HomePageConfigManagerImpl.java index 906954d48635f7962448afaab4b09ef36be074e7..f187cc3af65b98f022991d524e2154c72013f442 100644 --- a/src/main/java/org/olat/user/HomePageConfigManagerImpl.java +++ b/src/main/java/org/olat/user/HomePageConfigManagerImpl.java @@ -151,7 +151,7 @@ public class HomePageConfigManagerImpl extends BasicManager implements HomePageC * @see org.olat.user.UserDataDeletable#deleteUserData(org.olat.core.id.Identity) */ @Override - public void deleteUserData(Identity identity, String newDeletedUserName) { + public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath) { String pathHomePage = FolderConfig.getCanonicalRoot() + FolderConfig.getUserHomePage(identity.getName()); File userHomePage = new File(pathHomePage); if(userHomePage.exists()) { diff --git a/src/main/java/org/olat/user/PersonalFolderManager.java b/src/main/java/org/olat/user/PersonalFolderManager.java index 5d794074d60f5054db9ac9065572e7f4615ee303..0fff17749cd8d129b0d24380e50cc079104badf1 100644 --- a/src/main/java/org/olat/user/PersonalFolderManager.java +++ b/src/main/java/org/olat/user/PersonalFolderManager.java @@ -25,6 +25,8 @@ package org.olat.user; +import java.io.File; + import org.olat.core.commons.modules.bc.BriefcaseWebDAVProvider; import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl; import org.olat.core.id.Identity; @@ -34,7 +36,7 @@ import org.olat.core.logging.Tracing; /** * Manager for the personal-folder of a user. */ -public class PersonalFolderManager extends BriefcaseWebDAVProvider implements UserDataDeletable { +public class PersonalFolderManager extends BriefcaseWebDAVProvider implements UserDataDeletable { private static final OLog log = Tracing.createLoggerFor(PersonalFolderManager.class); @@ -59,7 +61,7 @@ public class PersonalFolderManager extends BriefcaseWebDAVProvider implements U * Delete personal-folder homes/<username> (private & public) of an user. */ @Override - public void deleteUserData(Identity identity, String newDeletedUserName) { + public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath) { new OlatRootFolderImpl(getRootPathFor(identity), null).deleteSilently(); log.debug("Personal-folder deleted for identity=" + identity); } diff --git a/src/main/java/org/olat/user/UserDataDeletable.java b/src/main/java/org/olat/user/UserDataDeletable.java index 672780ae328a6da026c34f2162c1be35a9f23605..2ae5711aaf2008b4ea596a30064816d91d5533be 100644 --- a/src/main/java/org/olat/user/UserDataDeletable.java +++ b/src/main/java/org/olat/user/UserDataDeletable.java @@ -25,6 +25,8 @@ package org.olat.user; +import java.io.File; + import org.olat.core.id.Identity; @@ -35,9 +37,14 @@ import org.olat.core.id.Identity; * @author Christian Guretzki */ public interface UserDataDeletable { + + default public int deleteUserDataPriority() { + return 0; + } + /** * Delete user data for certain user * @param identity Data for this identity will be deleted */ - public void deleteUserData(Identity identity, String newDeletedUserName); + public void deleteUserData(Identity identity, String newDeletedUserName, File archivePath); } \ No newline at end of file diff --git a/src/test/java/org/olat/core/util/mail/manager/MailManagerTest.java b/src/test/java/org/olat/core/util/mail/manager/MailManagerTest.java index 3ec0bd08079d91bfd65e723d7b09761d7e4867ab..152bcb9941ba24ca13462339c23b89bfb6629833 100644 --- a/src/test/java/org/olat/core/util/mail/manager/MailManagerTest.java +++ b/src/test/java/org/olat/core/util/mail/manager/MailManagerTest.java @@ -258,10 +258,10 @@ public class MailManagerTest extends OlatTestCase { dbInstance.commitAndCloseSession(); //delete the 4 users datas - mailBoxExtension.deleteUserData(toId_1, "lalala"); - mailBoxExtension.deleteUserData(toId_2, "lalala"); - mailBoxExtension.deleteUserData(toId_3, "lalala"); - mailBoxExtension.deleteUserData(fromId, "lalala"); + mailBoxExtension.deleteUserData(toId_1, "lalala", null); + mailBoxExtension.deleteUserData(toId_2, "lalala", null); + mailBoxExtension.deleteUserData(toId_3, "lalala", null); + mailBoxExtension.deleteUserData(fromId, "lalala", null); dbInstance.commitAndCloseSession(); //check inbox / outbox @@ -324,10 +324,10 @@ public class MailManagerTest extends OlatTestCase { dbInstance.commitAndCloseSession(); //delete the 4 users datas - mailBoxExtension.deleteUserData(fromId, "lalala"); - mailBoxExtension.deleteUserData(toId_1, "lalala"); - mailBoxExtension.deleteUserData(toId_2, "lalala"); - mailBoxExtension.deleteUserData(toId_3, "lalala"); + mailBoxExtension.deleteUserData(fromId, "lalala", null); + mailBoxExtension.deleteUserData(toId_1, "lalala", null); + mailBoxExtension.deleteUserData(toId_2, "lalala", null); + mailBoxExtension.deleteUserData(toId_3, "lalala", null); dbInstance.commitAndCloseSession(); //check mail by meta id diff --git a/src/test/java/org/olat/course/assessment/AssessmentManagerTest.java b/src/test/java/org/olat/course/assessment/AssessmentManagerTest.java index 1589a007a7c05162d70ccd1c3300d3b5b16c8205..851ca4ae359d0800e3be9ef14bb26872a61e904d 100644 --- a/src/test/java/org/olat/course/assessment/AssessmentManagerTest.java +++ b/src/test/java/org/olat/course/assessment/AssessmentManagerTest.java @@ -251,7 +251,7 @@ public class AssessmentManagerTest extends OlatTestCase { efficiencyStatement = checkEfficiencyStatement(courseRepositoryEntry); //delete the efficiencyStatement of the student - efficiencyStatementManager.deleteUserData(student, "deleted_" + student.getName()); + efficiencyStatementManager.deleteEfficientyStatement(student); DBFactory.getInstance().closeSession(); efficiencyStatement = efficiencyStatementManager.getUserEfficiencyStatementByCourseRepositoryEntry(courseRepositoryEntry, student); DBFactory.getInstance().closeSession(); diff --git a/src/test/java/org/olat/course/assessment/manager/EfficiencyStatementManagerTest.java b/src/test/java/org/olat/course/assessment/manager/EfficiencyStatementManagerTest.java index 755988604593586953e5d3e1d1f8b7e8dfb6fff6..9f411c6ea30991fa8c90d6639543e3b0dc8ea940 100644 --- a/src/test/java/org/olat/course/assessment/manager/EfficiencyStatementManagerTest.java +++ b/src/test/java/org/olat/course/assessment/manager/EfficiencyStatementManagerTest.java @@ -122,7 +122,7 @@ public class EfficiencyStatementManagerTest extends OlatTestCase { Assert.assertEquals(2, statementsLight1.size()); //delete user 1 - effManager.deleteUserData(participant1, "deleted"); + effManager.deleteEfficientyStatement(participant1); dbInstance.commitAndCloseSession(); //check the efficiency statements diff --git a/src/test/java/org/olat/properties/PropertyTest.java b/src/test/java/org/olat/properties/PropertyTest.java index e03e754e8876ea8c31a0023a19e96a10f37efceb..aef24041b8ecf430d10653b678313ee084c63960 100644 --- a/src/test/java/org/olat/properties/PropertyTest.java +++ b/src/test/java/org/olat/properties/PropertyTest.java @@ -237,7 +237,7 @@ public class PropertyTest extends OlatTestCase { dbInstance.commitAndCloseSession(); //delete user 1 datas - pm.deleteUserData(id1, "del-" + id1.getName()); + pm.deleteUserData(id1, "del-" + id1.getName(), null); dbInstance.commitAndCloseSession(); //check if really deleted