<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>Drools</title>
    <description>规则引擎在电信、金融业有广阔的应用空间。
Drools是基于Charles Forgy的RETE算法的开源规则引擎实现。
</description>
    <link>http://drools.group.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>CLI监测方式 CLI（Command Line Interface） telent方式进行数据采集</title>
        <author>hongliangpan</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hongliangpan.javaeye.com">hongliangpan</a>&nbsp;
          链接：<a href="http://drools.group.javaeye.com/group/blog/218649" style="color:red;">http://drools.group.javaeye.com/group/blog/218649</a>&nbsp;
          发表时间: 2008年07月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          telent方式进行数据采集 CLI监测方式<br />CLI（Command Line Interface）监测方式适用于目标主机登录操作系统需要身份验证的Unix或者Linux平台、windows、网络设备。三种访问方式：telnet、agent、ssh。<br />CLI监测方式通过执行远程命令对适用的目标主机通过选定的访问方式进行监测的访问，<br />采用命令模板方式进行配置<br />需要信息：<br />端口<br />版本<br />命令提示符<br />登陆提示<br />密码提示<br />用户及口令<br />超时时间<br />重试等
          <br/>
          <span style="color:red;">
            <a href="http://drools.group.javaeye.com/group/blog/218649#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 23 Jul 2008 17:13:34 +0800</pubDate>
        <link>http://drools.group.javaeye.com/group/blog/218649</link>
        <guid>http://drools.group.javaeye.com/group/blog/218649</guid>
      </item>
      <item>
        <title>使用JBoss Drools实现Hanoi Tower程序</title>
        <author>zhangcheng</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zhangcheng.javaeye.com">zhangcheng</a>&nbsp;
          链接：<a href="http://drools.group.javaeye.com/group/blog/217697" style="color:red;">http://drools.group.javaeye.com/group/blog/217697</a>&nbsp;
          发表时间: 2008年07月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近在学习规则推理引擎，主要是在看JBoss Drools，有了一点点入门，自己写个例子练习一下，同时也和初学的同学们分享交流。<br />规则定义的代码如下：Hanoi.drl<br /><pre name="code" class="java">
package com.sample.hanoi

/*

	

*/
#list any import classes here.


#declare any global variables here

rule "apply for the n=1"
	when
		#conditions
		h : Hanoi( sequence == 1 )
	then 
		#actions
		System.out.println( h.getOne() + " -> " + h.getThree() );
		
end


rule "apply for the n>1."
	#include attributes such as "salience" here...
	when
		#conditions
		h : Hanoi( sequence > 1 )
	then 
		#actions
		insert( new Hanoi( h.getSequence() - 1,h.getTwo(),h.getOne(),h.getThree() ) );
		insert( new Hanoi( 1, h.getOne(), h.getTwo(), h.getThree()) );
		insert( new Hanoi( h.getSequence() - 1,h.getOne(),h.getThree(),h.getTwo() ) );
		
end
</pre><br /><br />以上是Hanoi算法的规则表示，是比较简单的，主要注意两个问题：<br />首先，我采用的是Drools官方示例中的Fibonacci的例子的解决办法，引入了一个sequence的变量，这个变量是来记录有多少层塔的。<br />其次，大家在看代码的时候，可能注意到了，在"apply for the n>1."规则的后件中的顺序与我们平常写得Hanoi程序正好相反，这是为什么呢？原来这是Drools冲突解决策略的一种方案。<br />Drools的冲突解决的方案主要两种：<br />第一种：Salience，即优先级策略。用户可以为某个 rule 指定一个高一点的优先级（通过附给它一个比较大的数字）。高 Salience 的 rule 将会被优先激发。<br />第二种：LIFO，当规则的salience相同，又出现执行顺序冲突时，按照LIFO（后进先出）策略<br />我这里是利用了第二种策略，所以顺序正好相反。<br />下面是Hanoi的Bean类和程序的主类：<br /><pre name="code" class="java">
public class Hanoi {

	private String one;
	private String two;
	private String three;
	
	private int sequence;

	public Hanoi() {
		super();
	}

