changeset 4:de86f05b072b

establish a hierarchy for loading configuration data
author Omair Majid <omajid@redhat.com>
date Wed, 23 Nov 2011 14:07:31 -0500
parents 0d1762f6bcd9
children 2bc67023712e
files src/com/redhat/thermostat/agent/Defaults.java src/com/redhat/thermostat/agent/Main.java src/com/redhat/thermostat/agent/config/Configuration.java src/com/redhat/thermostat/common/Constants.java
diffstat 4 files changed, 91 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/src/com/redhat/thermostat/agent/Defaults.java	Tue Nov 22 13:36:10 2011 -0500
+++ b/src/com/redhat/thermostat/agent/Defaults.java	Wed Nov 23 14:07:31 2011 -0500
@@ -4,11 +4,14 @@
 
 public final class Defaults {
 
-	/* Should not be instantiated */
 	private Defaults() {
+	    /* Should not be instantiated */
 	}
 
     public static final Level LOGGING_LEVEL = Level.WARNING;
-    public static final boolean local = false; // Default behaviour is to connect to cluster.
+    public static final String DATABASE_URI = "mongodb://127.0.0.1";
+    public static final int MONGOS_PORT = 27517;
+    public static final int MONGOD_PORT = 27518;
+    public static final boolean LOCAL_MODE = false; // Default behaviour is to connect to cluster.
 
 }
