﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-差沙的密码 -- SSHWSFC's code-随笔分类-avaj</title><link>http://www.blogjava.net/sshwsfc/category/11579.html</link><description>阅读本Blog请自备塑料袋一只</description><language>zh-cn</language><lastBuildDate>Thu, 20 Mar 2008 22:51:55 GMT</lastBuildDate><pubDate>Thu, 20 Mar 2008 22:51:55 GMT</pubDate><ttl>60</ttl><item><title>Android上的MSN初见成效～～！！</title><link>http://www.blogjava.net/sshwsfc/archive/2008/03/21/187605.html</link><dc:creator>差沙</dc:creator><author>差沙</author><pubDate>Thu, 20 Mar 2008 17:59:00 GMT</pubDate><guid>http://www.blogjava.net/sshwsfc/archive/2008/03/21/187605.html</guid><wfw:comment>http://www.blogjava.net/sshwsfc/comments/187605.html</wfw:comment><comments>http://www.blogjava.net/sshwsfc/archive/2008/03/21/187605.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sshwsfc/comments/commentRss/187605.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sshwsfc/services/trackbacks/187605.html</trackback:ping><description><![CDATA[<p>经过两天的努力，终于在Android上面跑起来MSN了。现在实现了基本的聊天功能，打算陆续的把其他功能完善，万事开头难，相信以后的工作会很顺利。</p>
<p><br />
Gtalk的功能由于有官方支持，早就弄了跟这个差不多的版本。</p>
<p><br />
另外，这个软件目前是以插件的形式开发，多一个协议就是多一个apk，实现一些intent即可。官方的IM包里面有很多支持，可惜文档没有提及。</p>
<p><img alt="" src="http://www.androidcn.net/attachments/month_0803/20080321_b41709e0a0efac3b972eAokluMybAz14.jpg" border="0" /></p>
<p>&nbsp;</p>
<p><a href="http://www.androidcn.net/thread-252-1-1.html" target="_blank">Android中文论坛原帖</a></p><img src ="http://www.blogjava.net/sshwsfc/aggbug/187605.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sshwsfc/" target="_blank">差沙</a> 2008-03-21 01:59 <a href="http://www.blogjava.net/sshwsfc/archive/2008/03/21/187605.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android发布, Android中国网站正式成立, 欢迎访问</title><link>http://www.blogjava.net/sshwsfc/archive/2007/11/15/160736.html</link><dc:creator>差沙</dc:creator><author>差沙</author><pubDate>Thu, 15 Nov 2007 05:41:00 GMT</pubDate><guid>http://www.blogjava.net/sshwsfc/archive/2007/11/15/160736.html</guid><wfw:comment>http://www.blogjava.net/sshwsfc/comments/160736.html</wfw:comment><comments>http://www.blogjava.net/sshwsfc/archive/2007/11/15/160736.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sshwsfc/comments/commentRss/160736.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sshwsfc/services/trackbacks/160736.html</trackback:ping><description><![CDATA[<a class="external text" title="http://code.google.com/android" href="http://code.google.com/android" rel="nofollow">Android</a>是google为手机开发的操作系统, 基于Linux2.6内核.
<p><br />
2007年11月12日(北美时间), Android的APP SDK公布, 开始了google手机的<a class="external text" title="http://code.google.com/android" href="http://code.google.com/android" rel="nofollow">开发大赛</a>. 我们致力于Android的开发文档翻译, 开发技术交流等工作, 希望为Android平台在中国的推广贡献自己的力量. <br />
</p>
<br />
Andorid的SDK是完全针对java设计的, 甚至提供eclipse的插件, 作为一个javaer不研究实在可惜.<br />
<br />
现在中文文档已经有了初步进展,&nbsp; 大家翻译的热情都很高涨. 论坛里的讨论也十分热烈, 欢迎您的访问.<br />
<br />
我们的网站, <a href="http://www.androidcn.net">http://www.androidcn.net</a><br />
<br />
中文文档计划:<br />
<br />
<a href="http://www.androidcn.net/wiki">http://www.androidcn.net/wiki</a><br />
<br />
<span style="font-size: 10pt; color: #c0c0c0">PS: 管理员您好, 不知道这个符不符合首页发布的规则, 要是不妥我会撤下, 我们都想为Android中文化贡献力量</span>
<img src ="http://www.blogjava.net/sshwsfc/aggbug/160736.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sshwsfc/" target="_blank">差沙</a> 2007-11-15 13:41 <a href="http://www.blogjava.net/sshwsfc/archive/2007/11/15/160736.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JBPM的Token路径问题</title><link>http://www.blogjava.net/sshwsfc/archive/2007/04/24/113217.html</link><dc:creator>差沙</dc:creator><author>差沙</author><pubDate>Tue, 24 Apr 2007 08:04:00 GMT</pubDate><guid>http://www.blogjava.net/sshwsfc/archive/2007/04/24/113217.html</guid><wfw:comment>http://www.blogjava.net/sshwsfc/comments/113217.html</wfw:comment><comments>http://www.blogjava.net/sshwsfc/archive/2007/04/24/113217.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/sshwsfc/comments/commentRss/113217.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sshwsfc/services/trackbacks/113217.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 12pt">ProcessInstance里面有一个findToken(String tokenPath)方法。这里面写的是tokenPath。 tokenPath跟文件系统的规则差不多。类似 /fork1/fork2 这样的。<br><br>那么，怎么到fork2下的一个分支token ？<br><br>token自己也有findToken这个方法，不同的是ProcessInstance的是以rootToken为起点，token自己的是以自己为起点。那么取到token2下面的分支<br><br>token2.findToken("token") <br>如果有返回token，没有返回null <br><br><br>至于token的名字，我刚才查源码才发现，只有在Fork节点才会给token赋予名字。。。 <br><br>那么token2.findToken("token") 这里"token"那里来 <br><br>命名的规则，如下。。&nbsp;<br><br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;tokenName&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br><img id=Codehighlighter1_63_394_Open_Image onclick="this.style.display='none'; Codehighlighter1_63_394_Open_Text.style.display='none'; Codehighlighter1_63_394_Closed_Image.style.display='inline'; Codehighlighter1_63_394_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_63_394_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_63_394_Closed_Text.style.display='none'; Codehighlighter1_63_394_Open_Image.style.display='inline'; Codehighlighter1_63_394_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(&nbsp;transitionName&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">&nbsp;)&nbsp;</span><span id=Codehighlighter1_63_394_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_63_394_Open_Text><span style="COLOR: #000000">{<br><img id=Codehighlighter1_114_158_Open_Image onclick="this.style.display='none'; Codehighlighter1_114_158_Open_Text.style.display='none'; Codehighlighter1_114_158_Closed_Image.style.display='inline'; Codehighlighter1_114_158_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_114_158_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_114_158_Closed_Text.style.display='none'; Codehighlighter1_114_158_Open_Image.style.display='inline'; Codehighlighter1_114_158_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(&nbsp;</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">&nbsp;parent.hasChild(&nbsp;transitionName&nbsp;)&nbsp;)&nbsp;</span><span id=Codehighlighter1_114_158_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_114_158_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tokenName&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;transitionName;<br><img id=Codehighlighter1_165_388_Open_Image onclick="this.style.display='none'; Codehighlighter1_165_388_Open_Text.style.display='none'; Codehighlighter1_165_388_Closed_Image.style.display='inline'; Codehighlighter1_165_388_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_165_388_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_165_388_Closed_Text.style.display='none'; Codehighlighter1_165_388_Open_Image.style.display='inline'; Codehighlighter1_165_388_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span id=Codehighlighter1_165_388_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_165_388_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tokenName&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;transitionName&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;Integer.toString(&nbsp;i&nbsp;);<br><img id=Codehighlighter1_293_380_Open_Image onclick="this.style.display='none'; Codehighlighter1_293_380_Open_Text.style.display='none'; Codehighlighter1_293_380_Closed_Image.style.display='inline'; Codehighlighter1_293_380_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_293_380_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_293_380_Closed_Text.style.display='none'; Codehighlighter1_293_380_Open_Image.style.display='inline'; Codehighlighter1_293_380_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(&nbsp;parent.hasChild(&nbsp;tokenName&nbsp;)&nbsp;)&nbsp;</span><span id=Codehighlighter1_293_380_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_293_380_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tokenName&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;transitionName&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;Integer.toString(&nbsp;i&nbsp;);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_401_556_Open_Image onclick="this.style.display='none'; Codehighlighter1_401_556_Open_Text.style.display='none'; Codehighlighter1_401_556_Closed_Image.style.display='inline'; Codehighlighter1_401_556_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_401_556_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_401_556_Closed_Text.style.display='none'; Codehighlighter1_401_556_Open_Image.style.display='inline'; Codehighlighter1_401_556_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span id=Codehighlighter1_401_556_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_401_556_Open_Text><span style="COLOR: #000000">{&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;no&nbsp;transition&nbsp;name</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;size&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(&nbsp;parent.getChildren()</span><span style="COLOR: #000000">!=</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">?</span><span style="COLOR: #000000">&nbsp;parent.getChildren().size()</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;:&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tokenName&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Integer.toString(size);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;tokenName;&nbsp;</span></div>
<p style="FONT-SIZE: 12pt"><br><br>这里"token"那里来？这个token名字，你自己可以根据命名规则得到 。看到这里应该很明了了 <br><br>token的命名规则；首先根据transitionName的名字命名，这个transitionName的名字是你自己的写的你不可能不知道。 如果transitionName的名字重名了，加自然数区分 当然，如果transitionName没有名字，用分支的个数+1作为名字。 <br><br>应该比较清楚了。 <br><br>PS：这个是qq聊天记录的整理版，所以说话比较诡异。为的是记录下来避免忘记，也感谢群里的朋友。发现互相解决问题是提高水平的一个捷径。。</p>
<img src ="http://www.blogjava.net/sshwsfc/aggbug/113217.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sshwsfc/" target="_blank">差沙</a> 2007-04-24 16:04 <a href="http://www.blogjava.net/sshwsfc/archive/2007/04/24/113217.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>秀逗的JBPM</title><link>http://www.blogjava.net/sshwsfc/archive/2006/08/24/65446.html</link><dc:creator>差沙</dc:creator><author>差沙</author><pubDate>Thu, 24 Aug 2006 03:07:00 GMT</pubDate><guid>http://www.blogjava.net/sshwsfc/archive/2006/08/24/65446.html</guid><wfw:comment>http://www.blogjava.net/sshwsfc/comments/65446.html</wfw:comment><comments>http://www.blogjava.net/sshwsfc/archive/2006/08/24/65446.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/sshwsfc/comments/commentRss/65446.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sshwsfc/services/trackbacks/65446.html</trackback:ping><description><![CDATA[这两天找点时间看了看jbpm，其设计思想相当不错，功能强劲，而且几乎实现了工作流模型的所有要求。可扩展的思想也是贯穿了整个jbpm的设计思路，这都是能看得出来的优势。但是这也仅仅是限于表面的一两眼，如果真的研究起其代码来，你会惊讶的发现Jbpm的代码漏洞百出，其设计思想完全没有发挥出来，应该说，Jbpm的代码真是“秀逗”了。下面来举几个例子吧。另外，我还没有看svn上的最新代码，所以可能有的问题jbpm自己已经修复，那就谢天谢地了。下面的代码基于jbpm3.1<br /><br /><strong>秀逗1。无中生有</strong><br /><br />看到最核心的JpdlXmlReader代码真实欲哭无泪，如果好好精简精简，至少能踢掉1/3的代码。而其中甚至有些无中生有的代码：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> ( (actorId</span><span style="COLOR: #000000">!=</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />           </span><span style="COLOR: #000000">||</span><span style="COLOR: #000000"> (pooledActors</span><span style="COLOR: #000000">!=</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">) <br /><img id="Codehighlighter1_68_272_Open_Image" onclick="this.style.display='none'; Codehighlighter1_68_272_Open_Text.style.display='none'; Codehighlighter1_68_272_Closed_Image.style.display='inline'; Codehighlighter1_68_272_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_68_272_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_68_272_Closed_Text.style.display='none'; Codehighlighter1_68_272_Open_Image.style.display='inline'; Codehighlighter1_68_272_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />         ) </span><span id="Codehighlighter1_68_272_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_68_272_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        assignmentDelegation.setProcessDefinition(processDefinition);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        assignmentDelegation.setClassName(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">org.jbpm.taskmgmt.assignment.ActorAssignmentHandler</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        String configuration </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">;</span></span></div>我们看到，如果符合之前的条件，就用代理类来代理<span style="COLOR: #000000">org.jbpm.taskmgmt.assignment.ActorAssignmentHandler这个类，但是找了好半天也没有找到这个类。。。。 难道是让用户在自己的项目中用这个类么？还是为了兼容原来的程序，，就算是其中一种，但是，可但是，这个条件根本就不可能满足，也就是说这是段废话，而且还无中生有的出来个ActorAssignmentHandler。。<br /><br /><strong>秀逗2。画蛇添足</strong><br /><br />应该是我的基本功不都扎实，实在是高不明白下面的代码在干什么。。。<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id="Codehighlighter1_41_342_Open_Image" onclick="this.style.display='none'; Codehighlighter1_41_342_Open_Text.style.display='none'; Codehighlighter1_41_342_Closed_Image.style.display='inline'; Codehighlighter1_41_342_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_41_342_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_41_342_Closed_Text.style.display='none'; Codehighlighter1_41_342_Open_Image.style.display='inline'; Codehighlighter1_41_342_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #000000">  </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> setActorId(String actorId) </span><span id="Codehighlighter1_41_342_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_41_342_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    DefaultAuthenticationService authenticationService </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (DefaultAuthenticationService) services.getAuthenticationService();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    DefaultAuthenticationService defaultAuthenticationService </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (DefaultAuthenticationService) authenticationService;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    defaultAuthenticationService.setActorId(actorId);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />  }</span></span></div></span>先强制转换成DefaultAuthenticationService，然后再强制转换成DefaultAuthenticationService。。。。<br />而且这里这么设计基本上就把DefaultAuthenticationService实现的AuthenticationService接口晾在那里了，根本就是应该用AuthenticationService这个接口来说话才对。jbpm的service设计的扩展性很强，可自己配制。但如果这么用service的话，再怎么扩展也没用。<br /><br /><strong>秀逗3。莫“名”其妙</strong><br /><br />Jbpm中变量的名字真的莫名其妙，很多明明是Map的类型他叫xxList，而不是Map的类型，他却叫xxMap。这个地方我相信应该是能体现出程序员编写程序的严谨性的地方，而Jbpm作的还不够好。<br /><br /><strong>秀逗4。固若金汤</strong><br /><br />Jbpm的扩展性贯穿始终，但是在最重要的泳道的扩展上却小家子气起来。看看泳道类代理的扩展代码。<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id="Codehighlighter1_21_297_Open_Image" onclick="this.style.display='none'; Codehighlighter1_21_297_Open_Text.style.display='none'; Codehighlighter1_21_297_Closed_Image.style.display='inline'; Codehighlighter1_21_297_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_21_297_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_21_297_Closed_Text.style.display='none'; Codehighlighter1_21_297_Open_Image.style.display='inline'; Codehighlighter1_21_297_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (expression</span><span style="COLOR: #000000">!=</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)</span><span id="Codehighlighter1_21_297_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_21_297_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        assignmentDelegation.setProcessDefinition(processDefinition);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        assignmentDelegation.setClassName(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">org.jbpm.identity.assignment.ExpressionAssignmentHandler</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        assignmentDelegation.setConfiguration(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;expression&gt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">expression</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;/expression&gt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />    }</span></span></div>写的很明确，如果泳道使用表达式来表示的那么就用代理类来代理处理表达式。。我本想，太好了，写我自己的表达式，然后代理交给Acegi来根据表达式分配ActorId，但是，可是，但可是。他的代理类居然是写死的，写得就是自己的java.identity包里面的东西，不是说java.identity设计的不好，但是一个综合系统的用户角色管理系统是不可能跟着你的jbpm走的。强行要加入的java.identity的设计有点保护自我的意思，真的固若金汤，让我结合acegi的想法又是难上加难。（不过还是有办法的。大家自己找找看）。<br /><br /><strong>秀逗5。口径不一</strong><br /><br />口径不一就是指两个程序部分的结合不一致。这种例子很多，我举一个程序和xsd的冲突的例子。<br />Instantiator是jbpm代理里面一个比较不错的概念。代理功能之一是生成代理的类的实例，而Instantiator则是负责生成实例的机制，这个Instantiator设计的不错，可以在配制文件中的config-type属性来扩展。看程序。<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">      </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> find the instantiator</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">      instantiator </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (Instantiator) instantiatorCache.get(configType);<br /><img id="Codehighlighter1_134_447_Open_Image" onclick="this.style.display='none'; Codehighlighter1_134_447_Open_Text.style.display='none'; Codehighlighter1_134_447_Closed_Image.style.display='inline'; Codehighlighter1_134_447_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_134_447_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_134_447_Closed_Text.style.display='none'; Codehighlighter1_134_447_Open_Image.style.display='inline'; Codehighlighter1_134_447_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />      </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (instantiator </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">) </span><span id="Codehighlighter1_134_447_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_134_447_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> load the instantiator class</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">        Class instantiatorClass </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> classLoader.loadClass(configType);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> instantiate the instantiator with the default constructor</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">        instantiator </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (Instantiator) instantiatorClass.newInstance();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        instantiatorCache.put(configType, instantiator);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />      }</span></span></div>这里的设计很人性化，可以根据configType来用自己的构造器，但是xsd却不这么想。<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">      </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xs:attribute </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="config-type"</span><span style="COLOR: #ff0000"> default</span><span style="COLOR: #0000ff">="field"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xs:simpleType</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />          </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xs:restriction </span><span style="COLOR: #ff0000">base</span><span style="COLOR: #0000ff">="xs:string"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xs:enumeration </span><span style="COLOR: #ff0000">value</span><span style="COLOR: #0000ff">="field"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xs:enumeration </span><span style="COLOR: #ff0000">value</span><span style="COLOR: #0000ff">="bean"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xs:enumeration </span><span style="COLOR: #ff0000">value</span><span style="COLOR: #0000ff">="constructor"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">xs:enumeration </span><span style="COLOR: #ff0000">value</span><span style="COLOR: #0000ff">="configuration-property"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />          </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">xs:restriction</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">xs:simpleType</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">xs:attribute</span><span style="COLOR: #0000ff">&gt;</span></div>可以看到它限制了4种类型，别说使用自己的构造器了，就连他自己的XmlInstantiator都不再考虑范围之内，真是大义灭亲呀。。<br /><br />构造器来这里的作用很大，我写了自己的spring构造器，构造的时候使用beanFactory来构造，这样就算是存在数据库里面的class也能当作spring的bean来处理。但是如果用xsd的话就会导致交验错误，所以索性把xsd去掉了，还好一切正常，就是感觉别扭点。<br /><br />秀逗N。。。 能够看得出来Jbpm需要提高的地方还很多。但是这些问题应该是一些开发人员的小疏忽，相信在以后的版本中可以改进。不管再怎么秀逗，Jbpm在工作流中仍然保有着强劲的地位，对BPM模型的实现也作的最为全面。而jbpm的par热部署和IDE也是整个系统中的两大亮点，这些优点都是不可不提的，所以我仍旧支持Jbpm，希望他能更加迅速的发展壮大起来。。。。<br /><br />PS：文中错误之处还望大家指出，我希望有些“秀逗”是我自己秀逗了。<img src ="http://www.blogjava.net/sshwsfc/aggbug/65446.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sshwsfc/" target="_blank">差沙</a> 2006-08-24 11:07 <a href="http://www.blogjava.net/sshwsfc/archive/2006/08/24/65446.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Acegi中使用ACL</title><link>http://www.blogjava.net/sshwsfc/archive/2006/06/17/53419.html</link><dc:creator>差沙</dc:creator><author>差沙</author><pubDate>Fri, 16 Jun 2006 16:20:00 GMT</pubDate><guid>http://www.blogjava.net/sshwsfc/archive/2006/06/17/53419.html</guid><wfw:comment>http://www.blogjava.net/sshwsfc/comments/53419.html</wfw:comment><comments>http://www.blogjava.net/sshwsfc/archive/2006/06/17/53419.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/sshwsfc/comments/commentRss/53419.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sshwsfc/services/trackbacks/53419.html</trackback:ping><description><![CDATA[Acegi好早就实现了ACL（好像是0.5），但是使用起来确实有点麻烦，所以用的不是太广泛。这里简单的说明一下使用方法，希望有更多的朋友来试试。<br /><br />首先要理解Acegi里面Voter的概念，ACL正是在一个Voter上扩展起来的。现来看一下AclVoter的配置。<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean </span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="aclBeanReadVoter"</span><span style="COLOR: #ff0000"> class</span><span style="COLOR: #0000ff">="org.acegisecurity.vote.BasicAclEntryVoter"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="processConfigAttribute"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">ACL_READ</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="processDomainObjectClass"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">org.springside.modules.security.acl.domain.AclDomainAware</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="aclManager"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">ref </span><span style="COLOR: #ff0000">local</span><span style="COLOR: #0000ff">="aclManager"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="requirePermission"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">list</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">ref </span><span style="COLOR: #ff0000">local</span><span style="COLOR: #0000ff">="org.acegisecurity.acl.basic.SimpleAclEntry.ADMINISTRATION"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">ref </span><span style="COLOR: #ff0000">local</span><span style="COLOR: #0000ff">="org.acegisecurity.acl.basic.SimpleAclEntry.READ"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">list</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">bean</span><span style="COLOR: #0000ff">&gt;</span></div><ol><li><span style="COLOR: #000000">ACL_READ指的是这个Voter对哪些SecurityConfig起作用，我们可以把<span style="COLOR: #000000">ACL_READ配置在想要拦截的Method上。比方说我们要拦截readOrder这个方法，以实现ACL控制，可以这样配置。<br /><em><font color="#006400">orderManager.readOrder=ACL_READ</font></em></span></span></li><li><span style="COLOR: #000000"><span style="COLOR: #000000"><font color="#000000">processDomainObjectClass指出哪些DomainObject是要进行ACL校验的。</font></span></span></li><li><span style="COLOR: #000000"><span style="COLOR: #000000"><font color="#000000">aclManager是一个比较重要的概念，主要负责在权限列表中根据用户和DomainObject取得acl列表。</font></span></span></li><li><span style="COLOR: #000000"><span style="COLOR: #000000">requirePermission指出要进行这个操作必须具备的acl权限，比方说read操作就必须有<font color="#000000">ADMINISTRATION或READ两个权限。</font></span></span></li></ol><p><span style="COLOR: #000000"><span style="COLOR: #000000">其实整个过程看下来比较清晰，下面来看一下AclManager如何配置。<br /></span></span></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">    </span><span style="COLOR: #008000">&lt;!--</span><span style="COLOR: #008000"> ========= ACCESS CONTROL LIST LOOKUP MANAGER DEFINITIONS ========= </span><span style="COLOR: #008000">--&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean </span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="aclManager"</span><span style="COLOR: #ff0000"> class</span><span style="COLOR: #0000ff">="org.acegisecurity.acl.AclProviderManager"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="providers"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">list</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">ref </span><span style="COLOR: #ff0000">local</span><span style="COLOR: #0000ff">="basicAclProvider"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">list</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">bean</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean </span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="basicAclProvider"</span><span style="COLOR: #ff0000"> class</span><span style="COLOR: #0000ff">="org.acegisecurity.acl.basic.BasicAclProvider"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="basicAclDao"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">ref </span><span style="COLOR: #ff0000">local</span><span style="COLOR: #0000ff">="basicAclExtendedDao"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">bean</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean </span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="basicAclExtendedDao"</span><span style="COLOR: #ff0000"> class</span><span style="COLOR: #0000ff">="org.acegisecurity.acl.basic.jdbc.JdbcExtendedDaoImpl"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="dataSource"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">ref </span><span style="COLOR: #ff0000">bean</span><span style="COLOR: #0000ff">="dataSource"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">bean</span><span style="COLOR: #0000ff">&gt;</span></div><br />很明显ACLManager继承了Acegi的一贯风格，Provider可以提供多种取得ACL访问列表的途径，默认的是用<font color="#0000ff">basicAclProvider</font><font color="#000000">在数据库中取得。既然提到了数据库，那我们就来看一下Acegi默认提供的ACL在数据库里的保存表结构：<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">CREATE</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">TABLE</span><span style="COLOR: #000000"> acl_object_identity (<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />id </span><span style="COLOR: #ff00ff">IDENTITY</span><span style="COLOR: #000000"> </span><span style="COLOR: #808080">NOT</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">NULL</span><span style="COLOR: #000000">,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />object_identity VARCHAR_IGNORECASE(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">250</span><span style="COLOR: #000000">) </span><span style="COLOR: #808080">NOT</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">NULL</span><span style="COLOR: #000000">,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />parent_object </span><span style="FONT-WEIGHT: bold; COLOR: #000000">INTEGER</span><span style="COLOR: #000000">,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />acl_class VARCHAR_IGNORECASE(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">250</span><span style="COLOR: #000000">) </span><span style="COLOR: #808080">NOT</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">NULL</span><span style="COLOR: #000000">,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">CONSTRAINT</span><span style="COLOR: #000000"> unique_object_identity </span><span style="COLOR: #0000ff">UNIQUE</span><span style="COLOR: #000000">(object_identity),<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">FOREIGN</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">KEY</span><span style="COLOR: #000000"> (parent_object) </span><span style="COLOR: #0000ff">REFERENCES</span><span style="COLOR: #000000"> acl_object_identity(id)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">CREATE</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">TABLE</span><span style="COLOR: #000000"> acl_permission (<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />id </span><span style="COLOR: #ff00ff">IDENTITY</span><span style="COLOR: #000000"> </span><span style="COLOR: #808080">NOT</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">NULL</span><span style="COLOR: #000000">,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />acl_object_identity </span><span style="FONT-WEIGHT: bold; COLOR: #000000">INTEGER</span><span style="COLOR: #000000"> </span><span style="COLOR: #808080">NOT</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">NULL</span><span style="COLOR: #000000">,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />recipient VARCHAR_IGNORECASE(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">100</span><span style="COLOR: #000000">) </span><span style="COLOR: #808080">NOT</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">NULL</span><span style="COLOR: #000000">,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />mask </span><span style="FONT-WEIGHT: bold; COLOR: #000000">INTEGER</span><span style="COLOR: #000000"> </span><span style="COLOR: #808080">NOT</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">NULL</span><span style="COLOR: #000000">,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">CONSTRAINT</span><span style="COLOR: #000000"> unique_recipient </span><span style="COLOR: #0000ff">UNIQUE</span><span style="COLOR: #000000">(acl_object_identity, recipient),<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">FOREIGN</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">KEY</span><span style="COLOR: #000000"> (acl_object_identity) </span><span style="COLOR: #0000ff">REFERENCES</span><span style="COLOR: #000000"> acl_object_identity(id)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />);</span></div></font><ol><li>acl_object_identity表存放了所有受保护的domainObject的信息。其中object_identity字段保存了domainObject的class和id，默认的保存格式是：domainClass:domainObjectId。</li><li>acl_permission 就是ACL权限列表了，recipient 是用户或角色信息，mask表示了这个用户或角色对这个domainObject的访问权限。注意这些信息的保存格式都是可以根据自己的需要改变的。</li></ol><p>这样读取和删除的时候Acegi就能很好的完成拦截工作，但是读取一个List的时候，如何才能把该用户不能操作的domainObject剔除掉呢？这就需要afterInvocationManager来完成这个工作。下面来看下配置：<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">    </span><span style="COLOR: #008000">&lt;!--</span><span style="COLOR: #008000"> ============== "AFTER INTERCEPTION" AUTHORIZATION DEFINITIONS =========== </span><span style="COLOR: #008000">--&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean </span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="afterInvocationManager"</span><span style="COLOR: #ff0000"> class</span><span style="COLOR: #0000ff">="org.acegisecurity.afterinvocation.AfterInvocationProviderManager"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="providers"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">list</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">ref </span><span style="COLOR: #ff0000">local</span><span style="COLOR: #0000ff">="afterAclCollectionRead"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">list</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">bean</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #008000">&lt;!--</span><span style="COLOR: #008000"> Processes AFTER_ACL_COLLECTION_READ configuration settings </span><span style="COLOR: #008000">--&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean </span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="afterAclCollectionRead"</span><span style="COLOR: #ff0000"> class</span><span style="COLOR: #0000ff">="org.acegisecurity.afterinvocation.BasicAclEntryAfterInvocationCollectionFilteringProvider"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="aclManager"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">ref </span><span style="COLOR: #ff0000">local</span><span style="COLOR: #0000ff">="aclManager"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="requirePermission"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">list</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">ref </span><span style="COLOR: #ff0000">local</span><span style="COLOR: #0000ff">="org.acegisecurity.acl.basic.SimpleAclEntry.ADMINISTRATION"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">ref </span><span style="COLOR: #ff0000">local</span><span style="COLOR: #0000ff">="org.acegisecurity.acl.basic.SimpleAclEntry.READ"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">list</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">bean</span><span style="COLOR: #0000ff">&gt;</span></div><br /><font color="#000000">afterAclCollectionRead会在拦截的方法执行结束的时候执行。主要的作用就是在返回的List中挨个检查domainObject的操作权限，然后根据requirePermission来剔除不符合的domainObject。</font><img src ="http://www.blogjava.net/sshwsfc/aggbug/53419.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sshwsfc/" target="_blank">差沙</a> 2006-06-17 00:20 <a href="http://www.blogjava.net/sshwsfc/archive/2006/06/17/53419.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Drools的初步，迷醉状态认识</title><link>http://www.blogjava.net/sshwsfc/archive/2006/05/28/48622.html</link><dc:creator>差沙</dc:creator><author>差沙</author><pubDate>Sun, 28 May 2006 12:53:00 GMT</pubDate><guid>http://www.blogjava.net/sshwsfc/archive/2006/05/28/48622.html</guid><wfw:comment>http://www.blogjava.net/sshwsfc/comments/48622.html</wfw:comment><comments>http://www.blogjava.net/sshwsfc/archive/2006/05/28/48622.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/sshwsfc/comments/commentRss/48622.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sshwsfc/services/trackbacks/48622.html</trackback:ping><description><![CDATA[这两天在<a class="" title="springside" href="/sshwsfc/admin/www.springside.org.cn" target="_blank">springside</a>受白衣的影响开始关注drools。说他是平民的脚本引擎一点都不假，使用起来极为方便，本来以为网上应该有不少的讲解了，但是发现几乎全是针对2.0版本讲解的。而drools加入jboss后有了质的变化，下面来看一下最新的3.0使用起来有什么不同：<br /><br />首先我们要取得rule，规则引擎、规则引擎，取得规则是必要的。<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id="Codehighlighter1_52_1040_Open_Image" onclick="this.style.display='none'; Codehighlighter1_52_1040_Open_Text.style.display='none'; Codehighlighter1_52_1040_Closed_Image.style.display='inline'; Codehighlighter1_52_1040_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_52_1040_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_52_1040_Closed_Text.style.display='none'; Codehighlighter1_52_1040_Open_Image.style.display='inline'; Codehighlighter1_52_1040_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> RuleBase readRule() </span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000"> Exception </span><span id="Codehighlighter1_52_1040_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_52_1040_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">read in the source</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">        Reader source </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> InputStreamReader( DroolsTest.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">.getResourceAsStream( </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/aclcreat.drl</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> ) );<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">optionally read in the DSL (if you are using it).</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">        Reader dsl </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> InputStreamReader( DroolsTest.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">.getResourceAsStream( </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/mylang.dsl</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> ) );<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Use package builder to build up a rule package.<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">An alternative lower level class called "DrlParser" can also be used<img src="http://www.blogjava.net/images/dot.gif" /></span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">        <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        PackageBuilder builder </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> PackageBuilder();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">this wil parse and compile in one step<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">NOTE: There are 2 methods here, the one argument one is for normal DRL.<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">builder.addPackageFromDrl( source );<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Use the following instead of above if you are using a DSL:</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">        builder.addPackageFromDrl( source, dsl );<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">get the compiled package (which is serializable)</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">        Package pkg </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> builder.getPackage();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">add the package to a rulebase (deploy the rule package).</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">        RuleBase ruleBase </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> RuleBaseFactory.newRuleBase();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        ruleBase.addPackage( pkg );<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> ruleBase;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />    }</span></span></div><br />这里在官方的例子基础上做了自己的实现(其实什么都没改)。<br /><br />可以看到，第一步是取得文件IO，这个文件就是我们要写得规则脚本，这个等下再说，大家可以假象一下脚本是个什么样子，现在只说怎么在程序中取得Rule。<br />接下来，是使用Builder取得一个package，既然builder都上来了说明能输入的脚本不止一个了。用addPackageFromDrl向这个builder压缩机里面输入脚本，当然还有另外一个文件dsl，这个后面再说。利用builder取得package。<br /><br />最后构造一个BaseRule，利用Factory取得的时候是有选择的，RuleBaseFactory.newRuleBase(int type)其中的type可以为不同的Algorithm，有RETE和Leaps 两种。对这两种Algorithm的具体解释可以参看 <a href="http://citeseer.ist.psu.edu/context/505087/0">http://citeseer.ist.psu.edu/context/505087/0</a> 或是 drools的文档，其实我也不太懂。<br /><br />把刚才的package添到ruleBase里面一个Rule就大功告成了。<br /><br />接下来看看怎么执行它：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">            WorkingMemory workingMemory </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> ruleBase.newWorkingMemory();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">go !</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">            Order order </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Order();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            order.setId(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            order.setName(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">testOrder</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            order.setTotlePrice(</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                        <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            User user </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> User();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            user.setName(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">testAdmin</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            user.setAuth(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">USER_ADMIN</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            List</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">String</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> roles </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ArrayList</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">String</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            roles.add(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ADMIN</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            user.setRoles(roles);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            User user1 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> User();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            user1.setName(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">testUser</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            user1.setAuth(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">USER_USER</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            List</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">String</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> roles1 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ArrayList</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">String</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            roles1.add(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">USER</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            user1.setRoles(roles1);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            workingMemory.assertObject(order);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            workingMemory.assertObject(user);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            workingMemory.assertObject(user1);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            workingMemory.fireAllRules();        <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            List</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">AclEntry</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> acls </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> workingMemory.getObjects(AclEntry.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">);</span></div><br />用ruleBase生成一个WorkingMemory，WorkingMemory是Rule的执行引擎，装载rule和事实(很重要的概念)，并统一执行他们。接下来我就在写我的事实，事实是什么，事实就是今天是什么天？订单总价多少？就是要告诉脚本的java对象。然后把事实一一压入WorkingMemory这个大压缩机。就瞧好吧。 <br /><br />OK可以执行了，fireAllRules!（真TM，COOL的名字）。当然有全部执行就有部分执行。你可以把规则分组，然后按组执行，或是指定rule的名字来执行(这里还是大家自己看看吧)。<br /><br />？？？究竟执行了什么。当然是执行了我们的脚本，脚本在这里、看看它可不是xml了：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">#created on: </span><span style="COLOR: #000000">2006</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">19</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000"> com.sample;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#list any </span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> classes here.<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> com.sample.domain.Order;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> com.sample.domain.User;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> com.sample.AclEntry;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#expander mylang.dsl<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#declare any global variables here<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />rule </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Order TotlePrice more than $1000</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    when<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        #conditions<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        $order : Order( totlePrice </span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">1000</span><span style="COLOR: #000000"> )<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        $user : User( roles contains </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ADMIN</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> , $userName : name)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    then <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        #actions<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">More Than</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">assert</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> AclEntry($order, $user, </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />end<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />rule </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Order TotlePrice less or equl than $1000</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    when<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        #conditions<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        $order : Order( totlePrice </span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">1000</span><span style="COLOR: #000000"> )<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        $user : User( $userName : name )<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    then <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        #actions<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Less Than</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">assert</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> AclEntry($order, $user, </span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />end</span></div><br />每一个rule就是一个规则，所有的事实要一一过一遍这些规则。when是规则提出的条件，如果哪个事实符合这个条件，就进入then的环节，进行相应的处理。<br /><br />分析一下条件：$order : Order( totlePrice <span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">1000</span><span style="COLOR: #000000"> )。一看就知道是总价超过1000的订单。$order是把这个订单邦定，后面可以使用。<br />分析一下then： System.out.println就不解释了。<span style="COLOR: #0000ff">assert</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> AclEntry($order, $user, </span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">)); 这里的assert的意义就是告诉WorkingMemory一个事实，其实跟前面的加入事实一个道理。打个比方，如果有闪电，那么就有雷。<br /><br />这样走完一个rule后大家很容易发现，其实是根据订单和用户的角色不同产生了不同的acl，然后我要拿到这些由事实得到的事实。<br /><br /></span></span><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">List</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">AclEntry</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> acls </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> workingMemory.getObjects(AclEntry.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">);</span></div>这样就能在workingMemory里面掏出我们需要的事实来，新鲜出炉的哦。<br /><br />相当粗略的讲了一下drools，目的是希望大家都来了解一下，共同学习。<img src ="http://www.blogjava.net/sshwsfc/aggbug/48622.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sshwsfc/" target="_blank">差沙</a> 2006-05-28 20:53 <a href="http://www.blogjava.net/sshwsfc/archive/2006/05/28/48622.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>