import java.io.PrintWriter;
import java.util.Iterator;

import org.apache.jena.ontology.OntModel;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.ModelFactory;
import org.apache.jena.rdf.model.RDFNode;
import org.apache.jena.rdf.model.Statement;
import org.apache.jena.rdf.model.StmtIterator;
import org.apache.jena.reasoner.Derivation;
import org.apache.jena.reasoner.Reasoner;
import org.apache.jena.util.FileManager;
import org.apache.jena.vocabulary.RDF;
import openllet.jena.PelletReasonerFactory;

public class JenaPelletWinMove {
  static String filepath = "/home/may/teaching/SemWeb/RDF/";
  public static void main(String[] args){
    Model m = FileManager.get().loadModel(filepath + "winmove-axioms.n3");
    m.add(FileManager.get().loadModel(filepath + "winmove-closure.n3"));
    m.add(FileManager.get().loadModel(filepath + "winmove-graph.n3"));
    OntModel pelletmodel = ModelFactory.createOntologyModel(PelletReasonerFactory.THE_SPEC, m);
    Reasoner pellet = pelletmodel.getReasoner();
    pellet.setDerivationLogging(true);
    pelletmodel.prepare();

    Model dedModel = pelletmodel.getDeductionsModel();
    if (dedModel == null) System.out.println("DedModel is null");   // it is null ...
        else dedModel.write(System.out,"N3");
    Model rawModel = pelletmodel.getRawModel();
    Model diffModel = pelletmodel.difference(rawModel); // .difference(dedModel);
    System.out.println("---- DiffModel: ----------------------");
    diffModel.write(System.out,"N3");   // everything is in the DiffModel

    PrintWriter out = new PrintWriter(System.out);  // no derivations available
    for (StmtIterator i = diffModel.listStatements(null, RDF.type, (RDFNode) null); i.hasNext(); ) {
        Statement s = i.nextStatement();
        out.write("Statement is " + s + "\n");
        Iterator <Derivation> ds = pelletmodel.getDerivation(s);
        if (ds == null) System.out.println("DerivationsIterator is null");
        else for (Iterator<Derivation> i2 = pelletmodel.getDerivation(s); i2.hasNext(); ) {
            Derivation deriv = (Derivation) i2.next();
            deriv.printTrace(out, true);
    }   }
    out.flush();  } }
