Code

Die Anwendung muss die Rückrufschnittstelle NotificationDelivery implementieren, um festzulegen, wie Benachrichtigungen in der Anwendung verarbeitet werden.

Zur Verarbeitung der Benachrichtigung ruft die Workflow-Engine die Methode deliverNotification in der Implementierungsklasse curam.util.workflow.impl.NotificationDelivery auf. Die Engine leitet sowohl die von der Zuteilungsstrategie ermittelte Liste der Zuteilungsziele als auch die Details der erforderlichen Benachrichtigung an diese Anwendungsmethode weiter.

Die Anwendungseigenschaft 'curam.custom.notifications.notificationdelivery' gibt an, welche Implementierung der Schnittstelle NotificationDelivery von der Workflow-Engine zur Verarbeitung der Benachrichtigung verwendet wird.

Die Methode deliverNotification in dieser Standardimplementierungsklasse ist überladen. Der Grund dafür ist, dass die verschiedenen Zuteilungsstrategietypen die Zuteilungsziele in unterschiedlichen Formaten zurückgeben. Dies ist jedoch ein Aspekt der Implementierung, der für einen Entwickler von angepassten Klassen der Benachrichtigungsbereitstellung nicht von Bedeutung sein sollte, da die Geschäftsverarbeitung für alle Versionen der Methode gleich sein sollte.

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);

            ...
      }

Um diesem Problem entgegenzuwirken, stellt die Klasse curam.core.sl.impl.DefaultNotificationDeliveryAdapter einen weitaus effizienteren Mechanismus zur Implementierung einer Benarchrichtigungsbereitstellung bereit. Diese Klasse implementiert die unterschiedlichen Methoden und konvertiert deren Eingabeparameter in Zuteilungsziellisten. Dadurch können Entwickler von Logiken für die Benachrichtigungsbereitstellung diese Klasse erweitern und eine Methode implementieren, die unabhängig von der Quelle der Zuteilungsziele aufgerufen wird.

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);

            ...
      }

Neben dieser Adapterklasse ist im Lieferumfang dieser Anwendung auch eine sofort einsatzfähige Implementierung für eine Benachrichtigungsbereitstellung enthalten. Die Klasse heißt curam.core.sl.impl.DefaultNotificationDelivery und dient ebenfalls als Beispiel zur Erweiterung des Adapters.

Die Strategien für die Benachrichtigungsbereitstellung sind in der Codetabelle 'DELIVERYMECHANISM' aufgelistet. Das Hinzufügen einer neuen Strategie bedeutet eine einfache Erweiterung dieser Codetabelle mit einer neuen Strategie (beispielsweise SMS) und die Implementierung einer Bereitstellungsstrategie, die diesen Code erkennt und die entsprechende Logik ausführt. Da die Klasse für die Benachrichtigungsstrategie jedoch mithilfe einer einzigen Anwendungseigenschaft festgelegt wird, würde beim Ersetzen der Klasse curam.core.sl.impl.DefaultNotificationDelivery der sofort einsetzbare Bereitstellungsmechanismus inaktiviert werden. Wenn das Ziel ist, diesen Mechanismus zu erweitern (und nicht zu ersetzen), sollten benutzerdefinierte Klassen die Klasse curam.core.sl.impl.DefaultNotificationDelivery so erweitern, dass die ursprüngliche Funktionalität beibehalten wird. Die Klasse curam.core.sl.impl.DefaultNotificationDelivery wurde vor diesem Hintergrund implementiert.

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;
   }

   ...

 }

Die Klasse curam.core.sl.impl.DefaultNotificationDelivery implementiert die Methode deliverNotification aus dem abstrakten Adapter, weist jedoch sofort die entsprechende Kennung zur Verwendung einer geschützten Methode an. Die geschützte Methode selectDeliveryMechanism kann von Unterklassen zum Ermitteln von benutzerdefinierten Bereitstellungsmechanismen überschrieben werden und führt, wie nachfolgend dargestellt, die entsprechenden Operationen aus:

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);
   }
 }

Beachten Sie, dass die Methode selectDeliveryMechanism in der benutzerdefinierten Klasse zuerst eine Delegierung für die eigene übergeordnete Klasse vornimmt, bevor eigene Logiken ausgeführt werden. Durch die Erweiterung der Funktionalität in dieser Form können benutzerdefinierte Klassen die sofort einsatzfähigen Bereitstellungsmechanismen aufrufen, ohne die speziellen Codes kennen zu müssen, die von der übergeordneten Klasse erkannt werden. Dieser Ansatz ist auch bei Aktualisierungen von Vorteil. Wenn beispielsweise eine zukünftige Version von Cúram mehr sofort einsatzbereite Bereitstellungsmechanismen unterstützt, muss eine wie hier implementierte benutzerdefinierte Klasse nicht geändert werden, um die neue Funktionalität nutzen zu können.

Das von der oben dargestellten Funktion für die Benachrichtigungsbereitstellung zurückgegebene boolesche Flag zeigt der Workflow-Engine an, ob die Benachrichtigung an mindestens einen Benutzer im System gesendet wurde. Ist dies nicht der Fall, verfasst die Engine diesbezüglich einen Worfklowprüfdatensatz.