Skip to content

Commit

Permalink
Merge pull request #2197 from siemens/feat/PaginationForVendors
Browse files Browse the repository at this point in the history
feat(rest) : Pagination for listing vendors endpoint

Reviewed by: [email protected]
Tested by: [email protected]
  • Loading branch information
ag4ums authored Dec 1, 2023
2 parents 7b4e260 + c7c33c7 commit 71821a5
Show file tree
Hide file tree
Showing 4 changed files with 90 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import org.eclipse.sw360.datahandler.thrift.packages.Package;
import org.eclipse.sw360.datahandler.thrift.projects.Project;
import org.eclipse.sw360.datahandler.thrift.users.User;
import org.eclipse.sw360.datahandler.thrift.vendors.Vendor;
import org.eclipse.sw360.datahandler.thrift.search.SearchResult;
import org.eclipse.sw360.datahandler.thrift.vulnerabilities.VulnerabilityDTO;
import org.eclipse.sw360.datahandler.thrift.vulnerabilities.Vulnerability;
Expand All @@ -37,6 +38,7 @@ public class ResourceComparatorGenerator<T> {
private static final Map<Project._Fields, Comparator<Project>> projectMap = generateProjectMap();
private static final Map<User._Fields, Comparator<User>> userMap = generateUserMap();
private static final Map<Release._Fields, Comparator<Release>> releaseMap = generateReleaseMap();
private static final Map<Vendor._Fields, Comparator<Vendor>> vendorMap = generateVendorMap();
private static final Map<Package._Fields, Comparator<Package>> packageMap = generatePackageMap();
private static final Map<SearchResult._Fields, Comparator<SearchResult>> searchResultMap = generateSearchResultMap();
private static final Map<ChangeLogs._Fields, Comparator<ChangeLogs>> changeLogMap = generateChangeLogMap();
Expand Down Expand Up @@ -77,6 +79,13 @@ private static Map<Release._Fields, Comparator<Release>> generateReleaseMap() {
return Collections.unmodifiableMap(releaseMap);
}

private static Map<Vendor._Fields, Comparator<Vendor>> generateVendorMap() {
Map<Vendor._Fields, Comparator<Vendor>> vendorMap = new HashMap<>();
vendorMap.put(Vendor._Fields.FULLNAME, Comparator.comparing(Vendor::getFullname, Comparator.nullsFirst(String.CASE_INSENSITIVE_ORDER)));
vendorMap.put(Vendor._Fields.SHORTNAME, Comparator.comparing(Vendor::getShortname, Comparator.nullsFirst(String.CASE_INSENSITIVE_ORDER)));
return Collections.unmodifiableMap(vendorMap);
}

private static Map<Package._Fields, Comparator<Package>> generatePackageMap() {
Map<Package._Fields, Comparator<Package>> packageMap = new HashMap<>();
packageMap.put(Package._Fields.NAME, Comparator.comparing(Package::getName, Comparator.nullsFirst(String.CASE_INSENSITIVE_ORDER)));
Expand Down Expand Up @@ -137,6 +146,8 @@ public Comparator<T> generateComparator(String type) throws ResourceClassNotFoun
return (Comparator<T>)defaultUserComparator();
case SW360Constants.TYPE_RELEASE:
return (Comparator<T>)defaultReleaseComparator();
case SW360Constants.TYPE_VENDOR:
return (Comparator<T>)defaultVendorComparator();
case SW360Constants.TYPE_SEARCHRESULT:
return (Comparator<T>)defaultSearchResultComparator();
case SW360Constants.TYPE_CHANGELOG:
Expand Down Expand Up @@ -196,6 +207,15 @@ public Comparator<T> generateComparator(String type, List<String> properties) th
}
}
return generateReleaseComparatorWithFields(type, releaeFields);
case SW360Constants.TYPE_VENDOR:
List<Vendor._Fields> vendorFields = new ArrayList<>();
for(String property:properties) {
Vendor._Fields field = Vendor._Fields.findByName(property);
if (field != null) {
vendorFields.add(field);
}
}
return generateVendorComparatorWithFields(type, vendorFields);
case SW360Constants.TYPE_PACKAGE:
List<Package._Fields> packageFields = new ArrayList<>();
for (String property:properties) {
Expand Down Expand Up @@ -282,6 +302,15 @@ public Comparator<T> generateReleaseComparatorWithFields(String type, List<Relea
}
}

public Comparator<T> generateVendorComparatorWithFields(String type, List<Vendor._Fields> fields) throws ResourceClassNotFoundException {
switch (type) {
case SW360Constants.TYPE_VENDOR:
return (Comparator<T>)vendorComparator(fields);
default:
throw new ResourceClassNotFoundException("No comparator for resource class with name " + type);
}
}

