[jboss-svn-commits] JBL Code SVN: r34152 - in labs/jbossrules/trunk/drools-docs: drools-docs-introduction/src/main/docbook/en-US/Chapter-Release_Notes and 1 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sun Jul 25 02:29:03 EDT 2010


Author: mark.proctor at jboss.com
Date: 2010-07-25 02:29:02 -0400 (Sun, 25 Jul 2010)
New Revision: 34152

Added:
   labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/Chapter-Release_Notes/Section-What_is_new_Drools_5.0.0.xml
   labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/Chapter-Release_Notes/Section-What_is_new_Drools_5.1.0.xml
   labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/Group By.jpg
   labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/Only Showed.jpg
   labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/SortBy.jpg
   labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/discussion1.png
   labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/factconstraints1.png
   labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/factconstraints2.png
   labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/factconstraints3.png
   labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/factconstraints4.png
   labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/factconstraints5.png
   labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/facttypes.png
   labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/from_builder.png
   labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/fromaccumulate.png
   labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/fromcollect.png
   labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/inbox1.png
   labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/inbox2.png
   labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/patternordering1.png
   labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/patternordering2.png
   labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/ruletemplate1.png
   labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/ruletemplate2.png
   labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/ruletemplate3.png
   labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/ruletemplate4.png
   labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/workingsets1.png
   labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/workingsets2.png
   labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/workingsets3.png
   labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/workingsets4.png
Removed:
   labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/Chapter-Release_Notes/Section-What_is_new_Drools_5.xml
   labs/jbossrules/trunk/drools-docs/mindmap/
Modified:
   labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/Chapter-Release_Notes/Chapter-ReleaseNotes.xml
Log:
-5.1.0 release notes

Modified: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/Chapter-Release_Notes/Chapter-ReleaseNotes.xml
===================================================================
--- labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/Chapter-Release_Notes/Chapter-ReleaseNotes.xml	2010-07-24 21:54:38 UTC (rev 34151)
+++ labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/Chapter-Release_Notes/Chapter-ReleaseNotes.xml	2010-07-25 06:29:02 UTC (rev 34152)
@@ -6,7 +6,8 @@
          xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:ns="http://docbook.org/ns/docbook">
   <title>Drools Release Notes</title>
 
-  <xi:include href="Section-What_is_new_Drools_5.xml" />
+  <xi:include href="Section-What_is_new_Drools_5.1.0.xml" />
+  <xi:include href="Section-What_is_new_Drools_5.0.0.xml" />
   <xi:include href="Section-What_is_new_Drools_4.xml" />
   <xi:include href="Section-Upgrade_tips.xml" />
 

