Hi all,
we are working on a new FRuleEngineI implementation I would like to run all
the jena-core tests on our implementation.
To do this, i have added a dependency in the jena-core test module :
<dependency>
<groupId>org.apache.jena</groupId>
<artifactId>jena-core</artifactId>
<version>2.11.2-SNAPSHOT</version>
<type>test-jar</type>
<scope>test</scope>
</dependency>
and i have configured the following test suite in my project. This test suite
register our engine implementation and add the
com.hp.hpl.jena.reasoner.test.TestPackage test suite.
import junit.framework.TestSuite;
import com.hp.hpl.jena.reasoner.rulesys.impl.FRuleEngineIFactory;
public class EngineTestPackage extends TestSuite {
public static TestSuite suite() {
// use my engine implementation JENA-679
FRuleEngineIFactory.setInstance(new MyEngineFactory());
return new EngineTestPackage();
}
private EngineTestPackage() {
super("myEngine");
addTest("reasoners", com.hp.hpl.jena.reasoner.test.TestPackage.suite());
}
private void addTest(String name, TestSuite tc) {
tc.setName(name);
addTest(tc);
}
}
Then run the tests using maven
$ mvn test
The principle works but a lot of tests are failing because of the following
exception :
com.hp.hpl.jena.shared.NotFoundException: Not found:
file:testing/reasoners/owl/tbox.owl
at
com.hp.hpl.jena.util.FileManager.readModelWorker(FileManager.java:423)
at
com.hp.hpl.jena.util.FileManager.loadModelWorker(FileManager.java:333)
at com.hp.hpl.jena.util.FileManager.loadModel(FileManager.java:285)
at
com.hp.hpl.jena.reasoner.rulesys.test.OWLConsistencyTest.testResults(OWLConsistencyTest.java:119)
at
com.hp.hpl.jena.reasoner.rulesys.test.OWLConsistencyTest.runTest(OWLConsistencyTest.java:137)
The problem is that the tests resources are in a testing folder in the
jena-core module. So these resources are not included by maven in the test jar.
Is it possible to follow the maven convention and put all the jena-core test
resources in the src/test/resources folder ?
Regards
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 18 avr. 2014 à 16:57, Sébastien Boulet <[email protected]> a écrit :
> 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
>>>
>>>
>>
>