diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/phosphonetx/DataSetInfoExtractorForMSInjection.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/phosphonetx/DataSetInfoExtractorForMSInjection.java index cf2b6d65b8d998d35fbe748281a3e9938069f1d1..0f57e28f02a15200dd001bb10754ff923971960c 100644 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/phosphonetx/DataSetInfoExtractorForMSInjection.java +++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/phosphonetx/DataSetInfoExtractorForMSInjection.java @@ -17,28 +17,26 @@ package ch.systemsx.cisd.openbis.etlserver.phosphonetx; import java.io.File; -import java.text.SimpleDateFormat; import java.util.ArrayList; -import java.util.Date; import java.util.List; import java.util.Properties; import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException; import ch.systemsx.cisd.common.exceptions.UserFailureException; import ch.systemsx.cisd.common.filesystem.FileUtilities; -import ch.systemsx.cisd.common.utilities.ITimeProvider; import ch.systemsx.cisd.common.utilities.PropertyUtils; -import ch.systemsx.cisd.common.utilities.SystemTimeProvider; import ch.systemsx.cisd.etlserver.IDataSetInfoExtractor; import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider; import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; 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; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSample; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleTypePropertyType; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.DatabaseInstanceIdentifier; +import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier; /** * Data set info extractor for MS injection data sets. Information is extracted from a properties @@ -53,35 +51,30 @@ public class DataSetInfoExtractorForMSInjection implements IDataSetInfoExtractor static final String DEFAULT_MS_INJECTION_PROPERTIES_FILE = "ms-injection.properties"; static final String PROJECT_CODE_KEY = "PROJECT_CODE"; - static final String MZXML_FILENAME_KEY = "MZXML_FILENAME"; + static final String EXPERIMENT_CODE_KEY = "EXPERIMENT_CODE"; + static final String SAMPLE_CODE_KEY = "SAMPLE_CODE"; static final String GROUP_CODE = "MS_DATA"; + static final String EXPERIMENT_TYPE_CODE = "MS_INJECT"; static final String SAMPLE_TYPE_CODE = "MS_INJECTION"; - private static final SimpleDateFormat EXPERIMENT_CODE_TEMPLATE = - new SimpleDateFormat("yyyy-MM"); - private final String msInjectionPropertiesFileName; private final IEncapsulatedOpenBISService service; - private final ITimeProvider timeProvider; - public DataSetInfoExtractorForMSInjection(Properties properties) { this(properties.getProperty(MS_INJECTION_PROPERTIES_FILE_KEY, - DEFAULT_MS_INJECTION_PROPERTIES_FILE), ServiceProvider.getOpenBISService(), - SystemTimeProvider.SYSTEM_TIME_PROVIDER); + DEFAULT_MS_INJECTION_PROPERTIES_FILE), ServiceProvider.getOpenBISService()); } DataSetInfoExtractorForMSInjection(String msInjectionPropertiesFileName, - IEncapsulatedOpenBISService service, ITimeProvider timeProvider) + IEncapsulatedOpenBISService service) { this.msInjectionPropertiesFileName = msInjectionPropertiesFileName; this.service = service; - this.timeProvider = timeProvider; } @@ -93,12 +86,12 @@ public class DataSetInfoExtractorForMSInjection implements IDataSetInfoExtractor loadMSInjectionProperties(incomingDataSetPath); DataSetInformation info = new DataSetInformation(); info.setGroupCode(GROUP_CODE); - info.setSampleCode(PropertyUtils.getMandatoryProperty(properties, MZXML_FILENAME_KEY)); + info.setSampleCode(PropertyUtils.getMandatoryProperty(properties, SAMPLE_CODE_KEY)); NewSample sample = new NewSample(); SampleType sampleType = new SampleType(); sampleType.setCode(SAMPLE_TYPE_CODE); sample.setSampleType(sampleType); - sample.setExperimentIdentifier(createExperimentIdentifer(properties)); + sample.setExperimentIdentifier(getOrCreateExperiment(properties)); sample.setIdentifier(info.getSampleIdentifier().toString()); List<EntityProperty> sampleProperties = createSampleProperties(properties); sample.setProperties(sampleProperties.toArray(new EntityProperty[sampleProperties.size()])); @@ -106,15 +99,19 @@ public class DataSetInfoExtractorForMSInjection implements IDataSetInfoExtractor return info; } - private String createExperimentIdentifer(Properties msInjectionProperties) + private String getOrCreateExperiment(Properties msInjectionProperties) { String projectCode = PropertyUtils.getMandatoryProperty(msInjectionProperties, PROJECT_CODE_KEY); String experimentCode = - EXPERIMENT_CODE_TEMPLATE.format(new Date(timeProvider.getTimeInMilliseconds())); - return DatabaseInstanceIdentifier.Constants.IDENTIFIER_SEPARATOR + GROUP_CODE - + DatabaseInstanceIdentifier.Constants.IDENTIFIER_SEPARATOR + projectCode - + DatabaseInstanceIdentifier.Constants.IDENTIFIER_SEPARATOR + experimentCode; + PropertyUtils.getMandatoryProperty(msInjectionProperties, EXPERIMENT_CODE_KEY); + ExperimentIdentifier identifier = new ExperimentIdentifier(null, GROUP_CODE, projectCode, experimentCode); + Experiment experiment = service.tryToGetExperiment(identifier); + if (experiment == null) + { + service.registerExperiment(new NewExperiment(identifier.toString(), EXPERIMENT_TYPE_CODE)); + } + return identifier.toString(); } private List<EntityProperty> createSampleProperties(Properties msInjectionProperties) diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/public/index.html b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/public/index.html index 609dc0c139f825777a1748b448568a276862799a..b6a4477b841a06f0fffa82ace463a1a17b750b50 100644 --- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/public/index.html +++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/phosphonetx/client/web/public/index.html @@ -6,7 +6,19 @@ <!-- // This script loads your compiled module. If you add any GWT meta tags, they must be added before this line. --> -<script language="javascript" src="ch.systemsx.cisd.openbis.plugin.phosphonetx.OpenBIS.nocache.js"></script> +<script language="javascript" + src="ch.systemsx.cisd.openbis.plugin.phosphonetx.OpenBIS.nocache.js"></script> +<script language="JavaScript"> + // confirmation on exit depends on whether user is logged in + var allowConfirmOnExit = false; + window.onbeforeunload = confirmExit; + function confirmExit() + { + if (allowConfirmOnExit) { + return "WARNING: By doing this you will in fact leave openBIS!"; + } + } +</script> <link rel="shortcut icon" href="images/favicon.ico" /> <link rel="icon" type="image/png" href="images/favicon.png" /> @@ -16,5 +28,36 @@ // The body can have arbitrary html, or you can leave the body empty if you want to create a completely dynamic ui. --> <body> +<!-- Required by IE (GWT 1.7) --> +<iframe id="__gwt_historyFrame" style="width: 0; height: 0; border: 0"></iframe> +<div id="openbis_login_div" style="visibility: hidden"> +<form id="openbis_login_form" method="post" action="javascript:;"> +<table> + <tbody> + <tr> + <td><span>User:</span></td> + <td><input type="text" id="openbis_login_username" + name="openbis-username" style="width: 150px;"></td> + <td> </td> + </tr> + <tr> + <td><span>Password:</span></td> + <td><input type="password" id="openbis_login_password" + name="openbis-password" style="width: 150px;"></td> + <td> </td> + </tr> + <tr> + <td rowspan="3"> </td> + </tr> + <tr> + <td> </td> + <td> </td> + <td align="right"><input type="submit" id="openbis_login_submit" + value="Login"></td> + </tr> + </tbody> +</table> +</form> +</div> </body> </html> diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/phosphonetx/DataSetInfoExtractorForMSInjectionTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/phosphonetx/DataSetInfoExtractorForMSInjectionTest.java index 5eebb1441b5e596df922d323d9286d5c084d8950..0283bc0c54c474fd61f1aa06c7ab09d813027719 100644 --- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/phosphonetx/DataSetInfoExtractorForMSInjectionTest.java +++ b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/phosphonetx/DataSetInfoExtractorForMSInjectionTest.java @@ -17,9 +17,11 @@ package ch.systemsx.cisd.openbis.etlserver.phosphonetx; import static ch.systemsx.cisd.openbis.etlserver.phosphonetx.DataSetInfoExtractorForMSInjection.DEFAULT_MS_INJECTION_PROPERTIES_FILE; +import static ch.systemsx.cisd.openbis.etlserver.phosphonetx.DataSetInfoExtractorForMSInjection.EXPERIMENT_CODE_KEY; +import static ch.systemsx.cisd.openbis.etlserver.phosphonetx.DataSetInfoExtractorForMSInjection.EXPERIMENT_TYPE_CODE; import static ch.systemsx.cisd.openbis.etlserver.phosphonetx.DataSetInfoExtractorForMSInjection.GROUP_CODE; -import static ch.systemsx.cisd.openbis.etlserver.phosphonetx.DataSetInfoExtractorForMSInjection.MZXML_FILENAME_KEY; import static ch.systemsx.cisd.openbis.etlserver.phosphonetx.DataSetInfoExtractorForMSInjection.PROJECT_CODE_KEY; +import static ch.systemsx.cisd.openbis.etlserver.phosphonetx.DataSetInfoExtractorForMSInjection.SAMPLE_CODE_KEY; import static ch.systemsx.cisd.openbis.etlserver.phosphonetx.DataSetInfoExtractorForMSInjection.SAMPLE_TYPE_CODE; import java.io.File; @@ -43,16 +45,18 @@ import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel; import ch.systemsx.cisd.base.tests.AbstractFileSystemTestCase; import ch.systemsx.cisd.common.exceptions.ConfigurationFailureException; import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.common.utilities.ITimeProvider; import ch.systemsx.cisd.etlserver.IDataSetInfoExtractor; import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; +import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSample; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleTypePropertyType; import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.DatabaseInstanceIdentifier; +import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier; /** * @@ -62,18 +66,18 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.DatabaseInstanceId public class DataSetInfoExtractorForMSInjectionTest extends AbstractFileSystemTestCase { private static final String PROJECT_CODE = "MS2"; - private static final String MZXML_FILENAME = "U09-1242"; + private static final String EXPERIMENT_CODE = "2010-02"; + private static final String SAMPLE_CODE = "U09-1242"; private static final String SAMPLE_IDENTIFIER = DatabaseInstanceIdentifier.Constants.IDENTIFIER_SEPARATOR + GROUP_CODE - + DatabaseInstanceIdentifier.Constants.IDENTIFIER_SEPARATOR + MZXML_FILENAME; + + DatabaseInstanceIdentifier.Constants.IDENTIFIER_SEPARATOR + SAMPLE_CODE; private static final String EXPERIMENT_IDENTIFIER = DatabaseInstanceIdentifier.Constants.IDENTIFIER_SEPARATOR + GROUP_CODE + DatabaseInstanceIdentifier.Constants.IDENTIFIER_SEPARATOR + PROJECT_CODE - + DatabaseInstanceIdentifier.Constants.IDENTIFIER_SEPARATOR + "1973-04"; + + DatabaseInstanceIdentifier.Constants.IDENTIFIER_SEPARATOR + EXPERIMENT_CODE; private Mockery context; private IEncapsulatedOpenBISService service; - private ITimeProvider timeProvider; private IDataSetInfoExtractor extractor; private File dataSet; @@ -82,10 +86,9 @@ public class DataSetInfoExtractorForMSInjectionTest extends AbstractFileSystemTe { context = new Mockery(); service = context.mock(IEncapsulatedOpenBISService.class); - timeProvider = context.mock(ITimeProvider.class); extractor = new DataSetInfoExtractorForMSInjection(DEFAULT_MS_INJECTION_PROPERTIES_FILE, - service, timeProvider); + service); dataSet = new File(workingDirectory, "data-set"); dataSet.mkdirs(); } @@ -132,7 +135,7 @@ public class DataSetInfoExtractorForMSInjectionTest extends AbstractFileSystemTe } @Test - public void testMissingMZXML() + public void testMissingSampleCode() { Properties properties = new Properties(); save(properties, DEFAULT_MS_INJECTION_PROPERTIES_FILE); @@ -143,7 +146,7 @@ public class DataSetInfoExtractorForMSInjectionTest extends AbstractFileSystemTe fail("ConfigurationFailureException expected"); } catch (ConfigurationFailureException ex) { - assertEquals("Given key '" + MZXML_FILENAME_KEY + "' not found in properties '[]'", ex + assertEquals("Given key '" + SAMPLE_CODE_KEY + "' not found in properties '[]'", ex .getMessage()); } @@ -154,8 +157,8 @@ public class DataSetInfoExtractorForMSInjectionTest extends AbstractFileSystemTe public void testMissingProjectCode() { Properties properties = new Properties(); - - properties.setProperty(MZXML_FILENAME_KEY, MZXML_FILENAME); + + properties.setProperty(SAMPLE_CODE_KEY, SAMPLE_CODE); save(properties, DEFAULT_MS_INJECTION_PROPERTIES_FILE); try @@ -165,9 +168,30 @@ public class DataSetInfoExtractorForMSInjectionTest extends AbstractFileSystemTe } catch (ConfigurationFailureException ex) { assertEquals("Given key '" + PROJECT_CODE_KEY + "' not found in properties '[" - + MZXML_FILENAME_KEY + "]'", ex.getMessage()); + + SAMPLE_CODE_KEY + "]'", ex.getMessage()); } - + + context.assertIsSatisfied(); + } + + @Test + public void testMissingExperimentCode() + { + Properties properties = new Properties(); + properties.setProperty(SAMPLE_CODE_KEY, SAMPLE_CODE); + properties.setProperty(PROJECT_CODE_KEY, PROJECT_CODE); + save(properties, DEFAULT_MS_INJECTION_PROPERTIES_FILE); + + try + { + extractor.getDataSetInformation(dataSet, service); + fail("ConfigurationFailureException expected"); + } catch (ConfigurationFailureException ex) + { + assertEquals("Given key '" + EXPERIMENT_CODE_KEY + "' not found in properties '[" + + PROJECT_CODE_KEY + ", " + SAMPLE_CODE_KEY + "]'", ex.getMessage()); + } + context.assertIsSatisfied(); } @@ -176,12 +200,13 @@ public class DataSetInfoExtractorForMSInjectionTest extends AbstractFileSystemTe { Properties properties = new Properties(); properties.setProperty(PROJECT_CODE_KEY, PROJECT_CODE); - properties.setProperty(MZXML_FILENAME_KEY, MZXML_FILENAME); + properties.setProperty(SAMPLE_CODE_KEY, SAMPLE_CODE); + properties.setProperty(EXPERIMENT_CODE_KEY, EXPERIMENT_CODE); properties.setProperty("TEMPERATURE", "47.11"); save(properties, DEFAULT_MS_INJECTION_PROPERTIES_FILE); - SampleTypePropertyType pt1 = createPropertyType(MZXML_FILENAME_KEY, true); + SampleTypePropertyType pt1 = createPropertyType(SAMPLE_CODE_KEY, true); SampleTypePropertyType pt2 = createPropertyType("VOLUME", false); - prepareTimeProviderAndGetSampleType(pt1, pt2); + prepareGetExperimentAndGetSampleType(false, pt1, pt2); context.checking(new Expectations() { { @@ -203,7 +228,7 @@ public class DataSetInfoExtractorForMSInjectionTest extends AbstractFileSystemTe map.put(property.getPropertyType().getCode(), property); } - assertEquals(MZXML_FILENAME, map.get(MZXML_FILENAME_KEY).getValue()); + assertEquals(SAMPLE_CODE, map.get(SAMPLE_CODE_KEY).getValue()); assertEquals(1, map.size()); return true; } @@ -221,7 +246,7 @@ public class DataSetInfoExtractorForMSInjectionTest extends AbstractFileSystemTe DataSetInformation info = extractor.getDataSetInformation(dataSet, service); assertEquals(GROUP_CODE, info.getGroupCode()); - assertEquals(MZXML_FILENAME, info.getSampleCode()); + assertEquals(SAMPLE_CODE, info.getSampleCode()); assertEquals(null, info.getExperimentIdentifier()); context.assertIsSatisfied(); @@ -232,12 +257,13 @@ public class DataSetInfoExtractorForMSInjectionTest extends AbstractFileSystemTe { Properties properties = new Properties(); properties.setProperty(PROJECT_CODE_KEY, PROJECT_CODE); - properties.setProperty(MZXML_FILENAME_KEY, MZXML_FILENAME); + properties.setProperty(SAMPLE_CODE_KEY, SAMPLE_CODE); + properties.setProperty(EXPERIMENT_CODE_KEY, EXPERIMENT_CODE); save(properties, DEFAULT_MS_INJECTION_PROPERTIES_FILE); - SampleTypePropertyType pt1 = createPropertyType(MZXML_FILENAME_KEY, true); + SampleTypePropertyType pt1 = createPropertyType(SAMPLE_CODE_KEY, true); SampleTypePropertyType pt2 = createPropertyType("VOLUME", true); SampleTypePropertyType pt3 = createPropertyType("TEMPERATURE", true); - prepareTimeProviderAndGetSampleType(pt1, pt2, pt3); + prepareGetExperimentAndGetSampleType(true, pt1, pt2, pt3); try { @@ -252,14 +278,24 @@ public class DataSetInfoExtractorForMSInjectionTest extends AbstractFileSystemTe context.assertIsSatisfied(); } - private void prepareTimeProviderAndGetSampleType( - final SampleTypePropertyType... sampleTypePropertyTypes) + private void prepareGetExperimentAndGetSampleType( + final boolean experimentExists, final SampleTypePropertyType... sampleTypePropertyTypes) { context.checking(new Expectations() { { - one(timeProvider).getTimeInMilliseconds(); - will(returnValue(4711L * 4711 * 4711)); + ExperimentIdentifier identifier = new ExperimentIdentifier(null, GROUP_CODE, PROJECT_CODE, + EXPERIMENT_CODE); + one(service).tryToGetExperiment(identifier + ); + will(returnValue(experimentExists ? new Experiment() : null)); + + if (experimentExists == false) + { + one(service).registerExperiment( + new NewExperiment(identifier.toString(), EXPERIMENT_TYPE_CODE)); + } + one(service).getSampleType(DataSetInfoExtractorForMSInjection.SAMPLE_TYPE_CODE); SampleType sampleType = new SampleType(); sampleType.setSampleTypePropertyTypes(Arrays.asList(sampleTypePropertyTypes));