Baba usando regras de arquivos do Excel

Baba usando regras de arquivos do Excel

*1. Visão geral *

[.s1]#https://www.drools.org/[Drools] has support for managing business rules in a spreadsheet format. #

Neste artigo, veremos um exemplo rápido do uso de Drools para gerenciar regras de negócios usando um arquivo do Excel.

===* 2. Dependências do Maven *

Vamos adicionar as dependências necessárias de Drools em nosso aplicativo:

<dependency>
    <groupId>org.kie</groupId>
    <artifactId>kie-ci</artifactId>
    <version>7.1.0.Beta2</version>
</dependency>
<dependency>
    <groupId>org.drools</groupId>
    <artifactId>drools-decisiontables</artifactId>
    <version>7.1.0.Beta2</version>
</dependency>

A versão mais recente dessas dependências pode ser encontrada em https://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.kie%22%20AND%20a%3A%22kie-ci%22 [kie-ci] e drools-decisiontables

===* 3. Definindo regras no Excel *

Para o nosso exemplo, vamos definir regras para determinar o desconto com base no tipo de cliente e no número de anos como cliente:

  • Clientes individuais com mais de 3 anos recebem 15% de desconto

  • Clientes individuais com menos de 3 anos recebem 5% de desconto *Todos os clientes empresariais recebem 20% de desconto

====* 3.1 O arquivo do Excel *

Vamos começar criando nosso excel file conforme a estrutura específica e as palavras-chave exigido pelo Drools:

link:/wp-content/uploads/2017/06/Drools_Excel.png [imagem:/wp-content/uploads/2017/06/Drools_Excel-300x111.png [imagem, largura = 565, altura = 209]]

Para o nosso exemplo simples, usamos o conjunto de palavras-chave mais relevantes:

  • RuleSet - indica o início da tabela de decisão

  • Import - classes Java usadas nas regras

  • RuleTable - indica o início do conjunto de regras

  • Name - Nome da regra

  • CONDITION - o trecho de código da condição a ser verificada nos dados de entrada. Uma regra deve conter pelo menos uma condição *ACTION - o trecho de código da ação a ser tomada se as condições da regra forem atendidas. Uma regra deve conter pelo menos uma ação. No exemplo, estamos chamando setDiscount no objeto Customer

Além disso, usamos a classe Customer no arquivo do Excel. Então, vamos criar isso agora.

====* 3.2 A classe Customer *

Como pode ser visto nas CONDITIONs e ACTION na planilha do Excel, estamos usando um objeto da classe Customer para os dados de entrada (type e years) e para armazenar o resultado (discount).

A classe Customer:

public class Customer {
    private CustomerType type;

    private int years;

    private int discount;

   //Standard getters and setters

    public enum CustomerType {
        INDIVIDUAL,
        BUSINESS;
    }
}

===* 4. * Criando uma instância do mecanismo de regras de Drools

Antes de podermos executar as regras que definimos, precisamos trabalhar com uma instância do mecanismo de regras Drools. Para isso, temos que usar os principais componentes do Kie.

4.1 KieServices

The KieServices class provides access to all the Kie build and runtime facilities. It provides several factories, services, and utility methods. So, let’s first get hold of a KieServices instance:

KieServices kieServices = KieServices.Factory.get();

Usando o KieServices, vamos criar novas instâncias de KieFileSystem, KieBuilder e KieContainer.

4.2 KieFileSystem

KieFileSystem é um sistema de arquivos virtual. Vamos adicionar nossa planilha do Excel:

Resource dt
  = ResourceFactory
    .newClassPathResource("com//drools/rules/Discount.xls",
      getClass());

KieFileSystem kieFileSystem = kieServices.newKieFileSystem().write(dt);

4.3 KieBuilder

Agora, crie o conteúdo do KieFileSystem passando-o para KieBuilder:

KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem);
kieBuilder.buildAll();

Se construído com êxito, ele cria um KieModule (qualquer frasco produzido por Maven com um kmodule.xml nele, é um KieModule).

4.4 KieRepository

A estrutura adiciona automaticamente o KieModule (resultante da construção) ao KieRepository:

KieRepository kieRepository = kieServices.getRepository();

4.5 KieContainer

Agora é possível criar um novo KieContainer com esse KieModule usando seu ReleaseId. Nesse caso, Kie atribui um _ReleaseId padrão: _

ReleaseId krDefaultReleaseId = kieRepository.getDefaultReleaseId();
KieContainer kieContainer
  = kieServices.newKieContainer(krDefaultReleaseId);

4.6 KieSession

Agora podemos obter KieSession no KieContainer. Nosso aplicativo interage com o KieSession, que armazena e executa nos dados de tempo de execução:

KieSession kieSession = kieContainer.newKieSession();

*5. Executando as regras *

Finalmente, é hora de fornecer dados de entrada e acionar as regras:

Customer customer = new Customer(CustomerType.BUSINESS, 2);
kieSession.insert(customer);

kieSession.fireAllRules();

===* 6. Casos de teste *

Vamos agora adicionar alguns casos de teste:

public class DiscountExcelIntegrationTest {

    private KieSession kSession;

    @Before
    public void setup() {
        Resource dt
          = ResourceFactory
            .newClassPathResource("com//drools/rules/Discount.xls",
              getClass());
        kSession = new DroolsBeanFactory().getKieSession(dt);
    }

    @Test
    public void
      giveIndvidualLongStanding_whenFireRule_thenCorrectDiscount()
        throws Exception {
        Customer customer = new Customer(CustomerType.INDIVIDUAL, 5);
        kSession.insert(customer);

        kSession.fireAllRules();

        assertEquals(customer.getDiscount(), 15);
    }

    @Test
    public void
      giveIndvidualRecent_whenFireRule_thenCorrectDiscount()
      throws Exception {
        Customer customer = new Customer(CustomerType.INDIVIDUAL, 1);
        kSession.insert(customer);

        kSession.fireAllRules();

        assertEquals(customer.getDiscount(), 5);
    }

    @Test
    public void
      giveBusinessAny_whenFireRule_thenCorrectDiscount()
        throws Exception {
        Customer customer = new Customer(CustomerType.BUSINESS, 0);
        kSession.insert(customer);

        kSession.fireAllRules();

        assertEquals(customer.getDiscount(), 20);
    }
}

===* 7. Solução de problemas *

Drools converte a tabela de decisão no link:/drools [DRL]. Por esse motivo, pode ser difícil lidar com erros e erros de digitação no arquivo do Excel. Geralmente, os erros se referem ao conteúdo do DRL. Portanto, para solucionar problemas, é útil imprimir e analisar o DRL:

Resource dt
  = ResourceFactory
    .newClassPathResource("com//drools/rules/Discount.xls",
      getClass());

DecisionTableProviderImpl decisionTableProvider
  = new DecisionTableProviderImpl();

String drl = decisionTableProvider.loadFromResource(dt, null);

===* 8. Conclusão*

Neste artigo, vimos um exemplo rápido do uso de Drools para gerenciar regras de negócios em uma planilha do Excel. Vimos a estrutura e o conjunto mínimo de palavras-chave a serem usadas na definição de regras em um arquivo do Excel. Em seguida, usamos os componentes do Kie para ler e disparar as regras. Por fim, escrevemos casos de teste para verificar os resultados.

Como sempre, o exemplo usado neste artigo pode ser encontrado em o projeto Github.