# Drools

Drools (o JBoss Rules) es un sistema de gestión de reglas de negocio (BRMS, por las siglas en inglés de Business Rule Management System) que utiliza un motor de reglas basado en inferencia de encadenamiento progresivo (forward chaining) y de encadenamiento regresivo (backward chaining), más conocido como sistema de reglas de producción, y que utiliza una implementación avanzada del algoritmo Rete.
Es software libre distribuido según los términos de la licencia Apache.
Drools se apoya en el estándar JSR-94 para su motor de reglas de negocio y framework de empresa para construcción, mantenimiento, y el refuerzo de políticas de empresa en una organización, aplicación o servicio.
Drools usa JCR (JackRabbit) para gestionar el repositorio de reglas, y el estándar JAAS para la autorización y autenticación.

## Historia

En el año 2001 Bob McWhirter inició y registró The Drools Project en SourceForge. Drools 1.0 no se liberó debido a que era vulnerable a un ataque de fuerza bruta, así que se apostó por Drools 2.0, que estaba basado en el algoritmo Rete, y el proyecto fue movido a Codehaus. Durante el desarrollo de la versión 2.0 en Codehaus, Nobi Y se convirtió en líder del proyecto y se llegó a una versión final 2.0. En este punto, el proyecto se había convertido en el motor de reglas Java de código abierto que contaba con una comunidad de usuarios más fuerte y había comenzado la demanda de servicios comerciales. En octubre de 2005 Drools fue federado en JBoss como parte de su oferta JEMS y renombrado JBoss Rules. Con el apoyo financiero de Red Hat tras la adquisición de JBoss en el año 2006, fue posible reescribir JBoss Rules con una implementación Rete mejorada con herramientas provistas de GUI. A mediados de 2007 hubo una disputa por el nombre Drools, pero a pesar de ello se le seguía conociendo como Drools, y había que referirse a él como "Drools aka JBoss Rules", o "Drools (JBoss Rules)", lo que resultaba confuso.

## JBoss Enterprise BRMS

JBoss Enterprise BRMS es un sistema de gestión de reglas de negocio y un motor de razonamiento para la creación, acceso, y gestión de cambio de políticas y reglas de negocio. JBoss Enterprise BRMS es una versión de producción de Drools con disponibilidad de soporte de tipo empresarial. JBoss Rules también es una versión de producción Drools, pero JBoss Enterprise BRMS es el producto estrella.
Componentes de la versión empresarial:
* JBoss Enterprise Web Platform – la infraestructura software, soportada para hacer funcionar únicamente los componentes BRMS
* JBoss Enterprise Application Platform, o bien, JBoss Enterprise SOA Platform – la infraestructura software, soportada pra hacer funcionar únicamente los componentes BRMS
* Business Rules Engine – Drools Expert utilizando el algoritmo Rete y el Drools Rule Language (DRL)
* Business Rules Manager – Drools Guvnor - Guvnor es un repositorio centralizado para Drools Knowledge Bases, que incluye interfaz de usuario web interactivas, editores, y herramientas para ayudar en la gestión de un gran número de reglas.
* Business Rules Repository – Drools Guvnor
Drools y Guvnor son proyectos open source de la JBoss Community. Forman parte de los productos para empresa JBoss Enterprise BRMS, gracias a que han alcanzado un grado de madurez adecuado.
Componentes de la versión JBoss Community:
* Drools Guvnor (Business Rules Manager) – un repositorio centralizado para Drools Knowledge Bases
* Drools Expert (rule engine) – utiliza las reglas para llevar a cabo el razonamiento
* Drools Flow (process/workflow), o bien, jBPM 5 – proporciona flujo y procesos de negocio
* Drools Fusion (event processing/temporal reasoning) – proporciona el procesamiento de eventos complejos
* Drools Planner/OptaPlanner (automated planning) – optimiza la planificación automática, incluyendo problemas de planificación de clase de complejidad NP-hard

## Ejemplo

El siguiente ejemplo muestra una sencilla regla que muestra en la salida estándar la información acerca de unas vacaciones en julio. Comprueba una condición de una instancia de la clase Holiday, y ejecuta código Java si la condición es cierta.
El propósito del dialecto "mvel" es apuntar a los métodos Getter and Setters de las variables de las variables de las clases Plain Old Java Object (POJO). En el ejemplo anterior encontramos la variable "month" de la clase Holiday, incluida entre paréntesis. Gracias al dialecto "mvel" se pueden utilizar los getter y setter de la variable "month".
El dialecto "java" se utiliza para ayudarnos a describir el código Java como reglas, pero con una restricción: no podemos utilizar código Java dentro de la parte "when" de la regla, aunque sí podemos hacerlo en la parte "then".
También podemos declarar una variable de referencia $h1 que no incluya el símbolo $, aunque se suele hacer para distinguir las variables POJO de las variables de las reglas.

## Sistemas relacionados

* CLIPS: herramienta de software de dominio público para construir sistemas expertos.
* d3web: plataforma libre, open-source para sistemas basados en conocimiento (sistemas expertos).
* JESS: un motor de reglas para la plataforma Java - es un superconjunto del lenguaje de programación CLIPS.
* Prolog: un idioma de programación lógica de propósito general.
* OpenL Tablets: reglas centradas en negocios y BRMS.