Interpréteur de jeu de règles

CER contient un interpréteur capable d'exécuter des jeux de règles définis dynamiquement.

Vous trouverez ci-dessous un exemple de code qui utilise l'interpréteur de jeu de règles CER pour exécuter des règles à partir d'un jeu de règles HelloWorldRuleSet.

Figure 1. Exécution de règles avec l'interpréteur de jeu de règles CER
package curam.creole.example;

import junit.framework.TestCase;
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.parser.RuleSetXmlReader;
import curam.creole.ruleitem.RuleSet;
import curam.creole.storage.inmemory.InMemoryDataStorage;

public class TestHelloWorldInterpreted extends TestCase {

  /**
   * Exécute la classe en tant qu'application Java autonome.
   */
  public static void main(final String[] args) {

    final TestHelloWorldInterpreted testHelloWorld =
        new TestHelloWorldInterpreted();
    testHelloWorld.testUsingInterpreter();
  }

  /**
   * Lit le jeu de règles HelloWorldRuleSet à partir de son fichier source XML.
   */
  private RuleSet getRuleSet() {

    /* Chemin d'accès relatif au fichier source du jeu de règles */
    final String ruleSetRelativePath = "./rules/HelloWorld.xml";

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

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

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

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

  /**
   * Scénario de test simple, utilisant l'interpréteur de jeu de règles CER
   * dynamique complet.
   */
  public void testUsingInterpreter() {

    /* lecture du jeu de règles */
    final RuleSet ruleSet = getRuleSet();

    /* démarre une session qui crée des objets de règles interprétés */
    final Session session =
        Session_Factory.getFactory().newInstance(
            new RecalculationsProhibited(),
            new InMemoryDataStorage(
                new InterpretedRuleObjectFactory()));

    /* crée une instance d'objet de règle de la classe de règles obligatoire */
    final RuleObject helloWorld =
        session.createRuleObject(ruleSet.findClass("HelloWorld"));

    /*
     * Accès à l'attribut de règle "greeting" sur l'objet de règle -
     * le résultat doit être transtypé selon le type attendu (String)
     */
    final String greeting =
        (String) helloWorld.getAttributeValue("greeting")
            .getValue();

    System.out.println(greeting);
    assertEquals("Hello, world!", greeting);
  }

}

Vous pouvez exécuter cet exemple de classe en tant qu'application Java autonome (c'est-à-dire via sa méthode main) ou en tant que test JUnit. Ces deux manières d'exécuter cette classe sont proposées simplement pour plus de praticité ; aussi, lorsque vous écrivez votre propre code pour exécuter des jeux de règles, choisissez celle qui vous convient le mieux.

Examinons maintenant ce code en détail. La méthode de test testUsingInterpreter effectue les fonctions clés suivantes :