Release notes

2.1.0 (2018-10-27):

FMK (from 2.0.0 to 2.1.0)
– Fix: minor bug in unescape java string: illegal escaping was not correctly handled.
– Improvements on Advanced Reader.
– Improved XML reader secure automatic casts.
– Improved syntax error detection in property compiler.
– Improved property compiler: parsing, numbers detection and syntax error detection are more accurate.
– Improved set property: casts when inserting in maps are more accurate.
– Improved Typed Map.
– Improved conversions to collections.
– Improved constant optimizer for not loosing cast information.
– Improved String to Numbers conversions (conversion framework).

BRE (from 2.0.0 to 2.1.0)
– Fix: get write base type in context converter.
– Added new CAST accessor.
– For Each Number index is now handled as integer.
– Function calls can now be performed with dynamic names, this adds the possibility to call different functions depending on input or computed data without writing if / else rules.
– Performance optimizations on count accessor.

DSL (from 1.0.0 to 2.0.0)
This module was globally refactored and improved, mainly for the following:
– New grammar features (character pattern before or after match, auto complete groups, …).
– Lots of improvements on the API (new listeners, new configuration features, …).
– Autocompletion is more accurate and easier to use.

DSL html documentation (from 1.0.0 to 1.0.1)
– Minor improvements and fixes.

DSL Extension for BRE (from 1.0.0 to 1.1.0)
– Added autocompletion for data access on input / output beans (fields, methods and properties).
– Added autocompletion for global and local variables.
– Added config holder for MRL.
– Added cast accessor to grammar.
– Several minor fixes and improvements on existing grammar.

DSL Editor (from 1.0.0 to 1.1.0)
– Graphical improvements on the webeditor.
– Base editor is no more packaged as a springboot standalone jar.

DSL Editor for Rule Engine (from 1.0.0 to 1.1.0)
– Repackaged with new dependencies versions.

Demos
– Added MRL configuration in drools fight.
– Added demo of dsl grammar extension in drools fight.
– Updated JSON Demo with the new grammar features.
– Added mrl configuration and native java implementation to advanced demo (Race example).

2.0.0 (2018-06-19):

Major Changes:
– Changed modules structures so that framework is now handled as a dependency and is no more included in rule engine’s jar.
– Changed maven modules names (mrules-fmk, mrules-bre and mrules-ext-*** for extensions).
– JDK5 is now unsupported. Compilation level is now JDK6 (except for JDK7 and JDK8 extensions).
– Added BOM to centralize modules versions.
– Added Grammar Engine library (mrules-dsl), generic web editor with autocomplete and syntax validation.
– Added Grammar Engine related demos (DemoDslJson and DemoDslJsonEditor).
– Added business rule engine DSL extension and dedicated web editor.
– Javadoc is now generated and published online for main modules and for extensions.
– Updated licencing system.

Other Changes:
– Added interface IExecutable#ReturningValue, in order to flag executables that are able to return a non-null result.
– Added cost info in executable returning value in order to improve optimization process.
– Added new VALUES accessor, for Collections constants.
– Added Classloader file search utility, to find resources in classpath matching patterns.
– Added standalone context in rule engine.
– Rule engine RichXmlFactory is now easier to extend for Addons developpers.
– Added rule engine optimizer, to detect misplaced return statements, making some rules unreachable.
– Improved initial configuration loading, by adding the “extra initializer” concept in mrules-utils.xml configuration file.
– Several internal code improvements and optimizations.

Fixes:
– Corrects NPE with XOR operator if no condition are defined.
– Corrects NPE if null is returned by an accessor used as a condition.
– Corrects the fact that overriding out and err streams of execution context is ignored in functions.
– Corrects potential incorrect values in hashcode / equals.
– Corrects bug on “continue” command in “for each numbers”.
– Corrects potential bug on return if no value provided.
– Corrects error in message formating if an argument is not provided. Behavior is now to replace with empty String.
– Corrects potential bug in COUNT if no condition is provided.
– Adds two addons missing in referencial.
– Improves INDEX Addon toString representation.

1.10.1 (2017-12-27):

Fixes:
– Performance issues during compilation process, occurring unexpectedly on few specific environments.
– NullPointerException introduced in 1.10.0, occurring sometimes while performing date operation.
– Typo corrections on debug logs.

1.10.0 (2017-11-09):

Changes:
– Improved accessor NEW in order to better guess constructor to use.
– Improved type guessing with maps.
– Improved reflexion code.
– Improved variable property (VPROPERTY) to add prefix / suffix.
– Improved write feature for XML Factory, to make output more readable.
– Improved number conversion to BigDecimal by striping unuseful decimal zeros.
– Improved auto set bean properties from xml nodes by handling collections.
– Improving ADD and ADDALL to instantiate target collection if null.
– Improved XML parsing to take into account names like “my-name” in autoSet.
– Improved condition API with combine method.
– Improved message resource loading to avoid message in error stream with some classloaders.
– Improved handling of compilation and execution sub contexts, by introducing the notion of root context.
– Added global variable #ROOTREADBASE and #ROOTWRITEBASE, to be able to access the root context when using sub-properties (in collection filtering for instance)
– Added new Collection Sorting action (SORT).
– Added new Collection Filtering accessor (FILTER).
– Added return value for CLEAR action.
– Added possibility to use RETURN within ruleset.
– Added new accessor for single math operations.
– Added text reader allowing to trace lines numbers and to unread characters.
– Added string method utilities.
– Enriched AVERAGE accessor (Breaking change).
– Introducing logical operators’ weight to prepare future developments.
– Changed date diff default type to long, so that milliseconds are safely computed.
– Property framework: strict methods with several arguments can now be invoked.
– Updated sudoku demo to illustrate new features on math and return.

Fixes:
– Typo corrections on rulesets toString.
– Corrected NPE on conditions using operators without reference value.
– Problems could occur if function returning value was not taken into account.
– Corrected problem in String constant values if it contains the “:” character.
– Property framework: fixed bad error message when parenthesis were not closed.

1.9.2 (2017-07-22):

Changes:
– Improved class loading in multiple classloader environments.
Fixes:
– Added missing addon in configuration file.
– Bad annotation on CDI injector, causing errors with some CDI frameworks.

1.9.1 (2017-05-12):

Changes:
– Improved type guessing and automatic conversion.
Fixes:
– Fixed problem causing unexpected results on type detection and automatic conversions if generics are not available for input data (for example, if a Map is used as input bean).

1.9.0 (2017-03-08):

Changes:
– Added support for functions, allowing arguments, return value and recursive calls.
– Added Sudoku Solver Demo, with Drools comparison.
– Added possibility to change compilation level in an execution block.
– Compilation context is now using input and output types, instead of instances, allowing to use interface for this lifecycle phase.
– Added MVariablePropertyAccessor (VPROPERTY) allowing to access properties with dynamical names.
– Added converter from execution context to compilation context.
– Added possibility to return value with an executable, wrapped in the Execution Result.
– Added possibility to wrap an executable as an accessor (done automatically). Used for functions.
– Improved XML Factory to accept more cases for sub-objects.
– Execution context now returns Execution result.
– Improved classes “forName” to handle arrays.
– Added “returnValue” property to Flow Control Action.
– Added For Each Number Addon (FOREACHNUMBER) allowing to iterate on a range of numbers.
– Improved automatic cast if types can’t be detected at compilation time.
– Execution context wrappers are now deprecated. It’s more efficient to instantiate a new sub context.
– Added String Format accessor (FORMAT), allowing to format a String, in a way similar to Java Message Format.
– Added PrintF Action, based on FORMAT (PRINTF). Updated some demos to use it.
– Added marker “FATAL” to slf4j interface for Fatal logs.
– Various internal code optimizations, slightly improving performances.

Fixes:
– Corrected potential bug on cache if input and output beans have the same property name.
– Complex strict properties failed to compile, with array access directly after a function invocation, if it was used as an argument. For example :
“!myFunction(!myFunctionReturningArray()[!myFunctionReturningInt()])” failed to compile.

Extensions:
– New extension allowing to integrate MRules in Spring based projects.

1.8.0 (2016-12-15):

