Skip to content
Snippets Groups Projects
Commit 9dbd5d15 authored by felmer's avatar felmer
Browse files

SP-439 BIS-255: Refactoring for making cache global

SVN: 28050
parent 644d4bbe
No related branches found
No related tags found
No related merge requests found
Showing with 265 additions and 107 deletions
......@@ -19,13 +19,12 @@ package ch.systemsx.cisd.openbis.dss.generic.shared;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import org.apache.log4j.Logger;
import ch.rinn.restrictions.Private;
import ch.systemsx.cisd.common.action.IDelegatedAction;
import ch.systemsx.cisd.common.filesystem.FileOperations;
import ch.systemsx.cisd.common.filesystem.IFileOperations;
import ch.systemsx.cisd.common.logging.LogCategory;
import ch.systemsx.cisd.common.logging.LogFactory;
import ch.systemsx.cisd.common.server.ISessionTokenProvider;
......@@ -34,7 +33,6 @@ import ch.systemsx.cisd.common.ssl.SslCertificateHelper;
import ch.systemsx.cisd.openbis.common.io.hierarchical_content.IHierarchicalContentFactory;
import ch.systemsx.cisd.openbis.common.io.hierarchical_content.api.IHierarchicalContent;
import ch.systemsx.cisd.openbis.dss.generic.shared.content.ContentCache;
import ch.systemsx.cisd.openbis.dss.generic.shared.content.DssServiceRpcGenericFactory;
import ch.systemsx.cisd.openbis.dss.generic.shared.content.PathInfoDBAwareHierarchicalContentFactory;
import ch.systemsx.cisd.openbis.dss.generic.shared.content.RemoteHierarchicalContent;
import ch.systemsx.cisd.openbis.dss.generic.shared.utils.PathInfoDataSourceProvider;
......@@ -105,13 +103,13 @@ public class HierarchicalContentProvider implements IHierarchicalContentProvider
this.dataStoreCode = dataStoreCode;
if (infoProvider != null)
{
String trust = infoProvider.getResolvedProps().getProperty("trust-all-certificates");
Properties properties = infoProvider.getResolvedProps();
String trust = properties.getProperty("trust-all-certificates");
trustAllCertificates = (trust != null && trust.equalsIgnoreCase("true"));
String sessionWorkspaceRoot =
infoProvider.getResolvedProps().getProperty("session-workspace-root-dir",
"data/sessionWorkspace");
cacheWorkspace =
new File(new File(sessionWorkspaceRoot), "dss-cache");
cacheWorkspace = new File(sessionWorkspaceRoot);
if (cacheWorkspace.exists() == false)
{
cacheWorkspace.mkdirs();
......@@ -120,10 +118,7 @@ public class HierarchicalContentProvider implements IHierarchicalContentProvider
{
trustAllCertificates = false;
}
IFileOperations fileOperations = FileOperations.getInstance();
cache =
new ContentCache(new DssServiceRpcGenericFactory(), sessionTokenProvider,
cacheWorkspace, fileOperations);
cache = new ContentCache(cacheWorkspace, true);
}
@Override
......
......@@ -25,98 +25,121 @@ import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel;
import ch.systemsx.cisd.common.exceptions.ConfigurationFailureException;
import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException;
import ch.systemsx.cisd.common.filesystem.FileOperations;
import ch.systemsx.cisd.common.filesystem.IFileOperations;
import ch.systemsx.cisd.common.server.ISessionTokenProvider;
import ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.IDssServiceRpcGeneric;
import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetPathInfo;
import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IDatasetLocation;
/**
* Cache for files remotely retrieved from a DSS.
* Cache for files remotely retrieved from Data Store Servers.
*
* @author Franz-Josef Elmer
*/
public class ContentCache
{
static final String CHACHED_FOLDER = "cached";
static final String CACHE_FOLDER = "cached";
static final String DOWNLOADING_FOLDER = "downloading";
private final ISessionTokenProvider sessionTokenProvider;
private final File cachedFiles;
private final File downloadingFolder;
private final LockManager dataSetLockManager;
private final LockManager fileLockManager;
private final IDssServiceRpcGenericFactory serviceFactory;
private Map<String, Lock> locks;
private final boolean sessionCache;
private final IDssServiceRpcGenericFactory serviceFactory;
private final File workspace;
public ContentCache(File cacheWorkspace, boolean sessionCache)
{
this(new DssServiceRpcGenericFactory(), cacheWorkspace, sessionCache, FileOperations.getInstance());
}
public ContentCache(IDssServiceRpcGenericFactory serviceFactory,
ISessionTokenProvider sessionTokenProvider, File cacheWorkSpace,
IFileOperations fileOperations)
ContentCache(IDssServiceRpcGenericFactory serviceFactory, File cacheWorkspace,
boolean sessionCache, IFileOperations fileOperations)
{
this.serviceFactory = serviceFactory;
this.sessionTokenProvider = sessionTokenProvider;
cachedFiles = new File(cacheWorkSpace, CHACHED_FOLDER);
creatFolder(cachedFiles);
downloadingFolder = new File(cacheWorkSpace, DOWNLOADING_FOLDER);
fileOperations.removeRecursivelyQueueing(downloadingFolder);
creatFolder(downloadingFolder);
locks = new HashMap<String, Lock>();
this.workspace = cacheWorkspace;
this.sessionCache = sessionCache;
if (sessionCache == false)
{
fileOperations.removeRecursivelyQueueing(new File(cacheWorkspace, DOWNLOADING_FOLDER));
}
dataSetLockManager = new LockManager();
fileLockManager = new LockManager();
}
IDssServiceRpcGeneric getDssService(IDatasetLocation dataSetLocation)
{
return serviceFactory.getService(dataSetLocation.getDataStoreUrl());
}
public void unlockFilesFor(String dataSetCode)
public void lockDataSet(String sessionToken, String dataSetCode)
{
String dataSetPath = createDataSetPath(sessionToken, CACHE_FOLDER, dataSetCode);
dataSetLockManager.lock(dataSetPath);
}
File getFile(IDatasetLocation dataSetLocation, DataSetPathInfo path)
public void unlockDataSet(String sessionToken, String dataSetCode)
{
String dataSetCode = dataSetLocation.getDataSetCode();
String pathInCache = dataSetCode + "/" + path.getRelativePath();
lock(pathInCache);
String dataSetPath = createDataSetPath(sessionToken, CACHE_FOLDER, dataSetCode);
dataSetLockManager.unlock(dataSetPath);
}
public boolean isDataSetLocked(String sessionToken, String dataSetCode)
{
String dataSetPath = createDataSetPath(sessionToken, CACHE_FOLDER, dataSetCode);
return dataSetLockManager.isLocked(dataSetPath);
}
File getFile(String sessionToken, IDatasetLocation dataSetLocation,
DataSetPathInfo path)
{
String pathInWorkspace =
createPathInWorkspace(sessionToken, CACHE_FOLDER, dataSetLocation, path);
fileLockManager.lock(pathInWorkspace);
try
{
File file = new File(cachedFiles, pathInCache);
File file = new File(workspace, pathInWorkspace);
if (file.exists() == false)
{
downloadFile(dataSetLocation, path, pathInCache);
downloadFile(sessionToken, dataSetLocation, path);
}
return file;
} finally
{
unlock(pathInCache);
fileLockManager.unlock(pathInWorkspace);
}
}
private void downloadFile(IDatasetLocation dataSetLocation, DataSetPathInfo path, String pathInCache)
private void downloadFile(String sessionToken,
IDatasetLocation dataSetLocation, DataSetPathInfo path)
{
InputStream input = null;
try
{
String dataStoreUrl = dataSetLocation.getDataStoreUrl();
IDssServiceRpcGeneric service = serviceFactory.getService(dataStoreUrl);
String dataSetCode = dataSetLocation.getDataSetCode();
String relativePath = path.getRelativePath();
String url =
serviceFactory.getService(dataSetLocation.getDataStoreUrl())
.getDownloadUrlForFileForDataSet(
sessionTokenProvider.getSessionToken(),
dataSetLocation.getDataSetCode(), path.getRelativePath());
service.getDownloadUrlForFileForDataSet(sessionToken, dataSetCode, relativePath);
input = createURL(url).openStream();
File downloadedFile = createFileFromInputStream(pathInCache, input);
File file = new File(cachedFiles, pathInCache);
creatFolder(file.getParentFile());
File downloadedFile =
createFileFromInputStream(sessionToken, dataSetLocation, path, input);
String pathInWorkspace =
createPathInWorkspace(sessionToken, CACHE_FOLDER, dataSetLocation, path);
File file = new File(workspace, pathInWorkspace);
createFolder(file.getParentFile());
downloadedFile.renameTo(file);
} catch (Exception ex)
{
......@@ -126,7 +149,21 @@ public class ContentCache
IOUtils.closeQuietly(input);
}
}
private String createPathInWorkspace(String sessionToken, String folder,
IDatasetLocation dataSetLocation, DataSetPathInfo path)
{
String dataSetCode = dataSetLocation.getDataSetCode();
return createDataSetPath(sessionToken, folder, dataSetCode) + "/"
+ path.getRelativePath();
}
private String createDataSetPath(String sessionToken, String folder,
String dataSetCode)
{
return (sessionCache ? sessionToken + "/dss-cache/" : "") + folder + "/" + dataSetCode;
}
private URL createURL(String url)
{
try
......@@ -142,13 +179,13 @@ public class ContentCache
}
}
private File createFileFromInputStream(String filePath, InputStream inputStream)
private File createFileFromInputStream(String sessionToken,
IDatasetLocation dataSetLocation, DataSetPathInfo path, InputStream inputStream)
{
final String subDir = FilenameUtils.getFullPath(filePath);
final String filename = FilenameUtils.getName(filePath);
final File dir = new File(downloadingFolder, subDir);
dir.mkdirs();
final File file = new File(dir, filename);
File file =
new File(workspace, createPathInWorkspace(sessionToken, DOWNLOADING_FOLDER,
dataSetLocation, path));
createFolder(file.getParentFile());
OutputStream ostream = null;
try
{
......@@ -164,8 +201,8 @@ public class ContentCache
IOUtils.closeQuietly(ostream);
}
}
private void creatFolder(File folder)
private void createFolder(File folder)
{
if (folder.exists() == false)
{
......@@ -177,35 +214,45 @@ public class ContentCache
}
}
private void lock(String pathInCache)
{
getLock(pathInCache).lock();
}
private Lock getLock(String pathInCache)
private static final class LockManager
{
synchronized (locks)
private final Map<String, ReentrantLock> locks = new HashMap<String, ReentrantLock>();
void lock(String path)
{
Lock lock = locks.get(pathInCache);
if (lock == null)
ReentrantLock lock;
synchronized (locks)
{
lock = new ReentrantLock();
locks.put(pathInCache, lock);
lock = locks.get(path);
if (lock == null)
{
lock = new ReentrantLock();
locks.put(path, lock);
}
}
return lock;
lock.lock();
}
}
private void unlock(String pathInCache)
{
synchronized (locks)
synchronized void unlock(String path)
{
Lock lock = locks.remove(pathInCache);
ReentrantLock lock = locks.get(path);
if (lock != null)
{
lock.unlock();
if (lock.isLocked() == false)
{
locks.remove(path);
}
}
}
synchronized boolean isLocked(String path)
{
ReentrantLock lock = locks.get(path);
return lock != null && lock.isLocked();
}
}
}
......@@ -50,7 +50,7 @@ public class RemoteHierarchicalContent implements IHierarchicalContent
this.provider = pathInfoProvider;
this.sessionTokenProvider = sessionTokenProvider;
this.cache = cache;
cache.lockDataSet(sessionTokenProvider.getSessionToken(), location.getLocation().getDataSetCode());
}
@Override
......@@ -140,7 +140,7 @@ public class RemoteHierarchicalContent implements IHierarchicalContent
@Override
public void close()
{
cache.unlockFilesFor(location.getLocation().getDataSetCode());
cache.unlockDataSet(sessionTokenProvider.getSessionToken(), location.getLocation().getDataSetCode());
}
private IHierarchicalContentNode createNode(DataSetPathInfo info)
......
......@@ -176,7 +176,7 @@ public class RemoteHierarchicalContentNode implements IHierarchicalContentNode
@Override
public File getFile() throws UnsupportedOperationException
{
return cache.getFile(dataSetLocation, path);
return cache.getFile(sessionTokenProvider.getSessionToken(), dataSetLocation, path);
}
@Override
......
/*
* Copyright 2013 ETH Zuerich, CISD
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package ch.systemsx.cisd.openbis.dss.generic.shared.content;
import java.io.File;
import org.jmock.Expectations;
import org.jmock.Mockery;
import org.testng.AssertJUnit;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import ch.systemsx.cisd.common.filesystem.IFileOperations;
/**
*
*
* @author Franz-Josef Elmer
*/
public class ContentCacheTest extends AssertJUnit
{
private static final String SESSION_TOKEN = "session";
private Mockery context;
private IFileOperations fileOperations;
@BeforeMethod
public void setUp()
{
context = new Mockery();
fileOperations = context.mock(IFileOperations.class);
}
@AfterMethod
public void tearDown()
{
// To following line of code should also be called at the end of each test method.
// Otherwise one do not known which test failed.
context.assertIsSatisfied();
}
@Test
public void testDataSetLocking()
{
ContentCache cache = createCache(false);
cache.lockDataSet(SESSION_TOKEN, "DS-1");
assertEquals(true, cache.isDataSetLocked(SESSION_TOKEN, "DS-1"));
assertEquals(false, cache.isDataSetLocked(SESSION_TOKEN, "DS-2"));
cache.lockDataSet(SESSION_TOKEN, "DS-1");
assertEquals(true, cache.isDataSetLocked(SESSION_TOKEN, "DS-1"));
cache.unlockDataSet(SESSION_TOKEN, "DS-1");
assertEquals(true, cache.isDataSetLocked(SESSION_TOKEN, "DS-1"));
cache.unlockDataSet(SESSION_TOKEN, "DS-1");
assertEquals(false, cache.isDataSetLocked(SESSION_TOKEN, "DS-1"));
context.assertIsSatisfied();
}
private ContentCache createCache(boolean sessionCache)
{
final File workSpace = new File(".");
if (sessionCache == false)
{
context.checking(new Expectations()
{
{
one(fileOperations).removeRecursivelyQueueing(
new File(workSpace, ContentCache.DOWNLOADING_FOLDER));
}
});
}
return new ContentCache(null, workSpace, sessionCache, fileOperations);
}
}
......@@ -74,14 +74,14 @@ public class RemoteHierarchicalContentNodeMultiThreadTest extends AbstractFileSy
private OpenBISSessionHolder sessionHolder;
private ContentCache cache;
private File workSpace;
private File remoteFile1;
private File remoteFile2;
private IDssServiceRpcGenericFactory serviceFactory;
@BeforeMethod
public void setUpFixture()
{
......@@ -99,20 +99,16 @@ public class RemoteHierarchicalContentNodeMultiThreadTest extends AbstractFileSy
remoteFile2 = new File(remoteDataSetFolder, "file2.txt");
FileUtilities.writeToFile(remoteFile2, FILE2_CONTENT);
workSpace = new File(workingDirectory, "workspace");
final IDssServiceRpcGenericFactory serviceFactory = context.mock(IDssServiceRpcGenericFactory.class);
serviceFactory = context.mock(IDssServiceRpcGenericFactory.class);
context.checking(new Expectations()
{
{
one(fileOperations).removeRecursivelyQueueing(
new File(workSpace, ContentCache.DOWNLOADING_FOLDER));
allowing(serviceFactory).getService(DATA_STORE_URL);
will(returnValue(remoteDss));
}
});
cache = new ContentCache(serviceFactory, sessionHolder, workSpace, fileOperations);
}
@AfterMethod
public void tearDown()
{
......@@ -124,10 +120,11 @@ public class RemoteHierarchicalContentNodeMultiThreadTest extends AbstractFileSy
@Test
public void testGetTwoDifferentFilesInSequence() throws Exception
{
ContentCache cache = createCache(true);
final DataSetPathInfo pathInfo1 = new DataSetPathInfo();
pathInfo1.setRelativePath(remoteFile1.getName());
pathInfo1.setDirectory(false);
IHierarchicalContentNode node1 = createRemoteNode(pathInfo1);
IHierarchicalContentNode node1 = createRemoteNode(pathInfo1, cache);
context.checking(new Expectations()
{
{
......@@ -139,7 +136,7 @@ public class RemoteHierarchicalContentNodeMultiThreadTest extends AbstractFileSy
final DataSetPathInfo pathInfo2 = new DataSetPathInfo();
pathInfo2.setRelativePath(remoteFile2.getName());
pathInfo2.setDirectory(false);
IHierarchicalContentNode node2 = createRemoteNode(pathInfo2);
IHierarchicalContentNode node2 = createRemoteNode(pathInfo2, cache);
context.checking(new Expectations()
{
{
......@@ -152,11 +149,13 @@ public class RemoteHierarchicalContentNodeMultiThreadTest extends AbstractFileSy
File file1 = node1.getFile();
File file2 = node2.getFile();
assertEquals(new File(workSpace, ContentCache.CHACHED_FOLDER + "/" + DATA_SET_CODE + "/"
+ remoteFile1.getName()).getAbsolutePath(), file1.getAbsolutePath());
assertEquals(new File(workSpace, SESSION_TOKEN + "/dss-cache/" + ContentCache.CACHE_FOLDER
+ "/" + DATA_SET_CODE + "/" + remoteFile1.getName()).getAbsolutePath(),
file1.getAbsolutePath());
assertEquals(FILE1_CONTENT, FileUtilities.loadToString(file1).trim());
assertEquals(new File(workSpace, ContentCache.CHACHED_FOLDER + "/" + DATA_SET_CODE + "/"
+ remoteFile2.getName()).getAbsolutePath(), file2.getAbsolutePath());
assertEquals(new File(workSpace, SESSION_TOKEN + "/dss-cache/" + ContentCache.CACHE_FOLDER
+ "/" + DATA_SET_CODE + "/" + remoteFile2.getName()).getAbsolutePath(),
file2.getAbsolutePath());
assertEquals(FILE2_CONTENT, FileUtilities.loadToString(file2).trim());
context.assertIsSatisfied();
}
......@@ -164,10 +163,11 @@ public class RemoteHierarchicalContentNodeMultiThreadTest extends AbstractFileSy
@Test
public void testGetSameFileInSequenceFirstTryFailing() throws Exception
{
ContentCache cache = createCache(false);
final DataSetPathInfo pathInfo = new DataSetPathInfo();
pathInfo.setRelativePath(remoteFile1.getName());
pathInfo.setDirectory(false);
IHierarchicalContentNode node = createRemoteNode(pathInfo);
IHierarchicalContentNode node = createRemoteNode(pathInfo, cache);
context.checking(new Expectations()
{
{
......@@ -194,7 +194,7 @@ public class RemoteHierarchicalContentNodeMultiThreadTest extends AbstractFileSy
}
File file = node.getFile();
assertEquals(new File(workSpace, ContentCache.CHACHED_FOLDER + "/" + DATA_SET_CODE + "/"
assertEquals(new File(workSpace, ContentCache.CACHE_FOLDER + "/" + DATA_SET_CODE + "/"
+ remoteFile1.getName()).getAbsolutePath(), file.getAbsolutePath());
assertEquals(FILE1_CONTENT, FileUtilities.loadToString(file).trim());
context.assertIsSatisfied();
......@@ -203,10 +203,11 @@ public class RemoteHierarchicalContentNodeMultiThreadTest extends AbstractFileSy
@Test
public void testGetTwoDifferentFilesInTwoThreads() throws Exception
{
ContentCache cache = createCache(false);
final DataSetPathInfo pathInfo1 = new DataSetPathInfo();
pathInfo1.setRelativePath(remoteFile1.getName());
pathInfo1.setDirectory(false);
IHierarchicalContentNode node1 = createRemoteNode(pathInfo1);
IHierarchicalContentNode node1 = createRemoteNode(pathInfo1, cache);
final MessageChannel channel1 = new MessageChannel(10000);
GetFileRunnable fileRunnable1 = new GetFileRunnable(node1, channel1)
{
......@@ -221,7 +222,7 @@ public class RemoteHierarchicalContentNodeMultiThreadTest extends AbstractFileSy
final DataSetPathInfo pathInfo2 = new DataSetPathInfo();
pathInfo2.setRelativePath(remoteFile2.getName());
pathInfo2.setDirectory(false);
IHierarchicalContentNode node2 = createRemoteNode(pathInfo2);
IHierarchicalContentNode node2 = createRemoteNode(pathInfo2, cache);
final MessageChannel channel2 = new MessageChannel(10000);
GetFileRunnable fileRunnable2 = new GetFileRunnable(node2, channel2)
{
......@@ -269,10 +270,10 @@ public class RemoteHierarchicalContentNodeMultiThreadTest extends AbstractFileSy
File file1 = fileRunnable1.tryGetResult();
File file2 = fileRunnable2.tryGetResult();
assertEquals(new File(workSpace, ContentCache.CHACHED_FOLDER + "/" + DATA_SET_CODE + "/"
assertEquals(new File(workSpace, ContentCache.CACHE_FOLDER + "/" + DATA_SET_CODE + "/"
+ remoteFile1.getName()).getAbsolutePath(), file1.getAbsolutePath());
assertEquals(FILE1_CONTENT, FileUtilities.loadToString(file1).trim());
assertEquals(new File(workSpace, ContentCache.CHACHED_FOLDER + "/" + DATA_SET_CODE + "/"
assertEquals(new File(workSpace, ContentCache.CACHE_FOLDER + "/" + DATA_SET_CODE + "/"
+ remoteFile2.getName()).getAbsolutePath(), file2.getAbsolutePath());
assertEquals(FILE2_CONTENT, FileUtilities.loadToString(file2).trim());
context.assertIsSatisfied();
......@@ -281,14 +282,15 @@ public class RemoteHierarchicalContentNodeMultiThreadTest extends AbstractFileSy
@Test
public void testGetSameFileInTwoThreads() throws Exception
{
ContentCache cache = createCache(false);
final DataSetPathInfo pathInfo = new DataSetPathInfo();
pathInfo.setRelativePath(remoteFile1.getName());
pathInfo.setDirectory(false);
final IHierarchicalContentNode node1 = createRemoteNode(pathInfo);
final IHierarchicalContentNode node1 = createRemoteNode(pathInfo, cache);
ConsoleLogger logger = new ConsoleLogger();
final MessageChannel channel1 =
new MessageChannelBuilder(10000).name("1").logger(logger).getChannel();
final IHierarchicalContentNode node2 = createRemoteNode(pathInfo);
final IHierarchicalContentNode node2 = createRemoteNode(pathInfo, cache);
final MessageChannel channel2 =
new MessageChannelBuilder(10000).name("2").logger(logger).getChannel();
final MessageChannel channel3 =
......@@ -332,7 +334,7 @@ public class RemoteHierarchicalContentNodeMultiThreadTest extends AbstractFileSy
File file1 = fileRunnable1.tryGetResult();
File file2 = fileRunnable2.tryGetResult();
assertEquals(new File(workSpace, ContentCache.CHACHED_FOLDER + "/" + DATA_SET_CODE + "/"
assertEquals(new File(workSpace, ContentCache.CACHE_FOLDER + "/" + DATA_SET_CODE + "/"
+ remoteFile1.getName()).getAbsolutePath(), file1.getAbsolutePath());
assertEquals(FILE1_CONTENT, FileUtilities.loadToString(file1).trim());
assertEquals(file1, file2);
......@@ -342,14 +344,15 @@ public class RemoteHierarchicalContentNodeMultiThreadTest extends AbstractFileSy
@Test
public void testGetSameFileInTwoThreadsFirstDownloadFails() throws Exception
{
ContentCache cache = createCache(false);
final DataSetPathInfo pathInfo = new DataSetPathInfo();
pathInfo.setRelativePath(remoteFile1.getName());
pathInfo.setDirectory(false);
final IHierarchicalContentNode node1 = createRemoteNode(pathInfo);
final IHierarchicalContentNode node1 = createRemoteNode(pathInfo, cache);
ConsoleLogger logger = new ConsoleLogger();
final MessageChannel channel1 =
new MessageChannelBuilder(10000).name("1").logger(logger).getChannel();
final IHierarchicalContentNode node2 = createRemoteNode(pathInfo);
final IHierarchicalContentNode node2 = createRemoteNode(pathInfo, cache);
final MessageChannel channel2 =
new MessageChannelBuilder(10000).name("2").logger(logger).getChannel();
final MessageChannel channel3 =
......@@ -408,13 +411,28 @@ public class RemoteHierarchicalContentNodeMultiThreadTest extends AbstractFileSy
File file1 = fileRunnable1.tryGetResult();
assertEquals(null, file1);
File file2 = fileRunnable2.tryGetResult();
assertEquals(new File(workSpace, ContentCache.CHACHED_FOLDER + "/" + DATA_SET_CODE + "/"
assertEquals(new File(workSpace, ContentCache.CACHE_FOLDER + "/" + DATA_SET_CODE + "/"
+ remoteFile1.getName()).getAbsolutePath(), file2.getAbsolutePath());
assertEquals(FILE1_CONTENT, FileUtilities.loadToString(file2).trim());
context.assertIsSatisfied();
}
private IHierarchicalContentNode createRemoteNode(DataSetPathInfo pathInfo)
private ContentCache createCache(boolean sessionCache)
{
if (sessionCache == false)
{
context.checking(new Expectations()
{
{
one(fileOperations).removeRecursivelyQueueing(
new File(workSpace, ContentCache.DOWNLOADING_FOLDER));
}
});
}
return new ContentCache(serviceFactory, workSpace, sessionCache, fileOperations);
}
private IHierarchicalContentNode createRemoteNode(DataSetPathInfo pathInfo, ContentCache cache)
{
return new RemoteHierarchicalContentNode(DATA_SET_LOCATION, pathInfo, provider,
sessionHolder, cache);
......
......@@ -95,7 +95,7 @@ public class RemoteHierarchicalContentNodeTest
"remote-file.txt");
fileInSessionWorkspace =
new File(SESSION_WORKSPACE_DIR, ContentCache.CHACHED_FOLDER + "/"
new File(SESSION_WORKSPACE_DIR, ContentCache.CACHE_FOLDER + "/"
+ CACHED_DATASET_LOCATION.getDataSetCode() + "/already-downloaded-file.txt");
create(remoteFile);
create(fileInSessionWorkspace);
......@@ -110,7 +110,7 @@ public class RemoteHierarchicalContentNodeTest
will(returnValue(remoteDss));
}
});
cache = new ContentCache(serviceFactory, sessionHolder, SESSION_WORKSPACE_DIR, fileOperations);
cache = new ContentCache(serviceFactory, SESSION_WORKSPACE_DIR, false, fileOperations);
}
@Test
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment