<commit_before><?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 and Noteworthy in Drools 5.1.0</title>

  <section>
    <title>Drools API</title>
    
    <para>As in Drools 5.0 it is still possible to configure a <code>KnowledgeBase</code>
    using configuration, via a xml change set, instead of programmatically. However the change-set namespace
    is now versioned. This means that for Drools 5.1, the 1.0.0 xsd should be referenced.
    </para>
    <example>
        <title>Here is a simple version 1.0.0 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 http://anonsvn.jboss.org/repos/labs/labs/jbossrules/trunk/drools-api/src/main/resources/change-set-1.0.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>
  </section>
    
  <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 <NAME>, 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 the Drools Flow documentation for more information.</para>
    </section>

    <section>
      <title>Installation Script</title>

      <para>The Drools build now exports an installer 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, download the drools installer and take a look
      at the readme within.</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>
<commit_msg>JBRULES-2606, referencing the 1.0.0 version drools-spring xsd<commit_after><?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 and Noteworthy in Drools 5.1.0</title>

  <section>
    <title>Drools API</title>
    
    <para>As in Drools 5.0 it is still possible to configure a <code>KnowledgeBase</code>
    using configuration, via a xml change set, instead of programmatically. However the change-set namespace
    is now versioned. This means that for Drools 5.1, the 1.0.0 xsd should be referenced.
    </para>
    <example>
        <title>Here is a simple version 1.0.0 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 http://anonsvn.jboss.org/repos/labs/labs/jbossrules/trunk/drools-api/src/main/resources/change-set-1.0.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>
  </section>
    
  <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://anonsvn.jboss.org/repos/labs/labs/jbossrules/trunk/drools-container/drools-spring/src/main/resources/org/drools/container/spring/drools-spring-1.0.0.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 <NAME>, 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 the Drools Flow documentation for more information.</para>
    </section>

    <section>
      <title>Installation Script</title>

      <para>The Drools build now exports an installer 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, download the drools installer and take a look
      at the readme within.</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>

{'fraction_non_alphanumeric': 0.09822262793320088, 'fraction_numerical': 0.004188369220855931, 'mean_word_length': 2.3220121298608634, 'pattern_counts': {'":': 0, '<': 1643, '<?xml version=': 4, '>': 1643, 'https://': 0, 'lorem ipsum': 0, 'www.': 28, 'xml': 58}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 12, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3442957', 'n_tokens_mistral': 26934, 'n_tokens_neox': 24766, 'n_words': 7842}