Changes:
– Added NOTCONTAINS operator, which is the inversion of CONTAINS.
– Added automatic wrapper to allow execution of accessors, mainly to execute direct method calls from property framework.
– Improved and optimized type detections for operators on collections.
– Improved optimization process to reduce the number of casts during runtime when possible, by casting more accurately constant values.
– Improved property framework to perform auto casts for strict method access with arguments.
– Factory does not anymore create Set for multiple constant values, but List. The optimizer will do transform it to Set only if necessary and no information can be lost.
– Consequent improvements made on cache system, allowing to increase hit ratio and minimize possibility to find in cache a value which has been changed by a previous rule.
– Improved cache usage, by deactivating reset by default at each “FOREACH” iteration.
– Added global cache default activation configuration.
– Added global cache default activation configuration by feature (2 features for the moment: property access and condition evaluation result).
– Global cache default activation might be overridden for a specific ruleset or a specific compilation.
– Added automatic cache deactivation if its usage is computed as unuseful (for example if a temporary result is used as an input for another computation also put in cache) allowing to minimize cache accesses an updates.
– Introduced possibility to force an Addon to reset its cached data.
– Native property extension deactivates globally the cache by default for property access.
– Optimization process is more accurate and proceeds to more modifications:
– Inverting conditions to always have the eventual constant value as the reference.
– Changing operator if possible for faster evaluation.
– Changed addon registering API and concept (registered addons is an image at a specific point, which can be reset and redone, possibility to unregister is removed).
– Added optimizer to call “optimize” method of addons, instead of doing it in global optimize process, after optimization chain.
– Added new PropertyUtils to ease access to property framework.
– Some MRulesUtils methods are now deprecated because moved to PropertyUtils.
– Added new IReadWriteAccessor interface.
– Strong optimization of local variables accesses (reads and writes).
– Significantly optimized Collection conversions.
– Added more explicit error message if add or clear fails for a Collection.
– Made resource loading more reliable in multiple classloader environments.

Fixes:
– Corrected bug on native property extension and improved impossible native access detection.
– Corrected ADD and ADDALL actions, which used context read target and now use write target.
– Corrected bug on collection access via property framework, if a Collection nested inside a Map had to be automatically created to add an element.
– Corrected toString on some addons.

Extensions:
– MRulesNativeProperties version now follows core project’s version, to make its integration easier.

1.7.0 (2016-11-14):

Changes:
– Added ADDALL Action, to add all elements from an iterable source to a target.
– Optimized iterations on fixed lists.
– Optimized evaluation condition for LIGHT mode.
– Improved memory footprint for reflexion invocation. Introduced “ArrayProvider” API.
– Other small optimizations on rules optimizer and license reading.
– Improved javadoc.

Fixes:
– Fixed a bug in compilation process which made it fail with no reasons in very rare and specific cases when conversions to Strings had to be made.
– Fixed problem on cache which could be abusively deactivated sometimes.

Extensions:
– MRulesNativeProperties is now in version 1.2, in order to follow changes in configuration syntax made in previous version.
v1.0 is bound to MRules 1.4.x ; v1.1 is bound to MRules versions 1.5.x and 1.6.x ; version 1.2 is bound to MRules version 1.7.0.

1.6.1 (2016-09-14):

Changes:
– Improved types and conversions handling for complex cases involving Collections.
– Removed partial support for Arrays in SPLIT Accessor, as arrays are not fully supported by other Addons. Global array support may be added in future releases.

Fixes:
– Missing check on evaluation condition.
– Property Accessor does not handle well iterable sub-source.

1.6.0 (2016-09-04):

Changes:
– Added Accessor DATEOP, allowing to perform operations on date.
– Added Accessor DATEDIFF, allowing to compute duration between two dates.
– Added Accessor ABS, allowing to compute absolute value of numbers.
– Added Operator NOTEMPTY, negation of EMTY.
– Several improvements where made to Collection handling: Some Accessors which did not allow requesting Collections as results now allow it.

1.5.1 (2016-08-31):

Fix:
– Dates where badly parsed from String or an error occurred if their format was different from preferred format.

1.5.0 (2016-08-05):

Changes:
– Optimization cycle
– Optimization is now a separated phase of the life cycle. Phase named “OPTIMIZE” is now between the “COMPILE” and “EXECUTE” phases.
– Addons registration is now done recursively by a generic module and is no more responsability of the parent Addon.
– Improved optimization phase (split into 2 steps: global and specific per Addon).
– Added Optimizer modules for global step:
– Created the optimizer chain, handling the optimizers launch and configured by the global configuration.
– Added optimizer: Constant detection. Searches for expressions which might be turned into constant values.
– Added optimizer: Expression optimizer. Searched for simplifications which might be applied on conditions. For example: (A or A) is simply A.
– Added optimizer: Deduplication detection. Searches for similar objects in the ruleset object tree, in order to reuse instances and optimize memory footprint.
– Optimizer chain is customizable on a per-ruleset basis via the custom properties. Updated advanced demo to demonstrate deactivation of an optimizer for a specific rule set.
– Optimization process might be fully disabled for a specific execution via the compilation context, the Inject annotation or the JNDI properties.
– XML Configuration now persists rule set custom properties.
– Added “not” flag to ICondition API, in order to make optimization process more efficient.
– All Addons have now a generic toString method to simplify debug.
– Improved conversions between Files, URIs and URLs.
– Improved global variable to better cast their values to other types.
– Improved Date objects conversions. Added global, specific and preferred patterns to date converters. Native configuration has been improved.
– Added JDK7 extensions, in order to handle new Path object for conversions.
– Added JDK8 extensions, handling new types provided by date / time API:
– Global variables #NOW, #TIME, #DATE, #DATETIME handle these new types.
– Date / Time converter handle conversions between legacy java.util.Date, Calendar implementations and SQL date / time types.
– Slightly optimized size of binary code.
– Other internal code optimizations.

