/**
* PRISSMA is a presentation-level framework for Linked Data adaptation.
*
* Copyright (C) 2013 Luca Costabello, v1.0
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, see <http://www.gnu.org/licenses/>.
*/
package fr.inria.wimmics.prissma.test;
import static org.junit.Assert.assertEquals;
import java.io.File;
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.Property;
import com.hp.hpl.jena.rdf.model.Resource;
import com.hp.hpl.jena.rdf.model.ResourceFactory;
import com.hp.hpl.jena.util.FileManager;
import fr.inria.wimmics.prissma.selection.Decomposer;
import fr.inria.wimmics.prissma.selection.PrissmaProperties;
import fr.inria.wimmics.prissma.selection.entities.ContextUnit;
import fr.inria.wimmics.prissma.selection.entities.CtxUnitType;
import fr.inria.wimmics.prissma.selection.entities.DecompItem;
import fr.inria.wimmics.prissma.selection.entities.Decomposition;
import fr.inria.wimmics.prissma.selection.entities.Edge;
import fr.inria.wimmics.prissma.selection.entities.Prism;
import fr.inria.wimmics.prissma.selection.utilities.ContextUnitConverter;
public class DecomposerTest {
private Logger LOG = LoggerFactory.getLogger(DecomposerTest.class);
@Test
public void testDecompose(){
Decomposition expectedDecomp = createSimpleDecomposition();
Model inputPrism = createSimpleModel();
Decomposer decomposer = new Decomposer();
Decomposition decomp = decomposer.decompose(inputPrism, new Decomposition());
assertEquals(expectedDecomp, decomp);
// add the same prism to see what happens
decomp = decomposer.decompose(inputPrism, decomp);
assertEquals(expectedDecomp, decomp);
}
class ModelMemoryTest{
List<Model> prismsModels;
public ModelMemoryTest(){
this.prismsModels = new ArrayList<Model>();
}
}
@Test
public void testDecompositionMemorySize(){
int ctxUnitCnt = 0;
ModelMemoryTest mTest = new ModelMemoryTest();
Decomposition decomp = new Decomposition();
Decomposer decomposer = new Decomposer();
// read all prisms
File dir = new File(PrissmaProperties.PRISM_PATH_TEST);
for (File file : dir.listFiles()) {
if (file.getName().endsWith(".ttl")){
Model inputPrism = ModelFactory.createDefaultModel();
InputStream in = FileManager.get().open( PrissmaProperties.PRISM_PATH_TEST + file.getName() );
if (in != null) {
inputPrism.read(in, null, "TURTLE");
mTest.prismsModels.add(inputPrism);
ctxUnitCnt += countCtxUnit(inputPrism, decomposer);
System.out.print("Decomposing " + file.getName() + "... ");
decomp = decomposer.decompose(inputPrism, decomp);
System.out.println("Done.");
}
}
}
System.out.println("The decomposition contains " + decomp.getPrismCount() + " prisms\n");
System.out.println("prisms ctxunit count: " + ctxUnitCnt);
System.out.println("decomp ctxunits count: " + getCtxUnitCount(decomp));
System.out.println("*Decomposition items: " + decomp.getSize());
System.out.println("Total triples in test model: " + getTotalTriples(mTest.prismsModels));
}
private int getTotalTriples(List<Model> prismsModels) {
int count = 0;
for (Model prism : prismsModels) {
count += prism.size();
}
return count;
}
private int getCtxUnitCount(Decomposition decomp) {
int ctxUnitCnt = 0;
for (DecompItem item: decomp.elements){
if (item.isCtxUnit)
ctxUnitCnt++;
}
return ctxUnitCnt;
}
private int countCtxUnit(Model inputPrism, Decomposer decomposer) {
Model inputCopy = ModelFactory.createDefaultModel();
inputCopy.add(inputPrism);
Decomposition decomp = new Decomposition();
ContextUnitConverter converter = new ContextUnitConverter();
Prism prism = decomposer.getPrismObject(inputCopy);
prism.rootNode = ContextUnitConverter.switchToClasses(prism.rootNode, decomp);
converter.convertInputToUnits(prism.rootNode, decomp.substitutions.values());
return converter.inputGraphContextUnits.size();
}
private Decomposition populateDecompositionFromDisk() {
Decomposition decomp = new Decomposition();
Decomposer decomposer = new Decomposer();
// read all prisms
File dir = new File(PrissmaProperties.PRISM_PATH_TEST);
for (File file : dir.listFiles()) {
if (file.getName().endsWith(".ttl")){
Model inputPrism = ModelFactory.createDefaultModel();
InputStream in = FileManager.get().open( PrissmaProperties.PRISM_PATH_TEST + file.getName() );
if (in != null) {
inputPrism.read(in, null, "TURTLE");
decomp = decomposer.decompose(inputPrism, decomp);
}
}
}
return decomp;
}
private Model createSimpleModel(){
Model model = ModelFactory.createDefaultModel();
Resource ctx1 = model.createResource(PrissmaProperties.DEFAULT + "ctx1");
Resource usr1 = model.createResource(PrissmaProperties.DEFAULT + "usr1");
model.add(ctx1, PrissmaProperties.pUsr, usr1);
model.add(usr1, PrissmaProperties.pKnows, "computer programming" );
return model;
}
private Decomposition createSimpleDecomposition(){
Decomposition expectedDecomp = new Decomposition();
// create some prissma property first
Property prissmaUser = ResourceFactory.createProperty(PrissmaProperties.PRISSMA, "user");
Property foafInterest = ResourceFactory.createProperty(PrissmaProperties.FOAF, "knows");
// create ctx units
ContextUnit ctxUnit1 = new ContextUnit( CtxUnitType.ENTITY);
ctxUnit1.instance = ResourceFactory.createResource( PrissmaProperties.DEFAULT + "ctx1");
ContextUnit ctxUnit2 = new ContextUnit( CtxUnitType.ENTITY);
ctxUnit2.instance = ResourceFactory.createResource( PrissmaProperties.DEFAULT + "usr1");
ContextUnit ctxUnit3 = new ContextUnit( CtxUnitType.STRING);
ctxUnit3.instance = ResourceFactory.createPlainLiteral("computer programming");
// convert ctx units to decomposition elements elements list
DecompItem item0 = new DecompItem(0);
item0.ctxUnit = ctxUnit1;
item0.isCtxUnit = true;
DecompItem item1 = new DecompItem(1);
item1.ctxUnit = ctxUnit2;
item1.isCtxUnit = true;
DecompItem item2 = new DecompItem(2);
item2.ctxUnit = ctxUnit3;
item2.isCtxUnit = true;
//create other decomp items
DecompItem item3 = new DecompItem(3);
Edge edge1 = new Edge();
edge1.label = foafInterest;
edge1.v1 = ctxUnit2;
edge1.v2 = ctxUnit3;
item3.edges.add(edge1);
item3.idAncestor1 = 1;
item3.idAncestor2 = 2;
DecompItem item4 = new DecompItem(4);
Edge edge2 = new Edge();
edge2.label = prissmaUser;
edge2.v1 = ctxUnit1;
edge2.v2 = ctxUnit2;
item4.edges.add(edge2);
item4.idAncestor1 = 0;
item4.idAncestor2 = 3;
item4.prismURISet = new HashSet<URI>();
try {
item4.prismURISet.add(new URI(PrissmaProperties.DEFAULT + "prism1"));
} catch (URISyntaxException e) {
e.printStackTrace();
}
// add converted ctx units to decomposition
expectedDecomp.elements.add(item0.id, item0);
expectedDecomp.elements.add(item1.id, item1);
expectedDecomp.elements.add(item2.id, item2);
expectedDecomp.elements.add(item3.id, item3);
expectedDecomp.elements.add(item4.id, item4);
return expectedDecomp;
}
}