From a20361dd713a7a21b85b41e00f90dfb14acbfa6b Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Fri, 9 Nov 2018 12:20:46 +0100
Subject: [PATCH] every dataOverlay is connected to not empty project

---
 .../lcsb/mapviewer/converter/ProjectFactory.java  |  8 ++++++++
 .../lcsb/mapviewer/model/map/layout/Layout.java   | 15 +++++++++++++++
 .../lcsb/mapviewer/model/map/model/ModelData.java |  6 ++++++
 .../model/map/model/ModelFullIndexed.java         |  3 +--
 ...20181109__data_overlay_assigned_to_project.sql |  9 +++++++++
 .../mapviewer/persist/dao/map/ModelDaoTest.java   |  4 ++--
 .../mapviewer/services/impl/LayoutService.java    |  1 +
 .../mapviewer/services/impl/ProjectService.java   |  7 ++++++-
 8 files changed, 48 insertions(+), 5 deletions(-)
 create mode 100644 persist/src/main/resources/db/migration/12.2.0~alpha.0/V12.2.0.20181109__data_overlay_assigned_to_project.sql

diff --git a/converter/src/main/java/lcsb/mapviewer/converter/ProjectFactory.java b/converter/src/main/java/lcsb/mapviewer/converter/ProjectFactory.java
index 0ea9c18fae..fe701471bb 100644
--- a/converter/src/main/java/lcsb/mapviewer/converter/ProjectFactory.java
+++ b/converter/src/main/java/lcsb/mapviewer/converter/ProjectFactory.java
@@ -13,6 +13,7 @@ import org.apache.log4j.Logger;
 import lcsb.mapviewer.converter.zip.ImageZipEntryFile;
 import lcsb.mapviewer.converter.zip.ZipEntryFile;
 import lcsb.mapviewer.model.Project;