	public Hanoi(int sequence) {
		super();
		this.sequence = sequence;
	}
	
	

	public Hanoi(int sequence, String one, String two, String three ) {
		super();
		this.one = one;
		this.two = two;
		this.three = three;
		this.sequence = sequence;
	}

	/**
	 * @return the sequence
	 */
	public int getSequence() {
		return sequence;
	}

	/**
	 * @param sequence the sequence to set
	 */
	public void setSequence(int sequence) {
		this.sequence = sequence;
	}

	/**
	 * @return the one
	 */
	public String getOne() {
		return one;
	}

	/**
	 * @param one the one to set
	 */
	public void setOne(String one) {
		this.one = one;
	}

	/**
	 * @return the two
	 */
	public String getTwo() {
		return two;
	}

	/**
	 * @param two the two to set
	 */
	public void setTwo(String two) {
		this.two = two;
	}

	/**
	 * @return the three
	 */
	public String getThree() {
		return three;
	}

	/**
	 * @param three the three to set
	 */
	public void setThree(String three) {
		this.three = three;
	}
	
	
}

public class HanoiExample {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception  {
		final PackageBuilder builder = new PackageBuilder();
        builder.addPackageFromDrl( new InputStreamReader( FibonacciExample.class.getResourceAsStream( "/Hanoi.drl" ) ) );

        final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
        ruleBase.addPackage( builder.getPackage() );

        final StatefulSession session = ruleBase.newStatefulSession();
        
        session.insert( new Hanoi( 4, "A", "B", "C" ) );

        session.fireAllRules();

