Skip to content
Snippets Groups Projects
Commit c4a9b6db authored by Piotr Gawron's avatar Piotr Gawron
Browse files

Merge branch 'master' into multithread-test-issue

parents 6a0c4f10 e03ef028
No related branches found
No related tags found
2 merge requests!630WIP: Resolve "The privileges of a new user are not saved in some cases",!453wait function implemented for db cache tests
Pipeline #6762 passed
Showing
with 651 additions and 151 deletions
<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
......@@ -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("&amp;", "&");
}
......
......@@ -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>
......
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;
}
}
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
......@@ -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);
}
}
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;
......
......@@ -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;
}
}
......@@ -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);
......
......@@ -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) {
......
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()) {
......
......@@ -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, //
......
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);
}
}
......@@ -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));
}
}
......@@ -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);
}
}
......@@ -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);
......
<?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>
......@@ -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>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment