public void syncAssignedPrincipalRolesForPrincipal()

in polaris-synchronizer/api/src/main/java/org/apache/polaris/tools/sync/polaris/PolarisSynchronizer.java [196:278]


  public void syncAssignedPrincipalRolesForPrincipal(String principalName) {
    List<PrincipalRole> assignedPrincipalRolesSource;

    try {
      assignedPrincipalRolesSource = source.listPrincipalRolesAssigned(principalName);
      clientLogger.info("Listed {} assigned principal-roles for principal {} from source.",
              assignedPrincipalRolesSource.size(), principalName);
    } catch (Exception e) {
      if (haltOnFailure) throw e;
      clientLogger.error("Failed to list assigned principal-roles for principal {} from source.", principalName, e);
      return;
    }

    List<PrincipalRole> assignedPrincipalRolesTarget;

    try {
      assignedPrincipalRolesTarget = target.listPrincipalRolesAssigned(principalName);
      clientLogger.info("Listed {} assigned principal-roles for principal {} from target.",
              assignedPrincipalRolesTarget.size(), principalName);
    } catch (Exception e) {
      if (haltOnFailure) throw e;
      clientLogger.error("Failed to list assigned principal-roles for principal {} from target.", principalName, e);
      return;
    }

    SynchronizationPlan<PrincipalRole> assignedPrincipalRoleSyncPlan =
            syncPlanner.planAssignPrincipalsToPrincipalRolesSync(
                    principalName, assignedPrincipalRolesSource, assignedPrincipalRolesTarget);

    assignedPrincipalRoleSyncPlan
            .entitiesToSkip()
            .forEach(
                    principalRole ->
                            clientLogger.info("Skipping assignment of principal-role {} to principal {}.",
                                    principalName, principalRole.getName()));

    assignedPrincipalRoleSyncPlan
            .entitiesNotModified()
            .forEach(
                    principalRole ->
                            clientLogger.info(
                                    "Principal {} is already assigned to principal-role {}, skipping.",
                                    principalName, principalRole.getName()));

    int syncsCompleted = 0;
    final int totalSyncsToComplete = totalSyncsToComplete(assignedPrincipalRoleSyncPlan);

    for (PrincipalRole principalRole : assignedPrincipalRoleSyncPlan.entitiesToCreate()) {
      try {
        target.assignPrincipalRole(principalName, principalRole.getName());
        clientLogger.info("Assigned principal-role {} to principal {}. - {}/{}",
                principalRole.getName(), principalName, ++syncsCompleted, totalSyncsToComplete);
      } catch (Exception e) {
        if (haltOnFailure) throw e;
        clientLogger.error("Failed to assign principal-role {} to principal {}. - {}/{}",
                principalRole.getName(), principalName, ++syncsCompleted, totalSyncsToComplete);
      }
    }

    for (PrincipalRole principalRole : assignedPrincipalRoleSyncPlan.entitiesToOverwrite()) {
      try {
        target.assignPrincipalRole(principalName, principalRole.getName());
        clientLogger.info("Assigned principal-role {} to principal {}. - {}/{}",
                principalRole.getName(), principalName, ++syncsCompleted, totalSyncsToComplete);
      } catch (Exception e) {
        if (haltOnFailure) throw e;
        clientLogger.error("Failed to assign principal-role {} to principal {}. - {}/{}",
                principalRole.getName(), principalName, ++syncsCompleted, totalSyncsToComplete);
      }
    }

    for (PrincipalRole principalRole : assignedPrincipalRoleSyncPlan.entitiesToRemove()) {
      try {
        target.revokePrincipalRole(principalName, principalRole.getName());
        clientLogger.info("Revoked principal-role {} from principal {}. - {}/{}",
                principalRole.getName(), principalName, ++syncsCompleted, totalSyncsToComplete);
      } catch (Exception e) {
        if (haltOnFailure) throw e;
        clientLogger.error("Failed to revoke principal-role {} to principal {}. - {}/{}",
                principalRole.getName(), principalName, ++syncsCompleted, totalSyncsToComplete);
      }
    }
  }