diff --git a/src/main/java/com/mauvaisetroupe/eadesignit/service/LandscapeViewService.java b/src/main/java/com/mauvaisetroupe/eadesignit/service/LandscapeViewService.java
index b1831110..1577ec08 100644
--- a/src/main/java/com/mauvaisetroupe/eadesignit/service/LandscapeViewService.java
+++ b/src/main/java/com/mauvaisetroupe/eadesignit/service/LandscapeViewService.java
@@ -1,17 +1,22 @@
package com.mauvaisetroupe.eadesignit.service;
+import com.mauvaisetroupe.eadesignit.domain.CapabilityApplicationMapping;
import com.mauvaisetroupe.eadesignit.domain.DataFlow;
+import com.mauvaisetroupe.eadesignit.domain.DataObject;
import com.mauvaisetroupe.eadesignit.domain.FlowGroup;
import com.mauvaisetroupe.eadesignit.domain.FlowInterface;
import com.mauvaisetroupe.eadesignit.domain.FunctionalFlow;
import com.mauvaisetroupe.eadesignit.domain.FunctionalFlowStep;
import com.mauvaisetroupe.eadesignit.domain.LandscapeView;
+import com.mauvaisetroupe.eadesignit.repository.CapabilityApplicationMappingRepository;
import com.mauvaisetroupe.eadesignit.repository.DataFlowRepository;
+import com.mauvaisetroupe.eadesignit.repository.DataObjectRepository;
import com.mauvaisetroupe.eadesignit.repository.FlowGroupRepository;
import com.mauvaisetroupe.eadesignit.repository.FlowInterfaceRepository;
import com.mauvaisetroupe.eadesignit.repository.FunctionalFlowRepository;
import com.mauvaisetroupe.eadesignit.repository.FunctionalFlowStepRepository;
import com.mauvaisetroupe.eadesignit.repository.LandscapeViewRepository;
+import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;
@@ -20,6 +25,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.Assert;
/**
* Service Implementation for managing {@link LandscapeView}.
@@ -51,6 +57,12 @@ public class LandscapeViewService {
@Autowired
private FlowGroupRepository flowGroupRepository;
+ @Autowired
+ private CapabilityApplicationMappingRepository capabilityApplicationMappingRepository;
+
+ @Autowired
+ private DataObjectRepository dataObjectRepository;
+
/**
* Delete the landscapeView by id.
*
@@ -58,9 +70,20 @@ public class LandscapeViewService {
* @param deleteDatas
* @param deleteFlowInterface
* @param deleteFunctionalFlow
+ * @param deleteDataObjects
+ * @param deleteCapabilityMappings
*/
- public void delete(Long id, boolean deleteFunctionalFlow, boolean deleteFlowInterface, boolean deleteDatas) {
+ public void delete(
+ Long id,
+ boolean deleteFunctionalFlow,
+ boolean deleteFlowInterface,
+ boolean deleteDatas,
+ boolean deleteCapabilityMappings,
+ boolean deleteDataObjects
+ ) {
log.debug("Request to delete LandscapeView : {}", id);
+
+ Assert.isTrue(!deleteDataObjects, "Not implemented due to complexity with parents relationships");
// delete landscape and all entities without references to other landscape
LandscapeView landscapeView = landscapeViewRepository.getById(id);
@@ -90,6 +113,21 @@ public void delete(Long id, boolean deleteFunctionalFlow, boolean deleteFlowInte
landscapeView.removeFlows(flow);
functionalFlowRepository.save(flow);
}
+
+ // Detach all CapabilitiesMapping
+ Set landscapeCapabilitiesMappings = new HashSet<>(landscapeView.getCapabilityApplicationMappings());
+ for (CapabilityApplicationMapping capabilityApplicationMapping : landscapeCapabilitiesMappings) {
+ landscapeView.removeCapabilityApplicationMapping(capabilityApplicationMapping);
+ capabilityApplicationMappingRepository.save(capabilityApplicationMapping);
+ }
+
+ // Detach all DataObjectes
+ Set landsccapeDataObjects = new HashSet<>(landscapeView.getDataObjects());
+ for (DataObject dataObject : landsccapeDataObjects) {
+ landscapeView.removeDataObjects(dataObject);
+ dataObjectRepository.save(dataObject);
+ }
+
// delete landscape
landscapeViewRepository.deleteById(id);
@@ -174,5 +212,14 @@ public void delete(Long id, boolean deleteFunctionalFlow, boolean deleteFlowInte
}
}
}
+
+ // delete capabilitiesmapping not linked to another landscape
+ if (deleteCapabilityMappings) {
+ for (CapabilityApplicationMapping capabilityApplicationMapping : landscapeCapabilitiesMappings) {
+ if (capabilityApplicationMapping.getLandscapes() == null || capabilityApplicationMapping.getLandscapes().isEmpty()) {
+ capabilityApplicationMappingRepository.delete(capabilityApplicationMapping);
+ }
+ }
+ }
}
}
diff --git a/src/main/java/com/mauvaisetroupe/eadesignit/web/rest/LandscapeViewResource.java b/src/main/java/com/mauvaisetroupe/eadesignit/web/rest/LandscapeViewResource.java
index 1c94c580..a433591f 100644
--- a/src/main/java/com/mauvaisetroupe/eadesignit/web/rest/LandscapeViewResource.java
+++ b/src/main/java/com/mauvaisetroupe/eadesignit/web/rest/LandscapeViewResource.java
@@ -275,10 +275,19 @@ public ResponseEntity deleteLandscapeView(
@PathVariable Long id,
@RequestParam boolean deleteFunctionalFlows,
@RequestParam boolean deleteFlowInterfaces,
- @RequestParam boolean deleteDatas
+ @RequestParam boolean deleteDatas,
+ @RequestParam boolean deleteCapabilityMappings,
+ @RequestParam boolean deleteDataObjects
) {
log.debug("REST request to delete LandscapeView : {}, {}, {}, {}", id, deleteFunctionalFlows, deleteFlowInterfaces, deleteDatas);
- landscapeViewService.delete(id, deleteFunctionalFlows, deleteFlowInterfaces, deleteDatas);
+ landscapeViewService.delete(
+ id,
+ deleteFunctionalFlows,
+ deleteFlowInterfaces,
+ deleteDatas,
+ deleteCapabilityMappings,
+ deleteDataObjects
+ );
return ResponseEntity
.noContent()
.headers(HeaderUtil.createEntityDeletionAlert(applicationName, false, ENTITY_NAME, id.toString()))
diff --git a/src/main/webapp/app/entities/landscape-view/landscape-view.component.ts b/src/main/webapp/app/entities/landscape-view/landscape-view.component.ts
index 0ed418b5..e0418d43 100644
--- a/src/main/webapp/app/entities/landscape-view/landscape-view.component.ts
+++ b/src/main/webapp/app/entities/landscape-view/landscape-view.component.ts
@@ -24,6 +24,9 @@ export default defineComponent({
const deleteFunctionalFlows = ref(true);
const deleteInterfaces = ref(true);
const deleteDatas = ref(true);
+ const deleteCapabilityMappings = ref(false);
+ const deleteDataObjects = ref(false);
+
function deleteCoherence() {
if (!deleteFunctionalFlows.value) {
deleteInterfaces.value = false;
@@ -66,7 +69,14 @@ export default defineComponent({
};
const removeLandscapeView = async () => {
try {
- await landscapeViewService().delete(removeId.value, deleteFunctionalFlows.value, deleteInterfaces.value, deleteDatas.value);
+ await landscapeViewService().delete(
+ removeId.value,
+ deleteFunctionalFlows.value,
+ deleteInterfaces.value,
+ deleteDatas.value,
+ deleteCapabilityMappings.value,
+ deleteDataObjects.value,
+ );
const message = 'A LandscapeView is deleted with identifier ' + removeId.value;
alertService.showInfo(message, { variant: 'danger' });
removeId.value = -1;
@@ -94,6 +104,8 @@ export default defineComponent({
deleteDatas,
deleteCoherence,
deleteFunctionalFlows,
+ deleteCapabilityMappings,
+ deleteDataObjects,
};
},
});
diff --git a/src/main/webapp/app/entities/landscape-view/landscape-view.service.ts b/src/main/webapp/app/entities/landscape-view/landscape-view.service.ts
index 6742ebaa..9860b803 100644
--- a/src/main/webapp/app/entities/landscape-view/landscape-view.service.ts
+++ b/src/main/webapp/app/entities/landscape-view/landscape-view.service.ts
@@ -35,8 +35,21 @@ export default class LandscapeViewService {
});
}
- public delete(id: number, deleteFunctionalFlows: boolean, deleteFlowInterfaces: boolean, deleteDatas: boolean): Promise {
- const params = { deleteFunctionalFlows: deleteFunctionalFlows, deleteFlowInterfaces: deleteFlowInterfaces, deleteDatas: deleteDatas };
+ public delete(
+ id: number,
+ deleteFunctionalFlows: boolean,
+ deleteFlowInterfaces: boolean,
+ deleteDatas: boolean,
+ deleteCapabilityMappings: boolean,
+ deleteDataObjects: boolean,
+ ): Promise {
+ const params = {
+ deleteFunctionalFlows: deleteFunctionalFlows,
+ deleteFlowInterfaces: deleteFlowInterfaces,
+ deleteDatas: deleteDatas,
+ deleteCapabilityMappings: deleteCapabilityMappings,
+ deleteDataObjects: deleteDataObjects,
+ };
return new Promise((resolve, reject) => {
axios
.delete(`${baseApiUrl}/${id}`, { params })
diff --git a/src/main/webapp/app/entities/landscape-view/landscape-view.vue b/src/main/webapp/app/entities/landscape-view/landscape-view.vue
index 177b38e7..9870217b 100644
--- a/src/main/webapp/app/entities/landscape-view/landscape-view.vue
+++ b/src/main/webapp/app/entities/landscape-view/landscape-view.vue
@@ -103,6 +103,11 @@
Delete unused Data Flows
& Data Flow Items
+ Delete unused Capability Mappings
+
+ Delete unused Data Objects (not
+ implemented)
+
diff --git a/src/test/java/com/mauvaisetroupe/eadesignit/service/importfile/DeleteLandscapeWithCapa.java b/src/test/java/com/mauvaisetroupe/eadesignit/service/importfile/DeleteLandscapeWithCapa.java
new file mode 100644
index 00000000..7ce9bafa
--- /dev/null
+++ b/src/test/java/com/mauvaisetroupe/eadesignit/service/importfile/DeleteLandscapeWithCapa.java
@@ -0,0 +1,90 @@
+package com.mauvaisetroupe.eadesignit.service.importfile;
+
+import static org.junit.Assert.assertNull;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import com.mauvaisetroupe.eadesignit.domain.CapabilityApplicationMapping;
+import com.mauvaisetroupe.eadesignit.domain.LandscapeView;
+import com.mauvaisetroupe.eadesignit.repository.ApplicationRepository;
+import com.mauvaisetroupe.eadesignit.repository.CapabilityApplicationMappingRepository;
+import com.mauvaisetroupe.eadesignit.repository.DataObjectRepository;
+import com.mauvaisetroupe.eadesignit.repository.FunctionalFlowRepository;
+import com.mauvaisetroupe.eadesignit.repository.LandscapeViewRepository;
+import java.io.IOException;
+import java.util.List;
+import org.apache.poi.EncryptedDocumentException;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+@SpringBootTest
+public class DeleteLandscapeWithCapa {
+
+ @Autowired
+ Mockservice mockservice;
+
+ @Autowired
+ LandscapeViewRepository landscapeViewRepository;
+
+ @Autowired
+ ApplicationRepository applicationRepository;
+
+ @Autowired
+ FunctionalFlowRepository functionalFlowRepository;
+
+ @Autowired
+ CapabilityApplicationMappingRepository capabilityApplicationMappingRepository;
+
+ @Autowired
+ DataObjectRepository dataObjectRepository;
+
+ @Autowired
+ JdbcTemplate jdbcTemplate;
+
+ @Test
+ @Transactional(propagation = Propagation.NOT_SUPPORTED)
+ void testDeleteLandscapeWithCapabilities() throws EncryptedDocumentException, IOException {
+ assertEquals(0, applicationRepository.findAll().size());
+ assertEquals(0, landscapeViewRepository.findAll().size());
+ assertEquals(0, functionalFlowRepository.findAll().size());
+
+ // Create Landscape, load Capabilities
+ mockservice.createLandscape();
+ mockservice.createCapailitiesAndMapping("CPB.01");
+
+ checkNbCapabilityMappings(9);
+
+ LandscapeView flw01 = landscapeViewRepository.findByDiagramNameIgnoreCase("Invest Landscape");
+ mockservice.deleteLandscape(flw01.getId());
+
+ checkNbCapabilityMappings(0);
+
+ flw01 = landscapeViewRepository.findByDiagramNameIgnoreCase("Invest Landscape");
+ assertNull(flw01);
+
+ mockservice.createLandscape();
+ mockservice.createCapailitiesAndMapping("CPB.01");
+ mockservice.createCapailitiesAndMapping("CPB.02");
+ checkNbCapabilityMappings(10);
+
+ flw01 = landscapeViewRepository.findByDiagramNameIgnoreCase("Invest Landscape");
+ mockservice.deleteLandscape(flw01.getId());
+
+ checkNbCapabilityMappings(2);
+ }
+
+ protected void checkLandscapeMapping(String landscapeName, int expectedCapabilityMappingNb) {
+ LandscapeView flw01 = landscapeViewRepository.findByDiagramNameIgnoreCase(landscapeName);
+ landscapeViewRepository.save(flw01);
+ assertEquals(expectedCapabilityMappingNb, flw01.getCapabilityApplicationMappings().size());
+ }
+
+ protected List checkNbCapabilityMappings(int nbMappings) {
+ List applicationMappings = capabilityApplicationMappingRepository.findAll();
+ assertEquals(nbMappings, applicationMappings.size());
+ return applicationMappings;
+ }
+}
diff --git a/src/test/java/com/mauvaisetroupe/eadesignit/service/importfile/DeleteLandscapeWithDatObjects.java b/src/test/java/com/mauvaisetroupe/eadesignit/service/importfile/DeleteLandscapeWithDatObjects.java
new file mode 100644
index 00000000..7d8931e4
--- /dev/null
+++ b/src/test/java/com/mauvaisetroupe/eadesignit/service/importfile/DeleteLandscapeWithDatObjects.java
@@ -0,0 +1,75 @@
+package com.mauvaisetroupe.eadesignit.service.importfile;
+
+import static org.junit.Assert.assertNull;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import com.mauvaisetroupe.eadesignit.domain.LandscapeView;
+import com.mauvaisetroupe.eadesignit.repository.ApplicationRepository;
+import com.mauvaisetroupe.eadesignit.repository.CapabilityApplicationMappingRepository;
+import com.mauvaisetroupe.eadesignit.repository.DataObjectRepository;
+import com.mauvaisetroupe.eadesignit.repository.FunctionalFlowRepository;
+import com.mauvaisetroupe.eadesignit.repository.LandscapeViewRepository;
+import java.io.IOException;
+import org.apache.poi.EncryptedDocumentException;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+@SpringBootTest
+public class DeleteLandscapeWithDatObjects {
+
+ @Autowired
+ Mockservice mockservice;
+
+ @Autowired
+ LandscapeViewRepository landscapeViewRepository;
+
+ @Autowired
+ ApplicationRepository applicationRepository;
+
+ @Autowired
+ FunctionalFlowRepository functionalFlowRepository;
+
+ @Autowired
+ CapabilityApplicationMappingRepository capabilityApplicationMappingRepository;
+
+ @Autowired
+ DataObjectRepository dataObjectRepository;
+
+ @Autowired
+ JdbcTemplate jdbcTemplate;
+
+ @Test
+ @Transactional(propagation = Propagation.NOT_SUPPORTED)
+ void testDeleteLandscapeWithDataObject() throws EncryptedDocumentException, IOException {
+ assertEquals(0, landscapeViewRepository.findAll().size());
+ assertEquals(0, functionalFlowRepository.findAll().size());
+
+ // Create Landscape, load Capabilities
+ mockservice.createLandscape();
+ mockservice.createDataObjects();
+
+ mockservice.checkNBDataObjects("Invest Landscape", 6);
+ checkNbDataObjects(11);
+
+ LandscapeView flw01 = landscapeViewRepository.findByDiagramNameIgnoreCase("Invest Landscape");
+ mockservice.deleteLandscape(flw01.getId());
+
+ flw01 = landscapeViewRepository.findByDiagramNameIgnoreCase("Invest Landscape");
+ assertNull(flw01);
+ //DataObjects not deleted when deleting Landscape due to parent relationship complexity
+ checkNbDataObjects(11);
+
+ mockservice.createLandscape();
+ mockservice.createDataObjects();
+
+ checkNbDataObjects(11);
+ }
+
+ protected void checkNbDataObjects(int expected) {
+ assertEquals(expected, dataObjectRepository.findAll().size());
+ }
+}
diff --git a/src/test/java/com/mauvaisetroupe/eadesignit/service/importfile/Mockservice.java b/src/test/java/com/mauvaisetroupe/eadesignit/service/importfile/Mockservice.java
new file mode 100644
index 00000000..4a322bf9
--- /dev/null
+++ b/src/test/java/com/mauvaisetroupe/eadesignit/service/importfile/Mockservice.java
@@ -0,0 +1,91 @@
+package com.mauvaisetroupe.eadesignit.service.importfile;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import com.mauvaisetroupe.eadesignit.domain.LandscapeView;
+import com.mauvaisetroupe.eadesignit.repository.LandscapeViewRepository;
+import com.mauvaisetroupe.eadesignit.service.LandscapeViewService;
+import com.mauvaisetroupe.eadesignit.service.importfile.dto.CapabilityImportAnalysisDTO;
+import java.io.IOException;
+import java.io.InputStream;
+import org.apache.poi.EncryptedDocumentException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+@Service
+@Transactional
+public class Mockservice {
+
+ @Autowired
+ ApplicationImportService applicationImportService;
+
+ @Autowired
+ FlowImportService flowImportService;
+
+ @Autowired
+ CapabilityImportService capabilityImportService;
+
+ @Autowired
+ ApplicationCapabilityImportService applicationCapabilityImportService;
+
+ @Autowired
+ DataObjectImportService dataObjectImportService;
+
+ @Autowired
+ LandscapeViewService landscapeViewService;
+
+ @Autowired
+ LandscapeViewRepository landscapeViewRepository;
+
+ String filename = "/junit/05-import-multi-flows-with-capas-and-dataobjects.xlsx";
+
+ public void createLandscape() throws EncryptedDocumentException, IOException {
+ /////////////////////
+ // Import APPLICATION
+ /////////////////////
+ InputStream file = this.getClass().getResourceAsStream(filename);
+ applicationImportService.importExcel(file, "WE.DONT.CARE.NOT.USED");
+
+ ///////////////////////////
+ // Import FLW.01, ... FLW.04
+ ///////////////////////////
+
+ file = this.getClass().getResourceAsStream(filename);
+ flowImportService.importExcelWithMultiFLWSheets(file, "FLW.01");
+ file = this.getClass().getResourceAsStream(filename);
+ flowImportService.importExcelWithMultiFLWSheets(file, "FLW.02");
+ file = this.getClass().getResourceAsStream(filename);
+ flowImportService.importExcelWithMultiFLWSheets(file, "FLW.03");
+ file = this.getClass().getResourceAsStream(filename);
+ flowImportService.importExcelWithMultiFLWSheets(file, "FLW.04");
+ }
+
+ public void createCapailitiesAndMapping(String sheet) throws EncryptedDocumentException, IOException {
+ InputStream file = this.getClass().getResourceAsStream(filename);
+ CapabilityImportAnalysisDTO analysisDTO = capabilityImportService.analyzeExcel(file);
+ capabilityImportService.confirmImport(analysisDTO);
+
+ file = this.getClass().getResourceAsStream(filename);
+ applicationCapabilityImportService.importExcel(file, sheet);
+ }
+
+ public void createDataObject() throws IOException {
+ InputStream file = this.getClass().getResourceAsStream(filename);
+ dataObjectImportService.importExcel(file);
+ }
+
+ public void deleteLandscape(Long id) {
+ landscapeViewService.delete(id, true, true, true, true, false);
+ }
+
+ public void createDataObjects() throws IOException {
+ InputStream file = this.getClass().getResourceAsStream(filename);
+ dataObjectImportService.importExcel(file);
+ }
+
+ protected void checkNBDataObjects(String landscapeName, int nbDataObjectExpected) {
+ LandscapeView flw01 = landscapeViewRepository.findByDiagramNameIgnoreCase(landscapeName);
+ assertEquals(nbDataObjectExpected, flw01.getDataObjects().size());
+ }
+}