In Java, each piece of Timeline data is an instance of the curam.creole.value.Timeline parameterized class. For full details of this class, see its JavaDoc available at EJBServer/components/CREOLEInfrastructure/doc in a development installation of the application.
Each Timeline holds a collection of Intervals, where an Interval is value applicable from a particular start date. A collection of appropriate intervals must be passed to the Timeline's constructor.
For example, suppose you need to create a Timeline<Number> with these intervals (recall that a timeline stretches infinitely far into the past and future):
Here is some sample Java code to create such a timeline:
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)
);
}
}
As another example, here is some sample Java code, which is callable a CER call expression, to calculate a timeline for a person's age, up to the person's 200th birthday (recall that age timelines must be artificially limited so that the timeline contains a finite number of value changes):
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 <call> 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;
}
}
In particular, the Cúram V6 Eligibility/Entitlement processing contains logic to help convert Cúram Evidence into timeline data.
See the Inside Cúram Eligibility and Entitlement Using Cúram Express Rules guide for more details.