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 8e5f863adc..8f2d46c04b 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 @@ -751,7 +751,7 @@ public Function createProjectLinkMapper(Function createLinkedProjects(Project project, + public List createLinkedProjects(Project project, Function projectLinkMapper, boolean deep, User user) { final Collection linkedProjects = SW360Utils .flattenProjectLinkTree(SW360Utils.getLinkedProjects(project, deep, new ThriftClients(), log, user)); diff --git a/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/report/SW360ReportController.java b/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/report/SW360ReportController.java index d725c67e55..076f79515d 100644 --- a/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/report/SW360ReportController.java +++ b/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/report/SW360ReportController.java @@ -56,6 +56,8 @@ public class SW360ReportController implements RepresentationModelProcessor mappedProjectLinks = projectService.createLinkedProjects(sw360Project, + projectService.filterAndSortAttachments(SW360Constants.LICENSE_INFO_ATTACHMENT_TYPES), true, sw360User); + + List attchmntUsg = attachmentService.getAttachemntUsages(id); + + Map> releaseIdToExcludedLicenses = attchmntUsg.stream() + .collect(Collectors.toMap(AttachmentUsage::getOwner, + x -> x.getUsageData().getLicenseInfo().getExcludedLicenseIds(), (li1, li2) -> li1)); + + Map usedAttachmentContentIds = attchmntUsg.stream() + .collect(Collectors.toMap(AttachmentUsage::getAttachmentContentId, attUsage -> { + if (attUsage.isSetUsageData() + && attUsage.getUsageData().getSetField().equals(UsageData._Fields.LICENSE_INFO)) { + return Boolean.valueOf(attUsage.getUsageData().getLicenseInfo().isIncludeConcludedLicense()); + } + return Boolean.FALSE; + }, (li1, li2) -> li1)); + + final Map> selectedReleaseAndAttachmentIds = new HashMap<>(); + final Map> excludedLicensesPerAttachments = new HashMap<>(); + + getSelectedAttchIdsAndExcludedLicInfo(sw360User, mappedProjectLinks, releaseIdToExcludedLicenses, + usedAttachmentContentIds, selectedReleaseAndAttachmentIds, excludedLicensesPerAttachments); + + String outputGeneratorClassNameWithVariant = generatorClassName + "::" + variant; + String fileName = ""; + if (CommonUtils.isNotNullEmptyOrWhitespace(template) + && CommonUtils.isNotNullEmptyOrWhitespace(REPORT_FILENAME_MAPPING)) { + Map orgToTemplate = Arrays.stream(REPORT_FILENAME_MAPPING.split(",")) + .collect(Collectors.toMap(k -> k.split(":")[0], v -> v.split(":")[1])); + fileName = orgToTemplate.get(template); + } + final LicenseInfoFile licenseInfoFile = licenseInfoService.getLicenseInfoFile(sw360Project, sw360User, + outputGeneratorClassNameWithVariant, selectedReleaseAndAttachmentIds, excludedLicensesPerAttachments, + externalIds, fileName); + return licenseInfoFile.bufferForGeneratedOutput(); + } + + private void getSelectedAttchIdsAndExcludedLicInfo(User sw360User, List mappedProjectLinks, + Map> releaseIdToExcludedLicenses, Map usedAttachmentContentIds, + final Map> selectedReleaseAndAttachmentIds, + final Map> excludedLicensesPerAttachments) { + mappedProjectLinks.forEach(projectLink -> wrapTException(() -> projectLink.getLinkedReleases().stream() + .filter(ReleaseLink::isSetAttachments).forEach(releaseLink -> { + String releaseLinkId = releaseLink.getId(); + Set excludedLicenseIds = releaseIdToExcludedLicenses.get(Source.releaseId(releaseLinkId)); + + if (!selectedReleaseAndAttachmentIds.containsKey(releaseLinkId)) { + selectedReleaseAndAttachmentIds.put(releaseLinkId, new HashMap<>()); + } + final List attachments = releaseLink.getAttachments(); + Release release = componentService.getReleaseById(releaseLinkId, sw360User); + for (final Attachment attachment : attachments) { + String attachemntContentId = attachment.getAttachmentContentId(); + if (usedAttachmentContentIds.containsKey(attachemntContentId)) { + boolean includeConcludedLicense = usedAttachmentContentIds.get(attachemntContentId); + List licenseInfoParsingResult = licenseInfoService + .getLicenseInfoForAttachment(release, sw360User, attachemntContentId, + includeConcludedLicense); + excludedLicensesPerAttachments.put(attachemntContentId, + getExcludedLicenses(excludedLicenseIds, licenseInfoParsingResult)); + selectedReleaseAndAttachmentIds.get(releaseLinkId).put(attachemntContentId, + includeConcludedLicense); + } + } + }))); + } + + public String getGenericLicInfoFileName(HttpServletRequest request, User sw360User) throws TException { + final String variant = request.getParameter("variant"); + final Project sw360Project = projectService.getProjectForUserById(request.getParameter("projectId"), sw360User); + final String generatorClassName = request.getParameter("generatorClassName"); + final String timestamp = SW360Utils.getCreatedOnTime().replaceAll("\\s", "_").replace(":", "_"); + final OutputFormatInfo outputFormatInfo = licenseInfoService + .getOutputFormatInfoForGeneratorClass(generatorClassName); + return String.format("%s-%s%s-%s.%s", + Strings.nullToEmpty(variant).equals("DISCLOSURE") ? "LicenseInfo" : "ProjectClearingReport", + sw360Project.getName(), + StringUtils.isBlank(sw360Project.getVersion()) ? "" : "-" + sw360Project.getVersion(), timestamp, + outputFormatInfo.getFileExtension()); + } + + private Set getExcludedLicenses(Set excludedLicenseIds, + List licenseInfoParsingResult) { + Predicate filteredLicense = licenseNameWithText -> excludedLicenseIds + .contains(licenseNameWithText.getLicenseName()); + Function> streamLicenseNameWithTexts = licenseInfo -> licenseInfo + .getLicenseNamesWithTexts().stream(); + return licenseInfoParsingResult.stream().map(LicenseInfoParsingResult::getLicenseInfo) + .flatMap(streamLicenseNameWithTexts).filter(filteredLicense).collect(Collectors.toSet()); + } } \ No newline at end of file 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 3064e6c8e9..430c3377ab 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 @@ -2060,15 +2060,17 @@ public void should_document_update_project_release_relationship() throws Excepti public void should_document_get_download_license_info() throws Exception { this.mockMvc.perform(get("/api/projects/" + project.getId()+ "/licenseinfo?generatorClassName=XhtmlGenerator&variant=DISCLOSURE&externalIds=portal-id,main-project-id") .header("Authorization", TestHelper.generateAuthHeader(testUserId, testUserPassword)) + .param("module", "licenseInfo") + .param("projectId", project.getId()) + .param("generatorClassName", "XhtmlGenerator") + .param("variant", "DISCLOSURE") + .param("externalIds", "portal-id,main-project-id") .accept("application/xhtml+xml")) .andExpect(status().isOk()) .andDo(this.documentationHandler .document(queryParameters( - parameterWithName("generatorClassName") - .description("All possible values for output generator class names are " - + Arrays.asList("DocxGenerator", "XhtmlGenerator", "TextGenerator")), - parameterWithName("variant").description("All the possible values for variants are " - + Arrays.asList(OutputFormatVariant.values())), + parameterWithName("generatorClassName").description("Projects download format. Possible values are ``"), + parameterWithName("variant").description("All the possible values for variants are ``"), parameterWithName("externalIds").description("The external Ids of the project") ))); }