From caeecf178f1975cfa539ffe5b8617267c5f60d3a Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Tue, 8 May 2018 17:10:00 +0200
Subject: [PATCH] OO-3296: upgrader to move repository entry under the default
 organization

---
 .../modules/coach/manager/CoachingDAO.java    | 10 ++--
 .../olat/repository/RepositoryManager.java    | 31 ++++++-----
 .../manager/AutomaticLifecycleService.java    |  6 +--
 .../manager/RepositoryEntryAuthorQueries.java | 40 ++++++++------
 .../manager/RepositoryEntryQueries.java       |  2 +-
 .../org/olat/upgrade/OLATUpgrade_13_0_0.java  | 54 +++++++++++++++++++
 .../gatling/AccessTransactionGatling.java     |  2 +-
 7 files changed, 102 insertions(+), 43 deletions(-)

diff --git a/src/main/java/org/olat/modules/coach/manager/CoachingDAO.java b/src/main/java/org/olat/modules/coach/manager/CoachingDAO.java
index 414cc95277a..7a688cb1d8d 100644
--- a/src/main/java/org/olat/modules/coach/manager/CoachingDAO.java
+++ b/src/main/java/org/olat/modules/coach/manager/CoachingDAO.java
@@ -83,9 +83,9 @@ public class CoachingDAO {
 		  .append(" inner join baseGroup.members as membership on membership.role in ('").append(GroupRoles.owner.name()).append("','").append(GroupRoles.coach.name()).append("')")
 		  .append(" where membership.identity.key=:identityKey")
 		  .append(" and (")
-		  .append("  (membership.role = 'coach' and (v.access>=3 or (v.access=").append(RepositoryEntry.ACC_OWNERS).append(" and v.membersOnly=true)))")
+		  .append("  (membership.role = '").append(GroupRoles.coach.name()).append("' and (v.access>=").append(RepositoryEntry.ACC_USERS).append(" or (v.access=").append(RepositoryEntry.ACC_OWNERS).append(" and v.membersOnly=true)))")
 		  .append("  or")
-		  .append("  (membership.role = 'owner' and v.access>=1)")
+		  .append("  (membership.role = '").append(GroupRoles.owner.name()).append("' and v.access>=").append(RepositoryEntry.ACC_OWNERS).append(")")
 		  .append(" )");
 		
 		List<Long> firstKey = dbInstance.getCurrentEntityManager()
@@ -758,9 +758,9 @@ public class CoachingDAO {
 			  .append("  inner join o_as_eff_statement sg_statement ")
 			  .append("    on (sg_statement.fk_identity = sg_participant.fk_identity_id and sg_statement.fk_resource_id = sg_re.fk_olatresource) ")
 			  .append("  where  ( ")
-			  .append("    (sg_re.accesscode>2) ")
+			  .append("    (sg_re.accesscode>").append(RepositoryEntry.ACC_OWNERS_AUTHORS).append(") ")
 			  .append("    or ")
-			  .append("    (sg_re.accesscode=1 and sg_re.membersonly=").appendTrue().append(")) ")
+			  .append("    (sg_re.accesscode=").append(RepositoryEntry.ACC_OWNERS).append(" and sg_re.membersonly=").appendTrue().append(")) ")
 			  .append(" )");
 		}
 		if(hasOwned) {
@@ -889,7 +889,7 @@ public class CoachingDAO {
 		  .append(" inner join o_as_eff_statement sg_statement on (sg_statement.fk_identity = sg_participant.fk_identity_id and sg_statement.fk_resource_id = sg_re.fk_olatresource) ")
 		  .append(" inner join o_bs_identity id_participant on (sg_participant.fk_identity_id = id_participant.id) ");
 		appendUsersStatisticsJoins(params, sb)
-		  .append(" where  sg_re.accesscode>0 ");
+		  .append(" where  sg_re.accesscode>=").append(RepositoryEntry.ACC_OWNERS);
 		appendUsersStatisticsSearchParams(params, queryParams, sb)
 		  .append(") ")
 		  .append("group by fin_statement.fk_identity ");
diff --git a/src/main/java/org/olat/repository/RepositoryManager.java b/src/main/java/org/olat/repository/RepositoryManager.java
index e046709cfb2..23a617567df 100644
--- a/src/main/java/org/olat/repository/RepositoryManager.java
+++ b/src/main/java/org/olat/repository/RepositoryManager.java
@@ -947,7 +947,7 @@ public class RepositoryManager {
 		  .append(" inner join v.groups as relGroup on relGroup.defaultGroup=true")
 		  .append(" inner join relGroup.group as baseGroup")
 		  .append(" inner join baseGroup.members as membership on membership.role='").append(GroupRoles.owner.name()).append("'")
-		  .append(" where v.access>0 and membership.identity.key=:identityKey");
+		  .append(" where v.access>=").append(RepositoryEntry.ACC_OWNERS).append(" and membership.identity.key=:identityKey");
 		if (limitTypes != null && limitTypes.length > 0) {
 			sb.append(" and res.resName in (:types)");
 		}
@@ -1609,7 +1609,7 @@ public class RepositoryManager {
 		  .append(" inner join v.groups as relGroup")
 		  .append(" inner join relGroup.group as baseGroup")
 		  .append(" inner join baseGroup.members as membership on membership.role='").append(GroupRoles.participant.name()).append("'")
-		  .append(" where (v.access>=3 or (v.access=").append(RepositoryEntry.ACC_OWNERS).append(" and v.membersOnly=true))")
+		  .append(" where (v.access>=").append(RepositoryEntry.ACC_USERS).append(" or (v.access=").append(RepositoryEntry.ACC_OWNERS).append(" and v.membersOnly=true))")
 		  .append(" and membership.identity.key=:identityKey");
 		return dbInstance.getCurrentEntityManager()
 				.createQuery(sb.toString(), Number.class)
@@ -1631,7 +1631,7 @@ public class RepositoryManager {
 		  .append(" inner join v.groups as relGroup")
 		  .append(" inner join relGroup.group as baseGroup")
 		  .append(" inner join baseGroup.members as membership")
-		  .append(" where (v.access>=3 or (v.access=").append(RepositoryEntry.ACC_OWNERS).append(" and v.membersOnly=true))")
+		  .append(" where (v.access>=").append(RepositoryEntry.ACC_USERS).append(" or (v.access=").append(RepositoryEntry.ACC_OWNERS).append(" and v.membersOnly=true))")
 		  .append(" and membership.identity.key=:identityKey and membership.role='").append(GroupRoles.participant.name()).append("'");
 		if(StringHelper.containsNonWhitespace(type)) {
 			sb.append(" and res.resName=:resourceType");
@@ -1667,7 +1667,7 @@ public class RepositoryManager {
 		  .append(" inner join v.groups as relGroup")
 		  .append(" inner join relGroup.group as baseGroup")
 		  .append(" inner join baseGroup.members as membership")
-		  .append(" where (v.access>=3 or (v.access=").append(RepositoryEntry.ACC_OWNERS).append(" and v.membersOnly=true))")
+		  .append(" where (v.access>=").append(RepositoryEntry.ACC_USERS).append(" or (v.access=").append(RepositoryEntry.ACC_OWNERS).append(" and v.membersOnly=true))")
 		  .append(" and membership.identity.key=:identityKey and membership.role in('").append(GroupRoles.participant.name()).append("','").append(GroupRoles.coach.name()).append("')");
 		if(StringHelper.containsNonWhitespace(type)) {
 			sb.append(" and res.resName=:resourceType");
@@ -1736,7 +1736,7 @@ public class RepositoryManager {
 		  .append(" where exists (select rel from repoentrytogroup as rel, bgroup as baseGroup, bgroupmember as membership")
 		  .append("    where rel.entry=v and rel.group=baseGroup and membership.group=baseGroup and membership.identity.key=:identityKey")
 		  .append("      and membership.role='").append(GroupRoles.participant.name()).append("')")
-		  .append(" and (v.access>=3 or (v.access=").append(RepositoryEntry.ACC_OWNERS).append(" and v.membersOnly=true))");
+		  .append(" and (v.access>=").append(RepositoryEntry.ACC_USERS).append(" or (v.access=").append(RepositoryEntry.ACC_OWNERS).append(" and v.membersOnly=true))");
 		appendOrderBy(sb, "v", orderby);
 
 		TypedQuery<RepositoryEntryLight> query = dbInstance.getCurrentEntityManager()
@@ -1755,7 +1755,7 @@ public class RepositoryManager {
 		  .append(" where exists (select rel from repoentrytogroup as rel, bgroup as baseGroup, bgroupmember as membership")
 		  .append("    where rel.entry=v and rel.group=baseGroup and membership.group=baseGroup and membership.identity.key=:identityKey")
 		  .append("      and membership.role='").append(GroupRoles.coach.name()).append("')")
-		  .append("  and (v.access>=3 or (v.access=").append(RepositoryEntry.ACC_OWNERS).append(" and v.membersOnly=true))");
+		  .append("  and (v.access>=").append(RepositoryEntry.ACC_USERS).append(" or (v.access=").append(RepositoryEntry.ACC_OWNERS).append(" and v.membersOnly=true))");
 		appendOrderBy(sb, "v", orderby);
 
 		TypedQuery<RepositoryEntryLight> query = dbInstance.getCurrentEntityManager()
@@ -1774,7 +1774,7 @@ public class RepositoryManager {
 		  .append(" inner join v.groups as relGroup on relGroup.defaultGroup=true")
 		  .append(" inner join relGroup.group as baseGroup")
 		  .append(" inner join baseGroup.members as membership")
-		  .append(" where v.access>=0 and membership.identity.key=:identityKey and membership.role='").append(GroupRoles.owner.name()).append("'");
+		  .append(" where v.access>=").append(RepositoryEntry.ACC_OWNERS).append(" and membership.identity.key=:identityKey and membership.role='").append(GroupRoles.owner.name()).append("'");
 
 		return dbInstance.getCurrentEntityManager()
 				.createQuery(sb.toString(), Number.class)
@@ -1833,7 +1833,7 @@ public class RepositoryManager {
 		sb.append(" inner join v.groups as relGroup")
 		  .append(" inner join relGroup.group as baseGroup")
 		  .append(" inner join baseGroup.members as membership on membership.role ='").append(GroupRoles.coach.name()).append("'")
-		  .append(" where (v.access>=3 or (v.access=").append(RepositoryEntry.ACC_OWNERS).append(" and v.membersOnly=true))")
+		  .append(" where (v.access>=").append(RepositoryEntry.ACC_USERS).append(" or (v.access=").append(RepositoryEntry.ACC_OWNERS).append(" and v.membersOnly=true))")
 		  .append(" and membership.identity.key=:identityKey");
 	}
 
@@ -1920,7 +1920,7 @@ public class RepositoryManager {
 			query.setParameter("repoKey", re.getKey());
 		}
 		if(identity != null && identity.length > 0) {
-			List<Long> ids = new ArrayList<Long>(identity.length);
+			List<Long> ids = new ArrayList<>(identity.length);
 			for(Identity id:identity) {
 				ids.add(id.getKey());
 			}
@@ -1953,13 +1953,12 @@ public class RepositoryManager {
 			Date creationDate = (Date)membership[2];
 			Object role = membership[3];
 
-			RepositoryEntryMembership mb = memberships.get(identityKey);
-			if(mb == null) {
-				mb = new RepositoryEntryMembership();
-				mb.setIdentityKey(identityKey);
-				mb.setRepoKey(re.getKey());
-				memberships.put(identityKey, mb);
-			}
+			RepositoryEntryMembership mb = memberships.computeIfAbsent(identityKey, key -> {
+				RepositoryEntryMembership rmb = new RepositoryEntryMembership();
+				rmb.setIdentityKey(identityKey);
+				rmb.setRepoKey(re.getKey());
+				return rmb;
+			});
 			mb.setCreationDate(creationDate);
 			mb.setLastModified(lastModified);
 
diff --git a/src/main/java/org/olat/repository/manager/AutomaticLifecycleService.java b/src/main/java/org/olat/repository/manager/AutomaticLifecycleService.java
index 161f1e0506d..f20861cf93f 100644
--- a/src/main/java/org/olat/repository/manager/AutomaticLifecycleService.java
+++ b/src/main/java/org/olat/repository/manager/AutomaticLifecycleService.java
@@ -90,7 +90,7 @@ public class AutomaticLifecycleService {
 		  .append(" inner join fetch v.statistics as statistics")
 		  .append(" inner join fetch v.lifecycle as lifecycle")
 		  .append(" where lifecycle.validTo<:now and v.statusCode=").append(RepositoryEntryStatus.REPOSITORY_STATUS_OPEN)
-		  .append(" and v.access>0");
+		  .append(" and v.access>=").append(RepositoryEntry.ACC_OWNERS);
 		
 		Calendar cal = Calendar.getInstance();
 		cal.setTime(date);
@@ -132,7 +132,7 @@ public class AutomaticLifecycleService {
 		  .append(" inner join fetch v.statistics as statistics")
 		  .append(" inner join fetch v.lifecycle as lifecycle")
 		  .append(" where lifecycle.validTo<:now and not(v.statusCode=").append(RepositoryEntryStatus.REPOSITORY_STATUS_UNPUBLISHED).append(")")
-		  .append(" and v.access>0");
+		  .append(" and v.access>=").append(RepositoryEntry.ACC_OWNERS);
 		
 		Calendar cal = Calendar.getInstance();
 		cal.setTime(date);
@@ -173,7 +173,7 @@ public class AutomaticLifecycleService {
 		  .append(" inner join fetch v.olatResource as ores")
 		  .append(" inner join fetch v.statistics as statistics")
 		  .append(" inner join fetch v.lifecycle as lifecycle")
-		  .append(" where lifecycle.validTo<:now and v.access>0");
+		  .append(" where lifecycle.validTo<:now and v.access>=").append(RepositoryEntry.ACC_OWNERS);
 		
 		Calendar cal = Calendar.getInstance();
 		cal.setTime(date);
diff --git a/src/main/java/org/olat/repository/manager/RepositoryEntryAuthorQueries.java b/src/main/java/org/olat/repository/manager/RepositoryEntryAuthorQueries.java
index cf71d8cf18e..579699f3166 100644
--- a/src/main/java/org/olat/repository/manager/RepositoryEntryAuthorQueries.java
+++ b/src/main/java/org/olat/repository/manager/RepositoryEntryAuthorQueries.java
@@ -334,33 +334,39 @@ public class RepositoryEntryAuthorQueries {
 		}
 		
 		Roles roles = params.getRoles();
-		if(roles != null && roles.isOLATAdmin()) {
+		if(roles == null) {
+			sb.append(" v.access>=").append(RepositoryEntry.ACC_USERS);
+			return false;
+		}
+
+		if(roles.isOLATAdmin()) {
 			if(params.isDeleted()) {
 				sb.append(" v.access=").append(RepositoryEntry.DELETED);
 			} else {
 				sb.append(" v.access>=").append(RepositoryEntry.ACC_OWNERS);
 			}
 			return false;
-		} 
+		}
 		
-		if(roles != null && (roles.isAuthor() || roles.isLearnResourceManager())) {
-			sb.append(" (v.access>=").append(RepositoryEntry.ACC_OWNERS_AUTHORS)
-			  .append(" or (v.access=").append(RepositoryEntry.ACC_OWNERS)
+		sb.append(" (v.access>=").append(RepositoryEntry.ACC_USERS);
+		if(roles.isAuthor()) {
+			sb.append(" or (v.access=").append(RepositoryEntry.ACC_OWNERS_AUTHORS)
 			  .append("   and v.key in (select rel.entry.key from repoentrytogroup as rel, bgroupmember as membership")
 			  .append("     where rel.group.key=membership.group.key and membership.identity.key=:identityKey")
-			  .append("       and membership.role in ('").append(GroupRoles.owner.name()).append("','").append(OrganisationRoles.learnresourcemanager).append("')")
+			  .append("       and membership.role = '").append(OrganisationRoles.author).append("'")
 			  .append("   )")
-			  .append(" ))");
-
-		} else {
-			sb.append(" (v.access>=").append(RepositoryEntry.ACC_USERS)
-			  .append(" or (v.access=").append(RepositoryEntry.ACC_OWNERS)
-			  .append("   and v.key in (select rel.entry.key from repoentrytogroup as rel, bgroupmember as membership")
-			  .append("     where rel.group.key=membership.group.key and membership.identity.key=:identityKey")
-			  .append("       and membership.role in ('").append(GroupRoles.owner.name()).append("')")
-			  .append("   )")
-			  .append(" ))");
-		}
+			  .append(" )");
+		} 
+		sb.append(" or (v.access=").append(RepositoryEntry.ACC_OWNERS)
+		  .append("   and v.key in (select rel.entry.key from repoentrytogroup as rel, bgroupmember as membership")
+		  .append("     where rel.group.key=membership.group.key and membership.identity.key=:identityKey")
+		  .append("       and membership.role in ('").append(GroupRoles.owner.name()).append("'");
+		if(roles.isLearnResourceManager()) {
+			sb.append(",'").append(OrganisationRoles.learnresourcemanager.name()).append("'");
+		}
+		sb.append("     )")//close in
+		  .append("   )")
+		  .append(" ))");
 		return true;
 	}
 	
diff --git a/src/main/java/org/olat/repository/manager/RepositoryEntryQueries.java b/src/main/java/org/olat/repository/manager/RepositoryEntryQueries.java
index 2f773d961d2..bfb30b33e61 100644
--- a/src/main/java/org/olat/repository/manager/RepositoryEntryQueries.java
+++ b/src/main/java/org/olat/repository/manager/RepositoryEntryQueries.java
@@ -228,7 +228,7 @@ public class RepositoryEntryQueries {
 			  .append("  and membership.role='").append(OrganisationRoles.author.name()).append("')");
 		}
 		// as owner
-		sb.append(" or (v.access=").append(RepositoryEntry.ACC_OWNERS)
+		sb.append(" or (v.access>=").append(RepositoryEntry.ACC_OWNERS)
 		  .append("  and membership.role='").append(GroupRoles.owner.name()).append("')");
 		// as member
 		sb.append(" or (v.access=").append(RepositoryEntry.ACC_OWNERS).append(" and v.membersOnly=true")
diff --git a/src/main/java/org/olat/upgrade/OLATUpgrade_13_0_0.java b/src/main/java/org/olat/upgrade/OLATUpgrade_13_0_0.java
index 8535c0de3e0..9fc7f6112f4 100644
--- a/src/main/java/org/olat/upgrade/OLATUpgrade_13_0_0.java
+++ b/src/main/java/org/olat/upgrade/OLATUpgrade_13_0_0.java
@@ -30,6 +30,10 @@ import org.olat.basesecurity.manager.OrganisationDAO;
 import org.olat.core.commons.persistence.DB;
 import org.olat.core.id.Identity;
 import org.olat.core.id.Organisation;
+import org.olat.repository.RepositoryEntry;
+import org.olat.repository.RepositoryService;
+import org.olat.repository.manager.RepositoryEntryRelationDAO;
+import org.olat.repository.manager.RepositoryEntryToOrganisationDAO;
 import org.springframework.beans.factory.annotation.Autowired;
 
 /**
@@ -42,6 +46,7 @@ public class OLATUpgrade_13_0_0 extends OLATUpgrade {
 	
 	private static final String VERSION = "OLAT_13.0.0";
 	private static final String MIGRATE_ROLE = "MIGRATE ROLE";
+	private static final String MIGRATE_REPO_ENTRY_DEFAULT_ORG = "MIGRATE REPO ENTRY TO DEF ORG";
 	
 	@Autowired
 	private DB dbInstance;
@@ -49,6 +54,12 @@ public class OLATUpgrade_13_0_0 extends OLATUpgrade {
 	private OrganisationDAO organisationDao;
 	@Autowired
 	private OrganisationService organisationService;
+	@Autowired
+	private RepositoryService repositoryService;
+	@Autowired
+	private RepositoryEntryRelationDAO repositoryEntryRelationDao;
+	@Autowired
+	private RepositoryEntryToOrganisationDAO repositoryEntryToOrganisationDao;
 	
 	public OLATUpgrade_13_0_0() {
 		super();
@@ -76,6 +87,7 @@ public class OLATUpgrade_13_0_0 extends OLATUpgrade {
 		
 		boolean allOk = true;
 		allOk &= migrateRole(upgradeManager, uhd);
+		allOk &= migrateRepositoryEntriesTodefaultOrganisation(upgradeManager, uhd);
 		
 		uhd.setInstallationComplete(allOk);
 		upgradeManager.setUpgradesHistory(uhd, VERSION);
@@ -87,6 +99,41 @@ public class OLATUpgrade_13_0_0 extends OLATUpgrade {
 		return allOk;
 	}
 	
+	private boolean migrateRepositoryEntriesTodefaultOrganisation(UpgradeManager upgradeManager, UpgradeHistoryData uhd) {
+		boolean allOk = true;
+		if (!uhd.getBooleanDataValue(MIGRATE_REPO_ENTRY_DEFAULT_ORG)) {
+			try {
+				List<Long> repositoryEntryKeys = getRepositoryEntryKeys();
+				for(int i=0; i<repositoryEntryKeys.size(); i++) {
+					migrateRepositoryEntryToDefaultOrganisation(repositoryEntryKeys.get(0));
+					if(i % 50 == 0) {
+						log.info("Migration repository entries to default organisation: " + i + " / " + repositoryEntryKeys.size());
+					}
+				}
+				log.info("Migration repository entries to default organisation done: " + repositoryEntryKeys.size());
+				dbInstance.commitAndCloseSession();
+			} catch (Exception e) {
+				log.error("", e);
+				allOk &= false;
+			}
+
+			uhd.setBooleanDataValue(MIGRATE_REPO_ENTRY_DEFAULT_ORG, allOk);
+			upgradeManager.setUpgradesHistory(uhd, VERSION);
+		}
+		return allOk;
+	}
+	
+	private void migrateRepositoryEntryToDefaultOrganisation(Long repositoryEntryKey) {
+		RepositoryEntry entry = repositoryService.loadByKey(repositoryEntryKey);
+		List<Organisation> currentOrganisations = repositoryEntryRelationDao.getOrganisations(entry);
+		if(currentOrganisations.isEmpty()) {
+			Organisation defOrganisation = organisationService.getDefaultOrganisation();
+			repositoryEntryToOrganisationDao.createRelation(defOrganisation, entry, false);
+			repositoryEntryRelationDao.createRelation(defOrganisation.getGroup(), entry);
+			dbInstance.commitAndCloseSession();
+		}
+	}
+	
 	private boolean migrateRole(UpgradeManager upgradeManager, UpgradeHistoryData uhd) {
 		boolean allOk = true;
 		if (!uhd.getBooleanDataValue(MIGRATE_ROLE)) {
@@ -148,4 +195,11 @@ public class OLATUpgrade_13_0_0 extends OLATUpgrade {
 				.setParameter("groupName", securityGroupName)
 				.getResultList();
 	}
+	
+	private List<Long> getRepositoryEntryKeys() {
+		String q = "select v.key from repositoryentry as v";
+		return dbInstance.getCurrentEntityManager()
+				.createQuery(q, Long.class)
+				.getResultList();
+	}
 }
diff --git a/src/test/java/org/olat/gatling/AccessTransactionGatling.java b/src/test/java/org/olat/gatling/AccessTransactionGatling.java
index f4b9404cc31..5d4d6e2adaa 100644
--- a/src/test/java/org/olat/gatling/AccessTransactionGatling.java
+++ b/src/test/java/org/olat/gatling/AccessTransactionGatling.java
@@ -68,7 +68,7 @@ public class AccessTransactionGatling extends OlatTestCase {
 		  .append(" inner join fetch v.olatResource as ores")
 		  .append(" inner join fetch v.statistics as statistics")
 		  .append(" left join fetch v.lifecycle as lifecycle")
-		  .append(" where ores.resName='CourseModule' and v.access>0");
+		  .append(" where ores.resName='CourseModule' and v.access>=").append(RepositoryEntry.ACC_OWNERS);
 		
 		List<RepositoryEntry> courses= dbInstance.getCurrentEntityManager()
 				.createQuery(sb.toString(), RepositoryEntry.class)
-- 
GitLab