diff --git a/CellDesigner-plugin/pom.xml b/CellDesigner-plugin/pom.xml index 1f0c13239d63c1e767d1ad4ee0b51d3e9ea00a93..9fd4b4804fc1d55ec1f16a709265b076cca6c49d 100644 --- a/CellDesigner-plugin/pom.xml +++ b/CellDesigner-plugin/pom.xml @@ -1,85 +1,87 @@ -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <groupId>lcsb.mapviewer</groupId> - <artifactId>parent</artifactId> - <version>1.0</version> - </parent> - <artifactId>CellDesigner-plugin</artifactId> - <!-- dependency from the MapViewer model --> - - <repositories> - <repository> - <id>central</id> - <url>http://repo.maven.apache.org/maven2/</url> - </repository> - - <repository> - <id>repo</id> - <releases> - <enabled>true</enabled> - <checksumPolicy>ignore</checksumPolicy> - </releases> - <snapshots> - <enabled>false</enabled> - </snapshots> - <url>file://${project.basedir}/repo</url> - </repository> - - </repositories> - -<build> - <plugins> - <plugin> - <artifactId>maven-assembly-plugin</artifactId> - <executions> - <execution> - <id>make-assembly</id> <!-- this is used for inheritance merges --> - <phase>package</phase> <!-- bind to the packaging phase --> - <goals> - <goal>single</goal> - </goals> - <configuration> - <descriptor>install.xml</descriptor> - </configuration> - </execution> - </executions> - </plugin> - </plugins> -</build> - - - <dependencies> - <dependency> - <groupId>lcsb.mapviewer</groupId> - <artifactId>model</artifactId> - <version>1.0</version> - </dependency> - - <dependency> - <groupId>lcsb.mapviewer</groupId> - <artifactId>commons</artifactId> - <version>1.0</version> - </dependency> - - <dependency> - <groupId>lcsb.mapviewer</groupId> - <artifactId>converter-CellDesigner</artifactId> - <version>1.0</version> - </dependency> - - <dependency> - <groupId>jp.sbi</groupId> - <artifactId>celldesigner</artifactId> - <version>${celldesigner.version}</version> - </dependency> - - <dependency> - <groupId>org.sbml</groupId> - <artifactId>libsbml</artifactId> - <version>${libsbml.version}</version> - </dependency> - - </dependencies> - +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <parent> + <groupId>lcsb.mapviewer</groupId> + <artifactId>parent</artifactId> + <version>1.0</version> + </parent> + <artifactId>CellDesigner-plugin</artifactId> + <!-- dependency from the MapViewer model --> + + <repositories> + <repository> + <id>central</id> + <url>http://repo.maven.apache.org/maven2/</url> + </repository> + + <repository> + <id>repo</id> + <releases> + <enabled>true</enabled> + <checksumPolicy>ignore</checksumPolicy> + </releases> + <snapshots> + <enabled>false</enabled> + </snapshots> + <url>file://${project.basedir}/repo</url> + </repository> + + </repositories> + + <build> + <plugins> + <plugin> + <artifactId>maven-assembly-plugin</artifactId> + <executions> + <execution> + <id>make-assembly</id> <!-- this is used for inheritance merges --> + <phase>package</phase> <!-- bind to the packaging phase --> + <goals> + <goal>single</goal> + </goals> + <configuration> + <descriptor>install.xml</descriptor> + </configuration> + </execution> + </executions> + </plugin> + </plugins> + </build> + + + <dependencies> + <dependency> + <groupId>lcsb.mapviewer</groupId> + <artifactId>model</artifactId> + <version>1.0</version> + </dependency> + + <dependency> + <groupId>lcsb.mapviewer</groupId> + <artifactId>commons</artifactId> + <version>1.0</version> + </dependency> + + <dependency> + <groupId>lcsb.mapviewer</groupId> + <artifactId>converter-CellDesigner</artifactId> + <version>1.0</version> + </dependency> + + <dependency> + <groupId>jp.sbi</groupId> + <artifactId>celldesigner</artifactId> + <version>${celldesigner.version}</version> + </dependency> + + <dependency> + <groupId>org.sbml</groupId> + <artifactId>libsbml</artifactId> + <version>${libsbml.version}</version> + </dependency> + + </dependencies> + </project> \ No newline at end of file diff --git a/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/annotation/RestAnnotationParser.java b/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/annotation/RestAnnotationParser.java index 3e36ff93a7dfd29fa2b27891fd6b556f29564dee..71357a911e75b274d81f18d5ec3762930216f72c 100644 --- a/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/annotation/RestAnnotationParser.java +++ b/converter-CellDesigner/src/main/java/lcsb/mapviewer/converter/model/celldesigner/annotation/RestAnnotationParser.java @@ -160,7 +160,11 @@ public class RestAnnotationParser extends XmlParser { return ""; } } else if (value instanceof String) { - return type.getCommonName() + ": " + value + "\n"; + if (!((String) value).trim().isEmpty() || forceFullInfo) { + return type.getCommonName() + ": " + value + "\n"; + } else { + return ""; + } } else if (value instanceof Integer) { return type.getCommonName() + ": " + value + "\n"; } else if (value instanceof Collection) { @@ -350,7 +354,7 @@ public class RestAnnotationParser extends XmlParser { logger.debug("Y"); notes = notes.substring(notes.indexOf("</head>") + "</head>".length()); } - notes = notes.replace("xmlns=\"http://www.w3.org/1999/xhtml\"",""); + notes = notes.replace("xmlns=\"http://www.w3.org/1999/xhtml\"", ""); return notes.replaceAll("&", "&"); } diff --git a/converter-sbml/pom.xml b/converter-sbml/pom.xml index 02b7787a01428db97df5cacda80e28901a87825f..f2d8e21147b738460e70b20d49b36325b4afd80d 100644 --- a/converter-sbml/pom.xml +++ b/converter-sbml/pom.xml @@ -76,9 +76,9 @@ <dependency> <groupId>org.sbml.jsbml</groupId> <artifactId>jsbml</artifactId> - <version>1.3.1</version> + <version>${jsbml.version}</version> <!-- for now we use lower version of log4j and this one introduce some - problem with tomcat loggin --> + problem with tomcat logging --> <exclusions> <exclusion> <groupId>org.apache.logging.log4j</groupId> @@ -97,24 +97,67 @@ <artifactId>slf4j-api</artifactId> </exclusion> <exclusion> - <groupId>junit</groupId> - <artifactId>junit</artifactId> + <groupId>junit</groupId> + <artifactId>junit</artifactId> </exclusion> <exclusion> - <groupId>commons-logging</groupId> - <artifactId>commons-logging</artifactId> + <groupId>commons-logging</groupId> + <artifactId>commons-logging</artifactId> </exclusion> <exclusion> - <groupId>org.codehaus.woodstox</groupId> - <artifactId>stax2-api</artifactId> + <groupId>org.codehaus.woodstox</groupId> + <artifactId>stax2-api</artifactId> + </exclusion> + <!-- https://github.com/sbmlteam/jsbml/issues/156 --> + <exclusion> + <groupId>org.sbml.jsbml</groupId> + <artifactId>jsbml-core</artifactId> + </exclusion> + </exclusions> + </dependency> + + <dependency> + <groupId>org.sbml.jsbml</groupId> + <artifactId>jsbml-core</artifactId> + <version>${jsbml.version}</version> + <!-- for now we use lower version of log4j and this one introduce some + problem with tomcat logging --> + <exclusions> + <exclusion> + <groupId>org.apache.logging.log4j</groupId> + <artifactId>log4j-core</artifactId> + </exclusion> + <exclusion> + <groupId>org.apache.logging.log4j</groupId> + <artifactId>log4j-api</artifactId> + </exclusion> + <exclusion> + <groupId>org.apache.logging.log4j</groupId> + <artifactId>log4j-1.2-api</artifactId> + </exclusion> + <exclusion> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-api</artifactId> + </exclusion> + <exclusion> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + </exclusion> + <exclusion> + <groupId>commons-logging</groupId> + <artifactId>commons-logging</artifactId> + </exclusion> + <exclusion> + <groupId>org.codehaus.woodstox</groupId> + <artifactId>stax2-api</artifactId> </exclusion> </exclusions> </dependency> <dependency> - <groupId>org.codehaus.woodstox</groupId> - <artifactId>stax2-api</artifactId> - <version>${stax2-api.version}</version> + <groupId>org.codehaus.woodstox</groupId> + <artifactId>stax2-api</artifactId> + <version>${stax2-api.version}</version> </dependency> <dependency> diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlBioEntityExporter.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlBioEntityExporter.java index 656622664598424d68d2630690ad8ad7b96b7b5f..be31323ace489bad052aa2171c8e6c23b4ffdfd4 100644 --- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlBioEntityExporter.java +++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlBioEntityExporter.java @@ -1,5 +1,6 @@ package lcsb.mapviewer.converter.model.sbml; +import java.awt.Color; import java.util.Collection; import java.util.HashMap; import java.util.Map; @@ -11,6 +12,13 @@ import org.apache.log4j.Logger; import org.sbml.jsbml.Model; import org.sbml.jsbml.ext.layout.AbstractReferenceGlyph; import org.sbml.jsbml.ext.layout.Layout; +import org.sbml.jsbml.ext.render.ColorDefinition; +import org.sbml.jsbml.ext.render.LocalRenderInformation; +import org.sbml.jsbml.ext.render.LocalStyle; +import org.sbml.jsbml.ext.render.RenderConstants; +import org.sbml.jsbml.ext.render.RenderGraphicalObjectPlugin; +import org.sbml.jsbml.ext.render.RenderGroup; +import org.sbml.jsbml.ext.render.RenderLayoutPlugin; import lcsb.mapviewer.common.XmlParser; import lcsb.mapviewer.common.exception.InvalidStateException; @@ -116,6 +124,13 @@ public abstract class SbmlBioEntityExporter<T extends BioEntity, S extends org.s this.layout = layout; } + protected RenderLayoutPlugin getRenderPlugin() { + if (layout.getExtensionCount() > 0) { + return (RenderLayoutPlugin) layout.getExtension("render"); + } + return null; + } + protected lcsb.mapviewer.model.map.model.Model getMinervaModel() { return minervaModel; } @@ -132,4 +147,47 @@ public abstract class SbmlBioEntityExporter<T extends BioEntity, S extends org.s return sbmlGlyphByElementId.get(elementId); } + protected ColorDefinition getColorDefinition(Color color) { + RenderLayoutPlugin renderPlugin = getRenderPlugin(); + + LocalRenderInformation renderInformation = null; + for (LocalRenderInformation lri : renderPlugin.getListOfLocalRenderInformation()) { + if (lri.getId().equals("minerva_definitions")) { + renderInformation = lri; + } + } + if (renderInformation == null) { + renderInformation = new LocalRenderInformation("minerva_definitions"); + renderPlugin.addLocalRenderInformation(renderInformation); + } + + for (ColorDefinition cd : renderInformation.getListOfColorDefinitions()) { + if (cd.getValue().equals(color)) { + return cd; + } + } + ColorDefinition colorDefinition = new ColorDefinition("color_" + colorToString(color), color); + + + renderInformation.addColorDefinition(colorDefinition); + return colorDefinition; + } + + protected void assignStyleToGlyph(AbstractReferenceGlyph speciesGlyph, LocalStyle style) { + RenderGraphicalObjectPlugin rgop = new RenderGraphicalObjectPlugin(speciesGlyph); + rgop.setObjectRole(style.getRoleList().get(0)); + + speciesGlyph.addExtension(RenderConstants.shortLabel, rgop); + } + + protected LocalStyle createStyle(T element) { + LocalRenderInformation renderInformation = new LocalRenderInformation(); + LocalStyle style = new LocalStyle(); + style.getRoleList().add("style_" + element.getElementId()); + style.setGroup(new RenderGroup()); + renderInformation.addLocalStyle(style); + getRenderPlugin().addLocalRenderInformation(renderInformation); + return style; + } + } diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlBioEntityParser.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlBioEntityParser.java index e9926b9ed964c70c306b33fe2b0caf118b08006f..0103895ce8d9c39eba6e27eeebb632ea152a3d2d 100644 --- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlBioEntityParser.java +++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlBioEntityParser.java @@ -1,6 +1,9 @@ package lcsb.mapviewer.converter.model.sbml; +import java.awt.Color; +import java.util.HashMap; import java.util.HashSet; +import java.util.Map; import java.util.Set; import javax.xml.stream.XMLStreamException; @@ -9,6 +12,9 @@ import org.apache.log4j.Logger; import org.sbml.jsbml.AbstractNamedSBase; import org.sbml.jsbml.Annotation; import org.sbml.jsbml.ext.layout.Layout; +import org.sbml.jsbml.ext.render.LocalRenderInformation; +import org.sbml.jsbml.ext.render.LocalStyle; +import org.sbml.jsbml.ext.render.RenderLayoutPlugin; import org.w3c.dom.Node; import lcsb.mapviewer.common.XmlParser; @@ -89,4 +95,67 @@ public class SbmlBioEntityParser extends XmlParser { return (idCounter++) + ""; } + /** + * Returns {@link LocalStyle} from the layout data identified by objectRole. + * + * @param objectRole + * object role identifier + * @return {@link LocalStyle} from the layout data + */ + protected LocalStyle getStyleForRole(String objectRole) { + RenderLayoutPlugin renderPlugin = (RenderLayoutPlugin) layout.getExtension("render"); + for (LocalRenderInformation lri : renderPlugin.getListOfLocalRenderInformation()) { + for (LocalStyle style : lri.getListOfLocalStyles()) { + if (style.getRoleList().contains(objectRole)) { + return style; + } + } + } + return null; + } + + protected Color getColorByColorDefinition(String fill) { + RenderLayoutPlugin renderPlugin = (RenderLayoutPlugin) layout.getExtension("render"); + for (LocalRenderInformation lri : renderPlugin.getListOfLocalRenderInformation()) { + if (lri.getColorDefinition(fill) != null) { + return lri.getColorDefinition(fill).getValue(); + } + } + return null; + } + + protected LocalStyle getStyleForElement(BioEntity element) { + LocalStyle result = getStyleByRole("style_" + element.getElementId()); + if (result == null && element.getElementId().contains("__")) { + result = getStyleByRole("style_" + element.getElementId().split("__")[1]); + } + if (result == null) { + result = getStyleByRole("default_" + element.getClass().getSimpleName()); + } + return result; + } + + private Map<String, LocalStyle> styleById = null; + + LocalStyle getStyleByRole(String string) { + if (styleById == null) { + styleById = new HashMap<>(); + if (layout != null) { + RenderLayoutPlugin renderPlugin = (RenderLayoutPlugin) layout.getExtension("render"); + if (renderPlugin != null) { + for (LocalRenderInformation lri : renderPlugin.getListOfLocalRenderInformation()) { + if (lri.getId().equals("minerva_definitions")) { + for (LocalStyle style : lri.getListOfLocalStyles()) { + for (String role : style.getRoleList()) { + styleById.put(role, style); + } + } + } + } + } + } + } + return styleById.get(string); + } + } \ No newline at end of file diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlElementExporter.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlElementExporter.java index 6b2433971b351a52284b593e2af65136fe2a083f..4a4db0e0817b9a721a7cce99ed792ec6f7e59b94 100644 --- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlElementExporter.java +++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlElementExporter.java @@ -6,6 +6,8 @@ import org.sbml.jsbml.ext.layout.BoundingBox; import org.sbml.jsbml.ext.layout.Dimensions; import org.sbml.jsbml.ext.layout.Layout; import org.sbml.jsbml.ext.layout.Point; +import org.sbml.jsbml.ext.render.ColorDefinition; +import org.sbml.jsbml.ext.render.LocalStyle; import lcsb.mapviewer.model.map.species.Element; @@ -25,8 +27,14 @@ public abstract class SbmlElementExporter<T extends Element, S extends org.sbml. dimensions.setWidth(element.getWidth()); dimensions.setHeight(element.getHeight()); boundingBox.setDimensions(dimensions); - speciesGlyph.setBoundingBox(boundingBox); + + LocalStyle style = createStyle(element); + ColorDefinition color = getColorDefinition(element.getColor()); + style.getGroup().setFill(color.getId()); + + assignStyleToGlyph(speciesGlyph, style); + } } diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlElementParser.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlElementParser.java index bac6ee8c1366bd7bf3fac869ed70a06f089bc067..0f9972fd83a2d9f993b9b9b4515a6296126ed638 100644 --- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlElementParser.java +++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlElementParser.java @@ -1,5 +1,6 @@ package lcsb.mapviewer.converter.model.sbml; +import java.awt.Color; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -12,6 +13,9 @@ import org.sbml.jsbml.ListOf; import org.sbml.jsbml.Model; import org.sbml.jsbml.ext.layout.AbstractReferenceGlyph; import org.sbml.jsbml.ext.layout.Layout; +import org.sbml.jsbml.ext.render.LocalStyle; +import org.sbml.jsbml.ext.render.RenderConstants; +import org.sbml.jsbml.ext.render.RenderGraphicalObjectPlugin; import lcsb.mapviewer.common.Pair; import lcsb.mapviewer.converter.InvalidInputDataExecption; @@ -57,6 +61,13 @@ public abstract class SbmlElementParser<T extends org.sbml.jsbml.Symbol> extends elementBySbmlId.put(species.getElementId(), species); } + for (Element element : elements) { + LocalStyle style = getStyleForElement(element); + + if (style != null) { + applyStyleToElement(element, style); + } + } for (Pair<String, AbstractReferenceGlyph> idGlyphPair : getGlyphs(sbmlLayout)) { String id = idGlyphPair.getLeft(); Element source = elementBySbmlId.get(id); @@ -68,12 +79,7 @@ public abstract class SbmlElementParser<T extends org.sbml.jsbml.Symbol> extends if (glyph.getId() == null || glyph.getId().equals("")) { throw new InvalidInputDataExecption("Glyph for Species " + idGlyphPair.getLeft() + " doesn't have id"); } - Element elementWithLayout = source.copy(); - elementWithLayout.setElementId(glyph.getId()); - elementWithLayout.setX(glyph.getBoundingBox().getPosition().getX()); - elementWithLayout.setY(glyph.getBoundingBox().getPosition().getY()); - elementWithLayout.setWidth(glyph.getBoundingBox().getDimensions().getWidth()); - elementWithLayout.setHeight(glyph.getBoundingBox().getDimensions().getHeight()); + Element elementWithLayout = createElementWithLayout(source, glyph); minervaModel.addElement(elementWithLayout); result.add(elementWithLayout); elementBySbmlId.put(id, elementWithLayout); @@ -91,6 +97,33 @@ public abstract class SbmlElementParser<T extends org.sbml.jsbml.Symbol> extends return result; } + private Element createElementWithLayout(Element source, AbstractReferenceGlyph glyph) + throws InvalidInputDataExecption { + Element elementWithLayout = source.copy(); + elementWithLayout.setElementId(glyph.getId()); + elementWithLayout.setX(glyph.getBoundingBox().getPosition().getX()); + elementWithLayout.setY(glyph.getBoundingBox().getPosition().getY()); + elementWithLayout.setWidth(glyph.getBoundingBox().getDimensions().getWidth()); + elementWithLayout.setHeight(glyph.getBoundingBox().getDimensions().getHeight()); + + RenderGraphicalObjectPlugin rgop = (RenderGraphicalObjectPlugin) glyph.getExtension(RenderConstants.shortLabel); + if (rgop != null) { + LocalStyle style = getStyleForRole(rgop.getObjectRole()); + if (style == null) { + throw new InvalidInputDataExecption("Style " + rgop.getObjectRole() + " is not defined"); + } + applyStyleToElement(elementWithLayout, style); + } + return elementWithLayout; + } + + private void applyStyleToElement(Element elementWithLayout, LocalStyle style) { + if (style.getGroup().getFill() != null) { + Color backgroundColor = getColorByColorDefinition(style.getGroup().getFill()); + elementWithLayout.setColor(backgroundColor); + } + } + protected abstract List<Pair<String, AbstractReferenceGlyph>> getGlyphs(Layout sbmlLayout); protected abstract Element parse(T species, Model sbmlModel) throws InvalidInputDataExecption; diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlExporter.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlExporter.java index 15a7771f0d8d8b857fc7f17653389615308ffa98..5501b2aa09c79d1dac5d6183f08ce41a30ffe711 100644 --- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlExporter.java +++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlExporter.java @@ -11,6 +11,8 @@ import org.sbml.jsbml.SBMLWriter; import org.sbml.jsbml.ext.layout.Dimensions; import org.sbml.jsbml.ext.layout.Layout; import org.sbml.jsbml.ext.layout.LayoutModelPlugin; +import org.sbml.jsbml.ext.render.GlobalRenderInformation; +import org.sbml.jsbml.ext.render.RenderLayoutPlugin; import lcsb.mapviewer.converter.model.sbml.reaction.SbmlReactionExporter; import lcsb.mapviewer.converter.model.sbml.species.SbmlSpeciesExporter; @@ -19,6 +21,7 @@ import lcsb.mapviewer.model.map.species.Species; public class SbmlExporter { Logger logger = Logger.getLogger(SbmlExporter.class); + public String toXml(lcsb.mapviewer.model.map.model.Model model) throws SBMLException, XMLStreamException, InconsistentModelException { SBMLDocument doc = new SBMLDocument(3, 1); @@ -47,7 +50,7 @@ public class SbmlExporter { return stream.toString(); } - private Layout createSbmlLayout(lcsb.mapviewer.model.map.model.Model model, Model result) { + public Layout createSbmlLayout(lcsb.mapviewer.model.map.model.Model model, Model result) { LayoutModelPlugin layoutPlugin = new LayoutModelPlugin(result); Layout layout = new Layout(); Dimensions dimensions = new Dimensions(); @@ -64,6 +67,15 @@ public class SbmlExporter { layout.setDimensions(dimensions); layoutPlugin.add(layout); result.addExtension("layout", layoutPlugin); + + createSbmlRenderPlugin(layout, result); return layout; } + + RenderLayoutPlugin createSbmlRenderPlugin(Layout layout, Model result) { + RenderLayoutPlugin renderPlugin = new RenderLayoutPlugin(layout); + renderPlugin.setRenderInformation(new GlobalRenderInformation()); + layout.addExtension("render", renderPlugin); + return renderPlugin; + } } diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlParser.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlParser.java index d27a540db2645e38c6ccc9e281537959ae20898b..7472ee1cbb776bfb8d42484d2f335210ff00e461 100644 --- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlParser.java +++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/SbmlParser.java @@ -19,6 +19,7 @@ import org.sbml.jsbml.SBMLReader; import org.sbml.jsbml.ext.SBasePlugin; import org.sbml.jsbml.ext.layout.Layout; import org.sbml.jsbml.ext.layout.LayoutModelPlugin; +import org.sbml.jsbml.ext.render.LocalStyle; import lcsb.mapviewer.commands.CommandExecutionException; import lcsb.mapviewer.commands.layout.ApplySimpleLayoutModelCommand; @@ -114,14 +115,15 @@ public class SbmlParser implements IConverter { if (sbmlModel.getRuleCount() > 0) { throw new NotImplementedException("Rule not implemented for model"); } - createLayout(model, layout, params.isSizeAutoAdjust()); + createLayout(model, layout, params.isSizeAutoAdjust(), reactionParser); return model; } catch (XMLStreamException e) { throw new InvalidInputDataExecption(e); } } - private void createLayout(Model model, Layout layout, boolean resize) throws InvalidInputDataExecption { + private void createLayout(Model model, Layout layout, boolean resize, SbmlReactionParser parser) + throws InvalidInputDataExecption { if (model.getWidth() == null) { double maxY = 0; double maxX = 0; @@ -150,6 +152,15 @@ public class SbmlParser implements IConverter { try { if (bioEntitesRequiringLayout.size() > 0) { new ApplySimpleLayoutModelCommand(model, bioEntitesRequiringLayout, true).execute(); + for (BioEntity bioEntity : bioEntitesRequiringLayout) { + if (bioEntity instanceof Reaction) { + LocalStyle style = parser.getStyleForElement(bioEntity); + + if (style != null) { + parser.applyStyleToReaction((Reaction) bioEntity, style); + } + } + } } } catch (CommandExecutionException e) { throw new InvalidInputDataExecption("Problem with generating layout", e); diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionExporter.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionExporter.java index 20e89b58a1a204cf0ade7042639e4a4be93e0326..28b6c80aff8c4317fa08c8b37f6f6ee7981323d7 100644 --- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionExporter.java +++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionExporter.java @@ -23,6 +23,8 @@ import org.sbml.jsbml.ext.layout.Point; import org.sbml.jsbml.ext.layout.ReactionGlyph; import org.sbml.jsbml.ext.layout.SpeciesReferenceGlyph; import org.sbml.jsbml.ext.layout.SpeciesReferenceRole; +import org.sbml.jsbml.ext.render.ColorDefinition; +import org.sbml.jsbml.ext.render.LocalStyle; import org.w3c.dom.Node; import lcsb.mapviewer.common.Configuration; @@ -173,8 +175,8 @@ public class SbmlReactionExporter extends SbmlBioEntityExporter<Reaction, org.sb } @Override - protected void assignLayoutToGlyph(Reaction reaction, AbstractReferenceGlyph compartmentGlyph) { - ReactionGlyph reactionGlyph = (ReactionGlyph) compartmentGlyph; + protected void assignLayoutToGlyph(Reaction reaction, AbstractReferenceGlyph glyph) { + ReactionGlyph reactionGlyph = (ReactionGlyph) glyph; boolean firstReactant = true; reactionGlyph.setCurve(new Curve()); @@ -242,6 +244,14 @@ public class SbmlReactionExporter extends SbmlBioEntityExporter<Reaction, org.sb modifierGlyph.setRole(SpeciesReferenceRole.MODIFIER); } } + + LocalStyle style = createStyle(reaction); + ColorDefinition color = getColorDefinition(reaction.getReactants().get(0).getLine().getColor()); + style.getGroup().setStrokeWidth(reaction.getReactants().get(0).getLine().getWidth()); + style.getGroup().setFill(color.getId()); + + assignStyleToGlyph(reactionGlyph, style); + } private void addOperatorLineToGlyph(ReactionGlyph reactantGlyph, NodeOperator operator, boolean reverse) { diff --git a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionParser.java b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionParser.java index add9c0916d66da509def9f93bd209fee8a9841b4..e02e9b12d4db8b66bb0682cc4a806c63d91666e2 100644 --- a/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionParser.java +++ b/converter-sbml/src/main/java/lcsb/mapviewer/converter/model/sbml/reaction/SbmlReactionParser.java @@ -1,5 +1,6 @@ package lcsb.mapviewer.converter.model.sbml.reaction; +import java.awt.Color; import java.awt.geom.Point2D; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; @@ -22,6 +23,9 @@ import org.sbml.jsbml.ext.layout.Layout; import org.sbml.jsbml.ext.layout.ReactionGlyph; import org.sbml.jsbml.ext.layout.SpeciesGlyph; import org.sbml.jsbml.ext.layout.SpeciesReferenceGlyph; +import org.sbml.jsbml.ext.render.LocalStyle; +import org.sbml.jsbml.ext.render.RenderConstants; +import org.sbml.jsbml.ext.render.RenderGraphicalObjectPlugin; import org.w3c.dom.Node; import lcsb.mapviewer.common.exception.InvalidArgumentException; @@ -41,6 +45,7 @@ import lcsb.mapviewer.model.map.kinetics.SbmlKinetics; import lcsb.mapviewer.model.map.modifier.Inhibition; import lcsb.mapviewer.model.map.modifier.Modulation; import lcsb.mapviewer.model.map.modifier.Trigger; +import lcsb.mapviewer.model.map.reaction.AbstractNode; import lcsb.mapviewer.model.map.reaction.AndOperator; import lcsb.mapviewer.model.map.reaction.Modifier; import lcsb.mapviewer.model.map.reaction.NodeOperator; @@ -56,8 +61,6 @@ import lcsb.mapviewer.modelutils.map.ElementUtils; public class SbmlReactionParser extends SbmlBioEntityParser { Logger logger = Logger.getLogger(SbmlReactionParser.class); - Layout layout; - lcsb.mapviewer.model.map.model.Model minervaModel; ElementUtils eu = new ElementUtils(); @@ -108,33 +111,7 @@ public class SbmlReactionParser extends SbmlBioEntityParser { for (SpeciesReferenceGlyph speciesRefernceGlyph : glyph.getListOfSpeciesReferenceGlyphs()) { SpeciesGlyph speciesGlyph = layout.getSpeciesGlyph(speciesRefernceGlyph.getSpeciesGlyph()); ReactionNode minervaNode = null; - Class<? extends ReactionNode> nodeClass = null; - if (speciesRefernceGlyph.getRole() != null) { - switch (speciesRefernceGlyph.getRole()) { - case ACTIVATOR: - nodeClass = Trigger.class; - break; - case INHIBITOR: - nodeClass = Inhibition.class; - break; - case PRODUCT: - nodeClass = Product.class; - break; - case SIDEPRODUCT: - nodeClass = Product.class; - break; - case SIDESUBSTRATE: - nodeClass = Reactant.class; - break; - case SUBSTRATE: - nodeClass = Reactant.class; - break; - case UNDEFINED: - case MODIFIER: - nodeClass = null; - break; - } - } + Class<? extends ReactionNode> nodeClass = getReactionNodeClass(speciesRefernceGlyph); if (reactionWithLayout.isReversible() && (nodeClass == Reactant.class || nodeClass == Product.class)) { nodeClass = null; @@ -233,6 +210,8 @@ public class SbmlReactionParser extends SbmlBioEntityParser { operator.setLine(line); reactionWithLayout.addNode(operator); } + assignRenderDataToReaction(glyph, reactionWithLayout); + minervaModel.addReaction(reactionWithLayout); } catch (InvalidArgumentException e) { throw new InvalidInputDataExecption(e); @@ -255,6 +234,63 @@ public class SbmlReactionParser extends SbmlBioEntityParser { } } + private Class<? extends ReactionNode> getReactionNodeClass(SpeciesReferenceGlyph speciesRefernceGlyph) { + Class<? extends ReactionNode> nodeClass = null; + if (speciesRefernceGlyph.getRole() != null) { + switch (speciesRefernceGlyph.getRole()) { + case ACTIVATOR: + nodeClass = Trigger.class; + break; + case INHIBITOR: + nodeClass = Inhibition.class; + break; + case PRODUCT: + nodeClass = Product.class; + break; + case SIDEPRODUCT: + nodeClass = Product.class; + break; + case SIDESUBSTRATE: + nodeClass = Reactant.class; + break; + case SUBSTRATE: + nodeClass = Reactant.class; + break; + case UNDEFINED: + case MODIFIER: + nodeClass = null; + break; + } + } + return nodeClass; + } + + private void assignRenderDataToReaction(ReactionGlyph glyph, Reaction reactionWithLayout) + throws InvalidInputDataExecption { + RenderGraphicalObjectPlugin rgop = (RenderGraphicalObjectPlugin) glyph.getExtension(RenderConstants.shortLabel); + if (rgop != null) { + LocalStyle style = getStyleForRole(rgop.getObjectRole()); + if (style == null) { + throw new InvalidInputDataExecption("Style " + rgop.getObjectRole() + " is not defined"); + } + applyStyleToReaction(reactionWithLayout, style); + } + } + + public void applyStyleToReaction(Reaction reactionWithLayout, LocalStyle style) { + if (style.getGroup().getFill() != null) { + Color color = getColorByColorDefinition(style.getGroup().getFill()); + for (AbstractNode node : reactionWithLayout.getNodes()) { + node.getLine().setColor(color); + } + } + if (style.getGroup().getStrokeWidth() != null) { + for (AbstractNode node : reactionWithLayout.getNodes()) { + node.getLine().setWidth(style.getGroup().getStrokeWidth()); + } + } + } + private PolylineData getLineFromReferenceGlyph(SpeciesReferenceGlyph speciesRefernceGlyph) { PolylineData line = null; for (CurveSegment segment : speciesRefernceGlyph.getCurve().getListOfCurveSegments()) { diff --git a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/AllSbmlConverterTests.java b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/AllSbmlConverterTests.java index c59f7cab22f89ef245becebd0ab8885d062121bd..2e9a90faca7c22117648dcd96573563c91a1bb0a 100644 --- a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/AllSbmlConverterTests.java +++ b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/AllSbmlConverterTests.java @@ -12,6 +12,7 @@ import lcsb.mapviewer.converter.model.sbml.species.AllSbmlSpeciesTests; AllSbmlSpeciesTests.class, // GenericSbmlParserTest.class, // GenericSbmlToXmlParserTest.class, // + SbmlBioEntityExporterTest.class, // SbmlExporterTest.class, // SbmlPareserForInvalidReactionTest.class, // SbmlParserTest.class, // diff --git a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlBioEntityExporterTest.java b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlBioEntityExporterTest.java new file mode 100644 index 0000000000000000000000000000000000000000..471f844b462f960b4d52d25e611d80b584f1f6e9 --- /dev/null +++ b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlBioEntityExporterTest.java @@ -0,0 +1,61 @@ +package lcsb.mapviewer.converter.model.sbml; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +import java.awt.Color; + +import org.junit.Test; +import org.mockito.Mockito; +import org.sbml.jsbml.Model; +import org.sbml.jsbml.SBMLDocument; +import org.sbml.jsbml.ext.layout.Layout; +import org.sbml.jsbml.ext.layout.LayoutModelPlugin; +import org.sbml.jsbml.ext.render.ColorDefinition; +import org.sbml.jsbml.ext.render.RenderLayoutPlugin; + +import lcsb.mapviewer.model.map.model.ModelFullIndexed; + +public class SbmlBioEntityExporterTest { + + @Test + public void testEmptyGetRenderPlugin() { + @SuppressWarnings("rawtypes") + SbmlBioEntityExporter exporter = Mockito.mock(SbmlBioEntityExporter.class, Mockito.CALLS_REAL_METHODS); + Layout layout = new Layout(); + exporter.setLayout(layout); + + assertNull(exporter.getRenderPlugin()); + } + + @Test + public void testGetRenderPluginWithLayout() { + SbmlBioEntityExporter<?, ?> exporter = createMockExporter(); + assertNotNull(exporter.getRenderPlugin()); + } + + @SuppressWarnings("rawtypes") + private SbmlBioEntityExporter createMockExporter() { + SbmlBioEntityExporter exporter = Mockito.mock(SbmlBioEntityExporter.class, Mockito.CALLS_REAL_METHODS); + + SBMLDocument doc = new SBMLDocument(3, 1); + Model result = doc.createModel(); + + SbmlExporter sbmlExporter = new SbmlExporter(); + Layout layout = sbmlExporter.createSbmlLayout(new ModelFullIndexed(null), result); + + exporter.setSbmlModel(result); + exporter.setLayout(layout); + return exporter; + } + + @Test + public void testAddColors() { + SbmlBioEntityExporter<?, ?> exporter = createMockExporter(); + ColorDefinition c1 = exporter.getColorDefinition(Color.BLUE); + ColorDefinition c2 = exporter.getColorDefinition(Color.BLUE); + assertEquals(c1, c2); + } + +} diff --git a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlExporterTest.java b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlExporterTest.java index 3d6832feedb6c3867094a78ff5189fd2f4412a5b..ad40790555de5aea076bce9db4f36e6f25e7dc42 100644 --- a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlExporterTest.java +++ b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlExporterTest.java @@ -5,15 +5,13 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; +import java.awt.Color; import java.awt.Desktop; import java.awt.geom.Point2D; import java.io.ByteArrayInputStream; import java.io.File; -import java.io.InputStream; -import java.io.StringWriter; import java.nio.file.Files; -import org.apache.commons.io.IOUtils; import org.apache.log4j.Logger; import org.junit.Test; @@ -23,17 +21,18 @@ import lcsb.mapviewer.converter.IConverter; import lcsb.mapviewer.converter.graphics.AbstractImageGenerator; import lcsb.mapviewer.converter.graphics.NormalImageGenerator; import lcsb.mapviewer.converter.graphics.PngImageGenerator; -import lcsb.mapviewer.converter.model.celldesigner.CellDesignerXmlParser; import lcsb.mapviewer.model.graphics.PolylineData; import lcsb.mapviewer.model.map.compartment.Compartment; import lcsb.mapviewer.model.map.model.Model; import lcsb.mapviewer.model.map.model.ModelComparator; import lcsb.mapviewer.model.map.model.ModelFullIndexed; +import lcsb.mapviewer.model.map.reaction.AbstractNode; import lcsb.mapviewer.model.map.reaction.Product; import lcsb.mapviewer.model.map.reaction.Reactant; import lcsb.mapviewer.model.map.reaction.Reaction; import lcsb.mapviewer.model.map.reaction.ReactionNode; import lcsb.mapviewer.model.map.reaction.type.StateTransitionReaction; +import lcsb.mapviewer.model.map.species.Element; import lcsb.mapviewer.model.map.species.GenericProtein; import lcsb.mapviewer.model.map.species.Species; @@ -42,6 +41,8 @@ public class SbmlExporterTest { SbmlParser parser = new SbmlParser(); SbmlExporter exporter = new SbmlExporter(); + ModelComparator comparator = new ModelComparator(); + @Test public void testExportCompartment() throws Exception { Model model = getModelAfterSerializing("testFiles/layoutExample/CompartmentGlyph_Example_level2_level3.xml"); @@ -67,6 +68,7 @@ public class SbmlExporterTest { private Model getModelAfterSerializing(Model originalModel) throws Exception { String xml = exporter.toXml(originalModel); + logger.debug(xml); ByteArrayInputStream stream = new ByteArrayInputStream(xml.getBytes("UTF-8")); Model result = parser.createModel(new ConverterParams().inputStream(stream)); // showImage(originalModel); @@ -261,7 +263,7 @@ public class SbmlExporterTest { assertEquals(0, comparator.compare(model, model2)); } - + @Test public void testExportProblematicNotes() throws Exception { Model model = createModelWithReaction(); @@ -274,4 +276,39 @@ public class SbmlExporterTest { assertEquals(reaction.getNotes(), deserializedReaction.getNotes()); } + + @Test + public void testColorParsing() throws Exception { + Model model = parser.createModel(new ConverterParams().filename("testFiles/layoutExample/example1.xml")); + for (Element element : model.getElements()) { + element.setColor(Color.BLUE); + } + Model model2 = getModelAfterSerializing(model); + assertEquals(0, comparator.compare(model, model2)); + } + + @Test + public void testReactionColorParsing() throws Exception { + Model model = parser.createModel(new ConverterParams().filename("testFiles/layoutExample/example1.xml")); + for (Reaction element : model.getReactions()) { + for (AbstractNode node: element.getNodes()) { + node.getLine().setColor(Color.BLUE); + } + } + Model model2 = getModelAfterSerializing(model); + assertEquals(0, comparator.compare(model, model2)); + } + + @Test + public void testReactionLineWidthParsing() throws Exception { + Model model = parser.createModel(new ConverterParams().filename("testFiles/layoutExample/example1.xml")); + for (Reaction element : model.getReactions()) { + for (AbstractNode node: element.getNodes()) { + node.getLine().setWidth(12.7); + } + } + Model model2 = getModelAfterSerializing(model); + assertEquals(0, comparator.compare(model, model2)); + } + } diff --git a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlParserTest.java b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlParserTest.java index 68625d82772a07831a96a6c6f2dae65b9b383c59..8f1cc44b8194b62c33423b5ec454f01dc07e24e1 100644 --- a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlParserTest.java +++ b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/SbmlParserTest.java @@ -5,11 +5,13 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; +import java.awt.Color; import java.io.FileNotFoundException; import org.apache.log4j.Logger; import org.junit.Test; +import lcsb.mapviewer.common.Configuration; import lcsb.mapviewer.converter.ConverterParams; import lcsb.mapviewer.converter.InvalidInputDataExecption; import lcsb.mapviewer.model.map.compartment.Compartment; @@ -151,9 +153,35 @@ public class SbmlParserTest { assertEquals(1, model.getCompartments().iterator().next().getMiriamData().size()); } - @Test(expected=InvalidInputDataExecption.class) + @Test(expected = InvalidInputDataExecption.class) public void testInvalidReactionLayout() throws Exception { - parser.createModel(new ConverterParams().filename("testFiles/invalidReaction/reaction_with_missing_part_of_layout.xml")); + parser.createModel( + new ConverterParams().filename("testFiles/invalidReaction/reaction_with_missing_part_of_layout.xml")); + } + + @Test + public void testDefaultColors() throws Exception { + Model model = parser.createModel(new ConverterParams().filename("testFiles/small/default_colors.xml")); + assertNotNull(model); + assertEquals(Color.BLUE, model.getElementByElementId("Species_1").getColor()); + assertEquals(Color.RED, model.getElementByElementId("Species_2").getColor()); + + Reaction r1 = null; + Reaction r2 = null; + for (Reaction reaction : model.getReactions()) { + if (reaction.getElementId().contains("Reaction_1")) { + r1 = reaction; + } + if (reaction.getElementId().contains("Reaction_2")) { + r2 = reaction; + } + } + assertEquals(Color.BLUE, r1.getReactants().get(0).getLine().getColor()); + assertEquals(3.0, r1.getReactants().get(0).getLine().getWidth(), Configuration.EPSILON); + + assertEquals(Color.GREEN, r2.getReactants().get(0).getLine().getColor()); + assertEquals(2.0, r2.getReactants().get(0).getLine().getWidth(), Configuration.EPSILON); + } } diff --git a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/species/SbmlSpeciesExporterTest.java b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/species/SbmlSpeciesExporterTest.java index 8aa572c29da12bc2942babdbc85ab5b7dd88c0ee..a3ed722dd9f0e8e8ac8a43b54718feb80bac05f5 100644 --- a/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/species/SbmlSpeciesExporterTest.java +++ b/converter-sbml/src/test/java/lcsb/mapviewer/converter/model/sbml/species/SbmlSpeciesExporterTest.java @@ -6,9 +6,9 @@ import org.apache.log4j.Logger; import org.junit.Test; import org.sbml.jsbml.SBMLDocument; import org.sbml.jsbml.ext.layout.Layout; -import org.sbml.jsbml.ext.layout.LayoutModelPlugin; import lcsb.mapviewer.converter.model.sbml.SbmlCompartmentExporter; +import lcsb.mapviewer.converter.model.sbml.SbmlExporter; import lcsb.mapviewer.model.map.InconsistentModelException; import lcsb.mapviewer.model.map.compartment.Compartment; import lcsb.mapviewer.model.map.model.Model; @@ -51,7 +51,7 @@ public class SbmlSpeciesExporterTest { Element protein2 = new GenericProtein("sa2"); protein2.setName("SNCA"); protein2.setCompartment(compartment); - + Model model = new ModelFullIndexed(null); model.addElement(protein1); model.addElement(protein2); @@ -68,10 +68,8 @@ public class SbmlSpeciesExporterTest { SBMLDocument doc = new SBMLDocument(3, 1); sbmlModel = doc.createModel(model.getIdModel()); - LayoutModelPlugin layoutPlugin = new LayoutModelPlugin(sbmlModel); - sbmlLayout = new Layout(); - layoutPlugin.add(sbmlLayout); - sbmlModel.addExtension("layout", layoutPlugin); + SbmlExporter sbmlExporter = new SbmlExporter(); + sbmlLayout = sbmlExporter.createSbmlLayout(model, sbmlModel); SbmlCompartmentExporter compartmentExporter = new SbmlCompartmentExporter(sbmlLayout, model); compartmentExporter.exportElements(sbmlModel); diff --git a/converter-sbml/testFiles/small/default_colors.xml b/converter-sbml/testFiles/small/default_colors.xml new file mode 100644 index 0000000000000000000000000000000000000000..1a2bc53d9e6d113b8e54bdb773cef35c46843310 --- /dev/null +++ b/converter-sbml/testFiles/small/default_colors.xml @@ -0,0 +1,87 @@ +<?xml version="1.0" encoding="UTF-8"?> +<sbml xmlns="http://www.sbml.org/sbml/level3/version1/core" layout:required="false" level="3" render:required="false" version="1" xmlns:layout="http://www.sbml.org/sbml/level3/version1/layout/version1" xmlns:render="http://www.sbml.org/sbml/level3/version1/render/version1"> + <model id="TestModel"> + <layout:listOfLayouts xmlns="http://projects.eml.org/bcb/sbml/level2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <layout:layout id="Layout_1"> + <render:listOfRenderInformation xmlns:render="http://www.sbml.org/sbml/level3/version1/render/version1"> + <render:renderInformation> + <render:listOfStyles> + <render:style render:roleList="style_Compartment_1"> + <render:g render:fill="color_FF0000FF"/> + </render:style> + </render:listOfStyles> + </render:renderInformation> + <render:renderInformation render:id="minerva_definitions"> + <render:listOfColorDefinitions> + <render:colorDefinition render:id="blue_color" render:value="#0000FFFF"/> + <render:colorDefinition render:id="red_color" render:value="#FF0000FF"/> + <render:colorDefinition render:id="green_color" render:value="#00FF00FF"/> + </render:listOfColorDefinitions> + <render:listOfStyles> + <!-- element type specific --> + <render:style render:roleList="default_GenericProtein"> + <render:g render:fill="blue_color"/> + </render:style> + <render:style render:roleList="default_SimpleMolecule"> + <render:g render:fill="red_color"/> + </render:style> + <!-- reaction type specific --> + <render:style render:roleList="default_StateTransitionReaction"> + <render:g render:fill="green_color" render:stroke-width="2.0"/> + </render:style> + <!-- element specific --> + <render:style render:roleList="style_Species_1"> + <render:g render:fill="blue_color"/> + </render:style> + <!-- reaction specific --> + <render:style render:roleList="style_Reaction_1"> + <render:g render:fill="blue_color" render:stroke-width="3.0"/> + </render:style> + </render:listOfStyles> + </render:renderInformation> + </render:listOfRenderInformation> + </layout:layout> + </layout:listOfLayouts> + <listOfCompartments> + <compartment id="Compartment_1" size="1"/> + </listOfCompartments> + <listOfSpecies> + <species id="Species_1" compartment="Compartment_1" initialConcentration="0"/> + <species id="Species_2" compartment="Compartment_1" initialConcentration="0"/> + </listOfSpecies> + <listOfReactions> + <reaction id="Reaction_1" reversible="false"> + <listOfReactants> + <speciesReference species="Species_1"> + <annotation> + <layoutId xmlns="http://projects.eml.org/bcb/sbml/level2" id="SpeciesReference_1"/> + </annotation> + </speciesReference> + </listOfReactants> + <listOfProducts> + <speciesReference species="Species_2"> + <annotation> + <layoutId xmlns="http://projects.eml.org/bcb/sbml/level2" id="SpeciesReference_2"/> + </annotation> + </speciesReference> + </listOfProducts> + </reaction> + <reaction id="Reaction_2" reversible="false"> + <listOfReactants> + <speciesReference species="Species_2"> + <annotation> + <layoutId xmlns="http://projects.eml.org/bcb/sbml/level2" id="SpeciesReference_3"/> + </annotation> + </speciesReference> + </listOfReactants> + <listOfProducts> + <speciesReference species="Species_1"> + <annotation> + <layoutId xmlns="http://projects.eml.org/bcb/sbml/level2" id="SpeciesReference_4"/> + </annotation> + </speciesReference> + </listOfProducts> + </reaction> + </listOfReactions> + </model> +</sbml> diff --git a/pom.xml b/pom.xml index 947569cfae6e22e447d40af2a61e4c1d4ebf55ff..a8adf9f7c41337b1f9961934ab407e653af131da 100644 --- a/pom.xml +++ b/pom.xml @@ -54,6 +54,8 @@ <jaxb.version>2.2.7</jaxb.version> <batik.version>1.8</batik.version> + + <jsbml.version>1.4</jsbml.version> <itext.version>5.5.6</itext.version>