diff --git a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/AbstractImageGenerator.java b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/AbstractImageGenerator.java index 0eb5e5f8634ca3888e7abc88619937417a0938c6..afd349aacbefceb9ab4f0dfb11c9689219ce0587 100644 --- a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/AbstractImageGenerator.java +++ b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/AbstractImageGenerator.java @@ -700,9 +700,12 @@ public abstract class AbstractImageGenerator { for (Layer layer : params.getModel().getLayers()) { drawLayer(layer); } + closeImageObject(); setDrawn(true); } + protected abstract void closeImageObject(); + /** * This method draw layer on the graphics. * @@ -840,13 +843,9 @@ public abstract class AbstractImageGenerator { if (rescale) { customScale = scale; } - try { - converter.draw( - species, graphics, new ConverterParams().scale(customScale).textCentered(rescale).level(level).sbgnFormat(sbgnFormat).nested(params.nested), - visibleLayouts); - } catch (Exception e) { - throw new DrawingException(eu.getElementTag(species) + "Problem with drawing element.", e); - } + converter.draw( + species, graphics, new ConverterParams().scale(customScale).textCentered(rescale).level(level).sbgnFormat(sbgnFormat).nested(params.nested), + visibleLayouts); // if the species is a complex then we may want to draw children // objects @@ -874,8 +873,9 @@ public abstract class AbstractImageGenerator { * list of {@link ColorSchema} used for coloring reaction in layouts * @param params * list of all params to create apropriate image + * @throws DrawingException */ - protected void drawReaction(final Reaction reaction, List<ColorSchema> visibleLayouts, Params params) { + protected void drawReaction(final Reaction reaction, List<ColorSchema> visibleLayouts, Params params) throws DrawingException { if (!cross(reaction.getLines())) { return; } diff --git a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/JpgImageGenerator.java b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/JpgImageGenerator.java index 142bb59baf31c1dcebdb87bce71b15562b4aeaf2..c903920061e6d139072d4238d6f39fbf417d70b9 100644 --- a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/JpgImageGenerator.java +++ b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/JpgImageGenerator.java @@ -77,4 +77,8 @@ public class JpgImageGenerator extends NormalImageGenerator { return "jpg"; } + @Override + protected void closeImageObject() { + } + } diff --git a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/PdfImageGenerator.java b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/PdfImageGenerator.java index 61091747ec0731ab0d0b163645d9db2f1c309f79..504b4e2d1cbd31e084318e5ef79474468dbc70f3 100644 --- a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/PdfImageGenerator.java +++ b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/PdfImageGenerator.java @@ -74,6 +74,10 @@ public class PdfImageGenerator extends AbstractImageGenerator { */ public PdfImageGenerator(final Params params) throws DrawingException { super(params); + } + + @Override + protected void closeImageObject() { getGraphics().dispose(); pdfDocument.close(); } diff --git a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/PngImageGenerator.java b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/PngImageGenerator.java index 50729fb7b580511a62f97b741992f73b0751cf24..77f65da695c922cf7d192656de4907e9b7301dea 100644 --- a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/PngImageGenerator.java +++ b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/PngImageGenerator.java @@ -43,6 +43,10 @@ public class PngImageGenerator extends NormalImageGenerator { super(params); } + @Override + protected void closeImageObject() { + } + @Override public void saveToFileImplementation(String fileName) throws IOException { FileOutputStream fos = new FileOutputStream(new File(fileName)); diff --git a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/SvgImageGenerator.java b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/SvgImageGenerator.java index ff95faa79d716559593c7f25cc710cc77ec55fca..bf97fec4fdbd82a3f0e544c08deeea55f24c72cf 100644 --- a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/SvgImageGenerator.java +++ b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/SvgImageGenerator.java @@ -57,6 +57,10 @@ public class SvgImageGenerator extends AbstractImageGenerator { super(params); } + @Override + protected void closeImageObject() { + } + @Override public void saveToOutputStreamImplementation(OutputStream os) throws IOException { ((SVGGraphics2D) getGraphics()).stream(new OutputStreamWriter(os)); diff --git a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/BioEntityConverter.java b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/BioEntityConverter.java index 9575da4d8082aded32214a61a844fba09715c2bf..2bf39b74d6e17b23e67cf08e4f5df83b037dd5e8 100644 --- a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/BioEntityConverter.java +++ b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/BioEntityConverter.java @@ -60,9 +60,10 @@ public abstract class BioEntityConverter<T extends BioEntity> { * visuzalization params (like, should the object be filled with * solid color, etc.), for more information see * {@link ConverterParams} + * @throws DrawingException * */ - public void draw(T bioEntity, Graphics2D graphics, ConverterParams params) { + public void draw(T bioEntity, Graphics2D graphics, ConverterParams params) throws DrawingException { draw(bioEntity, graphics, params, new ArrayList<>()); } @@ -81,9 +82,10 @@ public abstract class BioEntityConverter<T extends BioEntity> { * list of {@link ColorSchema} that were used for visualizing this * bioentity in different data overlays that should be overlayed on * the alias + * @throws DrawingException * */ - public abstract void draw(T bioEntity, Graphics2D graphics, ConverterParams params, List<ColorSchema> visualizedOverlaysColorSchemas); + public abstract void draw(T bioEntity, Graphics2D graphics, ConverterParams params, List<ColorSchema> visualizedOverlaysColorSchemas) throws DrawingException; /** * This function will find proper font size to display text within it. Then it diff --git a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/BioEntityConverterImpl.java b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/BioEntityConverterImpl.java index 6f71c865dce77931cf7c3ebb27c619d3c464a177..ee41d7e57230d4bf9f2d6cd51d5cce7839774117 100644 --- a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/BioEntityConverterImpl.java +++ b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/BioEntityConverterImpl.java @@ -189,9 +189,13 @@ public class BioEntityConverterImpl extends BioEntityConverter<BioEntity> { @SuppressWarnings("unchecked") @Override - public void draw(BioEntity element, Graphics2D graphics, ConverterParams params, List<ColorSchema> visualizedLayoutsColorSchemas) { - if (isVisible(element, params)) { - elementConverter.draw(element, graphics, params, visualizedLayoutsColorSchemas); + public void draw(BioEntity element, Graphics2D graphics, ConverterParams params, List<ColorSchema> visualizedLayoutsColorSchemas) throws DrawingException { + try { + if (isVisible(element, params)) { + elementConverter.draw(element, graphics, params, visualizedLayoutsColorSchemas); + } + } catch (Exception e) { + throw new DrawingException(new ElementUtils().getElementTag(element) + "Problem with drawing element.", e); } } diff --git a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/element/compartment/CompartmentConverter.java b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/element/compartment/CompartmentConverter.java index b3291603acb9700c5969164c6950ea93d79c0444..7e3a88ad40c62f07c52b5ecf39596aed225ef92a 100644 --- a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/element/compartment/CompartmentConverter.java +++ b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/element/compartment/CompartmentConverter.java @@ -15,6 +15,7 @@ import lcsb.mapviewer.common.exception.InvalidArgumentException; import lcsb.mapviewer.common.geometry.EllipseTransformation; import lcsb.mapviewer.common.geometry.LineTransformation; import lcsb.mapviewer.converter.graphics.ConverterParams; +import lcsb.mapviewer.converter.graphics.DrawingException; import lcsb.mapviewer.converter.graphics.bioEntity.element.ElementConverter; import lcsb.mapviewer.converter.graphics.geometry.FontFinder; import lcsb.mapviewer.converter.graphics.geometry.RectangleTooSmallException; @@ -179,7 +180,7 @@ public abstract class CompartmentConverter<T extends Compartment> extends Elemen } @Override - public void draw(T alias, Graphics2D graphics, ConverterParams params, List<ColorSchema> visualizedLayoutsColorSchemas) { + public void draw(T alias, Graphics2D graphics, ConverterParams params, List<ColorSchema> visualizedLayoutsColorSchemas) throws DrawingException { draw(alias, graphics, params); Color oldColor = graphics.getColor(); diff --git a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/element/species/SpeciesConverter.java b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/element/species/SpeciesConverter.java index 82edaed71deeef1652acfb4d66c4383cdb99e8ef..fb2460619fcd85d355aac51b301c351525d48b53 100644 --- a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/element/species/SpeciesConverter.java +++ b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/element/species/SpeciesConverter.java @@ -22,6 +22,7 @@ import lcsb.mapviewer.common.exception.InvalidStateException; import lcsb.mapviewer.common.geometry.EllipseTransformation; import lcsb.mapviewer.common.geometry.LineTransformation; import lcsb.mapviewer.converter.graphics.ConverterParams; +import lcsb.mapviewer.converter.graphics.DrawingException; import lcsb.mapviewer.converter.graphics.bioEntity.element.ElementConverter; import lcsb.mapviewer.model.graphics.LineType; import lcsb.mapviewer.model.map.layout.ColorSchema; @@ -579,7 +580,7 @@ public abstract class SpeciesConverter<T extends Species> extends ElementConvert } @Override - public void draw(T alias, Graphics2D graphics, ConverterParams params, List<ColorSchema> visualizedLayoutsColorSchemas) { + public void draw(T alias, Graphics2D graphics, ConverterParams params, List<ColorSchema> visualizedLayoutsColorSchemas) throws DrawingException { draw(alias, graphics, params); Color oldColor = graphics.getColor(); diff --git a/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/AbstractImageGeneratorTest.java b/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/AbstractImageGeneratorTest.java new file mode 100644 index 0000000000000000000000000000000000000000..d061d78bbbc99bcd218723ffdd07127bca08cd52 --- /dev/null +++ b/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/AbstractImageGeneratorTest.java @@ -0,0 +1,114 @@ +package lcsb.mapviewer.converter.graphics; + +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +import java.awt.Graphics2D; +import java.awt.geom.Point2D; + +import org.apache.log4j.Logger; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; + +import lcsb.mapviewer.model.graphics.PolylineData; +import lcsb.mapviewer.model.map.model.Model; +import lcsb.mapviewer.model.map.model.ModelFullIndexed; +import lcsb.mapviewer.model.map.modifier.Catalysis; +import lcsb.mapviewer.model.map.reaction.Modifier; +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.species.GenericProtein; + +public class AbstractImageGeneratorTest extends GraphicsTestFunctions { + Logger logger = Logger.getLogger(AbstractImageGeneratorTest.class); + + @AfterClass + public static void tearDownAfterClass() throws Exception { + } + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testDrawSimpleMap() throws Exception { + try { + Graphics2D graphics = createGraphicsMock(); + + Model model = createSimpleModel(); + + AbstractImageGenerator gen = createAbstractImageGeneratorMock(graphics, model); + gen.draw(); + + //3 times for proteins and 4 times for reaction + verify(graphics, times(7)).draw(any()); + } catch (Exception e) { + throw e; + } + } + + private Model createSimpleModel() { + Model model = new ModelFullIndexed(null); + model.setWidth(100); + model.setHeight(100); + + GenericProtein protein1 = new GenericProtein("s1"); + protein1.setX(10); + protein1.setY(10); + protein1.setWidth(10); + protein1.setHeight(10); + model.addElement(protein1); + + GenericProtein protein2 = new GenericProtein("s2"); + protein2.setX(30); + protein2.setY(10); + protein2.setWidth(10); + protein2.setHeight(10); + model.addElement(protein2); + + GenericProtein protein3 = new GenericProtein("s3"); + protein3.setX(40); + protein3.setY(10); + protein3.setWidth(10); + protein3.setHeight(10); + model.addElement(protein3); + + Reaction reaction = new Reaction(); + + Modifier modifier = new Catalysis(protein1); + modifier.setLine(new PolylineData(new Point2D.Double(100, 20), new Point2D.Double(100, 80))); + modifier.getLine().setWidth(1.0); + + Reactant reactant = new Reactant(protein2); + reactant.setLine(new PolylineData(new Point2D.Double(90, 90), new Point2D.Double(10, 90))); + reactant.getLine().setWidth(1.0); + Product product = new Product(protein3); + product.setLine(new PolylineData(new Point2D.Double(200, 90), new Point2D.Double(110, 90))); + product.getLine().setWidth(1.0); + reaction.addModifier(modifier); + reaction.addProduct(product); + reaction.addReactant(reactant); + + model.addReaction(reaction); + + return model; + } + + private AbstractImageGenerator createAbstractImageGeneratorMock(Graphics2D graphics, Model model) throws Exception { + AbstractImageGenerator result = Mockito.mock(AbstractImageGenerator.class, Mockito.CALLS_REAL_METHODS); + result.setGraphics(graphics); + result.setParams(new AbstractImageGenerator.Params().model(model)); + return result; + + } + +} diff --git a/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/AllGraphicsTests.java b/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/AllGraphicsTests.java index 712c9d780cc68a7801c4536f6d38d703ec5d54e6..582a1ddc3925a75f8eed2bb51f74d82a571f8156 100644 --- a/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/AllGraphicsTests.java +++ b/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/AllGraphicsTests.java @@ -10,6 +10,7 @@ import lcsb.mapviewer.converter.graphics.placefinder.AllPlaceFinderTest; @RunWith(Suite.class) @SuiteClasses({ // + AbstractImageGeneratorTest.class, // AllBioEntityTests.class, // AllGeometryTests.class, // AllPlaceFinderTest.class, // diff --git a/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/GraphicsTestFunctions.java b/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/GraphicsTestFunctions.java new file mode 100644 index 0000000000000000000000000000000000000000..4cea69b99bf72038251af115595abf4cbd6ef8cb --- /dev/null +++ b/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/GraphicsTestFunctions.java @@ -0,0 +1,21 @@ +package lcsb.mapviewer.converter.graphics; + +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.when; + +import java.awt.FontMetrics; +import java.awt.Graphics2D; +import java.awt.geom.Rectangle2D; + +import org.mockito.Mockito; + +public abstract class GraphicsTestFunctions { + protected Graphics2D createGraphicsMock() { + Graphics2D graphics = Mockito.mock(Graphics2D.class); + FontMetrics fontMetrics = Mockito.mock(FontMetrics.class); + when(fontMetrics.getStringBounds(any(), any())).thenReturn(new Rectangle2D.Double()); + when(graphics.getFontMetrics()).thenReturn(fontMetrics); + return graphics; + } + +} diff --git a/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/bioEntity/reaction/ReactionConverterTest.java b/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/bioEntity/reaction/ReactionConverterTest.java index 2606bb7c8316829dbfbaf55fd27962281de03e56..f5f24088412eedb983923420f2cb1cac7a9f5ea6 100644 --- a/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/bioEntity/reaction/ReactionConverterTest.java +++ b/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/bioEntity/reaction/ReactionConverterTest.java @@ -4,14 +4,11 @@ import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; import java.awt.Color; -import java.awt.FontMetrics; import java.awt.Graphics2D; import java.awt.geom.GeneralPath; import java.awt.geom.Point2D; -import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.Arrays; @@ -27,6 +24,7 @@ import org.mockito.Mockito; import lcsb.mapviewer.commands.ColorExtractor; import lcsb.mapviewer.converter.graphics.ConverterParams; +import lcsb.mapviewer.converter.graphics.GraphicsTestFunctions; import lcsb.mapviewer.model.graphics.PolylineData; import lcsb.mapviewer.model.map.layout.ColorSchema; import lcsb.mapviewer.model.map.layout.GenericColorSchema; @@ -40,7 +38,7 @@ import lcsb.mapviewer.model.map.reaction.Reaction; import lcsb.mapviewer.model.map.reaction.SplitOperator; import lcsb.mapviewer.model.map.species.GenericProtein; -public class ReactionConverterTest { +public class ReactionConverterTest extends GraphicsTestFunctions { ColorExtractor colorExtractor = new ColorExtractor(Color.RED, Color.GREEN); @@ -359,14 +357,6 @@ public class ReactionConverterTest { } } - private Graphics2D createGraphicsMock() { - Graphics2D graphics = Mockito.mock(Graphics2D.class); - FontMetrics fontMetrics = Mockito.mock(FontMetrics.class); - when(fontMetrics.getStringBounds(any(), any())).thenReturn(new Rectangle2D.Double()); - when(graphics.getFontMetrics()).thenReturn(fontMetrics); - return graphics; - } - @Test public void testDrawComplexReactionWithSemanticZoomingAndReactantOff() throws Exception { try { diff --git a/editor/src/main/java/lcsb/mapviewer/editor/gui/canvas/MinervaCanvas.java b/editor/src/main/java/lcsb/mapviewer/editor/gui/canvas/MinervaCanvas.java index 454cdb3aff0a46101091518f3d1ae6d7c4b8591c..7190343e89fedb9dde647437d9ba316d9fd2f0c0 100644 --- a/editor/src/main/java/lcsb/mapviewer/editor/gui/canvas/MinervaCanvas.java +++ b/editor/src/main/java/lcsb/mapviewer/editor/gui/canvas/MinervaCanvas.java @@ -409,6 +409,10 @@ public class MinervaCanvas extends JComponent { throw new NotImplementedException(); } + @Override + protected void closeImageObject() { + } + } try { if (lastBufferedData == null || Math.abs(lastBufferedData.getZoom() - zoom) > Configuration.EPSILON) {