Read RAMCloud config from file instead of System.getProperty

Change-Id: I7d16014634cc2016ef589d6363a8aa3664e73453
diff --git a/src/main/java/net/onrc/onos/datastore/RCClient.java b/src/main/java/net/onrc/onos/datastore/RCClient.java
index 8deefe2..a918f02 100644
--- a/src/main/java/net/onrc/onos/datastore/RCClient.java
+++ b/src/main/java/net/onrc/onos/datastore/RCClient.java
@@ -1,9 +1,18 @@
 package net.onrc.onos.datastore;
 
+import java.io.File;
+
+import org.apache.commons.configuration.Configuration;
+import org.apache.commons.configuration.ConfigurationException;
+import org.apache.commons.configuration.PropertiesConfiguration;
+
 import edu.stanford.ramcloud.JRamCloud;
 
 public class RCClient {
 
+    private static final String DB_CONFIG_FILE = "conf/ramcloud.conf";
+    public static final Configuration config = getConfiguration();
+
     // Value taken from RAMCloud's Status.h
     // FIXME These constants should be defined by JRamCloud
     public static final int STATUS_OK = 0;
@@ -18,9 +27,7 @@
     private static final ThreadLocal<JRamCloud> tlsRCClient = new ThreadLocal<JRamCloud>() {
 	@Override
 	protected JRamCloud initialValue() {
-	    // FIXME come up with a proper way to retrieve configuration
-	    return new JRamCloud(System.getProperty("ramcloud.coordinator",
-		    "fast+udp:host=127.0.0.1,port=12246"));
+	    return new JRamCloud(getCoordinatorUrl(config));
 	}
     };
 
@@ -34,4 +41,31 @@
 	return tlsRCClient.get();
     }
 
+    public static final Configuration getConfiguration() {
+	    final File configFile = new File(System.getProperty("ramcloud.config.path", DB_CONFIG_FILE));
+	    return getConfiguration(configFile);
+    }
+
+    public static final Configuration getConfiguration(final File configFile) {
+	if (configFile == null) {
+	    throw new IllegalArgumentException("Need to specify a configuration file or storage directory");
+	}
+
+	if (!configFile.isFile()) {
+	    throw new IllegalArgumentException("Location of configuration must be a file");
+	}
+
+	try {
+	    return new PropertiesConfiguration(configFile);
+	} catch (ConfigurationException e) {
+	    throw new IllegalArgumentException("Could not load configuration at: " + configFile, e);
+	}
+    }
+
+    public static String getCoordinatorUrl(final Configuration configuration) {
+	final String coordinatorIp = configuration.getString("ramcloud.coordinatorIp", "fast+udp:host=127.0.0.1");
+	final String coordinatorPort = configuration.getString("ramcloud.coordinatorPort", "port=12246");
+	final String coordinatorURL = coordinatorIp + "," + coordinatorPort;
+	return coordinatorURL;
+    }
 }