Copied: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/Chapter-Release_Notes/Section-What_is_new_Drools_5.0.0.xml (from rev 34150, labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/Chapter-Release_Notes/Section-What_is_new_Drools_5.xml)
===================================================================
--- labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/Chapter-Release_Notes/Section-What_is_new_Drools_5.0.0.xml	                        (rev 0)
+++ labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/Chapter-Release_Notes/Section-What_is_new_Drools_5.0.0.xml	2010-07-25 06:29:02 UTC (rev 34152)
@@ -0,0 +1,1420 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<section version="5.0"
+         xsi:schemaLocation="http://docbook.org/ns/docbook http://www.docbook.org/xml/5.0/xsd/docbook.xsd http://www.w3.org/1999/xlink http://www.docbook.org/xml/5.0/xsd/xlink.xsd"
+         xml:base="../" xmlns="http://docbook.org/ns/docbook"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns:xs="http://www.w3.org/2001/XMLSchema"
+         xmlns:xlink="http://www.w3.org/1999/xlink"
+         xmlns:xi="http://www.w3.org/2001/XInclude"
+         xmlns:ns="http://docbook.org/ns/docbook">
+  <title>What is new in Drools 5.0.0</title>
+
+  <para>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. Drools 5.0 will split up into
+  4 main sub projects, the documentation has already been split to reflect
+  this: <itemizedlist>
+      <listitem>
+        <para>Drools Guvnor (BRMS/BPMS)</para>
+      </listitem>
+
+      <listitem>
+        <para>Drools Expert (rule engine),</para>
+      </listitem>
+
+      <listitem>
+        <para>Drools Flow (process/workflow)</para>
+      </listitem>
+
+      <listitem>
+        <para>Drools Fusion (cep/temporal reasoning)</para>
+      </listitem>
+    </itemizedlist></para>
+
+  <section>
+    <title>Drools API</title>
+
+    <para>Drools now has complete api/implementation separation that is no
+    longer rules oriented. This is an important strategy as we move to support
+    other forms of logic, such as workflow and event processing. The main
+    change is that we are now knowledge oriented, instead of rule oriented.
+    The module drools-api provide the interfaces and factories and we have
+    made pains to provide much better javadocs, with lots of code snippets,
+    than we did before. Drools-api also helps clearly show what is intended as
+    a user api and what is just an engine api, drools-core and drools-compiler
+    did not make this clear enough. The most common interfaces you will use
+    are: <itemizedlist>
+        <listitem>
+          <para>org.drools.builder.KnowledgeBuilder</para>
+        </listitem>
+
+        <listitem>
+          <para>org.drools.KnowledgeBase</para>
+        </listitem>
+
+        <listitem>
+          <para>org.drools.agent.KnowledgeAgent</para>
+        </listitem>
+
+        <listitem>
+          <para>org.drools.runtime.StatefulKnowledgeSession</para>
+        </listitem>
+
+        <listitem>
+          <para>org.drools.runtime.StatelessKnowledgeSession</para>
+        </listitem>
+      </itemizedlist> Factory classes, with static methods, provide instances
+    of the above interfaces. A pluggable provider approach is used to allow
+    provider implementations to be wired up to the factories at runtime. The
+    Factories you will most commonly used are: <itemizedlist>
+        <listitem>
+          <para>org.drools.builder.KnowledgeBuilderFactory</para>
+        </listitem>
+
+        <listitem>
+          <para>org.drools.io.ResourceFactory</para>
+        </listitem>
+
+        <listitem>
+          <para>org.drools.KnowledgeBaseFactory</para>
+        </listitem>
+
+        <listitem>
+          <para>org.drools.agent.KnowledgeAgentFactory</para>
+        </listitem>
+      </itemizedlist> <example>
+        <title>A Typical example to load a rule resource</title>
+
+        <programlisting>
+KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+kbuilder.add( ResourceFactory.newUrlResource( url ),
+            ResourceType.DRL );
+if ( kbuilder.hasErrors() ) {
+  System.err.println( builder.getErrors().toString() );
+}         
+
+KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+kbase.addKnowledgePackages( builder.getKnowledgePackages() );
+
+StatefulKnowledgeSession ksession = knowledgeBase.newStatefulKnowledgeSession();
+ksession.insert( new Fibonacci( 10 ) );
+ksession.fireAllRules();
+
+ksession.dispose();</programlisting>
+      </example> A Typical example to load a process resource. Notice the
+    <code>ResourceType</code> is changed, in accordance with the
+    <code>Resource</code> type: <example>
+        <title>A Typical example to load a process resource. Notice the
+        <code>ResourceType</code> is changed, in accordance with the
+        <code>Resource</code> type</title>
+
+        <programlisting>
+KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+kbuilder.add( ResourceFactory.newUrlResource( url ),
+            ResourceType.DRF );
+if ( kbuilder.hasErrors() ) {
+  System.err.println( builder.getErrors().toString() );
+}         
+
+KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+kbase.addKnowledgePackages( builder.getKnowledgePackages() );
+
+StatefulKnowledgeSession ksession = knowledgeBase.newStatefulKnowledgeSession();
+ksession.startProcess( "Buy Order Process" );
+
+ksession.dispose();
+</programlisting>
+      </example> 'kbuilder', 'kbase', 'ksession' are the variable identifiers
+    often used, the k prefix is for 'knowledge'. <example>
+        <title>We have uniformed how decision trees are loaded, and they are
+        now consistent with no need to pre generate the DRL with the
+        spreadsheet compiler</title>
+
+        <programlisting>
+DecisionTableConfiguration dtconf = KnowledgeBuilderFactory.newDecisionTableConfiguration();
+dtconf.setInputType( DecisionTableInputType.XLS );
+dtconf.setWorksheetName( "Tables_2" );
+kbuilder.add( ResourceFactory.newUrlResource( "file://IntegrationExampleTest.xls" ),
+            ResourceType.DTABLE,
+            dtconf );
+</programlisting>
+      </example> It is also possible to configure a <code>KnowledgeBase</code>
+    using configuration, via a xml change set, instead of programmatically.
+    <example>
+        <title>Here is a simple change set</title>
+
+        <programlisting>
+&lt;change-set xmlns='http://drools.org/drools-5.0/change-set'
+xmlns:xs='http://www.w3.org/2001/XMLSchema-instance'
+xs:schemaLocation='http://drools.org/drools-5.0/change-set change-set-5.0.xsd' &gt;
+  &lt;add&gt;
+      &lt;resource source='classpath:org/domain/someRules.drl' type='DRL' /&gt;
+      &lt;resource source='classpath:org/domain/aFlow.drf' type='DRF' /&gt;
+  &lt;/add&gt;
+&lt;/change-set&gt;
+</programlisting>
+      </example> <example>
+        <title>And it is added just like any other ResourceType</title>
+
+        <programlisting>
+KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+kbuilder.add( ResourceFactory.newUrlResource( url ),
+            ResourceType.ChangeSet );
+</programlisting>
+      </example> The other big change for the <code>KnowledgeAgent</code>,
+    compared to the <code>RuleAgent</code>, is that polling scanner is now a
+    service. further to this there is an abstraction between the agent
+    notification and the resource monitoring, to allow other mechanisms to be
+    used other than polling. <example>
+        <title>These services currently are not started by default, to start
+        them do the following</title>
+
+        <programlisting>
+ResourceFactory.getResourceChangeNotifierService().start();
+ResourceFactory.getResourceChangeScannerService().start();
+</programlisting>
+      </example> There are two new interfaces added,
+    <code>ResourceChangeNotifier</code> and
+    <code>ResourceChangeMonitor</code>. <code>KnowlegeAgents</code> subscribe
+    for resource change notifications using the
+    <code>ResourceChangeNotifier</code> implementation. The
+    <code>ResourceChangeNotifier</code> is informed of resource changes by the
+    added <code>ResourceChangeMonitors</code>. We currently only provide one
+    out of the box monitor, <code>ResourceChangeScannerService</code>, which
+    polls resources for changes. However the api is there for users to add
+    their own monitors, and thus use a push based monitor such as JMS.</para>
+
+    <para><code>
+    ResourceFactory.getResourceChangeNotifierService().addResourceChangeMonitor(
+    myJmsMonitor); </code></para>
+  </section>
+
+  <section>
+    <title>Drools Guvnor</title>
+
+    <itemizedlist>
+      <listitem>
+        <para>New look web tooling <figure>
+            <title>New Look</title>
+
+            <mediaobject>
+              <imageobject>
+                <imagedata align="center"
+                           fileref="images/Chapter-Release_Notes/guvnor1.png"
+                           format="PNG" scalefit="1"></imagedata>
+              </imageobject>
+            </mediaobject>
+          </figure></para>
+      </listitem>
+
+      <listitem>
+        <para>Web based decision table editor <figure>
+            <title>Web based decision table editor</title>
+
+            <mediaobject>
+              <imageobject>
+                <imagedata align="center"
+                           fileref="images/Chapter-Release_Notes/WebDT.png"
+                           format="PNG" scalefit="1"></imagedata>
+              </imageobject>
+            </mediaobject>
+          </figure></para>
+      </listitem>
+
+      <listitem>
+        <para>Integrated scenario testing <figure>
+            <title>Running all scenarios</title>
+
+            <mediaobject>
+              <imageobject>
+                <imagedata align="center"
+                           fileref="images/Chapter-Release_Notes/ScenarioSuite.png"
+                           format="PNG" scalefit="1"></imagedata>
+              </imageobject>
+            </mediaobject>
+          </figure> <figure>
+            <title>Running single scenario</title>
+
+            <mediaobject>
+              <imageobject>
+                <imagedata align="center"
+                           fileref="images/Chapter-Release_Notes/Scenario.png"
+                           format="PNG" scalefit="1"></imagedata>
+              </imageobject>
+            </mediaobject>
+          </figure></para>
+      </listitem>
+
+      <listitem>
+        <para>WebDAV file based interface to repository <figure>
+            <title>WebDAV</title>
+
+            <mediaobject>
+              <imageobject>
+                <imagedata align="center"
+                           fileref="images/Chapter-Release_Notes/WebDav.png"
+                           format="PNG" scalefit="1"></imagedata>
+              </imageobject>
+            </mediaobject>
+          </figure></para>
+      </listitem>
+
+      <listitem>
+        <para>Declarative modelling of types (types that are not in pojos)
+        <figure>
+            <title>&gt;Declarative modelling</title>
+
+            <mediaobject>
+              <imageobject>
+                <imagedata align="center"
+                           fileref="images/Chapter-Release_Notes/DeclaringModel.png"
+                           format="PNG" scalefit="1"></imagedata>
+              </imageobject>
+            </mediaobject>
+          </figure> 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.</para>
+      </listitem>
+
+      <listitem>
+        <para>Fine grained security (lock down access to the app per package
+        or per category). Users who only have category permissions have
+        limited UI capability (ideal for business users)</para>
+      </listitem>
+
+      <listitem>
+        <para>Execution server - access rules via XML or JSON for
+        execution</para>
+      </listitem>
+
+      <listitem>
+        <para>Category rules allows you to set 'parent rules' for a category.
+        Any rules appearing in the given category will 'extend' the rule
+        specified - ie inherit the conditions/LHS. The base rule for the
+        category can be set on package configuration tab. RHS is not
+        inherited, only the LHS</para>
+      </listitem>
+
+      <listitem>
+        <para>Scenario runner detects infinite loops</para>
+      </listitem>
+
+      <listitem>
+        <para>Scenario runner can show event trace that was recorded by audit
+        logger</para>
+      </listitem>
+
+      <listitem>
+        <para>DSL sentences in guided editor can now be set to show enums as a
+        dropdown, dates as a date picker, booleans as a checkbox and use
+        regular expressions to validate the inputs (DSL Widgets in
+        Guvnor)</para>
+      </listitem>
+
+      <listitem>
+        <para>Functions can be edited with text editor</para>
+      </listitem>
+
+      <listitem>
+        <para>It is possible to add objects to global collections.</para>
+      </listitem>
+
+      <listitem>
+        <para>Translations to English, Spanish, Chinese and Japanese</para>
+      </listitem>
+    </itemizedlist>
+  </section>
+
+  <section>
+    <title>Drools Expert</title>
+
+    <section>
+      <title>Asymmetrical Rete algorithm implementation</title>
+
+      <para>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.</para>
+    </section>
+
+    <section>
+      <title><code>PackageBuilder</code> can now build multiple
+      namespaces</title>
+
+      <para>You no longer need to confine one <code>PackageBuilder</code> to
+      one package namespace. Just keeping adding your DRLs for any namespace
+      and <code>getPackages()</code> returns an array of Packages for each of
+      the used namespaces. <example>
+          <title>Getting multiple packages</title>
+
+          <programlisting>Package[] packages = pkgBuilder.getPackages();</programlisting>
+        </example></para>
+    </section>
+
+    <section>
+      <title><code>RuleBase</code> attachment to
+      <code>PackageBuilder</code></title>
+
+      <para>It is now possible to attach a <code>RuleBase</code> to a
+      <code>PackageBuilder</code>, this means that rules are built and added
+      to the rulebase at the same time. <code>PackageBuilder</code> uses the
+      <code>Package</code> instances of the actual <code>RuleBase</code> as
+      it's source, removing the need for additional <code>Package</code>
+      creation and merging that happens in the existing approach. <example>
+          <title>Attaching <code>RuleBase</code> to
+          <code>PackageBuilder</code></title>
+
+          <programlisting>RuleBase ruleBase = RuleBaseFactory.newRuleBase();
+PackageBuilder pkgBuilder = new PackageBuilder( ruleBase, null );</programlisting>
+        </example></para>
+    </section>
+
+    <section>
+      <title>Binary marshalling of stateful sessions</title>
+
+      <para>Stateful sessions can now saved and resumed at a later date.
+      Pre-loaded data sessions can now be created. Pluggable strategies can be
+      used for user object persistence, i.e. hibernate or identity
+      maps.</para>
+    </section>
+
+    <section>
+      <title>Type Declaration</title>
+
+      <para>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. One
+      example of the construct is: <example>
+          <title>Declaring <code>StockTick</code></title>
+
+          <programlisting>declare StockTick
+  @role( event )
+  @timestamp( timestampAttr )
+
+  companySymbol : String
+  stockPrice : double
+  timestampAttr : long
+end</programlisting>
+        </example></para>
+    </section>
+
+    <section>
+      <title>Declaring Fact Metadata</title>
+
+      <para>To declare and associate fact metadata, just use the @ symbol for
+      each metadata ID you want to declare. Example: <example>
+          <title>Declaring metadata</title>
+
+          <programlisting>
+declare StockTick
+  @role( event )
+end</programlisting>
+        </example></para>
+    </section>
+
+    <section>
+      <title>Triggering Bean Generation</title>
+
+      <para>To activate the dynamic bean generation, just add fields and types
+      to your type declaration: <example>
+          <title>Declaring <code>Person</code></title>
+
+          <programlisting>
+declare Person
+  name : String
+  age : int
+end</programlisting>
+        </example></para>
+    </section>
+
+    <section>
+      <title>DSL improvements</title>
+
+      <para>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: The phone
+      number is {number:\d{2}-\d{3}-\d{8}} Any valid java regexp may be used
+      in the variable mask.</para>
+    </section>
+
+    <section>
+      <title><code>fireUntilHalt()</code></title>
+
+      <para>Drools now supports "fireUntilHalt()" feature, that starts the
+      engine in a reactive mode, where rules will be continually fired, until
+      a halt() call is made. This is specially useful for CEP scenarios that
+      require what is commonly known as "active queries".</para>
+    </section>
+
+    <section>
+      <title>Rule Base partitioning and multi-thread propagation</title>
+
+      <para>Drools ReteOO algorithm now supports an option to start the rule
+      base in a multi-thread mode, where Drools ReteOO network is split into
+      multiple partitions and rules are then evaluated concurrently by
+      multiple threads. This is also a requirement for CEP where there usually
+      are several independent rules running concurrently, with near realtime
+      performance/throughput requirements and the evaluation of one can not
+      interfere with the evaluation of others.</para>
+    </section>
+
+    <section>
+      <title>XSD Model Support</title>
+
+      <para>Drools now supports XSD models. Remember though the XSD model is
+      generated as pojos local to the Drools classloader. A helper class is
+      there to assist in the creation of the model in the packagebuilder. Once
+      the data model is generated you'll typically use the JAXB dataloader to
+      insert data.</para>
+    </section>
+
+    <section>
+      <title>Data Loaders</title>
+
+      <para>Drools now supports two data loaders, Smooks and JAXB. Smooks is
+      an open source data transformation tool for ETL and JAXB a standard sun
+      data mapping tool. Unit tests showing Smooks can be found here and JAXB
+      here.</para>
+    </section>
+
+    <section>
+      <title>Type safe configuration</title>
+
+      <para>In addition to the ability of configuring options in drools
+      through configuration files, system properties and by setting properties
+      through the API <code>setProperty()</code> method, Drools-API now
+      supports type safe configuration. We didn't want to add specific methods
+      for each possible configuration methods for two reasons: it polutes the
+      API and every time a new option is added to Drools, the API would have
+      to change. This way, we followed a modular, class based configuration,
+      where a new Option class is added to the API for each possible
+      configuration, keeping the API stable, but flexible at the same time.
+      So, in order to set configuration options now, you just need to use the
+      enumerations or factories provided for each option. For instance, if you
+      want to configure the knowledge base for assert behavior "equality" and
+      to automatically remove identities from pattern matchings, you would
+      just use the enums: <example>
+          <title>Configuring</title>
+
+          <programlisting>
+KnowledgeBaseConfiguration config = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
+config.setOption( AssertBehaviorOption.EQUALITY );
+config.setOption( RemoveIdentitiesOption.YES );</programlisting>
+        </example> For options that don't have a predefined constant or can
+      assume multiple values, a factory method is provided. For instance, to
+      configure the alpha threshold to 5, just use the "get" factory method:
+      <example>
+          <title>Configuring alpha threshold</title>
+
+          <programlisting>
+config.setOption( AlphaThresholdOption.get(5) );</programlisting>
+        </example> As you can see, the same <code>setOption()</code> method is
+      used for the different possible configurations, but they are still type
+      safe.</para>
+    </section>
+
+    <section>
+      <title>New accumulate functions: collectSet and collectList</title>
+
+      <para>There are times when it is necessary to collect sets or lists of
+      values that are derived from the facts attributes, but are not facts
+      themselves. In such cases, it was not possible to use the collect CE.
+      So, Drools now has two accumulate functions for such cases: collectSet
+      for collecting sets of values (i.e., with no duplicate values) and
+      collectList for collecting lists of values (i.e., allowing duplicate
+      values): <example>
+          <title>New accumulate functions</title>
+
+          <programlisting>
+# collect the set of unique names in the working memory
+$names : Set() from accumulate( Person( $n : name, $s : surname ),
+                        collectSet( $n + " " + $s ) )
+
+# collect the list of alarm codes from the alarms in the working memory
+$codes : List() from accumulate( Alarm( $c : code, $s : severity ),
+                         collectList( $c + $s ) )</programlisting>
+        </example></para>
+    </section>
+
+    <section>
+      <title>New metadata for type declarations:
+      @propertyChangeSupport</title>
+
+      <para>Facts that implement support for property changes as defined in
+      the Javabean(tm) spec, now can be annotated so that the engine register
+      itself to listen for changes on fact properties. The boolean parameter
+      that was used in the insert() method in the Drools 4 API is deprecated
+      and does not exist in the drools-api module. <example>
+          <title>@propertyChangeSupport</title>
+
+          <programlisting>
+declare Person
+	@propertyChangeSupport
+end</programlisting>
+        </example></para>
+    </section>
+
+    <section>
+      <title>Batch Executor</title>
+
+      <para>Batch Executor allows for the scripting of of a Knowledge session
+      using Commands, which can also re, both the
+      <code>StatelessKnowledgeSession</code> and
+      <code>StatefulKnowledgeSession</code> implement this interface Commands
+      are created using the <code>CommandFactory</code> and executed using the
+      "execute" method, such as the following insert Command: <example>
+          <title>Using <code>CommandFactory</code></title>
+
+          <programlisting>
+ksession.execute( CommandFactory.newInsert( person ) ); </programlisting>
+        </example> Typically though you will want to execute a batch of
+      commands, this can be achieved via the composite Command
+      <code>BatchExecution</code>. <code>BatchExecutionResults</code> is now
+      used to handle the results, some commands can specify "out" identifiers
+      which it used to add the result to the
+      <code>BatchExecutionResult</code>. Handily querries can now be executed
+      and results added to the <code>BatchExecutionResult</code>. Further to
+      this results are scoped to this execute call and return via the
+      <code>BatchExecutionResults</code>: <example>
+          <title>Using <code>BatchExecutionResult</code></title>
+
+          <programlisting>
+List&lt;Command&gt; cmds = new ArrayList&lt;Command&gt;();
+cmds.add( CommandFactory.newSetGlobal( "list1", new ArrayList(), true ) );
+cmds.add( CommandFactory.newInsert( new Person( "jon", 102 ), "person" ) );
+cmds.add( CommandFactory.newQuery( "Get People" "getPeople" );
+
+BatchExecutionResults results = ksession.execute( CommandFactory.newBatchExecution( cmds ) );
+results.getValue( "list1" ); // returns the ArrayList
+results.getValue( "person" ); // returns the inserted fact Person
+results.getValue( "Get People" );// returns the query as a QueryResults instance.
+end</programlisting>
+        </example> The <code>CommandFactory</code> details the supported
+      commands, all of which can marshalled using XStream and the
+      <code>BatchExecutionHelper</code>. This can be combined with the
+      pipeline to automate the scripting of a session. <example>
+          <title>Using <code>PipelineFactory</code></title>
+
+          <programlisting>
+Action executeResultHandler = PipelineFactory.newExecuteResultHandler();
+Action assignResult = PipelineFactory.newAssignObjectAsResult();
+assignResult.setReceiver( executeResultHandler );
+Transformer outTransformer = PipelineFactory.newXStreamToXmlTransformer( BatchExecutionHelper.newXStreamMarshaller() );
+outTransformer.setReceiver( assignResult );
+KnowledgeRuntimeCommand batchExecution = PipelineFactory.newBatchExecutor();
+batchExecution.setReceiver( outTransformer );
+Transformer inTransformer = PipelineFactory.newXStreamFromXmlTransformer( BatchExecutionHelper.newXStreamMarshaller() );
+inTransformer.setReceiver( batchExecution );
+Pipeline pipeline = PipelineFactory.newStatelessKnowledgeSessionPipeline( ksession );
+pipeline.setReceiver( inTransformer ); </programlisting>
+        </example> Using the above for a rulset that updates the price of a
+      Cheese fact, given the following xml to insert a Cheese instance using
+      an out-identifier: <example>
+          <title>Updating Cheese fact</title>
+
+          <programlisting>
+&lt;batch-execution&gt;
+&lt;insert out-identifier='outStilton'&gt;
+  &lt;org.drools.Cheese&gt;
+    &lt;type&gt;stilton&lt;/type&gt;
+    &lt;price&gt;25&lt;/price&gt;
+    &lt;oldPrice&gt;0&lt;/oldPrice&gt;
+  &lt;/org.drools.Cheese&gt;
+&lt;/insert&gt;
+&lt;/batch-execution&gt;
+</programlisting>
+        </example> We then get the following
+      <code>BatchExecutionResults</code>: <example>
+          <title>Updating Cheese fact</title>
+
+          <programlisting>
+&lt;batch-execution-results&gt;
+ &lt;result identifier='outStilton'&gt;
+   &lt;org.drools.Cheese&gt;
+     &lt;type&gt;stilton&lt;/type&gt;
+     &lt;oldPrice&gt;0&lt;/oldPrice&gt;       
+     &lt;price&gt;30&lt;/price&gt;
+   &lt;/org.drools.Cheese&gt;
+ &lt;/result&gt;
+&lt;/batch-execution-results&gt;
+</programlisting>
+        </example></para>
+    </section>
+
+    <section>
+      <title>Marshalling</title>
+
+      <para>The <code>MarshallerFactory</code> is used to marshal and
+      unmarshal <code>StatefulKnowledgeSessions</code>. At the simplest it can
+      be used as follows: <example>
+          <title>Using <code>MarshallerFactory</code></title>
+
+          <programlisting>
+// ksession is the StatefulKnowledgeSession
+// kbase is the KnowledgeBase
+ByteArrayOutputStream baos = new ByteArrayOutputStream();
+Marshaller marshaller = MarshallerFactory.newMarshaller( kbase );
+marshaller.marshall( baos, ksession );
+baos.close();
+</programlisting>
+        </example> However with marshalling you need more flexibility when
+      dealing with referenced user data. To achieve this we have the
+      <code>ObjectMarshallingStrategy</code> interface. Two implementations
+      are provided, but the user can implement their own. The two supplied are
+      <code>IdentityMarshallingStrategy</code> and
+      <code>SerializeMarshallingStrategy</code>.
+      <code>SerializeMarshallingStrategy</code> is the default, as used in the
+      example above and it just calls the <code>Serializable</code> or
+      <code>Externalizable</code> methods on a user instance.
+      <code>IdentityMarshallingStrategy</code> instead creates an int id for
+      each user object and stores them in a <code>Map</code> the id is written
+      to the stream. When unmarshalling it simply looks to the
+      <code>IdentityMarshallingStrategy</code> map to retrieve the instance.
+      This means that if you use the <code>IdentityMarshallingStrategy</code>
+      it's stateful for the life of the Marshaller instance and will create
+      ids and keep references to all objects that it attempts to marshal.
+      <example>
+          <title>Code to use a
+          <code>IdentityMarshallingStrategy</code></title>
+
+          <programlisting>
+ByteArrayOutputStream baos = new ByteArrayOutputStream();
+Marshaller marshaller = MarshallerFactory.newMarshaller( kbase, new ObjectMarshallingStrategy[] { MarshallerFactory.newIdentityMarshallingStrategy() } );
+marshaller.marshall( baos, ksession );
+baos.close(); 
+</programlisting>
+        </example> For added flexability we can't assume that a single
+      strategy is suitable for this we have added the
+      <code>ObjectMarshallingStrategyAcceptor</code> interface that each
+      <code>ObjectMarshallingStrategy</code> has. The Marshaller has a chain
+      of strategies and when it attempts to read or write a user object it
+      iterates the strategies asking if they accept responsability for
+      marshalling the user object. One one implementation is provided the
+      <code>ClassFilterAcceptor</code>. This allows strings and wild cards to
+      be used to match class names. The default is "*.*", so in the above the
+      <code>IdentityMarshallingStrategy</code> is used which has a default
+      "*.*" acceptor. But lets say we want to serialise all classes except for
+      one given package, where we will use identity lookup, we could do the
+      following: <example>
+          <title>Using identity lookup</title>
+
+          <programlisting>
+ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ObjectMarshallingStrategyAcceptor identityAceceptor = MarshallerFactory.newClassFilterAcceptor( new String[] { "org.domain.pkg1.*" } );
+ObjectMarshallingStrategy identityStratetgy = MarshallerFactory.newIdentityMarshallingStrategy( identityAceceptor );
+Marshaller marshaller = MarshallerFactory.newMarshaller( kbase, new ObjectMarshallingStrategy[] { identityStratetgy, MarshallerFactory.newSerializeMarshallingStrategy() } );
+marshaller.marshall( baos, ksession );
+baos.close();
+</programlisting>
+        </example></para>
+    </section>
+
+    <section>
+      <title>Knowledge Agent</title>
+
+      <para>The <code>KnowlegeAgent</code> is created by the
+      <code>KnowlegeAgentFactory</code>. The <code>KnowlegeAgent</code>
+      provides automatic loading, caching and re-loading, of resources and is
+      configured from a properties files. The <code>KnowledgeAgent</code> can
+      update or rebuild this <code>KnowlegeBase</code> as the resources it
+      uses are changed. The strategy for this is determined by the
+      configuration given to the factory, but it is typically pull based using
+      regular polling. We hope to add push based updates and rebuilds in
+      future versions. The Following example constructs an agent that will
+      build a new <code>KnowledgeBase</code> from the files specified in the
+      path String. It will poll those files every 30 seconds to see if they
+      are updated. If new files are found it will construct a new
+      KnowledgeBase, instead of updating the existing one, due to the
+      "newInstance" set to "true" (however currently only the value of "true"
+      is supported and is hard coded into the engine): <example>
+          <title>Constructing an agent</title>
+
+          <programlisting>
+// Set the interval on the ResourceChangeScannerService if you are to use it and default of 60s is not desirable.
+ResourceChangeScannerConfiguration sconf = ResourceFactory.getResourceChangeScannerService().newResourceChangeScannerConfiguration();
+sconf.setProperty( "drools.resource.scanner.interval",
+                  "30" ); // set the disk scanning interval to 30s, default is 60s
+ResourceFactory.getResourceChangeScannerService().configure( sconf );
+KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+KnowledgeAgentConfiguration aconf = KnowledgeAgentFactory.newKnowledgeAgentConfiguration();
+aconf.setProperty( "drools.agent.scanDirectories",
+                  "true" ); // we want to scan directories, not just files, turning this on turns on file scanning
+aconf.setProperty( "drools.agent.newInstance",
+                  "true" ); // resource changes results in a new instance of the KnowledgeBase being built,
+                            // this cannot currently be set to false for incremental building
+    
+KnowledgeAgent kagent = KnowledgeAgentFactory.newKnowledgeAgent( "test agent", // the name of the agent
+                                                                kbase, // the KnowledgeBase to use, the Agent will also monitor any exist knowledge definitions
+                                                                aconf );
+kagent.applyChangeSet( ResourceFactory.newUrlResource( url ) ); // resource to the change-set xml for the resources to add
+</programlisting>
+        </example> <code>KnowledgeAgents</code> can take a empty
+      <code>KnowledgeBase</code> or a populated one. If a populated
+      <code>KnowledgeBase</code> is provided, the <code>KnowledgeAgent</code>
+      will iterate <code>KnowledgeBase</code> and subscribe to the
+      <code>Resource</code> that it finds. While it is possible for the
+      <code>KnowledgeBuilder</code> to build all resources found in a
+      directory, that information is lost by the KnowledgeBuilder so those
+      directories will not be continuously scanned. Only directories specified
+      as part of the <code>applyChangeSet(Resource)</code> method are
+      monitored.</para>
+    </section>
+  </section>
+
+  <section>
+    <title>Drools Flow</title>
+
+    <para>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.</para>
+
+    <section>
+      <title>Process Instance view at a specific breakpoint</title>
+
+      <para><figure>
+          <title>Rule Flow properties</title>
+
+          <mediaobject>
+            <imageobject>
+              <imagedata align="center"
+                         fileref="images/Chapter-Release_Notes/process-instances.png"
+                         format="PNG" scalefit="1"></imagedata>
+            </imageobject>
+          </mediaobject>
+        </figure> <figure>
+          <title>Current active nodes in a workflow in a specific
+          breakpoint</title>
+
+          <mediaobject>
+            <imageobject>
+              <imagedata align="center"
+                         fileref="images/Chapter-Release_Notes/example-debug-1.png"
+                         format="PNG" scalefit="1"></imagedata>
+            </imageobject>
+          </mediaobject>
+        </figure></para>
+    </section>
+
+    <section>
+      <title>New Nodes</title>
+
+      <para>Timers:</para>
+
+      <para>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.</para>
+
+      <para>Human Task:</para>
+
+      <para>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.</para>
+
+      <para>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: <figure>
+          <title>Human task</title>
+
+          <mediaobject>
+            <imageobject>
+              <imagedata align="center"
+                         fileref="images/Chapter-Release_Notes/humantask.png"
+                         format="PNG" scalefit="1"></imagedata>
+            </imageobject>
+          </mediaobject>
+        </figure></para>
+    </section>
+
+    <section>
+      <title>Domain Specific Work Items</title>
+
+      <para>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.</para>
+
+      <para>The below image shows three different work items in use in a
+      workflow, "Blood Pressure", "BP Medication", "Notify GP": <figure>
+          <title>Work items</title>
+
+          <mediaobject>
+            <imageobject>
+              <imagedata align="center"
+                         fileref="images/Chapter-Release_Notes/CDSSExample.png"
+                         format="PNG" scalefit="1"></imagedata>
+            </imageobject>
+          </mediaobject>
+        </figure> This one ows a new "Notification" work item: <figure>
+          <title>Notification</title>
+
+          <mediaobject>
+            <imageobject>
+              <imagedata align="center"
+                         fileref="images/Chapter-Release_Notes/NotificationPalette.png"
+                         format="PNG" scalefit="1"></imagedata>
+            </imageobject>
+          </mediaobject>
+        </figure></para>
+    </section>
+
+    <section>
+      <title>Extensible Process Definition Language (ePDL)</title>
+
+      <para>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
+      "Drools Extensible Process Definition Language (ePDL) and the Semantic
+      Module Framework (SMF)". An example of the XML language, with a DSL
+      extension in red, is shown below. <example>
+          <title>Example of the XML language</title>
+
+          <programlisting>
+&lt;process  name="process name" id="process name" package-name="org.domain"
+xmlns="http://drools.org/drools-4.0/process"
+xmlns:mydsl="http://domain/org/mydsl"
+xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
+xs:schemaLocation="http://drools.org/drools-4.0/process drools-processes-4.0.xsd" &gt;
+&lt;nodes&gt;
+  &lt;start id="0" /&gt;
+
+  &lt;action id="1" dialect="java"&gt;
+      list.add( "action node was here" ); 
+  &lt;/action&gt;
+
+    &lt;mydsl:logger id="2" type="warn"&gt;
+        This is my message         
+    &lt;mydsl:logger&gt;
+
+  &lt;end id="3" /&gt;
+&lt;/nodes&gt;
+
+&lt;connections&gt;
+  &lt;connection from="0 to="1" /&gt;
+  &lt;connection from="1" to="2" /&gt;
+  &lt;connection from="2" to="3" /&gt;
+&lt;/connections&gt;
+
+&lt;/process&gt;
+</programlisting>
+        </example></para>
+    </section>
+
+    <section>
+      <title>Pluggable Nodes</title>
+
+      <para>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 OSWorkflow and are working
+      with Deigo to complete this to provide a migration path for OSWorkflow
+      users. 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.</para>
+    </section>
+
+    <section>
+      <title>Human tasks</title>
+
+      <para>Human task management is very important in the context of
+      processes. While we allow users to plug in any task component they
+      prefer, we have developed a human task management component that
+      supports the entire life cycle of human tasks based on the WS-HumanTask
+      specification.</para>
+    </section>
+
+    <section>
+      <title>New functions to the Drools Flow language</title>
+
+      <para><itemizedlist>
+          <listitem>
+            <para>Event nodes that allow a process to respond to external
+            events</para>
+          </listitem>
+
+          <listitem>
+            <para>Exception handlers and exception handler scopes to handle
+            exceptions that could be thrown</para>
+          </listitem>
+
+          <listitem>
+            <para>A ForEach node allows instantiating a section of your flow
+            multiple times, for each element in a collection</para>
+          </listitem>
+
+          <listitem>
+            <para>Data type support has been extended</para>
+          </listitem>
+
+          <listitem>
+            <para>Timers are integrated with common node types</para>
+          </listitem>
+        </itemizedlist> As a result, new node types and properties have been
+      added to the Drools Flow editor in Eclipse. You can also find examples
+      of these new features in the integration tests (e.g.
+      ProcessExceptionHandlerTest, ProcessTimerTest, etc.).</para>
+    </section>
+
+    <section>
+      <title>Work items</title>
+
+      <para>Our pluggable work item approach allows you to plug in
+      domain-specific work in your process in a declarative manner. We plan to
+      build a library of common work items and already provide an
+      implementation for sending emails, finding files, archiving, executing
+      system commands, logging and human tasks.</para>
+    </section>
+
+    <section>
+      <title>JPA</title>
+
+      <para>Improved support for persistence (JPA) and transactions (JTA).
+      <example>
+          <title>An example on how to use persistence and transactions in
+          combination with processes</title>
+
+          <programlisting>
+// create a new JPA-based session and specify the JPA entity manager factory
+Environment env = KnowledgeBaseFactory.newEnvironment();
+env.set( EnvironmentName.ENTITY_MANAGER_FACTORY, Persistence.createEntityManagerFactory( "emf-name" ) );
+env.set( EnvironmentName.TRANSACTION_MANAGER, TransactionManagerServices.getTransactionManager() );
+        
+StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env ); // KnowledgeSessionConfiguration may be null, and a default will be used
+int sessionId = ksession.getId();
+
+// if no transaction boundary is specified, the method invocation is executed in a new transaction automatically
+ProcessInstance processInstance = ksession.startProcess( "org.drools.test.TestProcess" );
+
+// the users can also specify the transaction boundary themselves
+UserTransaction ut = (UserTransaction) new InitialContext().lookup( "java:comp/UserTransaction" );
+ut.begin();
+ksession.insert( new Person( "John Doe" ) );
+ksession.startProcess( "org.drools.test.TestProcess" );
+ksession.fireAllRules();
+ut.commit();</programlisting>
+        </example></para>
+    </section>
+
+    <section>
+      <title>Variable Injection</title>
+
+      <para>Support direct access to process variables in both MVEL and Java
+      in code constraints and actions, so if you have a variable called
+      "person" in your process, you can now describe constraints like:
+      <example>
+          <title>Variable injection example</title>
+
+          <programlisting>
+    * [Java code constraint] return person.getAge() &gt; 20;
+    * [MVEL action] System.out.println(person.name);</programlisting>
+        </example></para>
+    </section>
+
+    <section>
+      <title>Miscellaneous Enhancements</title>
+
+      <para><itemizedlist>
+          <listitem>
+            <para>Process instances can now listen for external events by
+            marking the event node property "external" as true. External
+            events are signaled to the engine using
+            <code>session.signalEvent(type, eventData)</code> More information
+            on how to use events inside your processes can be found in the
+            Drools Flow documentation here:
+            https://hudson.jboss.org/hudson/job/drools/lastSuccessfulBuild/artifact/trunk/target/docs/drools-flow/html/ch03.html#d0e917</para>
+          </listitem>
+
+          <listitem>
+            <para>Process instances are now safe for multi-threading (as
+            multiple thread are blocked from working on the same process
+            instance)</para>
+          </listitem>
+
+          <listitem>
+            <para>Process persistence / transaction support has been further
+            improved. Check out the drools-process/drools-process-enterprise
+            project for more information.</para>
+          </listitem>
+
+          <listitem>
+            <para>The human task component has been extended to support all
+            kinds of data for input / output / exceptions during task
+            execution. <example>
+                <title>As a result, the life cycle methods of the task client
+                have been extended to allow content data</title>
+
+                <programlisting>
+          taskClient.addTask(task, contentData, responseHandler)
+          taskClient.complete(taskId, userId, outputData,responseHandler)
+          taskFail.complete(taskId, userId, outputData,responseHandler)
+
+          long contentId = task.getTaskData().getDocumentContentId();
+          taskClient.getContent(contentId, responseHandler);
+          ContentData content = responseHandler.getContent();</programlisting>
+              </example></para>
+          </listitem>
+
+          <listitem>
+            <para>It is now possible to migrate old Drools4 RuleFlows (using
+            the xstream format) to Drools5 processes (using readable xml)
+            during compilation. Migration will automatically be performed when
+            adding the RuleFlow to the KnowledgeBase when the following system
+            property is set: <code>drools.ruleflow.port = true</code></para>
+          </listitem>
+
+          <listitem>
+            <para>The "Transform" work item allows you to easily transform
+            data from one format to another inside processes. The code and an
+            example can be found in the drools-process/drools-workitems
+            directory.</para>
+          </listitem>
+
+          <listitem>
+            <para>Function imports are now also supported inside
+            processes.</para>
+          </listitem>
+
+          <listitem>
+            <para>The history log - that keeps the history of all executed
+            process instances in a database - has been extended so it is now
+            caable of storing more detailed information for one specfic
+            process instance. It is now possible to find out exactly which
+            nodes were triggered during the execution of the process
+            instance.</para>
+          </listitem>
+
+          <listitem>
+            <para>A new type of join has been added, one that will wait until
+            n of its m incoming connections have been completed. This n could
+            either be hardcoded in the process or based on the value of a
+            variable in the process.</para>
+          </listitem>
+
+          <listitem>
+            <para>Improvements have been made to make persistence easier to
+            configure. The persistence approach is based on a command service
+            that makes sure that all the client invocations are executed
+            inside a transaction and that the state is stored in the database
+            after successful execution of the command. While this was already
+            possible in M4 using the commands directly, we have extended this
+            so that people can simply use the normal StatefulKnowledgeSession
+            interface but simply can configure the persistence using
+            configuration files. For more details, check out the chapter on
+            persistence in the Drools Flow documentation.</para>
+          </listitem>
+        </itemizedlist></para>
+    </section>
+  </section>
+
+  <section>
+    <title>Drools Fusion</title>
+
+    <para>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.</para>
+
+    <section>
+      <title>Event Semantics</title>
+
+      <para>Events are (from a rules engine perspective) a special type of
+      fact that has a few special characteristics: <itemizedlist>
+          <listitem>
+            <para>they are immutable</para>
+          </listitem>
+
+          <listitem>
+            <para>they have strong time-related relationships</para>
+          </listitem>
+
+          <listitem>
+            <para>they may have clear lifecycle windows</para>
+          </listitem>
+
+          <listitem>
+            <para>they may be transparently garbage collected after it's
+            lifecycle window expires</para>
+          </listitem>
+
+          <listitem>
+            <para>they may be time-constrained</para>
+          </listitem>
+
+          <listitem>
+            <para>they may be included in sliding windows for reasoning</para>
+          </listitem>
+        </itemizedlist></para>
+    </section>
+
+    <section>
+      <title>Event Declaration</title>
+
+      <para>Any fact type can assume an event role, and its corresponding
+      event semantics, by simply declaring the metadata for it. <example>
+          <title>Both existing and generated beans support event
+          semantics:</title>
+
+          <programlisting>
+# existing bean assuming an event role
+import org.drools.test.StockTick
+declare StockTick
+  @role( event )
+end
+
+# generated bean assuming an event role
+declare Alarm
+  @role( event )
+  type : String
+  timestamp : long
+end</programlisting>
+        </example></para>
+    </section>
+
+    <section>
+      <title>Entry-Point Stream Listeners</title>
+
+      <para>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.</para>
+
+      <para><code> $st : StockTick( company == "ACME", price &gt; 10 ) from
+      entry-point "stock stream" </code></para>
+
+      <para></para>
+
+      <para><example>
+          <title>To insert facts into an entry point</title>
+
+          <programlisting>
+WorkingMemoryEntryPoint entry = wm.getWorkingMemoryEntryPoint( "stock stream" );
+entry.insert( ticker );
+</programlisting>
+        </example></para>
+
+      <para>StreamTest shows a unit for this.</para>
+    </section>
+
+    <section>
+      <title>Event Correlation and New Operators</title>
+
+      <para>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: test_CEP_TimeRelationalOperators.drl</para>
+
+      <para>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.</para>
+
+      <para>The complete list of operators are: <itemizedlist>
+          <listitem>
+            <para>coincides</para>
+          </listitem>
+
+          <listitem>
+            <para>before</para>
+          </listitem>
+
+          <listitem>
+            <para>after</para>
+          </listitem>
+
+          <listitem>
+            <para>meets</para>
+          </listitem>
+
+          <listitem>
+            <para>metby</para>
+          </listitem>
+
+          <listitem>
+            <para>overlaps</para>
+          </listitem>
+
+          <listitem>
+            <para>overlappedby</para>
+          </listitem>
+
+          <listitem>
+            <para>during</para>
+          </listitem>
+
+          <listitem>
+            <para>includes</para>
+          </listitem>
+
+          <listitem>
+            <para>starts</para>
+          </listitem>
+
+          <listitem>
+            <para>startedby</para>
+          </listitem>
+
+          <listitem>
+            <para>finishes</para>
+          </listitem>
+
+          <listitem>
+            <para>finishedby</para>
+          </listitem>
+        </itemizedlist></para>
+    </section>
+
+    <section>
+      <title>Sliding Time Windows</title>
+
+      <para>Drools 5.0 adds support for reasoning over sliding windows of
+      events. For instance:</para>
+
+      <para><code> StockTick( symbol == "RHAT" ) over window:time( 60 )
+      </code></para>
+
+      <para>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.</para>
+    </section>
+
+    <section>
+      <title>Session Clock</title>
+
+      <para>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. <example>
+          <title>The Clock is specified as part of the SessionConfiguration, a
+          new class that is optionally specified at session creation
+          time</title>
+
+          <programlisting>
+SessionConfiguration conf = new SessionConfiguration();
+conf.setClockType( ClockType.PSEUDO_CLOCK );
+StatefulSession session = ruleBase.newStatefulSession( conf );
+</programlisting>
+        </example></para>
+    </section>
+
+    <section>
+      <title>Event Garbage Collection</title>
+
+      <para>Since events usually have strong temporal relationships, it is
+      possible to infer a logical time window when events can possibly match.
+      The engine uses that capability to calculate when an event is no longer
+      capable of matching any rule anymore and automatically retracts that
+      event.</para>
+    </section>
+
+    <section>
+      <title>Time Units Support</title>
+
+      <para>Drools adopted a simplified syntax for time units, based on the
+      ISO 8601 syntax for durations. This allows users to easily add temporal
+      constraints to the rules writing time in well known units.
+      Example:</para>
+
+      <para><code>SomeEvent( this after[1m,1h30m] $anotherEvent
+      )</code></para>
+
+      <para>The above pattern will match if SomeEvent happens between 1 minute
+      (1m) and 1 hour and 30 minutes after <code>$anotherEvent</code>.</para>
+    </section>
+
+    <section>
+      <title>Support to event expiration policy</title>
+
+      <para>added the ability to define a per-type event expiration policy. In
+      the example bellow, the StockTick events will expire 10 minutes after
+      they enter the system:</para>
+
+      <para><code> declare StockTick @role( event ) @expires( 10m ) end
+      </code></para>
+    </section>
+
+    <section>
+      <title>Support to temporal operations over arbitrary dates.</title>
+
+      <para><example>
+          <title>added the ability for point-in-time operators (before, after
+          and coincides) to be used with any arbitrary date field</title>
+
+          <programlisting>rule "Allow access"
+when
+WorkHours( $s : start, $e : end )
+LogIn( time after $s, time before $e )
+then
+// allow access
+end
+</programlisting>
+        </example></para>
+    </section>
+  </section>
+
+  <section>
+    <title>Eclipse IDE</title>
+
+    <itemizedlist>
+      <listitem>
+        <para>Support multiple runtimes: The IDE now supports multiple
+        runtimes. A Drools runtime is a collection of jars on your file system
+        that represent one specific release of the Drools project jars. To
+        create a runtime, you must either point the IDE to the release of your
+        choice, or you can simply create a new runtime on your file system
+        from the jars included in the Drools Eclipse plugin. Drools runtimes
+        can be configured by opening up the Eclipse preferences and selecting
+        the Drools -&gt; Installed Drools Runtimes category, as shown below.
+        <figure>
+            <title>Run times</title>
+
+            <mediaobject>
+              <imageobject>
+                <imagedata align="center"
+                           fileref="images/Chapter-Release_Notes/runtimes.png"
+                           format="PNG" scalefit="1"></imagedata>
+              </imageobject>
+            </mediaobject>
+          </figure></para>
+      </listitem>
+
+      <listitem>
+        <para>Debugging of rules using the MVEL dialect has been fixed</para>
+      </listitem>
+
+      <listitem>
+        <para>Drools Flow Editor <itemizedlist>
+            <listitem>
+              <para>Process Skins allow you to define how the different
+              RuleFlow nodes are visualized. We now support two skins: the
+              default one which existed before and a BPMN skin that visualizes
+              the nodes using a BPMN-like representation:
+              http://blog.athico.com/2008/10/drools-flow-and-bpmn.html</para>
+            </listitem>
+
+            <listitem>
+              <para>An (X)OR split now shows the name of the constraint as the
+              connection label</para>
+            </listitem>
+
+            <listitem>
+              <para>Custom work item editors now signal the process correctly
+              that it has been changed</para>
+            </listitem>
+          </itemizedlist></para>
+      </listitem>
+    </itemizedlist>
+  </section>
+</section>

