Skip to content

Commit f40e72c

Browse files
Shi QiuGMishx
authored andcommitted
feat(rest): create new endpoint for bulk delete function
Signed-off-by: Shi Qiu <shi1.qiu@toshiba.co.jp>
1 parent cb52c1a commit f40e72c

File tree

5 files changed

+119
-8
lines changed

5 files changed

+119
-8
lines changed

backend/common/src/main/java/org/eclipse/sw360/datahandler/db/BulkDeleteUtil.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,8 +173,11 @@ public BulkOperationNode deleteBulkRelease(String releaseId, User user, boolean
173173
Release referencingRelease = workReleaseMap.get(referencingReleaseId);
174174
Map<String, ReleaseRelationship> relationMap = referencingRelease.getReleaseIdToRelationship();
175175
relationMap.remove(leafReleaseId);
176-
if (!isPreview) {
177-
releaseRepository.update(referencingRelease);
176+
//Do not update the repository link if both the referencing Release and the referenced Release are externally referenced.
177+
if (!externalLinkMap.get(referencingReleaseId)) {
178+
if (!isPreview) {
179+
releaseRepository.update(referencingRelease);
180+
}
178181
}
179182
}
180183
}

backend/components/src/test/java/org/eclipse/sw360/components/db/BulkDeleteUtilTest.java

Lines changed: 69 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@
2424
import org.eclipse.sw360.datahandler.thrift.*;
2525
import org.eclipse.sw360.datahandler.thrift.components.*;
2626
import org.eclipse.sw360.datahandler.thrift.projects.Project;
27+
import org.eclipse.sw360.datahandler.thrift.projects.ProjectProjectRelationship;
28+
import org.eclipse.sw360.datahandler.thrift.projects.ProjectRelationship;
29+
import org.eclipse.sw360.datahandler.thrift.projects.ProjectType;
2730
import org.eclipse.sw360.datahandler.thrift.users.User;
2831
import org.eclipse.sw360.datahandler.thrift.users.UserGroup;
2932
import org.eclipse.sw360.datahandler.thrift.vendors.Vendor;
@@ -34,6 +37,10 @@
3437
import org.mockito.Mock;
3538
import org.mockito.junit.MockitoJUnitRunner;
3639

40+
import org.apache.logging.log4j.LogManager;
41+
import org.apache.logging.log4j.Logger;
42+
43+
import com.google.common.collect.ImmutableMap;
3744

3845
import java.io.BufferedWriter;
3946
import java.io.FileWriter;
@@ -48,6 +55,8 @@
4855
@RunWith(MockitoJUnitRunner.class)
4956
public class BulkDeleteUtilTest {
5057

58+
private static final Logger log = LogManager.getLogger(BulkDeleteUtilTest.class);
59+
5160
private static final String dbName = DatabaseSettingsTest.COUCH_DB_DATABASE;
5261
private static final String attachmentsDbName = DatabaseSettingsTest.COUCH_DB_ATTACHMENTS;
5362
private static final String changeLogsDbName = DatabaseSettingsTest.COUCH_DB_CHANGELOGS;
@@ -154,7 +163,7 @@ public void tearDown() throws Exception {
154163
@Test
155164
public void testGetAllLinkedReleaseMap() throws Exception {
156165
if (!isFeatureEnable()) {
157-
System.out.println("BulkReleaseDeletion is disabled. these test is Skipped.");
166+
log.warn("BulkReleaseDeletion is disabled. these test is Skipped.");
158167
return;
159168
}
160169

@@ -230,7 +239,7 @@ public void testGetExternalLinkMap() throws Exception {
230239
@Test
231240
public void testDeleteBulkRelease001() throws Exception {
232241
if (!isFeatureEnable()) {
233-
System.out.println("BulkReleaseDeletion is disabled. these test is Skipped.");
242+
log.warn("BulkReleaseDeletion is disabled. these test is Skipped.");
234243
return;
235244
}
236245

@@ -461,7 +470,7 @@ private void checkBulkOperationNode(BulkOperationNode node, Map<String, Object[]
461470
//@Test
462471
public void testDeleteBulkRelease002() throws Exception {
463472
if (!isFeatureEnable()) {
464-
System.out.println("BulkReleaseDeletion is disabled. these test is Skipped.");
473+
log.warn("BulkReleaseDeletion is disabled. these test is Skipped.");
465474
return;
466475
}
467476

@@ -517,10 +526,64 @@ public void testDeleteBulkRelease002() throws Exception {
517526
}
518527
}
519528

529+
@Test
530+
public void testDeleteBulkRelease_ExternalLink001() throws Exception {
531+
if (!isFeatureEnable()) {
532+
log.warn("BulkReleaseDeletion is disabled. these test is Skipped.");
533+
return;
534+
}
535+
536+
List<String> releaseIdList = new ArrayList<String>();
537+
List<String> componentIdList = new ArrayList<String>();
538+
539+
createTestRecords002(1, 2, releaseIdList, componentIdList);
540+
String rootReleaseId = releaseIdList.get(0);
541+
assertEquals(3, releaseIdList.size());
542+
assertEquals(3, componentIdList.size());
543+
544+
Project project = new Project().setId("P1").setName("project1").setVisbility(Visibility.EVERYONE).setProjectType(ProjectType.CUSTOMER);
545+
project.putToReleaseIdToUsage(rootReleaseId, new ProjectReleaseRelationship(ReleaseRelationship.CONTAINED, MainlineState.OPEN));
546+
databaseConnector.add(project);
547+
548+
BulkOperationNode level1Component = bulkDeleteUtil.deleteBulkRelease(rootReleaseId, user1, false);
549+
assertNotNull(level1Component);
550+
551+
//Check the BulkOperationNode status
552+
//Object[0] : NodeType, Object[1] : ResultState
553+
Map<String, Object[]> expectedResults = new HashMap<String, Object[]>();
554+
expectedResults.put(releaseIdList.get(0), new Object[]{BulkOperationNodeType.RELEASE, BulkOperationResultState.EXCLUDED});
555+
expectedResults.put(releaseIdList.get(1), new Object[]{BulkOperationNodeType.RELEASE, BulkOperationResultState.EXCLUDED});
556+
expectedResults.put(releaseIdList.get(2), new Object[]{BulkOperationNodeType.RELEASE, BulkOperationResultState.EXCLUDED});
557+
expectedResults.put(componentIdList.get(0), new Object[]{BulkOperationNodeType.COMPONENT, BulkOperationResultState.EXCLUDED});
558+
expectedResults.put(componentIdList.get(1), new Object[]{BulkOperationNodeType.COMPONENT, BulkOperationResultState.EXCLUDED});
559+
expectedResults.put(componentIdList.get(2), new Object[]{BulkOperationNodeType.COMPONENT, BulkOperationResultState.EXCLUDED});
560+
checkBulkOperationNode(level1Component, expectedResults);
561+
562+
//Releases to be undeleted
563+
for (String releaseId : releaseIdList) {
564+
assertTrue(this.releaseExists(releaseId));
565+
}
566+
567+
//Release links to be undeleted
568+
Release release0 = databaseConnector.get(Release.class, releaseIdList.get(0));
569+
assertEquals(1, release0.getReleaseIdToRelationshipSize());
570+
Release release1 = databaseConnector.get(Release.class, releaseIdList.get(1));
571+
assertEquals(1, release1.getReleaseIdToRelationshipSize());
572+
Release release2 = databaseConnector.get(Release.class, releaseIdList.get(2));
573+
assertEquals(0, release2.getReleaseIdToRelationshipSize());
574+
575+
//Components and links to be undeleted
576+
for (String componentId : componentIdList) {
577+
assertTrue(this.componentExists(componentId));
578+
Component component = databaseConnector.get(Component.class, componentId);
579+
assertEquals(1, component.getReleaseIdsSize());
580+
}
581+
}
582+
520583
@Test
521584
public void testDeleteBulkRelease_ConflictError001() throws Exception {
522585
if (!isFeatureEnable()) {
523-
System.out.println("BulkReleaseDeletion is disabled. these test is Skipped.");
586+
log.warn("BulkReleaseDeletion is disabled. these test is Skipped.");
524587
return;
525588
}
526589

@@ -743,7 +806,7 @@ public void checkDeletedReleaseListInLoop(int loopCount, List<Release> deletedRe
743806
@Test
744807
public void testDeleteBulkRelease_ConflictError002() throws Exception {
745808
if (!isFeatureEnable()) {
746-
System.out.println("BulkReleaseDeletion is disabled. these test is Skipped.");
809+
log.warn("BulkReleaseDeletion is disabled. these test is Skipped.");
747810
return;
748811
}
749812

@@ -931,7 +994,7 @@ public void checkDeletedReleaseListInLoop(int loopCount, List<Release> deletedRe
931994
@Test
932995
public void testDeleteBulkRelease_ConflictError003() throws Exception {
933996
if (!isFeatureEnable()) {
934-
System.out.println("BulkReleaseDeletion is disabled. these test is Skipped.");
997+
log.warn("BulkReleaseDeletion is disabled. these test is Skipped.");
935998
return;
936999
}
9371000

rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/core/JacksonCustomizations.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ public Sw360Module() {
150150
setMixInAnnotation(RestrictedResource.class, Sw360Module.RestrictedResourceMixin.class);
151151
setMixInAnnotation(RestApiToken.class, Sw360Module.RestApiTokenMixin.class);
152152
setMixInAnnotation(ProjectLink.class, Sw360Module.ProjectLinkMixin.class);
153+
setMixInAnnotation(BulkOperationNode.class, Sw360Module.BulkOperationNodeMixin.class);
153154

154155
// Make spring doc aware of the mixin(s)
155156
SpringDocUtils.getConfig()
@@ -204,6 +205,7 @@ public Sw360Module() {
204205
.replaceWithClass(RestrictedResource.class, RestrictedResourceMixin.class)
205206
.replaceWithClass(RestApiToken.class, Sw360Module.RestApiTokenMixin.class)
206207
.replaceWithClass(ProjectLink.class, ProjectLinkMixin.class)
208+
.replaceWithClass(BulkOperationNode.class, BulkOperationNodeMixin.class)
207209
.replaceWithClass(SPDXDocument.class, Sw360Module.SPDXDocumentMixin.class)
208210
.replaceWithClass(DocumentCreationInformation.class, Sw360Module.DocumentCreationInformationMixin.class)
209211
.replaceWithClass(PackageInformation.class, Sw360Module.PackageInformationMixin.class)
@@ -2606,5 +2608,22 @@ public abstract static class RestApiTokenMixin extends RestApiToken {
26062608
"setTreeLevel",
26072609
})
26082610
abstract static class ProjectLinkMixin extends ProjectLink {}
2611+
2612+
@JsonInclude(JsonInclude.Include.NON_NULL)
2613+
@JsonIgnoreProperties(value = {
2614+
"setId",
2615+
"setName",
2616+
"setVersion",
2617+
"setType",
2618+
"setParentId",
2619+
"setChildList",
2620+
"childListSize",
2621+
"childListIterator",
2622+
"setState",
2623+
"setAdditionalData",
2624+
"additionalDataSize"
2625+
})
2626+
static abstract class BulkOperationNodeMixin extends BulkOperationNode {
2627+
}
26092628
}
26102629
}

rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/release/ReleaseController.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
import org.eclipse.sw360.datahandler.thrift.spdx.documentcreationinformation.DocumentCreationInformation;
6565
import org.eclipse.sw360.datahandler.thrift.spdx.spdxdocument.SPDXDocument;
6666
import org.eclipse.sw360.datahandler.thrift.spdx.spdxpackageinfo.PackageInformation;
67+
import org.eclipse.sw360.datahandler.thrift.components.BulkOperationNode;
6768
import org.eclipse.sw360.datahandler.thrift.users.User;
6869
import org.eclipse.sw360.datahandler.thrift.vendors.Vendor;
6970
import org.eclipse.sw360.datahandler.thrift.vulnerabilities.ReleaseVulnerabilityRelation;
@@ -1747,4 +1748,24 @@ private Release setBackwardCompatibleFieldsInRelease(Map<String, Object> reqBody
17471748

17481749
return release;
17491750
}
1751+
1752+
@PreAuthorize("hasAuthority('WRITE')")
1753+
@Operation(
1754+
summary = "Bulk delete releases.",
1755+
description = "Bulk delete existing releases.",
1756+
tags = {"Releases"}
1757+
)
1758+
@DeleteMapping(value = RELEASES_URL + "/{id}/bulkDelete")
1759+
public ResponseEntity<BulkOperationNode> bulkDeleteReleases(
1760+
@Parameter(description = "The release id to be bulk-deleted.")
1761+
@PathVariable("id") String id,
1762+
@Parameter(description = "isPreview flag for bulk deletion.")
1763+
@RequestParam(value = "isPreview", defaultValue="false", required = false) boolean isPreview
1764+
) throws TException {
1765+
User user = restControllerHelper.getSw360UserFromAuthentication();
1766+
BulkOperationNode result = releaseService.deleteBulkRelease(id, user, isPreview);
1767+
1768+
return new ResponseEntity<BulkOperationNode>(result, HttpStatus.OK);
1769+
}
1770+
17501771
}

rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/release/Sw360ReleaseService.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -821,6 +821,11 @@ public RequestStatus deleteRelease(String releaseId, User sw360User) throws TExc
821821
}
822822
return deleteStatus;
823823
}
824+
825+
public BulkOperationNode deleteBulkRelease(String releaseId, User sw360User, boolean isPreview) throws TException {
826+
ComponentService.Iface sw360ComponentClient = getThriftComponentClient();
827+
return sw360ComponentClient.deleteBulkRelease(releaseId, sw360User, isPreview);
828+
}
824829

825830
public Set<Project> getProjectsByRelease(String releaseId, User sw360User) throws TException {
826831
return projectService.getProjectsByRelease(releaseId, sw360User);

0 commit comments

Comments
 (0)