--- a/src/com/redhat/thermostat/agent/Main.java	Tue Nov 22 13:36:10 2011 -0500
+++ b/src/com/redhat/thermostat/agent/Main.java	Wed Nov 23 14:07:31 2011 -0500
@@ -55,7 +55,7 @@
         Mongo mongo = null;
         DB db = null;
         try {
-            MongoURI mongoURI = config.getMongoURI();
+            MongoURI mongoURI = new MongoURI(config.getDatabaseURIAsString());
             mongo = new Mongo(mongoURI);
             db = mongo.getDB(Constants.THERMOSTAT_DB);
             logger.fine("connected");
--- a/src/com/redhat/thermostat/agent/config/Configuration.java	Tue Nov 22 13:36:10 2011 -0500
+++ b/src/com/redhat/thermostat/agent/config/Configuration.java	Wed Nov 23 14:07:31 2011 -0500
@@ -15,50 +15,86 @@
 import com.mongodb.BasicDBObject;
 import com.mongodb.DBCollection;
 import com.mongodb.DBObject;
-import com.mongodb.MongoURI;
 import com.mongodb.WriteConcern;
 import com.redhat.thermostat.agent.Agent;
 import com.redhat.thermostat.agent.Defaults;
 import com.redhat.thermostat.common.Constants;
 
 public final class Configuration {
-    private Arguments arguments;
-    private MongoURI uri;
+
+    private Level logLevel;
+    private boolean localMode;
+    private int mongodPort;
+    private int mongosPort;
+    private String databaseURI;
+    private String completeDatabaseURI;
     private Backends backends;
+
     private String hostname;
+
     private Agent agent;
+    private boolean published = false;
     private DBCollection dbCollection = null;
-    private boolean published = false;
 
     public Configuration(String[] args, Properties props) {
-        arguments = new Arguments(args);
-        if (arguments.getLocalMode()) {
-            uri = new MongoURI(Constants.MONGO_URL + ":" + props.getProperty(Constants.AGENT_PROPERTY_MONGOD_PORT));
+        initFromDefaults();
+        initFromProperties(props);
+        initFromArguments(args);
+
+        if (localMode) {
+            completeDatabaseURI = databaseURI + ":" + mongodPort;
             hostname = Constants.AGENT_LOCAL_HOSTNAME;
         } else {
-            uri = new MongoURI(props.getProperty(Constants.MONGO_URL) + ":" + props.getProperty(Constants.AGENT_PROPERTY_MONGOS_PORT));
+            completeDatabaseURI = databaseURI + ":" + mongosPort;
             try {
                 InetAddress addr = InetAddress.getLocalHost();
                 hostname = addr.getCanonicalHostName();
             } catch (UnknownHostException e) {
-                // TODO Auto-generated catch block
                 e.printStackTrace();
             }
         }
+    }
+
+    private void initFromDefaults() {
+        logLevel = Defaults.LOGGING_LEVEL;
+        localMode = Defaults.LOCAL_MODE;
+        mongodPort = Defaults.MONGOD_PORT;
+        mongosPort = Defaults.MONGOS_PORT;
+        databaseURI = Defaults.DATABASE_URI;
+    }
+
+    private void initFromProperties(Properties props) {
+        if (props.getProperty(Constants.AGENT_PROPERTY_MONGOD_PORT) != null) {
+            mongodPort = Integer.valueOf(props.getProperty(Constants.AGENT_PROPERTY_MONGOD_PORT));
+        }
+        if (props.getProperty(Constants.AGENT_PROPERTY_MONGOS_PORT) != null) {
+            mongosPort = Integer.valueOf(props.getProperty(Constants.AGENT_PROPERTY_MONGOS_PORT));
+        }
         backends = new Backends(props);
     }
 
+    private void initFromArguments(String[] args) {
+        Arguments arguments;
+
+        arguments = new Arguments(args);
+        if (arguments.isModeSpecified()) {
+            localMode = arguments.getLocalMode();
+        }
+        if (arguments.isLogLevelSpecified()) {
+            logLevel = arguments.getLogLevel();
+        }
+    }
 
     public void setCollection(DBCollection collection) {
         dbCollection = collection;
     }
-    
+
     public Level getLogLevel() {
-        return arguments.getLogLevel();
+        return logLevel;
     }
 
-    public MongoURI getMongoURI() {
-        return uri;
+    public String getDatabaseURIAsString() {
+        return completeDatabaseURI;
     }
 
     public String getHostname() {
@@ -107,34 +143,65 @@
         return null;
     }
 
-    private class Arguments {
+    /**
+     * Exposes the command line arguments in a more object-oriented style.
+     * <p>
+     * Please check that an option was specified (using the various is*Specified() methods) before using its value.
+     */
+    private static class Arguments {
         private final boolean localMode;
+        private final boolean modeSpecified;
         private final Level logLevel;
+        private final boolean logLevelSpecified;
 
         public Arguments(String[] args) {
-            boolean local = Defaults.local;
-            Level level = Defaults.LOGGING_LEVEL;
+            boolean local = false;
+            boolean explicitMode = false;
+            Level level = null;
+            boolean explicitLogLevel = false;
             for (int index = 0; index < args.length; index++) {
                 if (args[index].equals(Constants.AGENT_ARGUMENT_LOGLEVEL)) {
                     index++;
                     if (index < args.length) {
-                        level = Level.parse(args[index].toUpperCase());
+                        try {
+                            level = Level.parse(args[index].toUpperCase());
+                            explicitLogLevel = true;
+                        } catch (IllegalArgumentException iae) {
+                            System.err.println("warning: invalid argument for " + Constants.AGENT_ARGUMENT_LOGLEVEL);
+                        }
                     } else {
-                        
+                        System.err.println("warning: missing argument for " + Constants.AGENT_ARGUMENT_LOGLEVEL);
                     }
                 } else if (args[index].equals(Constants.AGENT_ARGUMENT_LOCAL)) {
+                    explicitMode = true;
                     local = true;
                 }
             }
             logLevel = level;
+            logLevelSpecified = explicitLogLevel;
             localMode = local;
+            modeSpecified = explicitMode;
+        }
+
+        public boolean isModeSpecified() {
+            return modeSpecified;
         }
 
         public boolean getLocalMode() {
+            if (!isModeSpecified()) {
+                throw new IllegalStateException("local mode is not valid");
+            }
             return localMode;
         }
 
+        public boolean isLogLevelSpecified() {
+            return logLevelSpecified;
+        }
+
         public Level getLogLevel() {
+            if (!isLogLevelSpecified()) {
+                throw new IllegalStateException("log level not explicitly specified");
+            }
             return logLevel;
         }
     }
--- a/src/com/redhat/thermostat/common/Constants.java	Tue Nov 22 13:36:10 2011 -0500
+++ b/src/com/redhat/thermostat/common/Constants.java	Wed Nov 23 14:07:31 2011 -0500
@@ -15,7 +15,6 @@
     public static final int EXIT_UNABLE_TO_READ_CONFIG = 3;
 
     public static final String THERMOSTAT_DB = "thermostat";
-    public static final String MONGO_URL = "mongodb://127.0.0.1";
 
     public static final String AGENT_CONFIG_COLLECTION_NAME = "agent-configs";
     public static final String AGENT_ID = "agent-id";