diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataSetTable.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataSetTable.java index b9c01820e33cb7f00fa21d0009667f72631417a3..79991401f10492da279649966654045505410ed7 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataSetTable.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataSetTable.java @@ -60,6 +60,7 @@ import ch.systemsx.cisd.openbis.generic.shared.IDataStoreService; import ch.systemsx.cisd.openbis.generic.shared.basic.BasicConstant; import ch.systemsx.cisd.openbis.generic.shared.basic.TableModelAppender; import ch.systemsx.cisd.openbis.generic.shared.basic.TableModelAppender.TableModelWithDifferentColumnCountException; +import ch.systemsx.cisd.openbis.generic.shared.basic.TableModelAppender.TableModelWithDifferentColumnIdsException; import ch.systemsx.cisd.openbis.generic.shared.basic.TableModelAppender.TableModelWithIncompatibleColumnTypesException; import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData; @@ -675,6 +676,11 @@ public final class DataSetTable extends AbstractDataSetBusinessObject implements throw new UserFailureException("Could not merge reports from multiple data stores because '" + batchResults.getBatchId() + "' data store returned a table with an incorrect number of columns (expected: " + e.getExpectedColumnCount() + ", got: " + e.getAppendedColumnCount() + ")"); + } catch (TableModelWithDifferentColumnIdsException e) + { + throw new UserFailureException("Could not merge reports from multiple data stores because '" + batchResults.getBatchId() + + "' data store returned a table with different column ids (expected: " + e.getExpectedColumnIds() + + ", got: " + e.getAppendedColumnIds() + ")"); } catch (TableModelWithIncompatibleColumnTypesException e) { throw new UserFailureException("Could not merge reports from multiple data stores because '" + batchResults.getBatchId() diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/TableModelAppender.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/TableModelAppender.java index 691eccf82c8c60f362a41896a8ae4d96f64e7e8b..dee47f32831d81c9f0d815260a064a4a9e6ca4c4 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/TableModelAppender.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/TableModelAppender.java @@ -58,6 +58,7 @@ public class TableModelAppender } else { checkColumnCount(tableModel); + checkColumnIds(tableModel); checkColumnTypes(tableModel); rows.addAll(tableModel.getRows()); } @@ -74,6 +75,30 @@ public class TableModelAppender } } + private void checkColumnIds(TableModel tableModel) + { + List<String> expectedIds = new ArrayList<String>(); + List<String> appendedIds = new ArrayList<String>(); + + for (TableModelColumnHeader expectedHeader : headers) + { + expectedIds.add(expectedHeader.getId()); + } + + if (tableModel.getHeader() != null) + { + for (TableModelColumnHeader appendedHeader : tableModel.getHeader()) + { + appendedIds.add(appendedHeader.getId()); + } + } + + if (expectedIds.equals(appendedIds) == false) + { + throw new TableModelWithDifferentColumnIdsException(expectedIds, appendedIds); + } + } + private void checkColumnTypes(TableModel tableModel) { List<DataTypeCode> expectedTypes = new ArrayList<DataTypeCode>(); @@ -147,6 +172,33 @@ public class TableModelAppender } + public static class TableModelWithDifferentColumnIdsException extends IllegalTableModelException + { + + private static final long serialVersionUID = 1L; + + private List<String> expectedColumnIds; + + private List<String> appendedColumnIds; + + public TableModelWithDifferentColumnIdsException(List<String> expectedColumnIds, List<String> appendedColumnIds) + { + this.expectedColumnIds = expectedColumnIds; + this.appendedColumnIds = appendedColumnIds; + } + + public List<String> getExpectedColumnIds() + { + return expectedColumnIds; + } + + public List<String> getAppendedColumnIds() + { + return appendedColumnIds; + } + + } + public static class TableModelWithIncompatibleColumnTypesException extends IllegalTableModelException { diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/TableModelAppenderTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/TableModelAppenderTest.java index 04a21ee063c71326164ec9895f86b7732a8a7ee6..e21b941c71fba47cc4101d3a7bcef1ca98ba042e 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/TableModelAppenderTest.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/TableModelAppenderTest.java @@ -24,6 +24,7 @@ import junit.framework.Assert; import org.testng.annotations.Test; import ch.systemsx.cisd.openbis.generic.shared.basic.TableModelAppender.TableModelWithDifferentColumnCountException; +import ch.systemsx.cisd.openbis.generic.shared.basic.TableModelAppender.TableModelWithDifferentColumnIdsException; import ch.systemsx.cisd.openbis.generic.shared.basic.TableModelAppender.TableModelWithIncompatibleColumnTypesException; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode; import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ISerializableComparable; @@ -40,14 +41,14 @@ public class TableModelAppenderTest { @Test(expectedExceptions = IllegalArgumentException.class) - public void testAppendNull() + public void testAppendNullModel() { TableModelAppender appender = new TableModelAppender(); appender.append(null); } @Test - public void testAppendEmpty() + public void testAppendEmptyModel() { TableModelAppender appender = new TableModelAppender(); appender.append(new TableModel(Collections.<TableModelColumnHeader> emptyList(), Collections.<TableModelRow> emptyList())); @@ -58,7 +59,7 @@ public class TableModelAppenderTest } @Test - public void testAppendWithSameColumns() + public void testAppendModelWithSameColumns() { SimpleTableModelBuilder builder1 = new SimpleTableModelBuilder(); builder1.addHeader("column1"); @@ -86,7 +87,7 @@ public class TableModelAppenderTest } @Test - public void testAppendWithDifferentNumberOfColumns() + public void testAppendModelWithDifferentNumberOfColumns() { SimpleTableModelBuilder builder1 = new SimpleTableModelBuilder(); builder1.addHeader("column1"); @@ -112,7 +113,7 @@ public class TableModelAppenderTest } @Test - public void testAppendWithCompatibleTypesOfColumns() + public void testAppendModelWithSameIdsAndCompatibleTypesOfColumns() { SimpleTableModelBuilder builder1 = new SimpleTableModelBuilder(); builder1.addHeader("column1"); @@ -140,7 +141,7 @@ public class TableModelAppenderTest } @Test - public void testAppendWithIncompatibleTypesOfColumns() + public void testAppendModelWithSameIdsAndIncompatibleTypesOfColumns() { SimpleTableModelBuilder builder1 = new SimpleTableModelBuilder(); builder1.addHeader("column1"); @@ -166,6 +167,33 @@ public class TableModelAppenderTest } } + @Test + public void testAppendModelWithDifferentIdsOfColumns() + { + SimpleTableModelBuilder builder1 = new SimpleTableModelBuilder(); + builder1.addHeader("column1"); + builder1.addHeader("column2"); + builder1.addFullRow("row1_column1", "row1_column2"); + builder1.addFullRow("row2_column1", "row2_column2"); + + SimpleTableModelBuilder builder2 = new SimpleTableModelBuilder(); + builder2.addHeader("column1"); + builder2.addHeader("column2a"); + builder2.addFullRow("row3_column1", "row3_column2a"); + + try + { + TableModelAppender appender = new TableModelAppender(); + appender.append(builder1.getTableModel()); + appender.append(builder2.getTableModel()); + Assert.fail(); + } catch (TableModelWithDifferentColumnIdsException e) + { + Assert.assertEquals(Arrays.asList("column1", "column2"), e.getExpectedColumnIds()); + Assert.assertEquals(Arrays.asList("column1", "column2a"), e.getAppendedColumnIds()); + } + } + private void assertHeaders(TableModel tableModel, String... headers) { int columnIndex = 0;