+import lcsb.mapviewer.model.map.layout.Layout;
 import lcsb.mapviewer.model.map.model.Model;
 
 public class ProjectFactory {
@@ -42,6 +43,13 @@ public class ProjectFactory {
       models.addAll(model.getSubmodels());
 
       project.addModel(model);
+      
+      for (Model m: models) {
+        for (Layout layout: m.getLayouts()) {
+          layout.setProject(project);
+        }
+      }
+      
       ZipFile zipFile = params.getZipFile();
       Enumeration<? extends ZipEntry> entries;
 
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 1f1cedc367..b35a98c73c 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
@@ -23,6 +23,7 @@ import org.hibernate.annotations.Cascade;
 import org.hibernate.annotations.CascadeType;
 
 import lcsb.mapviewer.common.exception.NotImplementedException;
+import lcsb.mapviewer.model.Project;
 import lcsb.mapviewer.model.cache.UploadedFileEntry;
 import lcsb.mapviewer.model.map.model.Model;
 import lcsb.mapviewer.model.map.model.ModelData;
@@ -110,6 +111,12 @@ public class Layout implements Serializable {
   @ManyToOne(fetch = FetchType.LAZY)
   private ModelData model;
 
+  /**
+   * Project to which this data overlay is assigned.
+   */
+  @ManyToOne(fetch = FetchType.LAZY, optional = false)
+  private Project project;
+
   /**
    * Who created the layout.
    */
@@ -498,4 +505,12 @@ public class Layout implements Serializable {
     this.googleLicenseConsent = googleLicenseConsent;
   }
 
+  public Project getProject() {
+    return project;
+  }
+
+  public void setProject(Project project) {
+    this.project = project;
+  }
+
 }
diff --git a/model/src/main/java/lcsb/mapviewer/model/map/model/ModelData.java b/model/src/main/java/lcsb/mapviewer/model/map/model/ModelData.java
index cfccd82386..5a9c6af372 100644
--- a/model/src/main/java/lcsb/mapviewer/model/map/model/ModelData.java
+++ b/model/src/main/java/lcsb/mapviewer/model/map/model/ModelData.java
@@ -355,6 +355,9 @@ public class ModelData implements Serializable {
   public void addLayout(Layout layout) {
     layouts.add(layout);
     layout.setModel(this);
+    if (project != null) {
+      layout.setProject(project);
+    }
   }
 
   /**
@@ -704,6 +707,9 @@ public class ModelData implements Serializable {
   public void addLayout(int index, Layout layout) {
     layouts.add(index, layout);
     layout.setModel(this);
+    if (project != null) {
+      layout.setProject(project);
+    }
   }
 
   public Double getDefaultCenterX() {
diff --git a/model/src/main/java/lcsb/mapviewer/model/map/model/ModelFullIndexed.java b/model/src/main/java/lcsb/mapviewer/model/map/model/ModelFullIndexed.java
index d2fa990f16..8234d9723e 100644
--- a/model/src/main/java/lcsb/mapviewer/model/map/model/ModelFullIndexed.java
+++ b/model/src/main/java/lcsb/mapviewer/model/map/model/ModelFullIndexed.java
@@ -562,8 +562,7 @@ public class ModelFullIndexed implements Model {
 
   @Override
   public void addLayout(int index, Layout layout) {
-    this.modelData.getLayouts().add(index, layout);
-    layout.setModel(this);
+    this.modelData.addLayout(index, layout);
   }
 
   @Override
diff --git a/persist/src/main/resources/db/migration/12.2.0~alpha.0/V12.2.0.20181109__data_overlay_assigned_to_project.sql b/persist/src/main/resources/db/migration/12.2.0~alpha.0/V12.2.0.20181109__data_overlay_assigned_to_project.sql
new file mode 100644
index 0000000000..63d27d6007
--- /dev/null
+++ b/persist/src/main/resources/db/migration/12.2.0~alpha.0/V12.2.0.20181109__data_overlay_assigned_to_project.sql
@@ -0,0 +1,9 @@
+alter table layout_table add column project_id integer;
+update layout_table set project_id = (select project_id from model_data_table where model_data_table.id = layout_table.model_id);
+update layout_table child set project_id = (select project_id from model_data_table where model_data_table.id = (select model_id from layout_table parent where child.parent_layout_id = parent.id)) where child.parent_layout_id is not null;
+-- just in case we have some artifacts in database
+delete from layout_table where project_id is null;
+-- and now we can add foreign key
+ALTER TABLE layout_table ADD CONSTRAINT layout_table_project FOREIGN KEY (project_id)
+      REFERENCES public.project_table (id) MATCH SIMPLE
+      ON UPDATE NO ACTION ON DELETE NO ACTION;
diff --git a/persist/src/test/java/lcsb/mapviewer/persist/dao/map/ModelDaoTest.java b/persist/src/test/java/lcsb/mapviewer/persist/dao/map/ModelDaoTest.java
index 162f85c7ab..7be2b5e560 100644
--- a/persist/src/test/java/lcsb/mapviewer/persist/dao/map/ModelDaoTest.java
+++ b/persist/src/test/java/lcsb/mapviewer/persist/dao/map/ModelDaoTest.java
@@ -384,14 +384,14 @@ public class ModelDaoTest extends PersistTestFunctions {
   @Test
   public void testLayoutsInModel() throws Exception {
     try {
+      Project project = new Project("test_porject_id");
       Model model = createModel();
+      project.addModel(model);
 
       Layout layout = new Layout();
       layout.setDirectory("tmp");
       layout.setTitle("temporary name");
       model.addLayout(layout);
-      Project project = new Project("test_porject_id");
-      project.addModel(model);
       projectDao.add(project);
 
       modelDao.evict(model);
diff --git a/service/src/main/java/lcsb/mapviewer/services/impl/LayoutService.java b/service/src/main/java/lcsb/mapviewer/services/impl/LayoutService.java
index 5d54aa3c72..a878393e75 100644
--- a/service/src/main/java/lcsb/mapviewer/services/impl/LayoutService.java
+++ b/service/src/main/java/lcsb/mapviewer/services/impl/LayoutService.java
@@ -443,6 +443,7 @@ public class LayoutService implements ILayoutService {
       layout.setStatus(LayoutStatus.OK);
       layout.setProgress(0.0);
       connection.getSubmodel().getModel().addLayout(layout);
+      layout.setProject(params.getModel().getProject());
       layout.setCreator(params.getUser());
       layout.setPublicLayout(false);
       topLayout.addLayout(layout);
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 a00b4eeb22..5df7543f52 100644
--- a/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java
+++ b/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java
@@ -636,6 +636,7 @@ public class ProjectService implements IProjectService {
           semanticOverlay.setProgress(0.0);
           semanticOverlay.setHierarchicalView(buildInLayout.isNested());
           semanticOverlay.setHierarchyViewLevel(i);
+          semanticOverlay.setProject(topModel.getProject());
           semanticLevelOverlays.add(semanticOverlay);
           topModel.addLayout(1, semanticOverlay);
         }
@@ -648,6 +649,7 @@ public class ProjectService implements IProjectService {
         layout.setHierarchicalView(buildInLayout.isNested());
         layout.setParentLayout(topLayout);
         connection.getSubmodel().addLayout(0, layout);
+        layout.setProject(topModel.getProject());
 
         connection.getSubmodel().setZoomLevels(generator.computeZoomLevels(connection.getSubmodel().getModel()));
         connection.getSubmodel().setTileSize(MapGenerator.TILE_SIZE);
@@ -661,13 +663,16 @@ public class ProjectService implements IProjectService {
             semanticOverlay.setHierarchicalView(buildInLayout.isNested());
             semanticOverlay.setParentLayout(semanticLevelOverlays.get(i));
             semanticOverlay.setHierarchyViewLevel(i);
+            semanticOverlay.setProject(topModel.getProject());
             connection.getSubmodel().addLayout(1, semanticOverlay);
           }
         }
         submodelId++;
       }
     }
-
+    projectDao.update(project);
+    
+    
     if (params.isUpdateAnnotations()) {
       Map<Class<?>, List<ElementAnnotator>> annotators = null;
       if (params.getAnnotatorsMap() != null) {
-- 
GitLab