diff --git a/perl/exit_strategy.pl b/perl/exit_strategy.pl index 603dae0729890f22746596bb4353a72addc92427..f8cce7f80ef32877165bb4654659155b0b1b4965 100644 --- a/perl/exit_strategy.pl +++ b/perl/exit_strategy.pl @@ -616,23 +616,30 @@ sub check_if_file_is_readable($filename) { sub _handle_deleted_or_purged_aips($xp, $ret) { my $amdsec_ie = $xp->findnodes($compiled_xpath_amdSec_ie)->[0]; - my $latest_ctx = ( - sort { - my $adate = get_anydelete_date($xp, $a); - my $bdate = get_anydelete_date($xp, $b); - $bdate cmp $adate - } $xp->findnodes($xpath_if_anydelete_event_expr, $amdsec_ie) - )[0]; # first element of list - my $is_deleted = has_anydelete_entries($xp, $latest_ctx); - if ($is_deleted) { - my $state = get_anydelete_state($xp, $latest_ctx); - $ret->{$state}->{state} = $state; - $ret->{$state}->{reason} = get_anydelete_reason($xp, $latest_ctx); - $ret->{$state}->{note} = get_anydelete_note($xp, $latest_ctx); - $ret->{$state}->{date} = get_anydelete_date($xp, $latest_ctx); - $ret->{$state}->{authorized_by} = get_anydelete_authorized_by($xp, $latest_ctx); - } - return $is_deleted; + my @ctxs = $xp->findnodes($xpath_if_anydelete_event_expr, $amdsec_ie); + my $cmp_by_date_and_state = sub ($a, $b) { + my $adate = get_anydelete_date($xp, $a); + my $bdate = get_anydelete_date($xp, $b); + my $dateres = $bdate cmp $adate; + if (0 == $dateres) { + my $astate = get_anydelete_state($xp, $a); + my $bstate = get_anydelete_state($xp, $b); + return $bstate cmp $astate # "purged" > "delete" + } + return $dateres; # newer > older + }; + my $latest_ctx = (sort { $cmp_by_date_and_state->($a, $b) } @ctxs)[0]; + # check if latest entry is either deleted or purged, only than add entry + my $is_deleted_or_purged = has_anydelete_entries($xp, $latest_ctx); + if ($is_deleted_or_purged) { + my $state = get_anydelete_state($xp, $latest_ctx); + $ret->{$state}->{state} = $state; + $ret->{$state}->{reason} = get_anydelete_reason($xp, $latest_ctx); + $ret->{$state}->{note} = get_anydelete_note($xp, $latest_ctx); + $ret->{$state}->{date} = get_anydelete_date($xp, $latest_ctx); + $ret->{$state}->{authorized_by} = get_anydelete_authorized_by($xp, $latest_ctx); + } + return $is_deleted_or_purged; } sub parse_iexml($filename, $recovery_flag) {