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