Zeitlinien in Java-Code erstellen

In Java ist jedes Teil von Zeitliniendaten eine Instanz der parametrisierten Klasse curam.creole.value.Timeline. Vollständige Einzelangaben über diese Klasse enthält das JavaDoc, das in einer für Entwicklungszwecke verwendeten Installation der Anwendung unter EJBServer/components/CREOLEInfrastructure/doc verfügbar ist.

Jede Zeitlinie enthält eine Sammlung von Intervallen. Ein Intervall ist in diesem Zusammenhang ein Wert, der ab einem bestimmten Startdatum gültig ist. An den Konstruktor der Zeitlinie muss eine Sammlung von geeigneten Intervallen übergeben werden.

Nehmen wir beispielsweise an, es soll eine Zeitlinie des Typs Timeline<Number> mit den folgenden Intervallen erstellt werden (zur Erinnerung: eine Zeitlinie erstreckt sich unbegrenzt in die Vergangenheit und in die Zukunft):

Das folgende Beispiel zeigt einen Java-Code, mit dem eine solche Zeitlinie erstellt werden kann:

package curam.creole.example;

import curam.creole.value.Interval;
import curam.creole.value.Timeline;
import curam.util.type.Date;

public class CreateTimeline {

  /**
   * Creates a Number Timeline with these interval values:
   * <ul>
   * <li>0 up to and including 31st December 2000;</li>
   * <li>10,000 from 1st January 2001 up to and including 30th
   * November 2003; and</li>
   * <li>12,000 from 1st December 2004 until further notice.</li>
   * </ul>
   */
  public static Timeline<Number> createNumberTimeline() {

    return new Timeline<Number>(

    // first interval, application from the "start of time"
        new Interval<Number>(null, 0),

        // second interval
        new Interval<Number>(Date.fromISO8601("20010101"), 10000),

        // last interval (until further notice)
        new Interval<Number>(Date.fromISO8601("20041201"), 12000)

    );

  }
}

Das nächste Beispiel zeigt Java-Code, der von einem CER-Ausdruck call aufgerufen werden kann, um eine Zeitlinie für das Alter einer Person bis zu ihrem 200. Geburtstag zu berechnen (zur Erinnerung: Zeitlinien für das Lebensalter müssen künstlich begrenzt werden, damit die Zeitlinie eine endliche Anzahl von Wertänderungen enthält):

package curam.creole.example;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;

import curam.creole.execution.session.Session;
import curam.creole.value.Interval;
import curam.creole.value.Timeline;
import curam.util.type.Date;

public class AgeTimeline {

  /**
   * Creates a timeline for the age of a person, artificially
   * limited to 200 birthdays.
   * <p>
   * Can be invoked from CER rules via a &lt;call&gt; expression.
   */
  public static Timeline<? extends Number> createAgeTimeline(
      final Session session, final Date dateOfBirth) {

    /**
     * The artificial limit, so that the age timeline has a finite
     * number of value changes.
     */
    final int NUMBER_OF_BIRTHDAYS = 200;

    final Collection<Interval<Integer>> intervals =
        new ArrayList<Interval<Integer>>(NUMBER_OF_BIRTHDAYS + 2);

    /*
     * age before date of birth will still be recorded as 0 -
     * create an initial interval application from the
     * "start of time"
     */
    final Interval<Integer> initialInterval =
        new Interval<Integer>(null, 0);
    intervals.add(initialInterval);

    /*
     * Identify each birthday up to the limit. Note that the person
     * is deemed to be age 0 even before the date-of-birth (see
     * above); so the interval here from the date of birth up to
     * the first birthday will be merged into a single interval by
     * the timeline; no matter (it's clearer to keep the logic as
     * is).
     */

    for (int age = 0; age <= NUMBER_OF_BIRTHDAYS; age++) {

      // compute the birthday date
      final Calendar birthdayCalendar = dateOfBirth.getCalendar();

      /*
       * NB use .roll rather than .add to get the correct
       * processing for leap years
       */
      birthdayCalendar.roll(Calendar.YEAR, age);
      final Date birthdayDate = new Date(birthdayCalendar);

      /*
       * the age applies from this birthday until the next birthday
       */
      intervals.add(new Interval<Integer>(birthdayDate, age));
    }

    final Timeline<Integer> ageTimeline =
        new Timeline<Integer>(intervals);

    return ageTimeline;

  }
}
Anmerkung: Zeitliniendaten werden generell eher außerhalb von Regeln durch CER-Clients erstellt.

Insbesondere enthält die Verarbeitung für Anspruchsberechtigung und Leistungshöhe in Cúram Version 6 Logik, die eine Konvertierung von Cúram-Angaben in Zeitliniendaten unterstützt.

Weitere Details finden Sie im Handbuch Inside Cúram Eligibility and Entitlement Using Cúram Express Rules.