2017-04-14 3 views
0

J'ai une liste de règles créées dynamiquement. Immédiatement après sa création, je vérifie s'il y a des erreurs. Mais je ne peux pas trouver un moyen de supprimer ces règles ayant des erreurs de manière dynamique.Comment faire pour supprimer les règles qui ont des erreurs

public void validateRule(List<String> rules, Collection<AbstractFact> facts) { 
     KieServices kieServices = KieServices.Factory.get(); 
     KieFileSystem kieFileSystem = kieServices.newKieFileSystem(); 

     int ruleIndex = 0; 
     for (String rule : rules) { 
      StringBuilder ruleName = new StringBuilder("src/main/resources/rule"); 
      ruleName.append(ruleIndex).append(".drl"); 
      kieFileSystem.write(ruleName.toString(), rule); 
      ruleIndex ++; 
     } 
     KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem).buildAll(); 

     if (kieBuilder.getResults().hasMessages(Message.Level.ERROR)) { 
      //Remove rules which are failing 

     } 

     KieContainer container = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId()); 

     KieSession ksession = container.newKieSession(); 

     for (AbstractFact fact : facts) { // Insert All the facts 
      ksession.insert(fact); 
     } 
     ksession.fireAllRules(); 
    } 

Drools fichier pour la validation

template header 

name 

package test; 


template "test template" 

rule "test rule" 

when 

    $fact : Fact(code !=) // expression is wrong intentionally 

then 
    $fact.setOk(false); 

end 

end template 

Répondre

0

Écrivez chaque règle à un fichier KieFileSystem try.drl et appelez Buildall. Gardez une trace des règles de classement.

Supprimer try.drl. Dans un deuxième passage, écrivez comme vous le faites maintenant, en ignorant les règles qui ont échoué lors du premier passage.

+0

buildAll() fonctionne toujours pour moi. Mais la règle échoue lorsque newKieContainer est créé. Par exemple, l'expression de la règle est incorrecte. (code! =) – UserAdi

+0

Votre commentaire est incompréhensible pour moi. Peut-être que vous ajoutez les messages d'erreur du constructeur à votre question, ou quoi d'autre vous obtenez comme une exception, et pile trace. – laune

0

Résolu les problèmes en compilant d'abord les packages, puis en utilisant les packages de construction pour charger le package de connaissances. De cette façon, le KieContainer n'échoue pas et ignore simplement les règles qui sont incorrectes.

public Collection<KiePackage> createAllPackages(List<String> rules) { 
     Collection<KiePackage> compiledPackages = new ArrayList<>(); 
     int ruleIndex = 0; 
     for (String rule : rules) { 
      StringBuilder ruleName = new StringBuilder("src/main/resources/rule"); 
      ruleName.append(ruleIndex).append(".drl"); 
      kieFileSystem.write(ruleName.toString(), rule); 
      KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem).buildAll(); 

      if (kieBuilder.getResults().hasMessages(Message.Level.ERROR)) { 
       List<Message> messages = kieBuilder.getResults().getMessages(Message.Level.ERROR); 
       continue; 
      } 
      kieFileSystem.generateAndWritePomXML(kieServices.getRepository().getDefaultReleaseId()); 
      KieContainer container = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId()); 

      KieBase kBase = container.getKieBase(); 
      compiledPackages.addAll(kBase.getKiePackages()); 
      ruleIndex ++; 
     } 
     return compiledPackages; 
    } 

    public void buildAllPackages(Collection<KiePackage> packages) { 
     KieModuleModel kieModuleModel = kieServices.newKieModuleModel(); 
     kieFileSystem.writeKModuleXML(kieModuleModel.toXML()); 
     kieFileSystem.generateAndWritePomXML(kieServices.getRepository().getDefaultReleaseId()); 

     KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem).buildAll(); 
     KieContainer kContainer = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId()); 
     KnowledgeBaseImpl kBase = (KnowledgeBaseImpl)kContainer.getKieBase(); 

     Collection<KnowledgePackage> allPacksTrans = Collections2.transform(packages, new Function<KiePackage, KnowledgePackage>() { 
      @Override 
      public KnowledgePackage apply(KiePackage kiePackage) { 
       return (KnowledgePackage) kiePackage; 
      } 
     }); 

     kBase.addKnowledgePackages(allPacksTrans); 
    }