Iniciando com o Drools Rules
Autor: Aleciano Jr. | Publicado: 2013-09-22T22:48:00-03:00


Recentemente tive que utilizar o Drools Rules para o realizar uma dada tarefa no meu TCC. Tive alguma dificuldade no que se refere a instalação da ferramenta e a compreensão da mesma.




Este post tem como objetivo ajudá-los na instalação e execução do exemplo mais simples que possa existir no Drools Rules.





Antes de tudo, se quer ler algo oficial sobre o Drools, vá aqui. Se quer ver a documentação, vá aqui.




Instalando e testando o Drools (Ubuntu/Linux)






Drools provém uma IDE baseado no Eclipse, que é opcional. Neste caso vamos instalar o plugin para utilizar em uma versão “normal” do Eclipse no sistema.





Instalar o GEF (Eclipse Graphical Editing Framework) que é utilizado para visualização de grafos no plugin.&nbsp;

Abrir Eclipse e ir em Help-&gt;Software updates...-&gt;Available Software-&gt;Add Site... e colocar o link http://download.eclipse.org/tools/gef/updates/releases/ e colocar GEF como nome requerido. Depois dê OK.&nbsp;
Marcar SOMENTE Graphical Editing Framework GEF para instalar, pressione Next e Aceite o acordo quando perguntado.&nbsp;
Reiniciar Eclipse quando solicitado.&nbsp;




Instalar o plugin do Drools no Eclipse.

Baixar Drools and jBPM tools em http://www.jboss.org/drools/downloads.html&nbsp;
Deszipar dentro do diretório principal do eclipse e deixar com permissões 775 via chmod.&nbsp;
Abrir o ReadMe dentro do zip e seguir as instruções, que devem ser mais ou menos estas:

Instalando o plugin no Eclipse 
- Abrir Eclipse.
- Abrir o menu "Help", item do menu "Install new software..."
- Clicar no the botão "Add..." to add a new software site.
- Coloque no nome "drools local update site"
- Clique no the botão "Local..." e selecione ".../binaries/org.drools.updatesite" ← referente ao diretório deszipado.
Select todos os plugins. Clique “Next” e “Finish”.




Instalar e Definir o Drools Runtime

