Skip to content

Commit

Permalink
feat(rest): Add project export for linked packages.
Browse files Browse the repository at this point in the history
Signed-off-by: Akshit Joshi <[email protected]>
  • Loading branch information
akshitjoshii committed Mar 4, 2025
1 parent de15ed5 commit b8aa09d
Show file tree
Hide file tree
Showing 12 changed files with 335 additions and 31 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2116,38 +2116,38 @@ public ProjectData searchByType(String type, User user) {
return repository.searchByType(type, user);
}

public ByteBuffer getReportDataStream(User user, boolean extendedByReleases, String projectId) throws TException {
public ByteBuffer getReportDataStream(User user, boolean extendedByReleases, String projectId, boolean extendedByPackages) throws TException {
List<Project> projectList = null;
try {
if (!isNullOrEmpty(projectId)) {
projectList = getProjectDetailsBasedOnId(user, projectId);
}else {
projectList = getAccessibleProjectsSummary(user);
}
ProjectExporter exporter = getProjectExporterObject(projectList, user, extendedByReleases);
ProjectExporter exporter = getProjectExporterObject(projectList, user, extendedByReleases, extendedByPackages);
InputStream stream = exporter.makeExcelExport(projectList);
return ByteBuffer.wrap(IOUtils.toByteArray(stream));
}catch (IOException e) {
throw new SW360Exception(e.getMessage());
}
}

private ProjectExporter getProjectExporterObject(List<Project> documents, User user, boolean extendedByReleases) throws SW360Exception {
private ProjectExporter getProjectExporterObject(List<Project> documents, User user, boolean extendedByReleases, boolean extendedByPackages) throws SW360Exception {
ThriftClients thriftClients = new ThriftClients();
return new ProjectExporter(thriftClients.makeComponentClient(),
return extendedByPackages ? new ProjectExporter(thriftClients.makeComponentClient(), thriftClients.makePackageClient(), thriftClients.makeProjectClient(), user, documents, true) : new ProjectExporter(thriftClients.makeComponentClient(),
thriftClients.makeProjectClient(), user, documents, extendedByReleases);
}

public String getReportInEmail(User user,
boolean extendedByReleases, String projectId) throws TException {
boolean extendedByReleases, String projectId, boolean extendedByPackages) throws TException {
List<Project> projectList = null;
try {
if (!isNullOrEmpty(projectId)) {
projectList = getProjectDetailsBasedOnId(user, projectId);
}else {
projectList = getAccessibleProjectsSummary(user);
}
ProjectExporter exporter = getProjectExporterObject(projectList, user, extendedByReleases);
ProjectExporter exporter = getProjectExporterObject(projectList, user, extendedByReleases, extendedByPackages);
return exporter.makeExcelExportForProject(projectList, user);
}catch (IOException | TException e) {
throw new SW360Exception(e.getMessage());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -534,15 +534,15 @@ public ByteBuffer downloadExcel(User user, boolean extendedByReleases, String to
}

@Override
public ByteBuffer getReportDataStream(User user, boolean extendedByReleases, String projectId)
public ByteBuffer getReportDataStream(User user, boolean extendedByReleases, String projectId, boolean extendedByPackages)
throws TException {
return handler.getReportDataStream(user, extendedByReleases, projectId);
return handler.getReportDataStream(user, extendedByReleases, projectId, extendedByPackages);
}

@Override
public String getReportInEmail(User user, boolean extendedByReleases, String projectId)
public String getReportInEmail(User user, boolean extendedByReleases, String projectId, boolean extendedByPackages)
throws TException {
return handler.getReportInEmail(user, extendedByReleases, projectId);
return handler.getReportInEmail(user, extendedByReleases, projectId, extendedByPackages);
}

@Override
Expand Down
4 changes: 2 additions & 2 deletions libraries/datahandler/src/main/thrift/projects.thrift
Original file line number Diff line number Diff line change
Expand Up @@ -660,11 +660,11 @@ service ProjectService {
/*
* make excel export
*/
binary getReportDataStream(1: User user,2: bool extendedByReleases,3: string projectId) throws (1: SW360Exception exp);
binary getReportDataStream(1: User user,2: bool extendedByReleases,3: string projectId,4: bool extendedByPackages) throws (1: SW360Exception exp);
/*
* excel export - return the filepath
*/
string getReportInEmail(1: User user, 2: bool extendedByReleases, string projectId) throws (1: SW360Exception exp);
string getReportInEmail(1: User user, 2: bool extendedByReleases, string projectId,4: bool extendedByPackages) throws (1: SW360Exception exp);
/*
* download excel
*/
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
/*
* Copyright Siemens Healthineers GmBH, 2025. Part of the SW360 Portal Project.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.eclipse.sw360.exporter;

import com.google.common.collect.ImmutableList;
import org.eclipse.sw360.datahandler.thrift.packages.*;
import org.eclipse.sw360.datahandler.thrift.packages.Package;
import org.eclipse.sw360.datahandler.thrift.components.ComponentService;
import org.eclipse.sw360.datahandler.thrift.users.User;
import org.eclipse.sw360.exporter.helper.PackageHelper;
import java.util.*;
import java.util.stream.Collectors;
import static org.eclipse.sw360.datahandler.common.SW360Utils.displayNameFor;
import static org.eclipse.sw360.datahandler.thrift.packages.Package._Fields.*;
import static org.eclipse.sw360.exporter.ReleaseExporter.RELEASE_HEADERS_PROJECT_EXPORT;


public class PackageExporter extends ExcelExporter<Package, PackageHelper> {

private static final Map<String, String> nameToDisplayName;

static {
nameToDisplayName = new HashMap<>();
nameToDisplayName.put(Package._Fields.ID.getFieldName(), "package ID");
nameToDisplayName.put(Package._Fields.NAME.getFieldName(), "package name");
nameToDisplayName.put(Package._Fields.VERSION.getFieldName(), "package version");
nameToDisplayName.put(Package._Fields.DESCRIPTION.getFieldName(), "package description");
nameToDisplayName.put(Package._Fields.VENDOR.getFieldName(), "package vendor");
nameToDisplayName.put(Package._Fields.LICENSE_IDS.getFieldName(), "license IDs");
nameToDisplayName.put(Package._Fields.PACKAGE_TYPE.getFieldName(), "package type");
nameToDisplayName.put(Package._Fields.PURL.getFieldName(), "purl");
nameToDisplayName.put(Package._Fields.RELEASE.getFieldName(), "release");
}


public static final List<Package._Fields> PACKAGE_REQUIRED_FIELDS = ImmutableList.<Package._Fields>builder()
.add(ID)
.add(NAME)
.add(VERSION)
.add(PURL)
.add(PACKAGE_TYPE)
.add(RELEASE)
.build();

public static final List<Package._Fields> PACKAGE_RENDERED_FIELDS_PROJECTS = Package.metaDataMap.keySet()
.stream()
.filter(k -> PACKAGE_REQUIRED_FIELDS.contains(k))
.collect(Collectors.toList());


public PackageExporter(PackageService.Iface packageClient, User user, ComponentService.Iface cClient) {
super(new PackageHelper(packageClient, cClient, user));
}

public static final List<String> PACKAGE_HEADERS_PROJECT_EXPORT = makePackageHeadersForProjectExport();

private static List<String> makePackageHeadersForProjectExport() {
List<String> headers = new ArrayList<>();
for (Package._Fields field : PACKAGE_RENDERED_FIELDS_PROJECTS) {
addToHeadersForProjectExport(headers, field);
}
return headers;
}

private static void addToHeadersForProjectExport(List<String> headers, Package._Fields field) {
switch (field) {
case RELEASE:
headers.addAll(RELEASE_HEADERS_PROJECT_EXPORT);
break;
default:
headers.add(displayNameFor(field.getFieldName(), nameToDisplayName));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,13 @@
import org.eclipse.sw360.datahandler.thrift.SW360Exception;
import org.eclipse.sw360.datahandler.thrift.ThriftUtils;
import org.eclipse.sw360.datahandler.thrift.components.ComponentService;
import org.eclipse.sw360.datahandler.thrift.packages.PackageService;
import org.eclipse.sw360.datahandler.thrift.components.Release;
import org.eclipse.sw360.datahandler.thrift.projects.Project;
import org.eclipse.sw360.datahandler.thrift.projects.ProjectService;
import org.eclipse.sw360.datahandler.thrift.users.User;
import org.eclipse.sw360.exporter.helper.ExporterHelper;
import org.eclipse.sw360.exporter.helper.PackageHelper;
import org.eclipse.sw360.exporter.helper.ProjectHelper;
import org.eclipse.sw360.exporter.helper.ReleaseHelper;

Expand Down Expand Up @@ -98,6 +100,7 @@ public class ProjectExporter extends ExcelExporter<Project, ProjectHelper> {
.collect(Collectors.toList());

public static List<String> HEADERS_EXTENDED_BY_RELEASES = ExporterHelper.addSubheadersWithPrefixesAsNeeded(HEADERS, ReleaseExporter.RELEASE_HEADERS_PROJECT_EXPORT, "release: ");
public static List<String> HEADERS_EXTENDED_BY_PACKAGES = ExporterHelper.addSubheadersWithPrefixesAsNeeded(HEADERS, PackageExporter.PACKAGE_HEADERS_PROJECT_EXPORT, "package: ");

public ProjectExporter(ComponentService.Iface componentClient, ProjectService.Iface projectClient, User user, List<Project> projects, boolean extendedByReleases) throws SW360Exception {
super(new ProjectHelper(projectClient, user, extendedByReleases, new ReleaseHelper(componentClient, user)));
Expand All @@ -109,6 +112,11 @@ public ProjectExporter(ComponentService.Iface componentClient, ProjectService.If
super(new ProjectHelper(projectClient, user, extendedByReleases, new ReleaseHelper(componentClient, user)));
}

public ProjectExporter(ComponentService.Iface cClient,PackageService.Iface packageClient, ProjectService.Iface projectClient, User user, List<Project> projects, boolean extendedByPackages) throws SW360Exception {
super(new ProjectHelper(projectClient, user, extendedByPackages, new PackageHelper(packageClient, cClient, user), new ReleaseHelper(cClient, user)));
}


private void preloadRelatedDataFor(List<Project> projects, boolean withLinkedOfLinked, User user) throws SW360Exception {
Function<Function<Project, Map<String, ?>>, Set<String>> extractIds = mapExtractor -> projects
.stream()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ public class ReleaseExporter extends ExcelExporter<Release, ReleaseHelper> {
static {
nameToDisplayName = new HashMap<>();
nameToDisplayName.put(Release._Fields.ID.getFieldName(), "release ID");
nameToDisplayName.put(Release._Fields.VERSION.getFieldName(), "release version");
nameToDisplayName.put(Release._Fields.CPEID.getFieldName(), "CPE ID");
nameToDisplayName.put(Release._Fields.COMPONENT_ID.getFieldName(), "component ID");
nameToDisplayName.put(Release._Fields.RELEASE_DATE.getFieldName(), "release date");
Expand Down Expand Up @@ -106,7 +107,7 @@ public class ReleaseExporter extends ExcelExporter<Release, ReleaseHelper> {

public static final List<String> HEADERS_EXTENDED_BY_ADDITIONAL_DATA_PROJECT = makeHeadersForExtendedExportProject();

private static List<String> makeReleaseHeadersForProjectExport() {
public static List<String> makeReleaseHeadersForProjectExport() {
List<String> headers = new ArrayList<>();
for (Release._Fields field : RELEASE_RENDERED_FIELDS_PROJECTS) {
addToHeadersForProjectExport(headers, field);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
/*
* Copyright Siemens Healthineers GmBH, 2025. Part of the SW360 Portal Project.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*/
package org.eclipse.sw360.exporter.helper;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.thrift.TException;
import org.eclipse.sw360.datahandler.common.ThriftEnumUtils;
import org.eclipse.sw360.datahandler.thrift.SW360Exception;
import org.eclipse.sw360.datahandler.thrift.components.Release;
import org.eclipse.sw360.datahandler.thrift.packages.Package;
import org.eclipse.sw360.datahandler.thrift.packages.PackageService;
import org.eclipse.sw360.datahandler.thrift.components.ComponentService;
import org.eclipse.sw360.datahandler.thrift.users.RequestedAction;
import org.eclipse.sw360.datahandler.thrift.users.User;
import org.eclipse.sw360.exporter.ReleaseExporter;
import org.eclipse.sw360.exporter.utils.SubTable;
import static org.eclipse.sw360.datahandler.common.SW360Utils.fieldValueAsString;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import static org.eclipse.sw360.exporter.PackageExporter.*;
import static org.eclipse.sw360.exporter.ProjectExporter.HEADERS;
import static org.eclipse.sw360.exporter.ReleaseExporter.HEADERS_EXTENDED_BY_ADDITIONAL_DATA_PROJECT;
import static org.eclipse.sw360.exporter.ReleaseExporter.RELEASE_RENDERED_FIELDS_PROJECTS;

public class PackageHelper implements ExporterHelper<Package> {
private static final Logger log = LogManager.getLogger(PackageHelper.class);
private final PackageService.Iface packageClient;
private final ComponentService.Iface cClient;
private final User user;
public static final Set<String> RELEASES_LINKED_TO_PACKAGES = new HashSet<>();

public PackageHelper(PackageService.Iface packageClient, ComponentService.Iface cClient, User user) {
this.packageClient = packageClient;
this.cClient = cClient;
this.user = user;
}

public int getColumns() {
return getHeaders().size();
}

public int getColumnsProjExport() {
return getHeadersProjExport().size();
}

public List<String> getHeadersProjExport() {
return PACKAGE_HEADERS_PROJECT_EXPORT;
}

@Override
public List<String> getHeaders() {
return HEADERS;
}

@Override
public SubTable makeRows(Package document) throws SW360Exception {
List<String> row = new ArrayList<>();
for(Package._Fields renderedField : PACKAGE_RENDERED_FIELDS_PROJECTS) {
addFieldValueToRow(row, renderedField, document);
}
return new SubTable(row);
}

public SubTable makeCustomRowsForProjectExport(Package document) throws SW360Exception {
List<String> row = new ArrayList<>();
for(Package._Fields renderedField : PACKAGE_RENDERED_FIELDS_PROJECTS) {
addFieldValueToRow(row, renderedField, document);
}
return new SubTable(row);
}
private void addFieldValueToRow(List<String> row, Package._Fields field, Package document) throws SW360Exception {
switch (field) {
case ID:
row.add(document.getId());
break;
case NAME:
row.add(document.getName());
break;
case VERSION:
row.add(document.getVersion());
break;
case PURL:
row.add(document.getPurl());
break;
case PACKAGE_TYPE:
row.add(ThriftEnumUtils.enumToString(document.getPackageType()));
break;
case RELEASE:
try {
if (document.getReleaseId() == null || document.getReleaseId().isEmpty()) {
// Ensure row is filled for each header of the release
for (int i = 0; i < 18; i++) {
row.add("");
}
break;
}else{
Release release = cClient.getReleaseById(document.getReleaseId(), user);
RELEASES_LINKED_TO_PACKAGES.add(release.getId());
ReleaseHelper releaseHelper = new ReleaseHelper(cClient, user);
if (release.isSetPermissions() && release.getPermissions().get(RequestedAction.READ)) {
for (Release._Fields renderedField : RELEASE_RENDERED_FIELDS_PROJECTS) {
releaseHelper.addFieldValueToRow(row, renderedField, release, true);
}
}
}
}catch (TException e) {
log.info("Failed to fetch release for ID for package: " + document.getName(), e);
}
break;
default:
Object fieldValue = document.getFieldValue(field);
row.add(fieldValueAsString(fieldValue));
}
}

public List<Package> getPackages(Set<String> packageIds) throws SW360Exception {
try {
return packageClient.getPackageByIds(packageIds);
} catch (TException e) {
log.error("Could not fetch packages", e);
return new ArrayList<>();
}
}
}
Loading

0 comments on commit b8aa09d

Please sign in to comment.