From e7b411f71ba638bdf37328731219f35decc0156c Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Thu, 29 Jun 2017 10:02:31 +0200
Subject: [PATCH] hierarchical overlay contain information if there is specific
 level assigned to it (if not it's considered general)

---
 .../mapviewer/model/map/layout/Layout.java    | 28 ++++++++++++++++++-
 persist/src/db/11/fix_db_20170629.sql         |  2 ++
 .../services/impl/ProjectService.java         | 11 ++++----
 3 files changed, 34 insertions(+), 7 deletions(-)
 create mode 100644 persist/src/db/11/fix_db_20170629.sql

diff --git a/model/src/main/java/lcsb/mapviewer/model/map/layout/Layout.java b/model/src/main/java/lcsb/mapviewer/model/map/layout/Layout.java
index d333ce8ea5..f919988d80 100644
--- a/model/src/main/java/lcsb/mapviewer/model/map/layout/Layout.java
+++ b/model/src/main/java/lcsb/mapviewer/model/map/layout/Layout.java
@@ -72,6 +72,13 @@ public class Layout implements Serializable {
 	 */
 	private boolean						hierarchicalView = false;
 
+	/**
+	 * If overlay contain hierarchical view then it might be fixed on some
+	 * specific level. This parameter defines the level at which it's fixed or
+	 * contains null if it's general hierarchical view.
+	 */
+	private Integer						hierarchyViewLevel;
+
 	/**
 	 * ModelData to which layout is assigend.
 	 */
@@ -107,7 +114,7 @@ public class Layout implements Serializable {
 	 */
 	@ManyToOne(fetch = FetchType.LAZY)
 	private Layout						parentLayout		 = null;
-	
+
 	/**
 	 * Short description used for this layout.
 	 */
@@ -163,6 +170,8 @@ public class Layout implements Serializable {
 		if (layout.inputData != null) {
 			this.inputData = new UploadedFileEntry(layout.getInputData());
 		}
+		this.hierarchyViewLevel = layout.hierarchyViewLevel;
+
 	}
 
 	/**
@@ -421,4 +430,21 @@ public class Layout implements Serializable {
 		this.inputData = inputData;
 	}
 
+	/**
+	 * @return the hierarchyViewLevel
+	 * @see #hierarchyViewLevel
+	 */
+	public Integer getHierarchyViewLevel() {
+		return hierarchyViewLevel;
+	}
+
+	/**
+	 * @param hierarchyViewLevel
+	 *          the hierarchyViewLevel to set
+	 * @see #hierarchyViewLevel
+	 */
+	public void setHierarchyViewLevel(Integer hierarchyViewLevel) {
+		this.hierarchyViewLevel = hierarchyViewLevel;
+	}
+
 }
diff --git a/persist/src/db/11/fix_db_20170629.sql b/persist/src/db/11/fix_db_20170629.sql
new file mode 100644
index 0000000000..4ddf369a6d
--- /dev/null
+++ b/persist/src/db/11/fix_db_20170629.sql
@@ -0,0 +1,2 @@
+-- semantic zooming
+alter table layout add column hierarchyviewlevel integer;
\ 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 6113612ced..2794c4adcc 100644
--- a/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java
+++ b/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java
@@ -647,18 +647,15 @@ public class ProjectService implements IProjectService {
 
 		MapGeneratorParams imgParams = generator.new MapGeneratorParams()
 				.directory(directory).sbgn(params.isSbgnFormat()).nested(layout.isHierarchicalView()).updater(updater);
-		if (layout.getTitle().contains(BuildInLayout.SEMANTIC.getTitle())) {
-			if (Character.isDigit(layout.getTitle().charAt(layout.getTitle().length() - 1))) {
-				output = prepareSemanticZoomModel(model, layout.getTitle().replaceAll("[^0-9.]", ""));
-			}
+		if (layout.getHierarchyViewLevel() != null) {
+			output = prepareSemanticZoomModel(model, layout.getHierarchyViewLevel());
 		}
 		imgParams.model(output);
 		generator.generateMapImages(imgParams);
 	}
 
-	private Model prepareSemanticZoomModel(final Model model, String levelStr) {
+	private Model prepareSemanticZoomModel(final Model model, int level) {
 		SemanticZoomLevelMatcher matcher = new SemanticZoomLevelMatcher();
-		int level = Integer.valueOf(levelStr);
 		Model output = new CopyCommand(model).execute();
 		for (BioEntity bioEntity : output.getBioEntities()) {
 			if (matcher.isVisible(level, bioEntity.getVisibilityLevel())) {
@@ -761,6 +758,7 @@ public class ProjectService implements IProjectService {
 					semanticOverlay.setStatus(LayoutStatus.NA);
 					semanticOverlay.setProgress(0.0);
 					semanticOverlay.setHierarchicalView(buildInLayout.isNested());
+					semanticOverlay.setHierarchyViewLevel(i);
 					semanticLevelOverlays.add(semanticOverlay);
 					model.addLayout(1, semanticOverlay);
 				}
@@ -783,6 +781,7 @@ public class ProjectService implements IProjectService {
 						semanticOverlay.setProgress(0.0);
 						semanticOverlay.setHierarchicalView(buildInLayout.isNested());
 						semanticOverlay.setParentLayout(semanticLevelOverlays.get(i));
+						semanticOverlay.setHierarchyViewLevel(i);
 						connection.getSubmodel().addLayout(1, semanticOverlay);
 					}
 				}
-- 
GitLab