Abrir Windows-&gt;Preferences-&gt;Digite “Drools” na pesquisa-&gt;Clicar em Instaled Drools Runtime
Há dois tipos de Runtime, o que vem no plugin e o que você pode baixar em um .zip separado. Vamos utilizar o que vem no .zip pois foi o que deu certo nos testes.&nbsp;
(Baixar o .zip em:&nbsp;http://download.jboss.org/drools/release/5.5.0.Final/drools-distribution-5.5.0.Final.zip)
Clicar em Add e coloque um nome (“Drools5.5.0Final-bin”), clique em browse e aponte para a pasta “binaries” do zip que foi descompactado.&nbsp;




Rodando um exemplo que vem junto do .zip

Importar no Eclipse: selecione como Projeto já existente e coloque “examples/sources/” como diretório raiz. Clique para copiar o projeto para o Workspace e clique em Finish.&nbsp;
Abrir o menu Run, ir em Run Configurations, e adicione uma nova aplicação Java. Este “run” terá como classe principal “org.drools.examples.DroolsExamplesApp". Adicione argumentos para a VM: “-Xms256m -Xmx512m -server” e clique em Feche sem rodar AINDA.&nbsp;
Abrir as propriedades do projeto e dirija-se ao Java Build Path. Exclua os dois “sources” inexistentes que se referem a alguma pasta “test”.&nbsp;
Vá na aba Drools e veja se o runtime está definido corretamente. A opção correta aponta para a pasta “binaries” que veio do .zip baixado.&nbsp;
Após estes passos os exemplos podem ser executados. Tente executar o Sudoku, carregar samples nos menus da janela do jogo e interagir com a janela.&nbsp;




Criando um primeiro projeto simples



Códigos disponíveis em: https://github.com/Aleciano/starting-with-drools-rules

Antes de tudo, abra a perspectiva 'Drools'. Pode ser feito em Windows&gt;Open Perspective&gt;Drools .&nbsp;
New &gt; Other &gt; Drools Project e coloque um nome para o seu projeto.&nbsp;
Se perguntado para criar arquivos de exemplo, regras e etc, não aceite desmarcando as caixas.&nbsp;
Ative a caixa 'Use Default Drools Runtime', geralmente já está ativado. Clique em Finish




Agora vamos criar uma classe simples em Java, chamaremos de RuleRunner. Na hora da criação crie um pacote para ela, algo como br.edu.ifpb.aleciano.drools, clicar em Finish.

Insira o seguinte código na classe:&nbsp;





package br.edu.ifpb.aleciano.drools;




import java.io.File;

import java.io.InputStreamReader;




import org.drools.KnowledgeBase;

import org.drools.KnowledgeBaseFactory;

import org.drools.builder.KnowledgeBuilder;

import org.drools.builder.KnowledgeBuilderError;

import org.drools.builder.KnowledgeBuilderErrors;

import org.drools.builder.KnowledgeBuilderFactory;

import org.drools.builder.ResourceType;

import org.drools.io.ResourceFactory;

import org.drools.logger.KnowledgeRuntimeLogger;

import org.drools.logger.KnowledgeRuntimeLoggerFactory;

import org.drools.runtime.StatefulKnowledgeSession;




public class RuleRunner {

 

 public static void main(String[] args) throws Exception {

  try {

   KnowledgeBase kbase = readKnowledgeBase();

   StatefulKnowledgeSession ksession = kbase

     .newStatefulKnowledgeSession();

   KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory

     .newFileLogger(ksession, "test");




   ksession.fireAllRules();

   logger.close();




  } catch (Throwable t) {

   t.printStackTrace();

  }

 }




 private static KnowledgeBase readKnowledgeBase() throws Exception {

  KnowledgeBuilder kbuilder = KnowledgeBuilderFactory

    .newKnowledgeBuilder();

  kbuilder.add(ResourceFactory.newClassPathResource("rule01.drl"),

    ResourceType.DRL);

  KnowledgeBuilderErrors errors = kbuilder.getErrors();

  if (errors.size() &gt; 0) {

   for (KnowledgeBuilderError error : errors) {

    System.err.println(error);

   }

   throw new IllegalArgumentException("Could not parse knowledge.");

  }

  KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();

  kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());

  return kbase;

 }

}




Agora vamos criar uma regra simples para rodar o exemplo.

New &gt; Other &gt; Rule Resource e clique em Next.&nbsp;
Dê o nome rule01 para a regra. (o nome do arquivo deve ser rule01.drl)&nbsp;
Na lista do tipo de regra selecione como New Rule (individual rule) - nova regra individual.&nbsp;
Escolha um pacote para regra, use a mesma conveção da classe RuleRunner criada, coloque algo como br.edu.ifpb.aleciano.drools.rules. Clique em Finish.&nbsp;


Use o seguinte código para a regra:



package br.edu.ifpb.aleciano.drools.rules




rule "Rule 01"

when

eval (1==1)

then

System.out.println("Rule 01 works.");        

end



A partir daqui já é possível rodar o exemplo. Se estiver na perspectiva 'Drools', clique na bolinha verde com seta branca na barra de ferramentas para executar o arquivo. Se perguntado qual a 'main class', sete a classe RuleRunner.java. A execução não é diferente de escrever um código Java normal e dar Play.





Podem aparecer mensagens de 'erro' iniciadas por SLF4J indicando a falta de alguma classe padrão, mas o próprio Drools tem um ação para esta situação, o projeto irá executar sem problemas.

O console ficará da seguinte forma:



SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".

SLF4J: Defaulting to no-operation (NOP) logger implementation

SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for    further details.

Rule 01 works.




Estudando as regras de sintaxe do Drools é possível escrever regras mais complexas, criar relações entre várias e outras funcionalidades providas pelo Drools Rules.



Tendo dúvidas, escreva para aleciano@ieee.org ou comente neste post. Obrigado!



Exemplos adaptados extraídos de: http://droolsrules.blogspot.com.br/2007/10/banking-on-drools-part-1.html