Extracting, via Rule, Inactive Identities with Active Application Account in SailPoint

Thank you so Much.

Here the actual Rule:

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE Rule PUBLIC "sailpoint.dtd" "sailpoint.dtd">
<Rule created="1738918407678" id="0a01295994a81c748194df9d2dfe626a" language="beanshell" modified="1739174563682" name="Test - Estrazione Identities cessate con account profilati">
  <Source>
  import sailpoint.object.QueryOptions;
  import sailpoint.object.Filter;
  import sailpoint.object.Identity;
  import java.util.Iterator;
  import java.util.ArrayList;
  import java.util.List;
  import java.time.Duration;
  import java.time.Instant;

  System.out.println("\n========================== LISTA IDENTITA' NON ATTIVE con Account profilati - START =========================");  
  Instant start = Instant.now();
  
  // Verifica se il contesto è disponibile
  if (context == null) {
    throw new IllegalArgumentException("Il contesto SailPoint non è disponibile.");
  }

  // Lista per memorizzare le identità filtrate
  List&lt;String> filtered_identities = new ArrayList();

  // Creazione di un oggetto QueryOptions per impostare i filtri
  QueryOptions qo = new QueryOptions();
  
  // Aggiunge filtro per le sole Identità NON attive
  qo.addFilter(Filter.eq("inactive", true)); // Recupera solo utenti attivi 
  // Cerca solo quelle con il name non nullo, scrupolo inutile
  qo.addFilter(Filter.notnull("name"));
  // Devono avere almeno un link profilato
  qo.addFilter(Filter.notnull("links.application.name"));
  qo.addFilter(Filter.ne("links.application.name", ""));
  // Devono avere almeno un link NON disabilitato (iiqDisabled = false)
  qo.addFilter(Filter.ne("links.iiqDisabled",true));
 
  // Creazione di un lista con i soli attributi necessari
  List attributes = new ArrayList();
  attributes.add("name"); // row[0]
  attributes.add("displayName"); // row[1]

  // Esecuzione della query con il filtro di selezione 'go' e gli attributi specifici da estrarre 
  Iterator it = context.search(Identity.class, qo, attributes);

  while (it.hasNext()) {
    Object[] row = it.next();
    String name = (row[0] != null) ? row[0].toString() : "Sconosciuto"; 				// Se il name è nullo, assegna "Sconosciuto"
    String displayName = (row[1] != null) ? row[1].toString() : "Sconosciuto"; 	// Se il displayNAme è nullo, assegna "Sconosciuto"

    String dispName = name + " (" + displayName + ")";
    System.out.println("dispName : " + dispName);

    filtered_identities.add(dispName);
  }

  Instant end = Instant.now();
  Duration duration = Duration.between(start, end);
  System.out.println("=============================================================================================================");
  System.out.println("Durata dell'elaborazione: " + duration.toMillis() + " millisecondi");
  System.out.println("Numero Identita estratte: " + filtered_identities.size());
  //System.out.println("filteredIdentities : " + filtered_identities);
  System.out.println("========================== LISTA IDENTITA' NON ATTIVE con Account profilati - END  ==========================");
  </Source>
</Rule>