Infinite loop while framing data · Issue #338 · jsonld-java/jsonld-java · GitHub
Skip to content

Infinite loop while framing data #338

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;
        }

    }

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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