주메뉴 바로가기 본문 바로가기 하단 바로가기

고객지원

기술문의

Hello World 프로그램 만들기

  • 이우항
  • 2002.10.02
  • 조회수 2,119
안녕하세요? JRules 기술 지원을 담당하고 있는 이우항입니다.

프로그래밍 언어을 처음 배울 때 접하게 되는 Hello World 프로그램을 JRuels를 이용하여 작성하도록 하겠습니다.

3개의 파일로 구성됩니다.
Main.java 파일은 java application과 JRules rule engine을 연동하는 클래스 파일입니다.
Hello.java 파일은 engine에서 사용되는 모델입니다.
ruleset.ilr 파일은 비즈니스 로직 즉, rule을 저장한 파일입니다.


///////////////////////////////////////// Main.java -BEGIN
ackage helloworld;
import ilog.rules.engine.*;

public class Main {

public static void main(String[] args) {

// rule의 내용을 저장할 ruleset 객체를 생성합니다.
IlrRuleset ruleset = new IlrRuleset();

// rule 파일을 파싱하여 그 내용을 위에서 생성한
// ruleset 객체에 저장합니다.
if(!ruleset.parseFileName(\"ruleset.ilr\")){
// rule 파일에 문법 에러가 있으면 에러 메세지를
// 표시합니다.
System.out.println(\"Parsing error!\");
System.exit(1);
}

// 위 과정에서 생성된 ruleset을 이용할 rule engine 객체를
// 생성합니다.
IlrContext engine = new IlrContext(ruleset);

// rule engine에서 처리하게 될 모델의 객체를 생성하고
// engine에 등록합니다.
Hello hello = new Hello();
engine.assert(hello);
// 특정 객체가 engine에 등록되면 그 객체가 등록되었을 때
// 실행하도록 만들어진 rule이 있는지 검색합니다.

// 현재 실행되어야 할 rule이 있으면, 그 rule을 실행
// 시킵니다.
engine.fireAllRules();

}
}

///////////////////////////////////////// Main.java -END

///////////////////////////////////////// Hello.java -BEGIN
package helloworld;

public class Hello {

public Hello() {
}
}
///////////////////////////////////////// Hello.java -END

///////////////////////////////////////// ruleset.ilr -BEGIN
import helloworld.*;
import java.lang.*;
import java.io.*;


/** engine에 Hello 객체가 등록되면
\"Hello World\"를 화면 표시하시오
*/
rule helloWorld
{

when
{
Hello();
}

then
{
System.out.println(\"Hello World!!\");
}
};

///////////////////////////////////////// ruleset.ilr -END

댓글 1

  • 이우항2001-09-17
    안녕하세요?
    정말 오랫만이네요...^^

    질문에 대한 답변은 아랫 소스를 참고 하세요.
    그리고, Factory API를 이용하여 아래와 같이 룰을 편집하는 것도 가능합니다만, ILOG JRules에서 제공하는 Business Rule Language를 이용하여 사용자가 쉽게 룰을 편집할 수 있습니다. 한 번 검토해보시기 바랍니다.


    :IlrUnaryTest test = (IlrUnaryTest)obj;
    :if(test.getArgument() instanceof IlrMethodInvocation) {
    : IlrMethodInvocation arg =
    : (IlrMethodInvocation)test.getArgument();
    : Object argObj = arg.getObject();
    : String columnName = null;
    : if(argObj instanceof IlrMethodInvocation) {
    : IlrMethodInvocation arg_1 = (IlrMethodInvocation)argObj;

    ///////////////////////////////////////
    String methodName = arg_1.getMethod().getName();
    Class returnType = arg_1.getMethod().getReturnType();
    System.out.println(\"method name is \"+methodName);
    System.out.println(\"return type \"+returnType.getName());
    IlrValue[] args = arg_1.getArguments();
    for(int i=0; i<args.length; i++){
    System.out.println(i+\" argument type = \"+args[i].getType().getName());//+argTypes[i].toString());
    }
    //////////////////////////////////////////

    : Object argObj_1 = arg_1.getObject();
    : String columnName_1 = null;
    : if(argObj_1 instanceof IlrObjectValue) {
    : //
    : // 문제는 여기..
    : // IlrObjectValue에서 어떻게 method 의 이름이나
    : // argument 정보, 타입
    : // return 정보, 타입 등 필요한 정보를 꺼내올수 있나요?
    : //
    : }



    :남인재님의 글입니다.

    :안녕하세요~
    :오랜만에 들어왔더니~ 화~악 바뀌었네요?
    :음~
    :
    :우선 제가 하고자 하는 것은
    :ilr 화일을 parsing 해서 제가 원하는 형태로 출럭을 하는 것입니다..
    :
    :간단하게 이렇게 생긴 룰이 있습니다..
    :rule Test
    :{
    : when
    : {
    : ?userObj: customer(AGE.longValue() < 20;
    : MOrder(\"9\").equals(\"Pro123\"));
    : }
    : then
    : {
    : execute
    : {
    : ?userObj.setmessage(?userObj.NAME + \" 님.~~~~~\");
    : }
    : }
    :};
    :
    :이 룰을 parsing 해서 제가 원하는 형태는
    :조건 : (나이 < 20) 그리고 (9월 구매상품아이디 = Pro123)
    :결과 : 남인재님 ~~~~~
    :
    :모 이렇게 나오게 하려는 것이 최종 목표입니다.
    :물론, Age가 \'나이\' 이고, MOrder가 \'월 구매상품아이디\'라는 것은 xml로 어딘가 정의 되어 있으므로 Method 명이나 attribute 이름을 넘기면 가져올수 있는 module은 있구요...
    :
    :
    :그럼~ 이제 질문 들어갑니다..
    :
    :AGE.longValue() < 20 이경우에는 condition의 class가 IlrBinaryTest 루 해서 제가 원하는 대로 가져 오는데요..
    :
    :MOrder(\"9\").equals(\"Pro123\")의 경우 우선 IlrUnaryTest 로 가서..
    :\'obj\'가 이 condition 입니다...
    :
    :IlrUnaryTest test = (IlrUnaryTest)obj;
    :if(test.getArgument() instanceof IlrMethodInvocation) {
    : IlrMethodInvocation arg =
    : (IlrMethodInvocation)test.getArgument();
    : Object argObj = arg.getObject();
    : String columnName = null;
    : if(argObj instanceof IlrMethodInvocation) {
    : IlrMethodInvocation arg_1 =
    : (IlrMethodInvocation)argObj;
    : Object argObj_1 = arg_1.getObject();
    : String columnName_1 = null;
    : if(argObj_1 instanceof IlrObjectValue) {
    : //
    : // 문제는 여기..
    : // IlrObjectValue에서 어떻게 method 의 이름이나
    : // argument 정보, 타입
    : // return 정보, 타입 등 필요한 정보를 꺼내올수 있나요?
    : //
    : }
    : :
    : :
    :
    :질문이 어수선해서~ 전달이 잘 되었나 모르겠네요~
    :하지만 이해하시리라 믿고~ 그럼 꼭 좀 알려주세요...
    :
    아이콘삭제

댓글 입력