Construction de chronologies dans un code Java

Dans Java, chaque élément de données chronologiques est une instance de la classe paramétrée curam.creole.value.Timeline. Pour des détails complets sur cette classe, reportez-vous à son JavaDoc disponible à l'adresse EJBServer/components/CREOLEInfrastructure/doc dans une installation de développement de l'application.

Chaque chronologie contient un ensemble d'intervalles, dans laquelle les value d'un intervalle sont applicables à partir d'une start date particulière. Un ensemble d'intervalles appropriés doit être transmis au constructeur de la chronologie.

Par exemple, supposez que vous deviez créer une Timeline<Number> avec ces intervalles (rappelez-vous qu'une chronologie s'étend indéfiniment loin dans le passé et le futur) :

Voici quelques exemples de code Java permettant de créer cette chronologie :

package curam.creole.example;

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

public class CreateTimeline {

  /**
   * Créer une chronologie numérique avec ces valeurs d'intervalle :
   * <ul>
   * <li>0 jusqu'au 31 décembre 2000 inclus;</li>
   * <li>10 000 entre le 1er janvier 2001 et le 30
   * novembre 2003 inclus; et</li>    * <li>12 000 à partir du 1er décembre 2004 jusqu'à nouvel ordre.</li>
   * </ul>
   */
  public static Timeline<Number> createNumberTimeline() {

    return new Timeline<Number>(

    // premier intervalle, application à partir du début de la durée
        new Interval<Number>(null, 0),

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

        // dernier intervalle (jusqu'à nouvel ordre)
        new Interval<Number>(Date.fromISO8601("20041201"), 12000)

    );

  }
}

Autre exemple : voici quelques exemples de code Java, que l'on peut appeler une expression CER call, pour calculer une chronologie liée à l'âge d'une personne, jusqu'à son 200ᵉ anniversaire (rappelez-vous que les chronologies d'âge doivent être limitées artificiellement, de sorte que la chronologie contienne un nombre limité de changements de valeur) :

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 {

  /**
   * Crée une chronologie liée à l'âge d'une personne, artificiellement
   * limitée à 200 anniversaires.
   * <p>
   * Peut être appelée à partir de règles CER via une expression &lt;call&gt;.
   */
  public static Timeline<? extends Number> createAgeTimeline(
      final Session session, final Date dateOfBirth) {

    /**
     * La limite artificielle, de sorte que la chronologie d'âge comporte un
     * nombre limité de changements de valeur.
     */
    final int NUMBER_OF_BIRTHDAYS = 200;

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

    /*
     * l'âge précédant la date de naissance doit toujours être enregistré à 0 -
     * crée une application d'intervalle initiale à partir du
     * début de la durée
     */
    final Interval<Integer> initialInterval =
        new Interval<Integer>(null, 0);
    intervals.add(initialInterval);

    /*
     * Identifier chaque anniversaire jusqu'à la limite. Notez que la personne      * est supposée avoir un âge de 0 ans avant même sa date de naissance (voir      * ci-dessus) ; donc l'intervalle entre la date de naissance et
     * le premier anniversaire est fusionné en un seul intervalle par la
     * chronologie, même s'il est plus clair de conserver la logique
     * en l'état.
     */

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

      // calculer la date d'anniversaire
      final Calendar birthdayCalendar = dateOfBirth.getCalendar();

      /*
       * NB utiliser .roll et non .add pour obtenir un traitement
       * correct pour les années bissextiles
       */
      birthdayCalendar.roll(Calendar.YEAR, age);
      final Date birthdayDate = new Date(birthdayCalendar);

      /*
       * l'âge s'applique à partir de cet anniversaire jusqu'au suivant
       */
      intervals.add(new Interval<Integer>(birthdayDate, age));
    }

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

    return ageTimeline;

  }
}
Remarque : En général, les données chronologiques tendent à être créées en dehors des règles, par les clients de CER.

En particulier, le système de traitement de Cúram V6 Eligibility/Entitlement contient une logique qui permet de convertir les informations collectées de Cúram en données chronologiques.

Voir le guide Inside Cúram Eligibility and Entitlement Using Cúram Express Rules pour plus de détails.