public Comparator<T> generatePackageComparatorWithFields(String type, List<Package._Fields> fields) throws ResourceClassNotFoundException {
switch (type) {
case SW360Constants.TYPE_PACKAGE:
Expand Down Expand Up @@ -376,6 +405,18 @@ private Comparator<Release> releaseComparator(List<Release._Fields> fields) {
return comparator;
}

private Comparator<Vendor> vendorComparator(List<Vendor._Fields> fields) {
Comparator<Vendor> comparator = Comparator.comparing(x -> true);
for (Vendor._Fields field:fields) {
Comparator<Vendor> fieldComparator = vendorMap.get(field);
if(fieldComparator != null) {
comparator = comparator.thenComparing(fieldComparator);
}
}
comparator = comparator.thenComparing(defaultVendorComparator());
return comparator;
}

private Comparator<Package> packageComparator(List<Package._Fields> fields) {
Comparator<Package> comparator = Comparator.comparing(x -> true);
for (Package._Fields field:fields) {
Expand Down Expand Up @@ -452,6 +493,10 @@ private Comparator<Release> defaultReleaseComparator() {
return releaseMap.get(Release._Fields.NAME);
}

private Comparator<Vendor> defaultVendorComparator() {
return vendorMap.get(Vendor._Fields.FULLNAME);
}

private Comparator<SearchResult> defaultSearchResultComparator() {
return searchResultMap.get(SearchResult._Fields.NAME);
}
Expand Down
3 changes: 3 additions & 0 deletions rest/resource-server/src/docs/asciidoc/vendors.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@ The Vendors resource is used to create and list vendors.

A `GET` request will list all of the service's vendors.

===== Request parameter
include::{snippets}/should_document_get_vendors/request-parameters.adoc[]

===== Response structure
include::{snippets}/should_document_get_vendors/response-fields.adoc[]

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,15 +31,23 @@
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
import org.eclipse.sw360.datahandler.resourcelists.PaginationParameterException;
import org.eclipse.sw360.datahandler.resourcelists.PaginationResult;
import org.eclipse.sw360.datahandler.resourcelists.ResourceClassNotFoundException;
import org.eclipse.sw360.datahandler.common.SW360Constants;
import org.springframework.data.domain.Pageable;

import java.io.IOException;
import java.net.URISyntaxException;
import javax.servlet.http.HttpServletRequest;
import java.net.URI;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletResponse;

import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo;
import static org.eclipse.sw360.datahandler.common.WrappedException.wrapTException;

@BasePathAwareController
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
Expand All @@ -52,25 +60,36 @@ public class VendorController implements RepresentationModelProcessor<Repository
private final Sw360VendorService vendorService;

@NonNull
private final RestControllerHelper<?> restControllerHelper;
private final RestControllerHelper restControllerHelper;

@Operation(
summary = "List all of the service's vendors.",
description = "List all of the service's vendors.",
tags = {"Vendor"}
)
@RequestMapping(value = VENDORS_URL, method = RequestMethod.GET)
public ResponseEntity<CollectionModel<EntityModel<Vendor>>> getVendors() {
public ResponseEntity<CollectionModel<EntityModel<Vendor>>> getVendors(
Pageable pageable,
HttpServletRequest request
) throws TException, URISyntaxException, PaginationParameterException, ResourceClassNotFoundException {
List<Vendor> vendors = vendorService.getVendors();

PaginationResult<Vendor> paginationResult = restControllerHelper.createPaginationResult(request, pageable, vendors, SW360Constants.TYPE_VENDOR);
List<EntityModel<Vendor>> vendorResources = new ArrayList<>();
vendors.forEach(v -> {
for (Vendor v: paginationResult.getResources()) {
Vendor embeddedVendor = restControllerHelper.convertToEmbeddedVendor(v);
vendorResources.add(EntityModel.of(embeddedVendor));
});
}

CollectionModel<EntityModel<Vendor>> resources;
if (vendors.size() == 0) {
resources = restControllerHelper.emptyPageResource(Vendor.class, paginationResult);
} else {
resources = restControllerHelper.generatePagesResource(paginationResult, vendorResources);
}

CollectionModel<EntityModel<Vendor>> resources = CollectionModel.of(vendorResources);
return new ResponseEntity<>(resources, HttpStatus.OK);
HttpStatus status = resources == null ? HttpStatus.NO_CONTENT : HttpStatus.OK;
return new ResponseEntity<>(resources, status);
}

@Operation(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName;
import static org.springframework.restdocs.request.RequestDocumentation.requestParameters;

@RunWith(SpringJUnit4ClassRunner.class)
public class VendorSpecTest extends TestRestDocsSpecBase {
Expand Down Expand Up @@ -86,18 +88,31 @@ public void should_document_get_vendors() throws Exception {
String accessToken = TestHelper.getAccessToken(mockMvc, testUserId, testUserPassword);
mockMvc.perform(get("/api/vendors")
.header("Authorization", "Bearer " + accessToken)
.param("page", "0")
.param("page_entries", "5")
.accept(MediaTypes.HAL_JSON))
.andExpect(status().isOk())
.andDo(this.documentationHandler.document(
requestParameters(
parameterWithName("page").description("Page of vendors"),
parameterWithName("page_entries").description("Amount of vendors per page")
),
links(
linkWithRel("curies").description("Curies are used for online documentation")
linkWithRel("curies").description("Curies are used for online documentation"),
linkWithRel("first").description("Link to first page"),
linkWithRel("last").description("Link to last page")
),
responseFields(
subsectionWithPath("_embedded.sw360:vendors.[]fullName").description("The full name of the vendor"),
subsectionWithPath("_embedded.sw360:vendors.[]shortName").description("The Short Name of the vendor"),
subsectionWithPath("_embedded.sw360:vendors.[]url").description("The Url of the vendor"),
subsectionWithPath("_embedded.sw360:vendors").description("An array of <<resources-vendors, Vendors resources>>"),
subsectionWithPath("_links").description("<<resources-index-links,Links>> to other resources")
subsectionWithPath("_links").description("<<resources-index-links,Links>> to other resources"),
fieldWithPath("page").description("Additional paging information"),
fieldWithPath("page.size").description("Number of vendors per page"),
fieldWithPath("page.totalElements").description("Total number of all existing vendors"),
fieldWithPath("page.totalPages").description("Total number of pages"),
fieldWithPath("page.number").description("Number of the current page")
)));
}

Expand Down

0 comments on commit 71821a5

Please sign in to comment.