/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.jena.jdbc.utils;
import static org.apache.jena.graph.Node.ANY;
import static org.apache.jena.sparql.core.Quad.defaultGraphIRI;
import java.util.Iterator;
import org.apache.http.client.HttpClient;
import org.apache.jena.query.Dataset ;
import org.apache.jena.query.DatasetAccessor ;
import org.apache.jena.query.DatasetAccessorFactory ;
import org.apache.jena.query.DatasetFactory ;
import org.apache.jena.rdf.model.Model ;
import org.apache.jena.rdf.model.ModelFactory ;
import org.apache.jena.sparql.core.DatasetGraph ;
/**
* Test utility methods
*/
public class TestUtils {
/**
* Generates a synthetic dataset for testing
*
* @param numGraphs
* Number of graphs to generate
* @param triplesPerGraph
* Triples per graph
* @param createDefaultGraph
* Whether to generate a default graph
* @return Synthetic dataset
*/
public static Dataset generateDataset(int numGraphs, int triplesPerGraph, boolean createDefaultGraph) {
if (numGraphs <= 0)
throw new IllegalArgumentException("Number of graphs must be >= 1");
if (triplesPerGraph <= 0)
throw new IllegalArgumentException("Number of triples per graph must be >= 1");
Dataset ds = DatasetFactory.createTxnMem();
if (createDefaultGraph) {
numGraphs--;
Model def = ModelFactory.createDefaultModel();
for (int i = 1; i <= triplesPerGraph; i++) {
def.add(def.createStatement(def.createResource("http://default/subject/" + i),
def.createProperty("http://default/predicate"), def.createTypedLiteral(i)));
}
ds.setDefaultModel(def);
}
for (int g = 1; g < numGraphs; g++) {
Model named = ModelFactory.createDefaultModel();
for (int i = 1; i <= triplesPerGraph; i++) {
named.add(named.createStatement(named.createResource("http://named/subject/" + i),
named.createProperty("http://named/predicate"), named.createTypedLiteral(i)));
}
ds.addNamedModel("http://named/" + g, named);
}
return ds;
}
/**
* Copies one dataset to another
*
* @param source
* Source Dataset
* @param target
* Target Dataset
*/
public static void copyDataset(Dataset source, Dataset target) {
TestUtils.copyDataset(source, target, false);
}
/**
* Copies one dataset to another
*
* @param source
* Source Dataset
* @param target
* Target Dataset
* @param copyDefaultAsQuads
* Whether the default graph should be copied as quads (required
* for TDB datasets)
*
*/
public static void copyDataset(Dataset source, Dataset target, boolean copyDefaultAsQuads) {
// Copy the default graph
if (copyDefaultAsQuads) {
DatasetGraph targetDSG = target.asDatasetGraph();
source.asDatasetGraph().find(defaultGraphIRI, ANY, ANY, ANY).forEachRemaining(targetDSG::add);
} else {
target.setDefaultModel(source.getDefaultModel());
}
// Copy named graphs
source.listNames().forEachRemaining(uri->target.addNamedModel(uri, source.getNamedModel(uri)));
}
/**
* Copies a dataset to a remote service that provides SPARQL 1.1 Graph Store
* protocol support
*
* @param source
* Source Dataset
* @param service
* Remote Graph Store protocol service
*/
public static void copyToRemoteDataset(Dataset source, String service) {
copyToRemoteDataset(source, service, null);
}
/**
* Copies a dataset to a remote service that provides SPARQL 1.1 Graph Store
* protocol support
*
* @param source
* Source Dataset
* @param service
* Remote Graph Store protocol service
* @param authenticator
* HTTP Authenticator
*/
public static void copyToRemoteDataset(Dataset source, String service, HttpClient client) {
DatasetAccessor target = DatasetAccessorFactory.createHTTP(service, client);
target.putModel(source.getDefaultModel());
Iterator<String> uris = source.listNames();
while (uris.hasNext()) {
String uri = uris.next();
target.putModel(uri, source.getNamedModel(uri));
}
}
/**
* Renames a graph of a dataset producing a new dataset so as to not modify
* the original dataset
*
* @param ds
* Dataset
* @param oldUri
* Old URI
* @param newUri
* New URI
* @return New Dataset
*/
public static Dataset renameGraph(Dataset ds, String oldUri, String newUri) {
Dataset dest = DatasetFactory.createTxnMem();
if (oldUri == null) {
// Rename default graph
dest.addNamedModel(newUri, ds.getDefaultModel());
} else {
// Copy across default graph
dest.setDefaultModel(ds.getDefaultModel());
}
Iterator<String> uris = ds.listNames();
while (uris.hasNext()) {
String uri = uris.next();
if (uri.equals(oldUri)) {
// Rename named graph
if (newUri == null) {
dest.setDefaultModel(ds.getNamedModel(oldUri));
} else {
dest.addNamedModel(newUri, ds.getNamedModel(oldUri));
}
} else {
// Copy across named graph
dest.addNamedModel(uri, ds.getNamedModel(uri));
}
}
return dest;
}
}