{"action":"created","comment":{"url":"https://api.github.com/repos/apache/incubator-commonsrdf/pulls/comments/81152333","pull_request_review_id":2152985,"id":81152333,"diff_hunk":"@@ -0,0 +1,874 @@\n+/**\n+ * Licensed to the Apache Software Foundation (ASF) under one\n+ * or more contributor license agreements.  See the NOTICE file\n+ * distributed with this work for additional information\n+ * regarding copyright ownership.  The ASF licenses this file\n+ * to you under the Apache License, Version 2.0 (the\n+ * \"License\"); you may not use this file except in compliance\n+ * with the License.  You may obtain a copy of the License at\n+ *\n+ *     http://www.apache.org/licenses/LICENSE-2.0\n+ *\n+ * Unless required by applicable law or agreed to in writing, software\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+ * See the License for the specific language governing permissions and\n+ * limitations under the License.\n+ */\n+\n+package org.apache.commons.rdf.jena;\n+\n+import java.util.Optional;\n+import java.util.UUID;\n+import java.util.function.Consumer;\n+\n+import org.apache.commons.rdf.api.BlankNode;\n+import org.apache.commons.rdf.api.BlankNodeOrIRI;\n+import org.apache.commons.rdf.api.Dataset;\n+import org.apache.commons.rdf.api.Graph;\n+import org.apache.commons.rdf.api.IRI;\n+import org.apache.commons.rdf.api.Literal;\n+import org.apache.commons.rdf.api.Quad;\n+import org.apache.commons.rdf.api.QuadLike;\n+import org.apache.commons.rdf.api.RDFSyntax;\n+import org.apache.commons.rdf.api.RDFTerm;\n+import org.apache.commons.rdf.api.RDFTermFactory;\n+import org.apache.commons.rdf.api.Triple;\n+import org.apache.commons.rdf.api.TripleLike;\n+import org.apache.commons.rdf.jena.impl.JenaFactory;\n+import org.apache.jena.datatypes.RDFDatatype;\n+import org.apache.jena.datatypes.xsd.XSDDatatype;\n+import org.apache.jena.graph.Node;\n+import org.apache.jena.graph.NodeFactory;\n+import org.apache.jena.riot.Lang;\n+import org.apache.jena.riot.RDFDataMgr;\n+import org.apache.jena.riot.RDFLanguages;\n+import org.apache.jena.riot.system.StreamRDF;\n+import org.apache.jena.riot.system.StreamRDFBase;\n+import org.apache.jena.sparql.core.DatasetGraph;\n+import org.apache.jena.sparql.graph.GraphFactory;\n+\n+/**\n+ * RDFTermFactory with Jena-backed objects.\n+ * <p>\n+ * This factory can also convert existing objects from/to Jena with methods like\n+ * {@link #fromJena(org.apache.jena.graph.Graph)} and {@link #toJena(Graph)}.\n+ * <p>\n+ * For the purpose of {@link BlankNode} identity, this factory will use an internal\n+ * {@link UUID} as a salt. See {@link BlankNode#uniqueReference()} for details.\n+ * \n+ * @see RDFTermFactory\n+ */\n+public final class JenaRDFTermFactory implements RDFTermFactory {\n+\n+\tprivate final UUID salt;\n+\n+\t/**\n+\t * Create a JenaRDFTermFactory.\n+\t * <p>\n+\t * This constructor will use a randomly generated {@link UUID} as a salt \n+\t * for the purposes of {@link BlankNode} identity, see {@link #getSalt()}.\n+\t */\n+\tpublic JenaRDFTermFactory() {\n+\t\tthis.salt = UUID.randomUUID();\n+\t}\n+\n+\t/**\n+\t * Create a JenaRDFTermFactory.\n+\t * <p>\n+\t * This constructor will use the specified {@link UUID} as a salt \n+\t * for the purposes of {@link BlankNode} identity.\n+\t * \n+\t * @param salt {@link UUID} to use as salt\n+\t */\t\n+\tpublic JenaRDFTermFactory(UUID salt) {\n+\t\tthis.salt = salt;\n+\t}\n+\n+\t@Override\n+\tpublic JenaBlankNode createBlankNode() {\n+\t\treturn JenaFactory.createBlankNode(getSalt());\n+\t}\n+\n+\t@Override\n+\tpublic JenaBlankNode createBlankNode(String name) {\n+\t\treturn JenaFactory.createBlankNode(name, getSalt());\n+\t}\n+\t\n+\t@Override\n+\tpublic JenaDataset createDataset() {\n+\t\treturn JenaFactory.createDataset(getSalt());\n+\t}\n+\n+\t@Override\n+\tpublic JenaGraph createGraph() {\n+\t\treturn JenaFactory.createGraph(getSalt());\n+\t}\n+\n+\t@Override\n+\tpublic JenaIRI createIRI(String iri) {\n+\t\tvalidateIRI(iri);\n+\t\treturn JenaFactory.createIRI(iri);\n+\t}\n+\n+\t@Override\n+\tpublic JenaLiteral createLiteral(String lexicalForm) {\n+\t\treturn JenaFactory.createLiteral(lexicalForm);\n+\t}\n+\n+\t@Override\n+\tpublic JenaLiteral createLiteral(String lexicalForm, IRI dataType) {\n+\t\treturn JenaFactory.createLiteralDT(lexicalForm, dataType.getIRIString());\n+\t}\n+\n+\t@Override\n+\tpublic JenaLiteral createLiteral(String lexicalForm, String languageTag) {\n+\t\tvalidateLang(languageTag);\n+\t\treturn JenaFactory.createLiteralLang(lexicalForm, languageTag);\n+\t}\n+\n+\t@Override\n+\tpublic JenaTriple createTriple(BlankNodeOrIRI subject, IRI predicate, RDFTerm object) {\n+\t\treturn JenaFactory.createTriple(subject, predicate, object);\n+\t}\n+\t\n+\t@Override\n+\tpublic JenaQuad createQuad(BlankNodeOrIRI graphName, BlankNodeOrIRI subject, IRI predicate, RDFTerm object)\n+\t\t\tthrows IllegalArgumentException, UnsupportedOperationException {\n+\t\treturn JenaFactory.createQuad(subject, predicate, object, graphName);\n+\t}\n+\t\n+\t/**\n+\t * Adapt a generalized Jena Triple to a CommonsRDF {@link TripleLike} statement.\n+\t * <p>\n+\t * The generalized triple supports any {@link RDFTerm} as its {@link TripleLike#getSubject()}\n+\t * {@link TripleLike#getPredicate()} or {@link TripleLike#getObject()}. \n+\t * <p>\n+\t * If the Jena triple contains any {@link Node#isBlank()}, then any corresponding\n+\t * {@link BlankNode} will use a {@link UUID} salt from this\n+\t * {@link JenaRDFTermFactory} instance in combination with\n+\t * {@link Node#getBlankNodeId()} for the purpose of its\n+\t * {@link BlankNode#uniqueReference()}.\n+\t *\n+\t * @see #fromJena(org.apache.jena.graph.Triple, UUID)\n+\t * @see #fromJena(RDFTermFactory, org.apache.jena.graph.Triple)\n+\t * \n+\t * @param subject The subject of the statement\n+\t * @param predicate The predicate of the statement\n+\t * @param object The object of the statement\n+\n+\t *            \n+\t * @return Adapted {@link TripleLike}. Note that the generalized triple does\n+\t *         <strong>not</strong> implement {@link Triple#equals(Object)} or\n+\t *         {@link Triple#hashCode()}.\n+\t * @throws ConversionException\n+\t *             if any of the triple's nodes are not concrete\n+\t */\n+\tpublic JenaTripleLike<RDFTerm, RDFTerm, RDFTerm> createGeneralizedTriple(\n+\t\t\tRDFTerm subject, RDFTerm predicate, RDFTerm object) {\n+\t\treturn JenaFactory.createGeneralizedTriple(subject, predicate, object);\n+\t}\n+\n+\t/**\n+\t * Adapt an existing Jena Node to CommonsRDF {@link RDFTerm}.\n+\t * <p>\n+\t * If {@link Node#isLiteral()}, then the returned value is a {@link Literal}.\n+\t * If {@link Node#isURI()}, the returned value is a IRI. If {$@link Node#isBlank()},\n+\t * the returned value is a {@link BlankNode}, which will use a {@link UUID}\n+\t * salt from this {@link JenaRDFTermFactory} instance in combination with\n+\t * {@link Node#getBlankNodeId()} for the purpose of its\n+\t * {@link BlankNode#uniqueReference()}.\n+\t * \n+\t * @see #fromJena(Node, UUID)\n+\t * @see #fromJena(RDFTermFactory, Node)\n+\t * \n+\t * @param node\n+\t *            The Jena Node to adapt. It's {@link Node#isConcrete()} must be\n+\t *            <code>true</code>.\n+\t * @return Adapted {@link JenaRDFTerm}\n+\t * @throws ConversionException\n+\t *             if the node is not concrete.\n+\t */\n+\tpublic JenaRDFTerm fromJena(Node node) throws ConversionException {\n+\t\treturn JenaFactory.fromJena(node, getSalt());\n+\t}\n+\n+\t/**\n+\t * Adapt an existing Jena Node to CommonsRDF {@link RDFTerm}.\n+\t * <p>\n+\t * If {@link Node#isLiteral()}, then the returned value is a {@link Literal}.\n+\t * If {@link Node#isURI()}, the returned value is a IRI. If {@link Node#isBlank()},\n+\t * the returned value is a {@link BlankNode}, which will use the provided\n+\t * {@link UUID} salt in combination with {@link Node#getBlankNodeId()} for\n+\t * the purpose of its {@link BlankNode#uniqueReference()}.\n+\t * \n+\t * @see #fromJena(Node)\n+\t * @see #fromJena(RDFTermFactory, Node)\n+\t * \n+\t * @param node\n+\t *            The Jena Node to adapt. It's {@link Node#isConcrete()} must be\n+\t *            <code>true</code>.\n+\t * @param salt\n+\t *            UUID salt for the purpose of\n+\t *            {@link BlankNode#uniqueReference()}\n+\t * @return Adapted {@link JenaRDFTerm}\n+\t * @throws ConversionException\n+\t *             if the node is not concrete.\n+\t */\n+\tpublic static JenaRDFTerm fromJena(Node node, UUID salt) {\n+\t\treturn JenaFactory.fromJena(node, salt);\n+\t}\n+\t\n+\t/**\n+\t * Convert from Jena {@link Node} to any Commons RDF implementation.\n+\t * <p>\n+\t * Note that if the {@link Node#isBlank()}, then the factory's \n+\t * {@link RDFTermFactory#createBlankNode(String)} will be used, meaning\n+\t * that care should be taken if reusing an {@link RDFTermFactory} instance\n+\t * for multiple conversion sessions.\n+\t * \n+\t * @see #fromJena(Node)\n+\t * @see #fromJena(Node, UUID)\n+\t * \n+\t * @param factory {@link RDFTermFactory} to use for creating {@link RDFTerm}.\n+\t * @param node\n+\t *            The Jena Node to adapt. It's {@link Node#isConcrete()} must be\n+\t *            <code>true</code>.\n+\t * @return Adapted {@link RDFTerm}            \n+\t * @throws ConversionException\n+\t *             if the node is not concrete.\n+\t */\n+\tpublic static RDFTerm fromJena(RDFTermFactory factory, Node node) {\n+\t\tif (node == null) {\n+\t\t\treturn null;\n+\t\t}\n+\t\tif (factory instanceof JenaRDFTermFactory) {\n+\t\t\t// No need to convert, just wrap\n+\t\t\treturn ((JenaRDFTermFactory) factory).fromJena(node);\n+\t\t}\n+\t\tif (node.isURI())\n+\t\t\treturn factory.createIRI(node.getURI());\n+\t\tif (node.isLiteral()) {\n+\t\t\tString lang = node.getLiteralLanguage();\n+\t\t\tif (lang != null && !lang.isEmpty())\n+\t\t\t\treturn factory.createLiteral(node.getLiteralLexicalForm(), lang);\n+\t\t\tif (node.getLiteralDatatype().equals(XSDDatatype.XSDstring))\n+\t\t\t\treturn factory.createLiteral(node.getLiteralLexicalForm());\n+\t\t\tIRI dt = factory.createIRI(node.getLiteralDatatype().getURI());\n+\t\t\treturn factory.createLiteral(node.getLiteralLexicalForm(), dt);\n+\t\t}\n+\t\tif (node.isBlank())\n+\t\t\t// The factory\n+\t\t\treturn factory.createBlankNode(node.getBlankNodeLabel());\n+\t\tthrow new ConversionException(\"Node is not a concrete RDF Term: \" + node);\n+\t}\t\n+\t\n+\t/**\n+\t * Adapt an existing Jena Triple to CommonsRDF {@link Triple}.\n+\t * <p>\n+\t * If the triple contains any {@link Node#isBlank()}, then any corresponding\n+\t * {@link BlankNode} will use a {@link UUID} salt from this\n+\t * {@link JenaRDFTermFactory} instance in combination with\n+\t * {@link Node#getBlankNodeId()} for the purpose of its\n+\t * {@link BlankNode#uniqueReference()}.\n+\t *\n+\t * @see #fromJena(org.apache.jena.graph.Triple, UUID)\n+\t * @see #fromJena(RDFTermFactory, org.apache.jena.graph.Triple)\n+\t * \n+\t * @param triple\n+\t *            Jena {@link org.apache.jena.graph.Triple} to adapt\n+\t * @return Adapted {@link JenaTriple}\n+\t * @throws ConversionException\n+\t *             if any of the triple's nodes are not concrete or the triple\n+\t *             is a generalized triple\n+\t */\n+\tpublic JenaTriple fromJena(org.apache.jena.graph.Triple triple) throws ConversionException {\n+\t\treturn JenaFactory.fromJena(triple, getSalt());\n+\t}\n+\n+\n+\t/**\n+\t * Adapt a generalized Jena Triple to a CommonsRDF {@link TripleLike}.\n+\t * <p>\n+\t * The generalized triple supports any {@link RDFTerm} as its {@link TripleLike#getSubject()}\n+\t * {@link TripleLike#getPredicate()} or {@link TripleLike#getObject()}. \n+\t * <p>\n+\t * If the Jena triple contains any {@link Node#isBlank()}, then any corresponding\n+\t * {@link BlankNode} will use the provided {@link UUID} salt \n+\t * in combination with\n+\t * {@link Node#getBlankNodeId()} for the purpose of its\n+\t * {@link BlankNode#uniqueReference()}.\n+\t *\n+\t * @see #fromJena(org.apache.jena.graph.Triple, UUID)\n+\t * @see #fromJena(RDFTermFactory, org.apache.jena.graph.Triple)\n+\t * \n+\t * @param triple\n+\t *            Jena triple\n+\t * @param salt\n+\t *            UUID salt for the purpose of\n+\t *            {@link BlankNode#uniqueReference()}\n+\t * @return Adapted {@link TripleLike}. Note that the generalized triple does\n+\t *         <strong>not</strong> implement {@link Triple#equals(Object)} or\n+\t *         {@link Triple#hashCode()}.\n+\t * @throws ConversionException\n+\t *             if any of the triple's nodes are not concrete\n+\t */\n+\tpublic JenaTripleLike<RDFTerm, RDFTerm, RDFTerm> fromJenaGeneralized(org.apache.jena.graph.Triple triple, UUID salt) throws ConversionException {\n+\t\treturn JenaFactory.fromJenaGeneralized(triple, salt);\n+\t}\n+\t\n+\t/**\n+\t * Adapt a generalized Jena {@link org.apache.jena.graph.Triple} to a CommonsRDF {@link TripleLike}.\n+\t * <p>\n+\t * The generalized triple supports any {@link RDFTerm} as its {@link TripleLike#getSubject()}\n+\t * {@link TripleLike#getPredicate()} or {@link TripleLike#getObject()}, including \n+\t * the extensions {@link JenaAny} and {@link JenaVariable}.\n+\t * <p>\n+\t * If the Jena triple contains any {@link Node#isBlank()}, then any corresponding\n+\t * {@link BlankNode} will use a {@link UUID} salt from this\n+\t * {@link JenaRDFTermFactory} instance in combination with\n+\t * {@link Node#getBlankNodeId()} for the purpose of its\n+\t * {@link BlankNode#uniqueReference()}.\n+\t *\n+\t * @see #fromJena(org.apache.jena.graph.Triple, UUID)\n+\t * @see #fromJena(RDFTermFactory, org.apache.jena.graph.Triple)\n+\t * \n+\t * @param triple\n+\t *            Jena triple\n+\t * @return Adapted {@link TripleLike}. Note that the generalized triple does\n+\t *         <strong>not</strong> implement {@link Triple#equals(Object)} or\n+\t *         {@link Triple#hashCode()}.\n+\t * @throws ConversionException\n+\t *             if any of the triple's nodes are not concrete\n+\t */\n+\tpublic JenaTripleLike<RDFTerm, RDFTerm, RDFTerm> fromJenaGeneralized(org.apache.jena.graph.Triple triple) throws ConversionException {\n+\t\treturn JenaFactory.fromJenaGeneralized(triple, getSalt());\n+\t}\n+\n+\t/**\n+\t * Adapt a generalized Jena {@link org.apache.jena.sparql.core.Quad} to a CommonsRDF {@link QuadLike}.\n+\t * <p>\n+\t * The generalized quad supports any {@link RDFTerm} as its \n+\t * {@link QuadLike#getGraphName()}, \n+\t * {@link QuadLike#getSubject()}\n+\t * {@link QuadLike#getPredicate()} or \n+\t * {@link QuadLike#getObject()}, including \n+\t * the extensions \n+\t * {@link JenaAny} and {@link JenaVariable}. \n+\t * <p>\n+\t * If the Jena quad contains any {@link Node#isBlank()}, then any corresponding\n+\t * {@link BlankNode} will use a {@link UUID} salt from this\n+\t * {@link JenaRDFTermFactory} instance in combination with\n+\t * {@link Node#getBlankNodeId()} for the purpose of its\n+\t * {@link BlankNode#uniqueReference()}.\n+\t *\n+\t * @see #fromJena(org.apache.jena.sparql.core.Quad)\n+\t * @see #fromJenaGeneralized(org.apache.jena.graph.Triple)\n+\t * \n+\t * @param quad\n+\t *            Jena quad\n+\t * @return Adapted {@link QuadLike}. Note that the generalized quad does\n+\t *         <strong>not</strong> implement {@link Quad#equals(Object)} or\n+\t *         {@link Quad#hashCode()}.\n+\t * @throws ConversionException\n+\t *             if any of the quad nodes are not concrete\n+\t */\n+\tpublic JenaQuadLike<RDFTerm, RDFTerm, RDFTerm, RDFTerm> fromJenaGeneralized(org.apache.jena.sparql.core.Quad quad) throws ConversionException {\n+\t\treturn JenaFactory.fromJenaGeneralized(quad, getSalt());\n+\t}\n+\t\n+\t\n+\t/**\n+\t * Adapt an existing Jena Triple to CommonsRDF {@link Triple}.\n+\t * <p>\n+\t * If the triple contains any {@link Node#isBlank()}, then any corresponding\n+\t * {@link BlankNode} will use the provided a {@link UUID} salt in\n+\t * combination with {@link Node#getBlankNodeId()} for the purpose of its\n+\t * {@link BlankNode#uniqueReference()}.\n+\t * \n+\t * @param triple\n+\t *            Jena triple\n+\t * @param salt\n+\t *            A {@link UUID} salt for adapting any {@link BlankNode}s\n+\t * @return Adapted triple\n+\t * @throws ConversionException\n+\t *             if any of the triple's nodes are not concrete or the triple\n+\t *             is a generalized triple\n+\t */\n+\tpublic static JenaTriple fromJena(org.apache.jena.graph.Triple triple, UUID salt) throws ConversionException {\n+\t\treturn JenaFactory.fromJena(triple, salt);\n+\t}\n+\n+\t/**\n+\t * Convert from Jena {@link org.apache.jena.graph.Triple} to a Commons RDF\n+\t * {@link Triple}.\n+\t * <p>\n+\t * Note that if any of the triple's nodes {@link Node#isBlank()}, then the factory's \n+\t * {@link RDFTermFactory#createBlankNode(String)} will be used, meaning\n+\t * that care should be taken if reusing an {@link RDFTermFactory} instance\n+\t * for multiple conversion sessions.\n+\t * \n+\t * @see #fromJena(org.apache.jena.graph.Triple)\n+\t * @see #fromJena(org.apache.jena.graph.Triple, UUID)\n+\t *\n+\t * @param factory {@link RDFTermFactory} to use for creating the {@link Triple} and its\n+\t * {@link RDFTerm}s.\n+\t * @param triple\n+\t *            Jena triple\n+\t * @return Converted triple\n+\t * @throws ConversionException\n+\t *             if any of the triple's nodes are not concrete or the triple\n+\t *             is a generalized triple\n+\t */\n+\tpublic static Triple fromJena(RDFTermFactory factory, org.apache.jena.graph.Triple triple) \n+\t\t\tthrows ConversionException{\n+\t\tif (factory instanceof JenaRDFTermFactory) {\n+\t\t\t// No need to convert, just wrap\n+\t\t\treturn ((JenaRDFTermFactory) factory).fromJena(triple);\n+\t\t}\n+\t\tBlankNodeOrIRI subject;\n+\t\tIRI predicate;\n+\t\ttry {\n+\t\t\tsubject = (BlankNodeOrIRI) fromJena(factory, triple.getSubject());\n+\t\t\tpredicate = (IRI) fromJena(factory, triple.getPredicate());\n+\t\t} catch (ClassCastException ex) {\n+\t\t\tthrow new ConversionException(\"Can't convert generalized triple: \" + triple, ex);\n+\t\t}\n+\t\tRDFTerm object = fromJena(factory, triple.getObject());\n+\t\treturn factory.createTriple(subject, predicate, object);","path":"jena/src/main/java/org/apache/commons/rdf/jena/JenaRDFTermFactory.java","position":438,"original_position":438,"commit_id":"eb391f860b1aa223ae11e114d828e1f463d6fee3","original_commit_id":"eb391f860b1aa223ae11e114d828e1f463d6fee3","user":{"login":"ajs6f","id":110994,"avatar_url":"https://avatars.githubusercontent.com/u/110994?v=3","gravatar_id":"","url":"https://api.github.com/users/ajs6f","html_url":"https://github.com/ajs6f","followers_url":"https://api.github.com/users/ajs6f/followers","following_url":"https://api.github.com/users/ajs6f/following{/other_user}","gists_url":"https://api.github.com/users/ajs6f/gists{/gist_id}","starred_url":"https://api.github.com/users/ajs6f/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ajs6f/subscriptions","organizations_url":"https://api.github.com/users/ajs6f/orgs","repos_url":"https://api.github.com/users/ajs6f/repos","events_url":"https://api.github.com/users/ajs6f/events{/privacy}","received_events_url":"https://api.github.com/users/ajs6f/received_events","type":"User","site_admin":false},"body":"Okay, fair enough. I was too concerned with concision. I think it should be possible to make the variable `final`, though, to indicate that there is only one correct path through.","created_at":"2016-09-29T14:40:42Z","updated_at":"2016-09-29T14:40:42Z","html_url":"https://github.com/apache/incubator-commonsrdf/pull/23#discussion_r81152333","pull_request_url":"https://api.github.com/repos/apache/incubator-commonsrdf/pulls/23","_links":{"self":{"href":"https://api.github.com/repos/apache/incubator-commonsrdf/pulls/comments/81152333"},"html":{"href":"https://github.com/apache/incubator-commonsrdf/pull/23#discussion_r81152333"},"pull_request":{"href":"https://api.github.com/repos/apache/incubator-commonsrdf/pulls/23"}}},"pull_request":{"url":"https://api.github.com/repos/apache/incubator-commonsrdf/pulls/23","id":87125379,"html_url":"https://github.com/apache/incubator-commonsrdf/pull/23","diff_url":"https://github.com/apache/incubator-commonsrdf/pull/23.diff","patch_url":"https://github.com/apache/incubator-commonsrdf/pull/23.patch","issue_url":"https://api.github.com/repos/apache/incubator-commonsrdf/issues/23","number":23,"state":"open","locked":false,"title":"COMMONSRDF-33 Add Jena integration","user":{"login":"stain","id":253413,"avatar_url":"https://avatars.githubusercontent.com/u/253413?v=3","gravatar_id":"","url":"https://api.github.com/users/stain","html_url":"https://github.com/stain","followers_url":"https://api.github.com/users/stain/followers","following_url":"https://api.github.com/users/stain/following{/other_user}","gists_url":"https://api.github.com/users/stain/gists{/gist_id}","starred_url":"https://api.github.com/users/stain/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stain/subscriptions","organizations_url":"https://api.github.com/users/stain/orgs","repos_url":"https://api.github.com/users/stain/repos","events_url":"https://api.github.com/users/stain/events{/privacy}","received_events_url":"https://api.github.com/users/stain/received_events","type":"User","site_admin":false},"body":"This adds the `jena` module, Commons RDF implementations backed by [Apache Jena](http://jena.apache.org/).\r\n\r\nSee also [COMMONSRDF-33](https://issues.apache.org/jira/browse/COMMONSRDF-33)","created_at":"2016-09-28T13:58:25Z","updated_at":"2016-09-29T14:40:42Z","closed_at":null,"merged_at":null,"merge_commit_sha":"5b221bad8ef7e19b13af9c3d7905539dbf26f096","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/apache/incubator-commonsrdf/pulls/23/commits","review_comments_url":"https://api.github.com/repos/apache/incubator-commonsrdf/pulls/23/comments","review_comment_url":"https://api.github.com/repos/apache/incubator-commonsrdf/pulls/comments{/number}","comments_url":"https://api.github.com/repos/apache/incubator-commonsrdf/issues/23/comments","statuses_url":"https://api.github.com/repos/apache/incubator-commonsrdf/statuses/eb391f860b1aa223ae11e114d828e1f463d6fee3","head":{"label":"apache:jena","ref":"jena","sha":"eb391f860b1aa223ae11e114d828e1f463d6fee3","user":{"login":"apache","id":47359,"avatar_url":"https://avatars.githubusercontent.com/u/47359?v=3","gravatar_id":"","url":"https://api.github.com/users/apache","html_url":"https://github.com/apache","followers_url":"https://api.github.com/users/apache/followers","following_url":"https://api.github.com/users/apache/following{/other_user}","gists_url":"https://api.github.com/users/apache/gists{/gist_id}","starred_url":"https://api.github.com/users/apache/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apache/subscriptions","organizations_url":"https://api.github.com/users/apache/orgs","repos_url":"https://api.github.com/users/apache/repos","events_url":"https://api.github.com/users/apache/events{/privacy}","received_events_url":"https://api.github.com/users/apache/received_events","type":"Organization","site_admin":false},"repo":{"id":32505934,"name":"incubator-commonsrdf","full_name":"apache/incubator-commonsrdf","owner":{"login":"apache","id":47359,"avatar_url":"https://avatars.githubusercontent.com/u/47359?v=3","gravatar_id":"","url":"https://api.github.com/users/apache","html_url":"https://github.com/apache","followers_url":"https://api.github.com/users/apache/followers","following_url":"https://api.github.com/users/apache/following{/other_user}","gists_url":"https://api.github.com/users/apache/gists{/gist_id}","starred_url":"https://api.github.com/users/apache/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apache/subscriptions","organizations_url":"https://api.github.com/users/apache/orgs","repos_url":"https://api.github.com/users/apache/repos","events_url":"https://api.github.com/users/apache/events{/privacy}","received_events_url":"https://api.github.com/users/apache/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/apache/incubator-commonsrdf","description":"Mirror of Apache CommonsRDF (Incubating)","fork":false,"url":"https://api.github.com/repos/apache/incubator-commonsrdf","forks_url":"https://api.github.com/repos/apache/incubator-commonsrdf/forks","keys_url":"https://api.github.com/repos/apache/incubator-commonsrdf/keys{/key_id}","collaborators_url":"https://api.github.com/repos/apache/incubator-commonsrdf/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/apache/incubator-commonsrdf/teams","hooks_url":"https://api.github.com/repos/apache/incubator-commonsrdf/hooks","issue_events_url":"https://api.github.com/repos/apache/incubator-commonsrdf/issues/events{/number}","events_url":"https://api.github.com/repos/apache/incubator-commonsrdf/events","assignees_url":"https://api.github.com/repos/apache/incubator-commonsrdf/assignees{/user}","branches_url":"https://api.github.com/repos/apache/incubator-commonsrdf/branches{/branch}","tags_url":"https://api.github.com/repos/apache/incubator-commonsrdf/tags","blobs_url":"https://api.github.com/repos/apache/incubator-commonsrdf/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/apache/incubator-commonsrdf/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/apache/incubator-commonsrdf/git/refs{/sha}","trees_url":"https://api.github.com/repos/apache/incubator-commonsrdf/git/trees{/sha}","statuses_url":"https://api.github.com/repos/apache/incubator-commonsrdf/statuses/{sha}","languages_url":"https://api.github.com/repos/apache/incubator-commonsrdf/languages","stargazers_url":"https://api.github.com/repos/apache/incubator-commonsrdf/stargazers","contributors_url":"https://api.github.com/repos/apache/incubator-commonsrdf/contributors","subscribers_url":"https://api.github.com/repos/apache/incubator-commonsrdf/subscribers","subscription_url":"https://api.github.com/repos/apache/incubator-commonsrdf/subscription","commits_url":"https://api.github.com/repos/apache/incubator-commonsrdf/commits{/sha}","git_commits_url":"https://api.github.com/repos/apache/incubator-commonsrdf/git/commits{/sha}","comments_url":"https://api.github.com/repos/apache/incubator-commonsrdf/comments{/number}","issue_comment_url":"https://api.github.com/repos/apache/incubator-commonsrdf/issues/comments{/number}","contents_url":"https://api.github.com/repos/apache/incubator-commonsrdf/contents/{+path}","compare_url":"https://api.github.com/repos/apache/incubator-commonsrdf/compare/{base}...{head}","merges_url":"https://api.github.com/repos/apache/incubator-commonsrdf/merges","archive_url":"https://api.github.com/repos/apache/incubator-commonsrdf/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/apache/incubator-commonsrdf/downloads","issues_url":"https://api.github.com/repos/apache/incubator-commonsrdf/issues{/number}","pulls_url":"https://api.github.com/repos/apache/incubator-commonsrdf/pulls{/number}","milestones_url":"https://api.github.com/repos/apache/incubator-commonsrdf/milestones{/number}","notifications_url":"https://api.github.com/repos/apache/incubator-commonsrdf/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/apache/incubator-commonsrdf/labels{/name}","releases_url":"https://api.github.com/repos/apache/incubator-commonsrdf/releases{/id}","deployments_url":"https://api.github.com/repos/apache/incubator-commonsrdf/deployments","created_at":"2015-03-19T07:00:05Z","updated_at":"2016-09-16T01:33:39Z","pushed_at":"2016-09-29T00:16:48Z","git_url":"git://github.com/apache/incubator-commonsrdf.git","ssh_url":"git@github.com:apache/incubator-commonsrdf.git","clone_url":"https://github.com/apache/incubator-commonsrdf.git","svn_url":"https://github.com/apache/incubator-commonsrdf","homepage":null,"size":1401,"stargazers_count":8,"watchers_count":8,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":16,"mirror_url":"git://git.apache.org/incubator-commonsrdf.git","open_issues_count":3,"forks":16,"open_issues":3,"watchers":8,"default_branch":"master"}},"base":{"label":"apache:master","ref":"master","sha":"5afd0bd686d717c9b16943bd393fcb49cabd5fd6","user":{"login":"apache","id":47359,"avatar_url":"https://avatars.githubusercontent.com/u/47359?v=3","gravatar_id":"","url":"https://api.github.com/users/apache","html_url":"https://github.com/apache","followers_url":"https://api.github.com/users/apache/followers","following_url":"https://api.github.com/users/apache/following{/other_user}","gists_url":"https://api.github.com/users/apache/gists{/gist_id}","starred_url":"https://api.github.com/users/apache/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apache/subscriptions","organizations_url":"https://api.github.com/users/apache/orgs","repos_url":"https://api.github.com/users/apache/repos","events_url":"https://api.github.com/users/apache/events{/privacy}","received_events_url":"https://api.github.com/users/apache/received_events","type":"Organization","site_admin":false},"repo":{"id":32505934,"name":"incubator-commonsrdf","full_name":"apache/incubator-commonsrdf","owner":{"login":"apache","id":47359,"avatar_url":"https://avatars.githubusercontent.com/u/47359?v=3","gravatar_id":"","url":"https://api.github.com/users/apache","html_url":"https://github.com/apache","followers_url":"https://api.github.com/users/apache/followers","following_url":"https://api.github.com/users/apache/following{/other_user}","gists_url":"https://api.github.com/users/apache/gists{/gist_id}","starred_url":"https://api.github.com/users/apache/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apache/subscriptions","organizations_url":"https://api.github.com/users/apache/orgs","repos_url":"https://api.github.com/users/apache/repos","events_url":"https://api.github.com/users/apache/events{/privacy}","received_events_url":"https://api.github.com/users/apache/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/apache/incubator-commonsrdf","description":"Mirror of Apache CommonsRDF (Incubating)","fork":false,"url":"https://api.github.com/repos/apache/incubator-commonsrdf","forks_url":"https://api.github.com/repos/apache/incubator-commonsrdf/forks","keys_url":"https://api.github.com/repos/apache/incubator-commonsrdf/keys{/key_id}","collaborators_url":"https://api.github.com/repos/apache/incubator-commonsrdf/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/apache/incubator-commonsrdf/teams","hooks_url":"https://api.github.com/repos/apache/incubator-commonsrdf/hooks","issue_events_url":"https://api.github.com/repos/apache/incubator-commonsrdf/issues/events{/number}","events_url":"https://api.github.com/repos/apache/incubator-commonsrdf/events","assignees_url":"https://api.github.com/repos/apache/incubator-commonsrdf/assignees{/user}","branches_url":"https://api.github.com/repos/apache/incubator-commonsrdf/branches{/branch}","tags_url":"https://api.github.com/repos/apache/incubator-commonsrdf/tags","blobs_url":"https://api.github.com/repos/apache/incubator-commonsrdf/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/apache/incubator-commonsrdf/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/apache/incubator-commonsrdf/git/refs{/sha}","trees_url":"https://api.github.com/repos/apache/incubator-commonsrdf/git/trees{/sha}","statuses_url":"https://api.github.com/repos/apache/incubator-commonsrdf/statuses/{sha}","languages_url":"https://api.github.com/repos/apache/incubator-commonsrdf/languages","stargazers_url":"https://api.github.com/repos/apache/incubator-commonsrdf/stargazers","contributors_url":"https://api.github.com/repos/apache/incubator-commonsrdf/contributors","subscribers_url":"https://api.github.com/repos/apache/incubator-commonsrdf/subscribers","subscription_url":"https://api.github.com/repos/apache/incubator-commonsrdf/subscription","commits_url":"https://api.github.com/repos/apache/incubator-commonsrdf/commits{/sha}","git_commits_url":"https://api.github.com/repos/apache/incubator-commonsrdf/git/commits{/sha}","comments_url":"https://api.github.com/repos/apache/incubator-commonsrdf/comments{/number}","issue_comment_url":"https://api.github.com/repos/apache/incubator-commonsrdf/issues/comments{/number}","contents_url":"https://api.github.com/repos/apache/incubator-commonsrdf/contents/{+path}","compare_url":"https://api.github.com/repos/apache/incubator-commonsrdf/compare/{base}...{head}","merges_url":"https://api.github.com/repos/apache/incubator-commonsrdf/merges","archive_url":"https://api.github.com/repos/apache/incubator-commonsrdf/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/apache/incubator-commonsrdf/downloads","issues_url":"https://api.github.com/repos/apache/incubator-commonsrdf/issues{/number}","pulls_url":"https://api.github.com/repos/apache/incubator-commonsrdf/pulls{/number}","milestones_url":"https://api.github.com/repos/apache/incubator-commonsrdf/milestones{/number}","notifications_url":"https://api.github.com/repos/apache/incubator-commonsrdf/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/apache/incubator-commonsrdf/labels{/name}","releases_url":"https://api.github.com/repos/apache/incubator-commonsrdf/releases{/id}","deployments_url":"https://api.github.com/repos/apache/incubator-commonsrdf/deployments","created_at":"2015-03-19T07:00:05Z","updated_at":"2016-09-16T01:33:39Z","pushed_at":"2016-09-29T00:16:48Z","git_url":"git://github.com/apache/incubator-commonsrdf.git","ssh_url":"git@github.com:apache/incubator-commonsrdf.git","clone_url":"https://github.com/apache/incubator-commonsrdf.git","svn_url":"https://github.com/apache/incubator-commonsrdf","homepage":null,"size":1401,"stargazers_count":8,"watchers_count":8,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":16,"mirror_url":"git://git.apache.org/incubator-commonsrdf.git","open_issues_count":3,"forks":16,"open_issues":3,"watchers":8,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/apache/incubator-commonsrdf/pulls/23"},"html":{"href":"https://github.com/apache/incubator-commonsrdf/pull/23"},"issue":{"href":"https://api.github.com/repos/apache/incubator-commonsrdf/issues/23"},"comments":{"href":"https://api.github.com/repos/apache/incubator-commonsrdf/issues/23/comments"},"review_comments":{"href":"https://api.github.com/repos/apache/incubator-commonsrdf/pulls/23/comments"},"review_comment":{"href":"https://api.github.com/repos/apache/incubator-commonsrdf/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/apache/incubator-commonsrdf/pulls/23/commits"},"statuses":{"href":"https://api.github.com/repos/apache/incubator-commonsrdf/statuses/eb391f860b1aa223ae11e114d828e1f463d6fee3"}}}}
{"actor":{"display_login":"ajs6f"}}