Fixes:
– Corrected toString method for MActionAdd, which inverted source value and target collection.

1.4.1 (2016-07-27):

Fix:
– Corrected problem on licence reading for some non-Oracle JVM, for example Android.

1.4.0 (2016-06-24):

Changes:
– Added RESET_CACHE Addon, allowing to flush all data for the current execution.
– Removed previously added interface IAddonCache, moving declared method to IAddon.
– Dropped addon(s) de-duplication methods from MAddonsUtils, replaced by addon(s) registration in compilation context, improved with parent link information.
– Non public methods are now accessible with property framework.
– Added abstraction layer for accessing fields or invoking methods via Reflection, in order to ease extensions development.
– Added interfaces to describe property access and property compilation.
– Added possibility to configure the implementation to use for property access and property compilation.
– Added possibility to disable cache globally for a ruleset (by config) or for a specific execution (by code).
– Added SPLIT Accessor, to split a String using a specified separator.
– Added customizable default type to TypedMap, in order to created automatically nested beans.
– Added new Demo, for online tutorial.
– Added context factory handling to SimpleXMLFactory
– Compilation is now automatic for LIGHT level even if no context factory id provided
– Added AbstractSrcTgtAction abstraction Layer for actions defining a source and a target. Actions SET and ADD now extend this layer.
– Added two extensions (see documentation/extentions):
– MRulesNativeProperties: allows to generate bytecode to access properties instead of using reflection. Defers to reflection if field or method is not public.
– MRulesWS: Simple JSON Rest Web Service allowing to run rule sets remotely.

Fixes:
– Corrected bug on automatic addon wrapping (Accessor <–> Condition), which was not done if inserted in a Collection of addons.
– Registering TransferQueue for JDK7+ was searching in package java.util instead of java.util.concurrent.

1.3.0 (2016-05-19):

Changes:
– Added support for CDI (the Java native Context and Dependency Injection) to retrieve engine or session. Available only for JDK6+.
– Improved internal property acess framework. Memory impact is drastically improved.
– Improved internal cache of input data for better performances.
– Improved equals and hashcode on Arrays.
– Added check for SIZE, NULLIFEMPTY and EMPY addons: if source type is not handled a warning is raised. For example the size of a String or of an Array is handled, but there’s no point in retrieving the size of an Integer.
– Removed Exception for CLEAR Addon if type is not handled, replaced by a warning. It’s possible to clear a List for example, but not a String.

Fixes:
– Corrected bug on comparison utility methods.

1.2.0 (2016-04-28):

Changes:
– Added direct access to fields and methods in property access framework.
– Added new global variable: #NULL, to get the null value.
– Added log information.
– Improved config syntax ; Simplified demo accordingly.
– Simplified ITERATE Accessor.
– Optimized properties reading for STANDARD compilation.
– Renamed MAccessorWrappercondition into MAccessorWrapperCondition.
– Improved types guessing for parameterized types.
– Added demo for bench against Drools.
– Added AVAILABLE Accessor, to check if a property is available, at runtime.
– All “Property2” framework is now available.
– Adding more explicit “FATAL” trace for licence problem.
– Internal optimizations.

Fixes:
– Logger name was sometimes wrong at compilation process.
– Error at loading for framework jar.
– Bug on COLINCLUDED / COLINCLUDED when a collection is null or empty : results were inverted.

1.1.0 (2016-04-03):

Changes:
– Added new Map Accessors: MAPVALUES: to get values as a Collection.
– Added new Map Accessors: MAPKEYS: to get keys as a Collection.
– Added new Map Accessors: MAPENTRIES: to get entries as a Collection.
– Added new evaluation operator: EMPTY: to test if object has content (Collection, Map, String, etc).
– Added new action: CLEAR: to clear object’s content (Collection, Map, etc).
– Property access: Allowed Map access with Integer key.
– Constants: Improved guessing of constant values types.
– Configuration: Improved configuration syntax for most used Addons.
– Added new demo.

Fixes:
– Constant values are casted inacurately in some rare cases.
– Set is sometimes transformed into List for IN / NOTIN operators when values must be casted to another type, which degrades performances.
– Comparing values might give unexepected result if one is null.
– Error is malformed if Licence file is not found.
– Corrected defect on generation of toString.