Construcción de líneas de tiempo en código Java

En Java, cada fragmento de datos de línea de tiempo es una instancia de la clase parametrizada curam.creole.value.Timeline. Para obtener detalles completos de esta clase, consulte el JavaDoc disponible en EJBServer/components/CREOLEInfrastructure/doc en una instalación de desarrollo de la aplicación.

Cada línea de tiempo contiene una colección de Intervalos, donde un intervalo es valor aplicable a partir de una determinada fecha de inicio. Se debe pasar una colección de intervalos adecuados al constructor de la línea de tiempo.

Por ejemplo, suponga que necesita crear una línea de tiempo<Número> con estos intervalos (recuerde que una línea de tiempo se extiende infinitamente en el pasado y el futuro):

A continuación se muestra código Java de ejemplo para crear una línea de tiempo de esta clase:

package curam.creole.example;

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

public class CreateTimeline {

  /**
   * Crea una línea de tiempo de número con estos valores de intervalo:
   * <ul>
   * <li>0 hasta e incluyendo el 31 de diciembre de 2000;</li>
   * <li>10.000 desde el 1 de enero de 2001 hasta e incluyendo el 30
   * de noviembre de 2003 y</li>
   * <li>12.000 desde el 1 de diciembre de 2004 hasta nuevo aviso.</li>
   * </ul>
   */
  public static Timeline<Number> createNumberTimeline() {

    return new Timeline<Number>(

    // primer intervalo, aplicación desde el "inicio del tiempo"
        new Interval<Number>(null, 0),

        // segundo intervalo
        new Interval<Number>(Date.fromISO8601("20010101"), 10000),

        // último intervalo (hasta nuevo aviso)
        new Interval<Number>(Date.fromISO8601("20041201"), 12000)

    );

  }
}

A continuación se muestra otro ejemplo de código de Java, que se puede llamar una expresión call CER, para calcular una línea de tiempo para la edad de una persona, hasta el 200 cumpleaños de la persona (recuerde que las líneas de tiempo de edad se deben limitar de manera artificial para que la línea de tiempo contenga un número finito de cambios de valor):

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 {

  /**
   * Crea una línea de tiempo para la edad de una persona, artificialmente
   * limitada a 200 cumpleaños.
   * <p>
   * Se puede invocar desde las reglas CER a través de una expresión &lt;call&gt;.
   */
  public static Timeline<? extends Number> createAgeTimeline(
      final Session session, final Date dateOfBirth) {

    /**
     * El límite artificial, de modo que la línea de tiempo tenga un número finito
     * de cambios de valor.
     */
    final int NUMBER_OF_BIRTHDAYS = 200;

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

    /*
     * la edad antes de la fecha de nacimiento se seguirá registrando como 0 -
     * crear una aplicación de intervalo inicial desde el
     * "inicio del tiempo"
     */
    final Interval<Integer> initialInterval =
        new Interval<Integer>(null, 0);
    intervals.add(initialInterval);

    /*
     * Identificar cada cumpleaños hasta el límite. Tenga en cuenta que se considera
     * que la persona tiene una edad de 0 incluso antes de la fecha de nacimiento (consulte
     * más arriba); de modo que aquí la línea de tiempo fusionará el intervalo desde la fecha de
     * nacimiento hasta el primer cumpleaños se fusionará en un solo intervalo;
     no importa (es más claro mantener la lógica como
     * está).
     */

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

      // calcular la fecha de nacimiento
      final Calendar birthdayCalendar = dateOfBirth.getCalendar();

      /*
       * NB utilizar .roll en lugar de .add para obtener el
       * proceso correcto para años bisiestos
       */
      birthdayCalendar.roll(Calendar.YEAR, age);
      final Date birthdayDate = new Date(birthdayCalendar);

      /*
       * la edad se aplica desde el nacimiento hasta el siguiente cumpleaños
       */
      intervals.add(new Interval<Integer>(birthdayDate, age));
    }

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

    return ageTimeline;

  }
}
Nota: En general, los clientes de CER tienden a crear los datos de tiempo de línea fuera de las reglas.

En particular, el proceso de elegibilidad/titularidad de Cúram V6 contiene lógica para ayudarle a convertir las pruebas de Cúram en datos de línea de tiempo.

Consulte la guía Inside Cúram Eligibility and Entitlement Using Cúram Express Rules para obtener más detalles.