From 1bb91bcd36918b25025ac6d69efea0b5df14cdae Mon Sep 17 00:00:00 2001 From: ribeaudc <ribeaudc> Date: Wed, 13 Aug 2008 09:52:41 +0000 Subject: [PATCH] [LMS-531] change: - 'database_instance_code' to 'database_instance' (same as experiment identifier). - 'SampleWithOwner' should override 'equals' and 'hashCode' methods. add: - 'instance_global_code'. SVN: 7855 --- .../cisd/bds/AbstractDataStructure.java | 6 +- .../systemsx/cisd/bds/DataStructureV1_0.java | 2 +- .../systemsx/cisd/bds/DataStructureV1_1.java | 35 +++++- .../cisd/bds/ExperimentIdentifier.java | 2 + .../java/ch/systemsx/cisd/bds/Sample.java | 4 +- .../ch/systemsx/cisd/bds/SampleWithOwner.java | 116 ++++++++++++++---- .../cisd/bds/DataStructureV1_0Test.java | 11 -- .../cisd/bds/DataStructureV1_1Test.java | 54 +++++++- .../cisd/bds/SampleWithOwnerTest.java | 35 ++++-- integration-tests/run.sh | 3 +- 10 files changed, 206 insertions(+), 62 deletions(-) diff --git a/bds/source/java/ch/systemsx/cisd/bds/AbstractDataStructure.java b/bds/source/java/ch/systemsx/cisd/bds/AbstractDataStructure.java index ea17fb02c90..fdeaa6fe616 100644 --- a/bds/source/java/ch/systemsx/cisd/bds/AbstractDataStructure.java +++ b/bds/source/java/ch/systemsx/cisd/bds/AbstractDataStructure.java @@ -121,7 +121,7 @@ abstract class AbstractDataStructure implements IDataStructure, IDataStructureHa mountStorage(); performOpening(); Version loadedVersion = Version.loadFrom(root); - if (loadedVersion.isBackwardsCompatibleWith(getVersion()) == false) + if (getVersion().isBackwardsCompatibleWith(loadedVersion) == false) { throw new DataStructureException("Version of loaded data structure is " + loadedVersion + " which is not backward compatible with " + getVersion()); @@ -134,8 +134,8 @@ abstract class AbstractDataStructure implements IDataStructure, IDataStructureHa assertOpenOrCreated(); getVersion().saveTo(root); performClosing(); - //TODO 2008-07-03, Bernd Rinn: make this optional - //assertValid(); + // TODO 2008-07-03, Bernd Rinn: make this optional + // assertValid(); storage.unmount(); } } diff --git a/bds/source/java/ch/systemsx/cisd/bds/DataStructureV1_0.java b/bds/source/java/ch/systemsx/cisd/bds/DataStructureV1_0.java index 654d46bbe80..5fb136cd34f 100644 --- a/bds/source/java/ch/systemsx/cisd/bds/DataStructureV1_0.java +++ b/bds/source/java/ch/systemsx/cisd/bds/DataStructureV1_0.java @@ -335,7 +335,7 @@ public class DataStructureV1_0 extends AbstractDataStructure implements IDataStr } @Override - public final void performClosing() + public void performClosing() { super.performClosing(); final IDirectory metaDataDirectory = getMetaDataDirectory(); diff --git a/bds/source/java/ch/systemsx/cisd/bds/DataStructureV1_1.java b/bds/source/java/ch/systemsx/cisd/bds/DataStructureV1_1.java index 97944863da5..89e62b5df89 100644 --- a/bds/source/java/ch/systemsx/cisd/bds/DataStructureV1_1.java +++ b/bds/source/java/ch/systemsx/cisd/bds/DataStructureV1_1.java @@ -34,6 +34,26 @@ public final class DataStructureV1_1 extends DataStructureV1_0 super(storage); } + /** + * Returns the sample with its owner (a group or a database instance). + * <p> + * This is only available in version 1.1. Using this method with data structure version 1.0 + * throws an exception. + * </p> + * + * @throws DataStructureException if trying to use this method with data structure of version + * 1.0. + */ + public final SampleWithOwner getSampleWithOwner() + { + final Sample sample = getSample(); + if (sample instanceof SampleWithOwner == false) + { + throw new DataStructureException("Can not be used in data structure v1.0."); + } + return (SampleWithOwner) sample; + } + // // DataStructureV1_0 // @@ -53,6 +73,7 @@ public final class DataStructureV1_1 extends DataStructureV1_0 * * @throws DataStructureException if the sample hasn't be loaded nor hasn't be set by * {@link #setSample(Sample)}. + * @return a {@link Sample} or {@link SampleWithOwner} (if v1.1). */ @Override public final Sample getSample() @@ -78,7 +99,19 @@ public final class DataStructureV1_1 extends DataStructureV1_0 assert sample != null : "Unspecified sample."; assert sample instanceof SampleWithOwner : "Must be an instance of SampleWithOwner."; assertOpenOrCreated(); - ((SampleWithOwner) sample).saveTo(getMetaDataDirectory()); + sample.saveTo(getMetaDataDirectory()); } + @Override + public final void performClosing() + { + if (getSample() instanceof SampleWithOwner) + { + super.performClosing(); + } else + { + throw new DataStructureException( + "The owner (group or database instance) has not been set."); + } + } } diff --git a/bds/source/java/ch/systemsx/cisd/bds/ExperimentIdentifier.java b/bds/source/java/ch/systemsx/cisd/bds/ExperimentIdentifier.java index 6494ed7ba4d..b927c633825 100644 --- a/bds/source/java/ch/systemsx/cisd/bds/ExperimentIdentifier.java +++ b/bds/source/java/ch/systemsx/cisd/bds/ExperimentIdentifier.java @@ -31,6 +31,8 @@ public class ExperimentIdentifier implements IStorable static final String INSTANCE_CODE = "instance_code"; + static final String INSTANCE_GLOBAL_CODE = "instance_global_code"; + static final String GROUP_CODE = "group_code"; static final String PROJECT_CODE = "project_code"; diff --git a/bds/source/java/ch/systemsx/cisd/bds/Sample.java b/bds/source/java/ch/systemsx/cisd/bds/Sample.java index 3c149fbb7e8..a6c4c35e4a7 100644 --- a/bds/source/java/ch/systemsx/cisd/bds/Sample.java +++ b/bds/source/java/ch/systemsx/cisd/bds/Sample.java @@ -129,7 +129,7 @@ public class Sample implements IStorable // @Override - public final boolean equals(final Object obj) + public boolean equals(final Object obj) { if (obj == this) { @@ -146,7 +146,7 @@ public class Sample implements IStorable } @Override - public final int hashCode() + public int hashCode() { final HashCodeBuilder builder = new HashCodeBuilder(); builder.append(code); diff --git a/bds/source/java/ch/systemsx/cisd/bds/SampleWithOwner.java b/bds/source/java/ch/systemsx/cisd/bds/SampleWithOwner.java index 118de2b1da8..6ad1f29f6f3 100644 --- a/bds/source/java/ch/systemsx/cisd/bds/SampleWithOwner.java +++ b/bds/source/java/ch/systemsx/cisd/bds/SampleWithOwner.java @@ -16,6 +16,9 @@ package ch.systemsx.cisd.bds; +import org.apache.commons.lang.builder.EqualsBuilder; +import org.apache.commons.lang.builder.HashCodeBuilder; + import ch.systemsx.cisd.bds.exception.DataStructureException; import ch.systemsx.cisd.bds.storage.IDirectory; @@ -27,27 +30,33 @@ import ch.systemsx.cisd.bds.storage.IDirectory; */ public final class SampleWithOwner extends Sample { - static final String GROUP_CODE = "group_code"; + static final String GROUP_CODE = ExperimentIdentifier.GROUP_CODE; + + static final String INSTANCE_CODE = ExperimentIdentifier.INSTANCE_CODE; - static final String DATABASE_INSTANCE_CODE = "database_instance_code"; + static final String INSTANCE_GLOBAL_CODE = ExperimentIdentifier.INSTANCE_GLOBAL_CODE; private final String groupCode; - private final String databaseInstanceCode; + private final String instanceCode; + + private final String instanceGlobalCode; /** * Creates an instance for the specified {@link Sample}, group code and database instance code * of the sample. * * @param groupCode A non-<code>null</code> string of the group code. Could be empty. - * @param databaseInstanceCode A non-<code>null</code> string of the database instance code. - * Could be empty. + * @param instanceCode A non-<code>null</code> string of the database instance code. Could + * not be empty. + * @param instanceGlobalCode A non-<code>null</code> string of the database instance global + * code (aka <i>UUID</i>). Could not be empty. */ - public SampleWithOwner(final Sample sample, final String groupCode, - final String databaseInstanceCode) + public SampleWithOwner(final Sample sample, final String instanceGlobalCode, + final String instanceCode, final String groupCode) { - this(sample.getCode(), sample.getTypeCode(), sample.getTypeDescription(), groupCode, - databaseInstanceCode); + this(sample.getCode(), sample.getTypeCode(), sample.getTypeDescription(), + instanceGlobalCode, instanceCode, groupCode); } /** @@ -55,26 +64,35 @@ public final class SampleWithOwner extends Sample * database instance code of the sample. * * @param groupCode A non-<code>null</code> string of the group code. Could be empty. - * @param databaseInstanceCode A non-<code>null</code> string of the database instance code. - * Could be empty. + * @param instanceCode A non-<code>null</code> string of the database instance code. Could + * not be empty. + * @param instanceGlobalCode A non-<code>null</code> string of the database instance global + * code (aka <i>UUID</i>). Could not be empty. */ public SampleWithOwner(final String code, final String typeCode, final String typeDescription, - final String groupCode, final String databaseInstanceCode) + final String instanceGlobalCode, final String instanceCode, final String groupCode) { super(code, typeCode, typeDescription); assert groupCode != null : "Undefined group code."; - assert databaseInstanceCode != null : "Undefined database instance code."; - assertNonEmptyDatabaseInstanceCode(databaseInstanceCode); + assert instanceCode != null : "Undefined database instance code."; + assert instanceGlobalCode != null : "Undefined database instance global code."; + assertNonEmptyInstanceCodes(instanceGlobalCode, instanceCode); + this.instanceGlobalCode = instanceGlobalCode; + this.instanceCode = instanceCode; this.groupCode = groupCode; - this.databaseInstanceCode = databaseInstanceCode; } - private final static void assertNonEmptyDatabaseInstanceCode(final String databaseInstanceCode) + private final static void assertNonEmptyInstanceCodes(final String instanceGlobalCode, + final String instanceCode) { - if (databaseInstanceCode.length() == 0) + if (instanceCode.length() == 0) { throw new DataStructureException("Empty database instance code."); } + if (instanceGlobalCode.length() == 0) + { + throw new DataStructureException("Empty database instance global code."); + } } public final String getGroupCode() @@ -82,9 +100,14 @@ public final class SampleWithOwner extends Sample return groupCode; } - public final String getDatabaseInstanceCode() + public final String getInstanceCode() + { + return instanceCode; + } + + public final String getInstanceGlobalCode() { - return databaseInstanceCode; + return instanceGlobalCode; } // @@ -104,9 +127,10 @@ public final class SampleWithOwner extends Sample final String code = Utilities.getTrimmedString(folder, CODE); final String typeCode = Utilities.getTrimmedString(folder, TYPE_CODE); final String groupCode = Utilities.getTrimmedString(folder, GROUP_CODE); - final String databaseInstanceCode = - Utilities.getTrimmedString(folder, DATABASE_INSTANCE_CODE); - return new SampleWithOwner(code, typeCode, typeDescription, groupCode, databaseInstanceCode); + final String instanceCode = Utilities.getTrimmedString(folder, INSTANCE_CODE); + final String instanceGlobalCode = Utilities.getTrimmedString(folder, INSTANCE_GLOBAL_CODE); + return new SampleWithOwner(code, typeCode, typeDescription, instanceGlobalCode, + instanceCode, groupCode); } @Override @@ -115,20 +139,60 @@ public final class SampleWithOwner extends Sample super.saveTo(directory); final IDirectory folder = directory.makeDirectory(FOLDER); folder.addKeyValuePair(GROUP_CODE, groupCode); - folder.addKeyValuePair(DATABASE_INSTANCE_CODE, databaseInstanceCode); + folder.addKeyValuePair(INSTANCE_CODE, instanceCode); + folder.addKeyValuePair(INSTANCE_GLOBAL_CODE, instanceGlobalCode); } @Override public final String toString() { final ToStringBuilder builder = createToStringBuilder(); + builder.append(INSTANCE_GLOBAL_CODE, instanceGlobalCode); + builder.append(INSTANCE_CODE, instanceCode); if (groupCode.length() > 0) { builder.append(GROUP_CODE, groupCode); - } else if (databaseInstanceCode.length() > 0) - { - builder.append(DATABASE_INSTANCE_CODE, databaseInstanceCode); } return builder.toString(); } + + @Override + public final boolean equals(final Object obj) + { + if (obj == this) + { + return true; + } + if (obj instanceof SampleWithOwner == false) + { + return false; + } + final SampleWithOwner that = (SampleWithOwner) obj; + final EqualsBuilder builder = new EqualsBuilder(); + builder.append(that.getCode(), getCode()); + if (groupCode.length() > 1) + { + builder.append(that.groupCode, groupCode); + } else + { + builder.append(that.instanceGlobalCode, instanceGlobalCode); + } + return builder.isEquals(); + } + + @Override + public final int hashCode() + { + final HashCodeBuilder builder = new HashCodeBuilder(); + builder.append(getCode()); + if (groupCode.length() > 1) + { + builder.append(groupCode); + } else + { + builder.append(instanceGlobalCode); + } + return builder.toHashCode(); + } + } diff --git a/bds/sourceTest/java/ch/systemsx/cisd/bds/DataStructureV1_0Test.java b/bds/sourceTest/java/ch/systemsx/cisd/bds/DataStructureV1_0Test.java index 243514abb9e..2efb27119c9 100644 --- a/bds/sourceTest/java/ch/systemsx/cisd/bds/DataStructureV1_0Test.java +++ b/bds/sourceTest/java/ch/systemsx/cisd/bds/DataStructureV1_0Test.java @@ -401,17 +401,6 @@ public final class DataStructureV1_0Test extends AbstractFileSystemTestCase dataStructure.open(); } - @Test - public void testOpenVersionV1_1() - { - createExampleDataStructure(); - storage.mount(); - final IDirectory root = storage.getRoot(); - new Version(1, 1).saveTo(root); - storage.unmount(); - dataStructure.open(); - } - @Test public void testOpenVersionV2_0() { diff --git a/bds/sourceTest/java/ch/systemsx/cisd/bds/DataStructureV1_1Test.java b/bds/sourceTest/java/ch/systemsx/cisd/bds/DataStructureV1_1Test.java index b56bf8b4fa9..c1dbe11189c 100644 --- a/bds/sourceTest/java/ch/systemsx/cisd/bds/DataStructureV1_1Test.java +++ b/bds/sourceTest/java/ch/systemsx/cisd/bds/DataStructureV1_1Test.java @@ -19,12 +19,15 @@ package ch.systemsx.cisd.bds; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertFalse; import static org.testng.AssertJUnit.assertTrue; +import static org.testng.AssertJUnit.fail; import java.io.IOException; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; +import ch.systemsx.cisd.bds.exception.DataStructureException; +import ch.systemsx.cisd.bds.storage.IDirectory; import ch.systemsx.cisd.bds.storage.filesystem.FileStorage; import ch.systemsx.cisd.common.utilities.AbstractFileSystemTestCase; @@ -74,8 +77,8 @@ public final class DataStructureV1_1Test extends AbstractFileSystemTestCase fail = false; } assertFalse(fail); - dataStructure.setSample(new SampleWithOwner(SAMPLE, "", - SampleWithOwnerTest.DATABASE_INSTANCE_CODE)); + dataStructure.setSample(new SampleWithOwner(SAMPLE, + SampleWithOwnerTest.INSTANCE_GLOBAL_CODE, SampleWithOwnerTest.INSTANCE_CODE, "")); } @Test @@ -83,22 +86,61 @@ public final class DataStructureV1_1Test extends AbstractFileSystemTestCase { dataStructure.create(); final SampleWithOwner sampleWithOwner = - new SampleWithOwner(SAMPLE, "", SampleWithOwnerTest.DATABASE_INSTANCE_CODE); + new SampleWithOwner(SAMPLE, SampleWithOwnerTest.INSTANCE_GLOBAL_CODE, + SampleWithOwnerTest.INSTANCE_CODE, ""); dataStructure.setSample(sampleWithOwner); final Sample sample = dataStructure.getSample(); assertTrue(sample instanceof SampleWithOwner); - final String databaseInstanceCode = sampleWithOwner.getDatabaseInstanceCode(); + final String databaseInstanceCode = sampleWithOwner.getInstanceCode(); assertTrue(databaseInstanceCode.length() > 0); - assertEquals(databaseInstanceCode, ((SampleWithOwner) sample).getDatabaseInstanceCode()); + assertEquals(databaseInstanceCode, dataStructure.getSampleWithOwner().getInstanceCode()); + } + + @Test + public void testOpenVersionV1_0() + { + DataStructureV1_0Test.createExampleDataStructure(storage, new Version(1, 0)); + storage.mount(); + final IDirectory root = storage.getRoot(); + new Version(1, 1).saveTo(root); + storage.unmount(); + dataStructure.open(); } @Test public final void testBackwardCompatible() { - DataStructureV1_0Test.createExampleDataStructure(storage, new Version(1, 1)); + DataStructureV1_0Test.createExampleDataStructure(storage, new Version(1, 0)); dataStructure.open(); final Sample sample = dataStructure.getSample(); assertFalse(sample instanceof SampleWithOwner); + try + { + dataStructure.getSampleWithOwner(); + fail(); + } catch (final DataStructureException e) + { + // Nothing to do here. + } + } + + @Test + public final void testClose() + { + DataStructureV1_0Test.createExampleDataStructure(storage, new Version(1, 0)); + dataStructure.open(); + try + { + dataStructure.close(); + fail(); + } catch (final DataStructureException ex) + { + // Nothing to do here. + } + final SampleWithOwner sampleWithOwner = + new SampleWithOwner(SAMPLE, SampleWithOwnerTest.INSTANCE_GLOBAL_CODE, + SampleWithOwnerTest.INSTANCE_CODE, ""); + dataStructure.setSample(sampleWithOwner); dataStructure.close(); } } diff --git a/bds/sourceTest/java/ch/systemsx/cisd/bds/SampleWithOwnerTest.java b/bds/sourceTest/java/ch/systemsx/cisd/bds/SampleWithOwnerTest.java index 2b913a5c1c2..d00dd2605e3 100644 --- a/bds/sourceTest/java/ch/systemsx/cisd/bds/SampleWithOwnerTest.java +++ b/bds/sourceTest/java/ch/systemsx/cisd/bds/SampleWithOwnerTest.java @@ -40,7 +40,9 @@ public final class SampleWithOwnerTest extends AbstractFileSystemTestCase private static final String CODE = "code"; - static final String DATABASE_INSTANCE_CODE = "DB1"; + static final String INSTANCE_CODE = "DB1"; + + static final String INSTANCE_GLOBAL_CODE = "111-222"; static final String GROUP_CODE = "G1"; @@ -50,7 +52,7 @@ public final class SampleWithOwnerTest extends AbstractFileSystemTestCase boolean fail = true; try { - new SampleWithOwner(CODE, TYPE_CODE, TYPE_DESCRIPTION, null, null); + new SampleWithOwner(CODE, TYPE_CODE, TYPE_DESCRIPTION, null, null, null); } catch (final AssertionError ex) { fail = false; @@ -58,7 +60,15 @@ public final class SampleWithOwnerTest extends AbstractFileSystemTestCase assertEquals(false, fail); try { - new SampleWithOwner(CODE, TYPE_CODE, TYPE_DESCRIPTION, "", ""); + new SampleWithOwner(CODE, TYPE_CODE, TYPE_DESCRIPTION, "", "", ""); + fail(); + } catch (final DataStructureException e) + { + // Nothing to do here. + } + try + { + new SampleWithOwner(CODE, TYPE_CODE, TYPE_DESCRIPTION, "", "", GROUP_CODE); fail(); } catch (final DataStructureException e) { @@ -66,7 +76,7 @@ public final class SampleWithOwnerTest extends AbstractFileSystemTestCase } try { - new SampleWithOwner(CODE, TYPE_CODE, TYPE_DESCRIPTION, GROUP_CODE, ""); + new SampleWithOwner(CODE, TYPE_CODE, TYPE_DESCRIPTION, "", INSTANCE_CODE, GROUP_CODE); fail(); } catch (final DataStructureException e) { @@ -79,27 +89,30 @@ public final class SampleWithOwnerTest extends AbstractFileSystemTestCase { return new Object[][] { - { GROUP_CODE, DATABASE_INSTANCE_CODE }, - { "", DATABASE_INSTANCE_CODE }, }; + { INSTANCE_GLOBAL_CODE, INSTANCE_CODE, GROUP_CODE }, + { INSTANCE_GLOBAL_CODE, INSTANCE_CODE, "" }, }; } @Test(dataProvider = "getSampleData") - public final void testLoadFrom(final String groupCode, final String databaseInstanceCode) + public final void testLoadFrom(final String instanceGlobalCode, final String instanceCode, + final String groupCode) { final IDirectory directory = NodeFactory.createDirectoryNode(workingDirectory); final Sample sample = - new SampleWithOwner(CODE, TYPE_CODE, TYPE_DESCRIPTION, groupCode, - databaseInstanceCode); + new SampleWithOwner(CODE, TYPE_CODE, TYPE_DESCRIPTION, instanceGlobalCode, + instanceCode, groupCode); sample.saveTo(directory); final SampleWithOwner newSample = SampleWithOwner.loadFrom(directory); if (groupCode.length() > 0) { assertEquals(GROUP_CODE, newSample.getGroupCode()); - assertEquals(DATABASE_INSTANCE_CODE, newSample.getDatabaseInstanceCode()); + assertEquals(INSTANCE_CODE, newSample.getInstanceCode()); + assertEquals(INSTANCE_GLOBAL_CODE, newSample.getInstanceGlobalCode()); } else { assertEquals("", newSample.getGroupCode()); - assertEquals(DATABASE_INSTANCE_CODE, newSample.getDatabaseInstanceCode()); + assertEquals(INSTANCE_CODE, newSample.getInstanceCode()); + assertEquals(INSTANCE_GLOBAL_CODE, newSample.getInstanceGlobalCode()); } } } diff --git a/integration-tests/run.sh b/integration-tests/run.sh index c69db120496..dcaa9203085 100755 --- a/integration-tests/run.sh +++ b/integration-tests/run.sh @@ -654,7 +654,8 @@ function assert_correct_content_of_plate_3VCP1_in_store { assert_equals_as_in_file CELL_PLATE $metadata_dir/sample/type_code assert_equals_as_in_file 'Screening Plate' $metadata_dir/sample/type_description assert_equals_as_in_file CISD $metadata_dir/sample/group_code - assert_equals_as_in_file CISD $metadata_dir/sample/database_instance_code + assert_equals_as_in_file CISD $metadata_dir/sample/instance_code + assert_file_exists $metadata_dir/sample/instance_global_code # Experiment identifier assert_equals_as_in_file CISD $metadata_dir/experiment_identifier/instance_code assert_equals_as_in_file CISD $metadata_dir/experiment_identifier/group_code -- GitLab