Drools - syntaxe des regles
Bonjour, je travaille depuis plusieurs semaines sur un problème de régles Drools et je n'arrive pas à m'en sortir. Le but final est d'automatiser le traitement de certaines pensions.
Si quelqu'un pouvait me donner une piste , ce serait parfait.
J'utilise java jdk 1.6.0_13, eclipse galileo, avec les plugins gef et drools.
Dans une version très expurgée, j'ai une classe principale Go.java,
2 classes ( FaitTest et FaitsProposition ), un fichier de regles identification.drl
et une sortie console. Les voici:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| //=========== Go.java ========================
package sre.main;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.KnowledgeBuilder;
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;
import org.drools.runtime.StatelessKnowledgeSession;
import sre.faits.FaitTest;
import sre.faits.FaitsProposition;
public class Go {
public static void main(String[] args) throws Exception {
// Début du programme
System.out.println("Debut");
Reader reglesidentif = new InputStreamReader( Go.class.getResourceAsStream( "identification.drl" ) );
// Instancier plusieurs packages à partir des règles fournies
KnowledgeBuilder kPersonne = KnowledgeBuilderFactory.newKnowledgeBuilder();
kPersonne.add( ResourceFactory.newReaderResource( reglesidentif ), ResourceType.DRL );
//Créer la base de règles et ajouter les packages (deployer le paquet de regles).
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages( kPersonne.getKnowledgePackages() );
// Creation d'une session "stateless
StatelessKnowledgeSession ksession = kbase.newStatelessKnowledgeSession();
Collection laliste = new ArrayList();
FaitTest f1 = new FaitTest();
f1.setCle("cle1");
f1.setValeur("valeur2");
FaitTest f2 = new FaitTest();
f2.setCle("cle2");
f2.setValeur("");
// Une proposition complète
FaitsProposition p1 = new FaitsProposition( "DESAVION","VroomVroom",
"Yvan","rue du chat ui pleure",
"", "", "","44123",
"Ville","23454323",
"98788","00001");
// Une proposition sans nom patronymique. La regle 1 doit être déclenchée
FaitsProposition p2 = new FaitsProposition( "","SONTRACTEUR",
"Ygor","rue du devers",
"", "", "","44123",
"Ville","23454323",
"98788","00001");
laliste.add(f1);
laliste.add(f2);
laliste.add(p1);
laliste.add(p2);
System.out.println("Contenu de l'arraylist laliste");
System.out.println(((ArrayList) laliste).toString());
System.out.println("execution");
ksession.execute(laliste);
System.out.println("Fin");
}
} |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| //=========== FaitTest ==================
package sre.faits;
public class FaitTest {
String cle;
String valeur;
public FaitTest(){
this.cle = "";
this.valeur = "";
}
public FaitTest(String _cle, String _valeur){
this.cle=_cle;
this.valeur=_valeur;
}
public void setCle(String _cle){
this.cle=_cle;
}
public void setValeur(String _valeur){
this.valeur=_valeur;
}
public String getCle(){
return this.cle;
}
public String getValeur(){
return this.valeur;
}
//public String toString(){
// return "fait [ " + this.cle + ", " + this.valeur + "]";
// }
} |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
| //========= FaitsProposition ===================
package sre.faits;
public class FaitsProposition {
// Attributs
/* Tous les attributs issus des propositions
* seront préfixés par la lettre p.
*
* Chaque champ du DEDP sera considéré et le
* fait qu'il soit servi ou pas sera un fait. *
*/
String pnompatro;
String pnomusage;
String pprenom;
String padresse1;
String padresse2;
String padresse3;
String padresse4;
String pcp;
String pville;
String pnumbordereau;
String pnumproposition;
String pnumdossier;
public FaitsProposition(){
}
public FaitsProposition(
String _pnompatro,
String _pnomusage,
String _pprenom,
String _padresse1,
String _padresse2,
String _padresse3,
String _padresse4,
String _pcp,
String _pville,
String _pnumbordereau,
String _pnumproposition,
String _pnumdossier
){
this.pnompatro=_pnompatro;
this.pnomusage=_pnomusage;
this.pprenom=_pprenom;
this.padresse1=_padresse1;
this.padresse2=_padresse2;
this.padresse3=_padresse3;
this.padresse4=_padresse4;
this.pcp=_pcp;
this.pville=_pville;
this.pnumbordereau=_pnumbordereau;
this.pnumproposition=_pnumproposition;
this.pnumdossier=_pnumdossier;
}
public String getPNompatro(){
return this.pnompatro;
}
public String getPNomusage(){
return this.pnomusage;
}
public String getPPrenom(){
return this.pprenom;
}
public String getPAdresse1(){
return this.padresse1;
}
public String getPAdresse2(){
return this.padresse2;
}
public String getPAdresse3(){
return this.padresse3;
}
public String getPAdresse4(){
return this.padresse4;
}
public String getPCP(){
return this.pcp;
}
public String getVille(){
return this.pville;
}
public String getNumBordereau(){
return this.pnumbordereau;
}
public String getNumProposition(){
return this.pnumproposition;
}
public String getNumDossier(){
return this.pnumdossier;
}
public void setPNomPatro(String _pnompatro){
this.pnompatro= _pnompatro;
}
public void setPNomUsage(String _pnomusage){
this.pnomusage= _pnomusage;
}
public void setPPrenom(String _pprenom){
this.pprenom= _pprenom;
}
public void setAdresse1(String _padresse1){
this.padresse1= _padresse1;
}
public void setAdresse2(String _padresse2){
this.padresse1= _padresse2;
}
public void setAdresse3(String _padresse3){
this.padresse2= _padresse3;
}
public void setAdresse4(String _padresse4){
this.padresse4= _padresse4;
}
public void setPCP(String _pcp){
this.pcp= _pcp;
}
public void setPVille(String _pville){
this.pville= _pville;
}
public void setPNumBordereau(String _pnumbordereau){
this.pnumbordereau= _pnumbordereau;
}
public void setPNumDossier(String _pnumdossier){
this.pnumdossier= _pnumdossier;
}
public void setPNumProposition(String _pnumproposition){
this.pnumproposition= _pnumproposition;
}
} |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| //========= identification.drl ==================
#created on: 21 sept. 2009
package pensions
import sre.faits.FaitTest;
import sre.faits.FaitsProposition;
rule "regle un"
dialect "mvel"
when
FaitsProposition ( PNompatro == "" || PNompatro == null )
then
System.out.println("application regle un");
end
rule "regle trois"
dialect "mvel"
when
FaitTest()
then
System.out.println("application regle 3");
end |
Citation:
============= Sortie console ======================
Debut
Contenu de l'arraylist laliste
[sre.faits.FaitTest@9ffe3f, sre.faits.FaitTest@1ed1b0b, sre.faits.FaitsProposition@18a8ce2, sre.faits.FaitsProposition@12789d2]
execution
application regle un
application regle 3
application regle 3
Fin
============================================
Donc jusque là tout est normal
mais lorsque je veux faire un peu plus de controle en changeant
la regle 3 plus rien ne fonctionne.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| ========== Le fichier de regles, modifié =============
#created on: 21 sept. 2009
package pensions
import sre.faits.FaitTest;
import sre.faits.FaitsProposition;
rule "regle un"
dialect "mvel"
when
FaitsProposition ( PNompatro == "" || PNompatro == null )
then
System.out.println("application regle un");
end
rule "regle trois"
dialect "mvel"
when
FaitTest( Valeur == "Valeur")
then
System.out.println("application regle 3");
end |
Citation:
=========== Sortie console dans ce cas =======
Debut
Contenu de l'arraylist laliste
[sre.faits.FaitTest@15718f2, sre.faits.FaitTest@126f827, sre.faits.FaitsProposition@16dfa45, sre.faits.FaitsProposition@149eb9f]
execution
Fin
En fait, d'une part je ne vois pas l'erreur dans ma declaration,
Je suis persuadé de respecter les directives du manuel drools, alors je ne comprends pas
d'autre part j'aurai pu comprendre que la regle 3 ne fonctionne pas s'il y a une erreur ( mais laquelle ?) mais même la règle 1 ne fonctionne pas
Je suis preneur de toute piste
Merci à tous
Mrtldvd