        session.dispose(); // Stateful rule session must always be disposed when finished
	}
</pre><br /><br />这是我自己尝试的第一个例子，在写规则的时候，我觉还是有很多问题的，最主要的就是：如何更好的里利用drools提供的功能，写出精炼的规则？还有很多的隐藏的规则如何发现？这些都是需要多多经验的，希望能够和大家讨论，共同进步。
          <br/>
          <span style="color:red;">
            <a href="http://drools.group.javaeye.com/group/blog/217697#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 22 Jul 2008 11:17:33 +0800</pubDate>
        <link>http://drools.group.javaeye.com/group/blog/217697</link>
        <guid>http://drools.group.javaeye.com/group/blog/217697</guid>
      </item>
      <item>
        <title>DROOLS语法详解</title>
        <author>shanghui_12</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://shanghui-12.javaeye.com">shanghui_12</a>&nbsp;
          链接：<a href="http://drools.group.javaeye.com/group/blog/190294" style="color:red;">http://drools.group.javaeye.com/group/blog/190294</a>&nbsp;
          发表时间: 2008年05月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一个典型的DRL文件：<br /><pre name="code" class="java">①package com.sample   //包名，不可以与关键字冲突
②import com.sample.DroolsTest.Message;//本文件需要导入的类
③global java.util.List myGlobalList;//全局变量
④//定义函数体
function String hello(String name) {
    return "Hello "+name+"!";
}

⑤rule "myRule"  
no-loop true  //执行一次后，是否能被再次激活
salience 100  //优先级别
⑥when  
m : Message( status == Message.HELLO, message : message ) 
⑦then    
m.setMessage( "Goodbye cruel world" );
		m.setStatus( Message.GOODBYE );
		update( m );
    myGlobalList.add( "Hello World" );//使用global 变量
    System.out.println( hello( "Bob" ) );//调用定义函数
End
</pre><br /><br /><br />①package com.sample<br />包名，不可以与关键字冲突。一个包通过名称空间描绘，这样很好的保持了一组规则的独立性。<br />②import<br />标记就像java中的含义一样。对于任何要用在规则中的对象，你需要指定完整的路径和类型名。Drools从同名的java包中自动导入类。<br />③global<br />如果多个包定义了同样名称的全局变量，它们必须使用同样的类型，并且全部指向同一个全局值。全部变量通常用来返回数据，获得提供数据或服务给规则使用。为了使用全局变量，你必须：<br />在规则文件中声明全局变量并使用它，如：<br />global java.util.List myGlobalList;<br />rule "Using a global"<br />when<br />    eval( true )<br />then<br />    myGlobalList.add( "Hello World" );<br />end<br />在working memory上设置全局变量的值。最好是在将fact插入working memory之前设置完所有全局变量，如：<br />List list = new ArrayList();<br />WorkingMemory wm = rulebase.newStatefulSession();<br />wm.setGlobal( "myGlobalList", list );<br />④function<br />相对于正常的java类，函数是在你的规则代码中放置语言代码的方法。它们不可能做任何超过你可以在帮助类（在java中定义，被设置入规则的Working Memory中的类）中做到的事情。使用函数的优点是可以将逻辑保存在一个地方，并且你可以在需要的时候改变函数（这样做各有优缺点）。函数最大的用处是被规则的推论（then）部分中的行为所调用，特别是当一个行为操作需要反复被调用时（将公用代码抽取出来成为一个函数）。<br />⑤rule 名称可以在“”下取任何名字。<br />属性列表：<br />属性	类型	默认值	功能描述<br />no-loop	Boolean	false	设置no-loop为true可以阻止该规则被再次激活。<br />salience	integer	0	优先级数字高的规则会比优先级低的规则先执行。<br />agenda-group	String	MAIN	只有在具有焦点的agenda group中的规则才能够激发。<br />auto-focus	Boolean	false	如果该规则符合激活条件，则该规则所在agenda-group自动获得焦点，允许规则激发。<br />activation-group	String	N/A	在同名activation-group中的规则将以互斥的方式激发<br />dialect	String	"java" or "mvel"	指定在LHS代码表达式或RHS代码块中使用的语言。<br /> date-effective	String, 包含日期/时间定义	N/A	规则只能在date-effective指定的日期和时间之后激活。<br />date-exptires	String, 包含日期/时间定义	N/A	如果当前时间在date-expires指定的时间之后，规则不能激活。<br /><br />duration	long	N/A	指出规则将在指定的一段时间后激发，如果那个时候规则的激活条件还是处于true的情况下。<br />⑥  LHS (when) 条件元素<br />为了能够引用匹配的对象，使用一个模式绑定变量如‘$c’。变量的前缀使用的$是可选的，但是在复杂的规则中它会很方便用来区别变量与字段的不同。<br />$c : Cheese( type == "stilton", price &lt; 10, age == "mature" )<br />&& 和|| 约束连接符<br />Cheese( type == "stilton" && price &lt; 10, age == "mature" )<br />Cheese( type == "stilton" || price &lt; 10, age == "mature" ) <br />第一个有两个约束而第二个组有一个约束，可以通过圆括号来改变求值的顺序。<br />单值约束<br />Matches 操作<br />Cheese( type matches "(Buffalo)?\S*Mozerella" )<br />Cheese( type not matches "(Buffulo)?\S*Mozerella" )<br />Contains 操作<br />CheeseCounter( cheeses contains "stilton" )<br />CheeseCounter( cheeses not contains "cheddar" ) <br />memberof操作<br />CheeseCounter( cheese memberof $matureCheeses )<br />CheeseCounter( cheese not memberof $matureCheeses )<br />字符串约束<br />字符串约束是最简单的约束格式，将字段与指定的字符串求值：数值，日期，string或者boolean。<br />Cheese( quantity == 5 )<br />Cheese( bestBefore &lt; "27-Oct-2007" )<br />Cheese( type == "stilton" )<br />Cheese( smelly == true )<br />绑定变量约束<br />变量可以绑定到Fact和它们的字段，然后在后面的字段约束中使用。绑定变量被称为声明。有效的操作符由被约束的字段类型决定；在那里会进行强制转换。绑定变量约束使用'=='操作符，因为能够使用hash索引，因此提供非常快的执行速度。<br />Person( likes : favouriteCheese )<br />Cheese( type == likes )<br />返回值约束<br />返回值约束可以使用任何有效的Java元数据类型或对象。要避免使用任何Drools关键字作为声明标识。在返回值约束中使用的函数必须返回静态常量（time constant）结果。之前声明的绑定可以用在表达式中。<br />Person( girlAge : age, sex == "F" )<br />Person( age == ( girlAge + 2) ), sex == 'M' )<br />复合值约束<br />复合值约束用在可能有多个允许值的时候，当前只支持'in' 和'not in'两个操作。这些操作使用圆括号包含用逗号分开的值的列表，它可以是变量，字符串，返回值或限定标识符。'in' 和'not in'运算式实际上被语法分析器重写成多个!= and ==组成的多重约束。<br />Person( $cheese : favouriteCheese )<br />Cheese( type in ( "stilton", "cheddar", $cheese )<br />多重约束<br />多重约束允许你对一个字段通过使用'&&' 或者'||'约束连接符进行多个约束条件的判断。允许使用圆括号分组，它会让这种约束看起来更自然。<br />Person( age ( (> 30 && &lt; 40) || (> 20 && &lt; 25) ) ) <br />Person( age > 30 && &lt; 40 || location == "london" )<br />内联的Eval约束<br />eval约束可以使用任何有效的语言表达式，只要它最终能被求值为boolean元数据类型。表达式必须是静态常量（time constant）。任何在当前模式之前定义的变量都可以使用，自动代入（autovivification）机制用来自动建立字段绑定变量。当构建器发现标识不是当前定义的变量名是，它将尝试将它作为对象的字段来访问，这种情况下，构建器自动在inline-eval中建立该字段的同名变量。<br />Person( girlAge : age, sex = "F" )<br />Person( eval( girlAge == boyAge + 2 ), sex = 'M' )<br /><br />⑦RHS (then) 执行操作<br />这部分应当包含一系列需要执行的操作。规则的RHS部分应该保持简短的，这保持它是声明性和可读性的。如果你发现你需要在RHS中使用命令式或and/or条件代码，那你可能需要将规则拆分为多个规则。RHS的主要目的是插入，删除修改working memory数据。<br />"update(object, handle);" 将告诉引擎对象已经改变（已经被绑定到LHS中的那一个），并且规则需要重新检查。<br />"insert(new Something());" 将在working memory中放置一个你新建的对象。<br />"insertLogical(new Something());" 与insert类似，但是当没有更多的fact支持当前激发规则的真值状态时，对象自动删除。<br />"retract(handle);" removes an object from working memory.<br />⑧ Query<br />查询中仅仅包含规则LHS部分的结构（不用指定when或then）。它提供了查询working memory 中符合约束条件的对象的一个简单办法。<br />query "people over the age of 30" <br />    person : Person( age > 30 )<br />end<br />通过在返回的查询结果(QueryResults)上进行标准的for循环遍历，每一行将返回一个QueryResult，该对象可以用来存取组元中的每一个Column。这些Column可以通过声明的名称或索引位置存取。<br />QueryResults results = workingMemory.getQueryResults( "people over the age of 30" );<br />for ( Iterator it = results.iterator; it.hasNext(); ) {<br />    QueryResult result = ( QueryResult ) it.next();<br />    Person person = ( Person ) result.get( "person" );<br />    }
          <br/>
          <span style="color:red;">
            <a href="http://drools.group.javaeye.com/group/blog/190294#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 06 May 2008 16:47:21 +0800</pubDate>
        <link>http://drools.group.javaeye.com/group/blog/190294</link>
        <guid>http://drools.group.javaeye.com/group/blog/190294</guid>
      </item>
      <item>
        <title>用Groovy动态编译的对象作为Drools的Fact遇到的问题</title>
        <author>tailorcai</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tailorcai.javaeye.com">tailorcai</a>&nbsp;
          链接：<a href="http://drools.group.javaeye.com/group/blog/127308" style="color:red;">http://drools.group.javaeye.com/group/blog/127308</a>&nbsp;
          发表时间: 2007年09月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近，希望实现将Groovy和Drools结合起来实现，全动态的Model和Rule的实现方案。发现Groovy动态生成的类在Drools中使用有一些兼容性的问题。<br />
<br />
这是我的Unittest:<br />
<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span class="keyword">package</span><span>&nbsp;com.dg;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;groovy.lang.GroovyClassLoader;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;java.io.IOException;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">import</span><span>&nbsp;java.io.StringReader;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="keyword">import</span><span>&nbsp;org.drools.RuleBase;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;org.drools.RuleBaseConfiguration;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">import</span><span>&nbsp;org.drools.StatelessSession;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;org.drools.compiler.DroolsParserException;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">import</span><span>&nbsp;org.drools.compiler.PackageBuilder;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;org.drools.compiler.PackageBuilderErrors;&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">import</span><span>&nbsp;org.drools.reteoo.ReteooRuleBase;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;org.junit.*;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;DgTest&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">final</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;String&nbsp;ruleCode&nbsp;=&nbsp;</span><span class="string">&quot;package&nbsp;com.test;\n&quot;</span><span>&nbsp;+&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">&quot;import&nbsp;com.dg.DgTest;\n&quot;</span><span>&nbsp;+&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">&quot;rule&nbsp;\&quot;hello\&quot;\n&quot;</span><span>&nbsp;+&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">&quot;&nbsp;&nbsp;when&nbsp;\n&quot;</span><span>&nbsp;+&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">&quot;&nbsp;&nbsp;&nbsp;&nbsp;x:&nbsp;DgTest();\n&quot;</span><span>&nbsp;+&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">&quot;&nbsp;&nbsp;then&nbsp;\n&quot;</span><span>&nbsp;+&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">&quot;&nbsp;&nbsp;&nbsp;&nbsp;x.fire(null);\n&quot;</span><span>&nbsp;+&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">&quot;end\n&quot;</span><span>+&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">&quot;&quot;</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">final</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;String&nbsp;ruleCode1&nbsp;=&nbsp;</span><span class="string">&quot;package&nbsp;com.test;\n&quot;</span><span>&nbsp;+&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">&quot;import&nbsp;com.dg.DgTest;\n&quot;</span><span>&nbsp;+&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">&quot;import&nbsp;com.test.DynamicModel;\n&quot;</span><span>&nbsp;+&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">&quot;rule&nbsp;\&quot;hello\&quot;\n&quot;</span><span>&nbsp;+&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">&quot;&nbsp;&nbsp;when&nbsp;\n&quot;</span><span>&nbsp;+&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">&quot;&nbsp;&nbsp;&nbsp;&nbsp;d:&nbsp;DynamicModel();\n&quot;</span><span>&nbsp;+&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">&quot;&nbsp;&nbsp;&nbsp;&nbsp;x:&nbsp;DgTest();\n&quot;</span><span>&nbsp;+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">&quot;&nbsp;&nbsp;then&nbsp;\n&quot;</span><span>&nbsp;+&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">&quot;&nbsp;&nbsp;&nbsp;&nbsp;x.fire(d);\n&quot;</span><span>&nbsp;+&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">&quot;end\n&quot;</span><span>+&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">&quot;&quot;</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;</span><span class="keyword">boolean</span><span>&nbsp;fired&nbsp;=&nbsp;</span><span class="keyword">false</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;RuleBase&nbsp;setupRule(ClassLoader&nbsp;cl,&nbsp;String&nbsp;code)&nbsp;{&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.setProperty(<span class="string">&quot;drools.compiler&quot;</span><span>,&nbsp;</span><span class="string">&quot;JANINO&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(&nbsp;cl&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>&nbsp;)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.currentThread().setContextClassLoader(&nbsp;cl&nbsp;);&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PackageBuilder&nbsp;builder&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;PackageBuilder();&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringReader&nbsp;reader&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;StringReader(&nbsp;code&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">try</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;builder.addPackageFromDrl(&nbsp;reader&nbsp;);&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">catch</span><span>&nbsp;(DroolsParserException&nbsp;e)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">catch</span><span>&nbsp;(IOException&nbsp;e)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(&nbsp;builder.hasErrors()&nbsp;)&nbsp;{&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PackageBuilderErrors&nbsp;errors&nbsp;=&nbsp;builder.getErrors();&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&nbsp;errors&nbsp;);&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Assert.assertFalse(&nbsp;builder.hasErrors()&nbsp;);&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RuleBaseConfiguration&nbsp;conf&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;RuleBaseConfiguration();&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RuleBase&nbsp;ruleBase&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;ReteooRuleBase(&nbsp;conf&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">try</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ruleBase.addPackage(&nbsp;builder.getPackage());&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">catch</span><span>&nbsp;(Exception&nbsp;e)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PackageBuilderErrors&nbsp;errs&nbsp;=&nbsp;builder.getErrors();&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>(&nbsp;Object&nbsp;err&nbsp;:&nbsp;errs.getErrors())&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Assert.assertTrue(&nbsp;<span class="keyword">false</span><span>&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;ruleBase;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">void</span><span>&nbsp;runRuleWithObject(&nbsp;RuleBase&nbsp;rule,&nbsp;Object&nbsp;obj)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StatelessSession&nbsp;wm&nbsp;=&nbsp;rule.newStatelessSession();&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;objs[]&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;Object[</span><span class="number">2</span><span>];&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objs[<span class="number">0</span><span>]&nbsp;=&nbsp;</span><span class="keyword">this</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objs[<span class="number">1</span><span>]&nbsp;=&nbsp;obj;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wm.execute(objs);&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Assert.assertTrue(&nbsp;fired&nbsp;);&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/**</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;simple&nbsp;test</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="annotation">@Test</span><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;drools()&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RuleBase&nbsp;rb&nbsp;=&nbsp;setupRule(<span class="keyword">null</span><span>,&nbsp;ruleCode);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Assert.assertNotNull(&nbsp;rb&nbsp;);&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;runRuleWithObject(&nbsp;rb&nbsp;,&nbsp;<span class="keyword">null</span><span>&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/**</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;groovy&nbsp;dynamic&nbsp;test</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="annotation">@Test</span><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;groovy()&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GroovyClassLoader&nbsp;gcl&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;GroovyClassLoader();&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Assert.assertNotNull(&nbsp;gcl&nbsp;);&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class&nbsp;greetingClass&nbsp;=&nbsp;gcl.parseClass(<span class="string">&quot;package&nbsp;com.test;\n&quot;</span><span>&nbsp;+&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">&quot;class&nbsp;DynamicModel{\n&quot;</span><span>&nbsp;+&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">&quot;}\n&quot;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Assert.assertNotNull(&nbsp;greetingClass&nbsp;);&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RuleBase&nbsp;rb&nbsp;=&nbsp;setupRule(gcl,&nbsp;ruleCode1);&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">try</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;runRuleWithObject(&nbsp;rb&nbsp;,&nbsp;greetingClass.newInstance()&nbsp;);&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">catch</span><span>&nbsp;(InstantiationException&nbsp;e)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">catch</span><span>&nbsp;(IllegalAccessException&nbsp;e)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;fire(Object&nbsp;obj)&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fired&nbsp;=&nbsp;<span class="keyword">true</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(&nbsp;obj&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>)&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(obj);&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
在使用Groovy动态类时，编译Rule的时候总是报<br />
Rule Compilation error : [Rule name=hello, agendaGroup=MAIN, salience=0, no-loop=false]<br />
&nbsp;&nbsp;&nbsp; com/test/Rule_hello_0.java (3:49) : Only a type can be imported. com.test.DynamicModel resolves to a package<br />
&nbsp;&nbsp;&nbsp; com/test/Rule_hello_0.java (7:231) : com.test.DynamicModel cannot be resolved to a type<br />
<br />
那位能够给些建议呢？
          <br/>
          <span style="color:red;">
            <a href="http://drools.group.javaeye.com/group/blog/127308#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 26 Sep 2007 15:11:59 +0800</pubDate>
        <link>http://drools.group.javaeye.com/group/blog/127308</link>
        <guid>http://drools.group.javaeye.com/group/blog/127308</guid>
      </item>
      <item>
        <title>jboss rules brms和ruleAgent的配合使用</title>
        <author>tailorcai</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tailorcai.javaeye.com">tailorcai</a>&nbsp;
          链接：<a href="http://drools.group.javaeye.com/group/blog/108646" style="color:red;">http://drools.group.javaeye.com/group/blog/108646</a>&nbsp;
          发表时间: 2007年08月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          这两天，准备把BRMS和运行的工程结合起来，实现从编辑规则到热更新的全套流程。<br />
<br />
首先，从blog中看到官方推出了一个独立版本的BRMS，于是赶紧去download了一个。这个包自带了tomcat，以及一个demo的应用例子。安装很顺利，可以使用起来问题多多。现有的例子好几个地方点击就报错。到tomcat的输出里面一查，报class not found: ruleasset。反复试了多次，都是同样的结果。很失望。也许老外用的是linux版本？算了。<br />
<br />
以前用过jboss AS+BRMS，觉得还是挺稳定的，因此，还是老老实实自己配吧。<br />
<br />
安装JBOSS AS，然后把下载的war放到default/deploy目录下。（曾经想放在minimal,可是发现minimal不支持deploy，本人是个java新手，很多东西边试边用，不过本人解决问题的经验还是挺多的，呵呵，自我吹嘘一下）<br />
<br />
起来以后，试了一下，一切正常。<br />
<br />
为了试用BRMS的全部功能，首先要把model导入进去。可是把自己的model倒进去以后，找不到任何类。人家自带的例子就没有问题。想来想去，后来在log中看到，还是自己的类有问题，因为我使用了scala，因此，还需要scala的库。赶紧把scala.Jar放到jboss的Lib下面.<br />
<br />
BRMS的用法还是要好好研究一下的。不过，整个使用流程还是比较顺畅的。<br />
<br />
解决了编辑的问题之后，需要来解决运行过程中的加载问题。首先搜索到一篇文章，介绍使用方式的。名字叫drools-examples-brms。可是，发现这个例子有很大问题。他使用url的方式下载package。可是分析新的代码库，发现url的方式已经都不支持了。可能是因为url的方式不可控，问题比较多。目前的版本4.0.0只支持目录和文件方式。我的配置如下：<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j" start="1">
    <li class="alt"><span><span>newInstance=</span><span class="keyword">true</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>dir=k:/www/rules&nbsp;&nbsp;</span></li>
    <li class="alt"><span>#file=/com.aaa.models.pkg&nbsp;&nbsp;</span></li>
    <li class=""><span>poll=<span class="number">30</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>name=config&nbsp;&nbsp;</span></li>
</ol>
</div>
然后从BRMS下载package放到目录下。运行测试用例，文件终于找到了，可是在read的时候总是出错，后来发现，是由于我的程序用的drools版本和BRMS的版本不一致。升级后，运行正常。
          <br/>
          <span style="color:red;">
            <a href="http://drools.group.javaeye.com/group/blog/108646#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 03 Aug 2007 18:39:45 +0800</pubDate>
        <link>http://drools.group.javaeye.com/group/blog/108646</link>
        <guid>http://drools.group.javaeye.com/group/blog/108646</guid>
      </item>
      <item>
        <title>Jboss 终于开始整合 Drools &amp; JBPM 了</title>
        <author>sonic_yj</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sonicyj.javaeye.com">sonic_yj</a>&nbsp;
          链接：<a href="http://drools.group.javaeye.com/group/blog/81974" style="color:red;">http://drools.group.javaeye.com/group/blog/81974</a>&nbsp;
          发表时间: 2007年05月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font face="Arial">&nbsp;&nbsp; 为解决jbpm 3.1.2性能问题，跑上jboss网站翻，发现居然没有人提这个问题，下了个Jbpm3.2 beta看，simple里面提供内置Form? 分页任务清单？mail服务 顿时很感冒，还有RuleFlow，HOHO,终于整合了，自己写还是可以，不过整合了应该提高些性能吧，JBPM的TaskInstance signal已经把我害惨了. JBPM 3.2 + Drools 4(感觉就是3.10 m1 + ruleflow) , 害我都想用Beta。。。。 研究ing</font>
          <br/>
          <span style="color:red;">
            <a href="http://drools.group.javaeye.com/group/blog/81974#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 22 May 2007 22:13:00 +0800</pubDate>
        <link>http://drools.group.javaeye.com/group/blog/81974</link>
        <guid>http://drools.group.javaeye.com/group/blog/81974</guid>
      </item>
  </channel>
</rss>