diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/ContentCache.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/ContentCache.java index a62e850d55d6e2e66e46a9d64eaf40b1cad10297..fb7a40b5b373eadb9b6b2ab3faee3184475af2c0 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/ContentCache.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/ContentCache.java @@ -17,6 +17,8 @@ package ch.systemsx.cisd.openbis.dss.generic.shared.content; import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; @@ -59,42 +61,35 @@ public class ContentCache implements IContentCache { String workspacePath = properties.getProperty(CACHE_WORKSPACE_FOLDER_KEY, "../../data/dss-cache"); - boolean sessionCache = workspacePath == null; File cacheWorkspace = new File(workspacePath); - return new ContentCache(new DssServiceRpcGenericFactory(), cacheWorkspace, sessionCache, + return new ContentCache(new DssServiceRpcGenericFactory(), cacheWorkspace, FileOperations.getInstance(), SystemTimeProvider.SYSTEM_TIME_PROVIDER); } - + private final Map<String, Integer> dataSetLocks = new HashMap<String, Integer>(); - + private final LockManager fileLockManager; - - private final IDssServiceRpcGenericFactory serviceFactory; - private final boolean sessionCache; + private final IDssServiceRpcGenericFactory serviceFactory; private final File workspace; - + private final ITimeProvider timeProvider; - + ContentCache(IDssServiceRpcGenericFactory serviceFactory, File cacheWorkspace, - boolean sessionCache, IFileOperations fileOperations, ITimeProvider timeProvider) + IFileOperations fileOperations, ITimeProvider timeProvider) { this.serviceFactory = serviceFactory; this.workspace = cacheWorkspace; - this.sessionCache = sessionCache; this.timeProvider = timeProvider; - if (sessionCache == false) - { - fileOperations.removeRecursivelyQueueing(new File(cacheWorkspace, DOWNLOADING_FOLDER)); - } + fileOperations.removeRecursivelyQueueing(new File(cacheWorkspace, DOWNLOADING_FOLDER)); fileLockManager = new LockManager(); } @Override public void lockDataSet(String sessionToken, String dataSetCode) { - String dataSetPath = createDataSetPath(sessionToken, CACHE_FOLDER, dataSetCode); + String dataSetPath = createDataSetPath(CACHE_FOLDER, dataSetCode); synchronized (dataSetLocks) { Integer count = dataSetLocks.get(dataSetPath); @@ -110,7 +105,7 @@ public class ContentCache implements IContentCache @Override public void unlockDataSet(String sessionToken, String dataSetCode) { - String dataSetPath = createDataSetPath(sessionToken, CACHE_FOLDER, dataSetCode); + String dataSetPath = createDataSetPath(CACHE_FOLDER, dataSetCode); synchronized (dataSetLocks) { Integer count = dataSetLocks.remove(dataSetPath); @@ -120,11 +115,11 @@ public class ContentCache implements IContentCache } } } - + @Override public boolean isDataSetLocked(String sessionToken, String dataSetCode) { - String dataSetPath = createDataSetPath(sessionToken, CACHE_FOLDER, dataSetCode); + String dataSetPath = createDataSetPath(CACHE_FOLDER, dataSetCode); synchronized (dataSetLocks) { return dataSetLocks.containsKey(dataSetPath); @@ -132,11 +127,9 @@ public class ContentCache implements IContentCache } @Override - public File getFile(String sessionToken, IDatasetLocation dataSetLocation, - DataSetPathInfo path) + public File getFile(String sessionToken, IDatasetLocation dataSetLocation, DataSetPathInfo path) { - String pathInWorkspace = - createPathInWorkspace(sessionToken, CACHE_FOLDER, dataSetLocation, path); + String pathInWorkspace = createPathInWorkspace(CACHE_FOLDER, dataSetLocation, path); fileLockManager.lock(pathInWorkspace); try { @@ -146,7 +139,7 @@ public class ContentCache implements IContentCache downloadFile(sessionToken, dataSetLocation, path); } File dataSetFolder = - new File(workspace, createDataSetPath(sessionToken, CACHE_FOLDER, + new File(workspace, createDataSetPath(CACHE_FOLDER, dataSetLocation.getDataSetCode())); dataSetFolder.setLastModified(timeProvider.getTimeInMilliseconds()); return file; @@ -156,8 +149,21 @@ public class ContentCache implements IContentCache } } - private void downloadFile(String sessionToken, - IDatasetLocation dataSetLocation, DataSetPathInfo path) + @Override + public InputStream getInputStream(String sessionToken, IDatasetLocation dataSetLocation, + DataSetPathInfo path) + { + try + { + return new FileInputStream(getFile(sessionToken, dataSetLocation, path)); + } catch (FileNotFoundException ex) + { + throw CheckedExceptionTunnel.wrapIfNecessary(ex); + } + } + + private void downloadFile(String sessionToken, IDatasetLocation dataSetLocation, + DataSetPathInfo path) { InputStream input = null; try @@ -169,10 +175,8 @@ public class ContentCache implements IContentCache String url = service.getDownloadUrlForFileForDataSet(sessionToken, dataSetCode, relativePath); input = createURL(url).openStream(); - File downloadedFile = - createFileFromInputStream(sessionToken, dataSetLocation, path, input); - String pathInWorkspace = - createPathInWorkspace(sessionToken, CACHE_FOLDER, dataSetLocation, path); + File downloadedFile = createFileFromInputStream(dataSetLocation, path, input); + String pathInWorkspace = createPathInWorkspace(CACHE_FOLDER, dataSetLocation, path); File file = new File(workspace, pathInWorkspace); createFolder(file.getParentFile()); downloadedFile.renameTo(file); @@ -185,23 +189,16 @@ public class ContentCache implements IContentCache } } - private String createPathInWorkspace(String sessionToken, String folder, - IDatasetLocation dataSetLocation, DataSetPathInfo path) + private String createPathInWorkspace(String folder, IDatasetLocation dataSetLocation, + DataSetPathInfo path) { String dataSetCode = dataSetLocation.getDataSetCode(); - return createDataSetPath(sessionToken, folder, dataSetCode + "/" - + path.getRelativePath()); + return createDataSetPath(folder, dataSetCode + "/" + path.getRelativePath()); } - private String createDataSetPath(String sessionToken, String folder, - String dataSetCode) + private String createDataSetPath(String folder, String dataSetCode) { - return createPath(sessionToken, folder + "/" + dataSetCode); - } - - private String createPath(String sessionToken, String relativePath) - { - return (sessionCache ? sessionToken + "/dss-cache/" : "") + relativePath; + return folder + "/" + dataSetCode; } private URL createURL(String url) @@ -219,11 +216,11 @@ public class ContentCache implements IContentCache } } - private File createFileFromInputStream(String sessionToken, - IDatasetLocation dataSetLocation, DataSetPathInfo path, InputStream inputStream) + private File createFileFromInputStream(IDatasetLocation dataSetLocation, DataSetPathInfo path, + InputStream inputStream) { String relativePath = DOWNLOADING_FOLDER + "/" + Thread.currentThread().getId(); - File file = new File(workspace, createPath(sessionToken, relativePath)); + File file = new File(workspace, relativePath); createFolder(file.getParentFile()); OutputStream ostream = null; try @@ -252,15 +249,16 @@ public class ContentCache implements IContentCache } } } - + private static final class LockManager { private static final class LockWithCounter { private Lock lock = new ReentrantLock(); + private int count; } - + private final Map<String, LockWithCounter> locks = new HashMap<String, LockWithCounter>(); void lock(String path) @@ -291,7 +289,7 @@ public class ContentCache implements IContentCache } } } - + } } diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/IContentCache.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/IContentCache.java index 41694ef82cf6bc61edf4e30eaf89f1aa2d60927b..cdf2201ae9f133b9d9e07c5a42d87b69bcec9727 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/IContentCache.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/IContentCache.java @@ -17,6 +17,7 @@ package ch.systemsx.cisd.openbis.dss.generic.shared.content; import java.io.File; +import java.io.InputStream; import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetPathInfo; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IDatasetLocation; @@ -37,4 +38,7 @@ public interface IContentCache public File getFile(String sessionToken, IDatasetLocation dataSetLocation, DataSetPathInfo path); + public InputStream getInputStream(String sessionToken, IDatasetLocation dataSetLocation, + DataSetPathInfo path); + } \ No newline at end of file diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/RemoteHierarchicalContentNode.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/RemoteHierarchicalContentNode.java index 416bf1be83c217b1dcd9749d01f60fbcea732072..50b1acf4710919a1de45820cdadb8ca9e30608d1 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/RemoteHierarchicalContentNode.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/RemoteHierarchicalContentNode.java @@ -17,8 +17,6 @@ package ch.systemsx.cisd.openbis.dss.generic.shared.content; import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.InputStream; import java.util.ArrayList; import java.util.Date; @@ -204,13 +202,6 @@ public class RemoteHierarchicalContentNode implements IHierarchicalContentNode @Override public InputStream getInputStream() throws UnsupportedOperationException, IOExceptionUnchecked { - File f = getFile(); - try - { - return new FileInputStream(f); - } catch (FileNotFoundException ex) - { - throw new IOExceptionUnchecked(ex); - } + return cache.getInputStream(sessionTokenProvider.getSessionToken(), dataSetLocation, path); } } diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/AbstractRemoteHierarchicalContentTestCase.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/AbstractRemoteHierarchicalContentTestCase.java index 25c58e374d5effba615a6aaef25d116c64d9000c..0887cb461391f42f49d82a1e4536756b14ef9e1b 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/AbstractRemoteHierarchicalContentTestCase.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/AbstractRemoteHierarchicalContentTestCase.java @@ -114,20 +114,16 @@ public abstract class AbstractRemoteHierarchicalContentTestCase extends Abstract context.assertIsSatisfied(); } - protected ContentCache createCache(boolean sessionCache) + protected ContentCache createCache() { - if (sessionCache == false) - { - context.checking(new Expectations() + context.checking(new Expectations() + { { - { - one(fileOperations).removeRecursivelyQueueing( - new File(workSpace, ContentCache.DOWNLOADING_FOLDER)); - } - }); - } - return new ContentCache(serviceFactory, workSpace, sessionCache, fileOperations, - timeProvider); + one(fileOperations).removeRecursivelyQueueing( + new File(workSpace, ContentCache.DOWNLOADING_FOLDER)); + } + }); + return new ContentCache(serviceFactory, workSpace, fileOperations, timeProvider); } diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/ContentCacheTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/ContentCacheTest.java index a834e1317cede136ad562775f9110beba2863cf4..56979b248f968c56c0699388aa29f2cd34b88046 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/ContentCacheTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/ContentCacheTest.java @@ -62,7 +62,7 @@ public class ContentCacheTest extends AssertJUnit @Test public void testDataSetLocking() { - ContentCache cache = createCache(false); + ContentCache cache = createCache(); cache.lockDataSet(SESSION_TOKEN, "DS-1"); @@ -84,19 +84,16 @@ public class ContentCacheTest extends AssertJUnit context.assertIsSatisfied(); } - private ContentCache createCache(boolean sessionCache) + private ContentCache createCache() { final File workSpace = new File("."); - if (sessionCache == false) - { - context.checking(new Expectations() + context.checking(new Expectations() + { { - { - one(fileOperations).removeRecursivelyQueueing( - new File(workSpace, ContentCache.DOWNLOADING_FOLDER)); - } - }); - } - return new ContentCache(null, workSpace, sessionCache, fileOperations, timeProvider); + one(fileOperations).removeRecursivelyQueueing( + new File(workSpace, ContentCache.DOWNLOADING_FOLDER)); + } + }); + return new ContentCache(null, workSpace, fileOperations, timeProvider); } } diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/RemoteHierarchicalContentNodeMultiThreadTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/RemoteHierarchicalContentNodeMultiThreadTest.java index 877a72665617da485acb32f2256ae2480e004cef..6068bd1ce32b1da42f423b14636c855844f48310 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/RemoteHierarchicalContentNodeMultiThreadTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/RemoteHierarchicalContentNodeMultiThreadTest.java @@ -18,7 +18,6 @@ package ch.systemsx.cisd.openbis.dss.generic.shared.content; import java.io.File; import java.util.Arrays; -import java.util.List; import org.jmock.Expectations; import org.jmock.internal.NamedSequence; @@ -40,7 +39,7 @@ public class RemoteHierarchicalContentNodeMultiThreadTest extends AbstractRemote @Test public void testGetTwoDifferentFilesInSequence() throws Exception { - ContentCache cache = createCache(true); + ContentCache cache = createCache(); final DataSetPathInfo pathInfo1 = new DataSetPathInfo(); pathInfo1.setRelativePath(remoteFile1.getName()); pathInfo1.setDirectory(false); @@ -69,20 +68,19 @@ public class RemoteHierarchicalContentNodeMultiThreadTest extends AbstractRemote File file1 = node1.getFile(); assertEquals(0, file1.getParentFile().lastModified()); - assertEquals(new File(workSpace, SESSION_TOKEN + "/dss-cache/" + ContentCache.CACHE_FOLDER + assertEquals(new File(workSpace, ContentCache.CACHE_FOLDER + "/" + DATA_SET_CODE + "/" + remoteFile1.getName()).getAbsolutePath(), file1.getAbsolutePath()); assertEquals(FILE1_CONTENT, FileUtilities.loadToString(file1).trim()); assertEquals( "[]", Arrays.asList( - new File(workSpace, SESSION_TOKEN + "/dss-cache/" - + ContentCache.DOWNLOADING_FOLDER).list()).toString()); + new File(workSpace, ContentCache.DOWNLOADING_FOLDER).list()).toString()); File file2 = node2.getFile(); assertEquals(60000, file2.getParentFile().lastModified()); - assertEquals(new File(workSpace, SESSION_TOKEN + "/dss-cache/" + ContentCache.CACHE_FOLDER + assertEquals(new File(workSpace, ContentCache.CACHE_FOLDER + "/" + DATA_SET_CODE + "/" + remoteFile2.getName()).getAbsolutePath(), file2.getAbsolutePath()); assertEquals(FILE2_CONTENT, FileUtilities.loadToString(file2).trim()); @@ -92,7 +90,7 @@ public class RemoteHierarchicalContentNodeMultiThreadTest extends AbstractRemote @Test public void testGetSameFileInSequenceFirstTryFailing() throws Exception { - ContentCache cache = createCache(false); + ContentCache cache = createCache(); final DataSetPathInfo pathInfo = new DataSetPathInfo(); pathInfo.setRelativePath(remoteFile1.getName()); pathInfo.setDirectory(false); @@ -132,7 +130,7 @@ public class RemoteHierarchicalContentNodeMultiThreadTest extends AbstractRemote @Test public void testGetTwoDifferentFilesInTwoThreads() throws Exception { - ContentCache cache = createCache(false); + ContentCache cache = createCache(); final DataSetPathInfo pathInfo1 = new DataSetPathInfo(); pathInfo1.setRelativePath(remoteFile1.getName()); pathInfo1.setDirectory(false); @@ -211,7 +209,7 @@ public class RemoteHierarchicalContentNodeMultiThreadTest extends AbstractRemote @Test public void testGetSameFileInTwoThreads() throws Exception { - ContentCache cache = createCache(false); + ContentCache cache = createCache(); final DataSetPathInfo pathInfo = new DataSetPathInfo(); pathInfo.setRelativePath(remoteFile1.getName()); pathInfo.setDirectory(false); @@ -275,7 +273,7 @@ public class RemoteHierarchicalContentNodeMultiThreadTest extends AbstractRemote @Test public void testGetSameFileInThreeThreads() throws Exception { - ContentCache cache = createCache(false); + ContentCache cache = createCache(); final DataSetPathInfo pathInfo = new DataSetPathInfo(); pathInfo.setRelativePath(remoteFile1.getName()); pathInfo.setDirectory(false); @@ -356,7 +354,7 @@ public class RemoteHierarchicalContentNodeMultiThreadTest extends AbstractRemote @Test public void testGetSameFileInTwoThreadsFirstDownloadFails() throws Exception { - ContentCache cache = createCache(false); + ContentCache cache = createCache(); final DataSetPathInfo pathInfo = new DataSetPathInfo(); pathInfo.setRelativePath(remoteFile1.getName()); pathInfo.setDirectory(false); diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/RemoteHierarchicalContentNodeTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/RemoteHierarchicalContentNodeTest.java index 6966941a21200e6289d02b59af6634be4a03d179..b0fbf9061e5aae2857e480e683f8fd89be1c2ac9 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/RemoteHierarchicalContentNodeTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/RemoteHierarchicalContentNodeTest.java @@ -114,8 +114,7 @@ public class RemoteHierarchicalContentNodeTest } }); cache = - new ContentCache(serviceFactory, SESSION_WORKSPACE_DIR, false, fileOperations, - SYSTEM_TIME_PROVIDER); + new ContentCache(serviceFactory, SESSION_WORKSPACE_DIR, fileOperations, SYSTEM_TIME_PROVIDER); } @Test diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/RemoteHierarchicalContentTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/RemoteHierarchicalContentTest.java index 8d29d9ed06b7d1e239aadd5062b3caee6aaf57a8..efe79b38b510ba2b22dee1112c2e0ba52b725cd6 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/RemoteHierarchicalContentTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/RemoteHierarchicalContentTest.java @@ -35,7 +35,7 @@ public class RemoteHierarchicalContentTest extends AbstractRemoteHierarchicalCon @Test public void testLockingUnlockingDataSet() { - ContentCache cache = createCache(false); + ContentCache cache = createCache(); RemoteHierarchicalContent content = createContent(cache); assertEquals(true, cache.isDataSetLocked(SESSION_TOKEN, DATA_SET_CODE)); @@ -49,7 +49,7 @@ public class RemoteHierarchicalContentTest extends AbstractRemoteHierarchicalCon @Test public void testGetDefaultRootNode() throws Exception { - ContentCache cache = createCache(false); + ContentCache cache = createCache(); RemoteHierarchicalContent content = createContent(cache); context.checking(new Expectations() @@ -71,7 +71,7 @@ public class RemoteHierarchicalContentTest extends AbstractRemoteHierarchicalCon @Test public void testGetRootNode() throws Exception { - ContentCache cache = createCache(false); + ContentCache cache = createCache(); RemoteHierarchicalContent content = createContent(cache); context.checking(new Expectations()