diff --git a/CHANGELOG b/CHANGELOG index dd576dddf6813122411def05d053934c9670644f..f741b55be8c02f96bb149f3457e85661193933fa 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,8 @@ +minerva (18.2.0) stable; urgency=medium + * Small improvement: add source data to data overlay (#2228) + + -- Piotr Gawron <piotr.gawron@uni.lu> Thu, 13 Mar 2025 13:00:00 +0200 + minerva (18.1.1) stable; urgency=medium * Bug fix: SBGN-ML import/export should not use compartmentOrder for non-compartment entities (#2193) diff --git a/CellDesigner-plugin/pom.xml b/CellDesigner-plugin/pom.xml index 8b4f056695b8fd90cce5ae6825286ee6de0f66b5..3acc9fd0e1731e72167955bf512b5e8d914c4455 100644 --- a/CellDesigner-plugin/pom.xml +++ b/CellDesigner-plugin/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>lcsb.mapviewer</groupId> <artifactId>parent</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </parent> <artifactId>CellDesigner-plugin</artifactId> <!-- dependency from the MapViewer model --> @@ -50,19 +50,19 @@ <dependency> <groupId>lcsb.mapviewer</groupId> <artifactId>model</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </dependency> <dependency> <groupId>lcsb.mapviewer</groupId> <artifactId>commons</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </dependency> <dependency> <groupId>lcsb.mapviewer</groupId> <artifactId>converter-CellDesigner</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </dependency> <dependency> diff --git a/annotation/pom.xml b/annotation/pom.xml index 638da580c3ee78b2caa19bc82d88efe16357c410..369d15c30b394069af5e1669c47eff389b8eb85f 100644 --- a/annotation/pom.xml +++ b/annotation/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>lcsb.mapviewer</groupId> <artifactId>parent</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </parent> <artifactId>annotation</artifactId> <name>Annotation module</name> @@ -19,7 +19,7 @@ <dependency> <groupId>lcsb.mapviewer</groupId> <artifactId>model</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </dependency> <!-- dependency from the MapViewer dao --> @@ -27,7 +27,7 @@ <dependency> <groupId>lcsb.mapviewer</groupId> <artifactId>persist</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </dependency> <!-- dependency from the MapViewer cell designer parser (we need access @@ -35,13 +35,13 @@ <dependency> <groupId>lcsb.mapviewer</groupId> <artifactId>converter-CellDesigner</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </dependency> <dependency> <groupId>lcsb.mapviewer</groupId> <artifactId>converter</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </dependency> <!-- Log4J2 --> diff --git a/commons/pom.xml b/commons/pom.xml index 2f6112442c1769a4b93bdd2e74730de78c06f8b3..d3fc7132a7314ee5bf6c721074223c8baa2850be 100644 --- a/commons/pom.xml +++ b/commons/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>lcsb.mapviewer</groupId> <artifactId>parent</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </parent> <artifactId>commons</artifactId> <name>Mapviewer commons</name> diff --git a/converter-CellDesigner/pom.xml b/converter-CellDesigner/pom.xml index 38b05a88d2995936f20557e785dde0f507844033..85c3b2d5cca9f028c2a3a0c33784d26062279788 100644 --- a/converter-CellDesigner/pom.xml +++ b/converter-CellDesigner/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>lcsb.mapviewer</groupId> <artifactId>parent</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </parent> <artifactId>converter-CellDesigner</artifactId> <name>CellDesigner converter</name> @@ -17,13 +17,13 @@ <dependency> <groupId>lcsb.mapviewer</groupId> <artifactId>model</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </dependency> <dependency> <groupId>lcsb.mapviewer</groupId> <artifactId>converter</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </dependency> <!-- Log4J2 --> diff --git a/converter-SBGNML/pom.xml b/converter-SBGNML/pom.xml index 78cf9295a016e5140fb766c994f2873fb4d7cfea..cb585d9ed400d284413156bcefa26e60253e9c47 100644 --- a/converter-SBGNML/pom.xml +++ b/converter-SBGNML/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>lcsb.mapviewer</groupId> <artifactId>parent</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </parent> <artifactId>converter-SBGNML</artifactId> @@ -20,26 +20,26 @@ <dependency> <groupId>lcsb.mapviewer</groupId> <artifactId>model</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </dependency> <dependency> <groupId>lcsb.mapviewer</groupId> <artifactId>persist</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> <scope>test</scope> </dependency> <dependency> <groupId>lcsb.mapviewer</groupId> <artifactId>converter-CellDesigner</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </dependency> <dependency> <groupId>lcsb.mapviewer</groupId> <artifactId>converter-graphics</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </dependency> <dependency> diff --git a/converter-graphics/pom.xml b/converter-graphics/pom.xml index e39210329eb33e7aa21b3655ca773b526f9d0ddd..eefcb9cd6f67274448ca2f1aa36cea951f80361a 100644 --- a/converter-graphics/pom.xml +++ b/converter-graphics/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>lcsb.mapviewer</groupId> <artifactId>parent</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </parent> <artifactId>converter-graphics</artifactId> <name>MapViewer graphics converter</name> @@ -18,13 +18,13 @@ <dependency> <groupId>lcsb.mapviewer</groupId> <artifactId>model</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </dependency> <dependency> <groupId>lcsb.mapviewer</groupId> <artifactId>model-command</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </dependency> <!-- Log4J2 --> diff --git a/converter-sbml/pom.xml b/converter-sbml/pom.xml index d0c6e4105a9e9d6d03f91dbbbcbfe789a3d25e8a..5ad0853a701bf73e8d7cc0383b83ead66b64ec60 100644 --- a/converter-sbml/pom.xml +++ b/converter-sbml/pom.xml @@ -7,7 +7,7 @@ <parent> <groupId>lcsb.mapviewer</groupId> <artifactId>parent</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </parent> <artifactId>converter-sbml</artifactId> <name>converter-sbml</name> @@ -40,22 +40,22 @@ <dependency> <groupId>lcsb.mapviewer</groupId> <artifactId>model</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </dependency> <dependency> <groupId>lcsb.mapviewer</groupId> <artifactId>model-command</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </dependency> <dependency> <groupId>lcsb.mapviewer</groupId> <artifactId>converter-CellDesigner</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </dependency> <dependency> <groupId>lcsb.mapviewer</groupId> <artifactId>converter</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </dependency> <!-- Log4J2 --> @@ -167,7 +167,7 @@ <dependency> <groupId>lcsb.mapviewer</groupId> <artifactId>converter-graphics</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> <scope>test</scope> </dependency> diff --git a/converter/pom.xml b/converter/pom.xml index f6e53dd58ab98742e450874329f9372773c17266..70eac0c67a063a330ba4382cf04d611d4166c750 100644 --- a/converter/pom.xml +++ b/converter/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>lcsb.mapviewer</groupId> <artifactId>parent</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </parent> <artifactId>converter</artifactId> @@ -15,7 +15,7 @@ <dependency> <groupId>lcsb.mapviewer</groupId> <artifactId>model</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </dependency> <dependency> <groupId>xerces</groupId> diff --git a/converter/src/main/java/lcsb/mapviewer/converter/ColorSchemaColumn.java b/converter/src/main/java/lcsb/mapviewer/converter/ColorSchemaColumn.java index 8ff5134345db0facf9a156a4c713ad51a3e9955d..109c1d7ba4221d13035403962b4346b1c21c29e5 100644 --- a/converter/src/main/java/lcsb/mapviewer/converter/ColorSchemaColumn.java +++ b/converter/src/main/java/lcsb/mapviewer/converter/ColorSchemaColumn.java @@ -1,124 +1,123 @@ package lcsb.mapviewer.converter; +import lcsb.mapviewer.model.overlay.DataOverlayType; + +import java.util.Collections; import java.util.HashSet; import java.util.Set; -import lcsb.mapviewer.model.overlay.DataOverlayType; - /** * This enum defines which columns are available for defining * {@link lcsb.mapviewer.model.map.layout.ColorSchema}. - * + * * @author Piotr Gawron - * */ public enum ColorSchemaColumn { /** * Name of the element. */ - NAME(new DataOverlayType[] { DataOverlayType.GENERIC }), + NAME(new DataOverlayType[]{DataOverlayType.GENERIC}), - GENE_NAME(new DataOverlayType[] { DataOverlayType.GENETIC_VARIANT }), + GENE_NAME(new DataOverlayType[]{DataOverlayType.GENETIC_VARIANT}), /** * Name of the map. */ - MAP_NAME(new DataOverlayType[] { DataOverlayType.GENERIC, DataOverlayType.GENETIC_VARIANT }), + MAP_NAME(new DataOverlayType[]{DataOverlayType.GENERIC, DataOverlayType.GENETIC_VARIANT}), + + SOURCE_DATA(new DataOverlayType[]{DataOverlayType.GENERIC}), /** * Value that will be transformed into new color. - * + * * @see ColorSchemaColumn#COLOR */ - VALUE(new DataOverlayType[] { DataOverlayType.GENERIC }), + VALUE(new DataOverlayType[]{DataOverlayType.GENERIC}), /** * In which compartment the element should be located. */ - COMPARTMENT(new DataOverlayType[] { DataOverlayType.GENERIC, DataOverlayType.GENETIC_VARIANT }), + COMPARTMENT(new DataOverlayType[]{DataOverlayType.GENERIC, DataOverlayType.GENETIC_VARIANT}), /** * Class type of the element. */ - TYPE(new DataOverlayType[] { DataOverlayType.GENERIC }), + TYPE(new DataOverlayType[]{DataOverlayType.GENERIC}), /** * New element/reaction color. */ - COLOR(new DataOverlayType[] { DataOverlayType.GENERIC, DataOverlayType.GENETIC_VARIANT }), + COLOR(new DataOverlayType[]{DataOverlayType.GENERIC, DataOverlayType.GENETIC_VARIANT}), /** * Identifier of the element. */ - IDENTIFIER(new DataOverlayType[] { DataOverlayType.GENERIC, DataOverlayType.GENETIC_VARIANT }), + IDENTIFIER(new DataOverlayType[]{DataOverlayType.GENERIC, DataOverlayType.GENETIC_VARIANT}), /** * Element identifier. */ - ELEMENT_IDENTIFIER(new DataOverlayType[] { DataOverlayType.GENERIC }), + ELEMENT_IDENTIFIER(new DataOverlayType[]{DataOverlayType.GENERIC}), /** * New line width of the reaction. */ - LINE_WIDTH(new DataOverlayType[] { DataOverlayType.GENERIC }), + LINE_WIDTH(new DataOverlayType[]{DataOverlayType.GENERIC}), /** * Position where gene variants starts. */ - POSITION(new DataOverlayType[] { DataOverlayType.GENETIC_VARIANT }), + POSITION(new DataOverlayType[]{DataOverlayType.GENETIC_VARIANT}), /** * Original DNA of the variant. */ - ORIGINAL_DNA(new DataOverlayType[] { DataOverlayType.GENETIC_VARIANT }), + ORIGINAL_DNA(new DataOverlayType[]{DataOverlayType.GENETIC_VARIANT}), /** * Alternative DNA of the variant. */ - ALTERNATIVE_DNA(new DataOverlayType[] { DataOverlayType.GENETIC_VARIANT }), + ALTERNATIVE_DNA(new DataOverlayType[]{DataOverlayType.GENETIC_VARIANT}), /** * Short description of the entry. */ - DESCRIPTION(new DataOverlayType[] { DataOverlayType.GENETIC_VARIANT, DataOverlayType.GENERIC }), + DESCRIPTION(new DataOverlayType[]{DataOverlayType.GENETIC_VARIANT, DataOverlayType.GENERIC}), /** * Contig where variant was observed. */ - CONTIG(new DataOverlayType[] { DataOverlayType.GENETIC_VARIANT }), + CONTIG(new DataOverlayType[]{DataOverlayType.GENETIC_VARIANT}), - CHROMOSOME(new DataOverlayType[] { DataOverlayType.GENETIC_VARIANT }), + CHROMOSOME(new DataOverlayType[]{DataOverlayType.GENETIC_VARIANT}), - ALLELE_FREQUENCY(new DataOverlayType[] { DataOverlayType.GENETIC_VARIANT }), + ALLELE_FREQUENCY(new DataOverlayType[]{DataOverlayType.GENETIC_VARIANT}), - VARIANT_IDENTIFIER(new DataOverlayType[] { DataOverlayType.GENETIC_VARIANT }), + VARIANT_IDENTIFIER(new DataOverlayType[]{DataOverlayType.GENETIC_VARIANT}), /** * Should the direction of reaction be reversed. */ - REVERSE_REACTION(new DataOverlayType[] { DataOverlayType.GENERIC }), + REVERSE_REACTION(new DataOverlayType[]{DataOverlayType.GENERIC}), /** * Optional amino acid change in the variant. */ - AMINO_ACID_CHANGE(new DataOverlayType[] { DataOverlayType.GENETIC_VARIANT }); + AMINO_ACID_CHANGE(new DataOverlayType[]{DataOverlayType.GENETIC_VARIANT}); /** * Set of types where column is allowed. */ - private Set<DataOverlayType> types = new HashSet<>(); + private final Set<DataOverlayType> types = new HashSet<>(); /** * Default constructor that creates enum entry. * - * @param types - * list of {@link DataOverlayType types} where this column is allowed + * @param types list of {@link DataOverlayType types} where this column is allowed */ ColorSchemaColumn(final DataOverlayType[] types) { - for (final DataOverlayType colorSchemaType : types) { - this.types.add(colorSchemaType); - } + Collections.addAll(this.types, types); } public String getColumnName() { diff --git a/converter/src/main/java/lcsb/mapviewer/converter/ColorSchemaReader.java b/converter/src/main/java/lcsb/mapviewer/converter/ColorSchemaReader.java index 03c368cd9387a50eaf58581e92520cbd37b611e4..f6eef6f01d1544e20b11d254420ac3c4c4bbaaf5 100644 --- a/converter/src/main/java/lcsb/mapviewer/converter/ColorSchemaReader.java +++ b/converter/src/main/java/lcsb/mapviewer/converter/ColorSchemaReader.java @@ -52,9 +52,9 @@ import lcsb.mapviewer.model.overlay.InvalidDataOverlayException; /** * Class that reads information about set of {@link DataOverlayEntry color * schemas} from the input file. - * + * * @author Piotr Gawron - * + * */ public class ColorSchemaReader { @@ -104,7 +104,7 @@ public class ColorSchemaReader { /** * Reads information about set of {@link DataOverlayEntry color schemas} from * the input stream. - * + * * @param colorInputStream * input stream with {@link DataOverlayEntry} * @param params @@ -150,7 +150,7 @@ public class ColorSchemaReader { /** * Reads information about set of {@link DataOverlayEntry color schemas} from * the filename. - * + * * @param filename * file with {@link DataOverlayEntry} * @return list of coloring schemas @@ -172,7 +172,7 @@ public class ColorSchemaReader { /** * Reads information about set of {@link DataOverlayEntry color schemas} from * the input stream represented as byte array. - * + * * @param inputData * source in form of byte array * @return list of coloring schemas @@ -198,7 +198,7 @@ public class ColorSchemaReader { /** * Reads information about set of {@link GeneVariantDataOverlayEntry gene * variant color schemas} from the input stream. - * + * * @param colorInputStream * input stream with {@link GeneVariantDataOverlayEntry} * @param params @@ -372,7 +372,7 @@ public class ColorSchemaReader { /** * Sets proper value of identifier to {@link DataOverlayEntry} from cell * content. - * + * * @param schema * {@link DataOverlayEntry} where name should be set * @param type @@ -388,7 +388,7 @@ public class ColorSchemaReader { /** * Sets proper name to {@link DataOverlayEntry} from cell content. - * + * * @param schema * {@link DataOverlayEntry} where name should be set * @param content @@ -406,10 +406,17 @@ public class ColorSchemaReader { } } + + private void processSourceDataColumn(final DataOverlayEntry schema, final String content) { + if (!content.isEmpty()) { + schema.setSourceData(content); + } + } + /** * Sets proper compartment names to {@link DataOverlayEntry} from cell * content. - * + * * @param schema * {@link DataOverlayEntry} where name should be set * @param content @@ -425,7 +432,7 @@ public class ColorSchemaReader { /** * Transforms string into {@link ReferenceGenomeType}. - * + * * @param referenceGenomeStr * type as a string * @return {@link ReferenceGenomeType} obtained from input string @@ -450,13 +457,13 @@ public class ColorSchemaReader { /** * Merges collection of {@link DataOverlayEntry} that might contain duplicate * names into collection that doesn't have duplicate names. - * + * * @param schemas * {@link Collection} of {@link DataOverlayEntry} that might contain * duplicate name * @return {@link Collection} of {@link DataOverlayEntry} that doesn't contain * duplicate names - * + * */ private Collection<DataOverlayEntry> mergeSchemas(final Collection<DataOverlayEntry> schemas) { Map<String, DataOverlayEntry> schemasByName = new HashMap<>(); @@ -500,7 +507,7 @@ public class ColorSchemaReader { /** * Gets color that should be assigned to {@link GeneVariantDataOverlayEntry}. - * + * * @param geneVariations * list of variants * @return {@link Color} that should be assigned to @@ -519,7 +526,7 @@ public class ColorSchemaReader { /** * Reads information about set of {@link GenericDataOverlayEntry generic color * schemas} from the input stream. - * + * * @param colorInputStream * input stream with {@link GenericDataOverlayEntry} * @return list of coloring schemas @@ -549,17 +556,18 @@ public class ColorSchemaReader { Map<ColorSchemaColumn, Integer> schemaColumns = new HashMap<>(); List<Pair<MiriamType, Integer>> customIdentifiers = parseColumns(columns, schemaColumns, DataOverlayType.GENERIC); - Integer valueColumn = schemaColumns.get(ColorSchemaColumn.VALUE); - Integer colorColumn = schemaColumns.get(ColorSchemaColumn.COLOR); - Integer nameColumn = schemaColumns.get(ColorSchemaColumn.NAME); - Integer modelNameColumn = schemaColumns.get(ColorSchemaColumn.MAP_NAME); - Integer identifierColumn = schemaColumns.get(ColorSchemaColumn.IDENTIFIER); - Integer elementIdentifierColumn = schemaColumns.get(ColorSchemaColumn.ELEMENT_IDENTIFIER); - Integer compartmentColumn = schemaColumns.get(ColorSchemaColumn.COMPARTMENT); - Integer typeColumn = schemaColumns.get(ColorSchemaColumn.TYPE); - Integer lineWidthColumn = schemaColumns.get(ColorSchemaColumn.LINE_WIDTH); - Integer reverseReactionColumn = schemaColumns.get(ColorSchemaColumn.REVERSE_REACTION); - Integer descriptionColumn = schemaColumns.get(ColorSchemaColumn.DESCRIPTION); + final Integer valueColumn = schemaColumns.get(ColorSchemaColumn.VALUE); + final Integer colorColumn = schemaColumns.get(ColorSchemaColumn.COLOR); + final Integer nameColumn = schemaColumns.get(ColorSchemaColumn.NAME); + final Integer modelNameColumn = schemaColumns.get(ColorSchemaColumn.MAP_NAME); + final Integer sourceDataColumn = schemaColumns.get(ColorSchemaColumn.SOURCE_DATA); + final Integer identifierColumn = schemaColumns.get(ColorSchemaColumn.IDENTIFIER); + final Integer elementIdentifierColumn = schemaColumns.get(ColorSchemaColumn.ELEMENT_IDENTIFIER); + final Integer compartmentColumn = schemaColumns.get(ColorSchemaColumn.COMPARTMENT); + final Integer typeColumn = schemaColumns.get(ColorSchemaColumn.TYPE); + final Integer lineWidthColumn = schemaColumns.get(ColorSchemaColumn.LINE_WIDTH); + final Integer reverseReactionColumn = schemaColumns.get(ColorSchemaColumn.REVERSE_REACTION); + final Integer descriptionColumn = schemaColumns.get(ColorSchemaColumn.DESCRIPTION); if (nameColumn == null && identifierColumn == null && customIdentifiers.size() == 0 && elementIdentifierColumn == null) { @@ -594,6 +602,9 @@ public class ColorSchemaReader { if (modelNameColumn != null) { processModelNameColumn(schema, values[modelNameColumn]); } + if (sourceDataColumn != null) { + processSourceDataColumn(schema, values[sourceDataColumn]); + } if (valueColumn != null) { schema.setValue(parseValueColumn(values[valueColumn], errorPrefix)); } @@ -715,7 +726,7 @@ public class ColorSchemaReader { /** * Sets proper reaction identifier to {@link DataOverlayEntry} from cell * content. - * + * * @param schema * {@link DataOverlayEntry} where name should be set * @param content @@ -731,7 +742,7 @@ public class ColorSchemaReader { /** * Transform headers of columns into map with {@link ColorSchemaColumn column * types} to column number. - * + * * @param columns * headers of columns * @param schemaColumns @@ -787,7 +798,7 @@ public class ColorSchemaReader { /** * Returns list of columns that should be printed for given coloring schemas. - * + * * @param schemas * list of schemas * @return list of columns that should be printed (were set in the coloring diff --git a/converter/src/test/java/lcsb/mapviewer/converter/ColorSchemaReaderTest.java b/converter/src/test/java/lcsb/mapviewer/converter/ColorSchemaReaderTest.java index 26653afab2446c851c69f1181a529a5972bc4ed1..e6a507c1f951a3c15d8c77e171780d5333a426a8 100644 --- a/converter/src/test/java/lcsb/mapviewer/converter/ColorSchemaReaderTest.java +++ b/converter/src/test/java/lcsb/mapviewer/converter/ColorSchemaReaderTest.java @@ -1,15 +1,22 @@ package lcsb.mapviewer.converter; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; +import lcsb.mapviewer.common.Configuration; +import lcsb.mapviewer.common.TextFileUtils; +import lcsb.mapviewer.model.map.BioEntity; +import lcsb.mapviewer.model.map.MiriamData; +import lcsb.mapviewer.model.overlay.DataOverlayEntry; +import lcsb.mapviewer.model.overlay.GeneVariant; +import lcsb.mapviewer.model.overlay.GeneVariantDataOverlayEntry; +import lcsb.mapviewer.model.overlay.InvalidDataOverlayException; +import org.apache.commons.io.output.ByteArrayOutputStream; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; import java.awt.Color; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; @@ -18,19 +25,10 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import org.apache.commons.io.output.ByteArrayOutputStream; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -import lcsb.mapviewer.common.Configuration; -import lcsb.mapviewer.common.TextFileUtils; -import lcsb.mapviewer.model.map.BioEntity; -import lcsb.mapviewer.model.map.MiriamData; -import lcsb.mapviewer.model.overlay.DataOverlayEntry; -import lcsb.mapviewer.model.overlay.GeneVariant; -import lcsb.mapviewer.model.overlay.GeneVariantDataOverlayEntry; -import lcsb.mapviewer.model.overlay.InvalidDataOverlayException; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; public class ColorSchemaReaderTest extends ConverterTestFunctions { @@ -89,7 +87,7 @@ public class ColorSchemaReaderTest extends ConverterTestFunctions { assertEquals(1, schemas.size()); } - private byte[] fileToByteArray(final File f) throws FileNotFoundException, IOException { + private byte[] fileToByteArray(final File f) throws IOException { InputStream in = new FileInputStream(f); byte[] buff = new byte[8000]; @@ -124,6 +122,7 @@ public class ColorSchemaReaderTest extends ConverterTestFunctions { for (final GeneVariant geneVariant : schema.getGeneVariants()) { if (geneVariant.getAminoAcidChange() != null && !geneVariant.getAminoAcidChange().trim().isEmpty()) { aaChangeFound = true; + break; } } assertTrue("Amino acid are not present in parsed data", aaChangeFound); @@ -362,4 +361,17 @@ public class ColorSchemaReaderTest extends ConverterTestFunctions { assertEquals(2, schemas.size()); } + @Test + public void testColoringWithSourceData() throws Exception { + String input = "name\tcolor\tsource_data\n" + + "s1\t#ff0000\txxx\n"; + Map<String, String> params = new HashMap<>(); + params.put(TextFileUtils.COLUMN_COUNT_PARAM, "3"); + + Collection<DataOverlayEntry> schemas = reader + .readColorSchema(new ByteArrayInputStream(input.getBytes(StandardCharsets.UTF_8)), params); + assertEquals(1, schemas.size()); + assertNotNull(schemas.iterator().next().getSourceData()); + } + } diff --git a/frontend-js/pom.xml b/frontend-js/pom.xml index daec87d496ea05af35838ed4180cec4270145617..86beb1b4b44f8666d993f1f7e8e8c853368a94be 100644 --- a/frontend-js/pom.xml +++ b/frontend-js/pom.xml @@ -7,7 +7,7 @@ <parent> <groupId>lcsb.mapviewer</groupId> <artifactId>parent</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </parent> <artifactId>frontend-js</artifactId> <name>frontend-js</name> diff --git a/model-command/pom.xml b/model-command/pom.xml index 0ea553bece32b80c7ba215b0b907fd3ebf21acd4..6c6d2bfd59e6c2e8ee9e44716bdadf7de6b98352 100644 --- a/model-command/pom.xml +++ b/model-command/pom.xml @@ -3,7 +3,7 @@ <parent> <groupId>lcsb.mapviewer</groupId> <artifactId>parent</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </parent> <artifactId>model-command</artifactId> <name>Model commands</name> @@ -16,7 +16,7 @@ <dependency> <groupId>lcsb.mapviewer</groupId> <artifactId>model</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </dependency> @@ -24,7 +24,7 @@ <dependency> <groupId>lcsb.mapviewer</groupId> <artifactId>converter-CellDesigner</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </dependency> <!-- Log4J2--> diff --git a/model/pom.xml b/model/pom.xml index 5cbdcfe395d865a17f0faf0a8739ae9778f6255b..41c41790d11a23e4db072e9098898bf1ac7cae3e 100644 --- a/model/pom.xml +++ b/model/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>lcsb.mapviewer</groupId> <artifactId>parent</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </parent> <artifactId>model</artifactId> <name>model MapViewer</name> @@ -15,7 +15,7 @@ <dependency> <groupId>lcsb.mapviewer</groupId> <artifactId>commons</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </dependency> <!-- Java xml serialization --> diff --git a/model/src/main/java/lcsb/mapviewer/model/overlay/DataOverlayEntry.java b/model/src/main/java/lcsb/mapviewer/model/overlay/DataOverlayEntry.java index ed607001086bebfdd6c96d6192fe9b238680900d..db715cc745a7862ef1eafeb7ef314b41dc574f15 100644 --- a/model/src/main/java/lcsb/mapviewer/model/overlay/DataOverlayEntry.java +++ b/model/src/main/java/lcsb/mapviewer/model/overlay/DataOverlayEntry.java @@ -60,6 +60,8 @@ public abstract class DataOverlayEntry implements Serializable { */ private String modelName = null; + private String sourceData = null; + /** * Original identifier of the {@link BioEntity} to change the color. */ @@ -415,4 +417,12 @@ public abstract class DataOverlayEntry implements Serializable { public void setDataOverlay(final DataOverlay dataOverlay) { this.dataOverlay = dataOverlay; } + + public String getSourceData() { + return sourceData; + } + + public void setSourceData(final String sourceData) { + this.sourceData = sourceData; + } } diff --git a/pathvisio/pom.xml b/pathvisio/pom.xml index db2cc0845e8c7fb53eae2b60d550c018b9fbfdf6..13ac79c89e5873575b3e9b8cdc5afffc17c9c6d9 100644 --- a/pathvisio/pom.xml +++ b/pathvisio/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>lcsb.mapviewer</groupId> <artifactId>parent</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </parent> <artifactId>pathvisio</artifactId> <name>Pathvisio plugin</name> @@ -77,26 +77,26 @@ <dependency> <groupId>lcsb.mapviewer</groupId> <artifactId>model</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </dependency> <dependency> <groupId>lcsb.mapviewer</groupId> <artifactId>converter-CellDesigner</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </dependency> <dependency> <groupId>lcsb.mapviewer</groupId> <artifactId>converter-graphics</artifactId> <scope>test</scope> - <version>18.1.1</version> + <version>18.2.0</version> </dependency> <dependency> <groupId>lcsb.mapviewer</groupId> <artifactId>model-command</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </dependency> <!-- Log4J2 --> diff --git a/persist/pom.xml b/persist/pom.xml index 9d4f4f2f6ed517234f83f1691d1968490e307b6e..ed46065d06b37f9a16b3e5b739768dbd6966ce93 100644 --- a/persist/pom.xml +++ b/persist/pom.xml @@ -6,7 +6,7 @@ <parent> <groupId>lcsb.mapviewer</groupId> <artifactId>parent</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </parent> <artifactId>persist</artifactId> @@ -26,7 +26,7 @@ <dependency> <groupId>lcsb.mapviewer</groupId> <artifactId>model</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </dependency> <!-- Hibernate --> diff --git a/persist/src/main/resources/db/migration/hsql/18.2.0/V18.0.8.20250313__add_source_data_to_overlay_entry.sql b/persist/src/main/resources/db/migration/hsql/18.2.0/V18.0.8.20250313__add_source_data_to_overlay_entry.sql new file mode 100644 index 0000000000000000000000000000000000000000..93bdf335b425a96afa88944f55f26861edd085f4 --- /dev/null +++ b/persist/src/main/resources/db/migration/hsql/18.2.0/V18.0.8.20250313__add_source_data_to_overlay_entry.sql @@ -0,0 +1,2 @@ +alter table data_overlay_entry_table + add column source_data character varying(255); diff --git a/persist/src/main/resources/db/migration/postgres/18.2.0/V18.0.8.20250313__add_source_data_to_overlay_entry.sql b/persist/src/main/resources/db/migration/postgres/18.2.0/V18.0.8.20250313__add_source_data_to_overlay_entry.sql new file mode 100644 index 0000000000000000000000000000000000000000..93bdf335b425a96afa88944f55f26861edd085f4 --- /dev/null +++ b/persist/src/main/resources/db/migration/postgres/18.2.0/V18.0.8.20250313__add_source_data_to_overlay_entry.sql @@ -0,0 +1,2 @@ +alter table data_overlay_entry_table + add column source_data character varying(255); diff --git a/pom.xml b/pom.xml index 918085bc04c4b33d27c5d506e7d95139bf0dc57a..1da2a839dcab9de69dc066e8977a8e1e125ea99c 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ <groupId>lcsb.mapviewer</groupId> <artifactId>parent</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> <packaging>pom</packaging> <name>parent MapViewer</name> diff --git a/rest-api/pom.xml b/rest-api/pom.xml index f92e224b3f69c46cc3add662e599ff4eb2b1811a..2924cf6bbfdb21c8391feff86509462297143d5d 100644 --- a/rest-api/pom.xml +++ b/rest-api/pom.xml @@ -7,7 +7,7 @@ <parent> <groupId>lcsb.mapviewer</groupId> <artifactId>parent</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </parent> <artifactId>rest-api</artifactId> <name>rest-api</name> @@ -19,19 +19,19 @@ <dependency> <groupId>lcsb.mapviewer</groupId> <artifactId>model</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </dependency> <dependency> <groupId>lcsb.mapviewer</groupId> <artifactId>service</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </dependency> <dependency> <groupId>lcsb.mapviewer</groupId> <artifactId>pathvisio</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </dependency> <dependency> diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayEntryDTOSerializer.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayEntryDTOSerializer.java index 64932af3e8c3c408d625fbda919bcaca764744af..99fb059d98ea877aeac93eddf75b336e8cd1401b 100644 --- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayEntryDTOSerializer.java +++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayEntryDTOSerializer.java @@ -1,27 +1,26 @@ package lcsb.mapviewer.api.projects.overlays; -import java.io.IOException; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; - import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.ser.FilterProvider; import com.fasterxml.jackson.databind.ser.PropertyFilter; - import lcsb.mapviewer.api.projects.overlays.OverlayController.OverlayEntryDTO; import lcsb.mapviewer.model.overlay.DataOverlayType; import lcsb.mapviewer.model.overlay.GeneVariantDataOverlayEntry; import lcsb.mapviewer.modelutils.serializer.CustomExceptFilter; import lcsb.mapviewer.modelutils.serializer.model.map.ElementIdentifierType; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; + public class OverlayEntryDTOSerializer extends JsonSerializer<OverlayEntryDTO> { @Override public void serialize(final OverlayEntryDTO entry, final JsonGenerator gen, - final SerializerProvider serializers) + final SerializerProvider serializers) throws IOException { PropertyFilter filter = null; @@ -60,6 +59,9 @@ public class OverlayEntryDTOSerializer extends JsonSerializer<OverlayEntryDTO> { case "description": value = entry.getEntry().getDescription(); break; + case "sourcedata": + value = entry.getEntry().getSourceData(); + break; case "width": if (Objects.equals(entry.getType(), ElementIdentifierType.REACTION)) { value = entry.getEntry().getLineWidth(); @@ -78,7 +80,7 @@ public class OverlayEntryDTOSerializer extends JsonSerializer<OverlayEntryDTO> { if (entry.getEntry() instanceof GeneVariantDataOverlayEntry) { value = ((GeneVariantDataOverlayEntry) entry.getEntry()).getGeneVariants(); } else { - value = new Object[] {}; + value = new Object[]{}; } break; default: @@ -102,6 +104,7 @@ public class OverlayEntryDTOSerializer extends JsonSerializer<OverlayEntryDTO> { "type", "geneVariations", "uniqueId", + "sourceData", "width"); } diff --git a/service/pom.xml b/service/pom.xml index b1131cba882e95d958b840e48b6484ee1c9aa6cd..16fb7b20328bb6062b39c379b929ac40b5df8651 100644 --- a/service/pom.xml +++ b/service/pom.xml @@ -6,7 +6,7 @@ <parent> <groupId>lcsb.mapviewer</groupId> <artifactId>parent</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </parent> <artifactId>service</artifactId> @@ -19,7 +19,7 @@ <dependency> <groupId>lcsb.mapviewer</groupId> <artifactId>model</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </dependency> <!-- dependency from the MapViewer dao --> @@ -27,47 +27,47 @@ <dependency> <groupId>lcsb.mapviewer</groupId> <artifactId>persist</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </dependency> <dependency> <groupId>lcsb.mapviewer</groupId> <artifactId>model-command</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </dependency> <dependency> <groupId>lcsb.mapviewer</groupId> <artifactId>annotation</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </dependency> <!-- dependency from the MapViewer cell designer parser --> <dependency> <groupId>lcsb.mapviewer</groupId> <artifactId>converter-CellDesigner</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </dependency> <!-- dependency from the MapViewer SBGN-ML parser --> <dependency> <groupId>lcsb.mapviewer</groupId> <artifactId>converter-SBGNML</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </dependency> <!-- dependency from the MapViewer graphics converter --> <dependency> <groupId>lcsb.mapviewer</groupId> <artifactId>converter-graphics</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </dependency> <!-- dependency from the SBML parser --> <dependency> <groupId>lcsb.mapviewer</groupId> <artifactId>converter-sbml</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </dependency> <!-- Log4J2 --> diff --git a/web/pom.xml b/web/pom.xml index a7feec46e84d6994eefafd9bd66e7f97b7d29c98..fb8565aa8a1911d81b959b1cce63e798baca6dcb 100644 --- a/web/pom.xml +++ b/web/pom.xml @@ -6,7 +6,7 @@ <parent> <groupId>lcsb.mapviewer</groupId> <artifactId>parent</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </parent> <artifactId>web</artifactId> <packaging>jar</packaging> @@ -36,19 +36,19 @@ <dependency> <groupId>lcsb.mapviewer</groupId> <artifactId>service</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </dependency> <dependency> <groupId>lcsb.mapviewer</groupId> <artifactId>rest-api</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </dependency> <dependency> <groupId>lcsb.mapviewer</groupId> <artifactId>frontend-js</artifactId> - <version>18.1.1</version> + <version>18.2.0</version> </dependency> <dependency> diff --git a/web/src/test/java/lcsb/mapviewer/web/OverlayControllerIntegrationTest.java b/web/src/test/java/lcsb/mapviewer/web/OverlayControllerIntegrationTest.java index 88fe296228dcc102ceab4486103ee1e7187c397a..7733dc5cda6abcf1169f810314697f48a2061388 100644 --- a/web/src/test/java/lcsb/mapviewer/web/OverlayControllerIntegrationTest.java +++ b/web/src/test/java/lcsb/mapviewer/web/OverlayControllerIntegrationTest.java @@ -631,6 +631,32 @@ public class OverlayControllerIntegrationTest extends ControllerIntegrationTest assertEquals(1, dataOverlayService.getDataOverlaysByProject(project).size()); } + @Test + public void testAdminCreateOverlayWithSourceData() throws Exception { + final User admin = userService.getUserByLogin(BUILT_IN_TEST_ADMIN_LOGIN); + + final UploadedFileEntry file = createFile("element_identifier\tvalue\tsource_data\n\t-1\txxx", admin); + + final MockHttpSession session = createSession(BUILT_IN_TEST_ADMIN_LOGIN, BUILT_IN_TEST_ADMIN_PASSWORD); + + final String body = EntityUtils.toString(new UrlEncodedFormEntity(Arrays.asList( + new BasicNameValuePair("fileId", String.valueOf(file.getId())), + new BasicNameValuePair("name", "overlay name"), + new BasicNameValuePair("description", "overlay name"), + new BasicNameValuePair("filename", "overlay name"), + new BasicNameValuePair("type", "GENERIC")))); + + final RequestBuilder request = post("/minerva/api/projects/{projectId}/overlays/", TEST_PROJECT) + .contentType(MediaType.APPLICATION_FORM_URLENCODED) + .content(body) + .session(session); + + mockMvc.perform(request) + .andExpect(status().is2xxSuccessful()); + + assertEquals(1, dataOverlayService.getDataOverlaysByProject(project).size()); + } + @Test public void testAdminCreateOverlayFromContent() throws Exception { final MockHttpSession session = createSession(BUILT_IN_TEST_ADMIN_LOGIN, BUILT_IN_TEST_ADMIN_PASSWORD); @@ -1448,6 +1474,10 @@ public class OverlayControllerIntegrationTest extends ControllerIntegrationTest .description("description assigned to the bioEntity from overlay") .type(JsonFieldType.STRING) .optional(), + fieldWithPath("overlayContent.sourceData") + .description("source data") + .type(JsonFieldType.STRING) + .optional(), fieldWithPath("overlayContent.geneVariations") .description("list of gene variants assigned to the bioEntity from overlay") .type(JsonFieldType.ARRAY) diff --git a/web/src/test/java/lcsb/mapviewer/web/api/NewApiDocs.java b/web/src/test/java/lcsb/mapviewer/web/api/NewApiDocs.java index 13293284c354ec1fc344b6bc9ffeb45cc6b82ea9..72b1da5f351aa75e06aa7df5df1ecf3b130f170e 100644 --- a/web/src/test/java/lcsb/mapviewer/web/api/NewApiDocs.java +++ b/web/src/test/java/lcsb/mapviewer/web/api/NewApiDocs.java @@ -129,6 +129,10 @@ public class NewApiDocs { fieldWithPath(prefix + "name") .description("bioEntity name that should match") .type(JsonFieldType.STRING), + fieldWithPath(prefix + "sourceData") + .description("source data") + .optional() + .type(JsonFieldType.STRING), fieldWithPath(prefix + "modelName") .description("bioEntity model name that should match") .optional()