@@ -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