diff --git a/.classpath b/.classpath deleted file mode 100644 index 54931c2..0000000 --- a/.classpath +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs deleted file mode 100644 index 625723d..0000000 --- a/.settings/org.eclipse.core.resources.prefs +++ /dev/null @@ -1,8 +0,0 @@ -eclipse.preferences.version=1 -encoding//src/main=UTF-8 -encoding//src/main/java=UTF-8 -encoding//src/test=UTF-8 -encoding//src/test/java=UTF-8 -encoding/=UTF-8 -encoding/TestFiles=UTF-8 -encoding/resources=UTF-8 diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 13b3428..0000000 --- a/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,13 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.8 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning -org.eclipse.jdt.core.compiler.source=1.8 diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs deleted file mode 100644 index f897a7f..0000000 --- a/.settings/org.eclipse.m2e.core.prefs +++ /dev/null @@ -1,4 +0,0 @@ -activeProfiles= -eclipse.preferences.version=1 -resolveWorkspaceProjects=true -version=1 diff --git a/pom.xml b/pom.xml index ebc57f7..1cc67a8 100644 --- a/pom.xml +++ b/pom.xml @@ -105,6 +105,11 @@ jena-base 3.12.0 + + org.apache.jena + jena-tdb + 3.12.0 + diff --git a/src/main/java/org/spdx/spdxRdfStore/RdfStore.java b/src/main/java/org/spdx/spdxRdfStore/RdfStore.java index a6ba7ce..d889c9b 100644 --- a/src/main/java/org/spdx/spdxRdfStore/RdfStore.java +++ b/src/main/java/org/spdx/spdxRdfStore/RdfStore.java @@ -37,6 +37,8 @@ import org.apache.jena.graph.Node; import org.apache.jena.graph.Triple; import org.apache.jena.query.ARQ; +import org.apache.jena.query.Dataset; +import org.apache.jena.query.DatasetFactory; import org.apache.jena.rdf.model.Model; import org.apache.jena.rdf.model.ModelFactory; import org.apache.jena.util.FileManager; @@ -71,11 +73,21 @@ public class RdfStore implements IModelStore, ISerializableModelStore { Map documentUriModelMap = new ConcurrentHashMap<>(); private OutputFormat outputFormat = OutputFormat.XML_ABBREV; + + private Dataset dataset; static { ARQ.init(); // Insure ARQ is initialized } + public RdfStore() { + dataset = DatasetFactory.create(); + } + + public RdfStore(Dataset dataset) { + this.dataset = dataset; + } + /** * @return the outputFormat @@ -143,7 +155,7 @@ public void create(String documentUri, String id, String type) throws InvalidSPD Objects.requireNonNull(type, "Missing required type"); RdfSpdxDocumentModelManager modelManager = documentUriModelMap.get(documentUri); if (Objects.isNull(modelManager)) { - Model model = ModelFactory.createDefaultModel(); + Model model = dataset.getNamedModel(documentUri); model.getGraph().getPrefixMapping().setNsPrefix("spdx", SpdxConstants.SPDX_NAMESPACE); model.getGraph().getPrefixMapping().setNsPrefix("doap", SpdxConstants.DOAP_NAMESPACE); model.getGraph().getPrefixMapping().setNsPrefix("ptr", SpdxConstants.RDF_POINTER_NAMESPACE); @@ -218,7 +230,7 @@ public String getNextId(IdType idType, String documentUri) throws InvalidSPDXAna Objects.requireNonNull(idType, "Missing required ID type"); RdfSpdxDocumentModelManager modelManager = documentUriModelMap.get(documentUri); if (Objects.isNull(modelManager)) { - Model model = ModelFactory.createDefaultModel(); + Model model = dataset.getNamedModel(documentUri); model.getGraph().getPrefixMapping().setNsPrefix("spdx", SpdxConstants.SPDX_NAMESPACE); model.getGraph().getPrefixMapping().setNsPrefix("doap", SpdxConstants.DOAP_NAMESPACE); modelManager = new RdfSpdxDocumentModelManager(documentUri, model); @@ -518,8 +530,10 @@ public String deSerialize(InputStream stream, boolean overwrite) throws InvalidS Model model = ModelFactory.createDefaultModel(); model.read(stream, null); String documentNamespace = getDocumentNamespace(model); - RdfSpdxDocumentModelManager modelManager = new RdfSpdxDocumentModelManager(documentNamespace, model); CompatibilityUpgrader.upgrade(model); + dataset.addNamedModel(documentNamespace, model); + RdfSpdxDocumentModelManager modelManager = new RdfSpdxDocumentModelManager(documentNamespace, + dataset.getNamedModel(documentNamespace)); RdfSpdxDocumentModelManager previousModel = documentUriModelMap.putIfAbsent(documentNamespace, modelManager); if (!Objects.isNull(previousModel)) { if (overwrite) { diff --git a/src/test/java/org/spdx/spdxRdfStore/RdfStoreTest.java b/src/test/java/org/spdx/spdxRdfStore/RdfStoreTest.java index de33b86..12d00cf 100644 --- a/src/test/java/org/spdx/spdxRdfStore/RdfStoreTest.java +++ b/src/test/java/org/spdx/spdxRdfStore/RdfStoreTest.java @@ -5,12 +5,17 @@ import java.io.File; import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.apache.commons.io.FileUtils; +import org.apache.jena.query.Dataset; +import org.apache.jena.tdb.TDBFactory; import org.spdx.library.InvalidSPDXAnalysisException; import org.spdx.library.SpdxConstants; import org.spdx.library.model.ExternalRef; @@ -174,5 +179,33 @@ public void testLoadModelFromFile() throws InvalidSPDXAnalysisException, IOExcep documentDescribes = doc.getDocumentDescribes(); assertEquals(2, documentDescribes.size()); } + + public void testTdb() throws InvalidSPDXAnalysisException, IOException { + File tdbDir = Files.createTempDirectory("TDB").toFile(); + Dataset dataset = null; + try { + dataset = TDBFactory.createDataset(tdbDir.getAbsolutePath()); + RdfStore rdfStore = new RdfStore(dataset); + SpdxModelFactory.createModelObject(rdfStore, DOCUMENT_URI1, SpdxConstants.SPDX_DOCUMENT_ID, SpdxConstants.CLASS_SPDX_DOCUMENT, null); + SpdxModelFactory.createModelObject(rdfStore, DOCUMENT_URI1, ID_2, SpdxConstants.CLASS_SPDX_FILE, null); + SpdxModelFactory.createModelObject(rdfStore, DOCUMENT_URI1, ID_3, SpdxConstants.CLASS_SPDX_FILE, null); + SpdxModelFactory.createModelObject(rdfStore, DOCUMENT_URI1, ID_4, SpdxConstants.CLASS_SPDX_FILE, null); + Stream result = rdfStore.getAllItems(DOCUMENT_URI1, SpdxConstants.CLASS_SPDX_FILE); + final ArrayList resultList = new ArrayList<>(); + resultList.add(new TypedValue(ID_2, SpdxConstants.CLASS_SPDX_FILE)); + resultList.add(new TypedValue(ID_3, SpdxConstants.CLASS_SPDX_FILE)); + resultList.add(new TypedValue(ID_4, SpdxConstants.CLASS_SPDX_FILE)); + for (TypedValue tv:result.collect(Collectors.toList())) { + assertTrue(resultList.contains(tv)); + resultList.remove(tv); + } + assertEquals(0, resultList.size()); + } finally { + if (dataset != null) { + dataset.end(); + } + FileUtils.deleteDirectory(tdbDir); + } + } }