Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(rest): endpoint to get attachmentUsages for a project. #2103

Merged
merged 1 commit into from
Nov 8, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion rest/resource-server/src/docs/asciidoc/projects.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -323,7 +323,7 @@ include::{snippets}/should_document_get_linked_projects/http-response.adoc[]
include::{snippets}/should_document_get_linked_projects/links.adoc[]


[[resources-project-get-linked-projects]]
[[resources-project-get-linked-projects-transitive]]
==== Listing linked projects (transitive)

A `GET` request will get linked projects of a single project. +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -428,6 +428,21 @@ public void addEmbeddedVendors(HalResource<Component> halComponent, Set<String>
}
}

public Release convertToEmbeddedReleaseAttachments(Release release) {
Release embeddedRelease = new Release();
embeddedRelease.setId(release.getId());
embeddedRelease.setName(release.getName());
embeddedRelease.setVersion(release.getVersion());
embeddedRelease.setAttachments(release.getAttachments());
embeddedRelease.setType(null);
return embeddedRelease;
}

public void addEmbeddedProjectAttachmentUsage(HalResource halResource, List<EntityModel<Release>> releases, List<Map<String, Object>> attachmentUsageMap) {
halResource.addEmbeddedResource("sw360:release", releases);
halResource.addEmbeddedResource("sw360:attachmentUsages", attachmentUsageMap);
}

public HalResource<Vendor> addEmbeddedVendor(String vendorFullName) {
Vendor embeddedVendor = convertToEmbeddedVendor(vendorFullName);
HalResource<Vendor> halVendor = new HalResource<>(embeddedVendor);
Expand Down Expand Up @@ -528,12 +543,10 @@ public void addEmbeddedPackage(HalResource<Package> halResource, Package pkg) {
}

public HalResource<Release> addEmbeddedReleaseLinks(Release release) {
final Release embeddedRelease = convertToEmbeddedLinkedRelease(release);
final HalResource<Release> releaseResource = new HalResource<>(embeddedRelease);
Link releaseLink = linkTo(ReleaseController.class)
.slash("api/releases/" + embeddedRelease.getId()).withSelfRel();
releaseResource.add(releaseLink);

final HalResource<Release> releaseResource = new HalResource<>(release);
Link releaseLink = linkTo(ReleaseController.class)
.slash("api/releases/" + release.getId()).withSelfRel();
releaseResource.add(releaseLink);
return releaseResource;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.google.gson.Gson;
Expand Down Expand Up @@ -410,7 +411,8 @@ public ResponseEntity licenseClearing(
})).collect(Collectors.toList());

List<EntityModel<Release>> releaseList = releases.stream().map(sw360Release -> wrapTException(() -> {
final HalResource<Release> releaseResource = restControllerHelper.addEmbeddedReleaseLinks(sw360Release);
final Release embeddedRelease = restControllerHelper.convertToEmbeddedLinkedRelease(sw360Release);
final HalResource<Release> releaseResource = restControllerHelper.addEmbeddedReleaseLinks(embeddedRelease);
return releaseResource;
})).collect(Collectors.toList());

