<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.athico.com/~d/styles/atom10full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.athico.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0"><id>tag:blogger.com,1999:blog-5869426</id><updated>2008-07-05T19:11:00.854+01:00</updated><title type="text">Drools - Business Logic integration Platform</title><link rel="alternate" type="text/html" href="http://blog.athico.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/5869426/posts/default?start-index=26&amp;max-results=25&amp;redirect=false" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.athico.com/feeds/posts/default" /><author><name>Mark Proctor</name><uri>http://www.blogger.com/profile/03304277188725220501</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>209</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><link rel="self" href="http://feeds.athico.com/DroolsAtom" type="application/atom+xml" /><entry><id>tag:blogger.com,1999:blog-5869426.post-8380797205877555407</id><published>2008-07-05T15:10:00.004+01:00</published><updated>2008-07-05T15:23:14.531+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Smooks" /><category scheme="http://www.blogger.com/atom/ns#" term="Drools" /><title type="text">Drools Smooks Data Loader</title><content type="html">&lt;a href="http://milyn.codehaus.org"&gt;Smooks&lt;/a&gt; is a powerful open source ETL tool, it can transform variety of data sources. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_Jrhwx8X9P7g/SG-CJKaIWCI/AAAAAAAAAKI/QyJd48fTupg/s1600-h/smooks-usecase.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_Jrhwx8X9P7g/SG-CJKaIWCI/AAAAAAAAAKI/QyJd48fTupg/s400/smooks-usecase.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5219533587070081058" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Drools now supports an internal model, so ideally you want to be able to load different payloads, such as XML, into this model. I've just added support for this and it'll be in M2 :)&lt;br /&gt;&lt;br /&gt;Here is an example of the api loading an XML file into a drools session, the xml entries for OrderItem are mapped into the internal class and inserted into the given session. The matching rules simple do a print statement.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;declare OrderItem&lt;br /&gt;    productId : long&lt;br /&gt;    quantity : Integer&lt;br /&gt;    price : double&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;rule someRule&lt;br /&gt;when&lt;br /&gt;    $i : OrderItem()&lt;br /&gt;then&lt;br /&gt;    System.out.println( $i ); &lt;br /&gt;end&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;PackageBuilder pkgBuilder = new PackageBuilder();&lt;br /&gt;pkgBuilder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "test.drl" )) );&lt;br /&gt;&lt;br /&gt;RuleBase ruleBase = RuleBaseFactory.newRuleBase();&lt;br /&gt;ruleBase.addPackage( pkgBuilder.getPackage() );&lt;br /&gt;&lt;br /&gt;StatefulSession session = ruleBase.newStatefulSession();&lt;br /&gt;&lt;br /&gt;// Instantiate Smooks with the config...&lt;br /&gt;Smooks smooks = new Smooks( "smooks-config.xml" );&lt;br /&gt;&lt;br /&gt;// set rood id&lt;br /&gt;DroolsSmooksConfiguration conf = new DroolsSmooksConfiguration( "root" );&lt;br /&gt;DroolsSmooks loader = new DroolsSmooks( session, smooks, conf );&lt;br /&gt;loader.insertFilter( new StreamSource( new ByteArrayInputStream( readInputMessage() ) ) );&lt;br /&gt;&lt;br /&gt;session.fireAllRules();&lt;/pre&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=bATqJJ"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=bATqJJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=Mqvz3j"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=Mqvz3j" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=tqzfMJ"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=tqzfMJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=7Psuij"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=7Psuij" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=0HZrHj"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=0HZrHj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=LEofZJ"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=LEofZJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=WujYOJ"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=WujYOJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.athico.com/~r/DroolsAtom/~4/327406646" height="1" width="1"/&gt;</content><link rel="alternate" type="text/html" href="http://feeds.athico.com/~r/DroolsAtom/~3/327406646/drools-smooks-data-loader.html" title="Drools Smooks Data Loader" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5869426&amp;postID=8380797205877555407" title="0 Comments" /><link rel="replies" type="application/atom+xml" href="http://blog.athico.com/feeds/8380797205877555407/comments/default" title="Post Comments" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5869426/posts/default/8380797205877555407" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5869426/posts/default/8380797205877555407" /><author><name>Mark Proctor</name><uri>http://www.blogger.com/profile/03304277188725220501</uri><email>noreply@blogger.com</email></author><feedburner:origLink>http://blog.athico.com/2008/07/drools-smooks-data-loader.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5869426.post-4675156116785341077</id><published>2008-07-04T20:32:00.004+01:00</published><updated>2008-07-04T20:42:12.582+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Drools" /><title type="text">The Rise of the Open Source BRMS</title><content type="html">The JavaRules blog has done an interesting take on the rise of the Open Source BRMS, titled&lt;a href="http://yaakov2.wordpress.com/2008/07/04/drools-brms-and-revolutions/"&gt; "Drools, BRMS and Revolutions"&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here is a choice quote:&lt;br /&gt;"Here’s another thing: More and more companies are using shareware or freeware products such as Linux, Open Office, Java, Eclipse, Net Beans, JBoss to run those $500K (final installed price) BRMS packages. Now they’re going to have another really good package to add in there; Drools. The line between commercial BRMS vendors and freeware vendors is becoming more and more blurred and, with the next year or two, should disappear altogether."&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=7NcxyJ"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=7NcxyJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=l1z3bj"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=l1z3bj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=spqG0J"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=spqG0J" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=uhSwcj"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=uhSwcj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=Pctgtj"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=Pctgtj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=g3hNwJ"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=g3hNwJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=XlpoeJ"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=XlpoeJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.athico.com/~r/DroolsAtom/~4/326873835" height="1" width="1"/&gt;</content><link rel="alternate" type="text/html" href="http://feeds.athico.com/~r/DroolsAtom/~3/326873835/rise-of-open-source-brms.html" title="The Rise of the Open Source BRMS" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5869426&amp;postID=4675156116785341077" title="0 Comments" /><link rel="replies" type="application/atom+xml" href="http://blog.athico.com/feeds/4675156116785341077/comments/default" title="Post Comments" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5869426/posts/default/4675156116785341077" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5869426/posts/default/4675156116785341077" /><author><name>Mark Proctor</name><uri>http://www.blogger.com/profile/03304277188725220501</uri><email>noreply@blogger.com</email></author><feedburner:origLink>http://blog.athico.com/2008/07/rise-of-open-source-brms.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5869426.post-6527476245514381170</id><published>2008-07-04T13:23:00.005+01:00</published><updated>2008-07-05T11:50:19.962+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="release" /><category scheme="http://www.blogger.com/atom/ns#" term="Drools" /><title type="text">Drools 5.0 M1 - New and Noteworthy</title><content type="html">&lt;div&gt;Drools 5.0 will be the launch of what we call the Business Logic integration Platform (BLiP) - the BRMs is dead :) The future is for a unified and integrated solution for Rules, Processes and CEP - this is what users want and this is what we are aiming for.&lt;br /&gt;&lt;br /&gt;Drools 5.0 will split up into 4 main sub projects, the documentation has already been split to reflect this:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Drools Guvnor (BRMS/BPMS)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Drools Expert (rule engine),&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Drools Flow (process/workflow)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Drools Fusion (cep/temporal reasoning)&lt;/li&gt;&lt;/ul&gt;M1 is still very hairy and only for the hard core drools users, little documentation has been updated - although some Flow and Guvnor stuff has been. So you will have to rely on looking at code and unit tests, as well as asking on the mailing lists and irc - we hope this new and noteworthy document helps guide you too.&lt;br /&gt;&lt;br /&gt;M2 will involve an API change as we refactor away from being rules centric, as discussed &lt;a href="http://www.mail-archive.com/rules-dev@lists.jboss.org/msg00757.html"&gt;here&lt;/a&gt;, we will provide a legacy 4.0 wrapper jar for backwards compatability in some later milestones.&lt;br /&gt;&lt;br /&gt;We hope that M3/M4 will start to be more user/public friendly as the feature set matures and bugs come in and we start to update the documentation. We are hoping for an August/Sept release.&lt;br /&gt;&lt;br /&gt;5.0 M1 can be found on the main &lt;a href="http://www.jboss.org/drools/downloads.html"&gt;drools download&lt;/a&gt; page. The Binary with dependencies is particularly large, but the bulk of it is uml javadocs, we will try and address this in M2 or M3 where we will try and remove non public stable apis.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;A Big Thanks to the following Contributors&lt;/span&gt;&lt;br /&gt;Ming Jin - Package serialisation performance increase (10x improvement)&lt;br /&gt;&lt;div&gt;Matthias Groch - sliding windows algorithm research&lt;/div&gt; &lt;div&gt;Tino Breddin - temporal operators&lt;/div&gt; &lt;div&gt;Matt Geis - new DSL parser and enhancements&lt;br /&gt;Steven Williams - various decision table tasks.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Guvnor (the BRMS component)&lt;/h2&gt;&lt;span style="font-weight: bold;"&gt;New look web tooling&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_KukQ8TlQMz8/SFGyNEz3v9I/AAAAAAAAAPo/pZtIuQXKQNM/s1600-h/Picture+1.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5211142181543722962" style="margin: 0px auto 10px; display: block; cursor: pointer; text-align: center;" alt="" src="http://bp2.blogger.com/_KukQ8TlQMz8/SFGyNEz3v9I/AAAAAAAAAPo/pZtIuQXKQNM/s320/Picture+1.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-weight: bold;"&gt;Web based decision table editor&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_KukQ8TlQMz8/SFGyeB_84gI/AAAAAAAAAPw/drRcF_1aId4/s1600-h/WebDT.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5211142472846860802" style="margin: 0px auto 10px; display: block; cursor: pointer; text-align: center;" alt="" src="http://bp3.blogger.com/_KukQ8TlQMz8/SFGyeB_84gI/AAAAAAAAAPw/drRcF_1aId4/s320/WebDT.png" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;Integrated scenario testing&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_KukQ8TlQMz8/SFGy_USk9SI/AAAAAAAAAP4/aGNVOB8bPss/s1600-h/ScenarioSuite.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5211143044692505890" style="margin: 0px auto 10px; display: block; cursor: pointer; text-align: center;" alt="" src="http://bp0.blogger.com/_KukQ8TlQMz8/SFGy_USk9SI/AAAAAAAAAP4/aGNVOB8bPss/s320/ScenarioSuite.png" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_KukQ8TlQMz8/SFGy_sebpFI/AAAAAAAAAQA/3xr_x_S-iGY/s1600-h/Scenario.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5211143051184677970" style="margin: 0px auto 10px; display: block; cursor: pointer; text-align: center;" alt="" src="http://bp0.blogger.com/_KukQ8TlQMz8/SFGy_sebpFI/AAAAAAAAAQA/3xr_x_S-iGY/s320/Scenario.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;WebDAV file based interface to repository&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_KukQ8TlQMz8/SFGy_wfKGqI/AAAAAAAAAQI/jBWo-hTLZlI/s1600-h/WebDav.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5211143052261464738" style="margin: 0px auto 10px; display: block; cursor: pointer; text-align: center;" alt="" src="http://bp0.blogger.com/_KukQ8TlQMz8/SFGy_wfKGqI/AAAAAAAAAQI/jBWo-hTLZlI/s320/WebDav.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Declarative modelling of types (types that are not in pojos)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_KukQ8TlQMz8/SGRshYcU_hI/AAAAAAAAAQ0/30TiIf_QUGE/s1600-h/Picture+2.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5216413589154627090" style="margin: 0px auto 10px; display: block; cursor: pointer; text-align: center;" alt="" src="http://bp3.blogger.com/_KukQ8TlQMz8/SGRshYcU_hI/AAAAAAAAAQ0/30TiIf_QUGE/s320/Picture+2.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This works with the new "declare" statement - you can now declare types in drl itself. You can then populate these without using a pojo (if you like). These types are then available in the rulebase.&lt;br /&gt;&lt;br /&gt;Others:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Logic verifier&lt;/li&gt;&lt;li&gt;Improvements to guided editor (many)&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;CORE ENGINE&lt;/h2&gt;&lt;span style="font-weight: bold;"&gt;Asymmetrical Rete algorithm implementation&lt;/span&gt;&lt;br /&gt;Shadow proxies are no longer needed. Shadow proxies protected the engine from information change on facts, which if occurred outside of the engine's control it could not be modified or retracted.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;PackageBuilder can now build multiple namespaces&lt;/span&gt;&lt;br /&gt;You no longer need to confine one PackageBuilder to one package namespace. Just keeping adding your DRLs for any namespace and getPackages() returns an array of Packages for each of the used namespaces.&lt;pre&gt;Package[] packages = pkgBuilder.getPackages();&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;RuleBase attachment to PackageBuilder&lt;/span&gt;&lt;br /&gt;It is now possible to attach a RuleBase to a PackageBuilder, this means that rules are built and added to the rulebase at the same time. PackageBuilder uses the Package instances of the actual RuleBase as it's source, removing the need for additional Package creation and merging that happens in the existing approach.&lt;pre&gt;RuleBase ruleBase = RuleBaseFactory.newRuleBase();&lt;br /&gt;PackageBuilder pkgBuilder = new PackageBuilder( ruleBase, null );&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Binary marshalling of stateful sessions&lt;/span&gt;&lt;br /&gt;Stateful sessions can now saved and resumed at a later date.&lt;br /&gt;Pre-loaded data sessions can now be created.&lt;br /&gt;Pluggable strategies can be used for user object persistence, i.e. hibernate or identity maps.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Type Declaration&lt;/span&gt;&lt;br /&gt;Drools now supports a new base construct called Type Declaration. This construct fulfils two purposes: the ability to declare fact metadata, and the ability to dynamically generate new fact types local to the rule engine. The Guvnor modelling tool uses this underneath.&lt;br /&gt;One example of the construct is:&lt;pre&gt;declare StockTick&lt;br /&gt;  @role( event )&lt;br /&gt;  @timestamp( timestampAttr )&lt;br /&gt;&lt;br /&gt;  companySymbol : String&lt;br /&gt;  stockPrice : double&lt;br /&gt;  timestampAttr : long&lt;br /&gt;end&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Declaring Fact Metadata&lt;/span&gt;&lt;br /&gt;To declare and associate fact metadata, just use the @ symbol for each metadata ID you want to declare. Example:&lt;pre&gt;declare StockTick&lt;br /&gt;  @role( event )&lt;br /&gt;end&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Triggering Bean Generation&lt;/span&gt;&lt;br /&gt;To activate the dynamic bean generation, just add fields and types to your type declaration:&lt;pre&gt;declare Person&lt;br /&gt;  name : String&lt;br /&gt;  age : int&lt;br /&gt;end&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;DSL improvements&lt;/span&gt;&lt;br /&gt;A series of DSL improvements were implemented, including a completely new parser and the ability to declare matching masks for matching variables. For instance, one can constrain a phone number field to a 2-digit country code + 3-digit area code + 8-digit phone number, all connected by a "-" (dash), by declaring the DSL map like:&lt;br /&gt;&lt;br /&gt;The phone number is {number:\d{2}-\d{3}-\d{8}}&lt;br /&gt;&lt;br /&gt;Any valid java regexp may be used in the variable mask.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Complex Event Processing Support (Temporal Reasoning)&lt;/h2&gt;Drools 5.0 brings to the rules world the full power of events processing by supporting a number of CEP features as well as supporting events as first class citizens in the rules engine.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Event Semantics&lt;/span&gt;&lt;br /&gt;Events are (from a rules engine perspective) a special type of fact that has a few special characteristics:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;they are immutable&lt;/li&gt;&lt;li&gt;they have strong time-related relationships&lt;/li&gt;&lt;li&gt;they may have clear lifecycle windows&lt;/li&gt;&lt;li&gt;they may be transparently garbage collected after it's lifecycle window expires&lt;/li&gt;&lt;li&gt;they may be time-constrained&lt;/li&gt;&lt;li&gt;they may be included in sliding windows for reasoning&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Event Declaration&lt;/span&gt;&lt;br /&gt;Any fact type can assume an event role, and its corresponding event semantics, by simply declaring the metadata for it. Both existing and generated beans support event semantics:&lt;br /&gt;&lt;pre&gt;# existing bean assuming an event role&lt;br /&gt;import org.drools.test.StockTick&lt;br /&gt;declare StockTick&lt;br /&gt;  @role( event )&lt;br /&gt;end&lt;/pre&gt;&lt;pre&gt;# generated bean assuming an event role&lt;br /&gt;declare Alarm&lt;br /&gt;  @role( event )&lt;br /&gt;  type : String&lt;br /&gt;  timestamp : long&lt;br /&gt;end&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;Entry-Point Stream Listeners&lt;/span&gt;&lt;br /&gt;A new key "from entry-point" has been added to allow a pattern in a rule to listen on a stream, which avoids the overhead of having to insert the object into the working memory where it is potentially reasoned over by all rules.&lt;pre&gt;$st : StockTick( company == "ACME", price &gt; 10 ) from entry-point "stock stream"&lt;/pre&gt;To insert facts into an entry point:&lt;br /&gt;&lt;pre&gt;WorkingMemoryEntryPoint entry = wm.getWorkingMemoryEntryPoint( "stock stream" );&lt;br /&gt;entry.insert( ticker );&lt;/pre&gt;&lt;a href="http://anonsvn.labs.jboss.com/labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/StreamsTest.java"&gt;StreamTest&lt;/a&gt; shows a unit for this.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Event Correlation and New Operators&lt;/span&gt;&lt;br /&gt;Event correlation and time based constraint support are requirements of event processing, and are completely supported by Drools 5.0. The new, out of the box, time constraint operators can be seen in these test case rules:&lt;br /&gt;&lt;a href="http://anonsvn.labs.jboss.com/labs/jbossrules/trunk/drools-compiler/src/test/resources/org/drools/integrationtests/test_CEP_TimeRelationalOperators.drl"&gt;test_CEP_TimeRelationalOperators.drl&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As seen in the test above, Drools supports both: primitive events, that are point in time occurrences with no duration, and compound events, that are events with distinct start and end timestamps.&lt;br /&gt;&lt;br /&gt;The complete list of operators are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;coincides&lt;/li&gt;&lt;li&gt;before&lt;/li&gt;&lt;li&gt;after&lt;/li&gt;&lt;li&gt;meets&lt;/li&gt;&lt;li&gt;metby&lt;/li&gt;&lt;li&gt;overlaps&lt;/li&gt;&lt;li&gt;overlappedby&lt;/li&gt;&lt;li&gt;during&lt;/li&gt;&lt;li&gt;includes&lt;/li&gt;&lt;li&gt;starts&lt;/li&gt;&lt;li&gt;startedby&lt;/li&gt;&lt;li&gt;finishes&lt;/li&gt;&lt;li&gt;finishedby&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Sliding Time Windows&lt;/span&gt;&lt;br /&gt;Drools 5.0 adds support for reasoning over sliding windows of events. For instance:&lt;pre&gt;StockTick( symbol == "RHAT" ) over window:time( 60 )&lt;/pre&gt;The above example will only pattern match the RHAT stock ticks that happened in the last 60 clock ticks, discarding any event older than that.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Session Clock&lt;/span&gt;&lt;br /&gt;Enabling full event processing capabilities requires the ability to configure and interact with a session clock. Drools adds support for time reasoning and session clock configuration, allowing it to not only run real time event processing but also simulations, what-if scenarios and post-processing audit by replaying a scenario.&lt;br /&gt;&lt;br /&gt;The Clock is specified as part of the SessionConfiguration, a new class that is optionally specified at session creation time:&lt;pre&gt;SessionConfiguration conf = new SessionConfiguration();&lt;br /&gt;conf.setClockType( ClockType.PSEUDO_CLOCK );&lt;br /&gt;StatefulSession session = ruleBase.newStatefulSession( conf );&lt;/pre&gt;&lt;h2&gt;Drools Flow&lt;/h2&gt;Drools 4.0 had simple "RuleFlow" which was for orchestrating rules. Drools 5.0 introduces a powerful (extensible) workflow engine. It allows users to specify their business logic using both rules and processes (where powerful interaction between processes and rules is possible) and offers a unified enviroment.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Interactive Debugger&lt;/span&gt;&lt;br /&gt;Process Instance view at a specific breakpoint:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_Jrhwx8X9P7g/SGw3nUKRF4I/AAAAAAAAAJg/d-YtLt4RjRU/s1600-h/process-instances.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5218607216781760386" style="margin: 0px auto 10px; display: block; cursor: pointer; text-align: center;" alt="" src="http://bp0.blogger.com/_Jrhwx8X9P7g/SGw3nUKRF4I/AAAAAAAAAJg/d-YtLt4RjRU/s400/process-instances.png" border="0" /&gt;&lt;/a&gt;Current active nodes in a workflow in a specific breakpoint:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_Jrhwx8X9P7g/SGw3nfAKNpI/AAAAAAAAAJo/cYPe-2UqPww/s1600-h/example-debug-1.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5218607219692156562" style="margin: 0px auto 10px; display: block; cursor: pointer; text-align: center;" alt="" src="http://bp1.blogger.com/_Jrhwx8X9P7g/SGw3nfAKNpI/AAAAAAAAAJo/cYPe-2UqPww/s400/example-debug-1.png" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;New Nodes&lt;/span&gt;&lt;br /&gt;Timers:&lt;br /&gt;A timer node can be added which causes the execution of the node to wait for a specific period. Currently just uses JDK defaults of initial delay and repeat delay, more complex timers will be available in further milestones.&lt;br /&gt;&lt;br /&gt;Human Task:&lt;br /&gt;Processes can include tasks that need to be executed by human actors. Human tasks include parameters like taskname, priority, description, actorId, etc. The process engine can easily be integrated with existing human task component (like for example a WS-HumanTask implementation) using our pluggable work items (see below). Swimlanes and assignment rules are also supported.&lt;br /&gt;&lt;br /&gt;The palette in the screenshot shows the two new components, and the workflow itself shows the human task in use. It also shows two "work items" which is explained in the next section:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_Jrhwx8X9P7g/SGw5NycBXQI/AAAAAAAAAJw/NAsUdORdLtg/s1600-h/humantask.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5218608977255947522" style="margin: 0px auto 10px; display: block; cursor: pointer; text-align: center;" alt="" src="http://bp2.blogger.com/_Jrhwx8X9P7g/SGw5NycBXQI/AAAAAAAAAJw/NAsUdORdLtg/s400/humantask.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Domain Specific Work Items&lt;/span&gt;&lt;br /&gt;Domain Specific Work Items are pluggable nodes that users create to facilitate custom task execution. They provide an api to specify a new icon in the palette and gui editor for the tasks properties, if no editor gui is supplied then it defaults to a text based key value pair form. The api then allows execution behaviour for these work items to be specified. By default the Email and Log work items are provided. The Drools flow Manual has been updated on how to implement these.&lt;br /&gt;&lt;br /&gt;The below image shows three different work items in use in a workflow, "Blood Pressure", "BP Medication", "Notify GP":&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_Jrhwx8X9P7g/SGw_XhhfgaI/AAAAAAAAAJ4/kpHbACrBF7U/s1600-h/CDSSExample.bmp"&gt;&lt;img id="BLOGGER_PHOTO_ID_5218615741583950242" style="margin: 0px auto 10px; display: block; cursor: pointer; text-align: center;" alt="" src="http://bp3.blogger.com/_Jrhwx8X9P7g/SGw_XhhfgaI/AAAAAAAAAJ4/kpHbACrBF7U/s400/CDSSExample.bmp" border="0" /&gt;&lt;/a&gt;This one ows a new "Notificatoin" work item:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_Jrhwx8X9P7g/SGw_XjzWD1I/AAAAAAAAAKA/9zYSYEL3HEA/s1600-h/NotificationPalette.bmp"&gt;&lt;img id="BLOGGER_PHOTO_ID_5218615742195699538" style="margin: 0px auto 10px; display: block; cursor: pointer; text-align: center;" alt="" src="http://bp2.blogger.com/_Jrhwx8X9P7g/SGw_XjzWD1I/AAAAAAAAAKA/9zYSYEL3HEA/s400/NotificationPalette.bmp" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;extensible Process Definition Language (ePDL)&lt;/span&gt;&lt;br /&gt;Drools 4.0 used Xstream to store it's content, which was not easily human writeable. Drools 5.0 introduced the ePDL which is a XML specific to our process language, it also allows for domain specific extensions which has been talked about in detail in this blog posting &lt;a href="http://blog.athico.com/2007/12/drools-extensible-process-definition.html"&gt;"Drools Extensible Process Definition Language (ePDL) and the Semantic Module Framework (SMF)"&lt;/a&gt;. An example of the XML language, with a DSL extension in red, is shown below.&lt;br /&gt;&lt;pre&gt;&amp;lt;process  name="process name" id="process name" package-name="org.domain"&lt;br /&gt;xmlns="http://drools.org/drools-4.0/process"&lt;br /&gt;xmlns:mydsl="http://domain/org/mydsl"&lt;br /&gt;xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;xs:schemaLocation="http://drools.org/drools-4.0/process drools-processes-4.0.xsd" &amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;nodes&amp;gt;&lt;br /&gt;  &amp;lt;start id="0" /&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;action id="1" dialect="java"&amp;gt;&lt;br /&gt;      list.add( "action node was here" ); &lt;br /&gt;  &amp;lt;/action&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;    &amp;lt;mydsl:logger id="2" type="warn"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;        This is my message         &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;    &amp;lt;mydsl:logger&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;end id="3" /&amp;gt;&lt;br /&gt;&amp;lt;/nodes&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;connections&amp;gt;&lt;br /&gt;  &amp;lt;connection from="0 to="1" /&amp;gt;&lt;br /&gt;  &amp;lt;connection from="1" to="2" /&amp;gt;&lt;br /&gt;  &amp;lt;connection from="2" to="3" /&amp;gt;&lt;br /&gt;&amp;lt;/connections&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/process&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Pluggable Nodes&lt;/span&gt;&lt;br /&gt;The underlying nodes for the framework are completely pluggable making it simple to extend and to implement other execution models. We already have a partial implementation for &lt;a href="http://anonsvn.labs.jboss.com/labs/jbossrules/trunk/drools-process/drools-osworkflow/"&gt;OSWorkflow&lt;/a&gt; and are working with &lt;a href="http://www.hcw.be/p.aspx?p=J0879"&gt;Deigo&lt;/a&gt; to complete this to provide a migration path for OSWorkflow users.&lt;br /&gt;&lt;br /&gt;Other enhancements include exception scopes, the ability to include on-entry and on-exit actions on various node types, integration with our binary persistence mechanism to persist the state of long running processes, etc. Check out the Drools Flow documentation to learn more.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Drools Clips&lt;/h2&gt;A very alpha quality version of Drools Clips is now working and supports:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;deftemplate&lt;/li&gt;&lt;li&gt;defrule&lt;/li&gt;&lt;li&gt;deffuction&lt;/li&gt;&lt;li&gt;and/or/not/exists/test Conditional Elements&lt;/li&gt;&lt;li&gt;Literal, Variable, Return Value and Predicate field constraints&lt;/li&gt;&lt;/ul&gt;You can look at the &lt;a href="http://fisheye.jboss.org/browse/JBossRules/trunk/drools-clips/src/test/java/org/drools/clips/ClipsShellTest.java?r=HEAD"&gt;ClipsShellTest&lt;/a&gt; and &lt;a href="http://fisheye.jboss.org/browse/JBossRules/trunk/drools-clips/src/test/java/org/drools/clips/LhsClpParserTest.java?r=HEAD"&gt;LhsClipsParserTest&lt;/a&gt; get an idea of the full support. It's still early stages and it's very rough in places, especially on error handling and feedback as well as no view commands to display data. The Shell in action:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_Jrhwx8X9P7g/SGwvSq7EBcI/AAAAAAAAAJY/_u4f3UcQ7bw/s1600-h/shell.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5218598066021729730" style="margin: 0px auto 10px; display: block; cursor: pointer; text-align: center;" alt="" src="http://bp0.blogger.com/_Jrhwx8X9P7g/SGwvSq7EBcI/AAAAAAAAAJY/_u4f3UcQ7bw/s400/shell.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The screen shot is a contrived example but it does show a shell environment cleanly mixing deftemplates and pojos - note that Drools 5.0 does not require shadow facts, due to the new asymmetrical Rete algorithm. It also shows deffunction in use. &lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=WOYprJ"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=WOYprJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=nPhe6j"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=nPhe6j" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=Yi4M1J"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=Yi4M1J" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=k8wSCj"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=k8wSCj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=zGy9Mj"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=zGy9Mj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=27otxJ"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=27otxJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=h80zWJ"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=h80zWJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.athico.com/~r/DroolsAtom/~4/326614542" height="1" width="1"/&gt;</content><link rel="alternate" type="text/html" href="http://feeds.athico.com/~r/DroolsAtom/~3/326614542/drools-50-m1-new-and-noteworthy.html" title="Drools 5.0 M1 - New and Noteworthy" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5869426&amp;postID=6527476245514381170" title="7 Comments" /><link rel="replies" type="application/atom+xml" href="http://blog.athico.com/feeds/6527476245514381170/comments/default" title="Post Comments" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5869426/posts/default/6527476245514381170" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5869426/posts/default/6527476245514381170" /><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email></author><feedburner:origLink>http://blog.athico.com/2008/07/drools-50-m1-new-and-noteworthy.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5869426.post-1267605316588454341</id><published>2008-07-02T16:14:00.005+01:00</published><updated>2008-07-05T19:11:00.901+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ORF" /><category scheme="http://www.blogger.com/atom/ns#" term="Drools" /><title type="text">Texas October Rules Fest and Drools Team Meeting</title><content type="html">The Texas Rules User Group is organising a 3 day conference for Expert Systems starting October the 22nd - the &lt;a href="http://rulesfest.org/"&gt;October Rules Fest (ORF) &lt;/a&gt;. It's a non-profit event costing only $150 for the three days. This is a "No Fluff, Just Stuff" conference and the idea is to keep it technical so people can actually learn. The sessions are listed &lt;a href="http://rulesfestregistration.dallasrulesgroup.org/Sessions"&gt;here&lt;/a&gt;, the speakers bios &lt;a href="http://rulesfestregistration.dallasrulesgroup.org/Speakers"&gt;here&lt;/a&gt; and the agenda &lt;a href="http://rulesfestregistration.dallasrulesgroup.org/Agenda"&gt;here.&lt;/a&gt; The sessions and speakers are still fluid at the moment, but I've been sent a more up to date version, which I've pasted at the end of this blog. There is also a promotion PDF &lt;a href="http://www.bizrules.info/files/DallasRulesGroup_OctoberRulesFest_2008"&gt;here&lt;/a&gt;. I know the organisers are still searching for sponsors, to help justify the low cost for the event, so if you can help please do.&lt;br /&gt;&lt;br /&gt;The Drools team will arrive a week earlier on the 15th of October and will be doing a 7 day team meeting at the &lt;a href="http://book.bestwestern.com/bestwestern/productInfo.do?propertyCode=44540"&gt;Best Western Hotel&lt;/a&gt;. This meeting is open to the public, so if you want some hard core hands on coding do try and come down and join in with the coding fest :) This is a great opportunity to learn Drools at an indepth level and contribute back to the project, we can also assist helping you to solve any Drools extensions you are doing for your job - a great opportunity for you to get your managers time and budget approval :) The Best Western is currently only $89 per night, so very affordable.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The current tentative agenda for ORF is pasted below:&lt;br /&gt;&lt;br /&gt;&lt;style&gt;   &lt;!--    BODY,DIV,TABLE,THEAD,TBODY,TFOOT,TR,TH,TD,P { font-family:"Verdana"; font-size:medium }    --&gt;  &lt;/style&gt;&lt;br /&gt;&lt;table cellspacing="0" cols="6" rules="none" border="0" frame="void"&gt;&lt;colgroup&gt;&lt;col width="165"&gt;&lt;col width="191"&gt;&lt;col width="192"&gt;&lt;col width="128"&gt;&lt;col width="128"&gt;&lt;col width="148"&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top" align="left" width="165" height="24"&gt;&lt;b&gt;Wednesday AM&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left" width="191"&gt;&lt;b&gt;Tutorials &lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left" width="192"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td valign="top" align="left" width="128"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td align="left" width="276" colspan="2"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" align="left" height="48"&gt;&lt;span style="color:#0000d4;"&gt;8:00 - 8:15&lt;/span&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;span style="color:#0000d4;"&gt;Pete Carapetyn&lt;/span&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;span style="color:#0000d4;"&gt;Data Fundamentals&lt;/span&gt;&lt;/td&gt;&lt;td valign="top" align="left" colspan="3"&gt;&lt;span style="color:#0000d4;"&gt;Welcome&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" align="left" height="49"&gt;&lt;span style="color:#0000d4;"&gt;8:15 - 9:15&lt;/span&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;span style="color:#0000d4;"&gt;Dr. Kappleman&lt;/span&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;span style="color:#0000d4;"&gt;North Texas Univ.&lt;/span&gt;&lt;/td&gt;&lt;td valign="top" align="left" colspan="3"&gt;&lt;span style="color:#0000d4;"&gt;Rules: Essential But Only Part of the Puzzle&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" align="left" height="48"&gt;9:30 - 10:20&lt;/td&gt;&lt;td valign="top" align="left"&gt;Rolando Hernandez&lt;/td&gt;&lt;td valign="top" align="left"&gt;BizRules.Com&lt;/td&gt;&lt;td valign="top" align="left" colspan="3"&gt;Introduction to Business Rules Architecture and Rulebase Technology&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" align="left" height="24"&gt;10:30 - 11:20&lt;/td&gt;&lt;td valign="top" align="left"&gt;Larry Terril&lt;/td&gt;&lt;td valign="top" align="left"&gt;EBDX&lt;/td&gt;&lt;td valign="top" align="left" colspan="3"&gt;Declarative vs Procedural Programming&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" align="left" height="25"&gt;11:30 - 12:30&lt;/td&gt;&lt;td valign="top" align="left"&gt;Greg Barton&lt;/td&gt;&lt;td valign="top" align="left"&gt;Greg Stuff&lt;/td&gt;&lt;td valign="top" align="left" colspan="3"&gt;Introduction to Evolvable Rules&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" align="left" height="24"&gt;&lt;b&gt;&lt;span style="color:#339966;"&gt;12:30 - 2:00&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;b&gt;&lt;span style="color:#339966;"&gt;Lunch&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td valign="top" align="left" colspan="3"&gt;&lt;b&gt;&lt;span style="color:#339966;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" align="left" height="24"&gt;&lt;b&gt;&lt;span style="color:#339966;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;b&gt;&lt;span style="color:#339966;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;b&gt;&lt;span style="color:#339966;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td align="left"&gt;&lt;b&gt;&lt;span style="color:#339966;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td align="left"&gt;&lt;b&gt;&lt;span style="color:#339966;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" align="left" height="24"&gt;&lt;b&gt;Wednesday PM&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;b&gt;Conference Begins&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;b&gt;&lt;span style="color:#339966;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td align="left"&gt;&lt;b&gt;&lt;span style="color:#339966;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td align="left"&gt;&lt;b&gt;&lt;span style="color:#339966;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" align="left" height="49"&gt;2:00 - 3:15&lt;/td&gt;&lt;td valign="top" align="left"&gt;Jason Morris&lt;/td&gt;&lt;td valign="top" align="left"&gt;Morris Technical Solutions (Jess)&lt;/td&gt;&lt;td valign="top" align="left" colspan="3"&gt;The Ontology of Rulebased Systems&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" align="left" height="49"&gt;3:30 - 4:45&lt;/td&gt;&lt;td valign="top" align="left"&gt;Edson Tirelli&lt;/td&gt;&lt;td valign="top" align="left"&gt;Drools&lt;/td&gt;&lt;td valign="top" align="left" colspan="3"&gt;CEP - Complex Event Procesing Based on Rete&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" align="left" height="49"&gt;5:00 - 6:15&lt;/td&gt;&lt;td valign="top" align="left"&gt;Michael Neale&lt;/td&gt;&lt;td valign="top" align="left"&gt;Drools&lt;/td&gt;&lt;td valign="top" align="left" colspan="3"&gt;"Guvnor" - A BRMS for Drools and Managing Other Asset Types&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" align="left" height="25" sdnum="2057;0;HH:MM"&gt;6:15 - 8:00&lt;/td&gt;&lt;td valign="top" align="left"&gt;Pub Night 1&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td valign="top" align="left" colspan="3"&gt;??&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" align="left" height="24"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td valign="top" align="left" colspan="3"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" align="left" height="24"&gt;&lt;b&gt;Thursday AM&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;b&gt;Vendor's Day &lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td valign="top" align="left" colspan="3"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" align="left" height="51"&gt;&lt;span style="color:#0000d4;"&gt;8:00 - 9:00&lt;/span&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;span style="color:#0000d4;"&gt;Dr. Levine&lt;/span&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;span style="color:#0000d4;"&gt;Unit Texas Arlington&lt;/span&gt;&lt;/td&gt;&lt;td valign="top" align="left" colspan="3"&gt;&lt;span style="color:#0000d4;"&gt;Keynote 2: Brain mechanisms for Making, Breaking and Changing Rules&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" align="left" height="48"&gt;9:00 - 10:00&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;b&gt;Art Torteloro&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;b&gt;Visual Rules&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left" colspan="3"&gt;&lt;b&gt;Constraints and Integration of Methodology With Automation&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" align="left" height="96"&gt;10:15 - 11:15&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;b&gt;Carlos Seranno-Morales and Carole Ann Berliotz-Matignon&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;b&gt;Fair Isaac&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left" colspan="3"&gt;&lt;b&gt;TBD&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" align="left" height="44"&gt;11:30 - 12:30&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;b&gt;Dr. Feldman&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;b&gt;Open Rules&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left" colspan="3"&gt;&lt;b&gt;Using Constraing Programming in Business Rules Environment&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" align="left" height="24"&gt;&lt;b&gt;&lt;span style="color:#339966;"&gt;12:30 - 2:00&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;b&gt;&lt;span style="color:#339966;"&gt;Lunch&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td valign="top" align="left" colspan="3"&gt;&lt;b&gt;&lt;span style="color:#339966;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" align="left" height="24"&gt;&lt;b&gt;&lt;span style="color:#339966;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;b&gt;&lt;span style="color:#339966;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;b&gt;&lt;span style="color:#339966;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td align="left"&gt;&lt;b&gt;&lt;span style="color:#339966;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td align="left"&gt;&lt;b&gt;&lt;span style="color:#339966;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" align="left" height="24"&gt;&lt;b&gt;Thursday PM&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;b&gt;&lt;span style="color:#339966;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;b&gt;&lt;span style="color:#339966;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td align="left"&gt;&lt;b&gt;&lt;span style="color:#339966;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td align="left"&gt;&lt;b&gt;&lt;span style="color:#339966;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" align="left" height="47"&gt;2:00 - 3:15&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;b&gt;??&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;b&gt;Informavores&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left" colspan="3"&gt;TBD&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" align="left" height="47"&gt;3:30 - 4:45&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;b&gt;??&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;b&gt;Haley Systems&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left" colspan="3"&gt;TBD&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" align="left" height="52"&gt;5:00 - 6:15&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;b&gt;Daniel Selman&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;b&gt;ILOG&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left" colspan="3"&gt;&lt;b&gt;Sequential Rules and Their Applications&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" align="left" height="25" sdnum="2057;0;HH:MM"&gt;6:15 - 8:00&lt;/td&gt;&lt;td valign="top" align="left"&gt;Pub Night 2&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td valign="top" align="left" colspan="3"&gt;??&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" align="left" height="24"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td align="left" colspan="2"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" align="left" height="24"&gt;&lt;b&gt;Friday AM&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;b&gt;The Future&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td align="left" colspan="2"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" align="left" height="47"&gt;&lt;span style="color:#0000d4;"&gt;8:00 - 9:00&lt;/span&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;b&gt;&lt;span style="color:#0000d4;"&gt;??&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;b&gt;&lt;span style="color:#0000d4;"&gt;Countrywide&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left" colspan="3"&gt;&lt;b&gt;&lt;span style="color:#0000d4;"&gt;Keynote 3: Guest speaker&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" align="left" height="56"&gt;9:00 - 10:00&lt;/td&gt;&lt;td valign="top" align="left"&gt;Dr. Hicks&lt;/td&gt;&lt;td valign="top" align="left"&gt;Texas A&amp;amp;M, EZ-Xpert&lt;/td&gt;&lt;td valign="top" align="left" colspan="3"&gt;Verification of Propositional Logic Systems and it's Implications&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" align="left" height="71"&gt;10:15 - 11:15&lt;/td&gt;&lt;td valign="top" align="left"&gt;Gary Riley&lt;/td&gt;&lt;td valign="top" align="left"&gt;CLIPS&lt;/td&gt;&lt;td valign="top" align="left" colspan="3"&gt;RE-architecting CLIPS: recent Changes to Improve Performance, Integration and Internationalization&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" align="left" height="48"&gt;11:30 - 12:30&lt;/td&gt;&lt;td valign="top" align="left"&gt;Mark Proctor&lt;/td&gt;&lt;td valign="top" align="left"&gt;Drools&lt;/td&gt;&lt;td valign="top" align="left" colspan="3"&gt;Declarative Programming with Rules, Processes and CEP&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" align="left" height="24"&gt;&lt;b&gt;&lt;span style="color:#339966;"&gt;12:30 - 2:00&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;b&gt;&lt;span style="color:#339966;"&gt;Lunch&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td valign="top" align="left" colspan="3"&gt;&lt;b&gt;&lt;span style="color:#339966;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" align="left" height="24"&gt;&lt;b&gt;&lt;span style="color:#339966;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;b&gt;&lt;span style="color:#339966;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;b&gt;&lt;span style="color:#339966;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td align="left"&gt;&lt;b&gt;&lt;span style="color:#339966;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td align="left"&gt;&lt;b&gt;&lt;span style="color:#339966;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" align="left" height="24"&gt;&lt;b&gt;Friday PM&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;b&gt;Parallel and Conference Wrapup&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;b&gt;&lt;span style="color:#339966;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td align="left"&gt;&lt;b&gt;&lt;span style="color:#339966;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td align="left"&gt;&lt;b&gt;&lt;span style="color:#339966;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" align="left" height="69"&gt;&lt;b&gt;&lt;span style="color:#ff6600;"&gt;2:00 - 3:15&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;b&gt;&lt;span style="color:#ff6600;"&gt;Dr. Forgy&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;b&gt;&lt;span style="color:#ff6600;"&gt;PST, Rete, Rete 2&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left" colspan="3"&gt;&lt;b&gt;&lt;span style="color:#ff6600;"&gt;Parallel Rulebase Technology (jco) - Parallel OPSJ, Rete, Rete 2, New Developments in Rulebase Theory&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" align="left" height="25"&gt;&lt;b&gt;&lt;span style="color:#0000d4;"&gt;3:30 - 5:30&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;b&gt;&lt;span style="color:#0000d4;"&gt;Everyone&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;b&gt;&lt;span style="color:#0000d4;"&gt;Everyone&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left" colspan="3"&gt;&lt;b&gt;&lt;span style="color:#0000d4;"&gt;Conference Review&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" align="left" height="25" sdnum="2057;0;HH:MM"&gt;&lt;b&gt;5:15 - 8:00&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;b&gt;Pub Night 3&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left"&gt;&lt;b&gt;Party Time&lt;/b&gt;&lt;/td&gt;&lt;td valign="top" align="left" colspan="3"&gt;&lt;b&gt;Billy Bob's in Fort Worth&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=CLsSzJ"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=CLsSzJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=v35jnj"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=v35jnj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=MZyoXJ"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=MZyoXJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=R1tWRj"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=R1tWRj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=8sja2j"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=8sja2j" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=OJsoIJ"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=OJsoIJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=llnrUJ"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=llnrUJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.athico.com/~r/DroolsAtom/~4/325045585" height="1" width="1"/&gt;</content><link rel="alternate" type="text/html" href="http://feeds.athico.com/~r/DroolsAtom/~3/325045585/texas-october-rules-fest-and-drools.html" title="Texas October Rules Fest and Drools Team Meeting" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5869426&amp;postID=1267605316588454341" title="0 Comments" /><link rel="replies" type="application/atom+xml" href="http://blog.athico.com/feeds/1267605316588454341/comments/default" title="Post Comments" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5869426/posts/default/1267605316588454341" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5869426/posts/default/1267605316588454341" /><author><name>Mark Proctor</name><uri>http://www.blogger.com/profile/03304277188725220501</uri><email>noreply@blogger.com</email></author><feedburner:origLink>http://blog.athico.com/2008/07/texas-october-rules-fest-and-drools.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5869426.post-4718218152804473757</id><published>2008-06-25T00:42:00.003+01:00</published><updated>2008-06-27T04:33:39.197+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Clips" /><category scheme="http://www.blogger.com/atom/ns#" term="Drools" /><title type="text">Drools Clips progress</title><content type="html">Made some progress over the weekend with Drools Clips, which will provide a Clips like language for Drools. Deftemplates are now working and I did some work on PackageBuilder so that it's now able to handle multiple namespaces and have a RuleBase attached to provide a more "shell" like environment suitable for Clips. Michael Neale also got a basic command line shell working. So what does it support?&lt;br /&gt;&lt;ul&gt;&lt;li&gt;deftemplate&lt;/li&gt;&lt;li&gt;defrule&lt;/li&gt;&lt;li&gt;deffuction&lt;/li&gt;&lt;li&gt;and/or/not/exists/test Conditional Elements&lt;/li&gt;&lt;li&gt;Literal, Variable, Return Value and Predicate field constraints&lt;/li&gt;&lt;/ul&gt;You can look at the &lt;a href="http://fisheye.jboss.org/browse/JBossRules/trunk/drools-clips/src/test/java/org/drools/clips/ClipsShellTest.java?r=HEAD"&gt;ClipsShellTest&lt;/a&gt; and &lt;a href="http://fisheye.jboss.org/browse/JBossRules/trunk/drools-clips/src/test/java/org/drools/clips/LhsClpParserTest.java?r=HEAD"&gt;LhsClipsParserTest&lt;/a&gt; get an idea of the full support. It's still early stages and it's very rough in places, especially on error handling and feedback as well as no view commands to display data. For a little fun here is a screenshot of the shell in action:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_Jrhwx8X9P7g/SGRYc5qz-KI/AAAAAAAAAIw/xefELIYMRCo/s1600-h/shell.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_Jrhwx8X9P7g/SGRYc5qz-KI/AAAAAAAAAIw/xefELIYMRCo/s400/shell.png" alt="" id="BLOGGER_PHOTO_ID_5216391521941846178" border="0" /&gt;&lt;span style="font-size:78%;"&gt;(click to enlarge)&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;The screen shot is a contrived example but it does show a shell environment cleanly mixing deftemplates and pojos - note that Drools 5.0 does not require shadow facts, due to the new asymmetrical Rete algorithm. It also shows  deffunction in use. This will be part of Milestone1, that I'm hoping to tag tomorrow.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=jl1rwI"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=jl1rwI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=lf39Zi"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=lf39Zi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=fCrXxI"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=fCrXxI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=B81S0i"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=B81S0i" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=BPyZSi"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=BPyZSi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=qLzcoI"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=qLzcoI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=ZK2tVI"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=ZK2tVI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.athico.com/~r/DroolsAtom/~4/321004751" height="1" width="1"/&gt;</content><link rel="alternate" type="text/html" href="http://feeds.athico.com/~r/DroolsAtom/~3/321004751/drools-clips-progress.html" title="Drools Clips progress" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5869426&amp;postID=4718218152804473757" title="1 Comments" /><link rel="replies" type="application/atom+xml" href="http://blog.athico.com/feeds/4718218152804473757/comments/default" title="Post Comments" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5869426/posts/default/4718218152804473757" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5869426/posts/default/4718218152804473757" /><author><name>Mark Proctor</name><uri>http://www.blogger.com/profile/03304277188725220501</uri><email>noreply@blogger.com</email></author><feedburner:origLink>http://blog.athico.com/2008/06/drools-clips-progress.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5869426.post-1099375414641932358</id><published>2008-06-23T17:00:00.002+01:00</published><updated>2008-06-23T17:06:35.802+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Eclipse" /><category scheme="http://www.blogger.com/atom/ns#" term="Drools" /><title type="text">IDE re-license from ASL to EPL</title><content type="html">We are looking to re-license our Eclipse IDE code from Apache Software License to Eclipse Public License. The reason for this is to simply align with the bulk of the Eclipse projects out there, to make bundling, deployment and code re-use much easier. The runtime work will remain as ASL.&lt;br /&gt;&lt;br /&gt;I don't consider this change any issue as the EPL license is not a controversial one, unlike the LGPL. If anyone can see any issues I guess we can always dual license under ASL and EPL, but I don't want to needlessly confuse things.&lt;br /&gt;&lt;br /&gt;I'm looking for community feedback on this before I do the change.&lt;br /&gt;&lt;br /&gt;Mark&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=MdSxtI"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=MdSxtI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=Pfkk0i"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=Pfkk0i" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=YqLxuI"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=YqLxuI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=AYTKni"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=AYTKni" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=tBXadi"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=tBXadi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=xBHW0I"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=xBHW0I" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=80v34I"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=80v34I" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.athico.com/~r/DroolsAtom/~4/318201062" height="1" width="1"/&gt;</content><link rel="alternate" type="text/html" href="http://feeds.athico.com/~r/DroolsAtom/~3/318201062/ide-re-license-from-asl-to-epl.html" title="IDE re-license from ASL to EPL" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5869426&amp;postID=1099375414641932358" title="6 Comments" /><link rel="replies" type="application/atom+xml" href="http://blog.athico.com/feeds/1099375414641932358/comments/default" title="Post Comments" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5869426/posts/default/1099375414641932358" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5869426/posts/default/1099375414641932358" /><author><name>Mark Proctor</name><uri>http://www.blogger.com/profile/03304277188725220501</uri><email>noreply@blogger.com</email></author><feedburner:origLink>http://blog.athico.com/2008/06/ide-re-license-from-asl-to-epl.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5869426.post-2861112504116240256</id><published>2008-06-17T15:15:00.003+01:00</published><updated>2008-06-17T15:30:41.756+01:00</updated><title type="text">Why you need Business Rules in your workflow</title><content type="html">Tom Baeyens has a good post on the &lt;a href="http://processdevelopments.blogspot.com/2008/06/brewing-jbpm-community.html" mce_href="http://processdevelopments.blogspot.com/2008/06/brewing-jbpm-community.html" target="_blank"&gt;jBPM (JBoss workflow) community day that was held at the Guinness brewery in Dublin&lt;/a&gt;.  As you'd expect, the slides have plenty of pictures of people drinking beer, and one or two pictures of people talking about workflow and business processes. (Do not adjust your TV set. This blogpost &lt;span style="font-weight: bold;"&gt;is&lt;/span&gt; about business rules).&lt;br /&gt;&lt;p&gt;What you might not expect is that Business Rules and Rule Engines were key to one of the presentations on the day. In case you missed &lt;b&gt;How to combine  (jBPM) Workflow and (Drools) Business Rules&lt;/b&gt; - here's the summary &lt;a href="http://www.firstpartners.net/blog/technology/java/2008/06/05/jboss-business-rules-and-jbpm-workflow-presentation-dublin/" mce_href="http://www.firstpartners.net/blog/technology/java/2008/06/05/jboss-business-rules-and-jbpm-workflow-presentation-dublin/"&gt;(with the slideset available on this blogpost&lt;/a&gt;).&lt;/p&gt; &lt;ul&gt;&lt;li&gt;Workflow (e.g. JBoss jBPM) is great - it allows you to take spaghetti code and draw it as a workflow diagram (flowchart) so that it can be reviewed by the business (the nice people who pay our wages). You then attach standard (Java) actions to these steps.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Only problem is when you come to a decision node (the one circled in red below)&lt;/span&gt;: How do you decide to go left or right (in the workflow)? Normally this is coded in Java - good for us, but hidden from those nice business people (which means that this is more room for errors-in-translation).&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Business Rules allow you to keep those decision making rules in Plain English&lt;/span&gt;: When something is true , then do this. That's it. The rule engine does most of the hard work.&lt;/li&gt;&lt;li&gt;Integrating Workflow and Rules is easy. Use &lt;a href="http://docs.jboss.com/seam/2.0.2.SP1/reference/en-US/html/drools.html" mce_href="http://docs.jboss.com/seam/2.0.2.SP1/reference/en-US/html/drools.html" target="_blank"&gt;JBoss Seam (link)&lt;/a&gt; or &lt;a href="http://wiki.jboss.org/wiki/JbpmAndDrools" mce_href="http://wiki.jboss.org/wiki/JbpmAndDrools" target="_blank"&gt;do it by hand (link)&lt;/a&gt;. And it works on non-JBoss web / app servers such as Websphere, Oracle Application Server, Tomcat and Weblogic.&lt;/li&gt;&lt;li style="text-align: justify;" mce_style="text-align: justify;"&gt;&lt;b&gt;Repeat x6&lt;/b&gt; : Use workflow and rules. Use workflow and rules ...&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p style="text-align: justify;" mce_style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.firstpartners.net/blog/location/dublin/2008/06/15/how-to-combine-workflow-and-business-rules-in-5-easy-steps/"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/__IRoEcTpZss/SFfJJw2pDoI/AAAAAAAAABE/kFercASF8YE/s400/simple-workflow.PNG" alt="" id="BLOGGER_PHOTO_ID_5212856263274729090" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Maybe it's co-incidence but, &lt;a href="http://processdevelopments.blogspot.com/2008/06/task-assignment-and-pools-harder-then.html" mce_href="http://processdevelopments.blogspot.com/2008/06/task-assignment-and-pools-harder-then.html" target="_blank"&gt;Tom Baeyens is now using strangely Rules-y like  examples over on his workflow blog&lt;/a&gt; .&lt;/p&gt;&lt;p style="text-align: justify;" mce_style="text-align: justify;"&gt; In this case Tom talks about task assignment; You may have a step such as 'Signoff Loan' in your workflow - but who does this task? Often these rules are complicated (e.g. loans less than 10,000 Dollars go to a junior officer, loans over 10 Million go to a bank president etc.). &lt;span style="font-weight: bold;"&gt;Business Rules allow you to keep these workflow task assignments in (almost) plain English.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=gqSPdI"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=gqSPdI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=gBpbti"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=gBpbti" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=Mw2MyI"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=Mw2MyI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=kj7X7i"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=kj7X7i" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=VMSBci"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=VMSBci" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=2rCIZI"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=2rCIZI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=xhJAzI"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=xhJAzI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.athico.com/~r/DroolsAtom/~4/313834846" height="1" width="1"/&gt;</content><link rel="alternate" type="text/html" href="http://feeds.athico.com/~r/DroolsAtom/~3/313834846/why-you-need-business-rules-in-your.html" title="Why you need Business Rules in your workflow" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5869426&amp;postID=2861112504116240256" title="3 Comments" /><link rel="replies" type="application/atom+xml" href="http://blog.athico.com/feeds/2861112504116240256/comments/default" title="Post Comments" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5869426/posts/default/2861112504116240256" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5869426/posts/default/2861112504116240256" /><author><name>paul browne</name><uri>http://www.blogger.com/profile/08142439594476850988</uri><email>noreply@blogger.com</email></author><feedburner:origLink>http://blog.athico.com/2008/06/why-you-need-business-rules-in-your.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5869426.post-7387761543890957425</id><published>2008-06-13T12:35:00.002+01:00</published><updated>2008-06-13T12:38:57.917+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Job" /><category scheme="http://www.blogger.com/atom/ns#" term="Drools" /><title type="text">Drools Job Posting - Drools Designer (Croatia)</title><content type="html">Another job posting came in, so thought I'd highlight it in the blog.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://jobs.athico.com/job/4b5c654cec80b8695a2884f476a002ca/?d=1&amp;amp;source=jobroll"&gt;&lt;span style="font-weight: bold;"&gt;Drools Designer&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;We are currently recruiting for an experienced software engineer with specific knowledge of Java and Rules engines, ideally DROOLS. You must have several years experience as a developer/ designer in enterprise environments, have an excellent grasp of rules engine concepts, supporting database design, and understand current web technologies. &lt;br /&gt;&lt;br /&gt;The job is in Zagreb, but home based working is offered.&lt;br /&gt;&lt;br /&gt;The opportunity is to work for a very innovative company in the media area on the developmen  of a new technical platform. long term prospects very good. The position is that of designer, working with the software architect.&lt;br /&gt;&lt;br /&gt;You must be able to demonstrate a very high level of intellectual curiosity about technologies and their use and deployment.&lt;br /&gt;&lt;br /&gt;You must be fluent in english.&lt;br /&gt;&lt;br /&gt;Click &lt;a href="http://jobs.athico.com/job/4b5c654cec80b8695a2884f476a002ca/?d=1&amp;amp;source=jobroll"&gt;here&lt;/a&gt; for more details and to apply for this job.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=ZKIfDI"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=ZKIfDI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=J7hv2i"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=J7hv2i" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=is119I"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=is119I" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=5ltuzi"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=5ltuzi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=XZf1zi"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=XZf1zi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=wd2XaI"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=wd2XaI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=gqobHI"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=gqobHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.athico.com/~r/DroolsAtom/~4/311097645" height="1" width="1"/&gt;</content><link rel="alternate" type="text/html" href="http://feeds.athico.com/~r/DroolsAtom/~3/311097645/drools-job-posting-drools-designer.html" title="Drools Job Posting - Drools Designer (Croatia)" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5869426&amp;postID=7387761543890957425" title="0 Comments" /><link rel="replies" type="application/atom+xml" href="http://blog.athico.com/feeds/7387761543890957425/comments/default" title="Post Comments" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5869426/posts/default/7387761543890957425" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5869426/posts/default/7387761543890957425" /><author><name>Mark Proctor</name><uri>http://www.blogger.com/profile/03304277188725220501</uri><email>noreply@blogger.com</email></author><feedburner:origLink>http://blog.athico.com/2008/06/drools-job-posting-drools-designer.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5869426.post-2244986473592385751</id><published>2008-06-12T00:49:00.002+01:00</published><updated>2008-06-12T00:55:30.156+01:00</updated><title type="text">Google Summer of Code project</title><content type="html">Anton Arhipov (a drools contributor who has worked on some Eclipse stuff in the past) - got a proposal accepted as a Google Summer of Code project.&lt;br /&gt;&lt;br /&gt;His project is to make Guvnor (the BRMS) work with multiple content types - and more importantly have "pluggable" content editors (something that is kind of new to do in GWT - as GWT code is statically compiled into javascript).&lt;br /&gt;&lt;br /&gt;He blogs about his experiences &lt;a href="http://arhipov.blogspot.com/"&gt;here&lt;/a&gt;.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=jHDUoI"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=jHDUoI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=QfQJAi"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=QfQJAi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=LSD1QI"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=LSD1QI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=xwdfti"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=xwdfti" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=tM6chi"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=tM6chi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=dWbUhI"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=dWbUhI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=vzoSvI"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=vzoSvI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.athico.com/~r/DroolsAtom/~4/310014753" height="1" width="1"/&gt;</content><link rel="alternate" type="text/html" href="http://feeds.athico.com/~r/DroolsAtom/~3/310014753/google-summer-of-code-project.html" title="Google Summer of Code project" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5869426&amp;postID=2244986473592385751" title="0 Comments" /><link rel="replies" type="application/atom+xml" href="http://blog.athico.com/feeds/2244986473592385751/comments/default" title="Post Comments" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5869426/posts/default/2244986473592385751" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5869426/posts/default/2244986473592385751" /><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email></author><feedburner:origLink>http://blog.athico.com/2008/06/google-summer-of-code-project.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5869426.post-1819391861724888483</id><published>2008-06-11T12:54:00.003+01:00</published><updated>2008-06-11T13:04:38.428+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Presentation" /><title type="text">JBoss Benelux User Group</title><content type="html">I will be speaking next Friday (June 20th) at the JBoss Benelux User Group in Rotterdam (Netherlands) about Drools in general.  So if you want a gentle introduction to Drools or want to chat afterwards, you can find the event details here:&lt;br /&gt;&lt;a href="http://www.lunatech-research.com/archives/2008/05/16/jbug-2008-06"&gt;http://www.lunatech-research.com/archives/2008/05/16/jbug-2008-06&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Registration: &lt;a href="http://www.lunatech-research.com/event/register/jbug4"&gt;http://www.lunatech-research.com/event/register/jbug4&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Summary and programme:&lt;br /&gt;The fourth Benelux JBoss User Group&lt;br /&gt; - JBoss Portal - Julien Viet and Thomas Heute - JBoss&lt;br /&gt; - Hibernate Search - Emmanuel Bernard - JBoss&lt;br /&gt; - Woman in IT - Clara Ko and Linda van der Pal - jduchess.org&lt;br /&gt; - JBoss Drools - Kris Verlaenen - JBoss&lt;br /&gt;&lt;br /&gt;Date: Friday, 20 June 2008.&lt;br /&gt;Arrive 13.30-14.00, presentations start 14.00, open bar 18.45 - 20.00.&lt;br /&gt;Location: Staal Rotterdam, World Trade Center, Beursplein 33, 3011 AA Rotterdam&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=dhoyRI"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=dhoyRI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=gFs9Si"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=gFs9Si" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=8mcoYI"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=8mcoYI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=EqZkii"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=EqZkii" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=mI7S6i"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=mI7S6i" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=BJE0FI"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=BJE0FI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=AJXumI"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=AJXumI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.athico.com/~r/DroolsAtom/~4/309582010" height="1" width="1"/&gt;</content><link rel="alternate" type="text/html" href="http://feeds.athico.com/~r/DroolsAtom/~3/309582010/jboss-benelux-user-group.html" title="JBoss Benelux User Group" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5869426&amp;postID=1819391861724888483" title="1 Comments" /><link rel="replies" type="application/atom+xml" href="http://blog.athico.com/feeds/1819391861724888483/comments/default" title="Post Comments" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5869426/posts/default/1819391861724888483" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5869426/posts/default/1819391861724888483" /><author><name>Kris Verlaenen</name><uri>http://www.blogger.com/profile/11456672157934554969</uri><email>noreply@blogger.com</email></author><feedburner:origLink>http://blog.athico.com/2008/06/jboss-benelux-user-group.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5869426.post-4327213697825798392</id><published>2008-06-06T18:29:00.005+01:00</published><updated>2008-06-06T23:05:26.060+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="DSL regexp antlr" /><title type="text">Allowing variable "masks" in DSL grammar - by Matt Geis</title><content type="html">Revisiting some of the concepts Edson posted &lt;a id="xr3t0" href="http://blog.athico.com/2008/04/revisiting-antlr.html"&gt;earlier&lt;/a&gt;, we decided to put &lt;a id="xr3t1" href="http://www.antlr.org/"&gt;ANTLR&lt;/a&gt; to use in how we handle DSLs. &lt;p id="xr3t2"&gt; At a high level, the logic used to parse a DSL entry was pretty straightforward. We were matching a pattern of "name=value", identifying a few groups inside the "name" block as variables (text surrounded by brackets, like "{name}"), and storing those variables for later use when the "value" block is substituted into the actual rule that needs to be expanded from a DSL into the DRL format that Drools knows how to work with. &lt;/p&gt;&lt;p id="xr3t3"&gt;However, we found that in certain circumstances, we'd pushed the regular expression to its limits. Its lifecycle consisted of the construction of a pattern string, followed by an optional capture group prepended to the DSL entry, and an optional capture group appended to it. Additionally, because Drools DSLs can handle regular expressions in the body of a DSL entry, we also had to allow &lt;i id="xr3t4"&gt;our &lt;/i&gt;regular expression (and the corresponding escape codes) to identify embedded regular expressions. These pattern strings were defined in java files, so any spaces or backslashes had to be escaped as well. Add it all together, and you get a regular expression that was difficult to read, and more difficult to modify without causing an unintended ripple effect through the rest of the expression. Finally, we learned that the resulting expression was greedier than we wanted it to be. It was easy enough to write a line like &lt;/p&gt;&lt;p id="xr3t5"&gt; &lt;/p&gt;&lt;pre id="xr3t6"&gt;a user exists named "{name}" = User (name == "{name}")&lt;/pre&gt; &lt;p id="xr3t7"&gt;But, if you have an object with a lot of attributes and want to support arbitrary creation of rules, you can't write a DSL expression for every possible permutation of attributes used in the LHS of your rule. Moreover, you may want to include constraints inside of a "from" or "exists" clause. To do so, you would want a DSL entry like &lt;/p&gt;&lt;p id="xr3t8"&gt; &lt;/p&gt;&lt;pre id="xr3t9"&gt;a user exists with {attribute} {value} = User (attribute == {value})&lt;/pre&gt; &lt;p id="xr3t10"&gt;The pattern ended up matching not only the first constraint, but also part of subsequent constraints applied (there were DSL entries for the first constraint on any object, and for subsequent constraints), because any variable used was translated to a capture group of "(.*?)". &lt;/p&gt;&lt;p id="xr3t11"&gt; Edson had the idea of allowing users to define the exact nature of a variable, in other words... &lt;/p&gt;&lt;p id="xr3t12"&gt; &lt;/p&gt;&lt;pre id="xr3t13"&gt;a user exists with social security number "{ssn:\d{3}-\d{2}-\d{4}}" = User (ssn == "{ssn}")&lt;/pre&gt; &lt;p id="xr3t14"&gt;Using ANTLR, we were able to parse the DSL entries and accurately isolate variable definitions, patterns within definitions, variable usage, and literal text. So now, it's straightforward to create a very strict matching such as... &lt;/p&gt;&lt;p id="xr3t15"&gt; &lt;/p&gt;&lt;pre id="xr3t16"&gt;[condition][]user has contact where {constraints}= u : User and exists (f: Person(where {constraints}) from u.contacts)&lt;br /&gt;[condition][]where {attr:[A-Za-z0-9]+} is "{value}"={attr} == "{value}"&lt;br /&gt;[condition][]and {attr:[A-Za-z0-9]+} is "{value}"=, {attr} == "{value}"&lt;/pre&gt; &lt;p id="xr3t17"&gt; which could support a rule like &lt;/p&gt;&lt;p id="xr3t18"&gt; &lt;/p&gt;&lt;pre id="xr3t19"&gt;user has contact where firstName is "Edson" and country is "Brazil"&lt;/pre&gt; &lt;p id="xr3t20"&gt; just as easily as it could support  &lt;/p&gt;&lt;p id="xr3t21"&gt; &lt;/p&gt;&lt;pre id="xr3t22"&gt;user has contact where lastName is "Tirelli" and company is "Red Hat"&lt;/pre&gt; &lt;p id="xr3t23"&gt;An even more user-friendly DSL can be built by the correct ordering of your DSL statements. For example, the addition of the following lines &lt;/p&gt;&lt;p id="xr3t24"&gt; &lt;/p&gt;&lt;pre id="xr3t25"&gt;[condition][]first name=firstName&lt;br /&gt;[condition][]last name=lastName&lt;/pre&gt; &lt;p id="xr3t26"&gt; would allow the user to rewrite the above rules as  &lt;/p&gt;&lt;p id="xr3t27"&gt; &lt;/p&gt;&lt;pre id="xr3t28"&gt;user has contact where first name is "Edson" and country is "Brazil"&lt;/pre&gt; &lt;p id="xr3t29"&gt; &lt;/p&gt;&lt;pre id="xr3t30"&gt;user has contact where last name is "Tirelli" and company is "Red Hat"&lt;/pre&gt; &lt;p id="xr3t31"&gt; Take that approach, and create some simple token replacements like  &lt;/p&gt;&lt;p id="xr3t32"&gt; &lt;/p&gt;&lt;pre id="xr3t33"&gt;[condition][]greater than = &gt;&lt;br /&gt;[condition][]less than = &lt;&lt;br /&gt;[condition][]is = ==&lt;br /&gt;[condition][]where {attr:[A-Za-z0-9]+} is {value:[0-9]+}={attr} == {value} &lt;br /&gt;[condition][]and {attr:[A-Za-z0-9]+} is {value:[0-9]+}=, {attr} == {value}&lt;/pre&gt; &lt;p id="xr3t34"&gt; and a universe of flexibility opens up in front of you, as you can now accurately construct sentence fragments and phrases. &lt;/p&gt;&lt;p id="xr3t35"&gt;(note that attention to the ordering of such DSL entries is CRITICAL, as expansion of one DSL entry will affect the matching of subsequent entries, so if you were to match line 3 above, lines 4 and 5 would never match -- you'd have to change "is" to "==" to make them match) &lt;/p&gt;&lt;p id="xr3t36"&gt;With the new ANTLR model, we were able to easily support the requirement to limit matches by user-defined patterns (on a variable-by-variable basis), as well as pave the way for future enhancements to DSL usage. &lt;/p&gt;&lt;p id="xr3t37"&gt;Finally, now that we are liberated from the usage of a few regular expressions that capture everything, we can move ahead with other features for Drools DSLs. What started as &lt;/p&gt;&lt;pre id="xr3t38"&gt;{variable}&lt;/pre&gt; and progressed to &lt;pre id="xr3t39"&gt;{variable:pattern}&lt;/pre&gt; could be extended do something like &lt;pre id="xr3t40"&gt;{variable:[attributeName,attributeValue]}&lt;/pre&gt; Examples of a possible attribute include a literal enumeration of allowable values for that variable, the name of a function to invoke to validate that the captured variable is allowed, the name of a function to invoke that provides a list of allowable values (a feature that could be leveraged by both the Eclipse plugin and in Guvnor). &lt;p id="xr3t41"&gt;Take the pattern matching for a test drive, let us know how it works for you (or doesn't, if that's the case), and tell us if there are any features you'd like implemented. &lt;/p&gt;&lt;p id="xr3t42"&gt;Caveat emptor: My rewrite of the DSL engine to use ANTLR was the result of just such a feature request. The need for tighter variable binding (basically "named capture groups") was acknowledged, and I was invited to make the necessary changes. I had no idea that it'd be so involved, or that the effort would be as rewarding as it has been.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p id="xr3t42"&gt;&lt;span style="font-style: italic;"&gt;Matt Geis&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=t2MkiI"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=t2MkiI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=rmAN6i"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=rmAN6i" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=wk4DUI"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=wk4DUI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=R6XwRi"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=R6XwRi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=SVNDDi"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=SVNDDi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=3Si7QI"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=3Si7QI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=p3LNjI"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=p3LNjI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.athico.com/~r/DroolsAtom/~4/306249319" height="1" width="1"/&gt;</content><link rel="alternate" type="text/html" href="http://feeds.athico.com/~r/DroolsAtom/~3/306249319/allowing-variable-masks-in-dsl-grammar.html" title="Allowing variable &quot;masks&quot; in DSL grammar - by Matt Geis" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5869426&amp;postID=4327213697825798392" title="0 Comments" /><link rel="replies" type="application/atom+xml" href="http://blog.athico.com/feeds/4327213697825798392/comments/default" title="Post Comments" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5869426/posts/default/4327213697825798392" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5869426/posts/default/4327213697825798392" /><author><name>Edson Tirelli</name><uri>http://www.blogger.com/profile/06799293335230465902</uri><email>noreply@blogger.com</email></author><feedburner:origLink>http://blog.athico.com/2008/06/allowing-variable-masks-in-dsl-grammar.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5869426.post-444899475860550800</id><published>2008-06-01T13:44:00.005+01:00</published><updated>2008-06-02T10:08:27.805+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="drools puzzle" /><title type="text">Drools Puzzle Round 3: Mastermind</title><content type="html">&lt;span style="color: rgb(255, 0, 0); font-style: italic;"&gt;Important&lt;/span&gt;: &lt;a href="http://blog.athico.com/2007/08/drools-puzzles.html"&gt;Participation Rules&lt;/a&gt;. The rules are updated. Links to past puzzles and result reports can be found at the end of that entry.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Difficulty of this round&lt;/span&gt;: &lt;span style="font-weight: bold;"&gt;middle++&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;Submission deadline&lt;/span&gt;: &lt;span style="font-weight: bold;"&gt;August 16th,  2008&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;Submission email&lt;/span&gt;: &lt;b&gt;droolspuzzle@gmail.com&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;This time we'd like to see implementation of the &lt;span style="font-style: italic;"&gt;codebreaker &lt;/span&gt;for a variation of the classic game "&lt;a href="http://en.wikipedia.org/wiki/Mastermind_%28board_game%29"&gt;Mastermind&lt;/a&gt;".&lt;br /&gt;&lt;br /&gt;Please refer to the &lt;a href="http://www.blogger.com/Please%20refer%20to%20the%20wikipedia%20Mastermind%20page%20for%20the%20basic%20rules%20for"&gt;wikipedia Mastermind page&lt;/a&gt; for the game's basic rules. Our variation employs 12 different colors and 8 code slots. The &lt;a href="http://www.ningning.org/droolspuzzles/mastermind/CodeMaker.java"&gt;CodeMaker.java&lt;/a&gt; is provided &lt;a href="http://www.ningning.org/droolspuzzles/mastermind/CodeMaker.java"&gt;here&lt;/a&gt;. Participators must use this class as &lt;span style="font-style: italic;"&gt;codemaker&lt;/span&gt;. The inline documentation of this class explains the judging rules in detail. The main method in the CodeMaker.java demonstrates how to call the code getter and how to use the answer judge.&lt;br /&gt;&lt;br /&gt;Participators are required to write the &lt;span style="font-style: italic;"&gt;codebreaker &lt;/span&gt;part of the mastermind application. Maximal trials is not specified in our &lt;span style="font-style: italic;"&gt;codemaker&lt;/span&gt;, your should design a strategy which can minimize the number of trials.&lt;br /&gt;&lt;br /&gt;Your test code should break 1000 different codes and output&lt;br /&gt;&lt;ul&gt;&lt;li&gt;the number of average trials for breaking a code,&lt;/li&gt;&lt;li&gt;the average time used for breaking a code&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Something looks like this:&lt;span class="kw3"&gt;&lt;/span&gt;&lt;span style="font-family:monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre class="java5"&gt;&lt;span style="color: rgb(153, 51, 51);"&gt;long&lt;/span&gt; totalTrials = &lt;span style="color: rgb(204, 102, 204);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(153, 51, 51);"&gt;long&lt;/span&gt; startTime = &lt;span style="color: rgb(170, 170, 221); font-weight: bold;"&gt;System&lt;/span&gt;.&lt;span style="color: rgb(0, 102, 0);"&gt;currentTimeMillis&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(177, 177, 0);"&gt;for&lt;/span&gt; &lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(153, 51, 51);"&gt;int&lt;/span&gt; i = &lt;span style="color: rgb(204, 102, 204);"&gt;0&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;;&lt;/span&gt; i &lt;span style="color: rgb(102, 204, 102);"&gt;&lt;&lt;/span&gt; &lt;span style="color: rgb(204, 102, 204);"&gt;1000&lt;/span&gt;, i++&lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;{&lt;/span&gt;&lt;br /&gt;CodeMaker maker = &lt;span style="color: rgb(0, 0, 0); font-weight: bold;"&gt;new&lt;/span&gt; CodeMaker&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;;&lt;/span&gt;&lt;br /&gt;CodePeg&lt;span style="color: rgb(102, 204, 102);"&gt;[&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;]&lt;/span&gt; code = maker.&lt;span style="color: rgb(0, 102, 0);"&gt;getCode&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128); font-style: italic;"&gt;// call your code breaker routine here&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 128, 128); font-style: italic;"&gt;//...&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(153, 51, 51);"&gt;long&lt;/span&gt; endTime = &lt;span style="color: rgb(170, 170, 221); font-weight: bold;"&gt;System&lt;/span&gt;.&lt;span style="color: rgb(0, 102, 0);"&gt;currentTimeMillis&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(170, 170, 221); font-weight: bold;"&gt;System&lt;/span&gt;.&lt;span style="color: rgb(0, 102, 0);"&gt;out&lt;/span&gt;.&lt;span style="color: rgb(0, 102, 0);"&gt;println&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;"Average trials per code-breaking: "&lt;/span&gt; + totalTrials/&lt;span style="color: rgb(204, 102, 204);"&gt;1000&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(170, 170, 221); font-weight: bold;"&gt;System&lt;/span&gt;.&lt;span style="color: rgb(0, 102, 0);"&gt;out&lt;/span&gt;.&lt;span style="color: rgb(0, 102, 0);"&gt;println&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;"Average time per code-breaking: "&lt;/span&gt; + &lt;span style="color: rgb(102, 204, 102);"&gt;(&lt;/span&gt;endTime - startTime&lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt; / &lt;span style="color: rgb(204, 102, 204);"&gt;1000&lt;/span&gt; + &lt;span style="color: rgb(255, 0, 0);"&gt;" ms"&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(102, 204, 102);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;span style="font-family:monospace;"&gt;&lt;/span&gt;&lt;span class="sy0"&gt;&lt;/span&gt;Your code should be reasonably packaged and documented. Please by all means document your strategy as comprehensible as necessary.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=rjYUgI"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=rjYUgI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=4fpWLi"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=4fpWLi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=eBDa3I"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=eBDa3I" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=ijvyNi"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=ijvyNi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=BqXaYi"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=BqXaYi" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=tsvSOI"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=tsvSOI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=9C1cNI"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=9C1cNI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.athico.com/~r/DroolsAtom/~4/302357973" height="1" width="1"/&gt;</content><link rel="alternate" type="text/html" href="http://feeds.athico.com/~r/DroolsAtom/~3/302357973/drools-puzzle-round-3-mastermind.html" title="Drools Puzzle Round 3: Mastermind" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5869426&amp;postID=444899475860550800" title="0 Comments" /><link rel="replies" type="application/atom+xml" href="http://blog.athico.com/feeds/444899475860550800/comments/default" title="Post Comments" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5869426/posts/default/444899475860550800" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5869426/posts/default/444899475860550800" /><author><name>Ellen N. Zhao</name><uri>http://www.blogger.com/profile/13715176075138360386</uri><email>noreply@blogger.com</email></author><feedburner:origLink>http://blog.athico.com/2008/06/drools-puzzle-round-3-mastermind.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5869426.post-5154288025211984004</id><published>2008-05-30T22:44:00.003+01:00</published><updated>2008-05-30T22:49:21.399+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Job" /><category scheme="http://www.blogger.com/atom/ns#" term="Drools" /><title type="text">Drools Job Board Posting, NY</title><content type="html">Just thought I'd highlight a job posted on the &lt;a href="http://jobs.athico.com/"&gt;Drools job board&lt;/a&gt; at the moment. Remember the job board is free and all adverts also appear on the side of this blog for maximum exposure.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Core java/J2EE Web Developer&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.sans.com/" target="_blank"&gt;&lt;b&gt;Investment Banking&lt;/b&gt;&lt;/a&gt;, New York, NY&lt;br /&gt;&lt;br /&gt;Development on Insight - strategic risk management tool for Sarbanes-Oxley Section 404 risk assessment. Production support on applications, which includes coordinating with 3rd party vendors and providing support for SOX S.404 users globally. Co-development with 3rd party vendor. Reporting development using JasperDecisions. Work with business users on formulating requirements. Develop technical specifications from business requirements. Unit and integrated systems testing. 5+ yrs of Java/J2EE development on presentation tier and back-end. Open Source frameworks: Spring, Struts, Hibernate, Apache/Tomcat, JBPM, DROOLS. O/S: Linux and Unix. Database: UDB and Sybase. Others: Linux/Unix scripting, Eclipse IDE, MS Office. Familiarity with GoF and J2EE Design Patterns. Desirable Skills: Experience in the financial industry, JUnit, ANT.&lt;br /&gt;&lt;br /&gt;Click &lt;a href="http://jobs.athico.com/job/16b6783acbb492c83d27f0b654af74cc/?d=1&amp;amp;source=site_home"&gt;here&lt;/a&gt; for more details and to apply for this job.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=gCDV1H"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=gCDV1H" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=gOmFKh"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=gOmFKh" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=DIpBwH"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=DIpBwH" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=rajiNh"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=rajiNh" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=PhSZnh"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=PhSZnh" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=CuVQbH"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=CuVQbH" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=CmgQVH"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=CmgQVH" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.athico.com/~r/DroolsAtom/~4/301517389" height="1" width="1"/&gt;</content><link rel="alternate" type="text/html" href="http://feeds.athico.com/~r/DroolsAtom/~3/301517389/drools-job-board-posting-ny.html" title="Drools Job Board Posting, NY" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5869426&amp;postID=5154288025211984004" title="0 Comments" /><link rel="replies" type="application/atom+xml" href="http://blog.athico.com/feeds/5154288025211984004/comments/default" title="Post Comments" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5869426/posts/default/5154288025211984004" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5869426/posts/default/5154288025211984004" /><author><name>Mark Proctor</name><uri>http://www.blogger.com/profile/03304277188725220501</uri><email>noreply@blogger.com</email></author><feedburner:origLink>http://blog.athico.com/2008/05/drools-job-board-posting-ny.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5869426.post-3157532709441315166</id><published>2008-05-23T06:47:00.001+01:00</published><updated>2008-05-23T06:47:51.117+01:00</updated><title type="text">Accessing Guvnor as a Filesystem (WebDAV)</title><content type="html">Just checked in to trunk, is the capability to access the repository back end as a filesystem. This is useful for a whole lot of cases (including, for instance, saving Excel directly to the repository). Its also a neat lead into the ability to have files both in the repository for governance and editing, and in the IDE for devlopers (probably lots of other uses as well).&lt;br /&gt;&lt;br /&gt;This is using the &lt;a href="http://www.webdav.org/"&gt;WebDAV&lt;/a&gt; standard (Level 2 compliance). WebDAV is reasonably well supported by most operating systems, many end user applications, and various 3rd party clients (and command line utilities for those so inclined). It works over http(s).&lt;br /&gt;&lt;br /&gt;Here is a look-see of how a repository looks in OSX finder:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_KukQ8TlQMz8/SDZXuDGz8dI/AAAAAAAAAPY/scvIJW2ZgKc/s1600-h/Picture+1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_KukQ8TlQMz8/SDZXuDGz8dI/AAAAAAAAAPY/scvIJW2ZgKc/s320/Picture+1.png" alt="" id="BLOGGER_PHOTO_ID_5203442868092662226" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;And here it is in windows (xp) explorer:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_KukQ8TlQMz8/SDZX5DGz8eI/AAAAAAAAAPg/U2pcbPpG7iA/s1600-h/Picture+2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_KukQ8TlQMz8/SDZX5DGz8eI/AAAAAAAAAPg/U2pcbPpG7iA/s320/Picture+2.png" alt="" id="BLOGGER_PHOTO_ID_5203443057071223266" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;How to setup: On the repository side - nothing ! The url to access it is the same as the repository server, with /webdav on the end (instead of any HTML file). You can drill down in the URL if you like, by adding: webdav/packages/&lt;packagename&gt; - "packages" is required (at the moment it provides a package centric view - packages are folders for this purpose). You can copy and delete packages just like folders, drag and drop things to your hard drive etc...&lt;br /&gt;&lt;br /&gt;On the client side:&lt;br /&gt;* Mac OSX finder: Press Apple-K, and then enter the URL (it will prompt for some credentials to access the repository).&lt;br /&gt;* Windows XP: Go to "My Network Place", then "Add a network place" - and use the URL (you can create a shortcut to it on the desktop or wherever.&lt;br /&gt;* Cyberduck: an excellent free client for OSX that works much better then finder (OSX finder is inefficient, and tries to do Naughty Things which gave me no end of grief...)&lt;br /&gt;* Other apps, such as excel, can support webdav URLs more directly if needed.&lt;br /&gt;&lt;br /&gt;Versioning:&lt;br /&gt;As the repository is versioned, this is essentially an automatic versioning file system. To avoid millions of trivial little versions being created, it won't create a version with every little save, it will wait until a certain amount of time has passed before creating a new version in the repository automatically (but you won't notice anything from the filesystem point of view). If you really want it to create a new version, you can delete it and drag a new copy over again.&lt;br /&gt;&lt;br /&gt;Some caveats:&lt;br /&gt;OSX finder will not let you copy and paste (mostly due to its inability to rename copies to anything useful - maybe fixed in a future version of Finder), so don't try (if you want to copy something, drag it to your mac desktop, rename it, edit etc, and then drag it back).&lt;/packagename&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=yJPM1H"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=yJPM1H" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=OXMtUh"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=OXMtUh" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=WljtkH"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=WljtkH" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=s7JK3h"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=s7JK3h" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=9TmJBh"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=9TmJBh" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=nZ15RH"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=nZ15RH" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=SdBwpH"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=SdBwpH" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.athico.com/~r/DroolsAtom/~4/296337069" height="1" width="1"/&gt;</content><link rel="alternate" type="text/html" href="http://feeds.athico.com/~r/DroolsAtom/~3/296337069/accessing-guvnor-as-filesystem-webdav.html" title="Accessing Guvnor as a Filesystem (WebDAV)" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5869426&amp;postID=3157532709441315166" title="1 Comments" /><link rel="replies" type="application/atom+xml" href="http://blog.athico.com/feeds/3157532709441315166/comments/default" title="Post Comments" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5869426/posts/default/3157532709441315166" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5869426/posts/default/3157532709441315166" /><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email></author><feedburner:origLink>http://blog.athico.com/2008/05/accessing-guvnor-as-filesystem-webdav.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5869426.post-1809545295963278610</id><published>2008-05-18T04:56:00.003+01:00</published><updated>2008-05-18T05:04:08.797+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Drools" /><title type="text">Efficient Binary Protocol Marshalling for Drools Stateful Sessions</title><content type="html">New code has been added, in trunk for a highly efficient binary protocol marshalling for stateful sessions. While Drools 4 supported standard serialisation of Working Memories, it used the default serialisation, this is both very slow and memory bloating. It also has the problem that it just serialises the user objects with it.&lt;br /&gt;&lt;br /&gt;The new marshalling implementation allows for a strategy approach when handling the marshalling of user objects. You register different strategies for different name spaces. Currently we have two strategies, Serialised and Identity. Serialised just writes the user object to the stream via standard readObject/writeObject methods. Identity assigns the user object an id, from an int counter, and places it in a map and writes the id to the stream. Reading in uses that map to lookup the user object. Identity strategy is thus stateful, the write method can only be called once but read can be called repeatedly. Other strategies will be added, such as hibernate place holder support. Users can of course write there own.&lt;br /&gt;&lt;br /&gt;So what does this give?&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Session pause/resume, ideal for moving a session to a new server or restarting an existing server.&lt;/li&gt;&lt;li&gt;General snap shotting, backup. You could do a poor man's high availability by snap shotting the session at the end of each transaction. Later we will be extending this binary protocol to support journalling and also replication via clustering.&lt;/li&gt;&lt;li&gt;Pre-loaded session templates. If you repeatedly create stateful sessions with the same base set of data and the insertion time is annoying, now you can just populate the session once and write out to a byte[] and use that as a template for further session creations.&lt;/li&gt;&lt;li&gt;Long term persistence, needed for our process integration work.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;You can see the &lt;a href="http://fisheye.jboss.org/browse/JBossRules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/MarshallingTest.java?r=HEAD"&gt;MarshallingTest &lt;/a&gt;to look at the integration tests in place at the moment.&lt;br /&gt;&lt;br /&gt;In integrationtests' &lt;a href="http://fisheye.jboss.org/browse/JBossRules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/SerializationHelper.java?r=HEAD"&gt;SerializationHelper &lt;/a&gt;you can see the helper methods there demonstrating how it all works.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://fisheye.jboss.org/browse/JBossRules/trunk/drools-core/src/main/java/org/drools/marshalling/DefaultMarshaller.java?r=HEAD"&gt;DefaultMarshalling &lt;/a&gt;class uses the Identity strategy if it is not passed a strategy factory. The Identity strategy is used throughout the tests.&lt;br /&gt;&lt;br /&gt;The read/write marshalling is maintained in two files &lt;a href="http://fisheye.jboss.org/browse/JBossRules/trunk/drools-core/src/main/java/org/drools/marshalling/InputMarshaller.java?r=HEAD"&gt;InputMarshaller &lt;/a&gt;and &lt;a href="http://fisheye.jboss.org/browse/JBossRules/trunk/drools-core/src/main/java/org/drools/marshalling/OutputMarshaller.java?r=HEAD"&gt;OutputMarshaller&lt;/a&gt;, this will allow better handling of backwards compatiblity in the future.&lt;br /&gt;&lt;br /&gt;It's still very alphaware, but please do start trying it. I need to tidy up the debug output and will do that soon, I'll probably make each read/write method take a String which will be written to the log when debug is on. It currently sorts a number of map/set data structures, this is for debugging so that testing can round trip for data loss, I will make sure that it can be disabled for production. The following types don't yet marshall, not sure how to handle date/time stuff at the moment:&lt;br /&gt;Temporal Sessions do not marshall&lt;br /&gt;Scheduled rules, duration attribution do not marhsall&lt;br /&gt;&lt;br /&gt;Implementations have not been added for accumulate, collect, from and rightinputadapter.&lt;br /&gt;&lt;br /&gt;We are just hooking up the process marshalling into this at the moment.&lt;br /&gt;&lt;br /&gt;Mark&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=L0c8MH"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=L0c8MH" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=Qor1Fh"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=Qor1Fh" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=JOQlkH"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=JOQlkH" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=jby5wh"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=jby5wh" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=bKLLAh"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=bKLLAh" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=dT10OH"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=dT10OH" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=VukaIH"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=VukaIH" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.athico.com/~r/DroolsAtom/~4/292639262" height="1" width="1"/&gt;</content><link rel="alternate" type="text/html" href="http://feeds.athico.com/~r/DroolsAtom/~3/292639262/efficient-binary-protocol-marshalling.html" title="Efficient Binary Protocol Marshalling for Drools Stateful Sessions" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5869426&amp;postID=1809545295963278610" title="2 Comments" /><link rel="replies" type="application/atom+xml" href="http://blog.athico.com/feeds/1809545295963278610/comments/default" title="Post Comments" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5869426/posts/default/1809545295963278610" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5869426/posts/default/1809545295963278610" /><author><name>Mark Proctor</name><uri>http://www.blogger.com/profile/03304277188725220501</uri><email>noreply@blogger.com</email></author><feedburner:origLink>http://blog.athico.com/2008/05/efficient-binary-protocol-marshalling.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5869426.post-1566982119600559340</id><published>2008-05-06T12:26:00.003+01:00</published><updated>2008-05-06T15:46:38.725+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Business Rules Governance" /><category scheme="http://www.blogger.com/atom/ns#" term="Guvnor" /><category scheme="http://www.blogger.com/atom/ns#" term="BRMS" /><category scheme="http://www.blogger.com/atom/ns#" term="Drools" /><title type="text">A REST API for Drools</title><content type="html">Part of the work for the Drools 5 repository is a Rest API - to allow content to be accessed remotely. The initial purpose of this is to let assets in the repository be synced with files in a developers workspace.&lt;br /&gt;&lt;br /&gt;Rest turns out to be a perfect fit, we have the usual verbs:&lt;br /&gt;&lt;br /&gt;PUT: update content (create a new version).&lt;br /&gt;POST: create a new asset&lt;br /&gt;DELETE: delete an asset&lt;br /&gt;GET: retrieve asset content, or package listing&lt;br /&gt;&lt;br /&gt;All actions are of course in the context of a package - but this is all specified by the url:&lt;br /&gt;&lt;br /&gt;http://&lt;repository&gt;/api/packages/&lt;packagename&gt;/&lt;assetname&gt;&lt;br /&gt;&lt;br /&gt;So for instance, doing a PUT to: http://&lt;repository&gt;/api/packages/SomePackage/SomeAsset.drl will update the content of the SomeAsset.drl.&lt;br /&gt;&lt;br /&gt;This may be terribly useful to some, terribly un-interesting to others, but at the very least people should appreciate the ability to get and update content to files/workspace from the repository without error prone import processes.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=uLuTZH"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=uLuTZH" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=kq6Ath"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=kq6Ath" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=7EoVHH"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=7EoVHH" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=JAOWQh"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=JAOWQh" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=6Cawjh"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=6Cawjh" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=cob3jH"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=cob3jH" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=ewIMmH"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=ewIMmH" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.athico.com/~r/DroolsAtom/~4/284588776" height="1" width="1"/&gt;</content><link rel="alternate" type="text/html" href="http://feeds.athico.com/~r/DroolsAtom/~3/284588776/rest-api.html" title="A REST API for Drools" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5869426&amp;postID=1566982119600559340" title="5 Comments" /><link rel="replies" type="application/atom+xml" href="http://blog.athico.com/feeds/1566982119600559340/comments/default" title="Post Comments" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5869426/posts/default/1566982119600559340" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5869426/posts/default/1566982119600559340" /><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email></author><feedburner:origLink>http://blog.athico.com/2008/05/rest-api.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5869426.post-6684731512433262215</id><published>2008-05-02T01:46:00.004+01:00</published><updated>2008-05-06T15:48:27.330+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="JavaOne" /><category scheme="http://www.blogger.com/atom/ns#" term="Drools" /><title type="text">JavaOne 2008</title><content type="html">Whilst Mark or Edson's proposals for JavaOne 08 were not accepted (they made the mistake of not including Netbeans or Glassfish in the titles ;), Michael will be attending.&lt;br /&gt;&lt;br /&gt;Not doing any specific presentations, but happy to talk, do some ad-hoc demos and generally hang out. I will be around the JBoss/Red Hat stand at least some of the time.&lt;br /&gt;&lt;br /&gt;Its a bit of a long trip over from my end of the world, and am not looking forward to the horrific jet-lag that awaits me.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=fXG14H"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=fXG14H" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=E0kOEh"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=E0kOEh" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=Pj1alH"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=Pj1alH" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=ITbFIh"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=ITbFIh" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=blJ4oh"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=blJ4oh" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=RHdPWH"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=RHdPWH" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=XwfK9H"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=XwfK9H" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.athico.com/~r/DroolsAtom/~4/281776655" height="1" width="1"/&gt;</content><link rel="alternate" type="text/html" href="http://feeds.athico.com/~r/DroolsAtom/~3/281776655/javaone-2008.html" title="JavaOne 2008" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5869426&amp;postID=6684731512433262215" title="0 Comments" /><link rel="replies" type="application/atom+xml" href="http://blog.athico.com/feeds/6684731512433262215/comments/default" title="Post Comments" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5869426/posts/default/6684731512433262215" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5869426/posts/default/6684731512433262215" /><author><name>Michael Neale</name><uri>http://www.blogger.com/profile/14670410000512777421</uri><email>noreply@blogger.com</email></author><feedburner:origLink>http://blog.athico.com/2008/05/javaone-2008.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5869426.post-2056914660956186307</id><published>2008-04-24T19:50:00.009+01:00</published><updated>2008-04-26T08:06:14.143+01:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="examination" /><category scheme="http://www.blogger.com/atom/ns#" term="solver" /><title type="text">Solving the Examination problem part 2: score function</title><content type="html">&lt;span style="font-style:italic;"&gt;This is the second part in a blog series about drools-solver and the Examination problem. If you haven't done so, read &lt;a href="http://blog.athico.com/2008/02/solving-examination-problem-domain.html"&gt;Solving the Examination problem: Domain diagram&lt;/a&gt; first.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Each possible solution has a score. Before we try to find the best solution, we need a way to calculate the score of a solution. And that's where the drools rule engine comes into play.&lt;br /&gt;&lt;br /&gt;So the current working solution is asserted into the working memory (based on it's getFacts() method) and a number of score rules are fired upon it. Generally, each (hard or soft) constraint translates into a single score rule.&lt;br /&gt;&lt;br /&gt;For example, this is the score rule to penalize all exams for which the period duration doesn't suffice.&lt;br /&gt;&lt;pre&gt;// More time required during a period than available in that period.&lt;br /&gt;rule "periodDurationTooShort"&lt;br /&gt;    when&lt;br /&gt;        // Any exam who's duration is longer that it's period duration ...&lt;br /&gt;        $exam : Exam(eval(topicDuration &gt; periodDuration));&lt;br /&gt;    then&lt;br /&gt;        // ... is penalized hard.&lt;br /&gt;        insertLogical(new IntConstraintOccurrence("periodDurationTooShort", ConstraintType.NEGATIVE_HARD,&lt;br /&gt;                $exam.getTopicStudentSize(),&lt;br /&gt;                $exam));&lt;br /&gt;end&lt;/pre&gt;&lt;br /&gt;Of course, some rules are more complicated, like the score rule to penalize all conflicting exams in a row:&lt;br /&gt;&lt;pre&gt;// Two exams in a row which share students&lt;br /&gt;rule "twoExamsInARow"&lt;br /&gt;    when&lt;br /&gt;        // When 2 in row exams are penalized, ...&lt;br /&gt;        $institutionalWeighting : InstitutionalWeighting(twoInARowPenality != 0);&lt;br /&gt;&lt;br /&gt;        // ..., any 2 exams that share students ...&lt;br /&gt;        $topicConflict : TopicConflict($leftTopic : leftTopic, $rightTopic : rightTopic);&lt;br /&gt;&lt;br /&gt;        // ... of which the periods ...&lt;br /&gt;        $leftExam : Exam(topic == $leftTopic, $leftPeriod : period);&lt;br /&gt;        $rightExam : Exam(topic == $rightTopic, $rightPeriod : period);&lt;br /&gt;&lt;br /&gt;        // ... occur on the same day ...&lt;br /&gt;        eval($leftPeriod.getDayIndex() == $rightPeriod.getDayIndex());&lt;br /&gt;&lt;br /&gt;        // ... and are successive, ...&lt;br /&gt;        eval(Math.abs($leftPeriod.getPeriodIndex() - $rightPeriod.getPeriodIndex()) == 1);&lt;br /&gt;    then&lt;br /&gt;        // ..., are penalized softly.&lt;br /&gt;        insertLogical(new IntConstraintOccurrence("twoExamsInARow", ConstraintType.NEGATIVE_SOFT,&lt;br /&gt;                $topicConflict.getStudentSize() * $institutionalWeighting.getTwoInARowPenality(),&lt;br /&gt;                $leftExam, $rightExam));&lt;br /&gt;end&lt;/pre&gt;&lt;br /&gt;Using the drools rule engine to calculate the score has a bunch of advantages:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The constraint score rules are easier to implement, once you get the hang of the DRL pattern syntax.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The implementations of the constraints are isolated from each other.&lt;br /&gt;So adding extra constraints is easy and scalable.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;If the working solution changes into an adjacent solution (for example due to a solver move), drools does forward-chaining. This means you get delta based score calculation without any effort. That's a huge performance boost without breaking a sweat.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Now that we know how to calculate the score of solution, we can recognize a good solution. In a next blog we 'll take a look at finding the best solution we can find out of 10^5761 possible solutions.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=kveKlkG"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=kveKlkG" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=mG8ihFg"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=mG8ihFg" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=9LcQzsG"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=9LcQzsG" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=SlqTFsg"&gt;&lt;img src="http://feeds.athico.com/~f/DroolsAtom?i=SlqTFsg" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.athico.com/~f/DroolsAtom?a=pQq1oSg"&gt;&lt;img src