From 04c69d3d251b8dc2ab8bb74263a1f566e4bf6d7f Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Thu, 24 Dec 2015 10:40:53 +0100
Subject: [PATCH] OO-1712: get the share folder by olat resource which can be
 cached by hibernate

---
 .../olat/course/MergedCourseContainer.java    | 19 ++++++-----
 .../olat/repository/RepositoryService.java    | 12 +++++++
 .../manager/RepositoryEntryDAO.java           | 32 +++++++++++++++++++
 .../manager/RepositoryServiceImpl.java        | 10 ++++++
 .../manager/RepositoryEntryDAOTest.java       | 27 ++++++++++++++++
 5 files changed, 92 insertions(+), 8 deletions(-)

diff --git a/src/main/java/org/olat/course/MergedCourseContainer.java b/src/main/java/org/olat/course/MergedCourseContainer.java
index 339658e18a5..d51771e3cad 100644
--- a/src/main/java/org/olat/course/MergedCourseContainer.java
+++ b/src/main/java/org/olat/course/MergedCourseContainer.java
@@ -19,6 +19,7 @@
  */
 package org.olat.course;
 
+import org.olat.core.CoreSpringFactory;
 import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl;
 import org.olat.core.commons.services.webdav.servlets.RequestUtil;
 import org.olat.core.gui.components.tree.GenericTreeModel;
@@ -45,7 +46,9 @@ import org.olat.course.run.userview.VisibleTreeFilter;
 import org.olat.modules.sharedfolder.SharedFolderManager;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryManager;
+import org.olat.repository.RepositoryService;
 import org.olat.repository.model.RepositoryEntrySecurity;
+import org.olat.resource.OLATResource;
 
 /**
  *
@@ -88,10 +91,10 @@ public class MergedCourseContainer extends MergeSource {
 			OlatRootFolderImpl sharedFolder = null;
 			String sfSoftkey = persistingCourse.getCourseConfig().getSharedFolderSoftkey();
 			if (StringHelper.containsNonWhitespace(sfSoftkey) && !CourseConfig.VALUE_EMPTY_SHAREDFOLDER_SOFTKEY.equals(sfSoftkey)) {
-				RepositoryManager rm = RepositoryManager.getInstance();
-				RepositoryEntry re = rm.lookupRepositoryEntryBySoftkey(sfSoftkey, false);
-				if (re != null) {
-					sharedFolder = SharedFolderManager.getInstance().getSharedFolder(re.getOlatResource());
+				OLATResource sharedResource = CoreSpringFactory.getImpl(RepositoryService.class)
+						.loadRepositoryEntryResourceBySoftKey(sfSoftkey);
+				if (sharedResource != null) {
+					sharedFolder = SharedFolderManager.getInstance().getSharedFolder(sharedResource);
 					if (sharedFolder != null) {
 						sharedFolder.setLocalSecurityCallback(new ReadOnlyCallback());
 						//add local course folder's children as read/write source and any sharedfolder as subfolder
@@ -150,10 +153,10 @@ public class MergedCourseContainer extends MergeSource {
 							OlatRootFolderImpl sharedFolder = null;
 							String sfSoftkey = course.getCourseConfig().getSharedFolderSoftkey();
 							if (StringHelper.containsNonWhitespace(sfSoftkey) && !CourseConfig.VALUE_EMPTY_SHAREDFOLDER_SOFTKEY.equals(sfSoftkey)) {
-								RepositoryManager rm = RepositoryManager.getInstance();
-								RepositoryEntry re = rm.lookupRepositoryEntryBySoftkey(sfSoftkey, false);
-								if (re != null) {
-									sharedFolder = SharedFolderManager.getInstance().getSharedFolder(re.getOlatResource());
+								OLATResource sharedResource = CoreSpringFactory.getImpl(RepositoryService.class)
+										.loadRepositoryEntryResourceBySoftKey(sfSoftkey);
+								if (sharedResource != null) {
+									sharedFolder = SharedFolderManager.getInstance().getSharedFolder(sharedResource);
 									VFSContainer courseBase = sharedFolder;
 									sharedFolder.setLocalSecurityCallback(new ReadOnlyCallback());
 									subpath = subpath.replaceFirst("/_sharedfolder", "");
diff --git a/src/main/java/org/olat/repository/RepositoryService.java b/src/main/java/org/olat/repository/RepositoryService.java
index b4d860a88c8..0dcef2af6cc 100644
--- a/src/main/java/org/olat/repository/RepositoryService.java
+++ b/src/main/java/org/olat/repository/RepositoryService.java
@@ -61,6 +61,18 @@ public interface RepositoryService {
 	
 	public List<RepositoryEntry> loadByResourceKeys(Collection<Long> keys);
 	
+	/**
+	 * @param repositoryEntryKey The key of the repository entry
+	 * @return The olat resource of the repository entry
+	 */
+	public OLATResource loadRepositoryEntryResource(Long repositoryEntryKey);
+	
+	/**
+	 * @param softkey The soft key of the repository entry
+	 * @return The olat resource of the repository entry
+	 */
+	public OLATResource loadRepositoryEntryResourceBySoftKey(String softkey);
+	
 	public VFSLeaf getIntroductionImage(RepositoryEntry re);
 
 	public VFSLeaf getIntroductionMovie(RepositoryEntry re);