Added: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/Chapter-Release_Notes/Section-What_is_new_Drools_5.1.0.xml
===================================================================
--- labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/Chapter-Release_Notes/Section-What_is_new_Drools_5.1.0.xml	                        (rev 0)
+++ labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/Chapter-Release_Notes/Section-What_is_new_Drools_5.1.0.xml	2010-07-25 06:29:02 UTC (rev 34152)
@@ -0,0 +1,1223 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<section version="5.0"
+         xsi:schemaLocation="http://docbook.org/ns/docbook http://www.docbook.org/xml/5.0/xsd/docbook.xsd http://www.w3.org/1999/xlink http://www.docbook.org/xml/5.0/xsd/xlink.xsd"
+         xml:base="../" xmlns="http://docbook.org/ns/docbook"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns:xs="http://www.w3.org/2001/XMLSchema"
+         xmlns:xlink="http://www.w3.org/1999/xlink"
+         xmlns:xi="http://www.w3.org/2001/XInclude"
+         xmlns:ns="http://docbook.org/ns/docbook">
+  <title>What is new in Drools 5.1.0</title>
+
+  <para>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. Drools 5.0 will split up into
+  4 main sub projects, the documentation has already been split to reflect
+  this:</para>
+
+  <section>
+    <title>Core</title>
+
+    <section>
+      <title>JMX Monitoring</title>
+
+      <para>JMX monitoring was added to support KnowledgeBase monitoring. This
+      is specially importand for long running processes like the ones usually
+      required for event processing. Initial integration with JOPR was also
+      added. JMX can be inabled with using the properties setting the
+      knowledge base:</para>
+
+      <para>drools.mbeans = &lt;enabled|disabled&gt;</para>
+
+      <para>or this option at runtime</para>
+
+      <para>kbaseConf.setOption( MBeansOption.ENABLED )</para>
+    </section>
+
+    <section>
+      <title>Spring</title>
+
+      <para>Drools now has extensive Spring support, the XSD can be found in
+      the the drools-spring jar. The namespace is
+      "http://drools.org/schema/drools-spring"</para>
+
+      <example>
+        <title>KnowledgeBuilder example</title>
+
+        <programlisting language="xml">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
+&lt;beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:drools="http://drools.org/schema/drools-spring"       
+       xmlns:camel="http://camel.apache.org/schema/spring"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
+                           http://drools.org/schema/drools-spring http://drools.org/schema/drools-spring.xsd
+                           http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"&gt;
+  &lt;drools:resource id="resource1" type="DRL" source="classpath:org/drools/container/spring/testSpring.drl"/&gt;
+
+  &lt;drools:kbase id="kbase1"&gt;
+    &lt;drools:resources&gt;
+      &lt;drools:resource type="DRL" source="classpath:org/drools/container/spring/testSpring.drl"/&gt;
+      &lt;drools:resource ref="resource1"/&gt;
+      &lt;drools:resource source="classpath:org/drools/container/spring/IntegrationExampleTest.xls" type="DTABLE"&gt;
+        &lt;drools:decisiontable-conf input-type="XLS" worksheet-name="Tables_2" /&gt;
+      &lt;/drools:resource&gt;
+    &lt;/drools:resources&gt;
+
+    &lt;drools:configuration&gt;
+      &lt;drools:mbeans enabled="true" /&gt;
+      &lt;drools:event-processing-mode mode="STREAM" /&gt;
+    &lt;/drools:configuration&gt;
+  &lt;/drools:kbase&gt;
+&lt;/beans&gt;</programlisting>
+      </example>
+
+      <para>KnowledgeBase takes the following configurations:
+      "advanced-process-rule-integration, multithread, mbeans,
+      event-processing-mode, accumulate-functions, evaluators and
+      assert-behavior".</para>
+
+      <para>From the the kbase reference ksessions can be created</para>
+
+      <example>
+        <title>Knowlege Sessions</title>
+
+        <programlisting language="xml">&lt;drools:ksession id="ksession1" type="stateless" name="stateless1" kbase="kbase1" /&gt;
+
+&lt;drools:ksession id="ksession2" type="stateful" kbase="kbase1" /&gt;</programlisting>
+      </example>
+
+      <para>Like KnowledgeBases Knowlege sessions can take a number of
+      configurations, including "work-item-handlers, "keep-references",
+      "clock-type", "jpa-persistence".</para>
+
+      <example>
+        <title>Knowlege Sessions Configurations</title>
+
+        <programlisting language="xml">&lt;drools:ksession id="ksession1" type="stateful"  kbase="kbase1" &gt;
+  &lt;drools:configuration&gt;
+    &lt;drools:work-item-handlers&gt;
+      &lt;drools:work-item-handler name="handlername" ref="handlerid" /&gt;
+    &lt;/drools:work-item-handlers&gt;
+    &lt;drools:keep-reference enabled="true" /&gt;
+    &lt;drools:clock-type type="REALTIME"  /&gt; 
+  &lt;/drools:configuration&gt;
+&lt;/drools:ksession&gt;</programlisting>
+      </example>
+
+      <para>StatefulKnowledgeSessions can be configured for JPA
+      persistence</para>
+
+      <example>
+        <title>JPA configuration for StatefulKnowledgeSessions</title>
+
+        <programlisting language="xml">&lt;bean id="ds" class="org.springframework.jdbc.datasource.DriverManagerDataSource"&gt;
+  &lt;property name="driverClassName" value="org.h2.Driver" /&gt;
+  &lt;property name="url" value="jdbc:h2:tcp://localhost/DroolsFlow" /&gt;
+  &lt;property name="username" value="sa" /&gt;
+  &lt;property name="password" value="" /&gt;
+&lt;/bean&gt;
+
+&lt;bean id="myEmf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"&gt;
+  &lt;property name="dataSource" ref="ds" /&gt;
+  &lt;property name="persistenceUnitName" value="org.drools.persistence.jpa.local" /&gt;
+&lt;/bean&gt;
+
+&lt;bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager"&gt;
+  &lt;property name="entityManagerFactory" ref="myEmf" /&gt;
+&lt;/bean&gt;
+
+&lt;drools:ksession id="jpaSingleSessionCommandService" type="stateful" kbase="kbase1"&gt;
+  &lt;drools:configuration&gt;
+    &lt;drools:jpa-persistence&gt;
+      &lt;drools:transaction-manager ref="txManager" /&gt;
+      &lt;drools:entity-manager-factory ref="myEmf" /&gt;
+      &lt;drools:variable-persisters&gt;
+         &lt;drools:persister for-class="javax.persistence.Entity" implementation="org.drools.persistence.processinstance.persisters.JPAVariablePersister"/&gt;
+         &lt;drools:persister for-class="java.lang.String" implementation="org.drools.container.spring.beans.persistence.StringVariablePersister"/&gt;
+         &lt;drools:persister for-class="java.io.Serializable" implementation="org.drools.persistence.processinstance.persisters.SerializableVariablePersister"/&gt;
+      &lt;/drools:variable-persisters&gt;  
+    &lt;/drools:jpa-persistence&gt;
+  &lt;/drools:configuration&gt;    
+&lt;/drools:ksession&gt;
+</programlisting>
+      </example>
+
+      <para>Knowledge Sessions can support startup batch scripts, previous
+      versions used the "script" element name, this will be updated to
+      "batch". The following commands are supported: "insert-object",
+      "set-global", "fire-all-rules", "fire-until-halt", "start-process",
+      "signal-event". Anonymous beans or named "ref" attributes may be
+      used.</para>
+
+      <example>
+        <title>Startup Batch Commands</title>
+
+        <programlisting language="xml">&lt;drools:ksession id="jpaSingleSessionCommandService" type="stateful" kbase="kbase1"&gt;
+  &lt;drools:script&gt;
+     &lt;drools:insert-object ref="person1" /&gt;
+     &lt;drools:start-process process-id="proc name"&gt;
+       &lt;drools:parameter identifier="varName" ref="varRef" /&gt;
+     &lt;/drools:start-process&gt;
+     &lt;drools:fire-all-rules /&gt;
+  &lt;/drools:script&gt;    
+&lt;/drools:ksession&gt;
+</programlisting>
+      </example>
+
+      <para>ExecutionNodes are supported in Spring , these provide a Context
+      of registered ksessions; this can be used with Camel to provide ksession
+      routing.</para>
+
+      <example>
+        <title>Execution Nodes</title>
+
+        <programlisting language="xml">&lt;execution-node id="node1" /&gt;
+
+&lt;drools:ksession id="ksession1" type="stateless" name="stateless1" kbase="kbase1" node="node1"/&gt;
+
+&lt;drools:ksession id="ksession2" type="stateful" kbase="kbase1" node="node1"/&gt;</programlisting>
+      </example>
+    </section>
+
+    <section>
+      <title>Camel</title>
+
+      <para>Spring can be combined with Camel to provide declarative rule
+      services. a Camel Policy is added from Drools which provides magic for
+      injecting the ClassLoader used by the ksession for any data formatters,
+      it also augments the Jaxb and XStream data formatters. In the case lf
+      Jaxb it adds additional Drools related path info and with XStream it
+      registers Drools related converters and aliases.</para>
+
+      <para>You can create as many endpoints as you require, using different
+      addresses. The CommandMessagBodyReader is needed to allow the payload to
+      be handled by Camel.</para>
+
+      <example>
+        <title>Rest Endpoint Configuration</title>
+
+        <programlisting language="xml">&lt;cxf:rsServer id="rsServer"  
+              address="/kservice/rest"
+              serviceClass="org.drools.jax.rs.CommandExecutorImpl"&gt;
+   &lt;cxf:providers&gt;
+      &lt;bean class="org.drools.jax.rs.CommandMessageBodyReader"/&gt;
+   &lt;/cxf:providers&gt;
+&lt;/cxf:rsServer&gt; 
+</programlisting>
+      </example>
+
+      <para>Camel routes can then be attached to CXF endpoints, allowing you
+      control over the payload for things like data formatting and executing
+      against Drools ksessions. The DroolsPolicy adds some smarts to the
+      route. If JAXB or XStream are used, it would inject custom paths and
+      converters, it can also set the classloader too on the server side,
+      based on the target ksession. On the client side it automatically
+      unwrapes the Response object.</para>
+
+      <para>This example unmarshalls the payload using an augmented XStream
+      DataFormat and executes it against the ksession1 instance. The "node"
+      there refers to the ExecutionContext, which is a context of registered
+      ksessions.</para>
+
+      <example>
+        <title>Camel Route</title>
+
+        <programlisting language="xml">&lt;bean id="droolsPolicy" class="org.drools.camel.component.DroolsPolicy" /&gt;  
+    
+&lt;camelContext id="camel" xmlns="http://camel.apache.org/schema/spring"&gt;        
+   &lt;route&gt;
+      &lt;from uri="cxfrs://bean://rsServer"/&gt;
+      &lt;policy ref="droolsPolicy"&gt;
+         &lt;unmarshal ref="xstream" /&gt;       
+         &lt;to uri="drools://node/ksession1" /&gt;
+         &lt;marshal ref="xstream" /&gt;
+      &lt;/policy&gt;
+   &lt;/route&gt;           
+&lt;/camelContext&gt;
+</programlisting>
+      </example>
+
+      <para>The Drools endpoint "drools:node/ksession1" consists of the
+      execution node name followed by a separator and optional knowledge
+      session name. If the knowledge session is not specified the route will
+      look at the "lookup" attribute on the incoming payload instace or in the
+      head attribute "DroolsLookup" to find it.</para>
+    </section>
+
+    <section>
+      <title>Drools Server</title>
+
+      <para>Spring, Camel and CXF can be combined for declarative services,
+      drools-server is a .war that combines these with some sample xml that
+      works out of the box to get you started, acting like a sort of template.
+      If you are using the war in JBoss container you'll need to add this
+      component, http://camel.apache.org/camel-jboss.html. The war includes a
+      test.jsp showing an echo like example to get you started. This example
+      just executes a simple "echo" type application. It sends a message to
+      the rule server that pre-appends the word "echo" to the front and sends
+      it back. By default the message is "Hello World", different messages can
+      be passed using the url parameter msg - test.jsp?msg="My Custom
+      Message".</para>
+    </section>
+
+    <section>
+      <title>Knowledge Agent Incremental Change Support</title>
+
+      <para>The new version of the Knowledge Agent supports newInstance =
+      false in its configuration (incremental change-set build).</para>
+
+      <para>When setting this property to false, the KnowledgeAgent uses the
+      exisitng KnowledgeBase references apply the incremental changes. Now
+      KnowledgeAgent's can process monitored resource modifications in an
+      incremental way. Modified definitions are compiled and compared against
+      the original version. According to definition's type, the behaves in
+      different ways:</para>
+
+      <itemizedlist>
+        <listitem>
+          <para>Rules: For rules, the Agent searches for modifications in its
+          attributes, LHS and RHS.</para>
+        </listitem>
+
+        <listitem>
+          <para>Queries: queries are always replaced on kbase wether they are
+          modified or not.</para>
+        </listitem>
+
+        <listitem>
+          <para>Other definitions: All other definitions are always replaced
+          in kbase (like if they were modified). We expect to add better
+          support for definition's modification detection in further
+          versions.</para>
+        </listitem>
+      </itemizedlist>
+
+      <para>The current implementation only supports the deletion of rules,
+      querries and functions definitions. Type declarations cannot be
+      deleted.</para>
+    </section>
+
+    <section>
+      <title>Session Inspection and Reporting framework</title>
+
+      <para>A new API based framework for runtime session inspection and
+      reporting was introduced, allowing for better data gathering during
+      debugging or profiling of the application. This inspection framework
+      will become the basis of the tooling features to help providing more
+      detailed information about the contents of each session. This api is
+      experimental and not in drools-api for now, but feel free to play and
+      help us improve it.</para>
+
+      <para>To inspect a session, one can use the following API calls:</para>
+
+      <example>
+        <title>Creating a SessionInspector</title>
+
+        <programlisting language="java">StatefulKnowledgeSession ksession = ...
+ 
+// ... insert facts, fire rules, etc
+ 
+SessionInspector inspector = new SessionInspector( ksession );
+StatefulKnowledgeSessionInfo info = inspector.getSessionInfo();</programlisting>
+      </example>
+
+      <para>The StatefulKnowledgeSessionInfo instance will contain a lot of
+      relevant data gathered during the analysis of the session. A simple
+      example report template is provided and can be generated with the
+      following API call:</para>
+
+      <example>
+        <title>Generating a Report</title>
+
+        <programlisting language="java">String report = SessionReporter.generateReport( "simple", info, null );</programlisting>
+      </example>
+    </section>
+  </section>
+
+  <section>
+    <title>Expert</title>
+
+    <section>
+      <title>Differential Update</title>
+
+      <para>Rete traditional does an update as a retract + assert, for a given
+      fact this causes all partial matches to be destroyed, however during the
+      assert some of which will be recreated again; because they were true
+      before the update and still true after the update. This causes a lot of
+      uneccessary object destruction and creation which puts more load on the
+      Garbage Collector. Now an update is a single pass and inspects the
+      partial matches in place avoiding the unecessary destruction of partial
+      matches. It also removes the need to under go a normalisation process
+      for events and truth maintenance; the normalisation process was where we
+      would look at the activations retracted and activations inserted to
+      figure out what was truly added and what was truly inserted to determine
+      the "diff".</para>
+    </section>
+
+    <section>
+      <title>Channels</title>
+
+      <para>Exit Points have been replaced by the more aptly named channels,
+      we felt this was more appropriate as they may be used by more than juse
+      the rule engine and not an exact oppposte if Entry Points. Where entry
+      points are explicitey related to entering a partition in the Rete
+      network.</para>
+    </section>
+
+    <section>
+      <title>Live Querries</title>
+
+      <para>Drools has always had query support, but the result was returned
+      as an iterable set; this makes it hard to monitor changes over
+      time.</para>
+
+      <para>We have now complimented this with Live Querries, which has a
+      listener attached instead of returning an iterable result set. These
+      live querries stay open creating a view and publish change events for
+      the contents of this view. So now you can execute your query, with
+      parameters and listen to changes in the resulting view.</para>
+
+      <example>
+        <title>Implementing ViewChangedEventListener</title>
+
+        <programlisting language="java">final List updated = new ArrayList();
+final List removed = new ArrayList();
+final List added = new ArrayList();
+ 
+ViewChangedEventListener listener = new ViewChangedEventListener() {           
+ public void rowUpdated(Row row) {
+  updated.add( row.get( "$price" ) );
+ }
+  
+ public void rowRemoved(Row row) {
+  removed.add( row.get( "$price" ) );
+ }
+  
+ public void rowAdded(Row row) {
+  added.add( row.get( "$price" ) );
+ }
+};       
+ 
+// Open the LiveQuery
+LiveQuery query = ksession.openLiveQuery( "cheeses",
+                                          new Object[] { "cheddar", "stilton" },
+                                          listener );
+...
+...
+query.dispose() // make sure you call dispose when you want the query to close</programlisting>
+      </example>
+
+      <para>A Drools blog article contains an example of Glazed Lists
+      integration for live queries,</para>
+
+      <para><link
+      xlink:href="http://blog.athico.com/2010/07/glazed-lists-examples-for-drools-live.html">http://blog.athico.com/2010/07/glazed-lists-examples-for-drools-live.html</link></para>
+    </section>
+
+    <section>
+      <title>Timers and Calendars</title>
+
+      <para>Rule's now suport both interval and cron based timers, which
+      replace the now deprecated duration attribute.</para>
+
+      <example>
+        <title>Sample timer attribute uses</title>
+
+        <programlisting language="java">timer ( int: &lt;initial delay&gt; &lt;repeat interval&gt;? )
+timer ( int: 30s )
+timer ( int: 30s 5m )
+ 
+timer ( cron: &lt;cron expression&gt; )
+timer ( cron:* 0/15 * * * ? )</programlisting>
+      </example>
+
+      <para>Interval "int:" timers follow the JDK semantics for initial delay
+      optionally followed by a repeat interval. Cron "cron:" timers follow
+      standard cron expressions:</para>
+
+      <example>
+        <title>A Cron Example</title>
+
+        <programlisting language="java">rule "Send SMS every 15 minutes"
+    timer (cron:* 0/15 * * * ?)
+when
+    $a : Alarm( on == true )
+then
+    channels[ "sms" ].insert( new Sms( $a.mobileNumber, "The alarm is still on" );
+end</programlisting>
+      </example>
+
+      <para>Calendars can now controll when rules can fire. The Calendar api
+      is modelled on <link
+      xlink:href="http://www.quartz-scheduler.org/">Quartz
+      http://www.quartz-scheduler.org/</link> :</para>
+
+      <example>
+        <title>Adapting a Quartz Calendar</title>
+
+        <programlisting language="java">Calendar weekDayCal = QuartzHelper.quartzCalendarAdapter(org.quartz.Calendar quartzCal)</programlisting>
+      </example>
+
+      <para>Calendars are registered with the StatefulKnowledgeSession:</para>
+
+      <example>
+        <title>Registering a Calendar</title>
+
+        <programlisting language="java">ksession.getCalendars().set( "week day", weekDayCal );</programlisting>
+      </example>
+
+      <para>They can be used in conjunction with normal rules and rules
+      including timers. The rule calendar attribute can have one or more comma
+      calendar names.</para>
+
+      <example>
+        <title>Using Calendars and Timers together</title>
+
+        <programlisting language="java">rule "weekdays are high priority"
+   calendars "weekday"
+   timer (int:0 1h)
+when 
+    Alarm()
+then
+    send( "priority high - we have an alarm” );
+end 
+
+rule "weekend are low priority"
+   calendars "weekend"
+   timer (int:0 4h)
+when 
+    Alarm()
+then
+    send( "priority low - we have an alarm” );
+end</programlisting>
+      </example>
+    </section>
+
+    <section>
+      <title>Decision Tables (Excel)</title>
+
+      <section>
+        <title>Simple templating for variable length comma separated lists
+        within cells</title>
+
+        <para>It is now possible to have a comma separated list of values in a
+        cell and render those with a forall template</para>
+
+        <example>
+          <title>DTable forall syntax</title>
+
+          <programlisting language="java">forall(&lt;separator&gt;?){&lt;codesnippt&gt;}</programlisting>
+        </example>
+
+        <example>
+          <title>DTable forall examples</title>
+
+          <programlisting language="java">forall(,) {propertyName == $}
+forall(&amp;&amp;) {propertyName == $}
+forall(||) {propertyName == $}
+forall(||) {propertyNameA == $} &amp;&amp; forall(||){propertyNameB == $}
+etc </programlisting>
+        </example>
+      </section>
+    </section>
+  </section>
+
+  <section>
+    <title>Flow</title>
+
+    <section>
+      <title>BPMN2</title>
+
+      <para>As we already announced earlier, the Drools team has decided to
+      support the use of the upcoming BPMN 2.0 specification for specifying
+      business processes using XML. This milestone includes a significant
+      extension of the BPMN2 parser to support more of the BPMN2 features
+      using Drools Flow. More specifically:</para>
+
+      <itemizedlist>
+        <listitem>
+          <para>more extensive event support: much more combinations of event
+          types (start, intermediate and end) and event triggers (including
+          for example error, escalation, timer, conditional and signal
+          events), have been included, as well as (interrupting and
+          non-interrupting) boundary events</para>
+        </listitem>
+
+        <listitem>
+          <para>sub-process parameters</para>
+        </listitem>
+
+        <listitem>
+          <para>diverging inclusive gateway</para>
+        </listitem>
+
+        <listitem>
+          <para>etc.</para>
+        </listitem>
+      </itemizedlist>
+
+      <para>BPMN2 processes have also been integrated in the entire Drools
+      tool chain, to support the entire life cycle of the business process.
+      This includes</para>
+
+      <itemizedlist>
+        <listitem>
+          <para>The ability to use BPMN2 processes in combination with our
+          Eclipse tooling</para>
+        </listitem>
+
+        <listitem>
+          <para>Guvnor as process repository</para>
+        </listitem>
+
+        <listitem>
+          <para>web-based management using the BPM console</para>
+        </listitem>
+
+        <listitem>
+          <para>auditing and debugging</para>
+        </listitem>
+
+        <listitem>
+          <para>domain-specific processes</para>
+        </listitem>
+
+        <listitem>
+          <para>etc.</para>
+        </listitem>
+      </itemizedlist>
+
+      <para>As a result, Drools Flow is not only the first open-source process
+      engine that supports such a significant set of BPMN2 constructs
+      natively, our knowledge-oriented approach also allows you to easily
+      combine your BPMN2 processes with business rules and complex event
+      processing, all using the same APIs and tools.</para>
+    </section>
+
+    <section>
+      <title>Web-based Management console</title>
+
+      <para>Drools Flow processes can now also be managed through a web
+      console. This includes features like managing your process instances
+      (starting/stopping/inspecting), inspecting your (human) task list and
+      executing those tasks, and generating reports.</para>
+
+      <para>This console is actually the (excellent!) work of Heiko Braun, who
+      has created a generic BPM console that can be used to support multiple
+      process languages. We have therefore implemented the necessary
+      components to allow this console to communicate with the Drools Flow
+      engine.</para>
+    </section>
+
+    <section>
+      <title>Pluggable Variable Persistence</title>
+
+      <para>Drools Flow can persist the runtime state of the running processes
+      to a database (so they don't all need to be in memory and can be
+      restored in case of failure). Our default persistence mechanism stores
+      all the runtime information related to one process instance as a binary
+      object (with associated metadata). The data associated with this process
+      instance (aka process instance variables) were also stored as part of
+      that binary object. This however could generate problem (1) when the
+      data was not Serializable, (2) when the objects were too large to
+      persist as part of the process instance state or (3) when they were
+      already persisted elsewhere. We have therefor implemented pluggable
+      variable persisters where the user can define how variable values are
+      stored. This for example allows you to store variable values separately,
+      and does support JPA entities to be stored separately and referenced
+      (avoiding duplication of state).</para>
+    </section>
+
+    <section>
+      <title>Improved Process Instance Migration</title>
+
+      <para>Over time, processes may evolve. Whenever a process is updated, it
+      is important to determine what should happen to the already running
+      process instances. We have improved our support for migrating running
+      process instances to a newer version of the process definition. Check
+      out this section in the documentation for more information.</para>
+    </section>
+
+    <section>
+      <title>Installation Scripot</title>
+
+      <para>The Drools build now contains an install folder that simplifies
+      installing the Eclipse plugin, Guvnor and the gwt-console. It creates
+      and copies the necessary jars and wars and deploys them to the JBoss AS.
+      It also includes a simple evaluation process example you can use to test
+      your setup. For more info, take a look at the readme in the install
+      folder.</para>
+    </section>
+  </section>
+
+  <section>
+    <title>Guvnor</title>
+
+    <para>Appearance has been cleaned, for example less pop ups. Reminders for
+    save after changes in assets and information about actions that were
+    taken, also better error reporting if something goes wrong.</para>
+
+    <section>
+      <title>Discussions</title>
+
+      <para>The comments are below the "documentation" section (and of course
+      optional) (and there is an Atom feed to them).</para>
+
+      <figure>
+        <title>Realtime Discussions</title>
+
+        <mediaobject>
+          <imageobject>
+            <imagedata align="center"
+                       fileref="images/Chapter-Release_Notes/discussion1.png"
+                       format="PNG" scalefit="1"></imagedata>
+          </imageobject>
+        </mediaobject>
+      </figure>
+
+      <para>A "backchannel" type connection that is kept open from the browser
+      to allow messages to push back - this means (when enabled) that messages
+      show up in real time (and other handy things like if something is added
+      to a list - the list is updated).</para>
+    </section>
+
+    <section>
+      <title>Inbox</title>
+
+      <para>The inbox feature provides the ability to track what you have
+      opened, or edited - this shows up under an "Inbox" item in the main
+      navigator. <link
+      xlink:href="http://blog.athico.com/2009/09/inbox-feature-to-track-recent-changes.html"></link></para>
+
+      <figure>
+        <title>Inbox Categories</title>
+
+        <mediaobject>
+          <imageobject>
+            <imagedata align="center"
+                       fileref="images/Chapter-Release_Notes/inbox1.png"
+                       format="PNG" scalefit="1"></imagedata>
+          </imageobject>
+        </mediaobject>
+      </figure>
+
+      <itemizedlist>
+        <listitem>
+          <para><emphasis role="bold">Recently Opened </emphasis></para>
+
+          <itemizedlist>
+            <listitem>
+              <para>Clicking on the recently opened item will open a listing
+              of all items you have "recently" opened (it tracks a few hundred
+              items that you were last to look at).</para>
+            </listitem>
+          </itemizedlist>
+        </listitem>
+
+        <listitem>
+          <para><emphasis role="bold">Recently Edited</emphasis></para>
+
+          <itemizedlist>
+            <listitem>
+              <para>Any items that you save changes to, or comment on will
+              show up here, once again.</para>
+            </listitem>
+          </itemizedlist>
+        </listitem>
+
+        <listitem>
+          <para><emphasis role="bold">Incoming changes</emphasis></para>
+
+          <itemizedlist>
+            <listitem>
+              <para>This tracks changes made by *other people* to items that
+              are in *your* "Recently Edited" list. When you open these items
+              they then are removed from this list (but remain in your
+              Recently Edited list).</para>
+            </listitem>
+          </itemizedlist>
+        </listitem>
+      </itemizedlist>
+
+      <figure>
+        <title>Inbox Item Lists</title>
+
+        <mediaobject>
+          <imageobject>
+            <imagedata align="center"
+                       fileref="images/Chapter-Release_Notes/inbox2.png"
+                       format="PNG" scalefit="1"></imagedata>
+          </imageobject>
+        </mediaobject>
+      </figure>
+    </section>
+
+    <section>
+      <title>Bulk Importer</title>
+
+      <para>The Guvnor-Importer is a maven build tool that recurses your rules
+      directory structure and constructs an xml import file that can be
+      manually imported into the Drools-Guvnor web interface via the
+      import/export administration feature.</para>
+    </section>
+
+    <section>
+      <title>DroolsDoc</title>
+
+      <para>PDF document containing information about the package and each DRL
+      asset. DroolsDoc for knowledge package can be downloaded from package
+      view under "Information and important URLs"</para>
+    </section>
+
+    <section>
+      <title>Update to GWT 2.0</title>
+
+      <para>GWT was updated, making Guvnor faster.</para>
+    </section>
+
+    <section>
+      <title>Build in Selector</title>
+
+      <para>The built in selector allows user to choose what assets to build
+      according to:</para>
+
+      <itemizedlist>
+        <listitem>
+          <para>Status (eg, Dev, QA etc)</para>
+        </listitem>
+
+        <listitem>
+          <para>Category</para>
+        </listitem>
+
+        <listitem>
+          <para>Metadata</para>
+        </listitem>
+      </itemizedlist>
+    </section>
+
+    <section>
+      <title>Single Asset Verification</title>
+
+      <para>It is possible to verify just the asset you are working on (
+      ruleflow, rule, decision table ). Verification finds issues like
+      conflicting restrictions in a rule or redundant rows in decision
+      tables.</para>
+    </section>
+
+    <section>
+      <title>Global Area</title>
+
+      <para>Assets stored in Global area can be shared to all packages.</para>
+    </section>
+
+    <section>
+      <title>Diff Check between Snapshots</title>
+
+      <para>Lists the changes between two snapshots.</para>
+    </section>
+
+    <section>
+      <title>View Multiple Assets in One Tab</title>
+
+      <para>Makes it possible to open more than one asset into one view. All
+      the assets can be saved and edited as a group.</para>
+    </section>
+
+    <section>
+      <title>From/Collect/Accumulate support</title>
+
+      <para>Guided Editor has basic support for From, Accumulate and Collect
+      Patterns. You can add any of these structures as regular Patterns. New
+      expression builder component was created to add support for nested
+      method calls of a variable. Using the “plus” button at the top of rule’s
+      WHEN section or using the new “Add after” button present in every
+      Pattern will open the popup to add new conditional elements to your
+      rule. In the list of possible elements you will find three new entries:
+      ”From”, “From Accumulate” and “From Collect”.</para>
+
+      <para>When you add a new “From” element, you will see something like the
+      image below in the guided editor. The left pattern of the “From”
+      conditional element is a regular Pattern. You can add there any type of
+      conditional element you want.The right section of the “From” pattern is
+      an expression builder.</para>
+
+      <figure>
+        <title>From CE Builder</title>
+
+        <mediaobject>
+          <imageobject>
+            <imagedata align="center"
+                       fileref="images/Chapter-Release_Notes/from_builder.png"
+                       format="PNG" scalefit="1"></imagedata>
+          </imageobject>
+        </mediaobject>
+      </figure>
+
+      <para>When using 'from collect' In the left pattern you can choose from
+      “java.util.Collection”, “java.util.List” or “java.util.Set” Fact Types.
+      This Fact Types will be automatically included in the package’s Fact
+      Types list.</para>
+
+      <para>The right pattern of the collect conditional element could be one
+      of this patterns:</para>
+
+      <itemizedlist>
+        <listitem>
+          <para>Fact Type Pattern</para>
+        </listitem>
+
+        <listitem>
+          <para>Free Form Expression</para>
+        </listitem>
+
+        <listitem>
+          <para>From Pattern</para>
+        </listitem>
+
+        <listitem>
+          <para>From Collect Pattern</para>
+        </listitem>
+
+        <listitem>
+          <para>From Accumulate Pattern</para>
+        </listitem>
+      </itemizedlist>
+
+      <figure>
+        <title>From Collect CE Builder</title>
+
+        <mediaobject>
+          <imageobject>
+            <imagedata align="center"
+                       fileref="images/Chapter-Release_Notes/fromcollect.png"
+                       format="PNG" scalefit="1"></imagedata>
+          </imageobject>
+        </mediaobject>
+      </figure>
+
+      <para>When using 'from accumulate' The left pattern could be any Fact
+      Type Pattern. The right section of this conditional element is splited
+      in two:</para>
+
+      <figure>
+        <title>From Accumulate CE Builder</title>
+
+        <mediaobject>
+          <imageobject>
+            <imagedata align="center"
+                       fileref="images/Chapter-Release_Notes/fromaccumulate.png"
+                       format="PNG" scalefit="1"></imagedata>
+          </imageobject>
+        </mediaobject>
+      </figure>
+
+      <para>The left pattern could be any Fact Type Pattern. The right section
+      of this conditional element is splited in two:</para>
+
+      <itemizedlist>
+        <listitem>
+          <para>Source Pattern: (Bed $n, in the screenshot) could be any Fact
+          Type, From, Collect or Accumulate pattern.</para>
+        </listitem>
+
+        <listitem>
+          <para>Accumulate function: Here you will find a tabbed panel where
+          you can enter an accumulate function (sum() in the screenshot) or
+          you can create an online custom function using the “Custom Code”
+          tab.</para>
+        </listitem>
+      </itemizedlist>
+    </section>
+
+    <section>
+      <title>Rule Templates</title>
+
+      <para>Rule Templates allow the Guided editor to be used to build complex
+      rules that can then be authored easily through a spreadsheet's tabular
+      data metaphor. Instead of a field's value, simply mark it as a named
+      "Template Key" and that key is available as a column in the grid. Each
+      row will be applied to the rule template to generate a rule.</para>
+
+      <figure>
+        <title>Adding a Template Key in the 'WHEN' Section</title>
+
+        <mediaobject>
+          <imageobject>
+            <imagedata align="center"
+                       fileref="images/Chapter-Release_Notes/ruletemplate1.png"
+                       format="PNG" scalefit="1"></imagedata>
+          </imageobject>
+        </mediaobject>
+      </figure>
+
+      <figure>
+        <title>Adding a Template Key in the "THEN" Section</title>
+
+        <mediaobject>
+          <imageobject>
+            <imagedata align="center"
+                       fileref="images/Chapter-Release_Notes/ruletemplate2.png"
+                       format="PNG" scalefit="1"></imagedata>
+          </imageobject>
+        </mediaobject>
+      </figure>
+
+      <figure>
+        <title>Populating Rows against those Template Keys</title>
+
+        <mediaobject>
+          <imageobject>
+            <imagedata align="center"
+                       fileref="images/Chapter-Release_Notes/ruletemplate3.png"
+                       format="PNG" scalefit="1"></imagedata>
+          </imageobject>
+        </mediaobject>
+      </figure>
+
+      <figure>
+        <title>Each Row generates a Rule</title>
+
+        <mediaobject>
+          <imageobject>
+            <imagedata align="center"
+                       fileref="images/Chapter-Release_Notes/ruletemplate4.png"
+                       format="PNG" scalefit="1"></imagedata>
+          </imageobject>
+        </mediaobject>
+      </figure>
+    </section>
+
+    <section>
+      <title>Working Sets</title>
+
+      <para>When modelling rules the user gets exposed to all the fact types
+      which can be a bit over whelming. Working Sets allow related fact types
+      can be grouped together, provided a more managable view of selecting
+      fact types, when authoring rules</para>
+
+      <figure>
+        <title>Show the imported types</title>
+
+        <mediaobject>
+          <imageobject>
+            <imagedata align="center"
+                       fileref="images/Chapter-Release_Notes/facttypes.png"
+                       format="PNG" scalefit="1"></imagedata>
+          </imageobject>
+        </mediaobject>
+      </figure>
+
+      <figure>
+        <title>Create Animals Working Set</title>
+
+        <mediaobject>
+          <imageobject>
+            <imagedata align="center"
+                       fileref="images/Chapter-Release_Notes/workingsets1.png"
+                       format="PNG" scalefit="1"></imagedata>
+          </imageobject>
+        </mediaobject>
+      </figure>
+
+      <figure>
+        <title>Without the Working Set all types are visible</title>
+
+        <mediaobject>
+          <imageobject>
+            <imagedata align="center"
+                       fileref="images/Chapter-Release_Notes/workingsets2.png"
+                       format="PNG" scalefit="1"></imagedata>
+          </imageobject>
+        </mediaobject>
+      </figure>
+
+      <figure>
+        <title>Select the Animals Working Set</title>
+
+        <mediaobject>
+          <imageobject>
+            <imagedata align="center"
+                       fileref="images/Chapter-Release_Notes/workingsets3.png"
+                       format="PNG" scalefit="1"></imagedata>
+          </imageobject>
+        </mediaobject>
+      </figure>
+
+      <figure>
+        <title>The available types are reduced</title>
+
+        <mediaobject>
+          <imageobject>
+            <imagedata align="center"
+                       fileref="images/Chapter-Release_Notes/workingsets4.png"
+                       format="PNG" scalefit="1"></imagedata>
+          </imageobject>
+        </mediaobject>
+      </figure>
+    </section>
+
+    <section>
+      <title>Fact Constraints</title>
+
+      <para>Working Sets can be combined with fact consraints to provide
+      additional design time validation. For instance if you are authoring a
+      rule on someone's age, we can know the valid ranges at design time and
+      use this to constrain the author. The fact constraints are part of the
+      workingset and when authoring a rule you must select the work set
+      constraints that you wish to be applied as part of the validation
+      process.</para>
+
+      <figure>
+        <title>Selecting the field</title>
+
+        <mediaobject>
+          <imageobject>
+            <imagedata align="center"
+                       fileref="images/Chapter-Release_Notes/factconstraints1.png"
+                       format="PNG" scalefit="1"></imagedata>
+          </imageobject>
+        </mediaobject>
+      </figure>
+
+      <figure>
+        <title>Selectng the type of field constraint</title>
+
+        <mediaobject>
+          <imageobject>
+            <imagedata align="center"
+                       fileref="images/Chapter-Release_Notes/factconstraints2.png"
+                       format="PNG" scalefit="1"></imagedata>
+          </imageobject>
+        </mediaobject>
+      </figure>
+
+      <figure>
+        <title>A example range constraint</title>
+
+        <mediaobject>
+          <imageobject>
+            <imagedata align="center"
+                       fileref="images/Chapter-Release_Notes/factconstraints3.png"
+                       format="PNG" scalefit="1"></imagedata>
+          </imageobject>
+        </mediaobject>
+      </figure>
+
+      <figure>
+        <title>Select the working set to validate the age field</title>
+
+        <mediaobject>
+          <imageobject>
+            <imagedata align="center"
+                       fileref="images/Chapter-Release_Notes/factconstraints4.png"
+                       format="PNG" scalefit="1"></imagedata>
+          </imageobject>
+        </mediaobject>
+      </figure>
+
+      <figure>
+        <title>A age of 5 is invalid</title>
+
+        <mediaobject>
+          <imageobject>
+            <imagedata align="center"
+                       fileref="images/Chapter-Release_Notes/factconstraints5.png"
+                       format="PNG" scalefit="1"></imagedata>
+          </imageobject>
+        </mediaobject>
+      </figure>
+    </section>
+
+    <section>
+      <title>Guided Rule Editor</title>
+
+      <para>Editing rules is made more explicit. Editor is less "boxy" and
+      rules are written more as a normal text. "contains" keyword was added
+      and binding variables to restrictions is now easier.</para>
+
+      <section>
+        <title>Pattern Order</title>
+
+        <para>Guided Editor supports Pattern reordering in LHS and RHS
+        sections, as well as positional inserting, new Patterns can be
+        inserted in any order (and not always at the end).</para>
+
+        <figure>
+          <title>Move elements up or down</title>
+
+          <mediaobject>
+            <imageobject>
+              <imagedata align="center"
+                         fileref="images/Chapter-Release_Notes/patternordering1.png"
+                         format="PNG" scalefit="1"></imagedata>
+            </imageobject>
+          </mediaobject>
+        </figure>
+
+        <figure>
+          <title>Insert Element at any position</title>
+
+          <mediaobject>
+            <imageobject>
+              <imagedata align="center"
+                         fileref="images/Chapter-Release_Notes/patternordering2.png"
+                         format="PNG" scalefit="1"></imagedata>
+            </imageobject>
+          </mediaobject>
+        </figure>
+      </section>
+    </section>
+
+    <section>
+      <title>Decision Table (Guvnor)</title>
+
+      <para>Keyword "in" was added.</para>
+
+      <para>Columns can be moved and location of a new row can be selected
+      freely.</para>
+    </section>
+  </section>
+
+  <section>
+    <title>Eclipse</title>
+
+    <section>
+      <title>Group Rules in outline view</title>
+
+      <para>You can now use sorting and grouping for Agenda Groups.</para>
+
+      <figure>
+        <title>Group by Agenda Group</title>
+
+        <mediaobject>
+          <imageobject>
+            <imagedata align="center"
+                       fileref="images/Chapter-Release_Notes/Group By.jpg"
+                       format="PNG" scalefit="1"></imagedata>
+          </imageobject>
+        </mediaobject>
+      </figure>
+
+      <figure>
+        <title>Sort by Agenda Group</title>
+
+        <mediaobject>
+          <imageobject>
+            <imagedata align="center"
+                       fileref="images/Chapter-Release_Notes/SortBy.jpg"
+                       format="PNG" scalefit="1"></imagedata>
+          </imageobject>
+        </mediaobject>
+      </figure>
+    </section>
+
+    <section>
+      <title>Drag/Drop File support in audit View</title>
+
+      <para>It is now possible to drag and drop log files into the audit
+      view.</para>
+    </section>
+  </section>
+</section>

Deleted: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/Chapter-Release_Notes/Section-What_is_new_Drools_5.xml
===================================================================
--- labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/Chapter-Release_Notes/Section-What_is_new_Drools_5.xml	2010-07-24 21:54:38 UTC (rev 34151)
+++ labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/Chapter-Release_Notes/Section-What_is_new_Drools_5.xml	2010-07-25 06:29:02 UTC (rev 34152)
@@ -1,987 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<section version="5.0"
-         xsi:schemaLocation="http://docbook.org/ns/docbook http://www.docbook.org/xml/5.0/xsd/docbook.xsd http://www.w3.org/1999/xlink http://www.docbook.org/xml/5.0/xsd/xlink.xsd"
-         xml:base="../" xmlns="http://docbook.org/ns/docbook" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink"
-         xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:ns="http://docbook.org/ns/docbook">
-  <title>What is new in Drools 5.0</title>
-
-  <para>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.
-
-Drools 5.0 will split up into 4 main sub projects, the documentation has already been split to reflect this:
-
-    <itemizedlist>
-      <listitem><para>Drools Guvnor (BRMS/BPMS)</para></listitem>
-      <listitem><para>Drools Expert (rule engine),</para></listitem>
-      <listitem><para>Drools Flow (process/workflow)</para></listitem>
-      <listitem><para>Drools Fusion (cep/temporal reasoning)</para></listitem>
-    </itemizedlist>
-  </para>
-
-<section>
-	<title>Drools API</title>
-<para>
-Drools now has complete api/implementation separation that is no longer rules oriented. This is an important strategy as we move to support other forms of logic, such as workflow and event processing. The main change is that we are now knowledge oriented, instead of rule oriented. The module drools-api provide the interfaces and factories and we have made pains to provide much better javadocs, with lots of code snippets, than we did before. Drools-api also helps clearly show what is intended as a user api and what is just an engine api, drools-core and drools-compiler did not make this clear enough.
-
-The most common interfaces you will use are:
-    <itemizedlist>
-      <listitem><para>org.drools.builder.KnowledgeBuilder</para></listitem>
-       <listitem><para>org.drools.KnowledgeBase</para></listitem>
-       <listitem><para>org.drools.agent.KnowledgeAgent</para></listitem>
-       <listitem><para>org.drools.runtime.StatefulKnowledgeSession</para></listitem>
-       <listitem><para>org.drools.runtime.StatelessKnowledgeSession </para></listitem>
-    </itemizedlist>
-
-Factory classes, with static methods, provide instances of the above interfaces. A pluggable provider approach is used to allow provider implementations to be wired up to the factories at runtime. The Factories you will most commonly used are:
-
-    <itemizedlist>
-       <listitem><para>org.drools.builder.KnowledgeBuilderFactory</para></listitem>
-       <listitem><para>org.drools.io.ResourceFactory</para></listitem>
-       <listitem><para>org.drools.KnowledgeBaseFactory</para></listitem>
-       <listitem><para>org.drools.agent.KnowledgeAgentFactory</para></listitem>
-    </itemizedlist>
-
-	<example>
-          <title>A Typical example to load a rule resource</title>
-          <programlisting><![CDATA[
-KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
-kbuilder.add( ResourceFactory.newUrlResource( url ),
-            ResourceType.DRL );
-if ( kbuilder.hasErrors() ) {
-  System.err.println( builder.getErrors().toString() );
-}         
-
-KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
-kbase.addKnowledgePackages( builder.getKnowledgePackages() );
-
-StatefulKnowledgeSession ksession = knowledgeBase.newStatefulKnowledgeSession();
-ksession.insert( new Fibonacci( 10 ) );
-ksession.fireAllRules();
-
-ksession.dispose();]]></programlisting>
-</example>
-
-A Typical example to load a process resource. Notice the <code>ResourceType</code> is changed, in accordance with the <code>Resource</code> type:
-	<example>
-          <title>A Typical example to load a process resource. Notice the <code>ResourceType</code> is changed, in accordance with the <code>Resource</code> type</title>
-          <programlisting><![CDATA[
-KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
-kbuilder.add( ResourceFactory.newUrlResource( url ),
-            ResourceType.DRF );
-if ( kbuilder.hasErrors() ) {
-  System.err.println( builder.getErrors().toString() );
-}         
-
-KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
-kbase.addKnowledgePackages( builder.getKnowledgePackages() );
-
-StatefulKnowledgeSession ksession = knowledgeBase.newStatefulKnowledgeSession();
-ksession.startProcess( "Buy Order Process" );
-
-ksession.dispose();
-]]></programlisting>
-</example>
-
-'kbuilder', 'kbase', 'ksession' are the variable identifiers often used, the k prefix is for 'knowledge'.
-
-	<example>
-          <title>We have uniformed how decision trees are loaded, and they are now consistent with no need to pre generate the DRL with the spreadsheet compiler</title>
-          <programlisting><![CDATA[
-DecisionTableConfiguration dtconf = KnowledgeBuilderFactory.newDecisionTableConfiguration();
-dtconf.setInputType( DecisionTableInputType.XLS );
-dtconf.setWorksheetName( "Tables_2" );
-kbuilder.add( ResourceFactory.newUrlResource( "file://IntegrationExampleTest.xls" ),
-            ResourceType.DTABLE,
-            dtconf );
-]]></programlisting>
-</example>
-
-It is also possible to configure a <code>KnowledgeBase</code> using configuration, via a xml change set, instead of programmatically. 
-	<example>
-          <title>Here is a simple change set</title>
-          <programlisting><![CDATA[
-<change-set xmlns='http://drools.org/drools-5.0/change-set'
-xmlns:xs='http://www.w3.org/2001/XMLSchema-instance'
-xs:schemaLocation='http://drools.org/drools-5.0/change-set change-set-5.0.xsd' >
-  <add>
-      <resource source='classpath:org/domain/someRules.drl' type='DRL' />
-      <resource source='classpath:org/domain/aFlow.drf' type='DRF' />
-  </add>
-</change-set>
-]]></programlisting>
-</example>
-
-	<example>
-          <title>And it is added just like any other ResourceType</title>
-          <programlisting><![CDATA[
-KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
-kbuilder.add( ResourceFactory.newUrlResource( url ),
-            ResourceType.ChangeSet );
-]]></programlisting>
-</example>
-The other big change for the <code>KnowledgeAgent</code>, compared to the <code>RuleAgent</code>, is that polling scanner is now a service. further to this there is an abstraction between the agent notification and the resource monitoring, to allow other mechanisms to be used other than polling. 
-
-<example>
-          <title>These services currently are not started by default, to start them do the following</title>
-          <programlisting><![CDATA[
-ResourceFactory.getResourceChangeNotifierService().start();
-ResourceFactory.getResourceChangeScannerService().start();
-]]></programlisting>
-</example>
-
-There are two new interfaces added, <code>ResourceChangeNotifier</code> and <code>ResourceChangeMonitor</code>. <code>KnowlegeAgents</code> subscribe for resource change notifications using the <code>ResourceChangeNotifier</code> implementation. The <code>ResourceChangeNotifier</code> is informed of resource changes by the added <code>ResourceChangeMonitors</code>. We currently only provide one out of the box monitor, <code>ResourceChangeScannerService</code>, which polls resources for changes. However the api is there for users to add their own monitors, and thus use a push based monitor such as JMS.
-</para><para><code>
-ResourceFactory.getResourceChangeNotifierService().addResourceChangeMonitor( myJmsMonitor);
-</code>
-</para>
-</section>
-
-  <section>
-    <title>Drools Guvnor</title>
-
-    <itemizedlist>
-      <listitem><para>New look web tooling
-  	<figure>
-      <title>New Look</title>
-      <mediaobject>
-		    <imageobject>
-	        	  <imagedata align="center" fileref="images/Chapter-Release_Notes/guvnor1.png" format="PNG"
-                 	    scalefit="1" />
-	        	</imageobject>
-      		</mediaobject>
-    	</figure>
-	</para>
-      </listitem>	
-
-      <listitem><para>Web based decision table editor
-	<figure>
-      	<title>Web based decision table editor</title>
-	<mediaobject>
-		<imageobject>
-	        	  <imagedata align="center" fileref="images/Chapter-Release_Notes/WebDT.png" format="PNG"
-                 	    scalefit="1" />
-	        	</imageobject>
-      		</mediaobject>
-    	</figure>
-	</para>
-      </listitem>
-
-
-      <listitem><para>Integrated scenario testing
-	<figure>
-      	<title>Running all scenarios</title>
-	<mediaobject>
-		<imageobject>
-	        	  <imagedata align="center" fileref="images/Chapter-Release_Notes/ScenarioSuite.png" format="PNG"
-                 	    scalefit="1" />
-	        	</imageobject>
-      		</mediaobject>
-    	</figure>
-	<figure>
-      	<title>Running single scenario</title>
-	<mediaobject>
-		<imageobject>
-	        	  <imagedata align="center" fileref="images/Chapter-Release_Notes/Scenario.png" format="PNG"
-                 	    scalefit="1" />
-	        	</imageobject>
-      		</mediaobject>
-    	</figure>
-	</para>
-      </listitem>
-	
-
-      <listitem><para>WebDAV file based interface to repository
-	<figure>
-      	<title>WebDAV</title>
-	<mediaobject>
-		<imageobject>
-	        	  <imagedata align="center" fileref="images/Chapter-Release_Notes/WebDav.png" format="PNG"
-                 	    scalefit="1" />
-	        	</imageobject>
-      		</mediaobject>
-    	</figure>
-	</para>
-      </listitem>
-
-      <listitem>
-        <para>Declarative modelling of types (types that are not in pojos)
- 
-	<figure>
-      	<title>>Declarative modelling</title>
-	<mediaobject>
-		<imageobject>
-	        	  <imagedata align="center" fileref="images/Chapter-Release_Notes/DeclaringModel.png" format="PNG"
-                 	    scalefit="1" />
-	        	</imageobject>
-      		</mediaobject>
-    	</figure>
-
-	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.</para></listitem>
-
-      <listitem><para>Fine grained security (lock down access to the app per package or per category). Users who only have category permissions have limited UI capability (ideal for business users)</para></listitem>
-
-      <listitem><para>Execution server - access rules via XML or JSON for execution</para></listitem>
-
-      <listitem><para>Category rules allows you to set 'parent rules' for a category. Any rules appearing in the given category will 'extend' the rule specified - ie inherit the conditions/LHS. The base rule for the category can be set on package configuration tab. RHS is not inherited, only the LHS</para></listitem>
-
-      <listitem><para>Scenario runner detects infinite loops</para></listitem>
-
-      <listitem><para>Scenario runner can show event trace that was recorded by audit logger</para></listitem>
-
-      <listitem><para>DSL sentences in guided editor can now be set to show enums as a dropdown, dates as a date picker, booleans as a checkbox and use regular expressions to validate the inputs (DSL Widgets in Guvnor)</para></listitem>
-
-      <listitem><para>Functions can be edited with text editor</para></listitem>
-
-      <listitem><para>It is possible to add objects to global collections.</para></listitem>
-
-      <listitem><para>Translations to English, Spanish, Chinese and Japanese</para></listitem>
-    </itemizedlist>
-  </section>
-
-  <section>
-    <title>Drools Expert</title>
-	
-	<section>
-      	<title>Asymmetrical Rete algorithm implementation</title>
-	<para>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.</para>
-	</section>
-
-	<section>
-      	<title><code>PackageBuilder</code> can now build multiple namespaces</title>
-	<para>You no longer need to confine one <code>PackageBuilder</code> to one package namespace. Just keeping adding your DRLs for any namespace and <code>getPackages()</code> returns an array of Packages for each of the used namespaces.
-	
-	<example>
-          <title>Getting multiple packages</title>
-          <programlisting>Package[] packages = pkgBuilder.getPackages();</programlisting>
-        </example></para>
-	</section>
-
-	<section>
-      	<title><code>RuleBase</code> attachment to <code>PackageBuilder</code></title>
-	<para>It is now possible to attach a <code>RuleBase</code> to a <code>PackageBuilder</code>, this means that rules are built and added to the rulebase at the same time. <code>PackageBuilder</code> uses the <code>Package</code> instances of the actual <code>RuleBase</code> as it's source, removing the need for additional <code>Package</code> creation and merging that happens in the existing approach.
-
-	<example>
-          <title>Attaching <code>RuleBase</code> to <code>PackageBuilder</code></title>
-          <programlisting>RuleBase ruleBase = RuleBaseFactory.newRuleBase();
-PackageBuilder pkgBuilder = new PackageBuilder( ruleBase, null );</programlisting>
-        </example></para>
-	</section>
-
-	<section>
-      	<title>Binary marshalling of stateful sessions</title>
-	<para>Stateful sessions can now saved and resumed at a later date.
-Pre-loaded data sessions can now be created.
-Pluggable strategies can be used for user object persistence, i.e. hibernate or identity maps.</para>
-	</section>
-
-	<section>
-      	<title>Type Declaration</title>
-	<para>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.
-One example of the construct is:
-	<example>
-          <title>Declaring <code>StockTick</code></title>
-          <programlisting>declare StockTick
-  @role( event )
-  @timestamp( timestampAttr )
-
-  companySymbol : String
-  stockPrice : double
-  timestampAttr : long
-end</programlisting>
-        </example></para>
-	</section>
-
-	<section>
-      	<title>Declaring Fact Metadata</title>
-	<para>
-To declare and associate fact metadata, just use the @ symbol for each metadata ID you want to declare. Example:
-<example>
-          <title>Declaring metadata</title>
-          <programlisting>
-declare StockTick
-  @role( event )
-end</programlisting>
-        </example></para>
-	</section>
-
-
-	<section>
-      	<title>Triggering Bean Generation</title>
-	<para>
-To activate the dynamic bean generation, just add fields and types to your type declaration:
-<example>
-          <title>Declaring <code>Person</code></title>
-          <programlisting>
-declare Person
-  name : String
-  age : int
-end</programlisting>
-        </example></para>
-	</section>
-
-
-	<section>
-      	<title>DSL improvements</title>
-	<para>
-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:
-
-The phone number is {number:\d{2}-\d{3}-\d{8}}
-
-Any valid java regexp may be used in the variable mask.</para>
-	</section>
-
-	<section>
-      	<title><code>fireUntilHalt()</code></title>
-	<para>
-Drools now supports "fireUntilHalt()" feature, that starts the engine in a reactive mode, where rules will be continually fired, until a halt() call is made. This is specially useful for CEP scenarios that require what is commonly known as "active queries".</para>
-	</section>
-
-	<section>
-      	<title>Rule Base partitioning and multi-thread propagation</title>
-	<para>
-Drools ReteOO algorithm now supports an option to start the rule base in a multi-thread mode, where Drools ReteOO network is split into multiple partitions and rules are then evaluated concurrently by multiple threads. This is also a requirement for CEP where there usually are several independent rules running concurrently, with near realtime performance/throughput requirements and the evaluation of one can not interfere with the evaluation of others.</para>
-	</section>
-
-	<section>
-      	<title>XSD Model Support</title>
-	<para>
-Drools now supports XSD models. Remember though the XSD model is generated as pojos local to the Drools classloader. A helper class is there to assist in the creation of the model in the packagebuilder. Once the data model is generated you'll typically use the JAXB dataloader to insert data.</para>
-	</section>
-
-	<section>
-      	<title>Data Loaders</title>
-	<para>
-Drools now supports two data loaders, Smooks and JAXB. Smooks is an open source data transformation tool for ETL and JAXB a standard sun data mapping tool. Unit tests showing Smooks can be found here and JAXB here. </para>
-	</section>
-
-	<section>
-      	<title>Type safe configuration</title>
-	<para>
-
-In addition to the ability of configuring options in drools through configuration files, system properties and by setting properties through the API <code>setProperty()</code> method, Drools-API now supports type safe configuration.
-
-We didn't want to add specific methods for each possible configuration methods for two reasons: it polutes the API and every time a new option is added to Drools, the API would have to change. This way, we followed a modular, class based configuration, where a new Option class is added to the API for each possible configuration, keeping the API stable, but flexible at the same time.
-
-So, in order to set configuration options now, you just need to use the enumerations or factories provided for each option. For instance, if you want to configure the knowledge base for assert behavior "equality" and to automatically remove identities from pattern matchings, you would just use the enums:
-<example>
-          <title>Configuring</title>
-          <programlisting>
-KnowledgeBaseConfiguration config = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
-config.setOption( AssertBehaviorOption.EQUALITY );
-config.setOption( RemoveIdentitiesOption.YES );</programlisting>
-        </example>
-
-For options that don't have a predefined constant or can assume multiple values, a factory method is provided. For instance, to configure the alpha threshold to 5, just use the "get" factory method:
-<example>
-          <title>Configuring alpha threshold</title>
-          <programlisting>
-config.setOption( AlphaThresholdOption.get(5) );</programlisting>
-        </example>
-
-As you can see, the same <code>setOption()</code> method is used for the different possible configurations, but they are still type safe.</para>
-	</section>
-
-	<section>
-      	<title>New accumulate functions: collectSet and collectList</title>
-	<para>
-
-There are times when it is necessary to collect sets or lists of values that are derived from the facts attributes, but are not facts themselves. In such cases, it was not possible to use the collect CE. So, Drools now has two accumulate functions for such cases: collectSet for collecting sets of values (i.e., with no duplicate values) and collectList for collecting lists of values (i.e., allowing duplicate values):
-<example>
-          <title>New accumulate functions</title>
-          <programlisting>
-# collect the set of unique names in the working memory
-$names : Set() from accumulate( Person( $n : name, $s : surname ),
-                        collectSet( $n + " " + $s ) )
-
-# collect the list of alarm codes from the alarms in the working memory
-$codes : List() from accumulate( Alarm( $c : code, $s : severity ),
-                         collectList( $c + $s ) )</programlisting>
-        </example></para>
-	</section>
-
-	<section>
-      	<title>New metadata for type declarations: @propertyChangeSupport</title>
-	<para>
-
-Facts that implement support for property changes as defined in the Javabean(tm) spec, now can be annotated so that the engine register itself to listen for changes on fact properties. The boolean parameter that was used in the insert() method in the Drools 4 API is deprecated and does not exist in the drools-api module.
-
-<example>
-          <title>@propertyChangeSupport</title>
-          <programlisting>
-declare Person
-	@propertyChangeSupport
-end</programlisting>
-        </example></para>
-	</section>
-
-	<section>
-      	<title>Batch Executor</title>
-	<para>
-Batch Executor allows for the scripting of of a Knowledge session using Commands, which can also re, both the <code>StatelessKnowledgeSession</code> and <code>StatefulKnowledgeSession</code> implement this interface
-
-Commands are created using the <code>CommandFactory</code> and executed using the "execute" method, such as the following insert Command:
-	<example>
-          <title>Using <code>CommandFactory</code></title>
-          <programlisting>
-ksession.execute( CommandFactory.newInsert( person ) ); </programlisting>
-        </example>
-
-Typically though you will want to execute a batch of commands, this can be achieved via the composite Command <code>BatchExecution</code>. <code>BatchExecutionResults</code> is now used to handle the results, some commands can specify "out" identifiers which it used to add the result to the <code>BatchExecutionResult</code>. Handily querries can now be executed and results added to the <code>BatchExecutionResult</code>. Further to this results are scoped to this execute call and return via the <code>BatchExecutionResults</code>:
-
-	<example>
-          <title>Using <code>BatchExecutionResult</code></title>
-          <programlisting><![CDATA[
-List<Command> cmds = new ArrayList<Command>();
-cmds.add( CommandFactory.newSetGlobal( "list1", new ArrayList(), true ) );
-cmds.add( CommandFactory.newInsert( new Person( "jon", 102 ), "person" ) );
-cmds.add( CommandFactory.newQuery( "Get People" "getPeople" );
-
-BatchExecutionResults results = ksession.execute( CommandFactory.newBatchExecution( cmds ) );
-results.getValue( "list1" ); // returns the ArrayList
-results.getValue( "person" ); // returns the inserted fact Person
-results.getValue( "Get People" );// returns the query as a QueryResults instance.
-end]]></programlisting>
-        </example>
-
-The <code>CommandFactory</code> details the supported commands, all of which can marshalled using XStream and the <code>BatchExecutionHelper</code>. This can be combined with the pipeline to automate the scripting of a session.
-
-<example>
-          <title>Using <code>PipelineFactory</code></title>
-          <programlisting>
-Action executeResultHandler = PipelineFactory.newExecuteResultHandler();
-Action assignResult = PipelineFactory.newAssignObjectAsResult();
-assignResult.setReceiver( executeResultHandler );
-Transformer outTransformer = PipelineFactory.newXStreamToXmlTransformer( BatchExecutionHelper.newXStreamMarshaller() );
-outTransformer.setReceiver( assignResult );
-KnowledgeRuntimeCommand batchExecution = PipelineFactory.newBatchExecutor();
-batchExecution.setReceiver( outTransformer );
-Transformer inTransformer = PipelineFactory.newXStreamFromXmlTransformer( BatchExecutionHelper.newXStreamMarshaller() );
-inTransformer.setReceiver( batchExecution );
-Pipeline pipeline = PipelineFactory.newStatelessKnowledgeSessionPipeline( ksession );
-pipeline.setReceiver( inTransformer ); </programlisting>
-        </example>
-
-Using the above for a rulset that updates the price of a Cheese fact, given the following xml to insert a Cheese instance using an out-identifier:
-
-<example>
-          <title>Updating Cheese fact</title>
-          <programlisting><![CDATA[
-<batch-execution>
-<insert out-identifier='outStilton'>
-  <org.drools.Cheese>
-    <type>stilton</type>
-    <price>25</price>
-    <oldPrice>0</oldPrice>
-  </org.drools.Cheese>
-</insert>
-</batch-execution>]]>
-</programlisting>
-        </example>
-
-We then get the following <code>BatchExecutionResults</code>:
-
-<example>
-          <title>Updating Cheese fact</title>
-          <programlisting><![CDATA[
-<batch-execution-results>
- <result identifier='outStilton'>
-   <org.drools.Cheese>
-     <type>stilton</type>
-     <oldPrice>0</oldPrice>       
-     <price>30</price>
-   </org.drools.Cheese>
- </result>
-</batch-execution-results>]]>
-</programlisting>
-        </example></para>
-	</section>
-
-	<section>
-      	<title>Marshalling</title>
-	<para>
-
-The <code>MarshallerFactory</code> is used to marshal and unmarshal <code>StatefulKnowledgeSessions</code>. At the simplest it can be used as follows:
-
-<example>
-          <title>Using <code>MarshallerFactory</code></title>
-          <programlisting>
-// ksession is the StatefulKnowledgeSession
-// kbase is the KnowledgeBase
-ByteArrayOutputStream baos = new ByteArrayOutputStream();
-Marshaller marshaller = MarshallerFactory.newMarshaller( kbase );
-marshaller.marshall( baos, ksession );
-baos.close();
-</programlisting>
-        </example>
-
-However with marshalling you need more flexibility when dealing with referenced user data. To achieve this we have the <code>ObjectMarshallingStrategy</code> interface. Two implementations are provided, but the user can implement their own. The two supplied are <code>IdentityMarshallingStrategy</code> and <code>SerializeMarshallingStrategy</code>. <code>SerializeMarshallingStrategy</code> is the default, as used in the example above and it just calls the <code>Serializable</code> or <code>Externalizable</code> methods on a user instance. <code>IdentityMarshallingStrategy</code> instead creates an int id for each user object and stores them in a <code>Map</code> the id is written to the stream. When unmarshalling it simply looks to the <code>IdentityMarshallingStrategy</code> map to retrieve the instance. This means that if you use the <code>IdentityMarshallingStrategy</code> it's stateful for the life of the Marshaller instance and will create ids and keep references to all!
  objects that it attempts to marshal. 
-
-<example>
-          <title>Code to use a <code>IdentityMarshallingStrategy</code></title>
-          <programlisting>
-ByteArrayOutputStream baos = new ByteArrayOutputStream();
-Marshaller marshaller = MarshallerFactory.newMarshaller( kbase, new ObjectMarshallingStrategy[] { MarshallerFactory.newIdentityMarshallingStrategy() } );
-marshaller.marshall( baos, ksession );
-baos.close(); 
-</programlisting>
-        </example>
-
-For added flexability we can't assume that a single strategy is suitable for this we have added the <code>ObjectMarshallingStrategyAcceptor</code> interface that each <code>ObjectMarshallingStrategy</code> has. The Marshaller has a chain of strategies and when it attempts to read or write a user object it iterates the strategies asking if they accept responsability for marshalling the user object. One one implementation is provided the <code>ClassFilterAcceptor</code>. This allows strings and wild cards to be used to match class names. The default is "*.*", so in the above the <code>IdentityMarshallingStrategy</code> is used which has a default "*.*" acceptor.
-
-But lets say we want to serialise all classes except for one given package, where we will use identity lookup, we could do the following:
-
-<example>
-          <title>Using identity lookup</title>
-          <programlisting>
-ByteArrayOutputStream baos = new ByteArrayOutputStream();
-ObjectMarshallingStrategyAcceptor identityAceceptor = MarshallerFactory.newClassFilterAcceptor( new String[] { "org.domain.pkg1.*" } );
-ObjectMarshallingStrategy identityStratetgy = MarshallerFactory.newIdentityMarshallingStrategy( identityAceceptor );
-Marshaller marshaller = MarshallerFactory.newMarshaller( kbase, new ObjectMarshallingStrategy[] { identityStratetgy, MarshallerFactory.newSerializeMarshallingStrategy() } );
-marshaller.marshall( baos, ksession );
-baos.close();
-</programlisting>
-        </example></para>
-	</section>
-
-	<section>
-      	<title>Knowledge Agent</title>
-	<para>
-
-The <code>KnowlegeAgent</code> is created by the <code>KnowlegeAgentFactory</code>. The <code>KnowlegeAgent</code> provides automatic loading, caching and re-loading, of resources and is configured from a properties files. The <code>KnowledgeAgent</code> can update or rebuild this <code>KnowlegeBase</code> as the resources it uses are changed. The strategy for this is determined by the configuration given to the factory, but it is typically pull based using regular polling. We hope to add push based updates and rebuilds in future versions.
-
-The Following example constructs an agent that will build a new <code>KnowledgeBase</code> from the files specified in the path String. It will poll those files every 30 seconds to see if they are updated. If new files are found it will construct a new KnowledgeBase, instead of updating the existing one, due to the "newInstance" set to "true" (however currently only the value of "true" is supported and is hard coded into the engine):
-
-<example>
-          <title>Constructing an agent</title>
-          <programlisting>
-// Set the interval on the ResourceChangeScannerService if you are to use it and default of 60s is not desirable.
-ResourceChangeScannerConfiguration sconf = ResourceFactory.getResourceChangeScannerService().newResourceChangeScannerConfiguration();
-sconf.setProperty( "drools.resource.scanner.interval",
-                  "30" ); // set the disk scanning interval to 30s, default is 60s
-ResourceFactory.getResourceChangeScannerService().configure( sconf );
-KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
-KnowledgeAgentConfiguration aconf = KnowledgeAgentFactory.newKnowledgeAgentConfiguration();
-aconf.setProperty( "drools.agent.scanDirectories",
-                  "true" ); // we want to scan directories, not just files, turning this on turns on file scanning
-aconf.setProperty( "drools.agent.newInstance",
-                  "true" ); // resource changes results in a new instance of the KnowledgeBase being built,
-                            // this cannot currently be set to false for incremental building
-    
-KnowledgeAgent kagent = KnowledgeAgentFactory.newKnowledgeAgent( "test agent", // the name of the agent
-                                                                kbase, // the KnowledgeBase to use, the Agent will also monitor any exist knowledge definitions
-                                                                aconf );
-kagent.applyChangeSet( ResourceFactory.newUrlResource( url ) ); // resource to the change-set xml for the resources to add
-</programlisting>
-        </example>
-
-<code>KnowledgeAgents</code> can take a empty <code>KnowledgeBase</code> or a populated one. If a populated <code>KnowledgeBase</code> is provided, the <code>KnowledgeAgent</code> will iterate <code>KnowledgeBase</code> and subscribe to the <code>Resource</code> that it finds. While it is possible for the <code>KnowledgeBuilder</code> to build all resources found in a directory, that information is lost by the KnowledgeBuilder so those directories will not be continuously scanned. Only directories specified as part of the <code>applyChangeSet(Resource)</code> method are monitored.</para>
-	</section>
-  </section>
-
-  <section>
-    <title>Drools Flow</title>
-	<para>
-	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.</para>
-	<section>
-      	<title>Process Instance view at a specific breakpoint</title>
-	<para>
-<figure>
-	<title>Rule Flow properties</title>
-	<mediaobject>
-		<imageobject>
-			<imagedata align="center" fileref="images/Chapter-Release_Notes/process-instances.png" format="PNG" scalefit="1"/>
-		</imageobject>
-	</mediaobject>
-</figure>
-
-<figure>
-	<title>Current active nodes in a workflow in a specific breakpoint</title>
-	<mediaobject>
-		<imageobject>
-			<imagedata align="center" fileref="images/Chapter-Release_Notes/example-debug-1.png" format="PNG" scalefit="1"/>
-		</imageobject>
-	</mediaobject>
-</figure>
-
-	</para>
-	</section>
-	<section>
-      	<title>New Nodes</title>
-	<para>
-Timers:</para><para>
-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.
-</para><para>
-Human Task:</para><para>
-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.
-
-</para><para>
-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:
-	<figure>
-	<title>Human task</title>
-	<mediaobject>
-		<imageobject>
-			<imagedata align="center" fileref="images/Chapter-Release_Notes/humantask.png" format="PNG" scalefit="1"/>
-		</imageobject>
-	</mediaobject>
-	</figure>
-
-
-	</para>
-	</section>
-	<section>
-      	<title>Domain Specific Work Items</title>
-	<para>
-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.
-
-</para><para>
-The below image shows three different work items in use in a workflow, "Blood Pressure", "BP Medication", "Notify GP":
-
-	<figure>
-	<title>Work items</title>
-	<mediaobject>
-		<imageobject>
-			<imagedata align="center" fileref="images/Chapter-Release_Notes/CDSSExample.png" format="PNG" scalefit="1"/>
-		</imageobject>
-	</mediaobject>
-	</figure>
-
-This one ows a new "Notification" work item:
-	<figure>
-	<title>Notification</title>
-	<mediaobject>
-		<imageobject>
-			<imagedata align="center" fileref="images/Chapter-Release_Notes/NotificationPalette.png" format="PNG" scalefit="1"/>
-		</imageobject>
-	</mediaobject>
-	</figure>
-
-
-	</para>
-	</section>
-	<section>
-      	<title>Extensible Process Definition Language (ePDL)</title>
-	<para>
-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 "Drools Extensible Process Definition Language (ePDL) and the Semantic Module Framework (SMF)". An example of the XML language, with a DSL extension in red, is shown below.
-
-<example>
-          <title>Example of the XML language</title>
-          <programlisting><![CDATA[
-<process  name="process name" id="process name" package-name="org.domain"
-xmlns="http://drools.org/drools-4.0/process"
-xmlns:mydsl="http://domain/org/mydsl"
-xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
-xs:schemaLocation="http://drools.org/drools-4.0/process drools-processes-4.0.xsd" >
-<nodes>
-  <start id="0" />
-
-  <action id="1" dialect="java">
-      list.add( "action node was here" ); 
-  </action>
-
-    <mydsl:logger id="2" type="warn">
-        This is my message         
-    <mydsl:logger>
-
-  <end id="3" />
-</nodes>
-
-<connections>
-  <connection from="0 to="1" />
-  <connection from="1" to="2" />
-  <connection from="2" to="3" />
-</connections>
-
-</process>]]>
-</programlisting>
-        </example>
-
-	</para>
-	</section>
-<section>
-      	<title>Pluggable Nodes</title>
-	<para>
-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 OSWorkflow and are working with Deigo to complete this to provide a migration path for OSWorkflow users.
-
-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.
-
-	</para>
-</section>
-<section>
-<title>Human tasks</title>
-<para>
-Human task management is very important in the context of processes. While we allow users to plug in any task component they prefer, we have developed a human task management component that supports the entire life cycle of human tasks based on the WS-HumanTask specification.
-</para>
-</section>
-<section>
-<title>New functions to the Drools Flow language</title>
-<para>
-
-    <itemizedlist>
-      <listitem><para>Event nodes that allow a process to respond to external events</para></listitem>
-      <listitem><para>Exception handlers and exception handler scopes to handle exceptions that could be thrown</para></listitem>
-      <listitem><para>A ForEach node allows instantiating a section of your flow multiple times, for each element in a collection</para></listitem>
-      <listitem><para>Data type support has been extended</para></listitem>
-      <listitem><para>Timers are integrated with common node types</para></listitem>
-    </itemizedlist>
-
-As a result, new node types and properties have been added to the Drools Flow editor in Eclipse. You can also find examples of these new features in the integration tests (e.g. ProcessExceptionHandlerTest, ProcessTimerTest, etc.).
-</para>
-</section>
-<section>
-<title>Work items</title>
-<para>
-Our pluggable work item approach allows you to plug in domain-specific work in your process in a declarative manner. We plan to build a library of common work items and already provide an implementation for sending emails, finding files, archiving, executing system commands, logging and human tasks.
-</para>
-</section>
-<section>
-<title>JPA</title>
-<para>
-Improved support for persistence (JPA) and transactions (JTA). 
-	<example>
-      <title>An example on how to use persistence and transactions in combination with processes</title>
-      <programlisting><![CDATA[
-// create a new JPA-based session and specify the JPA entity manager factory
-Environment env = KnowledgeBaseFactory.newEnvironment();
-env.set( EnvironmentName.ENTITY_MANAGER_FACTORY, Persistence.createEntityManagerFactory( "emf-name" ) );
-env.set( EnvironmentName.TRANSACTION_MANAGER, TransactionManagerServices.getTransactionManager() );
-        
-StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env ); // KnowledgeSessionConfiguration may be null, and a default will be used
-int sessionId = ksession.getId();
-
-// if no transaction boundary is specified, the method invocation is executed in a new transaction automatically
-ProcessInstance processInstance = ksession.startProcess( "org.drools.test.TestProcess" );
-
-// the users can also specify the transaction boundary themselves
-UserTransaction ut = (UserTransaction) new InitialContext().lookup( "java:comp/UserTransaction" );
-ut.begin();
-ksession.insert( new Person( "John Doe" ) );
-ksession.startProcess( "org.drools.test.TestProcess" );
-ksession.fireAllRules();
-ut.commit();]]></programlisting></example>
-</para>
-</section>
-<section>
-<title>Variable Injection</title>
-<para>
-Support direct access to process variables in both MVEL and Java in code constraints and actions, so if you have a variable called "person" in your process, you can now describe constraints like:
-<example>
-      <title>Variable injection example</title>
-      <programlisting><![CDATA[
-    * [Java code constraint] return person.getAge() > 20;
-    * [MVEL action] System.out.println(person.name);]]></programlisting></example>
-</para>
-</section>
-<section>
-<title>Miscellaneous Enhancements</title>
-<para>
-
-    <itemizedlist>
-      <listitem><para>Process instances can now listen for external events by marking the event node property "external" as true. External events are signaled to the engine using <code>session.signalEvent(type, eventData)</code>
-      More information on how to use events inside your processes can be found in the Drools Flow documentation here: https://hudson.jboss.org/hudson/job/drools/lastSuccessfulBuild/artifact/trunk/target/docs/drools-flow/html/ch03.html#d0e917</para></listitem>
-       <listitem><para>Process instances are now safe for multi-threading (as multiple thread are blocked from working on the same process instance)</para></listitem>
-       <listitem><para>Process persistence / transaction support has been further improved. Check out the drools-process/drools-process-enterprise project for more information.</para></listitem>
-       <listitem><para>The human task component has been extended to support all kinds of data for input / output / exceptions during task execution. 
-	<example>
-      <title>As a result, the life cycle methods of the task client have been extended to allow content data</title>
-      <programlisting><![CDATA[
-          taskClient.addTask(task, contentData, responseHandler)
-          taskClient.complete(taskId, userId, outputData,responseHandler)
-          taskFail.complete(taskId, userId, outputData,responseHandler)
-
-          long contentId = task.getTaskData().getDocumentContentId();
-          taskClient.getContent(contentId, responseHandler);
-          ContentData content = responseHandler.getContent();]]></programlisting></example>
-
-</para></listitem>
-       <listitem><para>It is now possible to migrate old Drools4 RuleFlows (using the xstream format) to Drools5 processes (using readable xml) during compilation. Migration will automatically be performed when adding the RuleFlow to the KnowledgeBase when the following system property is set:
-          <code>drools.ruleflow.port = true</code></para></listitem>
-       <listitem><para>The "Transform" work item allows you to easily transform data from one format to another inside processes. The code and an example can be found in the drools-process/drools-workitems directory.</para></listitem>
-       <listitem><para>Function imports are now also supported inside processes.</para></listitem>
-        <listitem><para>The history log - that keeps the history of all executed process instances in a database - has been extended so it is now caable of storing more detailed information for one specfic process instance. It is now possible to find out exactly which nodes were triggered during the execution of the process instance.</para></listitem>
-        <listitem><para>A new type of join has been added, one that will wait until n of its m incoming connections have been completed. This n could either be hardcoded in the process or based on the value of a variable in the process.</para></listitem>
-        <listitem><para>Improvements have been made to make persistence easier to configure. The persistence approach is based on a command service that makes sure that all the client invocations are executed inside a transaction and that the state is stored in the database after successful execution of the command. While this was already possible in M4 using the commands directly, we have extended this so that people can simply use the normal StatefulKnowledgeSession interface but simply can configure the persistence using configuration files. For more details, check out the chapter on persistence in the Drools Flow documentation.</para></listitem>
-
-</itemizedlist>
-</para>
-</section>
-</section>
-<section>
-    <title>Drools Fusion</title>
-	<para>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.</para>
-
-	<section>
-		<title>Event Semantics</title>
-		<para>
-		Events are (from a rules engine perspective) a special type of fact that has a few special characteristics:
-		    <itemizedlist>
-		      <listitem><para>they are immutable</para></listitem>
-		      <listitem><para>they have strong time-related relationships</para></listitem>
-		      <listitem><para>they may have clear lifecycle windows</para></listitem>
-		      <listitem><para>they may be transparently garbage collected after it's lifecycle window expires</para></listitem>
-		      <listitem><para>they may be time-constrained</para></listitem>
-		      <listitem><para>they may be included in sliding windows for reasoning</para></listitem>
-		   </itemizedlist>
-		</para>
-	</section>
-<section>
-    <title>Event Declaration</title>
-<para>
-
-Any fact type can assume an event role, and its corresponding event semantics, by simply declaring the metadata for it. 
-<example>
-      <title>Both existing and generated beans support event semantics:
-</title>
-      <programlisting><![CDATA[
-# existing bean assuming an event role
-import org.drools.test.StockTick
-declare StockTick
-  @role( event )
-end
-
-# generated bean assuming an event role
-declare Alarm
-  @role( event )
-  type : String
-  timestamp : long
-end]]></programlisting></example>
-</para>
-</section>
-  <section>
-    <title>Entry-Point Stream Listeners</title>
-<para>
-
-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.
-</para><para><code>
-$st : StockTick( company == "ACME", price > 10 ) from entry-point "stock stream"
-</code></para><para>
-</para><para>
-<example>
-	<title>To insert facts into an entry point</title>
-	<programlisting><![CDATA[
-WorkingMemoryEntryPoint entry = wm.getWorkingMemoryEntryPoint( "stock stream" );
-entry.insert( ticker );]]>
-</programlisting></example></para><para>
-StreamTest shows a unit for this.
-</para>
-</section>
-  <section>
-    <title>Event Correlation and New Operators</title>
-<para>
-
-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:
-test_CEP_TimeRelationalOperators.drl
-</para><para>
-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.
-</para><para>
-The complete list of operators are:
-<itemizedlist>
-      <listitem><para>coincides</para></listitem>
-       <listitem><para>before</para></listitem>
-       <listitem><para>after</para></listitem>
-       <listitem><para>meets</para></listitem>
-       <listitem><para>metby</para></listitem>
-       <listitem><para>overlaps</para></listitem>
-       <listitem><para>overlappedby</para></listitem>
-       <listitem><para>during</para></listitem>
-       <listitem><para>includes</para></listitem>
-       <listitem><para>starts</para></listitem>
-       <listitem><para>startedby</para></listitem>
-       <listitem><para>finishes</para></listitem>
-       <listitem><para>finishedby</para></listitem>
-</itemizedlist>
-</para>
-</section>
-  <section>
-    <title>Sliding Time Windows</title>
-<para>
-
-Drools 5.0 adds support for reasoning over sliding windows of events. For instance:
-</para><para><code>
-StockTick( symbol == "RHAT" ) over window:time( 60 )
-</code></para><para>
-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.
-</para>
-</section>  
-<section>
-<title>Session Clock</title>
-<para>
-
-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.
-<example>
-	<title>The Clock is specified as part of the SessionConfiguration, a new class that is optionally specified at session creation time</title>
-	<programlisting><![CDATA[
-SessionConfiguration conf = new SessionConfiguration();
-conf.setClockType( ClockType.PSEUDO_CLOCK );
-StatefulSession session = ruleBase.newStatefulSession( conf );]]>
-</programlisting></example>
-</para>
-</section>
-<section>
-<title>Event Garbage Collection</title>
-<para>
-Since events usually have strong temporal relationships, it is possible to infer a logical time window when events can possibly match. The engine uses that capability to calculate when an event is no longer capable of matching any rule anymore and automatically retracts that event.
-</para>
-</section>
-<section>
-<title>Time Units Support</title>
-<para>
-Drools adopted a simplified syntax for time units, based on the ISO 8601 syntax for durations. This allows users to easily add temporal constraints to the rules writing time in well known units. Example:
-</para>
-<para>
-<code>SomeEvent( this after[1m,1h30m] $anotherEvent )</code>
-</para><para>
-The above pattern will match if SomeEvent happens between 1 minute (1m) and 1 hour and 30 minutes after <code>$anotherEvent</code>.
-</para></section>
-<section>
-<title>Support to event expiration policy</title>
-<para>
-added the ability to define a per-type event expiration policy. In the example bellow, the StockTick events will expire 10 minutes after they enter the system:
-</para>
-<para><code>
-declare StockTick @role( event ) @expires( 10m ) end
-</code></para>
-</section>
-<section>
-<title>Support to temporal operations over arbitrary dates.</title>
-<para>
-<example>
-	<title>added the ability for point-in-time operators (before, after and coincides) to be used with any arbitrary date field</title>
-	<programlisting><![CDATA[rule "Allow access"
-when
-WorkHours( $s : start, $e : end )
-LogIn( time after $s, time before $e )
-then
-// allow access
-end]]>
-</programlisting></example>
-</para>
-</section>
-</section>
-  <section>
-    <title>Eclipse IDE</title>
-
-    <itemizedlist>
-      <listitem><para>Support multiple runtimes: The IDE now supports multiple runtimes. A Drools runtime is a collection of jars on your file system that represent one specific release of the Drools project jars. To create a runtime, you must either point the IDE to the release of your choice, or you can simply create a new runtime on your file system from the jars included in the Drools Eclipse plugin. Drools runtimes can be configured by opening up the Eclipse preferences and selecting the Drools -> Installed Drools Runtimes category, as shown below.
-<figure>
-      	<title>Run times</title>
-	<mediaobject>
-		<imageobject>
-	        	  <imagedata align="center" fileref="images/Chapter-Release_Notes/runtimes.png" format="PNG"
-                 	    scalefit="1" />
-	        	</imageobject>
-      		</mediaobject>
-    	</figure>
-
-
-</para></listitem>
-       <listitem><para>Debugging of rules using the MVEL dialect has been fixed</para></listitem>
-       <listitem><para>Drools Flow Editor
-     <itemizedlist>
-      <listitem><para>Process Skins allow you to define how the different RuleFlow nodes are visualized. We now support two skins: the default one which existed before and a BPMN skin that visualizes the nodes using a BPMN-like representation: http://blog.athico.com/2008/10/drools-flow-and-bpmn.html</para></listitem>
-       <listitem><para>An (X)OR split now shows the name of the constraint as the connection label</para></listitem>
-       <listitem><para>Custom work item editors now signal the process correctly that it has been changed</para></listitem>
-</itemizedlist>
-</para></listitem>
-    </itemizedlist>
-  </section>
-</section>

Added: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/Group By.jpg
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/Group By.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/Only Showed.jpg
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/Only Showed.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/SortBy.jpg
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/SortBy.jpg
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/discussion1.png
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/discussion1.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/factconstraints1.png
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/factconstraints1.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/factconstraints2.png
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/factconstraints2.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/factconstraints3.png
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/factconstraints3.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/factconstraints4.png
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/factconstraints4.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/factconstraints5.png
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/factconstraints5.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/facttypes.png
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/facttypes.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/from_builder.png
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/from_builder.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/fromaccumulate.png
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/fromaccumulate.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/fromcollect.png
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/fromcollect.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/inbox1.png
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/inbox1.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/inbox2.png
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/inbox2.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/patternordering1.png
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/patternordering1.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/patternordering2.png
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/patternordering2.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/ruletemplate1.png
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/ruletemplate1.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/ruletemplate2.png
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/ruletemplate2.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/ruletemplate3.png
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/ruletemplate3.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/ruletemplate4.png
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/ruletemplate4.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/workingsets1.png
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/workingsets1.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/workingsets2.png
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/workingsets2.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/workingsets3.png
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/workingsets3.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/workingsets4.png
===================================================================
(Binary files differ)


Property changes on: labs/jbossrules/trunk/drools-docs/drools-docs-introduction/src/main/docbook/en-US/images/Chapter-Release_Notes/workingsets4.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream



More information about the jboss-svn-commits mailing list