diff --git a/backend/src-common/src/main/java/org/eclipse/sw360/datahandler/db/PackageDatabaseHandler.java b/backend/src-common/src/main/java/org/eclipse/sw360/datahandler/db/PackageDatabaseHandler.java index de44f7ead8..56318d6214 100644 --- a/backend/src-common/src/main/java/org/eclipse/sw360/datahandler/db/PackageDatabaseHandler.java +++ b/backend/src-common/src/main/java/org/eclipse/sw360/datahandler/db/PackageDatabaseHandler.java @@ -208,7 +208,8 @@ public AddDocumentRequestSummary addPackage(Package pkg, User user) throws SW360 if (duplicatePackagesByPurl.size() > 0) { final AddDocumentRequestSummary addDocumentRequestSummary = new AddDocumentRequestSummary() - .setRequestStatus(AddDocumentRequestStatus.DUPLICATE); + .setRequestStatus(AddDocumentRequestStatus.DUPLICATE) + .setMessage(SW360Constants.DUPLICATE_PACKAGE_BY_PURL); if(duplicatePackagesByPurl.size() == 1){ addDocumentRequestSummary.setId(duplicatePackagesByPurl.get(0).getId()); } diff --git a/backend/src-common/src/main/java/org/eclipse/sw360/datahandler/db/ProjectDatabaseHandler.java b/backend/src-common/src/main/java/org/eclipse/sw360/datahandler/db/ProjectDatabaseHandler.java index ebec5ee1c5..0628df054b 100644 --- a/backend/src-common/src/main/java/org/eclipse/sw360/datahandler/db/ProjectDatabaseHandler.java +++ b/backend/src-common/src/main/java/org/eclipse/sw360/datahandler/db/ProjectDatabaseHandler.java @@ -805,7 +805,9 @@ private boolean isLinkedReleasesUpdateFromLinkedPackagesFailed(Project updatedPr PackageService.Iface packageClient = new ThriftClients().makePackageClient(); List removedPackages = packageClient.getPackageWithReleaseByPackageIds(unlinkedPacakgeIds); - Map> releaseIdToPackageIdsMap = removedPackages.stream().map(Package::getRelease) + Map> releaseIdToPackageIdsMap = removedPackages.stream() + .filter(packageFilter -> packageFilter.getRelease() != null) + .map(Package::getRelease) .filter(rel -> CommonUtils.isNotEmpty(rel.getPackageIds())) .map(rel -> new AbstractMap.SimpleEntry<>(rel.getId(), rel.getPackageIds())) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (oldVal, newVal) -> newVal)); diff --git a/libraries/datahandler/src/main/java/org/eclipse/sw360/datahandler/common/SW360Constants.java b/libraries/datahandler/src/main/java/org/eclipse/sw360/datahandler/common/SW360Constants.java index 0c53a98e54..707face8ad 100644 --- a/libraries/datahandler/src/main/java/org/eclipse/sw360/datahandler/common/SW360Constants.java +++ b/libraries/datahandler/src/main/java/org/eclipse/sw360/datahandler/common/SW360Constants.java @@ -55,6 +55,7 @@ public class SW360Constants { public static final String NULL_STRING = "null"; public static final String PACKAGE_URL = "package-url"; public static final String PURL_ID = "purl.id"; + public static final String DUPLICATE_PACKAGE_BY_PURL = "duplicatePackagesByPurl"; public static final String XML_FILE_EXTENSION = "xml"; public static final String JSON_FILE_EXTENSION = "json"; public static final String PROJECT_IDS = "projectIds"; diff --git a/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/packages/SW360PackageService.java b/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/packages/SW360PackageService.java index a66bb99cbe..e59a66e236 100644 --- a/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/packages/SW360PackageService.java +++ b/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/packages/SW360PackageService.java @@ -18,6 +18,7 @@ import org.apache.thrift.TException; import org.apache.thrift.transport.TTransportException; import org.eclipse.sw360.datahandler.common.CommonUtils; +import org.eclipse.sw360.datahandler.common.SW360Constants; import org.eclipse.sw360.datahandler.couchdb.lucene.LuceneAwareDatabaseConnector; import org.eclipse.sw360.datahandler.thrift.AddDocumentRequestStatus; import org.eclipse.sw360.datahandler.thrift.AddDocumentRequestSummary; @@ -54,6 +55,9 @@ public Package createPackage(Package pkg, User sw360User) throws TException { pkg.setId(documentRequestSummary.getId()); pkg.setCreatedBy(sw360User.getEmail()); return pkg; + } else if (documentRequestSummary.getRequestStatus() == AddDocumentRequestStatus.DUPLICATE + && documentRequestSummary.getMessage().equals(SW360Constants.DUPLICATE_PACKAGE_BY_PURL) ) { + throw new DataIntegrityViolationException("sw360 package with same purl '" + pkg.getPurl() + "' already exists."); } else if (documentRequestSummary.getRequestStatus() == AddDocumentRequestStatus.DUPLICATE) { throw new DataIntegrityViolationException("sw360 package with same name and version '" + pkg.getName() + "' already exists."); } else if (documentRequestSummary.getRequestStatus() == AddDocumentRequestStatus.INVALID_INPUT) { @@ -106,6 +110,15 @@ public Package getPackageForUserById(String id) throws TException { } } + public boolean validatePackageIds(Set packageIds) throws TException { + for (String id: packageIds) { + if (null == getPackageForUserById(id)) { + return false; + } + } + return true; + } + public List getPackagesForUser() throws TException { PackageService.Iface sw360PackageClient = getThriftPackageClient(); return sw360PackageClient.getAllPackages(); 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 f8e892d9e9..bcca7e42f3 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 @@ -676,6 +676,9 @@ public ResponseEntity linkPackages( ) @RequestBody Set packagesInRequestBody ) throws URISyntaxException, TException { + if(!packageService.validatePackageIds(packagesInRequestBody)){ + return new ResponseEntity<>("Package ID invalid! ", HttpStatus.NOT_FOUND); + } RequestStatus linkPackageStatus = linkOrUnlinkPackages(id, packagesInRequestBody, true); if (linkPackageStatus == RequestStatus.SENT_TO_MODERATOR) { return new ResponseEntity<>(RESPONSE_BODY_FOR_MODERATION_REQUEST, HttpStatus.ACCEPTED); @@ -702,6 +705,9 @@ public ResponseEntity patchPackages( ) @RequestBody Set packagesInRequestBody ) throws URISyntaxException, TException { + if(!packageService.validatePackageIds(packagesInRequestBody)){ + return new ResponseEntity<>("Package ID invalid! ", HttpStatus.NOT_FOUND); + } RequestStatus patchPackageStatus = linkOrUnlinkPackages(id, packagesInRequestBody, false); if (patchPackageStatus == RequestStatus.SENT_TO_MODERATOR) { return new ResponseEntity<>(RESPONSE_BODY_FOR_MODERATION_REQUEST, HttpStatus.ACCEPTED); diff --git a/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/release/ReleaseController.java b/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/release/ReleaseController.java index dccd020707..b96e30b999 100644 --- a/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/release/ReleaseController.java +++ b/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/release/ReleaseController.java @@ -1050,6 +1050,9 @@ public ResponseEntity linkPackages( @Parameter(description = "The package IDs to be linked.") @RequestBody Set packagesInRequestBody ) throws URISyntaxException, TException { + if(!packageService.validatePackageIds(packagesInRequestBody)){ + return new ResponseEntity<>("Package ID invalid! ", HttpStatus.NOT_FOUND); + } RequestStatus linkPackageStatus = linkOrUnlinkPackages(id, packagesInRequestBody, true); if (linkPackageStatus == RequestStatus.SENT_TO_MODERATOR) { return new ResponseEntity<>(RESPONSE_BODY_FOR_MODERATION_REQUEST, HttpStatus.ACCEPTED); @@ -1088,6 +1091,9 @@ public ResponseEntity unlinkPackages( @Parameter(description = "The package IDs to be linked.") @RequestBody Set packagesInRequestBody ) throws URISyntaxException, TException { + if(!packageService.validatePackageIds(packagesInRequestBody)){ + return new ResponseEntity<>("Package ID invalid! ", HttpStatus.NOT_FOUND); + } RequestStatus unlinkPackageStatus = linkOrUnlinkPackages(id, packagesInRequestBody, false); if (unlinkPackageStatus == RequestStatus.SENT_TO_MODERATOR) { return new ResponseEntity<>(RESPONSE_BODY_FOR_MODERATION_REQUEST, HttpStatus.ACCEPTED); @@ -1275,9 +1281,11 @@ private RequestStatus linkOrUnlinkPackages(String id, Set packagesInRequ throws URISyntaxException, TException { User sw360User = restControllerHelper.getSw360UserFromAuthentication(); Release release = releaseService.getReleaseForUserById(id, sw360User); - Set packageIds = new HashSet<>(); + Set packageIds; packageIds = release.getPackageIds(); - + if (CommonUtils.isNullOrEmptyCollection(packageIds)) { + packageIds = new HashSet<>(); + } if (link) { packageIds.addAll(packagesInRequestBody); } else { 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 351df83612..dc22f69662 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 @@ -234,6 +234,7 @@ public void before() throws TException, IOException { given(this.packageServiceMock.getPackageForUserById(eq(package1.getId()))).willReturn(package1); given(this.packageServiceMock.getPackageForUserById(eq(package2.getId()))).willReturn(package2); + given(this.packageServiceMock.validatePackageIds(any())).willReturn(true); Set linkedPackages = new HashSet<>(); linkedPackages.add(package1.getId()); diff --git a/rest/resource-server/src/test/java/org/eclipse/sw360/rest/resourceserver/restdocs/ReleaseSpecTest.java b/rest/resource-server/src/test/java/org/eclipse/sw360/rest/resourceserver/restdocs/ReleaseSpecTest.java index 8514f1eba3..969d0fb8e8 100644 --- a/rest/resource-server/src/test/java/org/eclipse/sw360/rest/resourceserver/restdocs/ReleaseSpecTest.java +++ b/rest/resource-server/src/test/java/org/eclipse/sw360/rest/resourceserver/restdocs/ReleaseSpecTest.java @@ -294,6 +294,7 @@ public void before() throws TException, IOException { .setDescription("Sanitizes an html string by stripping all potentially dangerous tokens."); given(this.packageServiceMock.getPackageForUserById(eq(package1.getId()))).willReturn(package1); + given(this.packageServiceMock.validatePackageIds(any())).willReturn(true); Set linkedPackages = new HashSet<>(); linkedPackages.add(package1.getId());