Skip to content
Open
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
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,10 @@
*/
package org.eclipse.sw360.components.summary;

import org.eclipse.sw360.datahandler.db.ReleaseRepository;
import org.eclipse.sw360.datahandler.db.VendorRepository;
import org.eclipse.sw360.datahandler.thrift.ThriftUtils;
import org.eclipse.sw360.datahandler.thrift.components.Component;
import org.eclipse.sw360.datahandler.thrift.components.Release;
import org.eclipse.sw360.datahandler.thrift.vendors.Vendor;

import java.util.List;
import java.util.Map;

import static org.eclipse.sw360.datahandler.thrift.ThriftUtils.copyField;

Expand All @@ -28,38 +23,13 @@
*/
public class ComponentSummary extends DocumentSummary<Component> {

private final ReleaseRepository releaseRepository;
private final VendorRepository vendorRepository;

public ComponentSummary() {
// Create summary without database connection
this(null, null);
}

public ComponentSummary(ReleaseRepository releaseRepository, VendorRepository vendorRepository) {
this.releaseRepository = releaseRepository;
this.vendorRepository = vendorRepository;
}

@Override
protected Component summary(SummaryType type, Component document) {

Component copy = new Component();
if (type == SummaryType.EXPORT_SUMMARY) {
List<Release> releases = releaseRepository.getReleasesFromComponentId(document.getId());
return makeExportSummary(document, releases);
throw new IllegalStateException("Export summaries must be built with preloaded releases.");
} else if (type == SummaryType.DETAILED_EXPORT_SUMMARY) {
List<Release> releases = releaseRepository.getReleasesFromComponentId(document.getId());

final Map<String, Vendor> vendorsById = ThriftUtils.getIdMap(vendorRepository.getAll());

for (Release release : releases) {
if (!release.isSetVendor() && release.isSetVendorId()) {
release.setVendor(vendorsById.get(release.getVendorId()));
}
}

return makeDetailedExportSummary(document, releases);
throw new IllegalStateException("Detailed export summaries must be built with preloaded releases.");
} else if (type == SummaryType.HOME) {
copyField(document, copy, Component._Fields.ID);
copyField(document, copy, Component._Fields.DESCRIPTION);
Expand All @@ -80,19 +50,12 @@ protected Component summary(SummaryType type, Component document) {
return copy;
}

private Component makeDetailedExportSummary(Component document, List<Release> releases) {

public Component makeDetailedExportSummary(Component document, List<Release> releases) {
document.setReleases(releases);

return document;
}

private Component makeExportSummary(Component document, List<Release> releases) {

if (releaseRepository == null) {
throw new IllegalStateException("Cannot make export summary without database connection!");
}

public Component makeExportSummary(Component document, List<Release> releases) {
Component copy = new Component();

copyField(document, copy, Component._Fields.ID);
Expand All @@ -110,8 +73,6 @@ private Component makeExportSummary(Component document, List<Release> releases)
copyField(document, copy, Component._Fields.HOMEPAGE);
copyField(document, copy, Component._Fields.EXTERNAL_IDS);



for (Release release : releases) {
Release exportRelease = new Release();
copyField(release, exportRelease, Release._Fields.NAME);
Expand All @@ -121,8 +82,5 @@ private Component makeExportSummary(Component document, List<Release> releases)
}

return copy;

}


}
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,12 @@
import org.eclipse.sw360.datahandler.common.CommonUtils;
import org.eclipse.sw360.datahandler.couchdb.SummaryAwareRepository;
import org.eclipse.sw360.datahandler.thrift.PaginationData;
import org.eclipse.sw360.datahandler.thrift.ThriftUtils;
import org.eclipse.sw360.datahandler.thrift.components.Component;
import org.eclipse.sw360.datahandler.thrift.components.ComponentSortColumn;
import org.eclipse.sw360.datahandler.thrift.components.Release;
import org.eclipse.sw360.datahandler.thrift.users.User;
import org.eclipse.sw360.datahandler.thrift.vendors.Vendor;

import com.ibm.cloud.cloudant.v1.model.DesignDocumentViewsMapReduce;
import com.ibm.cloud.cloudant.v1.model.PostViewOptions;
Expand Down Expand Up @@ -163,9 +166,20 @@ public class ComponentRepository extends SummaryAwareRepository<Component> {
"}";

private static final String COMPONENT_BY_ALL_IDX = "ComponentByAllIdx";
private final ReleaseRepository releaseRepository;
private final VendorRepository vendorRepository;
private final ComponentSummary componentSummary;

public ComponentRepository(DatabaseConnectorCloudant db, ReleaseRepository releaseRepository, VendorRepository vendorRepository) {
super(Component.class, db, new ComponentSummary(releaseRepository, vendorRepository));
this(db, releaseRepository, vendorRepository, new ComponentSummary());
}

private ComponentRepository(DatabaseConnectorCloudant db, ReleaseRepository releaseRepository,
VendorRepository vendorRepository, ComponentSummary componentSummary) {
super(Component.class, db, componentSummary);
this.releaseRepository = releaseRepository;
this.vendorRepository = vendorRepository;
this.componentSummary = componentSummary;
Map<String, DesignDocumentViewsMapReduce> views = new HashMap<>();
views.put("all", createMapReduce(ALL, null));
views.put("byCreatedOn", createMapReduce(BY_CREATED_ON, null));
Expand Down Expand Up @@ -228,12 +242,12 @@ public List<Component> getSubscribedComponents(String user) {

public List<Component> getSummaryForExport() {
final List<Component> componentList = getAll();
return makeSummaryFromFullDocs(SummaryType.EXPORT_SUMMARY, componentList);
return buildExportSummaries(componentList);
}

public List<Component> getDetailedSummaryForExport() {
final List<Component> componentList = getAll();
return makeSummaryFromFullDocs(SummaryType.DETAILED_EXPORT_SUMMARY, componentList);
return buildDetailedExportSummaries(componentList);
}

public List<Component> getComponentSummary(User user) {
Expand Down Expand Up @@ -263,7 +277,45 @@ public List<Component> searchComponentByName(String name, boolean caseSensitive)
componentIds = queryForIdsAsValueByPrefix("bynamelowercase", name);
}
final List<Component> componentList = new ArrayList<Component>(getFullDocsById(componentIds));
return makeSummaryFromFullDocs(SummaryType.EXPORT_SUMMARY, componentList);
return buildExportSummaries(componentList);
}

private List<Component> buildExportSummaries(Collection<Component> components) {
List<Component> exportSummaries = new ArrayList<>(components.size());
for (Component component : components) {
List<Release> releases = releaseRepository.getReleasesFromComponentId(component.getId());
exportSummaries.add(componentSummary.makeExportSummary(component, releases));
}
return exportSummaries;
}

private List<Component> buildDetailedExportSummaries(Collection<Component> components) {
List<Component> exportSummaries = new ArrayList<>(components.size());
for (Component component : components) {
List<Release> releases = releaseRepository.getReleasesFromComponentId(component.getId());
enrichVendors(releases);
exportSummaries.add(componentSummary.makeDetailedExportSummary(component, releases));
}
return exportSummaries;
}

private void enrichVendors(Collection<Release> releases) {
Set<String> vendorIds = new HashSet<>();
for (Release release : releases) {
if (release != null && release.isSetVendorId() && !CommonUtils.isNullEmptyOrWhitespace(release.getVendorId())) {
vendorIds.add(release.getVendorId());
}
}
if (vendorIds.isEmpty()) {
return;
}

Map<String, Vendor> vendorsById = ThriftUtils.getIdMap(vendorRepository.get(vendorIds));
for (Release release : releases) {
if (release != null && !release.isSetVendor() && release.isSetVendorId()) {
release.setVendor(vendorsById.get(release.getVendorId()));
}
}
}

public Set<Component> getUsingComponents(String releaseId) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import org.eclipse.sw360.datahandler.entitlement.ProjectModerator;
import org.eclipse.sw360.datahandler.entitlement.ReleaseModerator;
import org.eclipse.sw360.datahandler.thrift.*;
import org.eclipse.sw360.datahandler.thrift.attachments.Attachment;
import org.eclipse.sw360.datahandler.thrift.components.*;
import org.eclipse.sw360.datahandler.thrift.users.RequestedAction;
import org.eclipse.sw360.datahandler.thrift.users.User;
Expand Down Expand Up @@ -322,6 +323,67 @@ public void testGetSummaryForExport() throws Exception {
List<Component> summaryForExport = handler.getSummaryForExport();
// C4 should NOT be in the results
assertTrue(containsInAnyOrder("C1", "C2", "C3").matches(getComponentIds(summaryForExport)));

Component component = getComponent(summaryForExport, "C1");
assertNotNull(component);
assertThat(getReleaseVersions(component.getReleases()), containsInAnyOrder("releaseA", "releaseB"));
for (Release release : component.getReleases()) {
assertTrue(release.isSetName());
assertTrue(release.isSetVersion());
assertEquals("", release.getComponentId());
assertFalse(release.isSetVendor());
assertFalse(release.isSetAttachments());
}
}

@Test
public void testGetDetailedSummaryForExport() throws Exception {
DatabaseConnectorCloudant databaseConnector = new DatabaseConnectorCloudant(
DatabaseSettingsTest.getConfiguredClient(), dbName);

Release release = handler.getRelease("R1A", user1);
release.setReleaseIdToRelationship(ImmutableMap.of("R1B", ReleaseRelationship.CONTAINED));
release.setAttachments(new HashSet<>(Collections.singletonList(
new Attachment().setAttachmentContentId("ATT-1").setFilename("release-attachment.tar.gz")
)));
databaseConnector.update(release);

Component component = handler.getComponent("C1", user1);
component.setAttachments(new HashSet<>(Collections.singletonList(
new Attachment().setAttachmentContentId("COMP-1").setFilename("component-attachment.txt")
)));
databaseConnector.update(component);

List<Component> detailedSummaryForExport = handler.getComponentDetailedSummaryForExport();

Component detailedComponent = getComponent(detailedSummaryForExport, "C1");
assertNotNull(detailedComponent);
assertThat(getReleaseIds(detailedComponent.getReleases()), containsInAnyOrder("R1A", "R1B"));
assertThat(detailedComponent.getAttachments(), hasSize(1));

Release detailedRelease = getRelease(detailedComponent.getReleases(), "R1A");
assertNotNull(detailedRelease);
assertNotNull(detailedRelease.getVendor());
assertEquals("Microsoft Corporation", detailedRelease.getVendor().getFullname());
assertThat(detailedRelease.getAttachments(), hasSize(1));
assertThat(detailedRelease.getReleaseIdToRelationship(), hasEntry("R1B", ReleaseRelationship.CONTAINED));
}

@Test
public void testSearchComponentByNameForExport() throws Exception {
List<Component> searchResults = handler.searchComponentByNameForExport("component1", true);

assertTrue(containsInAnyOrder("C1").matches(getComponentIds(searchResults)));

Component component = getComponent(searchResults, "C1");
assertNotNull(component);
assertThat(getReleaseVersions(component.getReleases()), containsInAnyOrder("releaseA", "releaseB"));
for (Release release : component.getReleases()) {
assertTrue(release.isSetName());
assertTrue(release.isSetVersion());
assertEquals("", release.getComponentId());
assertFalse(release.isSetVendor());
}
}

@Test
Expand Down Expand Up @@ -1098,6 +1160,23 @@ private static boolean releasesContain(Collection<Release> releases, @NotNull St
return false;
}

private static Release getRelease(Collection<Release> releases, @NotNull String id) {
for (Release release : releases) {
if (id.equals(release.getId())) {
return release;
}
}
return null;
}

private static Collection<String> getReleaseVersions(Collection<Release> releases) {
List<String> versions = new ArrayList<>();
for (Release release : releases) {
versions.add(release.getVersion());
}
return versions;
}


@Test
public void testDuplicateComponentNotAdded() throws Exception {
Expand Down
Loading