--- a/sparql2sqlendpoint/src/main/scala/Configuration.scala Fri Nov 05 18:34:30 2010 -0400
+++ b/sparql2sqlendpoint/src/main/scala/Configuration.scala Fri Nov 05 18:35:18 2010 -0400
@@ -7,7 +7,7 @@
// adapted from http://github.com/codahale/fig
-object Configuration {
+object JsonBasedConfiguration {
/**
* returns the content of a file, if accessible from the classpath
*/
@@ -42,7 +42,7 @@
*
* @author coda
*/
-class Configuration(filename: String) {
+class JsonBasedConfiguration(filename: String) {
case class Value(path: String, value: JsonAST.JValue) {
/**
* Returns the value as an instance of type A.
@@ -93,11 +93,27 @@
}
private val json = {
- val content = Configuration.option(Source.fromFile(new File(filename)).mkString) getOrElse Configuration.fromFileInClasspath(filename)
+ val content = JsonBasedConfiguration.option(Source.fromFile(new File(filename)).mkString) getOrElse JsonBasedConfiguration.fromFileInClasspath(filename)
JsonParser.parse(content.replaceAll("""(^//.*|[\s]+//.*)""", ""))
}
/**
+ * returns all the available keys from the configuration file
+ */
+ val availableKeys:List[String] = {
+ def getKeys(json:JsonAST.JValue):List[String] = {
+ json match {
+ case JsonAST.JField(name, value) if value.children.size == 0 =>
+ List(name)
+ case JsonAST.JField(name, value) =>
+ value.children flatMap { getKeys(_) } map { name + "." + _ }
+ case _ => List()
+ }
+ }
+ json.children flatMap { getKeys(_) }
+ }
+
+ /**
* Given a dot-notation JSON path (e.g., "parent.child.fieldname"), returns
* a Value which can be converted into a specific type or Option thereof.
*/
--- a/sparql2sqlendpoint/src/main/scala/Servlet.scala Fri Nov 05 18:34:30 2010 -0400
+++ b/sparql2sqlendpoint/src/main/scala/Servlet.scala Fri Nov 05 18:35:18 2010 -0400
@@ -99,51 +99,39 @@
import org.w3.util.fig._
-trait Config {
+trait Configuration {
+ def getConfigurationValue(key:String):String
+ def availableKeys:List[String]
+}
- val config = new Configuration("default-config.json")
- Class.forName(config("db.driver").as[String]).newInstance
+trait DefaultJsonConfiguration extends Configuration {
+
+ val config = new JsonBasedConfiguration("default-config.json")
+
+ def getConfigurationValue(key:String) = config(key).as[String]
+
+ val availableKeys = config.availableKeys
+
+ Class.forName(getConfigurationValue("db.driver")).newInstance
def getConnection():Connection =
- DriverManager.getConnection(config("db.url").as[String],
- config("db.user").as[String],
- config("db.password").as[String])
+ DriverManager.getConnection(getConfigurationValue("db.url"),
+ getConfigurationValue("db.user"),
+ getConfigurationValue("db.password"))
- val defaultStemURI:String = config("ui.stemuri").as[String]
+ val defaultStemURI:String = getConfigurationValue("ui.stemuri")
- val defaultSparqlQuery:String = config("ui.sparql-query").as[String]
+ val defaultSparqlQuery:String = getConfigurationValue("ui.sparql-query")
val db:org.w3.sw.rdb.RDB.Database = {
val DDLParser = new org.w3.sw.sql.SqlParser()
- val ddl = config("default.ddl").as[String]
- println(ddl)
+ val ddl = getConfigurationValue("default.ddl")
DDLParser.parseAll(DDLParser.ddl, ddl).get
}
}
-object SPARQL2SQLEndpoint {
-
- import org.eclipse.jetty.server.Server
- import org.eclipse.jetty.servlet.{ServletContextHandler, ServletHolder}
-
- /* see http://wiki.eclipse.org/Jetty/Tutorial/Embedding_Jetty */
- def main(args: Array[String]) {
-
- val server:Server = new Server(8080)
- val context:ServletContextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS)
- context.setContextPath("/")
- server.setHandler(context)
-
- context.addServlet(new ServletHolder(new SPARQL2SQLEndpoint()),"/*");
- server.start
- server.join
-
- }
-
-}
-
-class SPARQL2SQLEndpoint extends HttpServlet with Config {
+class SPARQL2SQLEndpoint extends HttpServlet with DefaultJsonConfiguration {
val encoding = "utf-8"
@@ -213,3 +201,45 @@
}
}
+
+object SPARQL2SQLEndpoint {
+
+ import org.eclipse.jetty.server.Server
+ import org.eclipse.jetty.servlet.{ServletContextHandler, ServletHolder}
+
+ /**
+ * returns the value associated to a key
+ * example: javar -jar mybundle.jar -db.user root
+ */
+ def getElementAfter(args: List[String], key:String):Option[String] = {
+ args match {
+ case head :: tail if head == key => tail.headOption
+ case head :: tail => getElementAfter(tail, key)
+ case Nil => None
+ }
+ }
+
+ def main(args: Array[String]) {
+
+ val endpoint = new SPARQL2SQLEndpoint() {
+ override def getConfigurationValue(key:String) = getElementAfter(args.toList, "-"+key) getOrElse super.getConfigurationValue(key)
+ }
+
+ val message = endpoint.availableKeys map { key => "* " + key } mkString(start="You can override the following parameters by adding -<parameter> <value> on the command line:\n",
+ sep="\n",
+ end="")
+ println(message)
+
+ /* see http://wiki.eclipse.org/Jetty/Tutorial/Embedding_Jetty */
+ val server:Server = new Server(8080)
+ val context:ServletContextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS)
+ context.setContextPath("/")
+ server.setHandler(context)
+
+ context.addServlet(new ServletHolder(endpoint),"/*");
+ server.start
+ server.join
+
+ }
+
+}