Hi,

I am having a little bit of trouble implementing the TDB store for my Jena
Ontologies. I have been able to solve most of the issues that I've come
across, but I have become frustrated with the view request functions that
the Ontology objects define.

I am trying to get a list of all of the restrictions that define a certain
OntClass, but while I am looping through all of the superclasses for the
class I receive a ConcurrentModificationException when calling the
is[Restriction, DatatypeProperty, and SomeValuesFromRestriction] calls.

Apparently it is happening when finding the triple on the graph that would
define it as the certain view type. The exception is thrown on the
iterator.hasNext in GraphBase.containsByFind().

The application I am running is only single threaded (I think, it is in a
JUnit Test Case) so I don't think any other modifications should actually
be happening to the Dataset while I am checking against the View Type.

I've included the important code below and highlighted the area where the
exception is thrown.

Thanks for any help you can offer,
Devlin

List<OntClass> supers = jenaClass.listSuperClasses().toList();

for(int index = 0; index < supers.size(); index++){
OntClass cls = supers.get(index);
 if(cls.isRestriction()){
Restriction r = cls.asRestriction();
 String valueId = "";
 OntProperty prop = r.getOnProperty();
 Resource restrictionValue;

if(r.isAllValuesFromRestriction()){
 restrictionValue = r.asAllValuesFromRestriction().getAllValuesFrom();
}else if(r.isSomeValuesFromRestriction()){
 restrictionValue = r.asSomeValuesFromRestriction().getSomeValuesFrom();
}else{
// TODO: Implement Cardinality Restrictions
 throw new RuntimeException("Unexpected Restriction Type");
}
  if(prop.isDatatypeProperty()){
// TODO: More DataTypes
 if(restrictionValue.equals(XSD.xint) ||
restrictionValue.equals(XSD.integer)){
valueId = "xsd:integer";
 }else if(restrictionValue.equals(XSD.xstring)){
valueId = "xsd:string";
}else if(restrictionValue.equals(XSD.xdouble)){
 valueId = "xsd:double";
}else if(restrictionValue.equals(XSD.dateTime)){
valueId = "xsd:dateTime";
 }else{
throw new RuntimeException("Unrecognized DataType:
"+restrictionValue.toString());
 }
}else{
valueId = getIdentifier(restrictionValue.getURI());
 }
 try{
if(r.isAllValuesFromRestriction()){
 JSONArray restriction = rest.optJSONArray(getIdentifier(prop.getURI()));
if(restriction == null || !restriction.toString().contains(valueId)){
 rest.append(getIdentifier(prop.getURI()), valueId);
}
}else if(r.isSomeValuesFromRestriction()){
 JSONArray requirement = req.optJSONArray(getIdentifier(prop.getURI()));
// TODO: HACK (For some reason during update I am getting duplicate of the
some value restrictions)
 if(requirement == null || !requirement.toString().contains(valueId)){
req.append(getIdentifier(prop.getURI()), valueId);
 }
}else{
// TODO: Implement Cardinality Restrictions
 throw new RuntimeException("Unexpected Restriction Type");
}
}catch(JSONException e){
 throw new RuntimeException("Error Creating JSON Object for Property " +
prop);
}
}
}

Reply via email to