It is ok. Thanks Dave
: : . . . . . . . . . . . . . . . . . . . . . . . . . . : : Sébastien Boulet Lead développeur intactile DESIGN : : Création d’interfaces subtiles : : +33 (0)4 67 52 88 61 +33 (0)6 89 34 24 12 20 rue du Carré du Roi 34 000 Montpellier, France www.intactile.com Le 18 avr. 2014 à 16:17, Dave Reynolds <[email protected]> a écrit : > > Thanks, I've committed the changes from the patch. > > If you can confirm that they look OK to you and then close the jira. > > Dave > > On 18/04/14 14:15, Sébastien Boulet wrote: >> Ok, >> >> i have just proposed a patch with these modifications. >> >> https://issues.apache.org/jira/browse/JENA-679 >> >> Seb >> >> >> : : . . . . . . . . . . . . . . . . . . . . . . . . . . : : >> Sébastien Boulet >> Lead développeur >> >> intactile DESIGN >> : : Création d’interfaces subtiles : : >> +33 (0)4 67 52 88 61 >> +33 (0)6 89 34 24 12 >> 20 rue du Carré du Roi >> 34 000 Montpellier, France >> www.intactile.com >> >> Le 15 avr. 2014 à 19:07, Dave Reynolds <[email protected]> a écrit : >> >>> >>> On 15/04/14 14:55, Sébastien Boulet wrote: >>>> Hi all, >>>> >>>> i would like to use an alternative implementation of the FRuleEngineI. My >>>> problem is that the FRuleEngineI is instantiated directly from two >>>> locations : >>>> in com.hp.hpl.jena.reasoner.rulesys.FBRuleInfGraph >>>> @Override >>>> protected void instantiateRuleEngine(List<Rule> rules) { >>>> if (rules != null) { >>>> if (useRETE) { >>>> engine = new RETEEngine(this, rules); >>>> } else { >>>> engine = new FRuleEngine(this, rules); >>>> } >>>> } else { >>>> if (useRETE) { >>>> engine = new RETEEngine(this); >>>> } else { >>>> engine = new FRuleEngine(this); >>>> } >>>> } >>>> } >>>> and in com.hp.hpl.jena.reasoner.rulesys.RETERuleInfGraph >>>> >>>> @Override >>>> protected void instantiateRuleEngine(List<Rule> rules) { >>>> if (rules != null) { >>>> engine = new RETEEngine(this, rules); >>>> } else { >>>> engine = new RETEEngine(this); >>>> } >>>> } >>>> >>>> For now, if i want to use another FRuleEngineI, i have to sub class theses >>>> classes for instantiating my own FRuleEngineI implementation. And since >>>> theses classes (FBRuleInfGraph, RETERuleInfGraph) are instantiated >>>> directly by others ones (GenericRuleReasoner, FBRuleReasoner, >>>> OWLFBRuleReasoner…), i will have to sub class a lot of existing classes. >>>> >>>> So my question is, is there an easiest way to do this ? >>> >>> No. It's not be a usecase that's come up before. People have sometimes done >>> custom versions of FBRuleInfGraph or created new sorts of InfGraph but I'm >>> not aware of anyone previously replacing the forward engine across all >>> existing InfGraph types. >>> >>>> If not, i was thinking of introducing a singleton FRuleEngineIFactory (I >>>> kept the useRETE flag for backward compatibility.) : >>> >>> [Yeah the non-RETE engine and the useRETE flag ought to be removed sometime >>> but for now it's in there.] >>> >>>> public class FRuleEngineIFactory { >>>> private static FRuleEngineIFactory instance; >>> >>> [needs to be initialized :)] >>> >>>> public static void setInstance(FRuleEngineIFactory instance) { >>>> FRuleEngineIFactory.instance = instance; } >>>> public FRuleEngineIFactory getInstance() { return instance; } >>>> >>>> public FRuleEngineI createFRuleEngineI(ForwardRuleInfGraphI parent, >>>> List<Rule> rules, boolean useRETE) { >>>> FRuleEngineI engine; >>>> if (rules != null) { >>>> if (useRETE) { >>>> engine = new RETEEngine(parent, rules); >>>> } else { >>>> engine = new FRuleEngine(parent, rules); >>>> } >>>> } else { >>>> if (useRETE) { >>>> engine = new RETEEngine(parent); >>>> } else { >>>> engine = new FRuleEngine(parent); >>>> } >>>> } >>>> return engine; >>>> } >>>> } >>>> >>>> This factory might be used by >>>> >>>> com.hp.hpl.jena.reasoner.rulesys.FBRuleInfGraph >>>> @Override >>>> protected void instantiateRuleEngine(List<Rule> rules) { >>>> engine = >>>> FRuleEngineIFactory.getInstance().createFRuleEngineI(this, rules, useRETE); >>>> } >>>> >>>> and by com.hp.hpl.jena.reasoner.rulesys.RETERuleInfGraph >>>> @Override >>>> protected void instantiateRuleEngine(List<Rule> rules) { >>>> engine = >>>> FRuleEngineIFactory.getInstance().createFRuleEngineI(this, rules, true); >>>> } >>>> >>>> And i could replace the factory instance by my own instance : >>>> >>>> FRuleEngineIFactory.setInstance(new CustomFRuleEngineIFactory()); >>>> >>>> >>>> What do you think of that ? >>> >>> Sure. That would enable the sort of plug point you are after without >>> causing knock on problems. >>> >>> Dave >> >> >
