Code

L'application doit implémenter l'interface de rappel NotificationDelivery afin de déterminer le traitement des notifications dans l'application.

Le moteur de flux de travaux appellera la méthode deliverNotification dans la classe d'implémentation curam.util.workflow.impl.NotificationDelivery afin de traiter la notification. Le moteur transmettra à la fois la liste des cibles d'allocation déterminées par la stratégie d'allocation et les détails de la notification requis pour cette méthode d'application.

La propriété d'application curam.custom.notifications.notificationdelivery définit l'interface d'implémentation NotificationDelivery qui sera utilisée par le moteur de flux de travaux afin de traiter la notification.

La méthode deliverNotification dans cette classe d'implémentation par défaut est surchargée. Ceci est dû au fait que les différents types de stratégie d'allocation renvoient les cibles d'allocation dans différents formats. Toutefois, il s'agit d'un détail d'implémentation que les développeurs de classes de distribution de notification personnalisées ne doivent pas avoir à traiter, notamment parce que le processus métier pour toutes les versions de la méthode doit être le même.

package curam.util.workflow.impl;

      ...

      public interface NotificationDelivery {

        boolean deliverNotification(
          final NotificationDetails notificationDetails,
          final Object allocationTargets);

        boolean deliverNotification(
            final NotificationDetails notificationDetails,
            final Map allocationTargets);


        boolean deliverNotification(
            final NotificationDetails notificationDetails,
            final String allocationTargetID);

            ...
      }

Afin d'atténuer ce problème, curam.core.sl.impl.DefaultNotificationDeliveryAdapter fournit un mécanisme plus pratique pour l'implémentation d'un programme de résolution de travail. Cette classe implémente les différentes méthodes et convertit leurs paramètres d'entrée en listes de cible d'allocation permettant aux développeurs de logique de distribution des notifications personnalisées d'étendre cette classe et d'implémenter une méthode qui est appelée quelle que soit la source des cibles d'allocation.

package curam.core.sl.impl;

      ...

      public abstract class DefaultNotificationDeliveryAdapter
        implements curam.util.workflow.impl.NotificationDelivery {

        public abstract boolean deliverNotification(
          final NotificationDetails notificationDetails,
          final AllocationTargetList allocationTargets);

            ...
      }

Outre cette classe d'adaptateur, l'application est livrée avec une implémentation de distribution de notification prête à l'emploi. Cette classe est appelée curam.core.sl.impl.DefaultNotificationDelivery et elle sert d'exemple sur la manière d'étendre l'adaptateur.

Les stratégies de distribution de notification sont répertoriées dans la table de codes DELIVERYMECHANISM. L'ajout d'une nouvelle stratégie correspond simplement à l'extension de cette table de codes avec une nouvelle stratégie (SMS, par exemple) et à l'implémentation d'une stratégie de distribution qui reconnaît ce code et exécute la logique appropriée. Cependant, puisque la classe de distribution de notification est définie à l'aide d'une propriété d'application unique, le remplacement de la classe curam.core.sl.impl.DefaultNotificationDelivery désactive les mécanismes de distribution prête à l'emploi. Si le but est d'étendre le mécanisme de distribution prête à l'emploi au lieu de le remplacer, des classes personnalisées doivent étendre la classe curam.core.sl.impl.DefaultNotificationDelivery dans un format qui préserve la fonctionnalité d'origine. La classe curam.core.sl.impl.DefaultNotificationDelivery a été implémentée dans ce but.

package curam.core.sl.impl;

 public class DefaultNotificationDelivery
     extends DefaultNotificationDeliveryAdapter {

   public boolean deliverNotification(
       NotificationDetails notificationDetails,
       AllocationTargetList allocationTargetList) {
     return selectDeliveryMechanism(
       notificationDetails, allocationTargetList);
   }

   protected boolean selectDeliveryMechanism(
     NotificationDetails notificationDetails,
      AllocationTargetList allocationTargetList) {

     boolean notificationDelivered = false;
     if (notificationDetails.deliveryMechanism.equals(
         curam.codetable.DELIVERYMECHANISM.STANDARD)) {
       notificationDelivered = standardDeliverNotification(
         notificationDetails, allocationTargetList);
     } else if (
     ...
     return notificationDelivered;
   }

   ...

 }

La classe curam.core.sl.impl.DefaultNotificationDelivery implémente la méthode deliverNotification à partir de l'adaptateur abstrait, mais délègue immédiatement l'identification du mécanisme afin d'utiliser une méthode protégée. La méthode protégée selectDeliveryMechanism peut être remplacée par des sous-classes afin d'identifier tout mécanisme de distribution personnalisée et d'effectuer les opérations appropriées telles qu'illustrées dans l'exemple ci-dessous :

public class CustomNotificationDeliveryStrategy
     extends DefaultNotificationDelivery {

   protected boolean selectDeliveryMechanism(
     NotificationDetails notificationDetails,
      AllocationTargetList allocationTargetList) {

     boolean notificationDelivered = false;
     boolean superNotificationDelivered = false;
     superNotificationDelivered = super.selectDeliveryMechanism(
       notificationDetails, allocationTargetList);
     if (notificationDetails.deliveryMechanism.equals(
       curam.codetable.DELIVERYMECHANISM.CUSTOM)) {
       notificationDelivered = customDeliverNotification(
         notificationDetails, allocationTargetList);
     }
     return (superNotificationDelivered || notificationDelivered);
   }
 }

Notez que la méthode selectDeliveryMechanism dans la classe personnalisée délègue tout d'abord sa super-classe avant d'exécuter l'une des ses propres logiques. L'extension de la fonctionnalité permet aux classes personnalisées d'appeler le mécanisme de distribution prête à l'emploi sans avoir à connaître les codes spécifiques reconnus par la classe parent. Cette approche permet également des mises à niveau aisées, étant donné que, si une version future de Cúram prend en charge plus de mécanismes de distribution prête à l'emploi, une classe personnalisée implémentée comme indiqué ici n'aura pas besoin d'être modifiée pour bénéficier des nouvelles fonctionnalités.

L'indicateur booléen renvoyé par la fonction de distribution de notification ci-dessus est utilisé pour indiquer au moteur de flux de travaux que la notification a été distribuée à au moins un utilisateur sur le système. Si ce n'est pas le cas, le moteur écrit un enregistrement d'audit de flux de travaux détaillant ce fait.