Skip to content

Commit

Permalink
Fix Delete Landscape with Data Objects or Capabilities
Browse files Browse the repository at this point in the history
Fix #148
  • Loading branch information
mauvaisetroupe committed Dec 26, 2023
1 parent c6afc0f commit dc8b4c6
Show file tree
Hide file tree
Showing 8 changed files with 348 additions and 6 deletions.
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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}.
Expand Down Expand Up @@ -51,16 +57,33 @@ public class LandscapeViewService {
@Autowired
private FlowGroupRepository flowGroupRepository;

@Autowired
private CapabilityApplicationMappingRepository capabilityApplicationMappingRepository;

@Autowired
private DataObjectRepository dataObjectRepository;

/**
* Delete the landscapeView by id.
*
* @param id the id of the entity.
* @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);
Expand Down Expand Up @@ -90,6 +113,21 @@ public void delete(Long id, boolean deleteFunctionalFlow, boolean deleteFlowInte
landscapeView.removeFlows(flow);
functionalFlowRepository.save(flow);
}

// Detach all CapabilitiesMapping
Set<CapabilityApplicationMapping> landscapeCapabilitiesMappings = new HashSet<>(landscapeView.getCapabilityApplicationMappings());
for (CapabilityApplicationMapping capabilityApplicationMapping : landscapeCapabilitiesMappings) {
landscapeView.removeCapabilityApplicationMapping(capabilityApplicationMapping);
capabilityApplicationMappingRepository.save(capabilityApplicationMapping);
}

// Detach all DataObjectes
Set<DataObject> landsccapeDataObjects = new HashSet<>(landscapeView.getDataObjects());
for (DataObject dataObject : landsccapeDataObjects) {
landscapeView.removeDataObjects(dataObject);
dataObjectRepository.save(dataObject);
}

// delete landscape
landscapeViewRepository.deleteById(id);

Expand Down Expand Up @@ -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);
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -275,10 +275,19 @@ public ResponseEntity<Void> 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()))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -94,6 +104,8 @@ export default defineComponent({
deleteDatas,
deleteCoherence,
deleteFunctionalFlows,
deleteCapabilityMappings,
deleteDataObjects,
};
},
});
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,21 @@ export default class LandscapeViewService {
});
}

public delete(id: number, deleteFunctionalFlows: boolean, deleteFlowInterfaces: boolean, deleteDatas: boolean): Promise<any> {
const params = { deleteFunctionalFlows: deleteFunctionalFlows, deleteFlowInterfaces: deleteFlowInterfaces, deleteDatas: deleteDatas };
public delete(
id: number,
deleteFunctionalFlows: boolean,
deleteFlowInterfaces: boolean,
deleteDatas: boolean,
deleteCapabilityMappings: boolean,
deleteDataObjects: boolean,
): Promise<any> {
const params = {
deleteFunctionalFlows: deleteFunctionalFlows,
deleteFlowInterfaces: deleteFlowInterfaces,
deleteDatas: deleteDatas,
deleteCapabilityMappings: deleteCapabilityMappings,
deleteDataObjects: deleteDataObjects,
};
return new Promise<any>((resolve, reject) => {
axios
.delete(`${baseApiUrl}/${id}`, { params })
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,11 @@
<input type="checkbox" v-model="deleteDatas" @change="deleteCoherence()" :disabled="!deleteInterfaces" /> Delete unused Data Flows
&amp; Data Flow Items
</p>
<p><input type="checkbox" v-model="deleteCapabilityMappings" @change="deleteCoherence()" /> Delete unused Capability Mappings</p>
<p>
<input type="checkbox" v-model="deleteDataObjects" @change="deleteCoherence()" disabled /> Delete unused Data Objects (not
implemented)
</p>
</div>
<template #modal-footer>
<div>
Expand Down
Original file line number Diff line number Diff line change
@@ -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<CapabilityApplicationMapping> checkNbCapabilityMappings(int nbMappings) {
List<CapabilityApplicationMapping> applicationMappings = capabilityApplicationMappingRepository.findAll();
assertEquals(nbMappings, applicationMappings.size());
return applicationMappings;
}
}
Original file line number Diff line number Diff line change
@@ -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());
}
}
Loading

0 comments on commit dc8b4c6

Please sign in to comment.