-
Notifications
You must be signed in to change notification settings - Fork 153
Open
Description
With the following test case and the serialized data model-ser.zip (you need to unzip and change the path to the file). When running test case we run into an infinite loop. I think something needs to be done to handle this problem because you never know what data is going to be loaded.
@Test
public void testJsonLdCycle() throws Exception {
final JsonLdOptions opts = new JsonLdOptions();
//opts.setUseRdfType(getWriterConfig().get(JSONLDSettings.USE_RDF_TYPE));
opts.setUseNativeTypes(true);
opts.setCompactArrays(true);
//opts.setOmitGraph(getWriterConfig().get(OMIT_GRAPH));
opts.setEmbed(Embed.ALWAYS);
String testFrame = "{\"@context\" : [ \"http://cambridgesemantics.com/ontologies/GraphmartStatus/LayerStatus\", \"http://cambridgesemantics.com/ontologies/GraphmartStatus/LayerChildStatus\", \"http://www.w3.org/2002/07/owl/Thing\", \"http://cambridgesemantics.com/ontologies/GraphmartStatus/GraphmartStatus\" ], \"@type\" : [ \"http://cambridgesemantics.com/ontologies/GraphmartStatus#GraphmartStatus\" ]}";
final SesameRDFParser serialiser = new SesameRDFParser();
try (ObjectInputStream in = new ObjectInputStream(new UserDirFileInputStream("/test/resources/coredata/model.ser"))) {
Model model = (LinkedHashModel) in.readObject();
Object output = JsonLdProcessor.fromRDF(model, opts, serialiser);
JsonLdProcessor.frame(output, JsonUtils.fromString(testFrame), opts);
}
}
public class SesameRDFParser implements com.github.jsonldjava.core.RDFParser {
public void setPrefix(RDFDataset result, String fullUri, String prefix) {
result.setNamespace(fullUri, prefix);
}
public void handleStatement(RDFDataset result, org.openrdf.model.Statement nextStatement) {
// TODO: from a basic look at the code it seems some of these could be
// null
// null values for IRIs will probably break things further down the line
// and i'm not sure yet if this should be something handled later on, or
// something that should be checked here
final String subject = getResourceValue(nextStatement.getSubject());
final String predicate = getResourceValue(nextStatement.getPredicate());
final Value object = nextStatement.getObject();
final String graphName = getResourceValue(nextStatement.getContext());
if (object instanceof Literal) {
final Literal literal = (Literal) object;
final String value = literal.getLabel();
final String language = literal.getLanguage();
String datatype = getResourceValue(literal.getDatatype());
// In RDF-1.1, Language Literals internally have the datatype
// rdf:langString
if (language != null && datatype == null) {
datatype = org.openrdf.model.vocabulary.RDF.LANGSTRING.stringValue();
}
// In RDF-1.1, RDF-1.0 Plain Literals are now Typed Literals with
// type xsd:String
if (language == null && datatype == null) {
datatype = XMLSchema.STRING.stringValue();
}
result.addQuad(subject, predicate, value, datatype, language, graphName);
} else {
result.addQuad(subject, predicate, getResourceValue((Resource) object), graphName);
}
}
private String getResourceValue(Resource subject) {
if (subject == null) {
return null;
} else if (subject instanceof URI) {
return subject.stringValue();
} else if (subject instanceof BNode) {
return "_:" + subject.stringValue();
}
throw new IllegalStateException("Did not recognise resource type: " + subject.getClass().getName());
}
@Override
public RDFDataset parse(Object input) throws JsonLdError {
final RDFDataset result = new RDFDataset();
if (input instanceof Statement) {
handleStatement(result, (Statement) input);
} else if (input instanceof Graph) {
if (input instanceof Model) {
final Set<Namespace> namespaces = ((Model) input).getNamespaces();
for (final Namespace nextNs : namespaces) {
result.setNamespace(nextNs.getName(), nextNs.getPrefix());
}
}
for (final org.openrdf.model.Statement nextStatement : (Graph) input) {
handleStatement(result, nextStatement);
}
}
return result;
}
}
Metadata
Metadata
Assignees
Labels
No labels