call

복합 계산을 수행하도록 정적 Java 메소드를 호출합니다.

call 표현식은 다음을 선언합니다.

Java 메소드는 규칙 세트 유효성 검증 시 클래스 경로에 있는 클래스에 있어야 합니다. 메소드의 첫 번째 인수는 Session 오브젝트이어야 하며 나머지 인수는 규칙 세트에 지정된 인수와 일치해야 합니다.

경고: call 표현식이 호출한 모든 Java 코드가 규칙 오브젝트 속성의 값을 변경하지 않도록 확인해야 합니다.

일반적으로 CER 규칙 세트는 불변 데이터 유형을 사용하지만 변경 가능한 고유 Java 클래스를 데이터 유형으로 사용할 수 있습니다. 이 경우, 호출된 코드로 인해 사용자 정의 Java 데이터 유형의 값이 수정되지 않도록 확인해야 합니다. 값이 수정되면 이전에 수행된 계산이 이제 "잘못"된 계산이 될 수 있습니다.

package curam.creole.example;

import curam.creole.execution.RuleObject;
import curam.creole.execution.session.Session;

public class Statics {

  /**
   * 개인이 가장 좋아하는 색상을 계산합니다.
   *
   * 규칙의 경우 이 계산은 너무 복잡하므로
   * java로 코딩되었습니다.
   *
   * @param session
   *          규칙 세션
   * @param person
   *          개인
   * @return 계산된 지정된 개인이 가장 좋아하는 색상
   */
  public static String calculateFavoriteColor(
      final Session session, final RuleObject person) {

    // 검색한 속성 값은 올바른 유형으로
    // 캐스트해야 함
    final String name =
        (String) person.getAttributeValue("name").getValue();
    final Number age =
        (Number) person.getAttributeValue("age").getValue();

    final String ageString = age.toString();
    // 나이와 이름의 숫자에 따라 개인이 가장 좋아하는
    // 색상을 계산합니다.
    if (ageString.contains("5") || ageString.contains("7")) {
      return "Blue";
    } else if (name.contains("z")) {
      return "Purple";
    } else {
      return "Green";
    }

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

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

    <Attribute name="name">
      <type>
        <javaclass name="String"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <Attribute name="favoriteColor">
      <type>
        <javaclass name="String"/>
      </type>
      <derivation>
        <!-- 계산을 수행하도록 java 정적
             메소드 호출 -->
        <call class="curam.creole.example.Statics"
          method="calculateFavoriteColor">
          <type>
            <javaclass name="String"/>
          </type>
          <arguments>
            <!-- 이 개인을 인수로
                 정적 메소드에
                 전달 -->
            <this/>
          </arguments>
        </call>
      </derivation>
    </Attribute>

  </Class>

</RuleSet>
경고:
Cúram V6부터 CER과 종속성 관리자에서는 종속성이 변경되는 경우 CER 계산된 값을 자동으로 다시 계산할 수 있습니다.

정적 메소드의 구현을 변경하면 CER과 종속성 관리자가 이전 버전의 정적 메소드를 사용하여 계산된 속성 값을 다시 계산해야 한다는 사실을 자동으로 알지 못합니다.

프로덕션 환경에서 저장된 속성 값에 대해 정적 메소드를 사용한 경우 구현을 변경하는 대신 새 정적 메소드(필요한 새 구현을 포함)를 작성한 다음 규칙 세트가 새 정적 메소드를 사용하도록 변경해야 합니다. 새 정적 메소드를 가리키도록 규칙 세트 변경사항을 공개하면 CER과 종속성 관리자가 영향받은 속성 값의 모든 인스턴스를 자동으로 다시 계산합니다.