diff --git a/src/main/java/org/olat/repository/manager/RepositoryEntryDAO.java b/src/main/java/org/olat/repository/manager/RepositoryEntryDAO.java
index 0d6ac5051e4..628025bdbc9 100644
--- a/src/main/java/org/olat/repository/manager/RepositoryEntryDAO.java
+++ b/src/main/java/org/olat/repository/manager/RepositoryEntryDAO.java
@@ -28,6 +28,7 @@ import javax.persistence.TypedQuery;
 import org.olat.core.commons.persistence.DB;
 import org.olat.core.util.StringHelper;
 import org.olat.repository.RepositoryEntry;
+import org.olat.resource.OLATResource;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -123,4 +124,35 @@ public class RepositoryEntryDAO {
 				.setMaxResults(maxResults)
 				.getResultList();
 	}
+	
+	public OLATResource loadRepositoryEntryResource(Long key) {
+		if (key == null) return null;
+		String query = "select v.olatResource from repositoryentry as v  where v.key=:repoKey";
+		
+		List<OLATResource> entries = dbInstance.getCurrentEntityManager()
+				.createQuery(query, OLATResource.class)
+				.setParameter("repoKey", key)
+				.setHint("org.hibernate.cacheable", Boolean.TRUE)
+				.getResultList();
+		if(entries.isEmpty()) {
+			return null;
+		}
+		return entries.get(0);
+	}
+	
+	public OLATResource loadRepositoryEntryResourceBySoftKey(String softkey) {
+		if(softkey == null || "sf.notconfigured".equals(softkey)) {
+			return null;
+		}
+		String query = "select v.olatResource from repositoryentry as v where v.softkey=:softkey";
+		List<OLATResource> entries = dbInstance.getCurrentEntityManager()
+				.createQuery(query, OLATResource.class)
+				.setParameter("softkey", softkey)
+				.setHint("org.hibernate.cacheable", Boolean.TRUE)
+				.getResultList();
+		if(entries.isEmpty()) {
+			return null;
+		}
+		return entries.get(0);
+	}
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java b/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java
index bab6ba07495..dd4b429865c 100644
--- a/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java
+++ b/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java
@@ -264,6 +264,16 @@ public class RepositoryServiceImpl implements RepositoryService {
 		return repositoryEntryDAO.loadByResourceKeys(resourceKeys);
 	}
 
+	@Override
+	public OLATResource loadRepositoryEntryResource(Long repositoryEntryKey) {
+		return repositoryEntryDAO.loadRepositoryEntryResource(repositoryEntryKey);
+	}
+
+	@Override
+	public OLATResource loadRepositoryEntryResourceBySoftKey(String softkey) {
+		return repositoryEntryDAO.loadRepositoryEntryResourceBySoftKey(softkey);
+	}
+
 	@Override
 	public VFSLeaf getIntroductionImage(RepositoryEntry re) {
 		VFSContainer repositoryHome = new LocalFolderImpl(new File(FolderConfig.getCanonicalRepositoryHome()));
diff --git a/src/test/java/org/olat/repository/manager/RepositoryEntryDAOTest.java b/src/test/java/org/olat/repository/manager/RepositoryEntryDAOTest.java
index f37d3a072c3..6a63de0e140 100644
--- a/src/test/java/org/olat/repository/manager/RepositoryEntryDAOTest.java
+++ b/src/test/java/org/olat/repository/manager/RepositoryEntryDAOTest.java
@@ -30,6 +30,7 @@ import org.olat.core.commons.persistence.DB;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryManager;
 import org.olat.repository.RepositoryService;
+import org.olat.resource.OLATResource;
 import org.olat.test.OlatTestCase;
 import org.springframework.beans.factory.annotation.Autowired;
 
@@ -154,4 +155,30 @@ public class RepositoryEntryDAOTest extends OlatTestCase {
 		Assert.assertFalse(allRes.isEmpty());
 		Assert.assertTrue(allRes.size() < 26);
 	}
+	
+	@Test
+	public void loadRepositoryEntryResource() {
+		RepositoryEntry re = repositoryService.create("Rei Ayanami", "-", "Repository entry DAO Test 5", "", null);
+		dbInstance.commitAndCloseSession();
+		Assert.assertNotNull(re);
+		Assert.assertNotNull(re.getSoftkey());
+		Assert.assertNotNull(re.getOlatResource());
+		
+		OLATResource loadedResource = repositoryEntryDao.loadRepositoryEntryResource(re.getKey());
+		Assert.assertNotNull(loadedResource);
+		Assert.assertEquals(re.getOlatResource(), loadedResource);
+	}
+	
+	@Test
+	public void loadRepositoryEntryResourceBySoftKey() {
+		RepositoryEntry re = repositoryService.create("Rei Ayanami", "-", "Repository entry DAO Test 5", "", null);
+		dbInstance.commitAndCloseSession();
+		Assert.assertNotNull(re);
+		Assert.assertNotNull(re.getSoftkey());
+		Assert.assertNotNull(re.getOlatResource());
+		
+		OLATResource loadedResource = repositoryEntryDao.loadRepositoryEntryResourceBySoftKey(re.getSoftkey());
+		Assert.assertNotNull(loadedResource);
+		Assert.assertEquals(re.getOlatResource(), loadedResource);
+	}
 }
\ No newline at end of file
-- 
GitLab