애플리케이션의 classpath에 있는 모든 Java 클래스는 CER 규칙 세트의 데이터 유형으로 사용할 수 있습니다.
CER에는 가장 일반적으로 사용되는 데이터 유형의 유형 핸들러가 포함되어 있습니다.
Java 클래스의 이름은 다음 패키지의 클래스를 제외한 패키지 이름을 포함하는 완전한 이름이어야 합니다.
<?xml version="1.0" encoding="UTF-8"?> <RuleSet name="Example_javaclassDataType" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation= "http://www.curamsoftware.com/CreoleRulesSchema.xsd"> <Class name="Person"> <Attribute name="isMarried"> <type> <!-- java.lang.Boolean은 패키지를 지정하지 않아도 됩니다. --> <javaclass name="Boolean"/> </type> <derivation> <specified/> </derivation> </Attribute> <Attribute name="dateOfBirth"> <type> <!-- Cúram 클래스에 대한 완전한 이름 --> <javaclass name="curam.util.type.Date"/> </type> <derivation> <specified/> </derivation> </Attribute> </Class> </RuleSet>
CER의 핵심 원칙은 각 값을 계산한 후에는 변경할 수 없다는 점입니다.
이 원칙을 준수하려면 사용하는 모든 Java 클래스가 불변이어야 합니다.
일반적으로 대부분의 데이터 유형 요구사항을 만족시키는 다양한 범위의 불변 클래스가 있습니다. 일반적으로 Java 클래스의 JavaDoc을 참조하여 클래스가 불변인지 판별해야 합니다.
사용자의 요구사항을 충분히 충족시킬 가능성이 매우 큰 몇 가지 유용한 불변 클래스가 다음과 같이 나열되어 있습니다.
CER은 Java 클래스와 인터페이스의 상속 계층 구조를 인식합니다.
CER에서는 상위 Java 클래스나 인터페이스 중 하나에서 필요할 때마다 Java 클래스 값을 리턴할 수 있습니다.
<?xml version="1.0" encoding="UTF-8"?> <RuleSet name="Example_javaclassInheritance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation= "http://www.curamsoftware.com/CreoleRulesSchema.xsd"> <Class name="Person"> <Attribute name="isMarried"> <type> <javaclass name="Boolean"/> </type> <derivation> <specified/> </derivation> </Attribute> <Attribute name="isMarriedAsObject"> <type> <!-- 예를 들기 위해, 이 값을 java.lang.Object("실제" 규칙 세트에서는 유용하지 않음)로 리턴합니다. --> <javaclass name="Object"/> </type> <derivation> <!-- 부울이 오브젝트이므로 정상입니다. --> <reference attribute="isMarried"/> </derivation> </Attribute> <Attribute name="isMarriedAsString"> <type> <javaclass name="String"/> </type> <derivation> <!-- CER 규칙 세트 유효성 검증기가 아래에 오류를 보고합니다(부울이 문자열이 아니기 때문). ERROR Person.isMarriedAsString Example_javaclassInheritance.xml(28, 41) 하위 'reference'가 'java.lang.Boolean'을 리턴하지만 이 항목에는 'java.lang.String'이 필요합니다. --> <!-- <reference attribute="isMarried"/> --> <!-- (이 예제가 오류없이 빌드되도록 지정된 대로 선언) --> <specified/> </derivation> </Attribute> </Class> </RuleSet>
Java 5에서는 매개변수화된 클래스 지원이 도입되었으며 CER을 사용하여 규칙 세트에서 매개변수화된 Java 클래스를 사용할 수 있습니다.
매개변수화된 클래스의 매개변수가 <javaclass> 선언에 나열됩니다.
<?xml version="1.0" encoding="UTF-8"?> <RuleSet name="Example_javaclassParameterized" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation= "http://www.curamsoftware.com/CreoleRulesSchema.xsd"> <Class name="Person"> <Attribute name="favoriteWords"> <type> <!-- 문자열 목록 --> <javaclass name="List"> <javaclass name="String"/> </javaclass> </type> <derivation> <specified/> </derivation> </Attribute> <Attribute name="luckyNumbers"> <type> <!-- 숫자 목록 --> <javaclass name="List"> <javaclass name="Number"/> </javaclass> </type> <derivation> <specified/> </derivation> </Attribute> <Attribute name="children"> <!-- Person 규칙 오브젝트의 목록입니다. java.util.List는 임의의 오브젝트로 매개변수화될 수 있으므로 규칙 클래스를 매개변수로 사용할 수 있습니다. --> <type> <javaclass name="List"> <ruleclass name="Person"/> </javaclass> </type> <derivation> <specified/> </derivation> </Attribute> <!-- 이 사람이 소유한 개입니다. --> <Attribute name="dogs"> <type> <javaclass name="List"> <ruleclass name="Dog"/> </javaclass> </type> <derivation> <specified/> </derivation> </Attribute> <!-- 이 사람이 소유한 고양이입니다. --> <Attribute name="cats"> <type> <javaclass name="List"> <ruleclass name="Cat"/> </javaclass> </type> <derivation> <specified/> </derivation> </Attribute> <!-- 이 사람이 소유한 모든 애완동물입니다. --> <Attribute name="pets"> <type> <javaclass name="List"> <ruleclass name="Pet"/> </javaclass> </type> <derivation> <joinlists> <fixedlist> <listof> <javaclass name="List"> <ruleclass name="Pet"/> </javaclass> </listof> <members> <!-- 모든 개 - 개는 애완동물의 유형입니다. --> <reference attribute="dogs"/> <!-- 모든 고양이 - 고양이는 애완동물의 유형입니다. --> <reference attribute="cats"/> <!-- CER에서는 이 표현식에 "children"을 사용할 수 없습니다. 아동이 사랑스럽거나 가구를 긁어놓을 수는 있지만 이에 상관없이 애완동물은 아닙니다. --> <!-- 사용할 수 없음 --> <!-- <reference attribute="children"/> --> <!-- 사용할 수 없음 --> </members> </fixedlist> </joinlists> </derivation> </Attribute> </Class> <Class abstract="true" name="Pet"> <Attribute name="name"> <type> <javaclass name="String"/> </type> <derivation> <specified/> </derivation> </Attribute> </Class> <Class name="Dog" extends="Pet"> <Attribute name="favoriteTrick"> <type> <javaclass name="String"/> </type> <derivation> <specified/> </derivation> </Attribute> </Class> <Class name="Cat" extends="Pet"> <Attribute name="numberOfLives"> <type> <javaclass name="Number"/> </type> <derivation> <!-- 고양이의 목숨은 9개라는 사실은 잘 알려져 있습니다. --> <Number value="9"/> </derivation> </Attribute> </Class> </RuleSet>
CER에서는 java.lang.Object를 허용하는 매개변수에 모든 유형(규칙 오브젝트 포함)을 사용할 수 있습니다. 매개변수(예: 규칙 클래스)가 동적으로 정의되어도 CER이 "명백한 유형 지정"을 강제 시행합니다. CER은 매개변수화된 하나의 클래스를 다른 클래스에 지정할 수 있는지 여부를 결정할 때 규칙 클래스의 상속 계층 구조도 인식합니다.