Newer
Older
rdfdiff / src / main / scala / uk / org / floop / RdfDiff.scala
package uk.org.floop

import java.io.StringWriter
import java.net.URI

import org.apache.jena.riot.RDFDataMgr

case class Config(uris: Seq[URI] = Seq.empty)

object RdfDiff extends App {
  val packageVersion: String = getClass.getPackage.getImplementationVersion
  val parser = new scopt.OptionParser[Config]("rdfdiff") {
    head("rdfdiff", packageVersion)
    arg[URI]("<URI>")
      .minOccurs(1)
      .maxOccurs(2)
      .hidden()
      .action { (x, c) => c.copy(uris = c.uris :+ x)
    }
    help("help") text("Parses each file/URL as RDF and shows the differences between the resulting set of statements.")
  }
  parser.parse(args, Config()) match {
    case Some(Config(Seq(uriA, uriB))) =>
      val a = RDFDataMgr.loadModel(uriA.toString)
      val b = RDFDataMgr.loadModel(uriB.toString)
      if (a isIsomorphicWith b) {
        println("Graphs are isomorphic.")
        System.exit(0)
      } else {
        val sw = new StringWriter()
        sw.write("<<<<\n")
        a.difference(b).write(sw, "TURTLE")
        sw.write("\n----\n")
        b.difference(a).write(sw, "TURTLE")
        sw.write("\n>>>>\n")
        println(sw.toString)
        System.exit(1)
      }
    case _ =>
      System.exit(2)
  }
}