/*
* Copyright 2018 Alex Tucker
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package uk.org.floop.updateInPlace
import org.apache.jena.query.{Dataset, DatasetFactory}
import org.apache.jena.riot.{RDFDataMgr, RDFLanguages}
import org.apache.jena.update.UpdateAction
import java.io.{File, FileOutputStream}
import java.nio.file.Files
import scala.io.Source
import scala.util.Using
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("<dir>")
.action((x, c) => c.copy(dir = x))
.text("location of SPARQL update queries to run, defaults to sparql")
arg[File]("<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 =>
Using(Source.fromFile(p.toFile)) { src =>
UpdateAction.parseExecute(src.mkString, dataset)
}
}
}
}