Hi all,
I'm facing a really strange problem when concurrently using a model. I have
created a REST webservice which is running some tasks on a model sent through a
POST.
In this code, I have created an OntModel and add a resource description to it.
I loop over all the statements to check and modify some values. For some of
that I'm using Individual.isClass() validation.
The OntModel is based on my own spec and I create it like (just a summary):
private MyOntModelSpec() {
super(OntModelSpec.OWL_MEM_MICRO_RULE_INF);
String locatorPath =
Thread.currentThread().getContextClassLoader()
.getResource("").getPath();
// Locate the ont-policy.rdf file and the ontologies to be used
FileManager fm = FileManager.get().clone();
// TODO: There is a bug to be reported that LocatorFiles are not
// considered when added
fm.addLocatorFile(locatorPath);
OntDocumentManager docMngr =
new OntDocumentManager(fm, "etc/my-ont-policy.rdf");
// Parsing data inside the ont-policy.rdf file
StreamManager sm = StreamManager.makeDefaultStreamManager();
sm.addLocator(new LocatorFile(locatorPath));
StreamManager.setGlobal(sm);
this.setDocumentManager(docMngr);
}
public static OntModelSpec getInstance() {
if (myOntModelSpec == null) {
myOntModelSpec = new myOntModelSpec();
}
return myOntModelSpec;
}
Then the OntModel is created as:
private MyOntModel() {
ontModelSpec = MyOntModelSpec.getInstance();
ontModel = ModelFactory.createOntologyModel(ontModelSpec);
ontModel.read("etc/my.owl", null);
}
public static OntModel getInstance() {
if (myModel == null) {
myModel = new myOntModel();
}
// Automatically load all the ontologies
// included in the etc/my.owl file
OntModel m = ModelFactory
.createOntologyModel(myModel.getOntModelSpec());
m.read("etc/my.owl", null);
return m;
}
And I use it like:
OntModel ontModel = MyOntModel.getInstance();
ontModel.add(inputFromRest);
// snip
Individual individual = ontModel.getIndividual("an object URI");
if (individual.isClass()) {
// Do whatever
}
Using it one call to the webservice in a sequential way, there is no problem.
However sometime when concurrently calling the webservice I'm getting a
"org.apache.jena.shared.ClosedException: already closed" when doing the
check/validation over the model.
Caused by: org.apache.jena.shared.ClosedException: already closed
at org.apache.jena.graph.impl.GraphBase.checkOpen(GraphBase.java:66)
at org.apache.jena.graph.impl.GraphBase.find(GraphBase.java:240)
at
org.apache.jena.graph.compose.MultiUnion.multiGraphFind(MultiUnion.java:170)
at
org.apache.jena.graph.compose.MultiUnion.graphBaseFind(MultiUnion.java:147)
at org.apache.jena.graph.impl.GraphBase.find(GraphBase.java:241)
at org.apache.jena.reasoner.FGraph.findWithContinuation(FGraph.java:69)
at org.apache.jena.reasoner.FinderUtil$Cascade.find(FinderUtil.java:97)
at org.apache.jena.reasoner.FGraph.findWithContinuation(FGraph.java:69)
at org.apache.jena.reasoner.FinderUtil$Cascade.find(FinderUtil.java:97)
at
org.apache.jena.reasoner.FinderUtil$Cascade.findWithContinuation(FinderUtil.java:114)
at org.apache.jena.reasoner.FinderUtil$Cascade.find(FinderUtil.java:97)
at
org.apache.jena.reasoner.FinderUtil$Cascade.findWithContinuation(FinderUtil.java:114)
at org.apache.jena.reasoner.FinderUtil$Cascade.find(FinderUtil.java:97)
at
org.apache.jena.reasoner.rulesys.FBRuleInfGraph.findDataMatches(FBRuleInfGraph.java:215)
at
org.apache.jena.reasoner.rulesys.impl.TopLevelTripleMatchFrame.<init>(TopLevelTripleMatchFrame.java:45)
at
org.apache.jena.reasoner.rulesys.impl.LPInterpreter.<init>(LPInterpreter.java:140)
at
org.apache.jena.reasoner.rulesys.impl.LPInterpreter.<init>(LPInterpreter.java:100)
at
org.apache.jena.reasoner.rulesys.impl.LPBRuleEngine.generatorFor(LPBRuleEngine.java:278)
at
org.apache.jena.reasoner.rulesys.impl.ConsumerChoicePointFrame.init(ConsumerChoicePointFrame.java:78)
at
org.apache.jena.reasoner.rulesys.impl.ConsumerChoicePointFrame.<init>(ConsumerChoicePointFrame.java:66)
at
org.apache.jena.reasoner.rulesys.impl.LPInterpreter.setupTabledCall(LPInterpreter.java:675)
at
org.apache.jena.reasoner.rulesys.impl.LPInterpreter.run(LPInterpreter.java:568)
at
org.apache.jena.reasoner.rulesys.impl.LPInterpreter.next(LPInterpreter.java:190)
at
org.apache.jena.reasoner.rulesys.impl.Generator.pump(Generator.java:252)
at
org.apache.jena.reasoner.rulesys.impl.Generator.pump(Generator.java:239)
at
org.apache.jena.reasoner.rulesys.impl.LPBRuleEngine.pump(LPBRuleEngine.java:311)
at
org.apache.jena.reasoner.rulesys.impl.LPTopGoalIterator.moveForward(LPTopGoalIterator.java:107)
at
org.apache.jena.reasoner.rulesys.impl.LPTopGoalIterator.hasNext(LPTopGoalIterator.java:223)
at
org.apache.jena.util.iterator.WrappedIterator.hasNext(WrappedIterator.java:90)
at
org.apache.jena.util.iterator.WrappedIterator.hasNext(WrappedIterator.java:90)
at
org.apache.jena.util.iterator.FilterIterator.hasNext(FilterIterator.java:55)
at
org.apache.jena.util.iterator.WrappedIterator.hasNext(WrappedIterator.java:90)
at
org.apache.jena.util.iterator.FilterIterator.hasNext(FilterIterator.java:55)
at
org.apache.jena.graph.impl.GraphBase.containsByFind(GraphBase.java:299)
at
org.apache.jena.graph.impl.GraphBase.graphBaseContains(GraphBase.java:277)
at org.apache.jena.graph.impl.GraphBase.contains(GraphBase.java:269)
at org.apache.jena.graph.impl.GraphBase.contains(GraphBase.java:286)
at
org.apache.jena.ontology.impl.OWLProfile$SupportsCheck.hasType(OWLProfile.java:336)
at
org.apache.jena.ontology.impl.OWLProfile$3.doCheck(OWLProfile.java:390)
at
org.apache.jena.ontology.impl.OWLProfile.isSupported(OWLProfile.java:257)
at
org.apache.jena.ontology.impl.OntClassImpl$1.canWrap(OntClassImpl.java:90)
at org.apache.jena.enhanced.EnhNode.canSupport(EnhNode.java:168)
at org.apache.jena.enhanced.EnhNode.canAs(EnhNode.java:113)
at
org.apache.jena.ontology.impl.OntResourceImpl.isClass(OntResourceImpl.java:1305)
at mypackage.validateInput(MyClass.java:55)
I don't know why it is happening. Could you give me some hint?
TA for any help.
Jorge