diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/IncomingFileDeletedBeforeRegistrationException.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/IncomingFileDeletedBeforeRegistrationException.java new file mode 100644 index 0000000000000000000000000000000000000000..f26abc4e6b8f68706f2e07660d2474fb49f99f0f --- /dev/null +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/IncomingFileDeletedBeforeRegistrationException.java @@ -0,0 +1,39 @@ +/* + * Copyright 2012 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 ch.systemsx.cisd.common.exceptions.UserFailureException; + +/** + * An exception that is thrown if it is determined that the incoming file to register was deleted + * before any registrations happened. + * + * @author Chandrasekhar Ramakrishnan + */ +public class IncomingFileDeletedBeforeRegistrationException extends UserFailureException +{ + private static final long serialVersionUID = 1L; + + /** + * @param message + */ + public IncomingFileDeletedBeforeRegistrationException(String message) + { + super(message); + } + +} 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 0c76ea2ccb3f055a34e6d016312ee590e2d87029..7d20982bce93469d4d828b8550c849ccce4dc30f 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 @@ -42,6 +42,7 @@ import ch.systemsx.cisd.etlserver.registrator.DataSetStorageAlgorithmRunner; import ch.systemsx.cisd.etlserver.registrator.IDataSetOnErrorActionDecision.ErrorType; import ch.systemsx.cisd.etlserver.registrator.IDataSetRegistrationDetailsFactory; import ch.systemsx.cisd.etlserver.registrator.IEntityOperationService; +import ch.systemsx.cisd.etlserver.registrator.IncomingFileDeletedBeforeRegistrationException; import ch.systemsx.cisd.etlserver.registrator.api.v1.IDataSet; import ch.systemsx.cisd.etlserver.registrator.api.v1.IDataSetRegistrationTransaction; import ch.systemsx.cisd.etlserver.registrator.api.v1.IDataSetUpdatable; @@ -541,6 +542,18 @@ public class DataSetRegistrationTransaction<T extends DataSetInformation> implem IEntityOperationService<T> entityRegistrationService = registrationService.getEntityRegistrationService(); + File realIncomingFile = getIncomingDataSetFile().getRealIncomingFile(); + if (false == realIncomingFile.exists()) + { + StringBuilder sb = new StringBuilder(); + sb.append("Incoming file ["); + sb.append(realIncomingFile.getAbsolutePath()); + sb.append("] "); + sb.append(" was deleted before registration."); + + throw new IncomingFileDeletedBeforeRegistrationException(sb.toString()); + } + entityRegistrationService.performOperationsInApplcationServer(registrationDetails); } 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 d04e8b8fe21f6c7d463910f2c85422d9d06f4928..443206b71d78b72790085341dfd84b021fa4d36a 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 @@ -411,7 +411,6 @@ public abstract class AbstractJythonDataSetHandlerTest extends AbstractFileSyste StorageProcessorTransactionParameters parameters) { final File rootDir = parameters.getRootDir(); - System.out.println("Store dir " + rootDir); dataSetInfoString = parameters.getDataSetInformation().toString(); return new IStorageProcessorTransaction() { 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 0183c0b601e46f2a9ea191fde4e697663b4a92d9..5776da5cdfcf86cfdc895d5c326c530946a48c6d 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 @@ -921,6 +921,10 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractJythonDataSetH { TestCaseParameters testCase = new TestCaseParameters(title); testCase.shouldUseAutoRecovery = true; + if (deletionPoint == DeletionPoint.BEFORE_OPENBIS_REGISTRATION) + { + testCase.failurePoint = TestCaseParameters.FailurePoint.BEFORE_OPENBIS_REGISTRATION; + } return testCase; } @@ -982,10 +986,6 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractJythonDataSetH { return; } - if (testCase.deletionPoint == IncomingFileDeletedTestCaseParameters.DeletionPoint.BEFORE_OPENBIS_REGISTRATION) - { - return; - } initializeStorageRecoveryManagerMock(); setUpHomeDataBaseExpectations(); @@ -1015,7 +1015,7 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractJythonDataSetH assertEquals("[]", Arrays.asList(stagingDirectory.list()).toString()); } else { - assertEquals(0, MockStorageProcessor.instance.incomingDirs.size()); + assertEquals(1, MockStorageProcessor.instance.incomingDirs.size()); assertEquals(0, MockStorageProcessor.instance.calledCommitCount); assertEquals("[]", Arrays.asList(stagingDirectory.list()).toString()); } @@ -1023,12 +1023,31 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractJythonDataSetH context.assertIsSatisfied(); } + @SuppressWarnings("unchecked") private ExpectationBuilder getTestIncomingFileDeletedExcpectations( final IncomingFileDeletedTestCaseParameters testCase, final RecordingMatcher<AtomicEntityOperationDetails> atomicOperationDetails) { - return getSimpleTransactionExpectations(testCase.toTestCaseParameters(), - atomicOperationDetails); + Expectations e = + getSimpleTransactionExpectations(testCase.toTestCaseParameters(), + atomicOperationDetails); + if (testCase.deletionPoint == IncomingFileDeletedTestCaseParameters.DeletionPoint.BEFORE_OPENBIS_REGISTRATION) + { + e.one(openBisService).drawANewUniqueID(); + e.will(Expectations.returnValue(new Long(1))); + + e.one(storageRecoveryManager).checkpointPrecommittedState( + e.with(Expectations.any(TechId.class)), + e.with(Expectations.any(DataSetStorageAlgorithmRunner.class))); + + e.one(storageRecoveryManager).canRecoverFromError( + e.with(Expectations.any(UserFailureException.class))); + e.will(Expectations.returnValue(false)); + + // e.one(storageRecoveryManager).removeCheckpoint( + // e.with(Expectations.any(DataSetStorageAlgorithmRunner.class))); + } + return e; } @Test diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/v2-delete-after-registration.py b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/v2-delete-after-registration.py index 1130ccdee95a70ac8145e0f99434490fb726cc40..e675be1c6ace8bde8062524eaf4a773f2a579c3d 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/v2-delete-after-registration.py +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/v2-delete-after-registration.py @@ -1,12 +1,13 @@ from java.lang import IllegalArgumentException from java.io import File +from ch.systemsx.cisd.common.filesystem import FileUtilities execfile("sourceTest/java/ch/systemsx/cisd/etlserver/registrator/all-hooks.py") def post_metadata_registration(context): path_to_delete = context.getPersistentMap().get("path") file_to_delete = File(path_to_delete) - file_to_delete.delete() + FileUtilities.deleteRecursively(file_to_delete) jythonHookTestTool.log("post_metadata_registration") def process(tr): diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/v2-delete-before-registration.py b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/v2-delete-before-registration.py index 7a3206ddbfe8f8cb6cfbb834f93e755a28f5f01a..72990392c350b3e79e8f5c0bfe7bd4c0f783db99 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/v2-delete-before-registration.py +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/v2-delete-before-registration.py @@ -1,12 +1,13 @@ from java.lang import IllegalArgumentException from java.io import File +from ch.systemsx.cisd.common.filesystem import FileUtilities execfile("sourceTest/java/ch/systemsx/cisd/etlserver/registrator/all-hooks.py") def pre_metadata_registration(context): path_to_delete = context.getPersistentMap().get("path") file_to_delete = File(path_to_delete) - file_to_delete.delete() + FileUtilities.deleteRecursively(file_to_delete) jythonHookTestTool.log("pre_metadata_registration") def process(tr):