package won.cryptography.rdfsign;
import org.apache.jena.query.Dataset;
import org.apache.jena.query.DatasetFactory;
import org.apache.jena.rdf.model.Model;
import de.uni_koblenz.aggrimm.icp.crypto.sign.graph.GraphCollection;
import de.uni_koblenz.aggrimm.icp.crypto.sign.graph.NamedGraph;
import de.uni_koblenz.aggrimm.icp.crypto.sign.trigplus.TriGPlusWriter;
import org.apache.jena.riot.RDFDataMgr;
import org.apache.jena.riot.RDFFormat;
import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import java.io.*;
import java.util.LinkedList;
/**
* Created by ypanchenko on 09.07.2014.
*/
public class ModelConverterTest
{
@Rule
public TemporaryFolder testFolder = new TemporaryFolder();
private static final String[] RESOURCE_FILES =
new String[]{
"/test_1_cupboard.trig",
"/test_1_graph.trig",
"/test_1_cupboard_no_pref.trig"};
@Test
/**
* Reads from TRIG with Jena API into Dataset 1, transforms one
* named graph from that Dataset into Signingframework's API
* GraphCollection and writes it with Signingframework's API,
* reads the result with Jena API into Dataset 2, and checks
* if the specified named graph model from Dataset 1 is
* isomorphic with the same named graph model from Dataset 2.
*/
public void modelToGraphCollectionTest() throws Exception {
for (String resourceFile : RESOURCE_FILES) {
// prepare the input Dataset containg the Model to be converted
InputStream is = this.getClass().getResourceAsStream(resourceFile);
File outFile = testFolder.newFile();
// use this when debugging:
//File outFile = File.createTempFile("won", ".trig");
//System.out.println(outFile);
Dataset dataset = DatasetFactory.createGeneral();
RDFDataMgr.read(dataset, is, RDFFormat.TRIG.getLang());
is.close();
// test the convertion from the Model to the NamedGraph
String modelName = dataset.listNames().next();
Model model = dataset.getNamedModel(modelName);
// the method to be tested
GraphCollection gc = ModelConverter.modelToGraphCollection(modelName, dataset);
TriGPlusWriter.writeFile(gc, outFile.getAbsolutePath(), false);
// check that the resulting graph collection is a representation
// of the converted model. For this, read the resulting graph collection
// as a Model with Jena API
InputStream is2 = new FileInputStream(outFile);
Dataset dataset2 = DatasetFactory.createGeneral();
RDFDataMgr.read(dataset2, is2, RDFFormat.TRIG.getLang());
is2.close();
Model model2 = dataset2.getNamedModel(modelName);
File outFile2 = testFolder.newFile();
// use this when debugging:
//File outFile2 = File.createTempFile("won", ".trig");
//System.out.println(outFile2);
OutputStream os = new FileOutputStream(outFile2);
RDFDataMgr.write(os, dataset2, RDFFormat.TRIG.getLang());
os.close();
// check that the model obtained from resulting graph collection is
// a representation of the original converted model.
Assert.assertTrue(model.listStatements().hasNext() && model2.listStatements().hasNext());
Assert.assertTrue(model.isIsomorphicWith(model2));
}
}
@Test
/**
* Reads from TRIG with Jena API into Dataset 1, transforms one
* named Model from that Dataset into Signingframework's API
* GraphCollection with one NamedGraph, transforms (converts)
* that NamedGraph into Jena's Model, and checks
* if the resulting Model is the same as original Model.
*/
public void namedGraphToModelTest() throws Exception {
for (String resourceFile : RESOURCE_FILES) {
// prepare GraphCollection with NamedGraph to be converted:
InputStream is = this.getClass().getResourceAsStream(resourceFile);
Dataset dataset = DatasetFactory.createGeneral();
RDFDataMgr.read(dataset, is, RDFFormat.TRIG.getLang());
is.close();
String modelName = dataset.listNames().next();
Model model1 = dataset.getNamedModel(modelName);
// this method is not tested here and used just for input
// generation and to make it easier Namedgraph<->Model comparison
// (but it's tested in other method, see modelToGraphCollectionTest())
GraphCollection gc = ModelConverter.modelToGraphCollection(modelName, dataset);
LinkedList<NamedGraph> graphs = gc.getGraphs();
String graphName = null;
for (NamedGraph g : graphs) {
if (!g.getName().isEmpty() && g.getName().contains(modelName)) {
graphName = g.getName();
break;
}
}
// use this when debugging:
//File outFile0 = File.createTempFile("won", ".trig");
//System.out.println(outFile0);
//OutputStream os0 = new FileOutputStream(outFile0);
//TriGPlusWriter.writeFile(gc, outFile0.getAbsolutePath(), false);
//os0.close();
// test convert from NamedGraph of GraphCollection into Model
Model model2 = ModelConverter.namedGraphToModel(graphName, gc);
Dataset dataset2 = DatasetFactory.createGeneral();
dataset2.addNamedModel(modelName, model2);
//TODO maybe chng the API so that the prefix map is taken care of in the converter:
// if it makes sense from the the usage of this in Assembler point of view
dataset2.getDefaultModel().setNsPrefixes(dataset2.getNamedModel(modelName).getNsPrefixMap());
File outFile = testFolder.newFile();
// use this when debugging:
//File outFile = File.createTempFile("won", ".trig");
//System.out.println(outFile);
OutputStream os = new FileOutputStream(outFile);
RDFDataMgr.write(os, dataset2, RDFFormat.TRIG.getLang());
os.close();
// make sure that the original Model that was used to generate test input
// GraphCollection with NamedGraph is isomorphic with the Model after
// conversion is applied:
Assert.assertTrue(model1.listStatements().hasNext() && model2.listStatements().hasNext());
Assert.assertTrue(model1.isIsomorphicWith(model2));
}
}
}