Développement de méthodes statiques

CER prend en charge diverses expressions susceptibles de fournir les calculs dont vous avez besoin.

Si un calcul métier ne peut pas être implémenté à l'aide d'expressions CER, CER prend en charge l'expression call pour vous permettre d'effectuer des appels de votre jeu de règles vers une méthode statique sur une classe Java personnalisée. L'éditeur CER fournit quelques éléments de règles (par exemple, "call" pour permettre aux utilisateurs de définir une méthode statique sur une classe Java personnalisée). Voir l'élément de règle "call" dans Call.

Voici un exemple de jeu de règles qui appelle une méthode Java :

<?xml version="1.0" encoding="UTF-8"?>
<RuleSet name="Example_StaticMethodDevelopment"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation=
"http://www.curamsoftware.com/CreoleRulesSchema.xsd">
  <Class name="Income">

    <Attribute name="paymentReceivedDate">
      <type>
        <javaclass name="curam.util.type.Date"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <Attribute name="amount">
      <type>
        <javaclass name="Number"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

  </Class>

  <Class name="Person">

    <Attribute name="incomes">
      <type>
        <javaclass name="List">
          <ruleclass name="Income"/>
        </javaclass>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <Attribute name="mostRecentIncome">
      <type>
        <ruleclass name="Income"/>
      </type>
      <derivation>
        <!-- Au départ, la méthode
             identifyMostRecentIncome_StronglyTyped doit être utilisée.

             En pratique, vous ne devez pas conserver deux versions de
             chaque méthode. Affaiblissez simplement les types d'argument et
             et de retour et conservez une seule méthode.
          -->

        <call class="curam.creole.example.BestPracticeDevelopment"
          method="identifyMostRecentIncome_WeaklyTyped">
          <type>
            <ruleclass name="Income"/>
          </type>
          <arguments>
            <this/>
          </arguments>
        </call>
      </derivation>
    </Attribute>
  </Class>

</RuleSet>

Lorsque vous développez votre méthode statique, vous pouvez commencer par utiliser les classes java générées par CER comme types d'argument et/ou types de retour pour la méthode :

package curam.creole.example;

import java.util.List;

import curam.creole.execution.session.Session;
import
 curam.creole.ruleclass.Example_StaticMethodDevelopment.impl.Income;
import
 curam.creole.ruleclass.Example_StaticMethodDevelopment.impl.Person;

public class BestPracticeDevelopment {

  /**
   * Identifie le revenu le plus récent d'une personne.
   *
   * Notez que ce calcul peut être effectué à l'aide d'expressions CER
   * , mais s'affiche ici dans Java uniquement dans le but d'illustrer
   * l'utilisation des types générés lors du développement de méthodes Java statiques à utilise avec
   * CER.
   *
   * Cette méthode n'est adaptée qu'au développement ; pour
   * la production, voir
   * {@linkplain #identifyMostRecentIncome_WeaklyTyped} ci-dessous.
   *
   * En pratique, vous ne devez pas conserver deux versions de chaque
   * méthode. Affaiblissez simplement les types d'arguments et de retour
   * et conservez une seule méthode.
   */
  public static Income identifyMostRecentIncome_StronglyTyped(
      final Session session, final Person person) {

    Income mostRecentIncome = null;
    final List<? extends Income> incomes =
        person.incomes().getValue();
    for (final Income current : incomes) {
      if (mostRecentIncome == null
          || mostRecentIncome.paymentReceivedDate().getValue()
              .before(current.paymentReceivedDate().getValue())) {
        mostRecentIncome = current;
      }
    }

    return mostRecentIncome;
  }
}

Une fois que le fonctionnement de la méthode Java vous satisfait, vous devez affaiblir les types pour utiliser les objets règles dynamiques au lieu des classes Javagénérées (qui ne doivent pas être utilisées dans un environnement de production) :

/**
   * Identifie le revenu le plus récent d'une personne.
   *
   * Notez que ce calcul peut être effectué à l'aide
   * d'expressions CER, mais s'affiche ici dans Java uniquement dans le but d'illustrer
   * l'utilisation des types générés lors du développement de méthodes Java à utiliser
   * avec CER.
   *
   * Cette méthode n'est adapt& qu'à la production ; Pour le développement
   * initial, voir
   * {@linkplain #identifyMostRecentIncome_StronglyTyped} ci-dessus.
   *
   * En pratique, vous ne devez pas conserver deux versions de chaque
   * méthode. Affaiblissez simplement l'argument et retournez les types,
   * puis conservez une seule méthode.
   */
  public static RuleObject identifyMostRecentIncome_WeaklyTyped(
      final Session session, final RuleObject person) {

    RuleObject mostRecentIncome = null;
    final List<? extends RuleObject> incomes =
        (List<? extends RuleObject>) person.getAttributeValue(
            "incomes").getValue();
    for (final RuleObject current : incomes) {
      if (mostRecentIncome == null
          || ((Date) mostRecentIncome.getAttributeValue(
              "paymentReceivedDate").getValue())
              .before((Date) current.getAttributeValue(
                  "paymentReceivedDate").getValue())) {
        mostRecentIncome = current;
      }
    }

    return mostRecentIncome;

  }
ATTENTION :
Si vous modifiez l'implémentation d'une méthode statique, CER ne saura pas recalculer automatiquement les valeurs d'attribut qui ont été calculées à l'aide de l'ancienne version de votre méthode statique.

Une fois qu'une méthode statique a été utilisée dans un environnement de production pour les valeurs d'attribut enregistrées, plutôt que de modifier l'implémentation, vous devez créer une nouvelle méthode statique (avec la nouvelle implémentation requise) et modifier vos jeux de règles pour utiliser la nouvelle méthode statique. Lorsque vous publiez vos changements de jeux de règles pour désigner la nouvelle méthode statique, CER recalcule automatiquement toutes les instances des valeurs d'attribut affectées.

Toute méthode statique (ou méthode de propriété) appelée à partir de CER :