Expand Down Expand Up @@ -461,9 +463,7 @@ public ResponseEntity<CollectionModel<EntityModel>> getLinkedProject(Pageable pa
.map(sw360Project -> wrapTException(() -> {
final Project embeddedProject = restControllerHelper.convertToEmbeddedLinkedProject(sw360Project);
final HalResource<Project> projectResource = new HalResource<>(embeddedProject);
System.out.println("before " + isTransitive);
if (isTransitive) {
System.out.println("after " + isTransitive);
projectService.addEmbeddedLinkedProject(sw360Project, sw360User, projectResource,
projectIdsInBranch);
}
Expand Down Expand Up @@ -1360,10 +1360,25 @@ public ResponseEntity<CollectionModel<EntityModel<Project>>> getUsedByProjectDet
tags = {"Projects"}
)
@RequestMapping(value = PROJECTS_URL + "/{id}/attachmentUsage", method = RequestMethod.GET)
public @ResponseBody ResponseEntity<Map<String, Object>> getAttachmentUsage(
@Parameter(description = "Project ID.")
@PathVariable("id") String id
) throws TException {
public ResponseEntity attachmentUsages(@Parameter(description = "Project ID.") @PathVariable("id") String id, HttpServletRequest request)
throws URISyntaxException, TException {

final User sw360User = restControllerHelper.getSw360UserFromAuthentication();
Project sw360Project = projectService.getProjectForUserById(id, sw360User);
boolean transitive = true;
final Set<String> releaseIds = projectService.getReleaseIds(id, sw360User, transitive);
List<Release> releases = releaseIds.stream().map(relId -> wrapTException(() -> {
final Release sw360Release = releaseService.getReleaseForUserById(relId, sw360User);
releaseService.setComponentDependentFieldsInRelease(sw360Release, sw360User);
return sw360Release;
})).collect(Collectors.toList());

List<EntityModel<Release>> releaseList = releases.stream().map(sw360Release -> wrapTException(() -> {
final Release embeddedRelease = restControllerHelper.convertToEmbeddedReleaseAttachments(sw360Release);
final HalResource<Release> releaseResource = restControllerHelper.addEmbeddedReleaseLinks(embeddedRelease);
return releaseResource;
})).collect(Collectors.toList());

List<AttachmentUsage> attachmentUsages = attachmentService.getAllAttachmentUsage(id);
String prefix = "{\"" + SW360_ATTACHMENT_USAGES + "\":[";
String serializedUsages = attachmentUsages.stream()
Expand Down Expand Up @@ -1392,12 +1407,37 @@ public ResponseEntity<CollectionModel<EntityModel<Project>>> getUsedByProjectDet
}
}

if (listOfAttachmentUsages.isEmpty()) {
attachmentUsageMap = null;
HalResource userHalResource = attachmentUsageReleases(sw360Project, sw360User, releaseList, listOfAttachmentUsages);
return new ResponseEntity<>(userHalResource, HttpStatus.OK);
}

private HalResource attachmentUsageReleases(Project sw360Project, User sw360User, List<EntityModel<Release>> releases, List<Map<String, Object>> attachmentUsageMap)
throws TException {
ObjectMapper oMapper = new ObjectMapper();
Map<String, ProjectReleaseRelationship> releaseIdToUsages = sw360Project.getReleaseIdToUsage();
Map<String, Object> projectMap = oMapper.convertValue(sw360Project, Map.class);
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("linkedProjects", (Map<String, Object>) projectMap.get("linkedProjects"));
resultMap.put("releaseIdToUsage", (Map<String, Object>) projectMap.get("releaseIdToUsage"));

Map<String, Object> releaseIdToUsage = (Map<String, Object>) resultMap.get("releaseIdToUsage");
final ImmutableSet<String> fieldsToRemove = ImmutableSet.of("setCreatedBy", "setCreatedOn", "setComment", "setReleaseRelation", "setMainlineState");
if (releaseIdToUsage != null) {
for (Map.Entry<String, Object> entry : releaseIdToUsage.entrySet()) {
Map<String, Object> originalValue = (Map<String, Object>) entry.getValue();
if (originalValue != null) {
for (String field : fieldsToRemove) {
originalValue.remove(field);
}
}
}
}
HalResource halProject = new HalResource(resultMap);

HttpStatus status = attachmentUsageMap == null ? HttpStatus.NO_CONTENT : HttpStatus.OK;
return new ResponseEntity<>(attachmentUsageMap, status);
if (releaseIdToUsages != null) {
restControllerHelper.addEmbeddedProjectAttachmentUsage(halProject, releases, attachmentUsageMap);
}
return halProject;
}

@PreAuthorize("hasAuthority('WRITE')")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -265,14 +265,12 @@ public void addEmbeddedLinkedProject(Project sw360Project, User sw360User, HalRe
projectIdsInBranch.add(sw360Project.getId());
Map<String, ProjectProjectRelationship> linkedProjects = sw360Project.getLinkedProjects();
List<String> keys = new ArrayList<>(linkedProjects.keySet());
System.out.println("keys " + keys.size());
if (keys != null) {
keys.forEach(linkedProjectId -> wrapTException(() -> {
if (projectIdsInBranch.contains(linkedProjectId)) {
return;
}
Project linkedProject = getProjectForUserById(linkedProjectId, sw360User);
System.out.println("project " + linkedProject);
Project embeddedLinkedProject = rch.convertToEmbeddedLinkedProject(linkedProject);
HalResource<Project> halLinkedProject = new HalResource<>(embeddedLinkedProject);
Link projectLink = linkTo(ProjectController.class)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -512,6 +512,7 @@ public void before() throws TException, IOException {
release.setMainlineState(MainlineState.MAINLINE);
release.setMainLicenseIds(new HashSet<>(Arrays.asList("GPL-2.0-or-later", "Apache-2.0")));
release.setOtherLicenseIds(new HashSet<>(Arrays.asList("LGPL-2.0")));
release.setAttachments(setOfAttachment);

Release release2 = new Release();
release2.setId("5578999");
Expand All @@ -531,6 +532,7 @@ public void before() throws TException, IOException {
release2.setMainlineState(MainlineState.MAINLINE);
release2.setMainLicenseIds(new HashSet<>(Arrays.asList("Apache-2.0")));
release2.setOtherLicenseIds(new HashSet<>(Arrays.asList("GPL-2.0")));
release2.setAttachments(setOfAttachment);

Release rel = new Release();
Map<String, String> releaseExternalIds = new HashMap<>();
Expand Down Expand Up @@ -737,25 +739,10 @@ public void should_document_get_attachment_usage_for_project() throws Exception
.header("Authorization", "Bearer " + accessToken).accept(MediaTypes.HAL_JSON))
.andExpect(status().isOk())
.andDo(this.documentationHandler.document(responseFields(
subsectionWithPath("sw360:attachmentUsages.[]id").description("The Id of the attachment usage"),
subsectionWithPath("sw360:attachmentUsages.[]owner")
.description("The owner of attachment usage, possible values are:"
+ Arrays.asList("projectId", "componentId", "releaseId")),
subsectionWithPath("sw360:attachmentUsages.[]attachmentContentId")
.description("The Attachment Content Id associated with the Attachment"),
subsectionWithPath("sw360:attachmentUsages.[]usedBy")
.description("The Id of project using the attachment"),
subsectionWithPath("sw360:attachmentUsages.[]usageData")
.description("The usage information of attachment, possible values are:"
+ Arrays.asList("licenseInfo", "sourcePackage", "manuallySet")),
subsectionWithPath("sw360:attachmentUsages.[]usageData.licenseInfo.excludedLicenseIds")
.description("The list of excluded License Ids."),
subsectionWithPath("sw360:attachmentUsages.[]usageData.licenseInfo.projectPath").description(
"The hierarchy of project in which attachment is used. Ex: projectId1:subProjectId1:subProjectId2"),
subsectionWithPath("sw360:attachmentUsages.[]usageData.licenseInfo.includeConcludedLicense")
.description("Value to indicate whether to include concluded license"),
fieldWithPath("sw360:attachmentUsages").description(
"An array of <<resources-project-get-attachmentusage, AttachmentUsages resources>>"))));
subsectionWithPath("releaseIdToUsage").description("The relationship between linked releases of the project"),
subsectionWithPath("linkedProjects").description("The linked projects"),
subsectionWithPath("_embedded.sw360:release").description("An array of linked releases"),
subsectionWithPath("_embedded.sw360:attachmentUsages").description("An array of project's attachment usages"))));
}

@Test
Expand Down