규칙 세트 해석기

CER에는 동적으로 정의된 규칙 세트를 실행할 수 있는 해석기가 포함되어 있습니다.

다음은 CER 규칙 세트 해석기를 사용하여 HelloWorldRuleSet의 규칙을 실행하는 샘플 코드입니다.

그림 1. 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 {

  /**
   * 독립형 Java 애플리케이션으로 클래스를 실행합니다.
   */
  public static void main(final String[] args) {

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

  /**
   * XML 소스 파일에서 HelloWorldRuleSet를 읽습니다.
   */
  private RuleSet getRuleSet() {

    /* 규칙 세트 소스 파일의 상대 경로 */
    final String ruleSetRelativePath = "./rules/HelloWorld.xml";

    /* 규칙 세트 소스에서 읽기 */
    final RuleSetXmlReader ruleSetXmlReader =
        new RuleSetXmlReader(ruleSetRelativePath);

    /* 문제점 덤프 */
    ruleSetXmlReader.validationProblemCollection().printProblems(
        System.err);

    /* 규칙 세트에 오류가 있는 경우 실패 */
    assertTrue(!ruleSetXmlReader.validationProblemCollection()
        .containsErrors());

    /* 리더에서 규칙 세트 리턴 */
    return ruleSetXmlReader.ruleSet();
  }

  /**
   * 완전히 동적인 CER 규칙 세트 해석기를 사용하는
   * 간단한 테스트 케이스입니다.
   */
  public void testUsingInterpreter() {

    /* 규칙 세트에서 읽기 */
    final RuleSet ruleSet = getRuleSet();

    /* 해석된 규칙 오브젝트를 작성하는 세션 시작 */
    final Session session =
        Session_Factory.getFactory().newInstance(
            new RecalculationsProhibited(),
            new InMemoryDataStorage(
                new InterpretedRuleObjectFactory()));

    /* 필수 규칙 클래스의 규칙 오브젝트 인스턴스 작성 */
    final RuleObject helloWorld =
        session.createRuleObject(ruleSet.findClass("HelloWorld"));

    /*
     * 규칙 오브젝트의 "greeting" 규칙 속성에 액세스 -
     * 결과는 예상 유형(String)으로 캐스트해야 함
     */
    final String greeting =
        (String) helloWorld.getAttributeValue("greeting")
            .getValue();

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

}

이 샘플 클래스를 독립형 Java 애플리케이션(즉, main 메소드를 통해) 또는 JUnit 테스트로 실행할 수 있습니다. 이 클래스를 실행하는 두 가지 방법은 단순히 편의를 위해 제공되므로, 사용자가 직접 규칙 세트를 실행하는 코드를 작성할 때 사용자에게 보다 적합한 아무 방법이나 선택하십시오.

이제 이 코드의 세부사항을 자세히 살펴봅니다. 테스트 메소드 testUsingInterpreter가 다음과 같은 주요 기능을 수행합니다.