Skip to content

Commit 732e3fd

Browse files
fetch parent before deciding on metrics update
Signed-off-by: Valentijn Scholten <valentijnscholten@gmail.com>
1 parent 6f830f0 commit 732e3fd

1 file changed

Lines changed: 21 additions & 15 deletions

File tree

src/main/java/org/dependencytrack/persistence/ProjectQueryManager.java

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -516,9 +516,16 @@ public Project updateProject(Project transientProject, boolean commitIndex) {
516516
final Project project = getObjectByUuid(Project.class, transientProject.getUuid());
517517

518518
Project oldParent = project.getParent();
519+
// Resolve the new parent from DB before making scheduling decisions.
520+
// transientProject.getParent() is a stub from the API request with only UUID populated,
521+
// so getCollectionLogic() on it always returns NONE.
522+
Project resolvedNewParent = null;
523+
if (transientProject.getParent() != null && transientProject.getParent().getUuid() != null) {
524+
resolvedNewParent = getObjectByUuid(Project.class, transientProject.getParent().getUuid());
525+
}
519526
boolean scheduleProjectMetricsUpdate = this.needScheduleProjectMetricsUpdate(project, transientProject);
520-
boolean scheduleParentMetricsUpdate = this.needScheduleParentMetricsUpdate(transientProject, scheduleProjectMetricsUpdate);
521-
boolean scheduleOldParentMetricsUpdate = this.needScheduleOldParentMetricsUpdate(oldParent, transientProject);
527+
boolean scheduleParentMetricsUpdate = this.needScheduleParentMetricsUpdate(resolvedNewParent, scheduleProjectMetricsUpdate);
528+
boolean scheduleOldParentMetricsUpdate = this.needScheduleOldParentMetricsUpdate(oldParent, resolvedNewParent);
522529

523530
project.setAuthors(transientProject.getAuthors());
524531
project.setPublisher(transientProject.getPublisher());
@@ -557,20 +564,19 @@ public Project updateProject(Project transientProject, boolean commitIndex) {
557564
}
558565
project.setIsLatest(transientProject.isLatest());
559566

560-
if (transientProject.getParent() != null && transientProject.getParent().getUuid() != null) {
561-
if (project.getUuid().equals(transientProject.getParent().getUuid())){
567+
if (resolvedNewParent != null) {
568+
if (project.getUuid().equals(resolvedNewParent.getUuid())){
562569
throw new IllegalArgumentException("A project cannot select itself as a parent");
563570
}
564-
Project parent = getObjectByUuid(Project.class, transientProject.getParent().getUuid());
565-
if (!Boolean.TRUE.equals(parent.isActive())){
571+
if (!Boolean.TRUE.equals(resolvedNewParent.isActive())){
566572
throw new IllegalArgumentException("An inactive project cannot be selected as a parent");
567-
} else if (isChildOf(parent, transientProject.getUuid())){
573+
} else if (isChildOf(resolvedNewParent, transientProject.getUuid())){
568574
throw new IllegalArgumentException("The new parent project cannot be a child of the current project.");
569575
} else {
570-
project.setParent(parent);
576+
project.setParent(resolvedNewParent);
571577
}
572-
project.setParent(parent);
573-
}else {
578+
project.setParent(resolvedNewParent);
579+
} else {
574580
project.setParent(null);
575581
}
576582

@@ -621,17 +627,17 @@ private boolean needScheduleProjectMetricsUpdate(Project project, Project transi
621627
/**
622628
* if parent is collection schedule an update, unless this project itself is scheduled already since that will trigger a parent update, too
623629
*/
624-
private boolean needScheduleParentMetricsUpdate(Project transientProject, boolean scheduleProjectMetricsUpdate) {
630+
private boolean needScheduleParentMetricsUpdate(Project newParent, boolean scheduleProjectMetricsUpdate) {
625631
return !scheduleProjectMetricsUpdate
626-
&& transientProject.getParent() != null
627-
&& transientProject.getParent().getCollectionLogic() != ProjectCollectionLogic.NONE;
632+
&& newParent != null
633+
&& newParent.getCollectionLogic() != ProjectCollectionLogic.NONE;
628634
}
629635

630636
/**
631637
* if project gets a new parent and old parent was collection, we need to update old parent's metrics
632638
*/
633-
private boolean needScheduleOldParentMetricsUpdate(Project oldParent, Project transientProject) {
634-
return oldParent != transientProject.getParent()
639+
private boolean needScheduleOldParentMetricsUpdate(Project oldParent, Project newParent) {
640+
return oldParent != newParent
635641
&& oldParent != null
636642
&& oldParent.getCollectionLogic() != ProjectCollectionLogic.NONE;
637643
}

0 commit comments

Comments
 (0)