diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/AbstractTransactionState.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/AbstractTransactionState.java index e9c1979332388e275aff58148dd33a83cb9c1de3..655ff02b9fad0973786f5d2e1b659cfa5fbfc8e8 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/AbstractTransactionState.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/AbstractTransactionState.java @@ -89,11 +89,27 @@ abstract class AbstractTransactionState<T extends DataSetInformation> static class LiveTransactionState<T extends DataSetInformation> extends AbstractTransactionState<T> implements RollbackStack.IRollbackStackDelegate { - // Wait for up to 5 minutes for the file system to become available - private static final int MAX_DIRECTORY_AVAILABLE_WAIT_COUNT = 6 * 5; + // Default to polling every 10 seconds and waiting for up to 5 minutes + private static int fileSystemAvailablityWaitCount = 6 * 5; - // Poll every 10 seconds - private static final int STAGING_DIR_AVAILABILITY_POLLING_WAIT_TIME = 10 * 1000; + private static int fileSystemAvailablityPollingWaitTimeMs = 10 * 1000; + + /** + * These two variables determine together how long the rollback mechanism waits for a file + * system that has become unavailable and how often it checks for the file system to become + * available. + * <p> + * The duration the rollback mechanism will wait before giving up equals waitTimeMS * + * waitCount; + * <p> + * Made public for testing. + */ + public static void setFileSystemAvailabilityPollingWaitTimeAndWaitCount(int waitTimeMS, + int waitCount) + { + fileSystemAvailablityWaitCount = waitTimeMS; + fileSystemAvailablityPollingWaitTimeMs = waitCount; + } // Keeps track of steps that have been executed and may need to be reverted. Elements are // kept in the order they need to be reverted. @@ -680,12 +696,11 @@ abstract class AbstractTransactionState<T extends DataSetInformation> if (null != FileUtilities.checkDirectoryFullyAccessible(stagingDirectory, "staging")) { boolean keepPolling = true; - for (int waitCount = 0; waitCount < MAX_DIRECTORY_AVAILABLE_WAIT_COUNT - && keepPolling; ++waitCount) + for (int waitCount = 0; waitCount < fileSystemAvailablityWaitCount && keepPolling; ++waitCount) { try { - Thread.sleep(STAGING_DIR_AVAILABILITY_POLLING_WAIT_TIME); + Thread.sleep(fileSystemAvailablityPollingWaitTimeMs); // If the directory is not accessible (i.e., return not null), wait again keepPolling = (null != FileUtilities.checkDirectoryFullyAccessible( diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransaction.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransaction.java index 3876217f826d148d5205b6a0ecde351eeba787fc..87c3994012ae63313235cca99008239ccd869f30 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransaction.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransaction.java @@ -97,7 +97,6 @@ public class DataSetRegistrationTransaction<T extends DataSetInformation> implem { File[] rollbackQueue1Files = rollBackStackParentFolder.listFiles(new FilenameFilter() { - public boolean accept(File dir, String name) { return name.endsWith(ROLLBACK_QUEUE1_FILE_NAME_SUFFIX); diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/RollbackConfigurator.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/RollbackConfigurator.java new file mode 100644 index 0000000000000000000000000000000000000000..510fd5995bfc312f9737815c30f39133f5c53d28 --- /dev/null +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/RollbackConfigurator.java @@ -0,0 +1,42 @@ +/* + * Copyright 2011 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.etlserver.registrator.api.v1.impl; + +/** + * A public class for setting rollback configuration variables (which are stored in package-visible + * classes). + * + * @author Chandrasekhar Ramakrishnan + */ +public class RollbackConfigurator +{ + /** + * These two variables determine together how long the rollback mechanism waits for a file + * system that has become unavailable and how often it checks for the file system to become + * available. + * <p> + * The duration the rollback mechanism will wait before giving up equals waitTimeMS * waitCount; + * <p> + * Made public for testing. + */ + public static void setFileSystemAvailabilityPollingWaitTimeAndWaitCount(int waitTimeMS, + int waitCount) + { + ch.systemsx.cisd.etlserver.registrator.api.v1.impl.AbstractTransactionState.LiveTransactionState + .setFileSystemAvailabilityPollingWaitTimeAndWaitCount(waitTimeMS, waitCount); + } +} diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/AbstractJythonDataSetHandlerTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/AbstractJythonDataSetHandlerTest.java index 5facd9fa7b5dca8befe90347385b6205c469f81e..bed4ca8a2ee29ab27bab82a50f19c093103bf592 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/AbstractJythonDataSetHandlerTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/AbstractJythonDataSetHandlerTest.java @@ -110,6 +110,8 @@ public abstract class AbstractJythonDataSetHandlerTest extends AbstractFileSyste public void init() { QueueingPathRemoverService.start(); + ch.systemsx.cisd.etlserver.registrator.api.v1.impl.RollbackConfigurator + .setFileSystemAvailabilityPollingWaitTimeAndWaitCount(10, 1); } @AfterTest @@ -238,7 +240,7 @@ public abstract class AbstractJythonDataSetHandlerTest extends AbstractFileSyste return threadProperties; } - public static final class MockStorageProcessor implements IStorageProcessorTransactional, + public static class MockStorageProcessor implements IStorageProcessorTransactional, Serializable { private static final long serialVersionUID = 1L; diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/JythonTopLevelDataSetRegistratorRollbackTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/JythonTopLevelDataSetRegistratorRollbackTest.java new file mode 100644 index 0000000000000000000000000000000000000000..90ddfa01a4554ce345f982661ededd4699bde364 --- /dev/null +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/JythonTopLevelDataSetRegistratorRollbackTest.java @@ -0,0 +1,293 @@ +/* + * Copyright 2011 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.etlserver.registrator; + +import static ch.systemsx.cisd.common.Constants.IS_FINISHED_PREFIX; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Properties; + +import org.apache.commons.io.FileUtils; +import org.hamcrest.core.IsAnything; +import org.jmock.Expectations; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import ch.systemsx.cisd.base.exceptions.IOExceptionUnchecked; +import ch.systemsx.cisd.common.filesystem.FileUtilities; +import ch.systemsx.cisd.common.mail.IMailClient; +import ch.systemsx.cisd.common.utilities.ExtendedProperties; +import ch.systemsx.cisd.etlserver.IStorageProcessorTransactional; +import ch.systemsx.cisd.etlserver.ITypeExtractor; +import ch.systemsx.cisd.etlserver.registrator.api.v1.impl.DataSetRegistrationTransaction; +import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria; +import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClause; +import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClauseAttribute; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.ExperimentBuilder; +import ch.systemsx.cisd.openbis.generic.shared.dto.StorageFormat; +import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifierFactory; + +/** + * @author Chandrasekhar Ramakrishnan + */ +public class JythonTopLevelDataSetRegistratorRollbackTest extends AbstractJythonDataSetHandlerTest +{ + private static final String SCRIPTS_FOLDER = + "sourceTest/java/ch/systemsx/cisd/etlserver/registrator/"; + + private static final String DATA_SET_CODE = "data-set-code"; + + private static final DataSetType DATA_SET_TYPE = new DataSetType("O1"); + + private static final String EXPERIMENT_IDENTIFIER = "/SPACE/PROJECT/EXP"; + + @BeforeMethod + @Override + public void setUp() throws IOException + { + super.setUp(); + + didDataSetRollbackHappen = false; + didServiceRollbackHappen = false; + } + + @Test + public void testSimpleTransactionRollback() + { + setUpHomeDataBaseExpectations(); + Properties properties = + createThreadPropertiesRelativeToScriptsFolder("simple-transaction.py"); + properties.setProperty(IStorageProcessorTransactional.STORAGE_PROCESSOR_KEY, + MockStorageProcessor.class.getName()); + + createHandler(properties, false, false); + createData(); + ExperimentBuilder builder = new ExperimentBuilder().identifier(EXPERIMENT_IDENTIFIER); + final Experiment experiment = builder.getExperiment(); + context.checking(new Expectations() + { + { + one(openBisService).createDataSetCode(); + will(returnValue(DATA_SET_CODE)); + atLeast(1).of(openBisService).tryToGetExperiment( + new ExperimentIdentifierFactory(experiment.getIdentifier()) + .createIdentifier()); + will(returnValue(experiment)); + + one(dataSetValidator).assertValidDataSet(DATA_SET_TYPE, + new File(new File(stagingDirectory, DATA_SET_CODE), "sub_data_set_1")); + one(openBisService) + .performEntityOperations( + with(new IsAnything<ch.systemsx.cisd.openbis.generic.shared.dto.AtomicEntityOperationDetails>())); + will(throwException(new AssertionError("Fail"))); + } + }); + + try + { + handler.handle(markerFile); + fail("No IOException thrown"); + } catch (IOExceptionUnchecked e) + { + // Make the file system available again and rollback + makeFileSystemAvailable(workingDirectory); + DataSetRegistrationTransaction.rollbackDeadTransactions(workingDirectory); + } + assertEquals(1, MockStorageProcessor.instance.incomingDirs.size()); + assertEquals(0, MockStorageProcessor.instance.calledCommitCount); + assertEquals("[]", Arrays.asList(stagingDirectory.list()).toString()); + assertEquals( + "hello world1", + FileUtilities.loadToString( + new File(workingDirectory, "data_set/sub_data_set_1/read1.me")).trim()); + assertEquals( + "hello world2", + FileUtilities.loadToString( + new File(workingDirectory, "data_set/sub_data_set_2/read2.me")).trim()); + + TestingDataSetHandler theHandler = (TestingDataSetHandler) handler; + assertFalse(theHandler.didRollbackDataSetRegistrationFunctionRun); + assertFalse(theHandler.didRollbackServiceFunctionRun); + assertTrue(theHandler.didTransactionRollbackHappen); + assertTrue(theHandler.didRollbackTransactionFunctionRunHappen); + + context.assertIsSatisfied(); + } + + private void createData() + { + incomingDataSetFile = createDirectory(workingDirectory, "data_set"); + + subDataSet1 = createDirectory(incomingDataSetFile, "sub_data_set_1"); + subDataSet2 = createDirectory(incomingDataSetFile, "sub_data_set_2"); + + FileUtilities.writeToFile(new File(subDataSet1, "read1.me"), "hello world1"); + FileUtilities.writeToFile(new File(subDataSet2, "read2.me"), "hello world2"); + + markerFile = new File(workingDirectory, IS_FINISHED_PREFIX + "data_set"); + FileUtilities.writeToFile(markerFile, ""); + } + + @Override + protected String getRegistrationScriptsFolderPath() + { + return SCRIPTS_FOLDER; + } + + protected SearchCriteria createTestSearchCriteria(String typeString) + { + SearchCriteria sc = new SearchCriteria(); + sc.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.TYPE, typeString)); + sc.addMatchClause(MatchClause.createPropertyMatch("PROP", "VALUE")); + return sc; + } + + public static final class MockStorageProcessor extends + AbstractJythonDataSetHandlerTest.MockStorageProcessor + { + private static final long serialVersionUID = 1L; + + static MockStorageProcessor instance; + + int calledGetStoreRootDirectoryCount = 0; + + int calledCommitCount = 0; + + File storeRootDirectory; + + String dataSetInfoString; + + protected List<File> incomingDirs = new ArrayList<File>(); + + protected List<File> rootDirs = new ArrayList<File>(); + + public MockStorageProcessor(ExtendedProperties props) + { + super(props); + instance = this; + } + + public File getStoreRootDirectory() + { + calledGetStoreRootDirectoryCount++; + return storeRootDirectory; + } + + public void setStoreRootDirectory(File storeRootDirectory) + { + this.storeRootDirectory = storeRootDirectory; + } + + public StorageFormat getStorageFormat() + { + return StorageFormat.PROPRIETARY; + } + + public UnstoreDataAction getDefaultUnstoreDataAction(Throwable exception) + { + return UnstoreDataAction.LEAVE_UNTOUCHED; + } + + public IStorageProcessorTransaction createTransaction( + StorageProcessorTransactionParameters parameters) + { + final File rootDir = parameters.getRootDir(); + dataSetInfoString = parameters.getDataSetInformation().toString(); + return new IStorageProcessorTransaction() + { + + private static final long serialVersionUID = 1L; + + private File storedFolder; + + public void storeData(ITypeExtractor typeExtractor, IMailClient mailClient, + File incomingDataSetFile) + { + + incomingDirs.add(incomingDataSetFile); + rootDirs.add(rootDir); + + try + { + if (incomingDataSetFile.isDirectory()) + { + FileUtils.moveDirectoryToDirectory(incomingDataSetFile, new File( + rootDir, "original"), true); + } else + { + FileUtils.moveFileToDirectory(incomingDataSetFile, new File( + rootDir, "original"), false); + } + makeFileSystemUnavailable(getStoreRootDirectory()); + } catch (IOException ex) + { + throw new IOExceptionUnchecked(ex); + } + storedFolder = rootDir; + } + + public UnstoreDataAction rollback(Throwable exception) + { + return null; + } + + public File getStoredDataDirectory() + { + return storedFolder; + } + + public void commit() + { + calledCommitCount++; + } + + public File tryGetProprietaryData() + { + return null; + } + }; + } + } + + /** + * Simulate the file system becoming unavailable + */ + private static void makeFileSystemUnavailable(File storeRootDirectory) + { + new File(storeRootDirectory, "1").renameTo(new File(storeRootDirectory, "1.unavailable")); + + new File(storeRootDirectory, "staging").renameTo(new File(storeRootDirectory, + "staging.unavailable")); + } + + /** + * Simulate the file system becoming available again + */ + private static void makeFileSystemAvailable(File storeRootDirectory) + { + new File(storeRootDirectory, "1.unavailable").renameTo(new File(storeRootDirectory, "1")); + + new File(storeRootDirectory, "staging.unavailable").renameTo(new File(storeRootDirectory, + "staging")); + } +} diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/JythonTopLevelDataSetRegistratorTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/JythonTopLevelDataSetRegistratorTest.java index 7b4d0c1544e86442e301e881031df76b939b9e60..562ffd31ffda45bd18590bc53370978d8e936f4e 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/JythonTopLevelDataSetRegistratorTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/JythonTopLevelDataSetRegistratorTest.java @@ -99,8 +99,6 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractJythonDataSetH setUpHomeDataBaseExpectations(); Properties properties = createThreadPropertiesRelativeToScriptsFolder("simple-transaction.py"); - final File stagingDir = new File(workingDirectory, "staging"); - properties.setProperty(DataSetRegistrationService.STAGING_DIR, stagingDir.getPath()); createHandler(properties, false, true); createData(); @@ -119,7 +117,7 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractJythonDataSetH will(returnValue(experiment)); one(dataSetValidator).assertValidDataSet(DATA_SET_TYPE, - new File(new File(stagingDir, DATA_SET_CODE), "sub_data_set_1")); + new File(new File(stagingDirectory, DATA_SET_CODE), "sub_data_set_1")); one(openBisService).performEntityOperations(with(atomicatOperationDetails)); will(returnValue(new AtomicEntityOperationResult())); } @@ -149,7 +147,8 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractJythonDataSetH assertEquals(1, MockStorageProcessor.instance.calledCommitCount); assertEquals(datasetLocation, MockStorageProcessor.instance.rootDirs.get(0)); File incomingDir = MockStorageProcessor.instance.incomingDirs.get(0); - assertEquals(new File(new File(stagingDir, DATA_SET_CODE), "sub_data_set_1"), incomingDir); + assertEquals(new File(new File(stagingDirectory, DATA_SET_CODE), "sub_data_set_1"), + incomingDir); assertEquals("hello world1", FileUtilities.loadToString(new File(datasetLocation, "read1.me")).trim()); context.assertIsSatisfied(); @@ -161,8 +160,6 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractJythonDataSetH setUpHomeDataBaseExpectations(); Properties properties = createThreadPropertiesRelativeToScriptsFolder("simple-transaction-rollback.py"); - final File stagingDir = new File(workingDirectory, "staging"); - properties.setProperty(DataSetRegistrationService.STAGING_DIR, stagingDir.getPath()); createHandler(properties, true, false); createData(); ExperimentBuilder builder = new ExperimentBuilder().identifier(EXPERIMENT_IDENTIFIER); @@ -182,7 +179,7 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractJythonDataSetH handler.handle(markerFile); assertEquals(0, MockStorageProcessor.instance.incomingDirs.size()); assertEquals(0, MockStorageProcessor.instance.calledCommitCount); - assertEquals("[]", Arrays.asList(stagingDir.list()).toString()); + assertEquals("[]", Arrays.asList(stagingDirectory.list()).toString()); assertEquals( "hello world1", FileUtilities.loadToString( @@ -209,8 +206,6 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractJythonDataSetH setUpHomeDataBaseExpectations(); Properties properties = createThreadPropertiesRelativeToScriptsFolder("simple-transaction.py"); - final File stagingDir = new File(workingDirectory, "staging"); - properties.setProperty(DataSetRegistrationService.STAGING_DIR, stagingDir.getPath()); createHandler(properties, false, false); createData(); ExperimentBuilder builder = new ExperimentBuilder().identifier(EXPERIMENT_IDENTIFIER); @@ -226,7 +221,7 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractJythonDataSetH will(returnValue(experiment)); one(dataSetValidator).assertValidDataSet(DATA_SET_TYPE, - new File(new File(stagingDir, DATA_SET_CODE), "sub_data_set_1")); + new File(new File(stagingDirectory, DATA_SET_CODE), "sub_data_set_1")); one(openBisService) .performEntityOperations( with(new IsAnything<ch.systemsx.cisd.openbis.generic.shared.dto.AtomicEntityOperationDetails>())); @@ -237,7 +232,7 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractJythonDataSetH handler.handle(markerFile); assertEquals(1, MockStorageProcessor.instance.incomingDirs.size()); assertEquals(0, MockStorageProcessor.instance.calledCommitCount); - assertEquals("[]", Arrays.asList(stagingDir.list()).toString()); + assertEquals("[]", Arrays.asList(stagingDirectory.list()).toString()); assertEquals( "hello world1", FileUtilities.loadToString( @@ -262,8 +257,6 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractJythonDataSetH setUpHomeDataBaseExpectations(); Properties properties = createThreadPropertiesRelativeToScriptsFolder("two-simple-datasets.py"); - final File stagingDir = new File(workingDirectory, "staging"); - properties.setProperty(DataSetRegistrationService.STAGING_DIR, stagingDir.getPath()); createHandler(properties, false, true); createData(); ExperimentBuilder builder1 = new ExperimentBuilder().identifier("/SPACE/PROJECT/EXP1"); @@ -283,8 +276,10 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractJythonDataSetH .createIdentifier()); will(returnValue(experiment1)); - one(dataSetValidator).assertValidDataSet(DATA_SET_TYPE, - new File(new File(stagingDir, DATA_SET_CODE + 1), "sub_data_set_1")); + one(dataSetValidator).assertValidDataSet( + DATA_SET_TYPE, + new File(new File(stagingDirectory, DATA_SET_CODE + 1), + "sub_data_set_1")); one(openBisService).createDataSetCode(); will(returnValue(DATA_SET_CODE + 2)); @@ -294,8 +289,10 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractJythonDataSetH .createIdentifier()); will(returnValue(experiment2)); - one(dataSetValidator).assertValidDataSet(DATA_SET_TYPE, - new File(new File(stagingDir, DATA_SET_CODE + 2), "sub_data_set_2")); + one(dataSetValidator).assertValidDataSet( + DATA_SET_TYPE, + new File(new File(stagingDirectory, DATA_SET_CODE + 2), + "sub_data_set_2")); one(openBisService).performEntityOperations(with(operations)); will(returnValue(new AtomicEntityOperationResult())); @@ -324,7 +321,7 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractJythonDataSetH datasetLocation1), dataSet1.getLocation()); assertEquals(datasetLocation1, MockStorageProcessor.instance.rootDirs.get(0)); File incomingDir1 = MockStorageProcessor.instance.incomingDirs.get(0); - assertEquals(new File(new File(stagingDir, DATA_SET_CODE + 1), "sub_data_set_1"), + assertEquals(new File(new File(stagingDirectory, DATA_SET_CODE + 1), "sub_data_set_1"), incomingDir1); assertEquals("hello world1", FileUtilities.loadToString(new File(datasetLocation1, "read1.me")).trim()); @@ -341,7 +338,7 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractJythonDataSetH datasetLocation2), dataSet2.getLocation()); assertEquals(datasetLocation2, MockStorageProcessor.instance.rootDirs.get(1)); File incomingDir2 = MockStorageProcessor.instance.incomingDirs.get(1); - assertEquals(new File(new File(stagingDir, DATA_SET_CODE + 2), "sub_data_set_2"), + assertEquals(new File(new File(stagingDirectory, DATA_SET_CODE + 2), "sub_data_set_2"), incomingDir2); assertEquals("hello world2", FileUtilities.loadToString(new File(datasetLocation2, "read2.me")).trim()); @@ -354,8 +351,6 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractJythonDataSetH setUpHomeDataBaseExpectations(); Properties properties = createThreadPropertiesRelativeToScriptsFolder("transaction-with-new-experiment.py"); - final File stagingDir = new File(workingDirectory, "staging"); - properties.setProperty(DataSetRegistrationService.STAGING_DIR, stagingDir.getPath()); createHandler(properties, false, true); createData(); final RecordingMatcher<ch.systemsx.cisd.openbis.generic.shared.dto.AtomicEntityOperationDetails> atomicatOperationDetails = @@ -370,7 +365,7 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractJythonDataSetH will(returnValue(EXPERIMENT_PERM_ID)); one(dataSetValidator).assertValidDataSet(DATA_SET_TYPE, - new File(new File(stagingDir, DATA_SET_CODE), "sub_data_set_1")); + new File(new File(stagingDirectory, DATA_SET_CODE), "sub_data_set_1")); one(openBisService).performEntityOperations(with(atomicatOperationDetails)); will(returnValue(new AtomicEntityOperationResult())); } @@ -402,7 +397,8 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractJythonDataSetH assertEquals(1, MockStorageProcessor.instance.calledCommitCount); assertEquals(datasetLocation, MockStorageProcessor.instance.rootDirs.get(0)); File incomingDir = MockStorageProcessor.instance.incomingDirs.get(0); - assertEquals(new File(new File(stagingDir, DATA_SET_CODE), "sub_data_set_1"), incomingDir); + assertEquals(new File(new File(stagingDirectory, DATA_SET_CODE), "sub_data_set_1"), + incomingDir); context.assertIsSatisfied(); } @@ -412,8 +408,6 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractJythonDataSetH setUpHomeDataBaseExpectations(); Properties properties = createThreadPropertiesRelativeToScriptsFolder("transaction-with-new-sample.py"); - final File stagingDir = new File(workingDirectory, "staging"); - properties.setProperty(DataSetRegistrationService.STAGING_DIR, stagingDir.getPath()); createHandler(properties, false, true); createData(); final RecordingMatcher<ch.systemsx.cisd.openbis.generic.shared.dto.AtomicEntityOperationDetails> atomicatOperationDetails = @@ -431,7 +425,7 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractJythonDataSetH will(returnValue(SAMPLE_PERM_ID)); one(dataSetValidator).assertValidDataSet(DATA_SET_TYPE, - new File(new File(stagingDir, DATA_SET_CODE), "sub_data_set_1")); + new File(new File(stagingDirectory, DATA_SET_CODE), "sub_data_set_1")); one(openBisService).performEntityOperations(with(atomicatOperationDetails)); will(returnValue(new AtomicEntityOperationResult())); } @@ -475,7 +469,8 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractJythonDataSetH assertEquals(1, MockStorageProcessor.instance.calledCommitCount); assertEquals(datasetLocation, MockStorageProcessor.instance.rootDirs.get(0)); File incomingDir = MockStorageProcessor.instance.incomingDirs.get(0); - assertEquals(new File(new File(stagingDir, DATA_SET_CODE), "sub_data_set_1"), incomingDir); + assertEquals(new File(new File(stagingDirectory, DATA_SET_CODE), "sub_data_set_1"), + incomingDir); context.assertIsSatisfied(); } @@ -485,8 +480,6 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractJythonDataSetH setUpHomeDataBaseExpectations(); Properties properties = createThreadPropertiesRelativeToScriptsFolder("transaction-with-new-material.py"); - final File stagingDir = new File(workingDirectory, "staging"); - properties.setProperty(DataSetRegistrationService.STAGING_DIR, stagingDir.getPath()); createHandler(properties, false, true); createData(); @@ -506,7 +499,7 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractJythonDataSetH will(returnValue(experiment)); one(dataSetValidator).assertValidDataSet(DATA_SET_TYPE, - new File(new File(stagingDir, DATA_SET_CODE), "sub_data_set_1")); + new File(new File(stagingDirectory, DATA_SET_CODE), "sub_data_set_1")); one(openBisService).performEntityOperations(with(atomicatOperationDetails)); will(returnValue(new AtomicEntityOperationResult())); } @@ -544,8 +537,6 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractJythonDataSetH setUpHomeDataBaseExpectations(); Properties properties = createThreadPropertiesRelativeToScriptsFolder("transaction-with-dataset-update.py"); - final File stagingDir = new File(workingDirectory, "staging"); - properties.setProperty(DataSetRegistrationService.STAGING_DIR, stagingDir.getPath()); createHandler(properties, false, true); createData(); @@ -572,7 +563,7 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractJythonDataSetH will(returnValue(containerDataSet)); one(dataSetValidator).assertValidDataSet(DATA_SET_TYPE, - new File(new File(stagingDir, DATA_SET_CODE), "data_set")); + new File(new File(stagingDirectory, DATA_SET_CODE), "data_set")); one(openBisService).performEntityOperations(with(atomicOperationDetails)); will(returnValue(new AtomicEntityOperationResult()));