Skip to content

Infinite loop while framing data #338

@garpinc

Description

@garpinc

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
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions