diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/DssPropertyParametersUtil.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/DssPropertyParametersUtil.java index fbb040268ab06c453924309fff06e6757d3c2946..1e2e10542719f4e37936827487ecd8572158c67f 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/DssPropertyParametersUtil.java +++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/DssPropertyParametersUtil.java @@ -21,6 +21,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Properties; import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; import ch.ethz.cisd.hotdeploy.PluginContainer; import ch.rinn.restrictions.Private; @@ -69,7 +70,7 @@ public class DssPropertyParametersUtil static final String DSS_TEMP_DIR_PATH = "dss-temp-dir"; @Private - static final File EMPTY_TEST_FILE = new File("an-empty-test-file"); + static final String EMPTY_TEST_FILE_NAME = "an-empty-test-file"; /** * Directory for registration log files. @@ -227,35 +228,28 @@ public class DssPropertyParametersUtil return registrationLogDir; } + private static AtomicInteger atomicEmptyFileIndex = new AtomicInteger(); + private static void assertDirExistsAndIsLocal(IFileOperations fileOperations, File dir, String dirDescription, String pathKey) { - assertDirExists(fileOperations, dir, dirDescription, pathKey); - - File emptyTestFile = null; - File emptyTestFileInDir = null; + String threadSafeEmptyTestFileName = EMPTY_TEST_FILE_NAME + atomicEmptyFileIndex.incrementAndGet(); + File threadSafeEmptyTestFile = new File(threadSafeEmptyTestFileName); + File emptyTestFileInDir = new File(dir, threadSafeEmptyTestFileName); try { - // make the file name unique so that multiple threads can safely perform this check at the same time - emptyTestFile = fileOperations.createTempFile(EMPTY_TEST_FILE.getName(), ""); - emptyTestFileInDir = new File(dir, emptyTestFile.getName()); - - if (fileOperations.rename(emptyTestFile, emptyTestFileInDir) == false) + assertDirExists(fileOperations, dir, dirDescription, pathKey); + fileOperations.createNewFile(threadSafeEmptyTestFile); + if (fileOperations.rename(threadSafeEmptyTestFile, emptyTestFileInDir) == false) { throw createException(NON_LOCAL_DIR_TEMPLATE.createFreshCopy(), dir, dirDescription, pathKey); } } finally { - if (emptyTestFile != null) - { - fileOperations.delete(emptyTestFile); - } - if (emptyTestFileInDir != null) - { - fileOperations.delete(emptyTestFileInDir); - } + fileOperations.delete(threadSafeEmptyTestFile); + fileOperations.delete(emptyTestFileInDir); } } diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/DssPropertyParametersUtilTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/DssPropertyParametersUtilTest.java index 19bcad7215b505bff80af10bce4c86b66c76df19..740d97576fbffa8cfa861c1e0d43507082a16695 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/DssPropertyParametersUtilTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/DssPropertyParametersUtilTest.java @@ -16,11 +16,11 @@ package ch.systemsx.cisd.openbis.dss.generic.shared.utils; -import static ch.systemsx.cisd.openbis.dss.generic.shared.utils.DssPropertyParametersUtil.EMPTY_TEST_FILE; - import java.io.File; import java.util.Properties; +import org.hamcrest.BaseMatcher; +import org.hamcrest.Description; import org.jmock.Expectations; import org.jmock.Mockery; import org.testng.AssertJUnit; @@ -38,6 +38,7 @@ import ch.systemsx.cisd.common.filesystem.IFileOperations; @Friend(toClasses = DssPropertyParametersUtil.class) public class DssPropertyParametersUtilTest extends AssertJUnit { + private static final File EMPTY_TEST_FILE = new File(DssPropertyParametersUtil.EMPTY_TEST_FILE_NAME); private Mockery context; @@ -64,7 +65,7 @@ public class DssPropertyParametersUtilTest extends AssertJUnit File expectedDir = new File(System.getProperty("user.dir"), "dss-tmp"); prepareForMkdirs(expectedDir); prepareForExists(expectedDir); - prepareForCreateTempFile(EMPTY_TEST_FILE); + prepareForCreateNewFile(EMPTY_TEST_FILE); File movedEmptyTestFile = new File(expectedDir, EMPTY_TEST_FILE.getName()); prepareForRenameFile(EMPTY_TEST_FILE, movedEmptyTestFile, true); prepareForDeleteFile(EMPTY_TEST_FILE); @@ -85,7 +86,7 @@ public class DssPropertyParametersUtilTest extends AssertJUnit properties.setProperty(DssPropertyParametersUtil.DSS_TEMP_DIR_PATH, expectedDir.getPath()); prepareForMkdirs(expectedDir); prepareForExists(expectedDir); - prepareForCreateTempFile(EMPTY_TEST_FILE); + prepareForCreateNewFile(EMPTY_TEST_FILE); File movedEmptyTestFile = new File(expectedDir, EMPTY_TEST_FILE.getName()); prepareForRenameFile(EMPTY_TEST_FILE, movedEmptyTestFile, true); prepareForDeleteFile(EMPTY_TEST_FILE); @@ -130,7 +131,7 @@ public class DssPropertyParametersUtilTest extends AssertJUnit properties.setProperty(DssPropertyParametersUtil.DSS_TEMP_DIR_PATH, expectedDir.getPath()); prepareForMkdirs(expectedDir); prepareForExists(expectedDir); - prepareForCreateTempFile(EMPTY_TEST_FILE); + prepareForCreateNewFile(EMPTY_TEST_FILE); File movedEmptyTestFile = new File(expectedDir, EMPTY_TEST_FILE.getName()); prepareForRenameFile(EMPTY_TEST_FILE, movedEmptyTestFile, false); prepareForDeleteFile(EMPTY_TEST_FILE); @@ -157,7 +158,7 @@ public class DssPropertyParametersUtilTest extends AssertJUnit File expectedDir = new File(System.getProperty("user.dir"), "log-registrations"); prepareForMkdirs(expectedDir); prepareForExists(expectedDir); - prepareForCreateTempFile(EMPTY_TEST_FILE); + prepareForCreateNewFile(EMPTY_TEST_FILE); File movedEmptyTestFile = new File(expectedDir, EMPTY_TEST_FILE.getName()); prepareForRenameFile(EMPTY_TEST_FILE, movedEmptyTestFile, true); prepareForDeleteFile(EMPTY_TEST_FILE); @@ -180,7 +181,7 @@ public class DssPropertyParametersUtilTest extends AssertJUnit expectedDir.getPath()); prepareForMkdirs(expectedDir); prepareForExists(expectedDir); - prepareForCreateTempFile(EMPTY_TEST_FILE); + prepareForCreateNewFile(EMPTY_TEST_FILE); File movedEmptyTestFile = new File(expectedDir, EMPTY_TEST_FILE.getName()); prepareForRenameFile(EMPTY_TEST_FILE, movedEmptyTestFile, true); prepareForDeleteFile(EMPTY_TEST_FILE); @@ -228,7 +229,7 @@ public class DssPropertyParametersUtilTest extends AssertJUnit expectedDir.getPath()); prepareForMkdirs(expectedDir); prepareForExists(expectedDir); - prepareForCreateTempFile(EMPTY_TEST_FILE); + prepareForCreateNewFile(EMPTY_TEST_FILE); File movedEmptyTestFile = new File(expectedDir, EMPTY_TEST_FILE.getName()); prepareForRenameFile(EMPTY_TEST_FILE, movedEmptyTestFile, false); prepareForDeleteFile(EMPTY_TEST_FILE); @@ -283,13 +284,46 @@ public class DssPropertyParametersUtilTest extends AssertJUnit }); } - private void prepareForCreateTempFile(final File file) + class FileNameStarsWithMatcher extends BaseMatcher<File> + { + + String expectedPrefix; + + public FileNameStarsWithMatcher(File fileWithExpectedPrefix) + { + this.expectedPrefix = fileWithExpectedPrefix.getPath(); + } + + @Override + public boolean matches(Object file) + { + if (file == null || false == file instanceof File) + { + return false; + } + return ((File) file).getPath().startsWith(this.expectedPrefix); + } + + @Override + public void describeTo(Description description) + { + description.appendText("Expected " + this.expectedPrefix + " prefix in the file name"); + } + + } + + private FileNameStarsWithMatcher fileStartingWith(File file) + { + return new FileNameStarsWithMatcher(file); + } + + private void prepareForCreateNewFile(final File file) { context.checking(new Expectations() { { - one(fileOperations).createTempFile(file.getName(), ""); - will(returnValue(file)); + one(fileOperations).createNewFile(with(fileStartingWith(file))); + will(returnValue(true)); } }); } @@ -300,7 +334,7 @@ public class DssPropertyParametersUtilTest extends AssertJUnit context.checking(new Expectations() { { - one(fileOperations).rename(source, destination); + one(fileOperations).rename(with(fileStartingWith(source)), with(fileStartingWith(destination))); will(returnValue(success)); } }); @@ -311,7 +345,7 @@ public class DssPropertyParametersUtilTest extends AssertJUnit context.checking(new Expectations() { { - one(fileOperations).delete(file); + one(fileOperations).delete(with(fileStartingWith(file))); will(returnValue(true)); } });