From 35984989e0ff340a66607473a8e47ceb151455f9 Mon Sep 17 00:00:00 2001 From: srosse <none@none> Date: Wed, 16 Jan 2013 15:28:16 +0100 Subject: [PATCH] OO-420: modernize CatalogManager --- .../org/olat/catalog/CatalogEntryImpl.java | 2 + .../java/org/olat/catalog/CatalogManager.java | 234 +++++++----------- 2 files changed, 91 insertions(+), 145 deletions(-) diff --git a/src/main/java/org/olat/catalog/CatalogEntryImpl.java b/src/main/java/org/olat/catalog/CatalogEntryImpl.java index 9cbefef1ffc..ef8896424a5 100644 --- a/src/main/java/org/olat/catalog/CatalogEntryImpl.java +++ b/src/main/java/org/olat/catalog/CatalogEntryImpl.java @@ -38,6 +38,8 @@ import org.olat.repository.RepositoryEntry; * @author Felix Jost */ public class CatalogEntryImpl extends PersistentObject implements CatalogEntry { + + private static final long serialVersionUID = 2834235462805397562L; private String name; private String description; private String externalURL; diff --git a/src/main/java/org/olat/catalog/CatalogManager.java b/src/main/java/org/olat/catalog/CatalogManager.java index ab4b49bfd2e..8b47d245298 100644 --- a/src/main/java/org/olat/catalog/CatalogManager.java +++ b/src/main/java/org/olat/catalog/CatalogManager.java @@ -33,20 +33,17 @@ import javax.persistence.TypedQuery; import org.olat.admin.user.delete.service.UserDeletionManager; import org.olat.basesecurity.BaseSecurity; -import org.olat.basesecurity.BaseSecurityManager; import org.olat.basesecurity.Constants; import org.olat.basesecurity.SecurityGroup; 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.commons.persistence.PersistenceHelper; import org.olat.core.configuration.Initializable; import org.olat.core.id.Identity; import org.olat.core.id.OLATResourceable; -import org.olat.core.logging.Tracing; import org.olat.core.manager.BasicManager; import org.olat.core.util.coordinate.CoordinatorManager; import org.olat.core.util.event.MultiUserEvent; +import org.olat.core.util.resource.Resourceable; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryManager; import org.olat.repository.controllers.EntryChangedEvent; @@ -86,6 +83,8 @@ public class CatalogManager extends BasicManager implements UserDataDeletable, I private DB dbInstance; @Autowired private BaseSecurity securityManager; + @Autowired + private RepositoryManager repositoryManager; /** * [spring] @@ -133,7 +132,7 @@ public class CatalogManager extends BasicManager implements UserDataDeletable, I sb.append(" order by cei.").append(orderBy.name()).append(asc ? " ASC" : " DESC"); } - TypedQuery<CatalogEntry> dbQuery = DBFactory.getInstance().getCurrentEntityManager() + TypedQuery<CatalogEntry> dbQuery = dbInstance.getCurrentEntityManager() .createQuery(sb.toString(), CatalogEntry.class) .setParameter("parentKey", ce.getKey()) .setFirstResult(0); @@ -158,7 +157,7 @@ public class CatalogManager extends BasicManager implements UserDataDeletable, I sb.append(" order by cei.").append(orderBy.name()).append(asc ? " ASC" : " DESC"); } - TypedQuery<CatalogEntryShort> dbQuery = DBFactory.getInstance().getCurrentEntityManager() + TypedQuery<CatalogEntryShort> dbQuery = dbInstance.getCurrentEntityManager() .createQuery(sb.toString(), CatalogEntryShort.class) .setParameter("parentKey", ce.getKey()) .setFirstResult(0); @@ -176,13 +175,19 @@ public class CatalogManager extends BasicManager implements UserDataDeletable, I * @return List of catalog entries of type CatalogEntry.TYPE_NODE */ public List<CatalogEntry> getAllCatalogNodes() { - String sqlQuery = "select cei from org.olat.catalog.CatalogEntryImpl as cei " - + " where cei.type= :type "; - DBQuery dbQuery = DBFactory.getInstance().createQuery(sqlQuery); - dbQuery.setInteger("type", CatalogEntry.TYPE_NODE); - // cache this query - dbQuery.setCacheable(true); - return dbQuery.list(); + StringBuilder sb = new StringBuilder(); + sb.append("select cei from ").append(CatalogEntryImpl.class.getName()).append(" as cei ") + .append(" inner join fetch cei.ownerGroup as ownerGroup") + .append(" left join fetch cei.repositoryEntry as repositoryEntry") + .append(" left join fetch repositoryEntry.ownerGroup as repoOwnerGroup") + .append(" left join fetch repositoryEntry.tutorGroup as repoTutorGroup") + .append(" left join fetch repositoryEntry.participantGroup as repoParticipantGroup") + .append(" where cei.type= :type"); + + return dbInstance.getCurrentEntityManager() + .createQuery(sb.toString(), CatalogEntry.class) + .setParameter("type", CatalogEntry.TYPE_NODE) + .getResultList(); } @@ -211,14 +216,14 @@ public class CatalogManager extends BasicManager implements UserDataDeletable, I query.append(" and cei.type=:type"); } - DBQuery dbQuery = DBFactory.getInstance().createQuery(query.toString()); - dbQuery.setLong("parentKey", ce.getKey()); + TypedQuery<Number> dbQuery = dbInstance.getCurrentEntityManager() + .createQuery(query.toString(), Number.class) + .setParameter("parentKey", ce.getKey()); if(type >= 0) { - dbQuery.setInteger("type", type); + dbQuery.setParameter("type", type); } - // cache this query - dbQuery.setCacheable(true); - Number totalCount = (Number)dbQuery.uniqueResult(); + + Number totalCount = dbQuery.getSingleResult(); return totalCount.intValue(); } @@ -230,8 +235,6 @@ public class CatalogManager extends BasicManager implements UserDataDeletable, I */ public List<CatalogEntry> filterOwnedLeafs(Identity identity, List<CatalogEntry> catalogEntries) { List<CatalogEntry> ownedEntries = new ArrayList<CatalogEntry>(); - BaseSecurity securityManager = BaseSecurityManager.getInstance(); - for(CatalogEntry cate:catalogEntries) { if (cate.getType() == CatalogEntry.TYPE_LEAF) { RepositoryEntry repe = cate.getRepositoryEntry(); @@ -251,7 +254,7 @@ public class CatalogManager extends BasicManager implements UserDataDeletable, I * @return reloaded catalog entry */ public CatalogEntry loadCatalogEntry(CatalogEntry catalogEntry) { - return (CatalogEntry) DBFactory.getInstance().loadObject(catalogEntry); + return dbInstance.getCurrentEntityManager().find(CatalogEntryImpl.class, catalogEntry.getKey()); } /** @@ -260,7 +263,7 @@ public class CatalogManager extends BasicManager implements UserDataDeletable, I * @return */ public CatalogEntry loadCatalogEntry(Long catEntryId) { - return (CatalogEntry) DBFactory.getInstance().loadObject(CatalogEntryImpl.class, catEntryId); + return dbInstance.getCurrentEntityManager().find(CatalogEntryImpl.class, catEntryId); } /** @@ -269,7 +272,7 @@ public class CatalogManager extends BasicManager implements UserDataDeletable, I * @param ce */ public void saveCatalogEntry(CatalogEntry ce) { - DBFactory.getInstance().saveObject(ce); + dbInstance.getCurrentEntityManager().persist(ce); } /** @@ -278,35 +281,9 @@ public class CatalogManager extends BasicManager implements UserDataDeletable, I * @param ce */ public CatalogEntry updateCatalogEntry(CatalogEntry ce) { - DBFactory.getInstance().updateObject(ce); - return ce; + return dbInstance.getCurrentEntityManager().merge(ce); } - public List entriesWithOwnerFrom(Identity owner,CatalogEntry ce) { - List retVal = new ArrayList(); - findEntriesOf(owner, ce, retVal); - return retVal; - } - - private void findEntriesOf(Identity owner, CatalogEntry root, List entries) { - /* - * check if node is owned by identity - */ - BaseSecurity secMgr = BaseSecurityManager.getInstance(); - SecurityGroup owners = root.getOwnerGroup(); - if(owners!=null && secMgr.isIdentityInSecurityGroup(owner, owners)) { - entries.add(root); - } - /* - * check subtree, by visit children first strategy - */ - List children = getChildrenOf(root); - Iterator iter = children.iterator(); - while (iter.hasNext()) { - CatalogEntry nextCe = (CatalogEntry) iter.next(); - findEntriesOf(owner, nextCe, entries); - } - } /** * delete a catalog entry and a potentially referenced substructure from db. * Be aware of how to use this deletion, as all the referenced substructure is @@ -315,18 +292,19 @@ public class CatalogManager extends BasicManager implements UserDataDeletable, I * @param ce */ public void deleteCatalogEntry(CatalogEntry ce) { - getLogger().debug("deleteCatalogEntry start... ce=" + ce); - BaseSecurity securityManager = BaseSecurityManager.getInstance(); + boolean debug = isLogDebugEnabled(); + if(debug) logDebug("deleteCatalogEntry start... ce=" + ce); + if (ce.getType() == CatalogEntry.TYPE_LEAF) { //delete catalog entry, then delete owner group SecurityGroup owner = ce.getOwnerGroup(); - DBFactory.getInstance().deleteObject(ce); + dbInstance.getCurrentEntityManager().remove(ce); if (owner != null) { getLogger().debug("deleteCatalogEntry case_1: delete owner-group=" + owner); securityManager.deleteSecurityGroup(owner); } } else { - List secGroupsToBeDeleted = new ArrayList(); + List<SecurityGroup> secGroupsToBeDeleted = new ArrayList<SecurityGroup>(); //FIXME pb: the transaction must also include the deletion of the security // groups. Why not using this method as a recursion and seperating the // deletion of the ce and the groups by collecting the groups? IMHO there @@ -338,13 +316,13 @@ public class CatalogManager extends BasicManager implements UserDataDeletable, I // not a problem, the DB object can handel this. deleteCatalogSubtree(ce,secGroupsToBeDeleted); // after deleting all entries, delete all secGroups corresponding - for (Iterator iter = secGroupsToBeDeleted.iterator(); iter.hasNext();) { + for (Iterator<SecurityGroup> iter = secGroupsToBeDeleted.iterator(); iter.hasNext();) { SecurityGroup grp = (SecurityGroup) iter.next(); - getLogger().debug("deleteCatalogEntry case_2: delete groups of deleteCatalogSubtree grp=" + grp); + if(debug) logDebug("deleteCatalogEntry case_2: delete groups of deleteCatalogSubtree grp=" + grp); securityManager.deleteSecurityGroup(grp); } } - getLogger().debug("deleteCatalogEntry END"); + if(debug) logDebug("deleteCatalogEntry END"); } /** @@ -352,24 +330,19 @@ public class CatalogManager extends BasicManager implements UserDataDeletable, I * * @param ce */ - private void deleteCatalogSubtree(CatalogEntry ce, List secGroupsToBeDeleted) { - DB db = DBFactory.getInstance(); - + private void deleteCatalogSubtree(CatalogEntry ce, List<SecurityGroup> secGroupsToBeDeleted) { List<CatalogEntry> children = getChildrenOf(ce); - Iterator<CatalogEntry> iter = children.iterator(); - while (iter.hasNext()) { - CatalogEntry nextCe = (CatalogEntry) iter.next(); + for (CatalogEntry nextCe:children) { deleteCatalogSubtree(nextCe,secGroupsToBeDeleted); } - ce = (CatalogEntry) db.loadObject(ce); + ce = dbInstance.getCurrentEntityManager().find(CatalogEntry.class, ce.getKey()); //mark owner group for deletion. SecurityGroup owner = ce.getOwnerGroup(); - if (owner != null) secGroupsToBeDeleted.add(owner); - // delete user bookmarks - OLATResourceable ores = createOLATResouceableFor(ce); - //TODO bookmark BookmarkManager.getInstance().deleteAllBookmarksFor(ores); - // delete catalog entry itself - db.deleteObject(ce); + if (owner != null) { + secGroupsToBeDeleted.add(owner); + } + //TODO delete marks + dbInstance.getCurrentEntityManager().remove(ce); } /** @@ -378,14 +351,14 @@ public class CatalogManager extends BasicManager implements UserDataDeletable, I * @param repoEntry * @return List of catalog entries */ - public List getCatalogEntriesReferencing(RepositoryEntry repoEntry) { + public List<CatalogEntry> getCatalogEntriesReferencing(RepositoryEntry repoEntry) { String sqlQuery = "select cei from " + " org.olat.catalog.CatalogEntryImpl as cei " + " ,org.olat.repository.RepositoryEntry as re " + " where cei.repositoryEntry = re AND re.key= :reKey "; - DBQuery dbQuery = DBFactory.getInstance().createQuery(sqlQuery); - dbQuery.setCacheable(true); - dbQuery.setLong("reKey", repoEntry.getKey().longValue()); - List resSet = dbQuery.list(); - return resSet; + + return dbInstance.getCurrentEntityManager() + .createQuery(sqlQuery, CatalogEntry.class) + .setParameter("reKey", repoEntry.getKey()) + .getResultList(); } /** @@ -394,33 +367,18 @@ public class CatalogManager extends BasicManager implements UserDataDeletable, I * @param repoEntry * @return List of catalog entries */ - public List getCatalogCategoriesFor(RepositoryEntry repoEntry) { + public List<CatalogEntry> getCatalogCategoriesFor(RepositoryEntry repoEntry) { String sqlQuery = "select distinct parent from org.olat.catalog.CatalogEntryImpl as parent " + ", org.olat.catalog.CatalogEntryImpl as cei " + ", org.olat.repository.RepositoryEntry as re " + " where cei.repositoryEntry = re " + " and re.key= :reKey " + " and cei.parent = parent "; - DBQuery dbQuery = DBFactory.getInstance().createQuery(sqlQuery); - dbQuery.setCacheable(true); - dbQuery.setLong("reKey", repoEntry.getKey().longValue()); - List resSet = dbQuery.list(); - return resSet; - } - - /** - * find catalog entries by supplied name - * - * @param name - * @return List of catalog entries - */ - public List getCatalogEntriesByName(String name) { - String sqlQuery = "select cei from org.olat.catalog.CatalogEntryImpl as cei where cei.name = :name"; - DBQuery dbQuery = DBFactory.getInstance().createQuery(sqlQuery); - dbQuery.setString("name",name); - dbQuery.setCacheable(true); - return dbQuery.list(); + return dbInstance.getCurrentEntityManager() + .createQuery(sqlQuery, CatalogEntry.class) + .setParameter("reKey", repoEntry.getKey()) + .getResultList(); } public CatalogEntry getCatalogEntryByKey(Long key) { @@ -429,7 +387,7 @@ public class CatalogManager extends BasicManager implements UserDataDeletable, I .append(" left join fetch cei.repositoryEntry as entry") .append(" where cei.key=:key"); - List<CatalogEntry> entries = DBFactory.getInstance().getCurrentEntityManager() + List<CatalogEntry> entries = dbInstance.getCurrentEntityManager() .createQuery(sb.toString(), CatalogEntry.class) .setParameter("key", key) .getResultList(); @@ -449,14 +407,12 @@ public class CatalogManager extends BasicManager implements UserDataDeletable, I public List<CatalogEntry> getCatalogEntriesOwnedBy(Identity identity) { String sqlQuery = "select cei from org.olat.catalog.CatalogEntryImpl as cei inner join fetch cei.ownerGroup, " + " org.olat.basesecurity.SecurityGroupMembershipImpl as sgmsi" + - " where " + - " cei.ownerGroup = sgmsi.securityGroup and" + - " sgmsi.identity = :identity"; - DBQuery dbQuery = DBFactory.getInstance().createQuery(sqlQuery); - dbQuery.setEntity("identity", identity); - dbQuery.setCacheable(true); - return dbQuery.list(); + " where cei.ownerGroup = sgmsi.securityGroup and sgmsi.identity.key = :identityKey"; + return dbInstance.getCurrentEntityManager() + .createQuery(sqlQuery, CatalogEntry.class) + .setParameter("identityKey", identity.getKey()) + .getResultList(); } public List<Identity> getOwnersOfParentLine(CatalogEntry entry) { @@ -489,10 +445,11 @@ public class CatalogManager extends BasicManager implements UserDataDeletable, I * @param newEntry */ public void addCatalogEntry(CatalogEntry parent, CatalogEntry newEntry) { - getLogger().debug("addCatalogEntry parent=" + parent); + boolean debug = isLogDebugEnabled(); + if(debug) logDebug("addCatalogEntry parent=" + parent); newEntry.setParent(parent); - getLogger().debug("addCatalogEntry newEntry=" + newEntry); - getLogger().debug("addCatalogEntry newEntry.getOwnerGroup()=" + newEntry.getOwnerGroup()); + if(debug) logDebug("addCatalogEntry newEntry=" + newEntry); + if(debug) logDebug("addCatalogEntry newEntry.getOwnerGroup()=" + newEntry.getOwnerGroup()); saveCatalogEntry(newEntry); } @@ -505,29 +462,27 @@ public class CatalogManager extends BasicManager implements UserDataDeletable, I */ public List<CatalogEntry> getRootCatalogEntries() { String sqlQuery = "select cei from org.olat.catalog.CatalogEntryImpl as cei where cei.parent is null"; - DBQuery dbQuery = DBFactory.getInstance().createQuery(sqlQuery); - dbQuery.setCacheable(true); - return dbQuery.list(); + return dbInstance.getCurrentEntityManager() + .createQuery(sqlQuery, CatalogEntry.class) + .getResultList(); } /** * init called on module start-up */ public void init() { - List roots = getRootCatalogEntries(); + List<CatalogEntry> roots = getRootCatalogEntries(); if (roots.isEmpty()) { // not initialized yet - //TODO inject via spring - BaseSecurity secMgr = BaseSecurityManager.getInstance(); /* * copy a snapshot of olatAdmins into catalogAdmins do not put * secMgr.findSecurityGroupByName(Constants.GROUP_ADMIN) directly into a * CatalogEntry!! */ - SecurityGroup olatAdmins = secMgr.findSecurityGroupByName(Constants.GROUP_ADMIN); - List olatAdminIdents = secMgr.getIdentitiesOfSecurityGroup(olatAdmins); - SecurityGroup catalogAdmins = secMgr.createAndPersistSecurityGroup(); + SecurityGroup olatAdmins = securityManager.findSecurityGroupByName(Constants.GROUP_ADMIN); + List<Identity> olatAdminIdents = securityManager.getIdentitiesOfSecurityGroup(olatAdmins); + SecurityGroup catalogAdmins = securityManager.createAndPersistSecurityGroup(); for (int i = 0; i < olatAdminIdents.size(); i++) { - secMgr.addIdentityToSecurityGroup((Identity) olatAdminIdents.get(i), catalogAdmins); + securityManager.addIdentityToSecurityGroup((Identity) olatAdminIdents.get(i), catalogAdmins); } /* * start with something called CATALOGROOT, you can rename it to whatever @@ -535,7 +490,7 @@ public class CatalogManager extends BasicManager implements UserDataDeletable, I */ // parent == null -> no parent -> I am a root node. saveCatEntry(CATALOGROOT, null, CatalogEntry.TYPE_NODE, catalogAdmins, null, null); - DBFactory.getInstance(false).intermediateCommit(); + dbInstance.intermediateCommit(); } } @@ -559,10 +514,9 @@ public class CatalogManager extends BasicManager implements UserDataDeletable, I * return true: success; false: failure */ public boolean moveCatalogEntry(CatalogEntry toBeMovedEntry, CatalogEntry newParentEntry) { - CatalogManager cm = CatalogManager.getInstance(); // reload current item to prevent stale object modification - toBeMovedEntry = cm.loadCatalogEntry(toBeMovedEntry); - newParentEntry = cm.loadCatalogEntry(newParentEntry); + toBeMovedEntry = loadCatalogEntry(toBeMovedEntry); + newParentEntry = loadCatalogEntry(newParentEntry); // check that the new parent is not a leaf if (newParentEntry.getType() == CatalogEntry.TYPE_LEAF) return false; // check that the new parent is not a child of the to be moved entry @@ -576,7 +530,7 @@ public class CatalogManager extends BasicManager implements UserDataDeletable, I } // set new parent and save toBeMovedEntry.setParent(newParentEntry); - cm.updateCatalogEntry(toBeMovedEntry); + updateCatalogEntry(toBeMovedEntry); return true; } @@ -587,11 +541,11 @@ public class CatalogManager extends BasicManager implements UserDataDeletable, I public void resourceableDeleted(RepositoryEntry repositoryEntry) { // if a repository entry gets deleted, the referencing Catalog Entries gets // retired to - getLogger().debug("sourceableDeleted start... repositoryEntry=" + repositoryEntry); - List references = getCatalogEntriesReferencing(repositoryEntry); + if(isLogDebugEnabled()) logDebug("sourceableDeleted start... repositoryEntry=" + repositoryEntry); + List<CatalogEntry> references = getCatalogEntriesReferencing(repositoryEntry); if (references != null && !references.isEmpty()) { for (int i = 0; i < references.size(); i++) { - deleteCatalogEntry((CatalogEntry) references.get(i)); + deleteCatalogEntry(references.get(i)); } } } @@ -604,18 +558,17 @@ public class CatalogManager extends BasicManager implements UserDataDeletable, I */ public void deleteUserData(Identity identity, String newDeletedUserName) { // Remove as owner - List catalogEntries = getCatalogEntriesOwnedBy(identity); - for (Iterator iter = catalogEntries.iterator(); iter.hasNext();) { - CatalogEntry catalogEntry = (CatalogEntry) iter.next(); + List<CatalogEntry> catalogEntries = getCatalogEntriesOwnedBy(identity); + for (CatalogEntry catalogEntry:catalogEntries) { - BaseSecurityManager.getInstance().removeIdentityFromSecurityGroup(identity, catalogEntry.getOwnerGroup()); - if (BaseSecurityManager.getInstance().countIdentitiesOfSecurityGroup(catalogEntry.getOwnerGroup()) == 0 ) { + securityManager.removeIdentityFromSecurityGroup(identity, catalogEntry.getOwnerGroup()); + if (securityManager.countIdentitiesOfSecurityGroup(catalogEntry.getOwnerGroup()) == 0 ) { // This group has no owner anymore => add OLAT-Admin as owner - BaseSecurityManager.getInstance().addIdentityToSecurityGroup(UserDeletionManager.getInstance().getAdminIdentity(), catalogEntry.getOwnerGroup()); - Tracing.logInfo("Delete user-data, add Administrator-identity as owner of catalogEntry=" + catalogEntry.getName(), this.getClass()); + securityManager.addIdentityToSecurityGroup(UserDeletionManager.getInstance().getAdminIdentity(), catalogEntry.getOwnerGroup()); + logInfo("Delete user-data, add Administrator-identity as owner of catalogEntry=" + catalogEntry.getName()); } } - Tracing.logDebug("All owner entries in catalog deleted for identity=" + identity, this.getClass()); + if(isLogDebugEnabled()) logDebug("All owner entries in catalog deleted for identity=" + identity); } /** @@ -646,15 +599,7 @@ public class CatalogManager extends BasicManager implements UserDataDeletable, I */ public OLATResourceable createOLATResouceableFor(final CatalogEntry currentCatalogEntry) { if (currentCatalogEntry == null) return null; - return new OLATResourceable() { - public Long getResourceableId() { - return new Long(currentCatalogEntry.getKey()); - } - - public String getResourceableTypeName() { - return CATALOGENTRY; - } - }; + return new Resourceable(CATALOGENTRY, currentCatalogEntry.getKey()); } /** @@ -662,10 +607,9 @@ public class CatalogManager extends BasicManager implements UserDataDeletable, I * @param re */ public void updateReferencedRepositoryEntry(RepositoryEntry re) { - RepositoryEntry reloaded = RepositoryManager.getInstance().setDescriptionAndName(re, re.getDisplayname(), re.getDescription()); + RepositoryEntry reloaded = repositoryManager.setDescriptionAndName(re, re.getDisplayname(), re.getDescription()); // inform anybody interested about this change MultiUserEvent modifiedEvent = new EntryChangedEvent(reloaded, EntryChangedEvent.MODIFIED_DESCRIPTION); CoordinatorManager.getInstance().getCoordinator().getEventBus().fireEventToListenersOf(modifiedEvent, reloaded); } - } -- GitLab