diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/DynamicTransactionQueryFactory.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/DynamicTransactionQueryFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..0f30f274834f7208b70ebf1fed6e0be0f699e70e --- /dev/null +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/DynamicTransactionQueryFactory.java @@ -0,0 +1,41 @@ +/* + * 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; + +import javax.sql.DataSource; + +import net.lemnik.eodsql.DynamicTransactionQuery; +import net.lemnik.eodsql.QueryTool; +import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider; + +/** + * A factory class for creating dynamic transaction queries. + * + * @author Chandrasekhar Ramakrishnan + */ +public class DynamicTransactionQueryFactory +{ + /** + * Create a DynamicTransactionQuery for the given data source. + */ + public DynamicTransactionQuery createDynamicTransactionQuery(String dataSourceName) + { + DataSource dataSource = + ServiceProvider.getDataSourceProvider().getDataSource(dataSourceName); + return QueryTool.getQuery(dataSource, DynamicTransactionQuery.class); + } +} diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/ETLDaemon.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/ETLDaemon.java index 8b0cda24eb3ff8eb83eebf165ff60a0b582f0e03..d48f91516d10f12c1d264f39c585c29fb95da9f9 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/ETLDaemon.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/ETLDaemon.java @@ -331,7 +331,8 @@ public final class ETLDaemon TopLevelDataSetRegistratorGlobalState globalState = new TopLevelDataSetRegistratorGlobalState(dssCode, shareId, storeRootDir, openBISService, mailClient, dataSetValidator, dataSourceQueryService, - notifySuccessfulRegistration, threadParameters); + new DynamicTransactionQueryFactory(), notifySuccessfulRegistration, + threadParameters); ITopLevelDataSetRegistrator registrator = ClassUtils.create(ITopLevelDataSetRegistrator.class, threadParameters @@ -360,9 +361,10 @@ public final class ETLDaemon TopLevelDataSetRegistratorGlobalState globalState = new TopLevelDataSetRegistratorGlobalState(dssCode, shareId, storeRootDir, openBISService, mailClient, dataSetValidator, dataSourceQueryService, - notifySuccessfulRegistration, threadParameters, useIsFinishedMarkerFile, - deleteUnidentified, preRegistrationScriptOrNull, - postRegistrationScriptOrNull, validationScriptsOrNull); + new DynamicTransactionQueryFactory(), notifySuccessfulRegistration, + threadParameters, useIsFinishedMarkerFile, deleteUnidentified, + preRegistrationScriptOrNull, postRegistrationScriptOrNull, + validationScriptsOrNull); ITopLevelDataSetRegistrator registrator = ClassUtils diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/TopLevelDataSetRegistratorGlobalState.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/TopLevelDataSetRegistratorGlobalState.java index 47c23d72900db8417d652846a3a3cd255da8c5b2..59c86bd84d9c5e5dc00fa031514fcb71c2ebed7c 100644 --- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/TopLevelDataSetRegistratorGlobalState.java +++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/TopLevelDataSetRegistratorGlobalState.java @@ -64,6 +64,8 @@ public class TopLevelDataSetRegistratorGlobalState private final boolean deleteUnidentified; + private final DynamicTransactionQueryFactory dynamicTransactionQueryFactory; + private final String preRegistrationScriptOrNull; private final String postRegistrationScriptOrNull; @@ -85,11 +87,11 @@ public class TopLevelDataSetRegistratorGlobalState public TopLevelDataSetRegistratorGlobalState(String dssCode, String shareId, File storeRootDir, IEncapsulatedOpenBISService openBisService, IMailClient mailClient, IDataSetValidator dataSetValidator, IDataSourceQueryService dataSourceQueryService, - boolean notifySuccessfulRegistration, - ThreadParameters threadParameters) + DynamicTransactionQueryFactory dynamicTransactionQueryFactory, + boolean notifySuccessfulRegistration, ThreadParameters threadParameters) { this(dssCode, shareId, storeRootDir, openBisService, mailClient, dataSetValidator, - dataSourceQueryService, + dataSourceQueryService, dynamicTransactionQueryFactory, notifySuccessfulRegistration, threadParameters, threadParameters .useIsFinishedMarkerFile(), threadParameters.deleteUnidentified(), threadParameters.tryGetPreRegistrationScript(), threadParameters @@ -99,8 +101,10 @@ public class TopLevelDataSetRegistratorGlobalState public TopLevelDataSetRegistratorGlobalState(String dssCode, String shareId, File storeRootDir, IEncapsulatedOpenBISService openBisService, IMailClient mailClient, IDataSetValidator dataSetValidator, IDataSourceQueryService dataSourceQueryService, + DynamicTransactionQueryFactory dynamicTransactionQueryFactory, boolean notifySuccessfulRegistration, ThreadParameters threadParameters, boolean useIsFinishedMarkerFile, boolean deleteUnidentified, + String preRegistrationScriptOrNull, String postRegistrationScriptOrNull, String[] validationScriptsOrNull) { @@ -111,6 +115,7 @@ public class TopLevelDataSetRegistratorGlobalState this.mailClient = mailClient; this.dataSetValidator = dataSetValidator; this.dataSourceQueryService = dataSourceQueryService; + this.dynamicTransactionQueryFactory = dynamicTransactionQueryFactory; this.notifySuccessfulRegistration = notifySuccessfulRegistration; this.threadParameters = threadParameters; this.useIsFinishedMarkerFile = useIsFinishedMarkerFile; @@ -155,6 +160,11 @@ public class TopLevelDataSetRegistratorGlobalState return dataSourceQueryService; } + public DynamicTransactionQueryFactory getDynamicTransactionQueryFactory() + { + return dynamicTransactionQueryFactory; + } + public boolean isNotifySuccessfulRegistration() { return notifySuccessfulRegistration; 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 7b3d1b8ec8977a8f66fa7159d2c6c825f543a744..e79cdb405cac584d0d6bee5d25e2ffd6ac74384f 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 @@ -23,10 +23,9 @@ import java.util.List; import java.util.Map; import net.lemnik.eodsql.DynamicTransactionQuery; -import net.lemnik.eodsql.QueryTool; - import ch.systemsx.cisd.common.exceptions.NotImplementedException; import ch.systemsx.cisd.common.filesystem.FileUtilities; +import ch.systemsx.cisd.etlserver.DynamicTransactionQueryFactory; import ch.systemsx.cisd.etlserver.registrator.DataSetRegistrationDetails; import ch.systemsx.cisd.etlserver.registrator.DataSetRegistrationService; import ch.systemsx.cisd.etlserver.registrator.DataSetStorageAlgorithm; @@ -445,7 +444,10 @@ abstract class AbstractTransactionState<T extends DataSetInformation> DynamicTransactionQuery query = queriesToCommit.get(dataSourceName); if (null == query) { - query = QueryTool.getQuery(DynamicTransactionQuery.class); + DynamicTransactionQueryFactory factory = + registrationService.getRegistratorContext().getGlobalState() + .getDynamicTransactionQueryFactory(); + query = factory.createDynamicTransactionQuery(dataSourceName); queriesToCommit.put(dataSourceName, query); } return query; diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandlerTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandlerTest.java index 85414ba797adb11fa6466f98a5b8aa421fd71355..826dcb9c39fdbb894cd7c9d55edb0e9c46389596 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandlerTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandlerTest.java @@ -288,7 +288,7 @@ public final class TransferredDataSetHandlerTest extends AbstractFileSystemTestC new TopLevelDataSetRegistratorGlobalState("dss", ch.systemsx.cisd.openbis.dss.generic.shared.Constants.DEFAULT_SHARE_ID, workingDirectory, authorizedLimsService, mailClient, dataSetValidator, - null, true, threadParameters); + null, new DynamicTransactionQueryFactory(), true, threadParameters); context.checking(new Expectations() { @@ -807,7 +807,7 @@ public final class TransferredDataSetHandlerTest extends AbstractFileSystemTestC new TopLevelDataSetRegistratorGlobalState("dss", ch.systemsx.cisd.openbis.dss.generic.shared.Constants.DEFAULT_SHARE_ID, workingDirectory, authorizedLimsService, mailClient, dataSetValidator, - null, true, threadParameters); + null, new DynamicTransactionQueryFactory(), true, threadParameters); context.checking(new Expectations() { { 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 79c4c14261bf36f1112836efe34fe96236517e4f..89db4e3fc46130f43186d7f84c197e4aadf8f9de 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 @@ -22,9 +22,12 @@ import java.util.ArrayList; import java.util.List; import java.util.Properties; +import net.lemnik.eodsql.DynamicTransactionQuery; + import org.apache.commons.io.FileUtils; import org.jmock.Expectations; import org.jmock.Mockery; +import org.python.core.PyFunction; import org.python.util.PythonInterpreter; import org.testng.annotations.AfterMethod; import org.testng.annotations.AfterTest; @@ -39,7 +42,10 @@ import ch.systemsx.cisd.common.filesystem.QueueingPathRemoverService; import ch.systemsx.cisd.common.mail.IMailClient; import ch.systemsx.cisd.common.utilities.ExtendedProperties; import ch.systemsx.cisd.common.utilities.IDelegatedActionWithResult; +import ch.systemsx.cisd.etlserver.DataSetRegistrationAlgorithm; +import ch.systemsx.cisd.etlserver.DynamicTransactionQueryFactory; import ch.systemsx.cisd.etlserver.IStorageProcessorTransactional; +import ch.systemsx.cisd.etlserver.ITopLevelDataSetRegistratorDelegate; import ch.systemsx.cisd.etlserver.ITypeExtractor; import ch.systemsx.cisd.etlserver.ThreadParameters; import ch.systemsx.cisd.etlserver.TopLevelDataSetRegistratorGlobalState; @@ -68,7 +74,7 @@ public abstract class AbstractJythonDataSetHandlerTest extends AbstractFileSyste */ protected abstract String getRegistrationScriptsFolderPath(); - private static final String DATABASE_INSTANCE_UUID = "db-uuid"; + protected static final String DATABASE_INSTANCE_UUID = "db-uuid"; protected JythonTopLevelDataSetHandler<? extends DataSetInformation> handler; @@ -82,6 +88,8 @@ public abstract class AbstractJythonDataSetHandlerTest extends AbstractFileSyste protected IDataSourceQueryService dataSourceQueryService; + protected DynamicTransactionQuery dynamicTransactionQuery; + protected File stagingDirectory; protected File incomingDataSetFile; @@ -92,6 +100,10 @@ public abstract class AbstractJythonDataSetHandlerTest extends AbstractFileSyste protected File subDataSet2; + protected boolean didDataSetRollbackHappen; + + protected boolean didServiceRollbackHappen; + @BeforeTest public void init() { @@ -115,6 +127,7 @@ public abstract class AbstractJythonDataSetHandlerTest extends AbstractFileSyste dataSetValidator = context.mock(IDataSetValidator.class); mailClient = context.mock(IMailClient.class); dataSourceQueryService = context.mock(IDataSourceQueryService.class); + dynamicTransactionQuery = context.mock(DynamicTransactionQuery.class); stagingDirectory = new File(workingDirectory, "staging"); } @@ -147,11 +160,20 @@ public abstract class AbstractJythonDataSetHandlerTest extends AbstractFileSyste ThreadParameters threadParameters = new ThreadParameters(threadProperties, "jython-handler-test"); + DynamicTransactionQueryFactory myFactory = new DynamicTransactionQueryFactory() + { + @Override + public DynamicTransactionQuery createDynamicTransactionQuery(String dataSourceName) + { + return dynamicTransactionQuery; + } + }; + TopLevelDataSetRegistratorGlobalState globalState = new TopLevelDataSetRegistratorGlobalState("dss", ch.systemsx.cisd.openbis.dss.generic.shared.Constants.DEFAULT_SHARE_ID, workingDirectory, openBisService, mailClient, dataSetValidator, - dataSourceQueryService, true, threadParameters); + dataSourceQueryService, myFactory, true, threadParameters); return globalState; } @@ -168,6 +190,7 @@ public abstract class AbstractJythonDataSetHandlerTest extends AbstractFileSyste } }); } + /** * adds an extension to the Jython Path, so that all libraries in it will be visible to the * Jython environment. @@ -213,7 +236,6 @@ public abstract class AbstractJythonDataSetHandlerTest extends AbstractFileSyste return threadProperties; } - public static final class MockStorageProcessor implements IStorageProcessorTransactional { static MockStorageProcessor instance; @@ -226,9 +248,9 @@ public abstract class AbstractJythonDataSetHandlerTest extends AbstractFileSyste String dataSetInfoString; - private List<File> incomingDirs = new ArrayList<File>(); + protected List<File> incomingDirs = new ArrayList<File>(); - private List<File> rootDirs = new ArrayList<File>(); + protected List<File> rootDirs = new ArrayList<File>(); public MockStorageProcessor(ExtendedProperties props) { @@ -309,11 +331,21 @@ public abstract class AbstractJythonDataSetHandlerTest extends AbstractFileSyste } } - private class TestingDataSetHandler extends JythonTopLevelDataSetHandler<DataSetInformation> + protected class TestingDataSetHandler extends JythonTopLevelDataSetHandler<DataSetInformation> { - private final boolean shouldRegistrationFail; + protected final boolean shouldRegistrationFail; + + protected final boolean shouldReThrowRollbackException; + + protected boolean didRollbackServiceFunctionRun = false; + + protected boolean didRollbackDataSetRegistrationFunctionRun = false; + + protected boolean didTransactionRollbackHappen = false; - private final boolean shouldReThrowRollbackException; + protected boolean didRollbackTransactionFunctionRunHappen = false; + + protected boolean didCommitTransactionFunctionRunHappen = false; public TestingDataSetHandler(TopLevelDataSetRegistratorGlobalState globalState, boolean shouldRegistrationFail, boolean shouldReThrowRollbackException) @@ -341,6 +373,7 @@ public abstract class AbstractJythonDataSetHandlerTest extends AbstractFileSyste Throwable throwable) { super.rollback(service, throwable); + didServiceRollbackHappen = true; if (shouldReThrowRollbackException) { throw CheckedExceptionTunnel.wrapIfNecessary(throwable); @@ -358,6 +391,7 @@ public abstract class AbstractJythonDataSetHandlerTest extends AbstractFileSyste { super.didRollbackTransaction(service, transaction, algorithmRunner, throwable); + didTransactionRollbackHappen = true; if (shouldReThrowRollbackException) { throw CheckedExceptionTunnel.wrapIfNecessary(throwable); @@ -367,6 +401,77 @@ public abstract class AbstractJythonDataSetHandlerTest extends AbstractFileSyste } } + @Override + protected void invokeRollbackServiceFunction(PyFunction function, + DataSetRegistrationService<DataSetInformation> service, Throwable throwable) + { + super.invokeRollbackServiceFunction(function, service, throwable); + PythonInterpreter interpreter = + ((JythonDataSetRegistrationService<DataSetInformation>) service) + .getInterpreter(); + didRollbackServiceFunctionRun = + interpreter.get("didRollbackServiceFunctionRun", Boolean.class); + } + + @Override + protected void invokeRollbackDataSetRegistrationFunction(PyFunction function, + DataSetRegistrationService<DataSetInformation> service, + DataSetRegistrationAlgorithm registrationAlgorithm, Throwable throwable) + { + super.invokeRollbackDataSetRegistrationFunction(function, service, + registrationAlgorithm, throwable); + + PythonInterpreter interpreter = + ((JythonDataSetRegistrationService<DataSetInformation>) service) + .getInterpreter(); + didRollbackDataSetRegistrationFunctionRun = + interpreter.get("didRollbackServiceFunctionRun", Boolean.class); + } + + @Override + protected void invokeRollbackTransactionFunction(PyFunction function, + DataSetRegistrationService<DataSetInformation> service, + DataSetRegistrationTransaction<DataSetInformation> transaction, + DataSetStorageAlgorithmRunner<DataSetInformation> algorithmRunner, + Throwable throwable) + { + super.invokeRollbackTransactionFunction(function, service, transaction, + algorithmRunner, throwable); + + PythonInterpreter interpreter = + ((JythonDataSetRegistrationService<DataSetInformation>) service) + .getInterpreter(); + didRollbackTransactionFunctionRunHappen = + interpreter.get("didTransactionRollbackHappen", Boolean.class); + } + + @Override + protected void invokeCommitTransactionFunction(PyFunction function, + DataSetRegistrationService<DataSetInformation> service, + DataSetRegistrationTransaction<DataSetInformation> transaction) + { + super.invokeCommitTransactionFunction(function, service, transaction); + + PythonInterpreter interpreter = + ((JythonDataSetRegistrationService<DataSetInformation>) service) + .getInterpreter(); + didCommitTransactionFunctionRunHappen = + interpreter.get("didTransactionCommitHappen", Boolean.class); + } + + @Override + protected JythonDataSetRegistrationService<DataSetInformation> createJythonDataSetRegistrationService( + File aDataSetFile, DataSetInformation userProvidedDataSetInformationOrNull, + IDelegatedActionWithResult<Boolean> cleanAfterwardsAction, + ITopLevelDataSetRegistratorDelegate delegate, PythonInterpreter interpreter) + { + JythonDataSetRegistrationService<DataSetInformation> service = + new TestDataRegistrationService(this, aDataSetFile, + userProvidedDataSetInformationOrNull, cleanAfterwardsAction, + interpreter, shouldRegistrationFail); + return service; + } + } protected static class TestDataRegistrationService extends diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/DataSetStorageRollbackerTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/DataSetStorageRollbackerTest.java index 095fe884dcd37284cd88f4eb4646db608d3be8ae..f3e1832298bc12d5c00488e8dc91e8cb0345a30f 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/DataSetStorageRollbackerTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/DataSetStorageRollbackerTest.java @@ -30,13 +30,13 @@ import ch.systemsx.cisd.base.tests.AbstractFileSystemTestCase; import ch.systemsx.cisd.common.logging.LogCategory; import ch.systemsx.cisd.common.logging.LogFactory; import ch.systemsx.cisd.common.mail.IMailClient; +import ch.systemsx.cisd.etlserver.DynamicTransactionQueryFactory; import ch.systemsx.cisd.etlserver.IStorageProcessorTransactional; import ch.systemsx.cisd.etlserver.IStorageProcessorTransactional.UnstoreDataAction; import ch.systemsx.cisd.etlserver.ThreadParameters; import ch.systemsx.cisd.etlserver.TopLevelDataSetRegistratorGlobalState; import ch.systemsx.cisd.etlserver.registrator.AbstractOmniscientTopLevelDataSetRegistrator.OmniscientTopLevelDataSetRegistratorState; import ch.systemsx.cisd.etlserver.registrator.IDataSetOnErrorActionDecision.ErrorType; -import ch.systemsx.cisd.etlserver.registrator.JythonTopLevelDataSetRegistratorTest.MockStorageProcessor; import ch.systemsx.cisd.etlserver.validation.IDataSetValidator; import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; @@ -111,8 +111,8 @@ public class DataSetStorageRollbackerTest extends AbstractFileSystemTestCase TopLevelDataSetRegistratorGlobalState globalState = new TopLevelDataSetRegistratorGlobalState("dss", ch.systemsx.cisd.openbis.dss.generic.shared.Constants.DEFAULT_SHARE_ID, - workingDirectory, openBisService, mailClient, dataSetValidator, null, true, - threadParameters); + workingDirectory, openBisService, mailClient, dataSetValidator, null, + new DynamicTransactionQueryFactory(), true, threadParameters); return globalState; } @@ -123,8 +123,10 @@ public class DataSetStorageRollbackerTest extends AbstractFileSystemTestCase threadProperties.put(ThreadParameters.INCOMING_DATA_COMPLETENESS_CONDITION, ThreadParameters.INCOMING_DATA_COMPLETENESS_CONDITION_MARKER_FILE); threadProperties.put(ThreadParameters.DELETE_UNIDENTIFIED_KEY, "false"); - threadProperties.put(IStorageProcessorTransactional.STORAGE_PROCESSOR_KEY, - MockStorageProcessor.class.getName()); + threadProperties + .put(IStorageProcessorTransactional.STORAGE_PROCESSOR_KEY, + ch.systemsx.cisd.etlserver.registrator.AbstractJythonDataSetHandlerTest.MockStorageProcessor.class + .getName()); return threadProperties; } 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 13a64e918e23a09acdb0e2fda87e12d4c275f972..919ff6f3dfe3a447be317e9972a59c491afbab5e 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 @@ -20,55 +20,30 @@ 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.Collections; -import java.util.List; +import java.util.Map; import java.util.Properties; -import org.apache.commons.io.FileUtils; import org.hamcrest.core.IsAnything; import org.jmock.Expectations; -import org.jmock.Mockery; -import org.python.core.PyFunction; -import org.python.util.PythonInterpreter; import org.testng.annotations.AfterMethod; -import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeMethod; -import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; -import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel; -import ch.systemsx.cisd.base.exceptions.IOExceptionUnchecked; -import ch.systemsx.cisd.base.tests.AbstractFileSystemTestCase; +import ch.systemsx.cisd.common.eodsql.MockDataSet; import ch.systemsx.cisd.common.exceptions.ConfigurationFailureException; -import ch.systemsx.cisd.common.exceptions.UserFailureException; import ch.systemsx.cisd.common.filesystem.FileUtilities; -import ch.systemsx.cisd.common.filesystem.QueueingPathRemoverService; import ch.systemsx.cisd.common.logging.BufferedAppender; -import ch.systemsx.cisd.common.mail.IMailClient; import ch.systemsx.cisd.common.test.RecordingMatcher; -import ch.systemsx.cisd.common.utilities.ExtendedProperties; -import ch.systemsx.cisd.common.utilities.IDelegatedActionWithResult; -import ch.systemsx.cisd.etlserver.DataSetRegistrationAlgorithm; import ch.systemsx.cisd.etlserver.IStorageProcessorTransactional; -import ch.systemsx.cisd.etlserver.ITopLevelDataSetRegistratorDelegate; -import ch.systemsx.cisd.etlserver.ITypeExtractor; import ch.systemsx.cisd.etlserver.ThreadParameters; -import ch.systemsx.cisd.etlserver.TopLevelDataSetRegistratorGlobalState; -import ch.systemsx.cisd.etlserver.registrator.JythonTopLevelDataSetHandler.JythonDataSetRegistrationService; -import ch.systemsx.cisd.etlserver.registrator.api.v1.impl.DataSetRegistrationTransaction; -import ch.systemsx.cisd.etlserver.validation.IDataSetValidator; -import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; -import ch.systemsx.cisd.openbis.dss.generic.shared.dto.AtomicEntityOperationDetails; -import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; import ch.systemsx.cisd.openbis.dss.generic.shared.utils.DatasetLocationUtil; 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.ContainerDataSet; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseInstance; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityProperty; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment; @@ -81,7 +56,6 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.AtomicEntityOperationResult; import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetUpdatesDTO; import ch.systemsx.cisd.openbis.generic.shared.dto.NewExternalData; import ch.systemsx.cisd.openbis.generic.shared.dto.NewProperty; -import ch.systemsx.cisd.openbis.generic.shared.dto.StorageFormat; import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifierFactory; import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier; import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifierFactory; @@ -89,7 +63,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifierF /** * @author Chandrasekhar Ramakrishnan */ -public class JythonTopLevelDataSetRegistratorTest extends AbstractFileSystemTestCase +public class JythonTopLevelDataSetRegistratorTest extends AbstractJythonDataSetHandlerTest { private static final String SCRIPTS_FOLDER = "sourceTest/java/ch/systemsx/cisd/etlserver/registrator/"; @@ -98,8 +72,6 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractFileSystemTest private static final String CONTAINER_DATA_SET_CODE = "container-data-set-code"; - private static final String DATABASE_INSTANCE_UUID = "db-uuid"; - private static final DataSetType DATA_SET_TYPE = new DataSetType("O1"); private static final String EXPERIMENT_PERM_ID = "experiment-perm-id"; @@ -108,53 +80,14 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractFileSystemTest private static final String SAMPLE_PERM_ID = "sample-perm-id"; - private JythonTopLevelDataSetHandler<DataSetInformation> handler; - - private Mockery context; - - private IEncapsulatedOpenBISService openBisService; - - private IMailClient mailClient; - - private IDataSetValidator dataSetValidator; - - private File incomingDataSetFile; - - private File markerFile; - - private File subDataSet1; - - private File subDataSet2; - - private boolean didDataSetRollbackHappen; - - private boolean didServiceRollbackHappen; - private BufferedAppender logAppender; - @BeforeTest - public void init() - { - QueueingPathRemoverService.start(); - } - - @AfterTest - public void finish() - { - QueueingPathRemoverService.stop(); - } - @BeforeMethod @Override public void setUp() throws IOException { super.setUp(); - context = new Mockery(); - openBisService = context.mock(IEncapsulatedOpenBISService.class); - dataSetValidator = context.mock(IDataSetValidator.class); - mailClient = context.mock(IMailClient.class); - logAppender = new BufferedAppender(); didDataSetRollbackHappen = false; @@ -800,7 +733,7 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractFileSystemTest { setUpHomeDataBaseExpectations(); Properties threadProperties = createThreadPropertiesRelativeToScriptsFolder("search.py"); - createHandler(threadProperties, false); + createHandler(threadProperties, false, true); createData(); @@ -814,8 +747,11 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractFileSystemTest assertTrue(logAppender.getLogContent(), logAppender.getLogContent().length() > 0); TestingDataSetHandler theHandler = (TestingDataSetHandler) handler; + assertFalse(didServiceRollbackHappen); + assertFalse(theHandler.didTransactionRollbackHappen); assertFalse(theHandler.didRollbackDataSetRegistrationFunctionRun); assertFalse(theHandler.didRollbackServiceFunctionRun); + context.assertIsSatisfied(); } @@ -825,7 +761,7 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractFileSystemTest setUpHomeDataBaseExpectations(); Properties threadProperties = createThreadPropertiesRelativeToScriptsFolder("query-interface-test.py"); - createHandler(threadProperties, false); + createHandler(threadProperties, false, true); createData(); @@ -837,11 +773,34 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractFileSystemTest assertEquals(0, MockStorageProcessor.instance.calledCommitCount); TestingDataSetHandler theHandler = (TestingDataSetHandler) handler; - assertFalse(theHandler.didRollbackDataSetRegistrationFunctionRun); - assertFalse(theHandler.didRollbackServiceFunctionRun); + assertFalse(didServiceRollbackHappen); + assertFalse(theHandler.didTransactionRollbackHappen); + context.assertIsSatisfied(); + } + + @Test + public void testDynamicQueryCommitFail() + { + setUpHomeDataBaseExpectations(); + Properties threadProperties = + createThreadPropertiesRelativeToScriptsFolder("dynamic-query-failure-test.py"); + createHandler(threadProperties, false, true); + + createData(); + + setUpDynamicQueryExpectations(); + + handler.handle(markerFile); + + assertEquals(0, MockStorageProcessor.instance.incomingDirs.size()); + assertEquals(0, MockStorageProcessor.instance.calledCommitCount); + + TestingDataSetHandler theHandler = (TestingDataSetHandler) handler; + assertFalse(didServiceRollbackHappen); + assertFalse(theHandler.didTransactionRollbackHappen); context.assertIsSatisfied(); } - + private Properties createThreadProperties(String scriptPath) { Properties threadProperties = new Properties(); @@ -855,9 +814,9 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractFileSystemTest return threadProperties; } - private Properties createThreadPropertiesRelativeToScriptsFolder(String scriptPath) + protected String getRegistrationScriptsFolderPath() { - return createThreadProperties(SCRIPTS_FOLDER + scriptPath); + return SCRIPTS_FOLDER; } @Test @@ -887,55 +846,11 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractFileSystemTest context.assertIsSatisfied(); } - private File createDirectory(File parentDir, String directoryName) - { - final File file = new File(parentDir, directoryName); - file.mkdir(); - return file; - } - private void createHandler(Properties threadProperties, final boolean registrationShouldFail) { createHandler(threadProperties, registrationShouldFail, false); } - private void createHandler(Properties threadProperties, final boolean registrationShouldFail, - boolean shouldReThrowException) - { - TopLevelDataSetRegistratorGlobalState globalState = createGlobalState(threadProperties); - - handler = - new TestingDataSetHandler(globalState, registrationShouldFail, - shouldReThrowException); - } - - private TopLevelDataSetRegistratorGlobalState createGlobalState(Properties threadProperties) - { - ThreadParameters threadParameters = - new ThreadParameters(threadProperties, "jython-handler-test"); - - TopLevelDataSetRegistratorGlobalState globalState = - new TopLevelDataSetRegistratorGlobalState("dss", - ch.systemsx.cisd.openbis.dss.generic.shared.Constants.DEFAULT_SHARE_ID, - workingDirectory, openBisService, mailClient, dataSetValidator, null, true, - threadParameters); - return globalState; - } - - private void setUpHomeDataBaseExpectations() - { - context.checking(new Expectations() - { - { - - DatabaseInstance databaseInstance = new DatabaseInstance(); - databaseInstance.setUuid(DATABASE_INSTANCE_UUID); - one(openBisService).getHomeDatabaseInstance(); - will(returnValue(databaseInstance)); - } - }); - } - private void setUpSearchExpectations() { context.checking(new Expectations() @@ -960,317 +875,54 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractFileSystemTest searchCriteria = createTestSearchCriteria("SAMPLE_TYPE"); oneOf(openBisService).searchForSamples(searchCriteria); will(returnValue(Collections.EMPTY_LIST)); + + oneOf(openBisService) + .performEntityOperations( + with(any(ch.systemsx.cisd.openbis.generic.shared.dto.AtomicEntityOperationDetails.class))); } }); } - + private void setUpQueryExpectations() { context.checking(new Expectations() { { - + oneOf(dataSourceQueryService).select("path-info-db", + "SELECT * from data_set_files WHERE parent_id is NULL"); + Object[] args = + { 155555 }; + will(returnValue(new MockDataSet<Map<String, Object>>())); + oneOf(dataSourceQueryService).select("path-info-db", + "SELECT * from data_set_files WHERE parent_id = ?1", args); + will(returnValue(new MockDataSet<Map<String, Object>>())); } }); } - 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 implements IStorageProcessorTransactional - { - static MockStorageProcessor instance; - - int calledGetStoreRootDirectoryCount = 0; - - int calledCommitCount = 0; - - File storeRootDirectory; - - String dataSetInfoString; - - private List<File> incomingDirs = new ArrayList<File>(); - - private List<File> rootDirs = new ArrayList<File>(); - - public MockStorageProcessor(ExtendedProperties 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() - { - return new IStorageProcessorTransaction() - { - - private File storedFolder; - - public void storeData(DataSetInformation dataSetInformation, - ITypeExtractor typeExtractor, IMailClient mailClient, - File incomingDataSetDirectory, File rootDir) - { - incomingDirs.add(incomingDataSetDirectory); - rootDirs.add(rootDir); - dataSetInfoString = dataSetInformation.toString(); - try - { - FileUtils.copyDirectory(incomingDataSetDirectory, rootDir); - } 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; - } - }; - } - } - - private class TestingDataSetHandler extends JythonTopLevelDataSetHandler<DataSetInformation> + private void setUpDynamicQueryExpectations() { - private final boolean shouldRegistrationFail; - - private final boolean shouldReThrowRollbackException; - - private boolean didRollbackServiceFunctionRun = false; - - private boolean didRollbackDataSetRegistrationFunctionRun = false; - - private boolean didTransactionRollbackHappen = false; - - private boolean didRollbackTransactionFunctionRunHappen = false; - - private boolean didCommitTransactionFunctionRunHappen = false; - - public TestingDataSetHandler(TopLevelDataSetRegistratorGlobalState globalState, - boolean shouldRegistrationFail, boolean shouldReThrowRollbackException) - { - super(globalState); - this.shouldRegistrationFail = shouldRegistrationFail; - this.shouldReThrowRollbackException = shouldReThrowRollbackException; - } - - @Override - public void registerDataSetInApplicationServer(DataSetInformation dataSetInformation, - NewExternalData data) throws Throwable - { - if (shouldRegistrationFail) - { - throw new UserFailureException("Didn't work."); - } else - { - super.registerDataSetInApplicationServer(dataSetInformation, data); - } - } - - @Override - public void rollback(DataSetRegistrationService<DataSetInformation> service, - Throwable throwable) - { - super.rollback(service, throwable); - didServiceRollbackHappen = true; - if (shouldReThrowRollbackException) - { - throw CheckedExceptionTunnel.wrapIfNecessary(throwable); - } else - { - throwable.printStackTrace(); - } - } - - @Override - public void didRollbackTransaction(DataSetRegistrationService<DataSetInformation> service, - DataSetRegistrationTransaction<DataSetInformation> transaction, - DataSetStorageAlgorithmRunner<DataSetInformation> algorithmRunner, - Throwable throwable) - { - super.didRollbackTransaction(service, transaction, algorithmRunner, throwable); - - didTransactionRollbackHappen = true; - if (shouldReThrowRollbackException) - { - throw CheckedExceptionTunnel.wrapIfNecessary(throwable); - } else + context.checking(new Expectations() { - throwable.printStackTrace(); - } - } - - @Override - protected void invokeRollbackServiceFunction(PyFunction function, - DataSetRegistrationService<DataSetInformation> service, Throwable throwable) - { - super.invokeRollbackServiceFunction(function, service, throwable); - PythonInterpreter interpreter = - ((JythonDataSetRegistrationService<DataSetInformation>) service) - .getInterpreter(); - didRollbackServiceFunctionRun = - interpreter.get("didRollbackServiceFunctionRun", Boolean.class); - } - - @Override - protected void invokeRollbackDataSetRegistrationFunction(PyFunction function, - DataSetRegistrationService<DataSetInformation> service, - DataSetRegistrationAlgorithm registrationAlgorithm, Throwable throwable) - { - super.invokeRollbackDataSetRegistrationFunction(function, service, - registrationAlgorithm, throwable); - - PythonInterpreter interpreter = - ((JythonDataSetRegistrationService<DataSetInformation>) service) - .getInterpreter(); - didRollbackDataSetRegistrationFunctionRun = - interpreter.get("didRollbackServiceFunctionRun", Boolean.class); - } - - @Override - protected void invokeRollbackTransactionFunction(PyFunction function, - DataSetRegistrationService<DataSetInformation> service, - DataSetRegistrationTransaction<DataSetInformation> transaction, - DataSetStorageAlgorithmRunner<DataSetInformation> algorithmRunner, - Throwable throwable) - { - super.invokeRollbackTransactionFunction(function, service, transaction, - algorithmRunner, throwable); - - PythonInterpreter interpreter = - ((JythonDataSetRegistrationService<DataSetInformation>) service) - .getInterpreter(); - didRollbackTransactionFunctionRunHappen = - interpreter.get("didTransactionRollbackHappen", Boolean.class); - } - - @Override - protected void invokeCommitTransactionFunction(PyFunction function, - DataSetRegistrationService<DataSetInformation> service, - DataSetRegistrationTransaction<DataSetInformation> transaction) - { - super.invokeCommitTransactionFunction(function, service, transaction); - - PythonInterpreter interpreter = - ((JythonDataSetRegistrationService<DataSetInformation>) service) - .getInterpreter(); - didCommitTransactionFunctionRunHappen = - interpreter.get("didTransactionCommitHappen", Boolean.class); - } - - @Override - protected JythonDataSetRegistrationService<DataSetInformation> createJythonDataSetRegistrationService( - File aDataSetFile, DataSetInformation userProvidedDataSetInformationOrNull, - IDelegatedActionWithResult<Boolean> cleanAfterwardsAction, - ITopLevelDataSetRegistratorDelegate delegate, PythonInterpreter interpreter) - { - JythonDataSetRegistrationService<DataSetInformation> service = - new TestDataRegistrationService(this, aDataSetFile, - userProvidedDataSetInformationOrNull, cleanAfterwardsAction, - interpreter, shouldRegistrationFail); - return service; - } - - } - - protected static class TestDataRegistrationService extends - JythonDataSetRegistrationService<DataSetInformation> - { - private final boolean shouldRegistrationFail; - - /** - * @param registrator - * @param globalCleanAfterwardsAction - * @param interpreter - */ - public TestDataRegistrationService( - JythonTopLevelDataSetHandler<DataSetInformation> registrator, File aDataSetFile, - DataSetInformation userProvidedDataSetInformationOrNull, - IDelegatedActionWithResult<Boolean> globalCleanAfterwardsAction, - PythonInterpreter interpreter, boolean shouldRegistrationFail) - { - super(registrator, aDataSetFile, userProvidedDataSetInformationOrNull, - globalCleanAfterwardsAction, - new AbstractOmniscientTopLevelDataSetRegistrator.NoOpDelegate(), interpreter); - this.shouldRegistrationFail = shouldRegistrationFail; - } + { + oneOf(dynamicTransactionQuery) + .select("SELECT * from data_set_files WHERE parent_id is NULL", + (Object[]) null); + will(returnValue(new MockDataSet<Map<String, Object>>())); - @Override - public IEntityOperationService<DataSetInformation> getEntityRegistrationService() - { - return new TestEntityOperationService(getRegistrator(), shouldRegistrationFail); - } + oneOf(openBisService) + .performEntityOperations( + with(any(ch.systemsx.cisd.openbis.generic.shared.dto.AtomicEntityOperationDetails.class))); + } + }); } - protected static class TestEntityOperationService extends - DefaultEntityOperationService<DataSetInformation> + protected SearchCriteria createTestSearchCriteria(String typeString) { - - private final boolean shouldRegistrationFail; - - /** - * @param registrator - */ - public TestEntityOperationService( - AbstractOmniscientTopLevelDataSetRegistrator<DataSetInformation> registrator, - boolean shouldRegistrationFail) - { - super(registrator, new AbstractOmniscientTopLevelDataSetRegistrator.NoOpDelegate()); - this.shouldRegistrationFail = shouldRegistrationFail; - } - - @Override - public AtomicEntityOperationResult performOperationsInApplcationServer( - AtomicEntityOperationDetails<DataSetInformation> registrationDetails) - { - if (shouldRegistrationFail) - { - assert false; - } - return super.performOperationsInApplcationServer(registrationDetails); - } - + SearchCriteria sc = new SearchCriteria(); + sc.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.TYPE, typeString)); + sc.addMatchClause(MatchClause.createPropertyMatch("PROP", "VALUE")); + return sc; } } diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransactionTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransactionTest.java index ed641945656c7a1c7b55b051abdf83d7d0534b0b..4df92f78de45aebd653c9f4f5dffc867cca82ff9 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransactionTest.java +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransactionTest.java @@ -38,6 +38,7 @@ import ch.systemsx.cisd.common.filesystem.QueueingPathRemoverService; import ch.systemsx.cisd.common.logging.BufferedAppender; import ch.systemsx.cisd.common.mail.IMailClient; import ch.systemsx.cisd.common.utilities.ExtendedProperties; +import ch.systemsx.cisd.etlserver.DynamicTransactionQueryFactory; import ch.systemsx.cisd.etlserver.IStorageProcessorTransactional; import ch.systemsx.cisd.etlserver.ITypeExtractor; import ch.systemsx.cisd.etlserver.ThreadParameters; @@ -420,8 +421,8 @@ public class DataSetRegistrationTransactionTest extends AbstractFileSystemTestCa TopLevelDataSetRegistratorGlobalState globalState = new TopLevelDataSetRegistratorGlobalState("dss", ch.systemsx.cisd.openbis.dss.generic.shared.Constants.DEFAULT_SHARE_ID, - workingDirectory, openBisService, mailClient, dataSetValidator, null, true, - threadParameters); + workingDirectory, openBisService, mailClient, dataSetValidator, null, + new DynamicTransactionQueryFactory(), true, threadParameters); return globalState; } diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/dying-script.py b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/dying-script.py index bff9b7a9b803a64ce2b29fac2596a9d0c6b7f912..ea06f3ffa244ccf5f5f213dc13220279cf4011f4 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/dying-script.py +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/dying-script.py @@ -10,6 +10,5 @@ registrationDetails = factory.createRegistrationDetails() dataSetInformation = registrationDetails.getDataSetInformation() dataSetInformation.setExperimentIdentifier(identifier) registrationDetails.setDataSetType(dto.DataSetType("O1")); -futureDataSet = service.queueDataSetRegistration(io.File(incoming, "sub_data_set_1"), registrationDetails) None.non_existant_function() diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/dynamic-query-failure-test.py b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/dynamic-query-failure-test.py new file mode 100644 index 0000000000000000000000000000000000000000..2e52815bdc0b7865047c4a2733c73f4e5889a879 --- /dev/null +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/dynamic-query-failure-test.py @@ -0,0 +1,7 @@ +import sys + +# Execute a query +tr = service.transaction() +query = tr.getDatabaseQuery("path-info-db") +result = query.select("SELECT * from data_set_files WHERE parent_id is NULL", None) +sys.stdout.write("Roots: " + str(result.size()) + "\n") \ No newline at end of file diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/query-interface-test.py b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/query-interface-test.py index 8b8cd54f0f02dffc82033705b7fc0af51e339bb9..aaacabad30f8e472d1b4bf85f480d5e1e63cc822 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/query-interface-test.py +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/query-interface-test.py @@ -9,7 +9,7 @@ def execute_query(query_service, block, query, params=None): result.close() # Execute a query -query_service = service.getDataSourceQueryService() +query_service = state.getDataSourceQueryService() execute_query(query_service, lambda result: sys.stdout.write("Roots: " + str(result.size()) + "\n") , "SELECT * from data_set_files WHERE parent_id is NULL") execute_query(query_service, lambda result: sys.stdout.write("Level 1: " + str(result.size()) + "\n"), "SELECT * from data_set_files WHERE parent_id = ?1", [155555]) diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/rollback-dying-script.py b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/rollback-dying-script.py index dff78f3b76d945a15e9b5ad45fbe1c754564d8a8..d862febba1b0ad06ce9c38f51b5d5e9dab77289c 100644 --- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/rollback-dying-script.py +++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/rollback-dying-script.py @@ -18,6 +18,5 @@ registrationDetails = factory.createRegistrationDetails() dataSetInformation = registrationDetails.getDataSetInformation() dataSetInformation.setExperimentIdentifier(identifier) registrationDetails.setDataSetType(dto.DataSetType("O1")); -futureDataSet = service.queueDataSetRegistration(io.File(incoming, "sub_data_set_1"), registrationDetails) None.non_existant_function()