diff --git a/src/main/scala/uk/org/floop/updateInPlace/Run.scala b/src/main/scala/uk/org/floop/updateInPlace/Run.scala new file mode 100644 index 0000000..39edbdb --- /dev/null +++ b/src/main/scala/uk/org/floop/updateInPlace/Run.scala @@ -0,0 +1,48 @@ +package uk.org.floop.updateInPlace + +import java.io.{File, FileOutputStream, FileWriter} +import java.nio.file.{Files, Path} + +import org.apache.jena.query.{Dataset, DatasetFactory, QueryExecutionFactory, QueryFactory} +import org.apache.jena.rdf.model.{Model, ModelFactory} +import org.apache.jena.riot.{Lang, RDFDataMgr, RDFLanguages} +import org.apache.jena.update.UpdateAction + +import scala.io.Source + +case class Config(dir: File = new File("sparql"), + data: File = null) + +object Run extends App { + + val packageVersion: String = getClass.getPackage.getImplementationVersion() + val parser = new scopt.OptionParser[Config]("sparql-update-in-place") { + head("sparql-update-in-place", packageVersion) + opt[File]('q', "querydir") optional() valueName "" action { (x, c) => + c.copy(dir = x) + } text "location of SPARQL update queries to run, defaults to sparql" + arg[File]("") required() action { (x, c) => + c.copy(data = x) } text "data to update in-place" + } + parser.parse(args, Config()) match { + case None => + case Some(config) => + val dataset = DatasetFactory.create + RDFDataMgr.read(dataset, config.data.toString) + runQueriesUnder(config.dir, dataset, config.data) + val out = new FileOutputStream(config.data) + RDFDataMgr.write(out, dataset.getDefaultModel, RDFLanguages.filenameToLang(config.data.toString)) + out.close + } + + def runQueriesUnder(dir: File, dataset: Dataset, out: File): Unit = { + Files.walk(dir.toPath()). + filter(Files.isRegularFile(_)). + sorted((p1, p2) => p1.compareTo((p2))). + forEach { p => + UpdateAction.parseExecute(Source.fromFile(p.toFile).mkString, dataset) + } + } + + +}