From 05944698d30e07c1add2b8b4ebd5dd5ac5fa3f95 Mon Sep 17 00:00:00 2001 From: Piotr Gawron <piotr.gawron@uni.lu> Date: Wed, 28 Jun 2017 17:40:07 +0200 Subject: [PATCH] semantic zooming and hierarchy visualizaion are unified on the model level --- .../annotation/RestAnnotationParser.java | 10 ++-- .../annotation/RestAnnotationParserTest.java | 12 +++-- .../graphics/AbstractImageGenerator.java | 34 +++++++----- .../bioEntity/BioEntityConverter.java | 2 +- .../bioEntity/SemanticZoomLevelMatcher.java | 11 +++- .../compartment/CompartmentConverter.java | 28 +++++----- .../element/species/ComplexConverter.java | 12 +++-- .../element/species/SpeciesConverter.java | 5 +- .../graphics/placefinder/PlaceFinder.java | 40 ++++++++------ .../graphics/NormalImageGeneratorTest.java | 6 +-- .../graphics/PdfImageGeneratorTest.java | 6 +-- .../bioEntity/BioEntityConverterImplTest.java | 4 +- .../reaction/ReactionConverterTest.java | 16 +++--- .../placefinder/AllPlaceFinderTest.java | 16 +++--- .../commands/CreateHierarchyCommand.java | 12 ++--- .../mapviewer/commands/CopyCommandTest.java | 6 +-- .../commands/CreateHierarchyCommandTest.java | 25 +++++---- .../lcsb/mapviewer/model/map/BioEntity.java | 12 ++++- .../model/map/reaction/Reaction.java | 38 ++++++-------- .../map/reaction/ReactionComparator.java | 7 ++- .../mapviewer/model/map/species/Element.java | 52 +++++++------------ .../model/map/species/ElementComparator.java | 10 +--- .../CompartmentComparatorTest.java | 2 +- .../model/map/reaction/ReactionTest.java | 13 ++--- .../map/species/ComplexComparatorTest.java | 2 +- .../model/map/species/ElementTest.java | 2 +- persist/src/db/11/fix_db_20170628.sql | 8 +++ .../services/impl/ProjectService.java | 6 +-- .../services/impl/SearchService.java | 5 +- .../services/search/data/FullAliasView.java | 9 ++-- .../search/data/FullReactionView.java | 6 +-- 31 files changed, 225 insertions(+), 192 deletions(-) create mode 100644 persist/src/db/11/fix_db_20170628.sql 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 ca09d6630b..97cbe2c445 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 @@ -129,7 +129,7 @@ public class RestAnnotationParser extends XmlParser { sb.append(createEntry(NoteField.PANTHER, filterMiriam(data, MiriamType.PANTHER), forceFullInfo)); sb.append(createEntry(NoteField.DESCRIPTION, null, forceFullInfo)); sb.append(createEntry(NoteField.ABBREVIATION, element.getAbbreviation(), forceFullInfo)); - sb.append(createEntry(NoteField.SEMANTIC_ZOOM_LEVEL_VISIBILITY, element.getSemanticZoomLevelVisibility(), forceFullInfo)); + sb.append(createEntry(NoteField.SEMANTIC_ZOOM_LEVEL_VISIBILITY, element.getVisibilityLevel(), forceFullInfo)); sb.append(createEntry(NoteField.CHARGED_FORMULA, element.getFormula(), forceFullInfo)); if (element instanceof Species) { sb.append(createEntry(NoteField.CHARGE, ((Species) element).getCharge(), forceFullInfo)); @@ -640,12 +640,12 @@ public class RestAnnotationParser extends XmlParser { if (zoomLevelVisibility == null) { return; } - if (element.getSemanticZoomLevelVisibility() == null) { - element.setSemanticZoomLevelVisibility(zoomLevelVisibility); - } else if (!element.getSemanticZoomLevelVisibility().equals(zoomLevelVisibility)) { + if (element.getVisibilityLevel() == null || element.getVisibilityLevel().isEmpty()) { + element.setVisibilityLevel(zoomLevelVisibility); + } else if (!element.getVisibilityLevel().equals(zoomLevelVisibility)) { logger.warn( elementUtils.getElementTag(element) + " New " + NoteField.SEMANTIC_ZOOM_LEVEL_VISIBILITY.getCommonName() + " different than default [" - + zoomLevelVisibility + "][" + element.getSemanticZoomLevelVisibility() + "]. Ignoring."); + + zoomLevelVisibility + "][" + element.getVisibilityLevel() + "]. Ignoring."); } } diff --git a/converter-CellDesigner/src/test/java/lcsb/mapviewer/converter/model/celldesigner/annotation/RestAnnotationParserTest.java b/converter-CellDesigner/src/test/java/lcsb/mapviewer/converter/model/celldesigner/annotation/RestAnnotationParserTest.java index f396388cca..f9d45fd607 100644 --- a/converter-CellDesigner/src/test/java/lcsb/mapviewer/converter/model/celldesigner/annotation/RestAnnotationParserTest.java +++ b/converter-CellDesigner/src/test/java/lcsb/mapviewer/converter/model/celldesigner/annotation/RestAnnotationParserTest.java @@ -428,16 +428,22 @@ public class RestAnnotationParserTest extends CellDesignerTestFunctions { } @Override - public void setSemanticZoomLevelVisibility(String zoomLevelVisibility) { + public void setVisibilityLevel(String zoomLevelVisibility) { // TODO Auto-generated method stub - + } @Override - public String getSemanticZoomLevelVisibility() { + public String getVisibilityLevel() { // TODO Auto-generated method stub return null; } + + @Override + public void setVisibilityLevel(Integer zoomLevelVisibility) { + // TODO Auto-generated method stub + + } }); fail("Exception expected"); } catch (NotImplementedException e) { 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 14ed133d42..19fe2746b3 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 @@ -17,6 +17,7 @@ import org.apache.log4j.Logger; import lcsb.mapviewer.commands.ColorExtractor; import lcsb.mapviewer.common.MimeType; import lcsb.mapviewer.converter.graphics.bioEntity.BioEntityConverterImpl; +import lcsb.mapviewer.converter.graphics.bioEntity.SemanticZoomLevelMatcher; import lcsb.mapviewer.converter.graphics.layer.LayerConverter; import lcsb.mapviewer.model.map.compartment.Compartment; import lcsb.mapviewer.model.map.compartment.PathwayCompartment; @@ -67,6 +68,7 @@ import lcsb.mapviewer.modelutils.map.ElementUtils; * */ public abstract class AbstractImageGenerator { + private SemanticZoomLevelMatcher zoomLevelMatcher = new SemanticZoomLevelMatcher(); /** * Model is drawn as a partial image (x,y,width,height parameters of @@ -78,32 +80,32 @@ public abstract class AbstractImageGenerator { * TODO maybe more effecient (and safe) solution would be to include text * desciption as parts of the object border */ - private static final int SINGLE_FRAME_MARGIN = 100; + private static final int SINGLE_FRAME_MARGIN = 100; /** * On which level in hierarchical view we should visualize map. */ - private int level = Integer.MAX_VALUE; + private int level = Integer.MAX_VALUE; /** * Zoom factor of the drawing. */ - private double scale = 1; + private double scale = 1; /** * This is a frame border from which we take all elements to draw. */ - private Rectangle2D.Double border = null; + private Rectangle2D.Double border = null; /** * Object that helps to convert {@link ColorSchema} values into colors. */ - private ColorExtractor colorExtractor = null; + private ColorExtractor colorExtractor = null; /** * Util class for simple operations on {@link Element elements}. */ - private ElementUtils eu = new ElementUtils(); + private ElementUtils eu = new ElementUtils(); /** * This class contains a list of params that are used for drawing. @@ -675,7 +677,7 @@ public abstract class AbstractImageGenerator { // draw only elements that don't have parents (aren't included in any // compartment/complexes) if (element instanceof Species) { - if (((Species) element).getComplex() == null && ((Species) element).getCompartment() == null) { + if (((Species) element).getComplex() == null && element.getCompartment() == null) { drawSpecies((Species) element, params.getVisibleLayoutsForElement(element), params); } } @@ -735,7 +737,7 @@ public abstract class AbstractImageGenerator { // If 'compartment' has not the big enough visibility level then should not // be visible. - if (compartment.getVisibilityLevel() > level && params.nested) { + if (!(zoomLevelMatcher.isVisible(level, compartment.getVisibilityLevel())) && params.nested) { return; } @@ -746,7 +748,7 @@ public abstract class AbstractImageGenerator { */ boolean fill = true; - if (compartment.getTransparencyLevel() <= level || !params.nested) { + if (zoomLevelMatcher.isTransparent(level, compartment.getTransparencyLevel()) || !params.nested) { fill = false; } @@ -817,7 +819,7 @@ public abstract class AbstractImageGenerator { // VisibilityLevel is big enough, then it is // displayed. - if (species.getVisibilityLevel() > level && params.nested) { + if (!(zoomLevelMatcher.isVisible(level, species.getVisibilityLevel())) && params.nested) { return; } @@ -832,10 +834,16 @@ public abstract class AbstractImageGenerator { boolean rescale = false; if (species instanceof Complex) { - if (((Complex) species).getElements().size() == 0) { + Complex complex = (Complex) species; + if (complex.getElements().size() == 0) { rescale = true; - } else if (((Complex) species).getElements().get(0).getVisibilityLevel() > level) { + } else { rescale = true; + for (Element child : complex.getElements()) { + if ((zoomLevelMatcher.isVisible(level, child.getVisibilityLevel())) || !params.nested) { + rescale = false; + } + } } } @@ -862,7 +870,7 @@ public abstract class AbstractImageGenerator { // mode if (!complex.getState().equalsIgnoreCase("brief")) { // depending on current zoom level, children are drawn or not - if (complex.getTransparencyLevel() <= level) { + if (zoomLevelMatcher.isTransparent(level, complex.getTransparencyLevel()) || !params.nested) { for (Species a : complex.getElements()) { drawSpecies(a, visibleLayouts, params); } 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 83ea40c734..fc23fb911c 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 @@ -157,7 +157,7 @@ public abstract class BioEntityConverter<T extends BioEntity> { */ protected boolean isVisible(BioEntity bioEntity, ConverterParams params) { if (params.isSemanticZoomingOn()) { - boolean result = semanticZoomLevelMatcher.matchLevel(params.getLevel(), bioEntity.getSemanticZoomLevelVisibility()); + boolean result = semanticZoomLevelMatcher.isVisible(params.getLevel(), bioEntity.getVisibilityLevel()); if (bioEntity instanceof Element) { Compartment compartment = ((Element) bioEntity).getCompartment(); if (compartment != null) { diff --git a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/SemanticZoomLevelMatcher.java b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/SemanticZoomLevelMatcher.java index 195b6e4916..a5c28959bc 100644 --- a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/SemanticZoomLevelMatcher.java +++ b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/SemanticZoomLevelMatcher.java @@ -12,7 +12,15 @@ public class SemanticZoomLevelMatcher { * range of levels to be checked * @return true if level is in the range */ - public boolean matchLevel(int level, String semanticZoomLevelVisibility) { + public boolean isVisible(int level, String semanticZoomLevelVisibility) { + return matchLevel(level, semanticZoomLevelVisibility); + } + + public boolean isTransparent(int level, String semanticZoomLevelVisibility) { + return matchLevel(level, semanticZoomLevelVisibility); + } + + private boolean matchLevel(int level, String semanticZoomLevelVisibility) { if (semanticZoomLevelVisibility == null || semanticZoomLevelVisibility.isEmpty()) { return true; } @@ -30,5 +38,6 @@ public class SemanticZoomLevelMatcher { } return false; } + } 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 555a06d3d0..842e457046 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 @@ -14,6 +14,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.bioEntity.SemanticZoomLevelMatcher; import lcsb.mapviewer.converter.graphics.bioEntity.element.ElementConverter; import lcsb.mapviewer.converter.graphics.geometry.FontFinder; import lcsb.mapviewer.converter.graphics.geometry.RectangleTooSmallException; @@ -33,56 +34,58 @@ import lcsb.mapviewer.model.map.layout.ColorSchema; */ public abstract class CompartmentConverter<T extends Compartment> extends ElementConverter<T> { + private SemanticZoomLevelMatcher zoomLevelMatcher = new SemanticZoomLevelMatcher(); + /** * Default class logger. */ @SuppressWarnings("unused") - private static Logger logger = Logger.getLogger(CompartmentConverter.class.getName()); + private static Logger logger = Logger.getLogger(CompartmentConverter.class.getName()); /** * Default font size. */ - private static final int DEFAULT_FONT_SIZE = 10; + private static final int DEFAULT_FONT_SIZE = 10; /** * Alpha level for inside of the transparent compartments. */ - public static final int DEFAULT_ALPHA_LEVEL = 8; + public static final int DEFAULT_ALPHA_LEVEL = 8; /** * Class used for transformation of lines. */ - private LineTransformation lineTransformation = new LineTransformation(); + private LineTransformation lineTransformation = new LineTransformation(); /** * Class used for transformation of ellipses. */ - private EllipseTransformation ellipseTransformation = new EllipseTransformation(); + private EllipseTransformation ellipseTransformation = new EllipseTransformation(); /** * Default alpha level for transparent compartments. */ - private static int alphaLevel = DEFAULT_ALPHA_LEVEL; + private static int alphaLevel = DEFAULT_ALPHA_LEVEL; /** * Default alpha level for semi-transparent borders. */ - protected static final int HIGH_ALPHA_LEVEL = 127; + protected static final int HIGH_ALPHA_LEVEL = 127; /** * Class used for finding place to draw desciption of the compartment. */ - private PlaceFinder placeFinder; + private PlaceFinder placeFinder; /** * Object used for synchronization when accessing {@link #placeFinder}. */ - private String placeFinderSynchronization = ""; + private String placeFinderSynchronization = ""; /** * Object that helps to convert {@link ColorSchema} values into colors. */ - private ColorExtractor colorExtractor; + private ColorExtractor colorExtractor; /** * Default constructor. @@ -103,12 +106,13 @@ public abstract class CompartmentConverter<T extends Compartment> extends Elemen "Dimension of the alias must be bigger than 0. Alias id: " + alias.getElementId() + " (name: \"" + alias.getName() + "\")"); } Rectangle2D border = alias.getBorder(); - if (params.getLevel() >= alias.getVisibilityLevel() && params.getLevel() < alias.getTransparencyLevel()) { + if (zoomLevelMatcher.isVisible(params.getLevel(), alias.getVisibilityLevel()) + && !zoomLevelMatcher.isTransparent(params.getLevel(), alias.getTransparencyLevel())) { synchronized (placeFinderSynchronization) { if (placeFinder == null || placeFinder.getModel() != alias.getModelData()) { placeFinder = new PlaceFinder(alias.getModelData().getModel()); } - border = placeFinder.getRetangle(alias); + border = placeFinder.getRetangle(alias, params.getLevel()); } } else if (!params.isTextCentered()) { border = new Rectangle2D.Double( diff --git a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/element/species/ComplexConverter.java b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/element/species/ComplexConverter.java index 345fb93944..8c36e5f603 100644 --- a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/element/species/ComplexConverter.java +++ b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/bioEntity/element/species/ComplexConverter.java @@ -13,6 +13,7 @@ import org.apache.log4j.Logger; import lcsb.mapviewer.commands.ColorExtractor; import lcsb.mapviewer.converter.graphics.ConverterParams; +import lcsb.mapviewer.converter.graphics.bioEntity.SemanticZoomLevelMatcher; import lcsb.mapviewer.converter.graphics.geometry.FontFinder; import lcsb.mapviewer.converter.graphics.geometry.RectangleTooSmallException; import lcsb.mapviewer.model.graphics.LineType; @@ -30,20 +31,22 @@ import lcsb.mapviewer.model.map.species.Complex; */ public class ComplexConverter extends SpeciesConverter<Complex> { + private SemanticZoomLevelMatcher zoomLevelMatcher = new SemanticZoomLevelMatcher(); + /** * How big is the triangle trimmed part of the complex. */ - private static final int TRIMMED_CORNER_SIZE = 5; + private static final int TRIMMED_CORNER_SIZE = 5; /** * Describes the distance between border of complex and internal border in * brief view (without children). */ - private static final double INTERNAL_BORDER_DIST = 5.0; + private static final double INTERNAL_BORDER_DIST = 5.0; /** * Default class logger. */ - private static Logger logger = Logger.getLogger(ComplexConverter.class.getName()); + private static Logger logger = Logger.getLogger(ComplexConverter.class.getName()); /** * Default constructor. @@ -56,7 +59,6 @@ public class ComplexConverter extends SpeciesConverter<Complex> { super(colorExtractor); } - @Override public void draw(final Complex alias, final Graphics2D graphics, final ConverterParams params) { if (alias.getState().equalsIgnoreCase("complexnoborder")) { @@ -145,7 +147,7 @@ public class ComplexConverter extends SpeciesConverter<Complex> { @Override public void drawText(final Complex alias, final Graphics2D graphics, final ConverterParams params) { if (((Complex) alias).getElements().size() > 0) { - if (alias.getTransparencyLevel() <= params.getLevel()) { + if (zoomLevelMatcher.isTransparent(params.getLevel(), alias.getTransparencyLevel())) { super.drawText(alias, graphics, params); return; } 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 73cb492d1e..ce768f1601 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 @@ -21,6 +21,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.bioEntity.SemanticZoomLevelMatcher; import lcsb.mapviewer.converter.graphics.bioEntity.element.ElementConverter; import lcsb.mapviewer.model.graphics.LineType; import lcsb.mapviewer.model.map.layout.ColorSchema; @@ -39,6 +40,8 @@ import lcsb.mapviewer.model.map.species.Species; */ public abstract class SpeciesConverter<T extends Species> extends ElementConverter<T> { + private SemanticZoomLevelMatcher zoomLevelMatcher = new SemanticZoomLevelMatcher(); + /** * PI value. */ @@ -301,7 +304,7 @@ public abstract class SpeciesConverter<T extends Species> extends ElementConvert Point2D point = alias.getCenter(); if (alias instanceof Complex) { if (((Complex) alias).getElements().size() > 0) { - if (alias.getTransparencyLevel() <= params.getLevel()) { + if (zoomLevelMatcher.isTransparent(params.getLevel(), alias.getTransparencyLevel())) { point.setLocation(point.getX(), alias.getY() + alias.getHeight() - graphics.getFontMetrics().getAscent()); } } diff --git a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/placefinder/PlaceFinder.java b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/placefinder/PlaceFinder.java index 36d9e96928..98dc0c33be 100644 --- a/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/placefinder/PlaceFinder.java +++ b/converter-graphics/src/main/java/lcsb/mapviewer/converter/graphics/placefinder/PlaceFinder.java @@ -8,6 +8,7 @@ import java.util.Map; import java.util.Set; import java.util.TreeSet; +import lcsb.mapviewer.converter.graphics.bioEntity.SemanticZoomLevelMatcher; import lcsb.mapviewer.model.map.compartment.Compartment; import lcsb.mapviewer.model.map.model.Model; import lcsb.mapviewer.model.map.species.Element; @@ -23,6 +24,8 @@ import org.apache.log4j.Logger; */ public class PlaceFinder { + private SemanticZoomLevelMatcher zoomLevelMatcher = new SemanticZoomLevelMatcher(); + /** * Represents small part of the map (enclosed by cuting lines) where something * can be put. Contains borders (height, weight, location etc). Informatin if @@ -103,52 +106,52 @@ public class PlaceFinder { * Default class logger. */ @SuppressWarnings("unused") - private static Logger logger = Logger.getLogger(PlaceFinder.class.getName()); + private static Logger logger = Logger.getLogger(PlaceFinder.class.getName()); /** * Whole surface is split into rectangular regions. The lines that cut the * surface correspond to borders of aliases that overlap current alias. This * matrix defines which of these regions can be used for description. */ - private Field[][] matrix; + private Field[][] matrix; /** - * List of {@link Compartment compartment aliases} that split surface - * into regions. + * List of {@link Compartment compartment aliases} that split surface into + * regions. */ - private List<Compartment> aliases; + private List<Compartment> aliases; /** * Alias for which computation is done. */ - private Element mainAlias; + private Element mainAlias; /** * Left boundary of the rectangle in which we want to fit our description. */ - private double leftBound; + private double leftBound; /** * Right boundary of the rectangle in which we want to fit our description. */ - private double rightBound; + private double rightBound; /** * Top boundary of the rectangle in which we want to fit our description. */ - private double upBound; + private double upBound; /** * Bottom boundary of the rectangle in which we want to fit our description. */ - private double bottomBound; + private double bottomBound; /** * Model for which this {@link PlaceFinder} was created. */ - private Model model; + private Model model; /** * Map with aliases that should be considered when looking for a place to put * text. */ - private Map<Element, List<Compartment>> otherAliases = new HashMap<Element, List<Compartment>>(); + private Map<Element, Map<Integer, List<Compartment>>> otherAliases = new HashMap<>(); /** * Default constructor for place finder in a model. @@ -342,18 +345,23 @@ public class PlaceFinder { * alias for which we try to determine text position * @return bounds where text could be put */ - public Rectangle2D getRetangle(Compartment alias) { - List<Compartment> list = otherAliases.get(alias); + public Rectangle2D getRetangle(Compartment alias, int level) { + Map<Integer, List<Compartment>> lists = otherAliases.get(alias); + if (lists == null) { + lists = new HashMap<>(); + otherAliases.put(alias, lists); + } + List<Compartment> list = lists.get(level); if (list == null) { list = new ArrayList<Compartment>(); for (Compartment compAlias : model.getCompartments()) { - if (compAlias.getVisibilityLevel() <= alias.getVisibilityLevel() && compAlias.getTransparencyLevel() > alias.getVisibilityLevel()) { + if (zoomLevelMatcher.isVisible(level, compAlias.getVisibilityLevel()) && !zoomLevelMatcher.isTransparent(level, compAlias.getTransparencyLevel())) { if (compAlias.cross(alias) && compAlias.getSize() <= alias.getSize()) { list.add(compAlias); } } } - otherAliases.put(alias, list); + lists.put(level, list); } this.mainAlias = alias; diff --git a/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/NormalImageGeneratorTest.java b/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/NormalImageGeneratorTest.java index 36d84707d1..864c939598 100644 --- a/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/NormalImageGeneratorTest.java +++ b/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/NormalImageGeneratorTest.java @@ -139,9 +139,9 @@ public class NormalImageGeneratorTest { layer.addLayerText(new LayerText(new Rectangle2D.Double(100, 100, 199, 220), "Z dgf fsd aaewq ret")); new CreateHierarchyCommand(model, 1, 8).execute(); - model.getCompartments().get(1).setTransparencyLevel(2); - model.getCompartments().get(0).setTransparencyLevel(2); - model.getCompartments().get(3).setTransparencyLevel(2); + model.getCompartments().get(1).setTransparencyLevel("2"); + model.getCompartments().get(0).setTransparencyLevel("2"); + model.getCompartments().get(3).setTransparencyLevel("2"); new PngImageGenerator(new Params().level(2).scale(4).width(600).height(600).model(model).nested(true)); } catch (Exception e) { diff --git a/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/PdfImageGeneratorTest.java b/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/PdfImageGeneratorTest.java index 3d191ad894..6109ab544d 100644 --- a/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/PdfImageGeneratorTest.java +++ b/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/PdfImageGeneratorTest.java @@ -51,9 +51,9 @@ public class PdfImageGeneratorTest { layer.addLayerText(new LayerText(new Rectangle2D.Double(100, 100, 199, 220), "Z dgf fsd aaewq ret")); new CreateHierarchyCommand(model, 1, 8).execute(); - model.getCompartments().get(1).setTransparencyLevel(2); - model.getCompartments().get(0).setTransparencyLevel(2); - model.getCompartments().get(3).setTransparencyLevel(2); + model.getCompartments().get(1).setTransparencyLevel("2"); + model.getCompartments().get(0).setTransparencyLevel("2"); + model.getCompartments().get(3).setTransparencyLevel("2"); PdfImageGenerator pig = new PdfImageGenerator(new Params().level(2).scale(4).width(600).height(600).model(model).nested(true)); diff --git a/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/bioEntity/BioEntityConverterImplTest.java b/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/bioEntity/BioEntityConverterImplTest.java index 8ba25ceb5b..9141204ccf 100644 --- a/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/bioEntity/BioEntityConverterImplTest.java +++ b/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/bioEntity/BioEntityConverterImplTest.java @@ -46,7 +46,7 @@ public class BioEntityConverterImplTest { try { Graphics2D graphics = Mockito.mock(Graphics2D.class); Reaction reaction = createReaction(1.0); - reaction.getReactants().get(0).getElement().setSemanticZoomLevelVisibility("11"); + reaction.getReactants().get(0).getElement().setVisibilityLevel("11"); BioEntityConverterImpl rc = new BioEntityConverterImpl(reaction, false, colorExtractor); rc.draw(reaction, graphics, new ConverterParams().semanticZoomingOn(true).level(10)); @@ -64,7 +64,7 @@ public class BioEntityConverterImplTest { Graphics2D graphics = Mockito.mock(Graphics2D.class); Reaction reaction = createReaction(1.0); - reaction.getProducts().get(0).getElement().setSemanticZoomLevelVisibility("11"); + reaction.getProducts().get(0).getElement().setVisibilityLevel("11"); BioEntityConverterImpl rc = new BioEntityConverterImpl(reaction, false, colorExtractor); rc.draw(reaction, graphics, new ConverterParams().semanticZoomingOn(true).level(10)); 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 4623a64019..8d17b603ca 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 @@ -280,7 +280,7 @@ public class ReactionConverterTest { ReactionConverter rc = new ReactionConverter(colorExtractor); Reaction reaction = createReaction(1.0); - reaction.getModifiers().get(0).getElement().setSemanticZoomLevelVisibility("11"); + reaction.getModifiers().get(0).getElement().setVisibilityLevel("11"); rc.draw(reaction, graphics, new ConverterParams().semanticZoomingOn(true).level(10)); verify(graphics, times(3)).draw(any(GeneralPath.class)); @@ -297,7 +297,7 @@ public class ReactionConverterTest { ReactionConverter rc = new ReactionConverter(colorExtractor); Reaction reaction = createReaction(1.0); - reaction.getReactants().get(0).getElement().setSemanticZoomLevelVisibility("11"); + reaction.getReactants().get(0).getElement().setVisibilityLevel("11"); rc.draw(reaction, graphics, new ConverterParams().semanticZoomingOn(true).level(10)); verify(graphics, times(3)).draw(any(GeneralPath.class)); @@ -314,7 +314,7 @@ public class ReactionConverterTest { ReactionConverter rc = new ReactionConverter(colorExtractor); Reaction reaction = createReaction(1.0); - reaction.getProducts().get(0).getElement().setSemanticZoomLevelVisibility("11"); + reaction.getProducts().get(0).getElement().setVisibilityLevel("11"); rc.draw(reaction, graphics, new ConverterParams().semanticZoomingOn(true).level(10)); verify(graphics, times(3)).draw(any(GeneralPath.class)); @@ -331,7 +331,7 @@ public class ReactionConverterTest { ReactionConverter rc = new ReactionConverter(colorExtractor); Reaction reaction = createComplexReaction(1.0); - reaction.getModifiers().get(0).getElement().setSemanticZoomLevelVisibility("11"); + reaction.getModifiers().get(0).getElement().setVisibilityLevel("11"); rc.draw(reaction, graphics, new ConverterParams().semanticZoomingOn(true).level(10)); verify(graphics, times(12)).draw(any(GeneralPath.class)); @@ -348,8 +348,8 @@ public class ReactionConverterTest { ReactionConverter rc = new ReactionConverter(colorExtractor); Reaction reaction = createComplexReaction(1.0); - reaction.getModifiers().get(0).getElement().setSemanticZoomLevelVisibility("11"); - reaction.getModifiers().get(1).getElement().setSemanticZoomLevelVisibility("11"); + reaction.getModifiers().get(0).getElement().setVisibilityLevel("11"); + reaction.getModifiers().get(1).getElement().setVisibilityLevel("11"); rc.draw(reaction, graphics, new ConverterParams().semanticZoomingOn(true).level(10)); verify(graphics, times(9)).draw(any(GeneralPath.class)); @@ -374,7 +374,7 @@ public class ReactionConverterTest { ReactionConverter rc = new ReactionConverter(colorExtractor); Reaction reaction = createComplexReaction(1.0); - reaction.getReactants().get(0).getElement().setSemanticZoomLevelVisibility("11"); + reaction.getReactants().get(0).getElement().setVisibilityLevel("11"); rc.draw(reaction, graphics, new ConverterParams().semanticZoomingOn(true).level(10)); verify(graphics, times(12)).draw(any(GeneralPath.class)); @@ -391,7 +391,7 @@ public class ReactionConverterTest { ReactionConverter rc = new ReactionConverter(colorExtractor); Reaction reaction = createComplexReaction(1.0); - reaction.getProducts().get(0).getElement().setSemanticZoomLevelVisibility("11"); + reaction.getProducts().get(0).getElement().setVisibilityLevel("11"); rc.draw(reaction, graphics, new ConverterParams().semanticZoomingOn(true).level(10)); verify(graphics, times(12)).draw(any(GeneralPath.class)); diff --git a/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/placefinder/AllPlaceFinderTest.java b/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/placefinder/AllPlaceFinderTest.java index 2ddcd62d38..de5f85db23 100644 --- a/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/placefinder/AllPlaceFinderTest.java +++ b/converter-graphics/src/test/java/lcsb/mapviewer/converter/graphics/placefinder/AllPlaceFinderTest.java @@ -31,7 +31,7 @@ public class AllPlaceFinderTest { for (Compartment alias : model.getCompartments()) { PlaceFinder pf = new PlaceFinder(model); - actual = pf.getRetangle(alias).toString(); + actual = pf.getRetangle(alias, Integer.valueOf(alias.getVisibilityLevel())).toString(); } String expected = ""; Rectangle2D result = model.getCompartments().get(0).getBorder(); @@ -49,7 +49,7 @@ public class AllPlaceFinderTest { String expected = ""; for (Compartment alias : model.getCompartments()) { PlaceFinder pf = new PlaceFinder(model); - actual = pf.getRetangle(alias).toString(); + actual = pf.getRetangle(alias, Integer.valueOf(alias.getVisibilityLevel())).toString(); Rectangle2D result = alias.getBorder(); expected = result.toString(); assertEquals(expected, actual); @@ -65,7 +65,7 @@ public class AllPlaceFinderTest { model.addElement(alias2); PlaceFinder pf = new PlaceFinder(model); - Rectangle2D rect = pf.getRetangle(alias2); + Rectangle2D rect = pf.getRetangle(alias2, Integer.valueOf(alias.getVisibilityLevel())); double actual = rect.getWidth() * rect.getHeight(); double expected = alias2.getWidth() * alias2.getHeight(); assertTrue(actual < expected); @@ -79,7 +79,7 @@ public class AllPlaceFinderTest { double actual = 0.0; for (Compartment alias : model.getCompartments()) { PlaceFinder pf = new PlaceFinder(model); - Rectangle2D rect = pf.getRetangle(alias); + Rectangle2D rect = pf.getRetangle(alias, Integer.valueOf(alias.getVisibilityLevel())); actual = rect.getWidth() * rect.getHeight(); assertTrue(actual > 0); } @@ -95,7 +95,7 @@ public class AllPlaceFinderTest { Rectangle2D result = null; for (Compartment alias : model.getCompartments()) { PlaceFinder pf = new PlaceFinder(model); - Rectangle2D rect = pf.getRetangle(alias); + Rectangle2D rect = pf.getRetangle(alias, Integer.valueOf(alias.getVisibilityLevel())); actual += rect.getWidth() * rect.getHeight(); } result = model.getCompartments().get(0).getBorder(); @@ -124,8 +124,8 @@ public class AllPlaceFinderTest { result.setY(y); result.setWidth(width); result.setHeight(height); - result.setTransparencyLevel(10); - result.setVisibilityLevel(9); + result.setTransparencyLevel("10"); + result.setVisibilityLevel("9"); return result; } @@ -138,7 +138,7 @@ public class AllPlaceFinderTest { double actual = 0.0; for (Compartment alias : model.getCompartments()) { PlaceFinder pf = new PlaceFinder(model); - Rectangle2D rect = pf.getRetangle(alias); + Rectangle2D rect = pf.getRetangle(alias, Integer.valueOf(alias.getVisibilityLevel())); actual = rect.getWidth() * rect.getHeight(); assertTrue(actual > 0); } diff --git a/model-command/src/main/java/lcsb/mapviewer/commands/CreateHierarchyCommand.java b/model-command/src/main/java/lcsb/mapviewer/commands/CreateHierarchyCommand.java index 23a0107feb..4ef0375840 100644 --- a/model-command/src/main/java/lcsb/mapviewer/commands/CreateHierarchyCommand.java +++ b/model-command/src/main/java/lcsb/mapviewer/commands/CreateHierarchyCommand.java @@ -203,7 +203,7 @@ public class CreateHierarchyCommand extends ModelCommand { logValue = zoomLevels; } } - alias.setVisibilityLevel(logValue); + alias.setVisibilityLevel(logValue + ""); } } @@ -218,7 +218,7 @@ public class CreateHierarchyCommand extends ModelCommand { double rate = computeRate(compartment, Configuration.MAX_VISIBLE_OBJECT_SIZE); maxVisibilityLevel = (int) ((int) Math.ceil(Math.log(rate)) / LOG_4); for (Element child : compartment.getElements()) { - maxVisibilityLevel = Math.min(maxVisibilityLevel, child.getVisibilityLevel()); + maxVisibilityLevel = Math.min(maxVisibilityLevel, Integer.valueOf(child.getVisibilityLevel())); } if (maxVisibilityLevel >= zoomLevels) { maxVisibilityLevel = zoomLevels; @@ -226,7 +226,7 @@ public class CreateHierarchyCommand extends ModelCommand { if (maxVisibilityLevel <= 0) { maxVisibilityLevel = 1; } - compartment.setTransparencyLevel(maxVisibilityLevel); + compartment.setTransparencyLevel(maxVisibilityLevel + ""); for (Element child : compartment.getElements()) { child.setVisibilityLevel(compartment.getTransparencyLevel()); } @@ -243,7 +243,7 @@ public class CreateHierarchyCommand extends ModelCommand { double rate = computeRate(complex, Configuration.MAX_VISIBLE_OBJECT_SIZE); maxVisibilityLevel = (int) ((int) Math.ceil(Math.log(rate)) / LOG_4); for (Element child : complex.getElements()) { - maxVisibilityLevel = Math.min(maxVisibilityLevel, child.getVisibilityLevel()); + maxVisibilityLevel = Math.min(maxVisibilityLevel, Integer.valueOf(child.getVisibilityLevel())); } if (maxVisibilityLevel >= zoomLevels) { maxVisibilityLevel = zoomLevels; @@ -251,7 +251,7 @@ public class CreateHierarchyCommand extends ModelCommand { if (maxVisibilityLevel <= 0) { maxVisibilityLevel = 1; } - complex.setTransparencyLevel(maxVisibilityLevel); + complex.setTransparencyLevel(maxVisibilityLevel + ""); for (Element child : complex.getElements()) { child.setVisibilityLevel(complex.getTransparencyLevel()); } @@ -270,7 +270,7 @@ public class CreateHierarchyCommand extends ModelCommand { } else if (alias instanceof Complex) { settingTransparencyLevelForComplex((Complex) alias); } else { - alias.setTransparencyLevel(0); + alias.setTransparencyLevel("0"); } } } diff --git a/model-command/src/test/java/lcsb/mapviewer/commands/CopyCommandTest.java b/model-command/src/test/java/lcsb/mapviewer/commands/CopyCommandTest.java index cc78f07b6e..6ff5608d3c 100644 --- a/model-command/src/test/java/lcsb/mapviewer/commands/CopyCommandTest.java +++ b/model-command/src/test/java/lcsb/mapviewer/commands/CopyCommandTest.java @@ -328,8 +328,8 @@ public class CopyCommandTest extends CommandTestFunctions { Compartment c1 = new SquareCompartment("c1"); Compartment c2 = new SquareCompartment("c2"); - c1.setSemanticZoomLevelVisibility("2"); - c2.setSemanticZoomLevelVisibility("3"); + c1.setVisibilityLevel("2"); + c2.setVisibilityLevel("3"); model.addElement(c1); model.addElement(c2); @@ -349,7 +349,7 @@ public class CopyCommandTest extends CommandTestFunctions { Product product = new Product(s2); product.setLine(new PolylineData(new Point2D.Double(10, 0), new Point2D.Double(120, 10))); reaction.addProduct(product); - reaction.setSemanticZoomLevelVisibility("4"); + reaction.setVisibilityLevel("4"); model.addReaction(reaction); diff --git a/model-command/src/test/java/lcsb/mapviewer/commands/CreateHierarchyCommandTest.java b/model-command/src/test/java/lcsb/mapviewer/commands/CreateHierarchyCommandTest.java index 4d733b555e..97eb95a6f9 100644 --- a/model-command/src/test/java/lcsb/mapviewer/commands/CreateHierarchyCommandTest.java +++ b/model-command/src/test/java/lcsb/mapviewer/commands/CreateHierarchyCommandTest.java @@ -53,7 +53,7 @@ public class CreateHierarchyCommandTest extends CommandTestFunctions { parents.add(alias); } - Set<Integer> levels = new HashSet<Integer>(); + Set<String> levels = new HashSet<>(); for (Element a : model.getElements()) { levels.add(a.getVisibilityLevel()); } @@ -150,16 +150,16 @@ public class CreateHierarchyCommandTest extends CommandTestFunctions { for (Compartment compartment : model.getCompartments()) { if (compartment.getCompartment() == null) { + int visibilityLevel = Integer.valueOf(compartment.getVisibilityLevel()); assertTrue( - "Alias " + compartment.getElementId() + " is not visible at levels highers than " + compartment.getVisibilityLevel(), - compartment.getVisibilityLevel() <= 1); + "Alias " + compartment.getElementId() + " is not visible at levels highers than " + compartment.getVisibilityLevel(), visibilityLevel <= 1); } } for (Species species : model.getSpeciesList()) { if (species.getCompartment() == null) { - assertTrue( - "Alias " + species.getElementId() + " is not visible at levels highers than " + species.getVisibilityLevel(), species.getVisibilityLevel() <= 1); + int visibilityLevel = Integer.valueOf(species.getVisibilityLevel()); + assertTrue("Alias " + species.getElementId() + " is not visible at levels highers than " + species.getVisibilityLevel(), visibilityLevel <= 1); } } @@ -179,10 +179,11 @@ public class CreateHierarchyCommandTest extends CommandTestFunctions { new CreateHierarchyCommand(model, levels, zoomFactor).execute(); - for (Element alias : model.getElements()) { + for (Element element : model.getElements()) { + int visibilityLevel = Integer.valueOf(element.getVisibilityLevel()); assertTrue( - "Alias " + alias.getElementId() + " is not visible even at the bottom level (visibility: " + alias.getVisibilityLevel() + ") ", - alias.getVisibilityLevel() <= levels); + "Alias " + element.getElementId() + " is not visible even at the bottom level (visibility: " + element.getVisibilityLevel() + ") ", + visibilityLevel <= levels); } } catch (Exception e) { @@ -262,12 +263,16 @@ public class CreateHierarchyCommandTest extends CommandTestFunctions { for (Element alias : model.getElements()) { Element parentAlias = alias.getCompartment(); if (parentAlias != null) { - assertTrue(alias.getVisibilityLevel() >= parentAlias.getVisibilityLevel()); + int parentVisibilityLevel = Integer.valueOf(parentAlias.getVisibilityLevel()); + int aliasVisibilityLevel = Integer.valueOf(alias.getVisibilityLevel()); + assertTrue(aliasVisibilityLevel >= parentVisibilityLevel); } if (alias instanceof Species) { parentAlias = ((Species) alias).getComplex(); if (parentAlias != null) { - assertTrue(alias.getVisibilityLevel() >= parentAlias.getVisibilityLevel()); + int parentVisibilityLevel = Integer.valueOf(parentAlias.getVisibilityLevel()); + int aliasVisibilityLevel = Integer.valueOf(alias.getVisibilityLevel()); + assertTrue(aliasVisibilityLevel >= parentVisibilityLevel); } } } diff --git a/model/src/main/java/lcsb/mapviewer/model/map/BioEntity.java b/model/src/main/java/lcsb/mapviewer/model/map/BioEntity.java index eb2f82d237..b5aa17cc9b 100644 --- a/model/src/main/java/lcsb/mapviewer/model/map/BioEntity.java +++ b/model/src/main/java/lcsb/mapviewer/model/map/BioEntity.java @@ -145,12 +145,20 @@ public interface BioEntity extends Serializable { * @param zoomLevelVisibility * semantic zoom level visibility */ - void setSemanticZoomLevelVisibility(String zoomLevelVisibility); + void setVisibilityLevel(String zoomLevelVisibility); + + /** + * Sets semantic zoom level visibility. + * + * @param zoomLevelVisibility + * semantic zoom level visibility + */ + void setVisibilityLevel(Integer zoomLevelVisibility); /** * Returns semantic zoom level visibility. * * @return semantic zoom level visibility */ - String getSemanticZoomLevelVisibility(); + String getVisibilityLevel(); } diff --git a/model/src/main/java/lcsb/mapviewer/model/map/reaction/Reaction.java b/model/src/main/java/lcsb/mapviewer/model/map/reaction/Reaction.java index 6a2fafcf6b..13cd8e3dc2 100644 --- a/model/src/main/java/lcsb/mapviewer/model/map/reaction/Reaction.java +++ b/model/src/main/java/lcsb/mapviewer/model/map/reaction/Reaction.java @@ -183,7 +183,7 @@ public class Reaction implements BioEntity { /** * Zoom level visibility for semantic zooming. */ - private String zoomLevelVisibility; + private String visibilityLevel = ""; /** * Lists of all synonyms used for describing this element. @@ -253,7 +253,7 @@ public class Reaction implements BioEntity { for (String synonym : original.getSynonyms()) { synonyms.add(synonym); } - setSemanticZoomLevelVisibility(original.getSemanticZoomLevelVisibility()); + setVisibilityLevel(original.getVisibilityLevel()); } @@ -411,20 +411,14 @@ public class Reaction implements BioEntity { return "Generic Reaction"; } - /** - * Returns visibility level of the reaction in hierarchical view. More - * information about hierarchical view can be found in - * {@link lcsb.mapviewer.converter.graphics.AbstractImageGenerator - * AbstractImageGenerator}. - * - * @return visibility level of the reaction - */ - public int getVisibilityLevel() { - int level = 0; - for (ReactionNode node : getReactionNodes()) { - level = Math.max(level, node.getElement().getVisibilityLevel()); - } - return level; + @Override + public String getVisibilityLevel() { + return visibilityLevel; + } + + @Override + public void setVisibilityLevel(String visibilityLevel) { + this.visibilityLevel = visibilityLevel; } /** @@ -874,13 +868,13 @@ public class Reaction implements BioEntity { } @Override - public String getSemanticZoomLevelVisibility() { - return zoomLevelVisibility; - } + public void setVisibilityLevel(Integer zoomLevelVisibility) { + if (zoomLevelVisibility == null) { + this.visibilityLevel = null; + } else { + this.visibilityLevel = zoomLevelVisibility + ""; + } - @Override - public void setSemanticZoomLevelVisibility(String zoomLevelVisibility) { - this.zoomLevelVisibility = zoomLevelVisibility; } } diff --git a/model/src/main/java/lcsb/mapviewer/model/map/reaction/ReactionComparator.java b/model/src/main/java/lcsb/mapviewer/model/map/reaction/ReactionComparator.java index 1feda50e2c..a4061e784e 100644 --- a/model/src/main/java/lcsb/mapviewer/model/map/reaction/ReactionComparator.java +++ b/model/src/main/java/lcsb/mapviewer/model/map/reaction/ReactionComparator.java @@ -130,10 +130,9 @@ public class ReactionComparator implements Comparator<Reaction> { logger.debug("GeneProteinReaction different: " + arg0.getGeneProteinReaction() + ", " + arg1.getGeneProteinReaction()); return stringComparator.compare(arg0.getGeneProteinReaction(), arg1.getGeneProteinReaction()); } - if (stringComparator.compare(arg0.getSemanticZoomLevelVisibility(), arg1.getSemanticZoomLevelVisibility()) != 0) { - logger.debug( - "SemanticZoomLevelVisibility different: \"" + arg0.getSemanticZoomLevelVisibility() + "\", \"" + arg1.getSemanticZoomLevelVisibility() + "\""); - return stringComparator.compare(arg0.getSemanticZoomLevelVisibility(), arg1.getSemanticZoomLevelVisibility()); + if (stringComparator.compare(arg0.getVisibilityLevel(), arg1.getVisibilityLevel()) != 0) { + logger.debug("SemanticZoomLevelVisibility different: \"" + arg0.getVisibilityLevel() + "\", \"" + arg1.getVisibilityLevel() + "\""); + return stringComparator.compare(arg0.getVisibilityLevel(), arg1.getVisibilityLevel()); } IntegerComparator integerComparator = new IntegerComparator(); diff --git a/model/src/main/java/lcsb/mapviewer/model/map/species/Element.java b/model/src/main/java/lcsb/mapviewer/model/map/species/Element.java index 01688104f1..0d419f263f 100644 --- a/model/src/main/java/lcsb/mapviewer/model/map/species/Element.java +++ b/model/src/main/java/lcsb/mapviewer/model/map/species/Element.java @@ -174,7 +174,7 @@ public abstract class Element implements BioEntity, Serializable { * @see lcsb.mapviewer.converter.graphics.AbstractImageGenerator.Params#level * AbstractImageGenerator.Params#level */ - private int visibilityLevel; + private String visibilityLevel = ""; /** * From which level element should be transparent. @@ -182,7 +182,7 @@ public abstract class Element implements BioEntity, Serializable { * @see #visibilityLevel * @see AbstractImageGenerator.Params#level */ - private int transparencyLevel; + private String transparencyLevel = ""; /** * List of search indexes that describe this element. @@ -214,11 +214,6 @@ public abstract class Element implements BioEntity, Serializable { */ private String fullName; - /** - * Zoom level visibility for semantic zooming. - */ - private String zoomLevelVisibility; - /** * Abbreviation associated with the element. */ @@ -282,7 +277,6 @@ public abstract class Element implements BioEntity, Serializable { width = original.getWidth(); height = original.getHeight(); fontSize = original.getFontSize(); - visibilityLevel = original.getVisibilityLevel(); color = original.getColor(); for (SearchIndex searchIndex : original.getSearchIndexes()) { searchIndexes.add(searchIndex.copy()); @@ -301,7 +295,8 @@ public abstract class Element implements BioEntity, Serializable { addMiriamData(original.getMiriamData()); this.abbreviation = original.getAbbreviation(); this.formula = original.getFormula(); - setSemanticZoomLevelVisibility(original.getSemanticZoomLevelVisibility()); + setVisibilityLevel(original.getVisibilityLevel()); + setTransparencyLevel(original.getTransparencyLevel()); } /** @@ -325,7 +320,6 @@ public abstract class Element implements BioEntity, Serializable { width = 0.0; height = 0.0; fontSize = DEFAULT_FONT_SIZE; - visibilityLevel = 0; color = Color.white; } @@ -661,23 +655,25 @@ public abstract class Element implements BioEntity, Serializable { this.elementId = elementId; } - /** - * @return the visibilityLevel - * @see #visibilityLevel - */ - public int getVisibilityLevel() { + @Override + public String getVisibilityLevel() { return visibilityLevel; } - /** - * @param visibilityLevel - * the visibilityLevel to set - * @see #visibilityLevel - */ - public void setVisibilityLevel(int visibilityLevel) { + @Override + public void setVisibilityLevel(String visibilityLevel) { this.visibilityLevel = visibilityLevel; } + @Override + public void setVisibilityLevel(Integer visibilityLevel) { + if (visibilityLevel == null) { + this.visibilityLevel = null; + } else { + this.visibilityLevel = visibilityLevel + ""; + } + } + /** * @return the model * @see #model @@ -755,7 +751,7 @@ public abstract class Element implements BioEntity, Serializable { * @return the transparencyLevel * @see #transparencyLevel */ - public int getTransparencyLevel() { + public String getTransparencyLevel() { return transparencyLevel; } @@ -764,7 +760,7 @@ public abstract class Element implements BioEntity, Serializable { * the transparencyLevel to set * @see #transparencyLevel */ - public void setTransparencyLevel(int transparencyLevel) { + public void setTransparencyLevel(String transparencyLevel) { this.transparencyLevel = transparencyLevel; } @@ -1092,14 +1088,4 @@ public abstract class Element implements BioEntity, Serializable { dataMining.setElement(this); } - @Override - public void setSemanticZoomLevelVisibility(String zoomLevelVisibility) { - this.zoomLevelVisibility = zoomLevelVisibility; - } - - @Override - public String getSemanticZoomLevelVisibility() { - return this.zoomLevelVisibility; - } - } \ No newline at end of file diff --git a/model/src/main/java/lcsb/mapviewer/model/map/species/ElementComparator.java b/model/src/main/java/lcsb/mapviewer/model/map/species/ElementComparator.java index 4d6d35a87a..a462b0538a 100644 --- a/model/src/main/java/lcsb/mapviewer/model/map/species/ElementComparator.java +++ b/model/src/main/java/lcsb/mapviewer/model/map/species/ElementComparator.java @@ -140,9 +140,9 @@ public class ElementComparator implements Comparator<Element> { return doubleComparator.compare(arg0.getFontSize(), arg1.getFontSize()); } - if (integerComparator.compare(arg0.getVisibilityLevel(), arg1.getVisibilityLevel()) != 0) { + if (stringComparator.compare(arg0.getVisibilityLevel(), arg1.getVisibilityLevel()) != 0) { logger.debug("Visibility level different: " + arg0.getVisibilityLevel() + ", " + arg1.getVisibilityLevel()); - return integerComparator.compare(arg0.getVisibilityLevel(), arg1.getVisibilityLevel()); + return stringComparator.compare(arg0.getVisibilityLevel(), arg1.getVisibilityLevel()); } if (integerComparator.compare(arg0.getColor().getRGB(), arg1.getColor().getRGB()) != 0) { @@ -189,12 +189,6 @@ public class ElementComparator implements Comparator<Element> { return stringComparator.compare(arg0.getFormula(), arg1.getFormula()); } - if (stringComparator.compare(arg0.getSemanticZoomLevelVisibility(), arg1.getSemanticZoomLevelVisibility()) != 0) { - logger.debug( - "SemanticZoomLevelVisibility different: \"" + arg0.getSemanticZoomLevelVisibility() + "\", \"" + arg1.getSemanticZoomLevelVisibility() + "\""); - return stringComparator.compare(arg0.getSemanticZoomLevelVisibility(), arg1.getSemanticZoomLevelVisibility()); - } - StringSetComparator stringSetComparator = new StringSetComparator(); StringListComparator stringListComparator = new StringListComparator(); diff --git a/model/src/test/java/lcsb/mapviewer/model/map/compartment/CompartmentComparatorTest.java b/model/src/test/java/lcsb/mapviewer/model/map/compartment/CompartmentComparatorTest.java index 7f4a97b6ba..3df3ef0c80 100644 --- a/model/src/test/java/lcsb/mapviewer/model/map/compartment/CompartmentComparatorTest.java +++ b/model/src/test/java/lcsb/mapviewer/model/map/compartment/CompartmentComparatorTest.java @@ -117,7 +117,7 @@ public class CompartmentComparatorTest { result.setHeight(5); result.setFontSize(9.0); result.setColor(Color.BLUE); - result.setVisibilityLevel(14); + result.setVisibilityLevel("14"); result.setThickness(998); result.setOuterWidth(45); result.setInnerWidth(65); diff --git a/model/src/test/java/lcsb/mapviewer/model/map/reaction/ReactionTest.java b/model/src/test/java/lcsb/mapviewer/model/map/reaction/ReactionTest.java index a7d39db9e7..36bbc7596e 100644 --- a/model/src/test/java/lcsb/mapviewer/model/map/reaction/ReactionTest.java +++ b/model/src/test/java/lcsb/mapviewer/model/map/reaction/ReactionTest.java @@ -229,15 +229,10 @@ public class ReactionTest extends ModelTestFunctions { public void testVisibilityLevel() { try { Reaction reaction1 = new Reaction(); - assertEquals(0, reaction1.getVisibilityLevel()); - - Reactant reactant = new Reactant(); - Element protein = new GenericProtein("id_xyz"); - protein.setVisibilityLevel(2); - reactant.setElement(protein); - reaction1.addReactant(reactant); - - assertEquals(2, reaction1.getVisibilityLevel()); + assertEquals(null, reaction1.getVisibilityLevel()); + + reaction1.setVisibilityLevel(1); + assertEquals("1", reaction1.getVisibilityLevel()); } catch (Exception e) { e.printStackTrace(); throw e; diff --git a/model/src/test/java/lcsb/mapviewer/model/map/species/ComplexComparatorTest.java b/model/src/test/java/lcsb/mapviewer/model/map/species/ComplexComparatorTest.java index 651379e21f..907dfeeef5 100644 --- a/model/src/test/java/lcsb/mapviewer/model/map/species/ComplexComparatorTest.java +++ b/model/src/test/java/lcsb/mapviewer/model/map/species/ComplexComparatorTest.java @@ -56,7 +56,7 @@ public class ComplexComparatorTest { result.setHeight(5); result.setFontSize(9.0); result.setColor(Color.BLUE); - result.setVisibilityLevel(14); + result.setVisibilityLevel("14"); Species protein = new GenericProtein("S"); protein.setName("a"); diff --git a/model/src/test/java/lcsb/mapviewer/model/map/species/ElementTest.java b/model/src/test/java/lcsb/mapviewer/model/map/species/ElementTest.java index 78ee89782a..540521afd2 100644 --- a/model/src/test/java/lcsb/mapviewer/model/map/species/ElementTest.java +++ b/model/src/test/java/lcsb/mapviewer/model/map/species/ElementTest.java @@ -145,7 +145,7 @@ public class ElementTest extends ModelTestFunctions { Set<MiriamData> miriamData = new HashSet<>(); Compartment compartment = new Compartment("idd"); int id = 72; - int transparencyLevel = 2; + String transparencyLevel = "2"; Model model = new ModelFullIndexed(modelData); List<SearchIndex> indexes = new ArrayList<>(); indexes.add(new SearchIndex()); diff --git a/persist/src/db/11/fix_db_20170628.sql b/persist/src/db/11/fix_db_20170628.sql new file mode 100644 index 0000000000..6f033cadda --- /dev/null +++ b/persist/src/db/11/fix_db_20170628.sql @@ -0,0 +1,8 @@ +-- semantic zooming +alter table element_table drop column zoomlevelvisibility ; +alter table reaction_table drop column zoomlevelvisibility ; + +ALTER TABLE element_table ALTER COLUMN visibilitylevel TYPE character varying; +ALTER TABLE element_table ALTER COLUMN transparencylevel TYPE character varying; + +alter table reaction_table add column visibilitylevel character varying default null; \ No newline at end of file diff --git a/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java b/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java index ae8fcff5f1..c502dcc853 100644 --- a/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java +++ b/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java @@ -662,10 +662,10 @@ public class ProjectService implements IProjectService { int level = Integer.valueOf(levelStr); Model output = new CopyCommand(model).execute(); for (BioEntity bioEntity : output.getAnnotatedObjects()) { - if (matcher.matchLevel(level, bioEntity.getSemanticZoomLevelVisibility())) { - bioEntity.setSemanticZoomLevelVisibility(null); + if (matcher.isVisible(level, bioEntity.getVisibilityLevel())) { + bioEntity.setVisibilityLevel("0"); } else { - bioEntity.setSemanticZoomLevelVisibility(Integer.MAX_VALUE + ""); + bioEntity.setVisibilityLevel(Integer.MAX_VALUE + ""); } } return output; diff --git a/service/src/main/java/lcsb/mapviewer/services/impl/SearchService.java b/service/src/main/java/lcsb/mapviewer/services/impl/SearchService.java index 35f74ed3cc..e489843192 100644 --- a/service/src/main/java/lcsb/mapviewer/services/impl/SearchService.java +++ b/service/src/main/java/lcsb/mapviewer/services/impl/SearchService.java @@ -18,6 +18,7 @@ import lcsb.mapviewer.common.Configuration; import lcsb.mapviewer.common.exception.InvalidArgumentException; import lcsb.mapviewer.common.exception.InvalidClassException; import lcsb.mapviewer.common.exception.InvalidStateException; +import lcsb.mapviewer.converter.graphics.bioEntity.SemanticZoomLevelMatcher; import lcsb.mapviewer.model.map.BioEntity; import lcsb.mapviewer.model.map.MiriamData; import lcsb.mapviewer.model.map.MiriamType; @@ -64,6 +65,8 @@ import lcsb.mapviewer.services.utils.SearchIndexer; @Transactional(value = "txManager") public class SearchService implements ISearchService { + private SemanticZoomLevelMatcher zoomLevelMatcher = new SemanticZoomLevelMatcher(); + /** * Prefix used in search by name interface to limit results only to species. */ @@ -447,7 +450,7 @@ public class SearchService implements ISearchService { if (params.getLevel() == null || params.getLayoutIdentfier() == null) { return true; } - return (!params.isNested()) || alias.getVisibilityLevel() <= params.getLevel(); + return (!params.isNested()) || zoomLevelMatcher.isVisible(params.getLevel(), alias.getVisibilityLevel()); } @Override diff --git a/service/src/main/java/lcsb/mapviewer/services/search/data/FullAliasView.java b/service/src/main/java/lcsb/mapviewer/services/search/data/FullAliasView.java index 10edf3b365..3fdec74966 100644 --- a/service/src/main/java/lcsb/mapviewer/services/search/data/FullAliasView.java +++ b/service/src/main/java/lcsb/mapviewer/services/search/data/FullAliasView.java @@ -147,7 +147,7 @@ public class FullAliasView extends LightAliasView implements IHeavyView { */ private Integer initialAmount = null; - private Integer visibilityLevel = null; + private String visibilityLevel = null; /** * Initial concentration of species. @@ -617,15 +617,16 @@ public class FullAliasView extends LightAliasView implements IHeavyView { * @return the visibilityLevel * @see #visibilityLevel */ - public Integer getVisibilityLevel() { + public String getVisibilityLevel() { return visibilityLevel; } /** - * @param visibilityLevel the visibilityLevel to set + * @param visibilityLevel + * the visibilityLevel to set * @see #visibilityLevel */ - public void setVisibilityLevel(Integer visibilityLevel) { + public void setVisibilityLevel(String visibilityLevel) { this.visibilityLevel = visibilityLevel; } } diff --git a/service/src/main/java/lcsb/mapviewer/services/search/data/FullReactionView.java b/service/src/main/java/lcsb/mapviewer/services/search/data/FullReactionView.java index 31dbe84374..94ed82542e 100644 --- a/service/src/main/java/lcsb/mapviewer/services/search/data/FullReactionView.java +++ b/service/src/main/java/lcsb/mapviewer/services/search/data/FullReactionView.java @@ -126,7 +126,7 @@ public class FullReactionView extends LightReactionView implements IHeavyView { */ private Map<String, Object> other = new HashMap<>(); - private Integer visibilityLevel = null; + private String visibilityLevel = null; /** * Default constructor with localization passed in the argument. @@ -426,7 +426,7 @@ public class FullReactionView extends LightReactionView implements IHeavyView { * @return the visibilityLevel * @see #visibilityLevel */ - public Integer getVisibilityLevel() { + public String getVisibilityLevel() { return visibilityLevel; } @@ -434,7 +434,7 @@ public class FullReactionView extends LightReactionView implements IHeavyView { * @param visibilityLevel the visibilityLevel to set * @see #visibilityLevel */ - public void setVisibilityLevel(Integer visibilityLevel) { + public void setVisibilityLevel(String visibilityLevel) { this.visibilityLevel = visibilityLevel; } -- GitLab