From bc0de048939fd94c16195b7abba166caa3110f1d Mon Sep 17 00:00:00 2001 From: Piotr Gawron Date: Wed, 1 Apr 2020 15:13:19 +0200 Subject: [PATCH 01/10] upload of project with invalid data overlay should fail --- CHANGELOG | 2 + .../services/impl/LayoutService.java | 34 ++++++---- .../services/impl/ProjectService.java | 24 +++++-- ...llerIntegrationTestWithoutTransaction.java | 63 ++++++++++++++++++ .../complex_model_with_invalid_layouts.zip | Bin 0 -> 2175 bytes 5 files changed, 105 insertions(+), 18 deletions(-) create mode 100644 web/src/test/resources/complex_model_with_invalid_layouts.zip diff --git a/CHANGELOG b/CHANGELOG index 186a672d7..865e385a4 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,6 +2,8 @@ minerva (15.0.0~beta.3) unstable; urgency=medium * Improvement: API allows to merge files (#1208) * Bug fix: exported SBML was not compliant with the standard when element name was empty (#1147) + * Bug fix: invalid data overlays in uploaded zip file created "valid" project + that could not be opened (#1086) -- Piotr Gawron Wed, 1 Apr 2020 14:00:00 +0200 diff --git a/service/src/main/java/lcsb/mapviewer/services/impl/LayoutService.java b/service/src/main/java/lcsb/mapviewer/services/impl/LayoutService.java index 449260cfe..279dd106f 100644 --- a/service/src/main/java/lcsb/mapviewer/services/impl/LayoutService.java +++ b/service/src/main/java/lcsb/mapviewer/services/impl/LayoutService.java @@ -2,6 +2,7 @@ package lcsb.mapviewer.services.impl; import java.awt.Color; import java.io.IOException; +import java.io.InputStream; import java.util.*; import java.util.Comparator; @@ -151,21 +152,8 @@ public class LayoutService implements ILayoutService { @Override public Layout createLayout(final CreateLayoutParams params) throws IOException, InvalidColorSchemaException { ColorSchemaReader reader = new ColorSchemaReader(); - Map parameters = TextFileUtils.getHeaderParametersFromFile(params.getColorInputStream()); ColorSchemaType colorSchemaType = params.getColorSchemaType(); - if (colorSchemaType == null) { - String type = parameters.get(ZipEntryFileFactory.LAYOUT_HEADER_PARAM_TYPE); - if (type != null) { - colorSchemaType = ColorSchemaType.valueOf(type); - } - } - if (colorSchemaType == null) { - colorSchemaType = ColorSchemaType.GENERIC; - } - - if (parameters.get(ZipEntryFileFactory.LAYOUT_HEADER_PARAM_TYPE) == null && params.getColorSchemaType() != null) { - parameters.put(ZipEntryFileFactory.LAYOUT_HEADER_PARAM_TYPE, params.getColorSchemaType().name()); - } + Map parameters = extractHeaderParameters(params.getColorInputStream(), colorSchemaType); final Collection schemas = reader.readColorSchema(params.getColorInputStream(), parameters); // check if we can color our model using this schema, @@ -218,6 +206,24 @@ public class LayoutService implements ILayoutService { return topLayout; } + protected Map extractHeaderParameters(InputStream colorInputStream, ColorSchemaType colorSchemaType) throws IOException { + Map parameters = TextFileUtils.getHeaderParametersFromFile(colorInputStream); + if (colorSchemaType == null) { + String type = parameters.get(ZipEntryFileFactory.LAYOUT_HEADER_PARAM_TYPE); + if (type != null) { + colorSchemaType = ColorSchemaType.valueOf(type); + } + } + if (colorSchemaType == null) { + colorSchemaType = ColorSchemaType.GENERIC; + } + + if (parameters.get(ZipEntryFileFactory.LAYOUT_HEADER_PARAM_TYPE) == null && colorSchemaType != null) { + parameters.put(ZipEntryFileFactory.LAYOUT_HEADER_PARAM_TYPE, colorSchemaType.name()); + } + return parameters; + } + @Override public Layout createLayoutWithImages(final CreateLayoutParams params) throws IOException, InvalidColorSchemaException, CommandExecutionException { diff --git a/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java b/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java index 68d6f8a72..0c3cc3f23 100644 --- a/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java +++ b/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java @@ -50,8 +50,7 @@ import lcsb.mapviewer.services.overlay.AnnotatedObjectTreeRow; import lcsb.mapviewer.services.search.chemical.IChemicalService; import lcsb.mapviewer.services.search.drug.IDrugService; import lcsb.mapviewer.services.search.mirna.IMiRNAService; -import lcsb.mapviewer.services.utils.CreateProjectParams; -import lcsb.mapviewer.services.utils.EmailSender; +import lcsb.mapviewer.services.utils.*; import lcsb.mapviewer.services.utils.data.BuildInLayout; /** @@ -694,9 +693,11 @@ public class ProjectService implements IProjectService { * project where the model should be placed * @throws InvalidInputDataExecption * thrown when there is a problem with input file + * @throws InvalidColorSchemaException + * @throws IOException */ protected void createModel(final CreateProjectParams params, Project dbProject) - throws InvalidInputDataExecption, ConverterException { + throws InvalidInputDataExecption, ConverterException, IOException, InvalidColorSchemaException { User dbUser = userDao.getById(params.getUser().getId()); UserAnnotationSchema userAnnotationSchema = dbUser.getAnnotationSchema(); if (userAnnotationSchema == null) { @@ -830,7 +831,7 @@ public class ProjectService implements IProjectService { l.setOrderIndex(order++); } projectDao.update(project); - + validateDataOverlays(project); if (params.isUpdateAnnotations()) { Map, List> annotators = null; if (params.getAnnotatorsMap() != null) { @@ -853,6 +854,21 @@ public class ProjectService implements IProjectService { } + private void validateDataOverlays(final Project project) throws IOException, InvalidColorSchemaException { + for (Layout l : project.getLayouts()) { + if (l.getInputData() != null) { + ColorSchemaReader reader = new ColorSchemaReader(); + Map parameters = new LayoutService(null, null, null, null) + .extractHeaderParameters(new ByteArrayInputStream(l.getInputData().getFileContent()), null); + try { + reader.readColorSchema(new ByteArrayInputStream(l.getInputData().getFileContent()), parameters); + } catch (InvalidColorSchemaException e) { + throw new InvalidColorSchemaException("Problematic data overlay: " + l.getTitle() + ". " + e.getMessage(), e); + } + } + } + } + private void assignZoomLevelDataToModel(Model topModel) throws InvalidInputDataExecption { Integer maxZoomLevels = Integer .parseInt(configurationService.getValue(ConfigurationElementType.MAX_NUMBER_OF_MAP_LEVELS).getValue()); diff --git a/web/src/test/java/lcsb/mapviewer/web/ProjectControllerIntegrationTestWithoutTransaction.java b/web/src/test/java/lcsb/mapviewer/web/ProjectControllerIntegrationTestWithoutTransaction.java index 3f3441dd8..591a1fa02 100644 --- a/web/src/test/java/lcsb/mapviewer/web/ProjectControllerIntegrationTestWithoutTransaction.java +++ b/web/src/test/java/lcsb/mapviewer/web/ProjectControllerIntegrationTestWithoutTransaction.java @@ -1,5 +1,6 @@ package lcsb.mapviewer.web; +import static org.junit.Assert.assertEquals; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -20,8 +21,11 @@ import org.springframework.http.MediaType; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.web.servlet.RequestBuilder; +import lcsb.mapviewer.model.Project; +import lcsb.mapviewer.model.ProjectStatus; import lcsb.mapviewer.model.cache.UploadedFileEntry; import lcsb.mapviewer.model.user.User; +import lcsb.mapviewer.services.interfaces.IProjectService; import lcsb.mapviewer.services.interfaces.IUserService; @RunWith(SpringJUnit4ClassRunner.class) @@ -36,6 +40,9 @@ public class ProjectControllerIntegrationTestWithoutTransaction extends Controll @Autowired private IUserService userService; + @Autowired + private IProjectService projectService; + @Before public void setup() { } @@ -327,4 +334,60 @@ public class ProjectControllerIntegrationTestWithoutTransaction extends Controll } } + @Test + public void addComplexProjectWithInvalidOverlay() throws Exception { + User admin = userService.getUserByLogin(BUILT_IN_ADMIN_LOGIN); + UploadedFileEntry fileEntry = createFileInSeparateThread( + Files.readAllBytes(Paths.get("./src/test/resources/complex_model_with_invalid_layouts.zip")), admin); + try { + String body = EntityUtils.toString(new UrlEncodedFormEntity(Arrays.asList( + new BasicNameValuePair("file-id", String.valueOf(fileEntry.getId())), + new BasicNameValuePair("mapCanvasType", "OPEN_LAYERS"), + new BasicNameValuePair("parser", "lcsb.mapviewer.converter.model.celldesigner.CellDesignerXmlParser"), + + new BasicNameValuePair("zip-entries[0][_type]", "MAP"), + new BasicNameValuePair("zip-entries[0][_filename]", "main.xml"), + new BasicNameValuePair("zip-entries[0][_data][root]", "true"), + new BasicNameValuePair("zip-entries[0][_data][name]", "s1"), + new BasicNameValuePair("zip-entries[0][_data][type][id]", "UNKNOWN"), + new BasicNameValuePair("zip-entries[0][_data][type][name]", "Unknown"), + + new BasicNameValuePair("zip-entries[1][_type]", "OVERLAY"), + new BasicNameValuePair("zip-entries[1][_filename]", "layouts/badSchema.txt"), + new BasicNameValuePair("zip-entries[1][_data][name]", "test-o") + + ))); + + RequestBuilder request = post("/projects/" + TEST_PROJECT) + .contentType(MediaType.APPLICATION_FORM_URLENCODED) + .content(body) + .session(createSession(BUILT_IN_ADMIN_LOGIN, BUILT_IN_ADMIN_PASSWORD)); + + mockMvc.perform(request).andExpect(status().is2xxSuccessful()); + callInSeparateThread(() -> { + try { + waitForProjectToFinishLoading(TEST_PROJECT); + } catch (InterruptedException e) { + e.printStackTrace(); + } + return null; + }); + + Project project = projectService.getProjectByProjectId(TEST_PROJECT); + assertEquals(ProjectStatus.FAIL, project.getStatus()); + + } finally { + callInSeparateThread(() -> { + try { + waitForProjectToFinishLoading(TEST_PROJECT); + } catch (InterruptedException e) { + e.printStackTrace(); + } + return null; + }); + + removeProjectInSeparateThread(TEST_PROJECT); + } + } + } diff --git a/web/src/test/resources/complex_model_with_invalid_layouts.zip b/web/src/test/resources/complex_model_with_invalid_layouts.zip new file mode 100644 index 0000000000000000000000000000000000000000..a5984b116b380434cc5c8026d6a152f41076d00b GIT binary patch literal 2175 zcmZ{l3piA17{|}dFoty(D&#Vv5WB{mvTaIYjIi27Of$zA%(%=bLm2JSSk)s;?y0tM zS(;hOWerj(T0?SKa*wdGE-}(-)y}YXXKVY;bIyCtcmCh+yx)1B=l#1m!^ETj;gI@9 z&2jza?~Ak`;;~e$ABjjNk_jem|0v-fC?y0+A_+?XDIy}y2O@+(6oRFNMp8FaTVMcy z07|I|ZVtW+zg-Z#EfAc_BC1nZyaz52Bw>xIQB)5v1Vu*bHGk!{c{gfw!rg0u!jG&( z-#X0O)8h1Xi!%=`E?HXxx0Rs5zoU0g=z2|NUfFf?ri#8QsFH!7oO%_(+&P(17@;?z z3soqh913#RGs$EpTw*1cvwluYNERvkyng+9xwyXPqmI7D&hEyH^sZ+QdLDQE z($U>Fn3vfqpB?(BRU8ohi7kRe5y0Eyj6*jZT`Hf80YI>pa0UQKSR&atiWD+?{DjB2 z#g@2v&cbi8$P=f@E@>K4)K;FcoAJQh598|k+e3EacI!@aIC#TL`F&-u3{&v{z_BuNL!ylD%-t_zrz>PrYIoEBvJ;O~^8ay#$ZyiGoG6T^+wv>8baY@p_ zOS-ctUEBL}Cs0fY&kXvdop8a~&%p8P-LkP_hLSFx)SCz5p9HAU_QcRs*9bAa^k+sS8NZ5#5!qAl--KbHduPI!m>ESm+RlGbJ2W31FszIney#x zJER}uX`AMm=3WBK=V>L*e)2O5gcT^-bDWHXodmNQf|h55b+mtqiLP#ZXR;@SC6iHJcdsNTdTxdY z+Y!#hVYe0+@SjVd7+8iYwYfnR)UN*Sh$0Am<-@)_ahrHEs36aa8+_)iMkcj3meV^= zbwBgxE)y9Vl3RCK^+ntCvP?KTn1PIKmUmpuFHoFHV{fDLAKRXiwRg%n!9{pkQV_ck zIB(=i#Z&ghUHrmnojW{q>5okFf*jEK-rSdQTGKG*i~>khfY;RCwMg&Jb$CfuEFt9D zE&gs`aG)JuJ3JlIHy?NHr@^o)`Oob8EuC`j8ggSBdPWS5i%&i=w;Cg*-8m)>@{U{1{)lsBD=MlIMm{OAN_n%zg`-Q{NGWZX|C_s`B0A zHfYA4a;h#)g}>B3xSSfaoEpD>Z_{aMze_{$F{|M%hX(WI*8VgaT`AM7F4kOG=8sp| zs;yZKSr!+xPiAy4?Gxi`UyFv&4nk<08c5|5{CFowNUwzp@}?r5mT>X2m&CvE0ugIH^>6?dQg z{x{*6w3sy5-l4&+TZ>H+Vz{fYpZYV~W>Us$**LutKyOqbm-B9WT5Y=@a>rnSdwkBD z^1kyY>%a%B)*9a0rK2<{ZLq|S8j|Af9QROP1;-3A0`Rk*Z4{o`5nSjYUbD6J+UZi1 z-_cl1b`XOm_6%hb^V~Ew8ZT$(-30%&Fb`{589;A=yE%Z1b`EjSeHB$KX|y*v>0z6u zY@m@!*<>E8+VjQnMjd|->jPfpc?qb>fQ35Kx+$$R&#uZnU|?qi%4k+b1p*9n4o;4dytWjnSkye}& zn3GpEHJZ;}&;4Eh(O%1`+!H71C9bztvt`3zT`!gRe~4w3S&al#j~wgGtR_sUqREfi zCSzo@b+1_@U+!O)coVLKZW_h-31Q9Be*IZ_y$!LI%yE3`n4@(Q^aW z9;3`?*688)7Yj$87#oMi`rnz4ZP2^)|R+9Txx7 z>nV|^NZ2r8uZKW2flpbCuApHGhx|tPkKsrGTI;hAU@LGZz_qP#v;*>C6s3P`OQLiG z0qbv*5(O`z5?h4e52GmfV=EH{V+7z$V-qF6ez1~QBp`3b*$DoR(m@8RTC>5>2j^n4Lcu-T`q6I9M-CYBP#%`{Sx^l7-c> ng#*B5jYY{}y;t4~iJP%u%)fDC+v0*1000*p2q*wx*Ps3Zv%F1a literal 0 HcmV?d00001 -- GitLab From 8c7752a610fd78230749c054d803420c3be1fafa Mon Sep 17 00:00:00 2001 From: Piotr Gawron Date: Wed, 1 Apr 2020 15:49:27 +0200 Subject: [PATCH 02/10] logs contain infformation about the responsible species --- .../mapviewer/wikipathway/XML/DataNodeParser.java | 4 ++-- .../mapviewer/wikipathway/XML/EdgeLineParser.java | 5 +++-- .../lcsb/mapviewer/wikipathway/XML/EdgeParser.java | 4 ++-- .../mapviewer/wikipathway/XML/ElementGpmlParser.java | 5 +++-- .../lcsb/mapviewer/wikipathway/XML/LabelParser.java | 4 ++-- .../lcsb/mapviewer/wikipathway/XML/ModelToGPML.java | 12 +++++++----- .../mapviewer/wikipathway/XML/PointDataParser.java | 5 +++-- .../mapviewer/wikipathway/XML/ReferenceParser.java | 10 +++++----- .../lcsb/mapviewer/wikipathway/XML/ShapeParser.java | 5 +++-- .../lcsb/mapviewer/wikipathway/XML/StateParser.java | 5 +++-- .../wikipathway/XML/ReferenceParserTest.java | 7 +++++-- 11 files changed, 38 insertions(+), 28 deletions(-) diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/DataNodeParser.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/DataNodeParser.java index 82812c02c..6e9c6263d 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/DataNodeParser.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/DataNodeParser.java @@ -111,12 +111,12 @@ public class DataNodeParser extends GraphicalPathwayElementParser { } @Override - public String toXml(DataNode node) throws ConverterException { + public String toXml(DataNode node, LogMarker logMarker) throws ConverterException { throw new NotImplementedException(); } @Override - public String toXml(Collection list) throws ConverterException { + public String toXml(Collection list, LogMarker logMarker) throws ConverterException { throw new NotImplementedException(); } diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/EdgeLineParser.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/EdgeLineParser.java index a3553184d..a667ea8a9 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/EdgeLineParser.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/EdgeLineParser.java @@ -10,6 +10,7 @@ import lcsb.mapviewer.common.Pair; import lcsb.mapviewer.common.exception.InvalidArgumentException; import lcsb.mapviewer.common.exception.NotImplementedException; import lcsb.mapviewer.converter.ConverterException; +import lcsb.mapviewer.model.LogMarker; import lcsb.mapviewer.wikipathway.model.Edge; /** @@ -86,12 +87,12 @@ public class EdgeLineParser extends ElementGpmlParser { } @Override - public String toXml(Edge node) throws ConverterException { + public String toXml(Edge node, LogMarker logMarker) throws ConverterException { throw new NotImplementedException(); } @Override - public String toXml(Collection list) throws ConverterException { + public String toXml(Collection list, LogMarker logMarker) throws ConverterException { throw new NotImplementedException(); } } diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/EdgeParser.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/EdgeParser.java index 08edc2dc6..5f7c411c7 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/EdgeParser.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/EdgeParser.java @@ -139,12 +139,12 @@ public class EdgeParser extends ElementGpmlParser { } @Override - public String toXml(Edge node) throws ConverterException { + public String toXml(Edge node, LogMarker logMarker) throws ConverterException { throw new NotImplementedException(); } @Override - public String toXml(Collection list) throws ConverterException { + public String toXml(Collection list, LogMarker logMarker) throws ConverterException { throw new NotImplementedException(); } diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ElementGpmlParser.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ElementGpmlParser.java index 3e354316d..783de3cbb 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ElementGpmlParser.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ElementGpmlParser.java @@ -10,6 +10,7 @@ import org.w3c.dom.*; import lcsb.mapviewer.common.Pair; import lcsb.mapviewer.common.exception.InvalidArgumentException; import lcsb.mapviewer.converter.ConverterException; +import lcsb.mapviewer.model.LogMarker; /** * Generic parser for GPML xml structures. @@ -57,7 +58,7 @@ public abstract class ElementGpmlParser { * @throws ConverterException * thrown when there is a problem with converting into xml */ - public abstract String toXml(T object) throws ConverterException; + public abstract String toXml(T object, LogMarker logMarker) throws ConverterException; /** * Converts list of objects into xml string (in GPML format) representing this @@ -69,7 +70,7 @@ public abstract class ElementGpmlParser { * @throws ConverterException * thrown when there is a problem with converting into xml */ - public abstract String toXml(Collection list) throws ConverterException; + public abstract String toXml(Collection list, LogMarker logMarker) throws ConverterException; /** * Creates list of object from list of xml nodes. diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/LabelParser.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/LabelParser.java index 72f63ca3a..a003e34d4 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/LabelParser.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/LabelParser.java @@ -102,12 +102,12 @@ public class LabelParser extends GraphicalPathwayElementParser\n"); } } @@ -495,7 +497,7 @@ public class ModelToGPML { "Color=\"" + colorToString(species.getFontColor()) + "\" " + "FillColor=\"" + colorToString(species.getFillColor()) + "\"/>\n"); - result.append(referenceParser.toXml(species.getMiriamData())); + result.append(referenceParser.toXml(species.getMiriamData(), new LogMarker(ProjectLogEntryType.EXPORT_ISSUE, species))); result.append(" \n"); return result.toString(); } @@ -526,7 +528,7 @@ public class ModelToGPML { "Color=\"" + colorToString(species.getFontColor()) + "\" " + "FillColor=\"" + colorToString(species.getFillColor()) + "\"/>\n"); - result.append(referenceParser.toXml(species.getMiriamData())); + result.append(referenceParser.toXml(species.getMiriamData(), new LogMarker(ProjectLogEntryType.EXPORT_ISSUE, species))); result.append(" \n"); return result.toString(); } @@ -622,7 +624,7 @@ public class ModelToGPML { interactions.append(anchors.toString()); interactions.append(" \n"); - interactions.append(referenceParser.toXml(reaction.getMiriamData())); + interactions.append(referenceParser.toXml(reaction.getMiriamData(), new LogMarker(ProjectLogEntryType.EXPORT_ISSUE, reaction))); interactions.append(" \n"); interactions.append(tmp.toString()); } diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/PointDataParser.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/PointDataParser.java index 8c436e2b6..4b26c6cb2 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/PointDataParser.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/PointDataParser.java @@ -9,6 +9,7 @@ import org.w3c.dom.Element; import lcsb.mapviewer.common.Pair; import lcsb.mapviewer.common.exception.NotImplementedException; import lcsb.mapviewer.converter.ConverterException; +import lcsb.mapviewer.model.LogMarker; import lcsb.mapviewer.wikipathway.model.*; /** @@ -64,12 +65,12 @@ public class PointDataParser extends ElementGpmlParser { } @Override - public String toXml(PointData node) throws ConverterException { + public String toXml(PointData node, LogMarker logMarker) throws ConverterException { throw new NotImplementedException(); } @Override - public String toXml(Collection list) throws ConverterException { + public String toXml(Collection list, LogMarker logMarker) throws ConverterException { throw new NotImplementedException(); } } diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ReferenceParser.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ReferenceParser.java index 5f230ef31..cf01da603 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ReferenceParser.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ReferenceParser.java @@ -157,7 +157,7 @@ public class ReferenceParser extends ElementGpmlParser { } @Override - public String toXml(MiriamData md) throws ConverterException { + public String toXml(MiriamData md, LogMarker logMarker) throws ConverterException { if (md == null) { return "\n"; } else if (MiriamType.PUBMED.equals(md.getDataType())) { @@ -177,7 +177,7 @@ public class ReferenceParser extends ElementGpmlParser { } @Override - public String toXml(Collection miriamData) throws ConverterException { + public String toXml(Collection miriamData, LogMarker logMarker) throws ConverterException { StringBuilder result = new StringBuilder(""); int counter = 0; for (MiriamData md : miriamData) { @@ -186,7 +186,7 @@ public class ReferenceParser extends ElementGpmlParser { if (counter == 1) { MinervaLoggerAppender appender = MinervaLoggerAppender.createAppender(); try { - result.append(toXml(md)); + result.append(toXml(md, logMarker)); if (appender.getWarnings().size() > 0) { counter--; } @@ -194,13 +194,13 @@ public class ReferenceParser extends ElementGpmlParser { MinervaLoggerAppender.unregisterLogEventStorage(appender); } } else { - logger.warn("Annotation ommited - gpml support only one annotation per element: " + md.getDataType() + ": " + logger.warn(logMarker, "Annotation ommited - gpml support only one annotation per element: " + md.getDataType() + ": " + md.getResource()); } } } if (counter == 0) { - return toXml((MiriamData) null); + return toXml((MiriamData) null, null); } return result.toString(); } diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ShapeParser.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ShapeParser.java index 6bade4543..206513446 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ShapeParser.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ShapeParser.java @@ -12,6 +12,7 @@ import lcsb.mapviewer.common.Pair; import lcsb.mapviewer.common.exception.InvalidArgumentException; import lcsb.mapviewer.common.exception.NotImplementedException; import lcsb.mapviewer.converter.ConverterException; +import lcsb.mapviewer.model.LogMarker; import lcsb.mapviewer.model.graphics.LineType; import lcsb.mapviewer.wikipathway.model.Shape; import lcsb.mapviewer.wikipathway.model.UnknownTypeException; @@ -84,12 +85,12 @@ public class ShapeParser extends GraphicalPathwayElementParser { } @Override - public String toXml(Shape node) throws ConverterException { + public String toXml(Shape node, LogMarker logMarker) throws ConverterException { throw new NotImplementedException(); } @Override - public String toXml(Collection list) throws ConverterException { + public String toXml(Collection list, LogMarker logMarker) throws ConverterException { throw new NotImplementedException(); } diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/StateParser.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/StateParser.java index d6fde52c3..7bbb23b6d 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/StateParser.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/StateParser.java @@ -10,6 +10,7 @@ import lcsb.mapviewer.common.Pair; import lcsb.mapviewer.common.exception.InvalidArgumentException; import lcsb.mapviewer.common.exception.NotImplementedException; import lcsb.mapviewer.converter.ConverterException; +import lcsb.mapviewer.model.LogMarker; import lcsb.mapviewer.model.map.MiriamData; import lcsb.mapviewer.model.map.species.field.ModificationState; import lcsb.mapviewer.wikipathway.model.*; @@ -109,12 +110,12 @@ public class StateParser extends ElementGpmlParser { } @Override - public String toXml(State node) throws ConverterException { + public String toXml(State node, LogMarker logMarker) throws ConverterException { throw new NotImplementedException(); } @Override - public String toXml(Collection list) throws ConverterException { + public String toXml(Collection list, LogMarker logMarker) throws ConverterException { throw new NotImplementedException(); } diff --git a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ReferenceParserTest.java b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ReferenceParserTest.java index d1eb97045..866af19c2 100644 --- a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ReferenceParserTest.java +++ b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ReferenceParserTest.java @@ -8,8 +8,11 @@ import org.junit.*; import org.w3c.dom.Element; import org.w3c.dom.Node; +import lcsb.mapviewer.model.LogMarker; +import lcsb.mapviewer.model.ProjectLogEntryType; import lcsb.mapviewer.model.map.MiriamData; import lcsb.mapviewer.model.map.MiriamType; +import lcsb.mapviewer.model.map.species.GenericProtein; import lcsb.mapviewer.wikipathway.WikipathwaysTestFunctions; public class ReferenceParserTest extends WikipathwaysTestFunctions { @@ -44,7 +47,7 @@ public class ReferenceParserTest extends WikipathwaysTestFunctions { @Test public void testToXml() throws Exception { MiriamData md = new MiriamData(MiriamType.CHEBI, "CHEBI:123"); - String xml = mc.toXml(md); + String xml = mc.toXml(md, null); Node node = super.getNodeFromXmlString(xml); MiriamData md2 = mc.parse((Element) node); @@ -57,7 +60,7 @@ public class ReferenceParserTest extends WikipathwaysTestFunctions { public void testToXmlUnknownType() throws Exception { @SuppressWarnings("deprecation") MiriamData md = new MiriamData(MiriamType.UNKNOWN, "xyz"); - String xml = mc.toXml(md); + String xml = mc.toXml(md, null); assertNotNull(xml); assertEquals(1, getWarnings().size()); -- GitLab From 4281175950006f4a001e397360d3144dbef1345f Mon Sep 17 00:00:00 2001 From: Piotr Gawron Date: Thu, 2 Apr 2020 08:21:45 +0200 Subject: [PATCH 03/10] preserve font color of compartment on export --- CHANGELOG | 1 + .../wikipathway/XML/ModelContructor.java | 1 - .../wikipathway/XML/ModelToGPML.java | 73 +++++++++++-------- 3 files changed, 42 insertions(+), 33 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 3a90d38ee..192540c1c 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -4,6 +4,7 @@ minerva (15.0.0~beta.3) unstable; urgency=medium name was empty (#1147) * Bug fix: flybase and pato annotations from CellDesigner were not picked (#1113) + * Bug fix: export to GPML preserves font color of compartments (#1111) -- Piotr Gawron Wed, 1 Apr 2020 14:00:00 +0200 diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelContructor.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelContructor.java index 025739629..3e777abe8 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelContructor.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelContructor.java @@ -13,7 +13,6 @@ import lcsb.mapviewer.common.Configuration; import lcsb.mapviewer.common.exception.InvalidArgumentException; import lcsb.mapviewer.common.exception.InvalidStateException; import lcsb.mapviewer.converter.ConverterException; -import lcsb.mapviewer.converter.model.celldesigner.geometry.CellDesignerAliasConverter; import lcsb.mapviewer.converter.model.celldesigner.geometry.helper.PolylineDataFactory; import lcsb.mapviewer.converter.model.celldesigner.reaction.ReactionLineData; import lcsb.mapviewer.converter.model.celldesigner.types.ModifierType; diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelToGPML.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelToGPML.java index 2ee514ca6..a2e680b21 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelToGPML.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelToGPML.java @@ -287,36 +287,41 @@ public class ModelToGPML { * @return String that encodes all compartments in GPML format */ private String getComparments(Model model) { - StringBuilder comparments = new StringBuilder(""); - for (Compartment ca : model.getCompartments()) { - - double x = ca.getCenterX(), y = ca.getCenterY(), h = ca.getHeight(), w = ca.getWidth(); - String shape; - if (ca instanceof OvalCompartment) { - shape = "Oval"; - } else { - shape = "Rectangle"; - } + StringBuilder result = new StringBuilder(""); + for (Compartment compartment : model.getCompartments()) { + result.append(compartmentToXml(compartment)); + } + return result.toString(); + } - comparments.append(" \n"); - comparments.append(" " + getAllNames(ca) + "\n"); - comparments.append(" \n"); - comparments.append(" \n"); - comparments.append( - " \n"); - comparments.append(" \n"); + String compartmentToXml(Compartment ca) { + StringBuilder comparments = new StringBuilder(""); + double x = ca.getCenterX(), y = ca.getCenterY(), h = ca.getHeight(), w = ca.getWidth(); + String shape; + if (ca instanceof OvalCompartment) { + shape = "Oval"; + } else { + shape = "Rectangle"; } + + comparments.append(" \n"); + comparments.append(" " + getAllNames(ca) + "\n"); + comparments.append(" \n"); + comparments.append(" \n"); + comparments.append( + " \n"); + comparments.append(" \n"); return comparments.toString(); } @@ -456,7 +461,8 @@ public class ModelToGPML { "FillColor=\"" + colorToString(ca.getFillColor()) + "\" " + "LineStyle=\"Broken\"/>\n"); - dataNodes.append(referenceParser.toXml(ca.getMiriamData(), new LogMarker(ProjectLogEntryType.EXPORT_ISSUE, ca))); + dataNodes + .append(referenceParser.toXml(ca.getMiriamData(), new LogMarker(ProjectLogEntryType.EXPORT_ISSUE, ca))); dataNodes.append(" \n"); } } @@ -497,7 +503,8 @@ public class ModelToGPML { "Color=\"" + colorToString(species.getFontColor()) + "\" " + "FillColor=\"" + colorToString(species.getFillColor()) + "\"/>\n"); - result.append(referenceParser.toXml(species.getMiriamData(), new LogMarker(ProjectLogEntryType.EXPORT_ISSUE, species))); + result.append( + referenceParser.toXml(species.getMiriamData(), new LogMarker(ProjectLogEntryType.EXPORT_ISSUE, species))); result.append(" \n"); return result.toString(); } @@ -528,7 +535,8 @@ public class ModelToGPML { "Color=\"" + colorToString(species.getFontColor()) + "\" " + "FillColor=\"" + colorToString(species.getFillColor()) + "\"/>\n"); - result.append(referenceParser.toXml(species.getMiriamData(), new LogMarker(ProjectLogEntryType.EXPORT_ISSUE, species))); + result.append( + referenceParser.toXml(species.getMiriamData(), new LogMarker(ProjectLogEntryType.EXPORT_ISSUE, species))); result.append(" \n"); return result.toString(); } @@ -624,7 +632,8 @@ public class ModelToGPML { interactions.append(anchors.toString()); interactions.append(" \n"); - interactions.append(referenceParser.toXml(reaction.getMiriamData(), new LogMarker(ProjectLogEntryType.EXPORT_ISSUE, reaction))); + interactions.append( + referenceParser.toXml(reaction.getMiriamData(), new LogMarker(ProjectLogEntryType.EXPORT_ISSUE, reaction))); interactions.append(" \n"); interactions.append(tmp.toString()); } -- GitLab From c028b494b16a23196ce106cd6889b4456702be58 Mon Sep 17 00:00:00 2001 From: Piotr Gawron Date: Thu, 2 Apr 2020 08:38:06 +0200 Subject: [PATCH 04/10] info about hypotetical complexes is exporoted --- CHANGELOG | 2 + .../wikipathway/XML/ModelToGPML.java | 3 + .../wikipathway/XML/ModelToGPMLTest.java | 69 ++++++++++++++++--- .../wikipathway/XML/ReferenceParserTest.java | 3 - 4 files changed, 63 insertions(+), 14 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 192540c1c..4611655d9 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -5,6 +5,8 @@ minerva (15.0.0~beta.3) unstable; urgency=medium * Bug fix: flybase and pato annotations from CellDesigner were not picked (#1113) * Bug fix: export to GPML preserves font color of compartments (#1111) + * Bug fix: export to GPML preserves information about hypotetical complexes + (#1111) -- Piotr Gawron Wed, 1 Apr 2020 14:00:00 +0200 diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelToGPML.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelToGPML.java index a2e680b21..d1ac757c9 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelToGPML.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelToGPML.java @@ -557,6 +557,9 @@ public class ModelToGPML { if (ca.getComplex() != null) { groups.append(" GroupRef=\"" + ca.getComplex().getElementId() + "\""); } + if (!ca.isHypothetical()) { + groups.append(" Style=\"Complex\""); + } groups.append("/>\n"); } } diff --git a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ModelToGPMLTest.java b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ModelToGPMLTest.java index d00f02f1f..452d3d559 100644 --- a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ModelToGPMLTest.java +++ b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ModelToGPMLTest.java @@ -23,6 +23,8 @@ import lcsb.mapviewer.wikipathway.WikipathwaysTestFunctions; public class ModelToGPMLTest extends WikipathwaysTestFunctions { Logger logger = LogManager.getLogger(); + int speciesCounter = 0; + @Before public void setUp() throws Exception { } @@ -52,12 +54,12 @@ public class ModelToGPMLTest extends WikipathwaysTestFunctions { model.setWidth(1000); model.setHeight(1000); - GenericProtein alias = createProtein(); - alias.addMiriamData(new MiriamData(MiriamType.HGNC_SYMBOL, "SNCA")); - alias.addMiriamData(new MiriamData(MiriamType.PUBMED, "123")); - alias.addMiriamData(new MiriamData(MiriamType.PUBMED, "1234")); + GenericProtein protein = createProtein(); + protein.addMiriamData(new MiriamData(MiriamType.HGNC_SYMBOL, "SNCA")); + protein.addMiriamData(new MiriamData(MiriamType.PUBMED, "123")); + protein.addMiriamData(new MiriamData(MiriamType.PUBMED, "1234")); - model.addElement(alias); + model.addElement(protein); ModelToGPML parser = new ModelToGPML(model.getName()); String xml = parser.getGPML(model); @@ -66,14 +68,48 @@ public class ModelToGPMLTest extends WikipathwaysTestFunctions { Model model2 = new GPMLToModel().getModel(new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8))); - Element p = model2.getElementByElementId("sa"); + Element p = model2.getElementByElementId(protein.getElementId()); - assertEquals(alias.getMiriamData().size(), p.getMiriamData().size()); + assertEquals(protein.getMiriamData().size(), p.getMiriamData().size()); for (MiriamData md : p.getMiriamData()) { - assertTrue(alias.getMiriamData().contains(md)); + assertTrue(protein.getMiriamData().contains(md)); } } + @Test + public void testHypoteticalComplex() throws Exception { + + Model model = new ModelFullIndexed(null); + model.setWidth(1000); + model.setHeight(1000); + + Complex complex = createComplex(); + complex.addSpecies(createProtein()); + complex.setHypothetical(false); + + Complex complex2 = createComplex(); + complex2.addSpecies(createProtein()); + complex2.setHypothetical(true); + + model.addElement(complex); + model.addElement(complex2); + model.addElements(complex.getElements()); + model.addElements(complex2.getElements()); + + ModelToGPML parser = new ModelToGPML(model.getName()); + String xml = parser.getGPML(model); + assertNotNull(xml); + assertEquals(0, getWarnings().size()); + + Model model2 = new GPMLToModel().getModel(new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8))); + + Complex newComplex = model2.getElementByElementId(complex.getElementId()); + Complex newComplex2 = model2.getElementByElementId(complex2.getElementId()); + + assertEquals(complex.isHypothetical(), newComplex.isHypothetical()); + assertEquals(complex2.isHypothetical(), newComplex2.isHypothetical()); + } + @Test public void testGetRectangle() throws Exception { ModelToGPML parser = new ModelToGPML("xyz"); @@ -90,7 +126,7 @@ public class ModelToGPMLTest extends WikipathwaysTestFunctions { } private Unknown createUnknown() { - Unknown result = new Unknown("id"); + Unknown result = new Unknown("id"+(speciesCounter++)); result.setName("s2"); result.setWidth(10); result.setHeight(10); @@ -101,7 +137,7 @@ public class ModelToGPMLTest extends WikipathwaysTestFunctions { } private GenericProtein createProtein() { - GenericProtein protein = new GenericProtein("sa"); + GenericProtein protein = new GenericProtein("sa"+(speciesCounter++)); protein.setName("s2"); protein.setWidth(10); protein.setHeight(10); @@ -111,8 +147,19 @@ public class ModelToGPMLTest extends WikipathwaysTestFunctions { return protein; } + private Complex createComplex() { + Complex complex = new Complex("sa"+(speciesCounter++)); + complex.setName("s2"); + complex.setWidth(10); + complex.setHeight(10); + complex.setX(1); + complex.setY(1); + complex.setZ(15); + return complex; + } + private Compartment createCompartment() { - Compartment compartment= new Compartment("ca"); + Compartment compartment= new Compartment("ca"+(speciesCounter++)); compartment.setName("s2"); compartment.setWidth(10); compartment.setHeight(10); diff --git a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ReferenceParserTest.java b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ReferenceParserTest.java index 866af19c2..997a49d4d 100644 --- a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ReferenceParserTest.java +++ b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ReferenceParserTest.java @@ -8,11 +8,8 @@ import org.junit.*; import org.w3c.dom.Element; import org.w3c.dom.Node; -import lcsb.mapviewer.model.LogMarker; -import lcsb.mapviewer.model.ProjectLogEntryType; import lcsb.mapviewer.model.map.MiriamData; import lcsb.mapviewer.model.map.MiriamType; -import lcsb.mapviewer.model.map.species.GenericProtein; import lcsb.mapviewer.wikipathway.WikipathwaysTestFunctions; public class ReferenceParserTest extends WikipathwaysTestFunctions { -- GitLab From 880ac68ba97cf27d9b3cc6d6ca037b20523e09f0 Mon Sep 17 00:00:00 2001 From: Piotr Gawron Date: Thu, 2 Apr 2020 09:20:17 +0200 Subject: [PATCH 05/10] color schema type was assigned inproperly --- .../lcsb/mapviewer/services/impl/LayoutService.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/service/src/main/java/lcsb/mapviewer/services/impl/LayoutService.java b/service/src/main/java/lcsb/mapviewer/services/impl/LayoutService.java index 279dd106f..e93c4ad9f 100644 --- a/service/src/main/java/lcsb/mapviewer/services/impl/LayoutService.java +++ b/service/src/main/java/lcsb/mapviewer/services/impl/LayoutService.java @@ -152,8 +152,9 @@ public class LayoutService implements ILayoutService { @Override public Layout createLayout(final CreateLayoutParams params) throws IOException, InvalidColorSchemaException { ColorSchemaReader reader = new ColorSchemaReader(); - ColorSchemaType colorSchemaType = params.getColorSchemaType(); - Map parameters = extractHeaderParameters(params.getColorInputStream(), colorSchemaType); + Map parameters = extractHeaderParameters(params.getColorInputStream(), params.getColorSchemaType()); + ColorSchemaType colorSchemaType = ColorSchemaType + .valueOf(parameters.get(ZipEntryFileFactory.LAYOUT_HEADER_PARAM_TYPE)); final Collection schemas = reader.readColorSchema(params.getColorInputStream(), parameters); // check if we can color our model using this schema, @@ -206,7 +207,8 @@ public class LayoutService implements ILayoutService { return topLayout; } - protected Map extractHeaderParameters(InputStream colorInputStream, ColorSchemaType colorSchemaType) throws IOException { + protected Map extractHeaderParameters(InputStream colorInputStream, ColorSchemaType colorSchemaType) + throws IOException { Map parameters = TextFileUtils.getHeaderParametersFromFile(colorInputStream); if (colorSchemaType == null) { String type = parameters.get(ZipEntryFileFactory.LAYOUT_HEADER_PARAM_TYPE); @@ -218,7 +220,7 @@ public class LayoutService implements ILayoutService { colorSchemaType = ColorSchemaType.GENERIC; } - if (parameters.get(ZipEntryFileFactory.LAYOUT_HEADER_PARAM_TYPE) == null && colorSchemaType != null) { + if (parameters.get(ZipEntryFileFactory.LAYOUT_HEADER_PARAM_TYPE) == null) { parameters.put(ZipEntryFileFactory.LAYOUT_HEADER_PARAM_TYPE, colorSchemaType.name()); } return parameters; -- GitLab From 9137ec82cb49bef252fe9fbe5a8b396b5e5c9751 Mon Sep 17 00:00:00 2001 From: Piotr Gawron Date: Thu, 2 Apr 2020 10:34:29 +0200 Subject: [PATCH 06/10] preserve complex name on export to GPML --- CHANGELOG | 1 + .../mapviewer/wikipathway/XML/GpmlParser.java | 2 + .../wikipathway/XML/ModelContructor.java | 2 +- .../wikipathway/XML/ModelToGPML.java | 15 ++++--- .../mapviewer/wikipathway/model/Group.java | 22 +++++++--- .../wikipathway/XML/ModelToGPMLTest.java | 40 +++++++++++++++---- 6 files changed, 63 insertions(+), 19 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 39a2d993d..0fd420e2c 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -9,6 +9,7 @@ minerva (15.0.0~beta.3) unstable; urgency=medium * Bug fix: export to GPML preserves font color of compartments (#1111) * Bug fix: export to GPML preserves information about hypotetical complexes (#1111) + * Bug fix: export to GPML preserves complex name (#1111) -- Piotr Gawron Wed, 1 Apr 2020 14:00:00 +0200 diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/GpmlParser.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/GpmlParser.java index 5076795b4..e9ecd391e 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/GpmlParser.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/GpmlParser.java @@ -138,6 +138,7 @@ public class GpmlParser { for (Node nNode : groups) { if (nNode.getNodeType() == Node.ELEMENT_NODE) { Element eElement = (Element) nNode; + String graphId = eElement.getAttribute("GraphId"); String groupId = eElement.getAttribute("GroupId"); if (graphId.equals("") || graphId == null) { @@ -157,6 +158,7 @@ public class GpmlParser { } Group group = new Group(graphId, groupId, graph.getMapName()); group.setStyle(style); + group.setTextLabel(eElement.getAttribute("TextLabel")); String zIndex = eElement.getAttribute("ZOrder"); if (zIndex != null && !zIndex.isEmpty()) { diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelContructor.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelContructor.java index 3e777abe8..28052da5d 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelContructor.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelContructor.java @@ -157,7 +157,7 @@ public class ModelContructor { ((Complex) element).setHypothetical(true); } - element.setName(group.getGraphId()); + element.setName(group.getName()); Rectangle2D rec = group.getRectangle(); if (rec == null) { diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelToGPML.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelToGPML.java index d1ac757c9..9829e7649 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelToGPML.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelToGPML.java @@ -551,13 +551,16 @@ public class ModelToGPML { protected String getGroups(Model model) { StringBuilder groups = new StringBuilder(""); - for (Complex ca : model.getComplexList()) { - if (ca.getElements().size() > 0) { - groups.append(" 0) { + groups.append(" \n"); diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Group.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Group.java index 27188db64..9aba05aa3 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Group.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Group.java @@ -8,7 +8,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; /** - * Class used to store data from Group from .gpml. + * Class used to store data from Group from GPML. * * @author Jan Badura * @@ -38,6 +38,11 @@ public class Group extends PathwayElement { */ private String style; + /** + * Style of the group. + */ + private String textLabel; + /** * Elements in the group. */ @@ -67,11 +72,10 @@ public class Group extends PathwayElement { @Override public String getName() { - StringBuilder sb = new StringBuilder(""); - for (PathwayElement n : nodes) { - sb.append(n.getName() + ":"); + if (getTextLabel() == null) { + return getGraphId(); } - return sb.toString(); + return getTextLabel(); } @Override @@ -151,4 +155,12 @@ public class Group extends PathwayElement { this.additionalBounds.add(bounds); } + public String getTextLabel() { + return textLabel; + } + + public void setTextLabel(String textLabel) { + this.textLabel = textLabel; + } + } diff --git a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ModelToGPMLTest.java b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ModelToGPMLTest.java index 452d3d559..68afbd12b 100644 --- a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ModelToGPMLTest.java +++ b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ModelToGPMLTest.java @@ -24,7 +24,7 @@ public class ModelToGPMLTest extends WikipathwaysTestFunctions { Logger logger = LogManager.getLogger(); int speciesCounter = 0; - + @Before public void setUp() throws Exception { } @@ -105,16 +105,42 @@ public class ModelToGPMLTest extends WikipathwaysTestFunctions { Complex newComplex = model2.getElementByElementId(complex.getElementId()); Complex newComplex2 = model2.getElementByElementId(complex2.getElementId()); - + assertEquals(complex.isHypothetical(), newComplex.isHypothetical()); assertEquals(complex2.isHypothetical(), newComplex2.isHypothetical()); } + @Test + public void testComplexName() throws Exception { + + Model model = new ModelFullIndexed(null); + model.setWidth(1000); + model.setHeight(1000); + + Complex complex = createComplex(); + complex.addSpecies(createProtein()); + complex.setName("blabla"); + + model.addElement(complex); + model.addElements(complex.getElements()); + + ModelToGPML parser = new ModelToGPML(model.getName()); + String xml = parser.getGPML(model); + assertNotNull(xml); + assertEquals(0, getWarnings().size()); + + Model model2 = new GPMLToModel().getModel(new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8))); + + Complex newComplex = model2.getElementByElementId(complex.getElementId()); + + assertEquals(complex.getName(), newComplex.getName()); + } + @Test public void testGetRectangle() throws Exception { ModelToGPML parser = new ModelToGPML("xyz"); Compartment compartment = createCompartment(); - Rectangle2D r= parser.getRectangle(compartment); + Rectangle2D r = parser.getRectangle(compartment); assertNotNull(r); } @@ -126,7 +152,7 @@ public class ModelToGPMLTest extends WikipathwaysTestFunctions { } private Unknown createUnknown() { - Unknown result = new Unknown("id"+(speciesCounter++)); + Unknown result = new Unknown("id" + (speciesCounter++)); result.setName("s2"); result.setWidth(10); result.setHeight(10); @@ -137,7 +163,7 @@ public class ModelToGPMLTest extends WikipathwaysTestFunctions { } private GenericProtein createProtein() { - GenericProtein protein = new GenericProtein("sa"+(speciesCounter++)); + GenericProtein protein = new GenericProtein("sa" + (speciesCounter++)); protein.setName("s2"); protein.setWidth(10); protein.setHeight(10); @@ -148,7 +174,7 @@ public class ModelToGPMLTest extends WikipathwaysTestFunctions { } private Complex createComplex() { - Complex complex = new Complex("sa"+(speciesCounter++)); + Complex complex = new Complex("sa" + (speciesCounter++)); complex.setName("s2"); complex.setWidth(10); complex.setHeight(10); @@ -159,7 +185,7 @@ public class ModelToGPMLTest extends WikipathwaysTestFunctions { } private Compartment createCompartment() { - Compartment compartment= new Compartment("ca"+(speciesCounter++)); + Compartment compartment = new Compartment("ca" + (speciesCounter++)); compartment.setName("s2"); compartment.setWidth(10); compartment.setHeight(10); -- GitLab From 0afb8d582022ad4a14ab4ecc64ca7e445546085c Mon Sep 17 00:00:00 2001 From: Piotr Gawron Date: Thu, 2 Apr 2020 10:42:06 +0200 Subject: [PATCH 07/10] don't include empty names in list of names --- .../wikipathway/XML/ModelContructor.java | 46 +++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelContructor.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelContructor.java index 28052da5d..48f47a774 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelContructor.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelContructor.java @@ -99,39 +99,39 @@ public class ModelContructor { * @return {@link Species} created from input {@link DataNode} */ protected Species createSpecies(DataNode dataNode) { - Species res = null; + Species species = null; String type = dataNode.getType(); if (type == null || type.equals("")) { type = null; } if (type != null && type.equalsIgnoreCase("Metabolite")) { - res = new SimpleMolecule(dataNode.getGraphId()); + species = new SimpleMolecule(dataNode.getGraphId()); } else if (type != null && type.equalsIgnoreCase("GeneProduct")) { - res = new Gene(dataNode.getGraphId()); + species = new Gene(dataNode.getGraphId()); } else if (type != null && type.equalsIgnoreCase("Pathway")) { - res = new Phenotype(dataNode.getGraphId()); + species = new Phenotype(dataNode.getGraphId()); } else if (type != null && type.equalsIgnoreCase("Rna")) { - res = new Rna(dataNode.getGraphId()); + species = new Rna(dataNode.getGraphId()); } else if (type != null && type.equalsIgnoreCase("Protein")) { - res = new GenericProtein(dataNode.getGraphId()); + species = new GenericProtein(dataNode.getGraphId()); } else if (type != null && type.equalsIgnoreCase("Complex")) { - res = new Complex(dataNode.getGraphId()); + species = new Complex(dataNode.getGraphId()); } else if (type != null && type.equalsIgnoreCase("None")) { - res = new Unknown(dataNode.getGraphId()); + species = new Unknown(dataNode.getGraphId()); } else { logger.warn(dataNode.getLogMarker(), "Unknown species type: " + type + ". Using Unknown"); - res = new Unknown(dataNode.getGraphId()); + species = new Unknown(dataNode.getGraphId()); } - res.addMiriamData(dataNode.getReferences()); - res.setName(dataNode.getName()); + species.addMiriamData(dataNode.getReferences()); + species.setName(dataNode.getName()); StringBuilder notes = new StringBuilder(); for (String comment : dataNode.getComments()) { notes.append(comment + "\n\n"); } - res.setNotes(notes.toString()); - return res; + species.setNotes(notes.toString()); + return species; } /** @@ -538,15 +538,15 @@ public class ModelContructor { private Species createSpecies(Label label) { logger.warn(label.getLogMarker(), " Label cannot be part of reaction. Tranforming to Unknown"); - Species res = new Unknown(label.getGraphId()); - res.addMiriamData(label.getReferences()); - res.setName(label.getName()); + Unknown unknown = new Unknown(label.getGraphId()); + unknown.addMiriamData(label.getReferences()); + unknown.setName(label.getName()); StringBuilder notes = new StringBuilder(); for (String comment : label.getComments()) { notes.append(comment + "\n\n"); } - res.setNotes(notes.toString()); - return res; + unknown.setNotes(notes.toString()); + return unknown; } /** @@ -559,14 +559,14 @@ public class ModelContructor { private Species createSpecies(Shape shape) { logger.warn(shape.getLogMarker(), " Shape can not be part of reaction. Tranforming to Unknown"); - Species res = new Unknown(shape.getGraphId()); + Unknown unknown = new Unknown(shape.getGraphId()); StringBuilder notes = new StringBuilder(); for (String comment : shape.getComments()) { notes.append(comment + "\n\n"); } - res.setNotes(notes.toString()); - res.setName(shape.getName()); - return res; + unknown.setNotes(notes.toString()); + unknown.setName(shape.getName()); + return unknown; } /** @@ -607,7 +607,7 @@ public class ModelContructor { } else if (graph.getLabelByGraphId(pe.getGraphId()) != null) { Label label = graph.getLabelByGraphId(pe.getGraphId()); // if complex has generic name then change it into label - if (parent.getName().equals(group.getGraphId())) { + if (parent.getName().equals(group.getGraphId()) || parent.getName().trim().isEmpty()) { parent.setName(label.getTextLabel()); parent.setNamePoint(label.getRectangle().getCenterX(), label.getRectangle().getCenterY()); parent.setNameHorizontalAlign(HorizontalAlign.CENTER); -- GitLab From 3d8b52065cbe2574dab6bb6c67042d124e460964 Mon Sep 17 00:00:00 2001 From: Piotr Gawron Date: Thu, 2 Apr 2020 11:06:39 +0200 Subject: [PATCH 08/10] parsing of groups is better structured --- .../mapviewer/wikipathway/XML/GpmlParser.java | 58 +++++++++++++------ .../XML/UnknownAttributeValueException.java | 2 +- .../mapviewer/wikipathway/model/DataNode.java | 24 +------- .../mapviewer/wikipathway/model/Label.java | 22 ------- .../wikipathway/model/PathwayElement.java | 21 ++++++- .../mapviewer/wikipathway/model/Shape.java | 22 ------- 6 files changed, 59 insertions(+), 90 deletions(-) diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/GpmlParser.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/GpmlParser.java index e9ecd391e..67221ef63 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/GpmlParser.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/GpmlParser.java @@ -133,36 +133,56 @@ public class GpmlParser { * @throws UnknownAttributeValueException * thrown when there is a problem with xml attributes */ - protected void addGroups(List groups, Graph graph) throws UnknownAttributeValueException { + protected void addGroups(List groups, Graph graph) throws ConverterException { // Adding Groups to graph for (Node nNode : groups) { if (nNode.getNodeType() == Node.ELEMENT_NODE) { Element eElement = (Element) nNode; - String graphId = eElement.getAttribute("GraphId"); String groupId = eElement.getAttribute("GroupId"); if (graphId.equals("") || graphId == null) { graphId = groupId; } - String style = eElement.getAttribute("Style"); - if ("".equals(style)) { - style = null; - } - if (style != null && - !"Complex".equalsIgnoreCase(style) && - !"Pathway".equalsIgnoreCase(style) && - !"Group".equalsIgnoreCase(style)) { - throw new UnknownAttributeValueException( - "Unknown value of \"style\" attribute for group node: " + style - + ". Only null, Complex, Group are supported."); - } + Group group = new Group(graphId, groupId, graph.getMapName()); - group.setStyle(style); - group.setTextLabel(eElement.getAttribute("TextLabel")); - String zIndex = eElement.getAttribute("ZOrder"); - if (zIndex != null && !zIndex.isEmpty()) { - group.setzOrder(Integer.valueOf(zIndex)); + NamedNodeMap attributes = eElement.getAttributes(); + for (int i = 0; i < attributes.getLength(); i++) { + String value = attributes.item(i).getTextContent(); + switch (attributes.item(i).getNodeName()) { + case ("GraphId"): + case ("GroupId"): + break; + case ("GroupRef"): + group.setGroupRef(value); + break; + case ("BiopaxRef"): + group.addBiopaxReference(value); + break; + case ("TextLabel"): + group.setTextLabel(value); + break; + case ("ZOrder"): + if (!value.isEmpty()) { + group.setzOrder(Integer.valueOf(value)); + } + case ("Style"): + if (!"".equals(value)) { + if (!"Complex".equalsIgnoreCase(value) && + !"Pathway".equalsIgnoreCase(value) && + !"Group".equalsIgnoreCase(value)) { + throw new UnknownAttributeValueException( + "Unknown value of \"style\" attribute for group node: " + value + + ". Only null, Complex, Group are supported."); + } + group.setStyle(value); + } + break; + default: + logger.warn(group.getLogMarker(), + "Unknown sub-node of " + eElement.getNodeName() + " node: " + eElement.getNodeName()); + break; + } } graph.addGroup(group); } diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/UnknownAttributeValueException.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/UnknownAttributeValueException.java index b4d755fd5..2b3470185 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/UnknownAttributeValueException.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/UnknownAttributeValueException.java @@ -3,7 +3,7 @@ package lcsb.mapviewer.wikipathway.XML; import lcsb.mapviewer.converter.ConverterException; /** - * Exception that shold be thrown when the value of the attribute in xml is + * Exception that should be thrown when the value of the attribute in xml is * invalid. * * @author Piotr Gawron diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/DataNode.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/DataNode.java index b0443a560..e1149687a 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/DataNode.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/DataNode.java @@ -39,11 +39,6 @@ public class DataNode extends GraphicalPathwayElement { */ private String textLabel; - /** - * Where this node belongs to. - */ - private String groupRef; - /** * Font weight (like italic, bold) that should be used. */ @@ -74,7 +69,7 @@ public class DataNode extends GraphicalPathwayElement { @Override public String toString() { - return textLabel + " " + getGraphId() + " " + groupRef + " " + type; + return textLabel + " " + getGraphId() + " " + getGroupRef() + " " + type; } @Override @@ -116,23 +111,6 @@ public class DataNode extends GraphicalPathwayElement { this.textLabel = textLabel; } - /** - * @return the groupRef - * @see #groupRef - */ - public String getGroupRef() { - return groupRef; - } - - /** - * @param groupRef - * the groupRef to set - * @see #groupRef - */ - public void setGroupRef(String groupRef) { - this.groupRef = groupRef; - } - /** * @return the references * @see #references diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Label.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Label.java index ecd0c164a..ed1444c03 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Label.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Label.java @@ -43,11 +43,6 @@ public class Label extends GraphicalPathwayElement { */ private String vAlign; - /** - * Where this node belongs to. - */ - private String groupRef; - private Set references = new HashSet<>(); /** @@ -96,23 +91,6 @@ public class Label extends GraphicalPathwayElement { this.textLabel = textLabel; } - /** - * @return the groupRef - * @see #groupRef - */ - public String getGroupRef() { - return groupRef; - } - - /** - * @param groupRef - * the groupRef to set - * @see #groupRef - */ - public void setGroupRef(String groupRef) { - this.groupRef = groupRef; - } - /** * @return the treatAsNode * @see #treatAsNode diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/PathwayElement.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/PathwayElement.java index d4edc1e56..12cb06883 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/PathwayElement.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/PathwayElement.java @@ -12,8 +12,8 @@ import lcsb.mapviewer.model.ProjectLogEntryType; * Abstract class for pathway elements. It defines common functionalities for * all elements in the model. There are two known subclasses: *
    - *
  • {@link GraphicalPathwayElement}, representing elements with some graphical - * representation
  • + *
  • {@link GraphicalPathwayElement}, representing elements with some + * graphical representation
  • *
  • {@link Group}, representing just groups of elements
  • *
* @@ -42,6 +42,11 @@ public abstract class PathwayElement implements Serializable { */ private String graphId; + /** + * Where this node belongs to. + */ + private String groupRef; + /** * * Reference to BioPax node with references about this element. @@ -91,7 +96,8 @@ public abstract class PathwayElement implements Serializable { abstract Rectangle2D getRectangle(); public LogMarker getLogMarker() { - return new LogMarker(ProjectLogEntryType.PARSING_ISSUE, this.getClass().getSimpleName(), getGraphId(), getMapName()); + return new LogMarker(ProjectLogEntryType.PARSING_ISSUE, this.getClass().getSimpleName(), getGraphId(), + getMapName()); } /** @@ -162,4 +168,13 @@ public abstract class PathwayElement implements Serializable { public void setMapName(String mapName) { this.mapName = mapName; } + + public String getGroupRef() { + return groupRef; + } + + public void setGroupRef(String groupRef) { + this.groupRef = groupRef; + } + } diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Shape.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Shape.java index 092552c71..aae322eb9 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Shape.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/Shape.java @@ -34,11 +34,6 @@ public class Shape extends GraphicalPathwayElement { */ private String textLabel; - /** - * Where this node belongs to. - */ - private String groupRef; - /** * Is shape a compartment. */ @@ -159,23 +154,6 @@ public class Shape extends GraphicalPathwayElement { this.compartment = compartment; } - /** - * @return the groupRef - * @see #groupRef - */ - public String getGroupRef() { - return groupRef; - } - - /** - * @param groupRef - * the groupRef to set - * @see #groupRef - */ - public void setGroupRef(String groupRef) { - this.groupRef = groupRef; - } - /** * @return the vAlign * @see #vAlign -- GitLab From 13cc568e48b4abbb3f27a59b92379fbb5caa2608 Mon Sep 17 00:00:00 2001 From: Piotr Gawron Date: Thu, 2 Apr 2020 11:39:06 +0200 Subject: [PATCH 09/10] export line color --- CHANGELOG | 1 + .../wikipathway/XML/ModelToGPML.java | 1 + .../wikipathway/XML/ModelToGPMLTest.java | 60 ++++++++++++++++++- 3 files changed, 60 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 0fd420e2c..d6f54c3b0 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -10,6 +10,7 @@ minerva (15.0.0~beta.3) unstable; urgency=medium * Bug fix: export to GPML preserves information about hypotetical complexes (#1111) * Bug fix: export to GPML preserves complex name (#1111) + * Bug fix: export to GPML preserves reaction color (#1111) -- Piotr Gawron Wed, 1 Apr 2020 14:00:00 +0200 diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelToGPML.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelToGPML.java index 9829e7649..84c963f82 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelToGPML.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelToGPML.java @@ -590,6 +590,7 @@ public class ModelToGPML { interactions.append(" \n"); /** Start and End **/ diff --git a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ModelToGPMLTest.java b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ModelToGPMLTest.java index 68afbd12b..2541cd9c1 100644 --- a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ModelToGPMLTest.java +++ b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ModelToGPMLTest.java @@ -2,6 +2,8 @@ package lcsb.mapviewer.wikipathway.XML; import static org.junit.Assert.*; +import java.awt.Color; +import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.io.ByteArrayInputStream; import java.nio.charset.StandardCharsets; @@ -10,13 +12,17 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.junit.*; +import lcsb.mapviewer.common.geometry.PointTransformation; import lcsb.mapviewer.converter.ConverterParams; import lcsb.mapviewer.converter.model.celldesigner.CellDesignerXmlParser; +import lcsb.mapviewer.model.graphics.PolylineData; import lcsb.mapviewer.model.map.MiriamData; import lcsb.mapviewer.model.map.MiriamType; import lcsb.mapviewer.model.map.compartment.Compartment; import lcsb.mapviewer.model.map.model.Model; import lcsb.mapviewer.model.map.model.ModelFullIndexed; +import lcsb.mapviewer.model.map.reaction.*; +import lcsb.mapviewer.model.map.reaction.type.TransportReaction; import lcsb.mapviewer.model.map.species.*; import lcsb.mapviewer.wikipathway.WikipathwaysTestFunctions; @@ -136,6 +142,56 @@ public class ModelToGPMLTest extends WikipathwaysTestFunctions { assertEquals(complex.getName(), newComplex.getName()); } + @Test + public void testReactitonColor() throws Exception { + + Model model = new ModelFullIndexed(null); + model.setWidth(1000); + model.setHeight(1000); + + Protein p1 = createProtein(); + Protein p2 = createProtein(); + + model.addElement(p1); + model.addElement(p2); + + Reaction reaction = createReaction(p1, p2); + + model.addReaction(reaction); + + ModelToGPML parser = new ModelToGPML(model.getName()); + String xml = parser.getGPML(model); + + Model model2 = new GPMLToModel().getModel(new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8))); + + Reaction newReaction = model2.getReactionByReactionId(reaction.getElementId()); + + assertEquals(reaction.getLine().getColor(), newReaction.getLine().getColor()); + } + + private Reaction createReaction(Protein p1, Protein p2) { + Reaction reaction = new TransportReaction("re" + (speciesCounter++)); + Reactant reactant = new Reactant(p1); + Product product = new Product(p2); + reaction.addReactant(reactant); + reaction.addProduct(product); + + Point2D start = p1.getCenter(); + Point2D end = p2.getCenter(); + + PointTransformation pt = new PointTransformation(); + reactant.setLine(new PolylineData(start, pt.getPointOnLine(start, end, 0.3))); + reaction.setLine(new PolylineData(pt.getPointOnLine(start, end, 0.3), pt.getPointOnLine(start, end, 0.6))); + product.setLine(new PolylineData(pt.getPointOnLine(start, end, 0.6), end)); + + reaction.getLine().setColor(Color.BLUE); + reactant.getLine().setColor(Color.BLUE); + product.getLine().setColor(Color.BLUE); + + reaction.setZ(20); + return reaction; + } + @Test public void testGetRectangle() throws Exception { ModelToGPML parser = new ModelToGPML("xyz"); @@ -167,8 +223,8 @@ public class ModelToGPMLTest extends WikipathwaysTestFunctions { protein.setName("s2"); protein.setWidth(10); protein.setHeight(10); - protein.setX(1); - protein.setY(1); + protein.setX(100 * speciesCounter); + protein.setY(10 + 100 * speciesCounter * Math.random()); protein.setZ(15); return protein; } -- GitLab From f707cc17a43b8d0a6c701e673482d89620fc8bf5 Mon Sep 17 00:00:00 2001 From: Piotr Gawron Date: Thu, 2 Apr 2020 12:40:53 +0200 Subject: [PATCH 10/10] modification residues and reaction reversibility is exported to gpml --- CHANGELOG | 3 + .../wikipathway/XML/ModelToGPML.java | 67 +++++++++++++++--- .../wikipathway/XML/StateParser.java | 2 +- .../wikipathway/model/PointData.java | 2 +- .../wikipathway/XML/ModelToGPMLTest.java | 68 ++++++++++++++++++- 5 files changed, 130 insertions(+), 12 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index d6f54c3b0..a40bc79c2 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -11,6 +11,9 @@ minerva (15.0.0~beta.3) unstable; urgency=medium (#1111) * Bug fix: export to GPML preserves complex name (#1111) * Bug fix: export to GPML preserves reaction color (#1111) + * Bug fix: modification residues are exported to gpml (#1111) + * Bug fix: information about reaction reversibility is exported to gpml + (#1111) -- Piotr Gawron Wed, 1 Apr 2020 14:00:00 +0200 diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelToGPML.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelToGPML.java index 84c963f82..641754348 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelToGPML.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/ModelToGPML.java @@ -22,6 +22,7 @@ import lcsb.mapviewer.model.map.compartment.OvalCompartment; import lcsb.mapviewer.model.map.model.Model; import lcsb.mapviewer.model.map.reaction.*; import lcsb.mapviewer.model.map.species.*; +import lcsb.mapviewer.model.map.species.field.*; import lcsb.mapviewer.wikipathway.utils.Geo; /** @@ -363,8 +364,15 @@ public class ModelToGPML { if (rn instanceof Reactant) { for (Point2D p2d : line.getPoints()) { if (p2d.equals(ps)) { - interaction.append(" \n"); + interaction.append(" \n"); } else if (p2d.equals(pe)) { interaction .append(" \n"); @@ -417,8 +425,8 @@ public class ModelToGPML { } /** - * This function encode SpeciesAliases into DataNodes from GPML format. Empty - * complexes are also transformed into DataNodes. + * This function encode Species into DataNodes from GPML format. Empty complexes + * are also transformed into DataNodes. * * @param model * model where aliases are placed @@ -512,8 +520,9 @@ public class ModelToGPML { private String speciesToDataNode(Species species) throws ConverterException { StringBuilder result = new StringBuilder(); result.append( - " \n"); + + if (species instanceof SpeciesWithModificationResidue) { + for (ModificationResidue mr : ((SpeciesWithModificationResidue) species).getModificationResidues()) { + result.append(modifictionResidueToState(mr)); + } + } + + return result.toString(); + } + + private String modifictionResidueToState(ModificationResidue mr) { + StringBuilder result = new StringBuilder(); + result.append(""); + double relX = ((mr.getPosition().getX() - mr.getSpecies().getX()) / mr.getSpecies().getWidth() - 0.5) * 2; + double relY = ((mr.getPosition().getY() - mr.getSpecies().getY()) / mr.getSpecies().getHeight() - 0.5) * 2; + result.append(""); + result.append(""); return result.toString(); } @@ -605,8 +649,15 @@ public class ModelToGPML { for (Point2D p2d : line.getPoints()) { if (p2d.equals(ps)) { - interactions - .append(" \n"); + interactions.append(" \n"); } else if (p2d.equals(pe)) { interactions.append(" \n"); diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/StateParser.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/StateParser.java index 7bbb23b6d..a1af4bce4 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/StateParser.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/XML/StateParser.java @@ -27,7 +27,7 @@ public class StateParser extends ElementGpmlParser { /** * Default class logger. */ - private final Logger logger = LogManager.getLogger(StateParser.class); + private final Logger logger = LogManager.getLogger(); /** * Parser used for extracting {@link lcsb.mapviewer.model.map.MiriamData diff --git a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/PointData.java b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/PointData.java index aba876c12..6879be832 100644 --- a/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/PointData.java +++ b/pathvisio/src/main/java/lcsb/mapviewer/wikipathway/model/PointData.java @@ -25,7 +25,7 @@ public class PointData implements Serializable { /** * Default class logger. */ - private final transient Logger logger = LogManager.getLogger(PointData.class); + private final transient Logger logger = LogManager.getLogger(); /** * X coordinate. diff --git a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ModelToGPMLTest.java b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ModelToGPMLTest.java index 2541cd9c1..d43153a91 100644 --- a/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ModelToGPMLTest.java +++ b/pathvisio/src/test/java/lcsb/mapviewer/wikipathway/XML/ModelToGPMLTest.java @@ -15,6 +15,7 @@ import org.junit.*; import lcsb.mapviewer.common.geometry.PointTransformation; import lcsb.mapviewer.converter.ConverterParams; import lcsb.mapviewer.converter.model.celldesigner.CellDesignerXmlParser; +import lcsb.mapviewer.model.graphics.ArrowType; import lcsb.mapviewer.model.graphics.PolylineData; import lcsb.mapviewer.model.map.MiriamData; import lcsb.mapviewer.model.map.MiriamType; @@ -24,6 +25,8 @@ import lcsb.mapviewer.model.map.model.ModelFullIndexed; import lcsb.mapviewer.model.map.reaction.*; import lcsb.mapviewer.model.map.reaction.type.TransportReaction; import lcsb.mapviewer.model.map.species.*; +import lcsb.mapviewer.model.map.species.field.ModificationState; +import lcsb.mapviewer.model.map.species.field.Residue; import lcsb.mapviewer.wikipathway.WikipathwaysTestFunctions; public class ModelToGPMLTest extends WikipathwaysTestFunctions { @@ -143,7 +146,7 @@ public class ModelToGPMLTest extends WikipathwaysTestFunctions { } @Test - public void testReactitonColor() throws Exception { + public void testReactionColor() throws Exception { Model model = new ModelFullIndexed(null); model.setWidth(1000); @@ -169,6 +172,35 @@ public class ModelToGPMLTest extends WikipathwaysTestFunctions { assertEquals(reaction.getLine().getColor(), newReaction.getLine().getColor()); } + @Test + public void testReversibleReaction() throws Exception { + + Model model = new ModelFullIndexed(null); + model.setWidth(1000); + model.setHeight(1000); + + Protein p1 = createProtein(); + Protein p2 = createProtein(); + + model.addElement(p1); + model.addElement(p2); + + Reaction reaction = createReaction(p1, p2); + reaction.setReversible(true); + reaction.getReactants().get(0).getLine().getBeginAtd().setArrowType(ArrowType.FULL); + + model.addReaction(reaction); + + ModelToGPML parser = new ModelToGPML(model.getName()); + String xml = parser.getGPML(model); + + Model model2 = new GPMLToModel().getModel(new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8))); + + Reaction newReaction = model2.getReactionByReactionId(reaction.getElementId()); + + assertEquals(reaction.isReversible(), newReaction.isReversible()); + } + private Reaction createReaction(Protein p1, Protein p2) { Reaction reaction = new TransportReaction("re" + (speciesCounter++)); Reactant reactant = new Reactant(p1); @@ -187,11 +219,43 @@ public class ModelToGPMLTest extends WikipathwaysTestFunctions { reaction.getLine().setColor(Color.BLUE); reactant.getLine().setColor(Color.BLUE); product.getLine().setColor(Color.BLUE); - + product.getLine().getEndAtd().setArrowType(ArrowType.FULL); + reaction.setZ(20); return reaction; } + @Test + public void testProteinModification() throws Exception { + + Model model = new ModelFullIndexed(null); + model.setWidth(1000); + model.setHeight(1000); + + Protein p1 = createProtein(); + p1.addResidue(createResidue(p1)); + + model.addElement(p1); + + ModelToGPML parser = new ModelToGPML(model.getName()); + String xml = parser.getGPML(model); + + Model model2 = new GPMLToModel().getModel(new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8))); + + Protein newProtein = model2.getElementByElementId(p1.getElementId()); + + assertEquals(p1.getModificationResidues().size(), newProtein.getModificationResidues().size()); + assertEquals(p1.getModificationResidues().get(0).getPosition(), + newProtein.getModificationResidues().get(0).getPosition()); + } + + private Residue createResidue(Protein p1) { + Residue residue = new Residue("mr" + speciesCounter++); + residue.setState(ModificationState.PHOSPHORYLATED); + residue.setPosition(new Point2D.Double(p1.getCenterX(), p1.getY())); + return residue; + } + @Test public void testGetRectangle() throws Exception { ModelToGPML parser = new ModelToGPML("xyz"); -- GitLab