diff --git a/rest/resource-server/src/docs/asciidoc/projects.adoc b/rest/resource-server/src/docs/asciidoc/projects.adoc index 891f9f7111..2d18b8252e 100644 --- a/rest/resource-server/src/docs/asciidoc/projects.adoc +++ b/rest/resource-server/src/docs/asciidoc/projects.adoc @@ -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. + diff --git a/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/core/RestControllerHelper.java b/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/core/RestControllerHelper.java index ad60e3a580..ff4e4c8410 100644 --- a/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/core/RestControllerHelper.java +++ b/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/core/RestControllerHelper.java @@ -428,6 +428,21 @@ public void addEmbeddedVendors(HalResource halComponent, Set } } + 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> releases, List> attachmentUsageMap) { + halResource.addEmbeddedResource("sw360:release", releases); + halResource.addEmbeddedResource("sw360:attachmentUsages", attachmentUsageMap); + } + public HalResource addEmbeddedVendor(String vendorFullName) { Vendor embeddedVendor = convertToEmbeddedVendor(vendorFullName); HalResource halVendor = new HalResource<>(embeddedVendor); @@ -528,12 +543,10 @@ public void addEmbeddedPackage(HalResource halResource, Package pkg) { } public HalResource addEmbeddedReleaseLinks(Release release) { - final Release embeddedRelease = convertToEmbeddedLinkedRelease(release); - final HalResource releaseResource = new HalResource<>(embeddedRelease); - Link releaseLink = linkTo(ReleaseController.class) - .slash("api/releases/" + embeddedRelease.getId()).withSelfRel(); - releaseResource.add(releaseLink); - + final HalResource releaseResource = new HalResource<>(release); + Link releaseLink = linkTo(ReleaseController.class) + .slash("api/releases/" + release.getId()).withSelfRel(); + releaseResource.add(releaseLink); return releaseResource; } diff --git a/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/project/ProjectController.java b/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/project/ProjectController.java index 57b91446fb..42a93a23b5 100644 --- a/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/project/ProjectController.java +++ b/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/project/ProjectController.java @@ -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; @@ -410,7 +411,8 @@ public ResponseEntity licenseClearing( })).collect(Collectors.toList()); List> releaseList = releases.stream().map(sw360Release -> wrapTException(() -> { - final HalResource releaseResource = restControllerHelper.addEmbeddedReleaseLinks(sw360Release); + final Release embeddedRelease = restControllerHelper.convertToEmbeddedLinkedRelease(sw360Release); + final HalResource releaseResource = restControllerHelper.addEmbeddedReleaseLinks(embeddedRelease); return releaseResource; })).collect(Collectors.toList()); @@ -461,9 +463,7 @@ public ResponseEntity> getLinkedProject(Pageable pa .map(sw360Project -> wrapTException(() -> { final Project embeddedProject = restControllerHelper.convertToEmbeddedLinkedProject(sw360Project); final HalResource projectResource = new HalResource<>(embeddedProject); - System.out.println("before " + isTransitive); if (isTransitive) { - System.out.println("after " + isTransitive); projectService.addEmbeddedLinkedProject(sw360Project, sw360User, projectResource, projectIdsInBranch); } @@ -1360,10 +1360,25 @@ public ResponseEntity>> getUsedByProjectDet tags = {"Projects"} ) @RequestMapping(value = PROJECTS_URL + "/{id}/attachmentUsage", method = RequestMethod.GET) - public @ResponseBody ResponseEntity> 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 releaseIds = projectService.getReleaseIds(id, sw360User, transitive); + List releases = releaseIds.stream().map(relId -> wrapTException(() -> { + final Release sw360Release = releaseService.getReleaseForUserById(relId, sw360User); + releaseService.setComponentDependentFieldsInRelease(sw360Release, sw360User); + return sw360Release; + })).collect(Collectors.toList()); + + List> releaseList = releases.stream().map(sw360Release -> wrapTException(() -> { + final Release embeddedRelease = restControllerHelper.convertToEmbeddedReleaseAttachments(sw360Release); + final HalResource releaseResource = restControllerHelper.addEmbeddedReleaseLinks(embeddedRelease); + return releaseResource; + })).collect(Collectors.toList()); + List attachmentUsages = attachmentService.getAllAttachmentUsage(id); String prefix = "{\"" + SW360_ATTACHMENT_USAGES + "\":["; String serializedUsages = attachmentUsages.stream() @@ -1392,12 +1407,37 @@ public ResponseEntity>> 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> releases, List> attachmentUsageMap) + throws TException { + ObjectMapper oMapper = new ObjectMapper(); + Map releaseIdToUsages = sw360Project.getReleaseIdToUsage(); + Map projectMap = oMapper.convertValue(sw360Project, Map.class); + Map resultMap = new HashMap<>(); + resultMap.put("linkedProjects", (Map) projectMap.get("linkedProjects")); + resultMap.put("releaseIdToUsage", (Map) projectMap.get("releaseIdToUsage")); + + Map releaseIdToUsage = (Map) resultMap.get("releaseIdToUsage"); + final ImmutableSet fieldsToRemove = ImmutableSet.of("setCreatedBy", "setCreatedOn", "setComment", "setReleaseRelation", "setMainlineState"); + if (releaseIdToUsage != null) { + for (Map.Entry entry : releaseIdToUsage.entrySet()) { + Map originalValue = (Map) 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')") diff --git a/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/project/Sw360ProjectService.java b/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/project/Sw360ProjectService.java index e235e41bc4..8daad84036 100644 --- a/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/project/Sw360ProjectService.java +++ b/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/project/Sw360ProjectService.java @@ -265,14 +265,12 @@ public void addEmbeddedLinkedProject(Project sw360Project, User sw360User, HalRe projectIdsInBranch.add(sw360Project.getId()); Map linkedProjects = sw360Project.getLinkedProjects(); List 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 halLinkedProject = new HalResource<>(embeddedLinkedProject); Link projectLink = linkTo(ProjectController.class) diff --git a/rest/resource-server/src/test/java/org/eclipse/sw360/rest/resourceserver/restdocs/ProjectSpecTest.java b/rest/resource-server/src/test/java/org/eclipse/sw360/rest/resourceserver/restdocs/ProjectSpecTest.java index 8195092a32..18da4f8566 100644 --- a/rest/resource-server/src/test/java/org/eclipse/sw360/rest/resourceserver/restdocs/ProjectSpecTest.java +++ b/rest/resource-server/src/test/java/org/eclipse/sw360/rest/resourceserver/restdocs/ProjectSpecTest.java @@ -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"); @@ -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 releaseExternalIds = new HashMap<>(); @@ -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 <>")))); + 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