Exemple

Voici un exemple de jeu de règles :

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

    <!-- Ces attributs doivent être spécifiés lors de la création -->
    <Initialization>
      <Attribute name="firstName">
        <type>
          <javaclass name="String"/>
        </type>
      </Attribute>

      <Attribute name="lastName">
        <type>
          <javaclass name="String"/>
        </type>
      </Attribute>
    </Initialization>

    <Attribute name="incomes">
      <type>
        <javaclass name="List">
          <ruleclass name="Income"/>
        </javaclass>
      </type>
      <derivation>
        <!-- Lisez tous les objets de règle de
              type Income -->
        <readall ruleclass="Income"/>
      </derivation>
    </Attribute>

  </Class>

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

  </Class>

</RuleSet>

Dans le jeu de règles ci-dessus, l'expression readall est utilisée pour extraire toutes les instances de la classe de règles Income.

Pour créer un objet de règle externe, votre code client ou les tests doit indiquer la session lors de la création de l'objet de règle :

package curam.creole.example;

import junit.framework.TestCase;
import curam.creole.calculator.CREOLETestHelper;
import curam.creole.execution.RuleObject;
import curam.creole.execution.session.InterpretedRuleObjectFactory;
import curam.creole.execution.session.RecalculationsProhibited;
import curam.creole.execution.session.Session;
import curam.creole.execution.session.Session_Factory;
import
 curam.creole.execution.session.StronglyTypedRuleObjectFactory;
import curam.creole.parser.RuleSetXmlReader;
import
 curam.creole.ruleclass.Example_externalRuleObjects.impl.Income;
import
 curam.creole.ruleclass.Example_externalRuleObjects.impl.Income_Factory;
import
 curam.creole.ruleclass.Example_externalRuleObjects.impl.Person;
import
 curam.creole.ruleclass.Example_externalRuleObjects.impl.Person_Factory;
import curam.creole.ruleitem.RuleSet;
import curam.creole.storage.inmemory.InMemoryDataStorage;

/**
 * Teste les objets de règle externes créés directement par le code client.  */
public class TestCreateExternalRuleObjects extends TestCase {

  /**
   * Exemple illustrant la création d'objets de règle externes à l'aide de
   * code généré.    */
  public void testUsingGeneratedTestClasses() {

    final Session session =
        Session_Factory.getFactory().newInstance(
            new RecalculationsProhibited(),
            new InMemoryDataStorage(
                new StronglyTypedRuleObjectFactory()));

    /**
     * Notez que le compilateur impose que le type approprié
     * d'arguments d'initialisation soit fourni.
     */
    final Person person =
        Person_Factory.getFactory().newInstance(session, "John",
            "Smith");
    CREOLETestHelper.assertEquals("John", person.firstName()
        .getValue());

    /**
     * Ces objets sont extraits par l'expression      *
     * <readall ruleclass="Income"/>
     *
     * dans le jeu de règles.      */
    final Income income1 =
        Income_Factory.getFactory().newInstance(session);
    income1.amount().specifyValue(123);

    final Income income2 =
        Income_Factory.getFactory().newInstance(session);
    income2.amount().specifyValue(345);

  }

  /**
   * Exemple illustrant la création d'objets de règle externes à l'aide de
   * l'interpréteur de jeu de règles CER.
   */
  public void testUsingInterpreter() {

    /* read in the rule set */
    final RuleSet ruleSet = getRuleSet();

    /* start an interpreted session */
    final Session session =
        Session_Factory.getFactory().newInstance(
            new RecalculationsProhibited(),
            new InMemoryDataStorage(
                new InterpretedRuleObjectFactory()));

    /**
     * Notez que le compilateur ne peut pas imposer que le type approprié
     * d'argument d'initialisation soit fourni - si ces arguments ne sont pas corrects
     * CER signale une erreur lors de l'exécution.      */
    final RuleObject person =
        session.createRuleObject(ruleSet.findClass("Person"),
            "John", "Smith");
    CREOLETestHelper.assertEquals("John", person
        .getAttributeValue("firstName").getValue());

    /**
     * Ces objets sont extraits par l'expression      *
     * <readall ruleclass="Income"/>
     *
     * dans le jeu de règles.      */
    final RuleObject income1 =
        session.createRuleObject(ruleSet.findClass("Income"));
    income1.getAttributeValue("amount").specifyValue(123);

    final RuleObject income2 =
        session.createRuleObject(ruleSet.findClass("Income"));
    income2.getAttributeValue("amount").specifyValue(345);
  }

  /**
   * Lit Example_externalRuleObjects à partir de son fichier XML
   * source.
   */
  private RuleSet getRuleSet() {

    /* Le chemin relatif du fichier source du jeu de règles */
    final String ruleSetRelativePath =
        "./rules/Example_externalRuleObjects.xml";

    /* lire dans la source du jeu de règles */
    final RuleSetXmlReader ruleSetXmlReader =
        new RuleSetXmlReader(ruleSetRelativePath);

    /* éliminer les problèmes éventuels */
    ruleSetXmlReader.validationProblemCollection().printProblems(
        System.err);

    /* échec en cas d'erreurs dans le jeu de règles */
    assertTrue(!ruleSetXmlReader.validationProblemCollection()
        .containsErrors());

    /* renvoyer le jeu de règles à partir du lecteur */
    return ruleSetXmlReader.ruleSet();
  }

}