Now loading the default actor provider from properties.
authorChristos KK Loverdos <loverdos@gmail.com>
Fri, 9 Dec 2011 11:41:53 +0000 (13:41 +0200)
committerChristos KK Loverdos <loverdos@gmail.com>
Fri, 9 Dec 2011 11:41:53 +0000 (13:41 +0200)
logic/src/main/resources/aquarium.properties [new file with mode: 0644]
logic/src/main/scala/gr/grnet/aquarium/Configurable.scala [new file with mode: 0644]
logic/src/main/scala/gr/grnet/aquarium/MasterConf.scala

diff --git a/logic/src/main/resources/aquarium.properties b/logic/src/main/resources/aquarium.properties
new file mode 100644 (file)
index 0000000..c0acba2
--- /dev/null
@@ -0,0 +1,4 @@
+version = 0.0.2-SNAPSHOT
+
+# Actor subsystem
+actor.provider.class=gr.grnet.aquarium.actor.SimpleLocalActorProvider
\ No newline at end of file
diff --git a/logic/src/main/scala/gr/grnet/aquarium/Configurable.scala b/logic/src/main/scala/gr/grnet/aquarium/Configurable.scala
new file mode 100644 (file)
index 0000000..a5042a7
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2011 GRNET S.A. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ *   1. Redistributions of source code must retain the above
+ *      copyright notice, this list of conditions and the following
+ *      disclaimer.
+ *
+ *   2. Redistributions in binary form must reproduce the above
+ *      copyright notice, this list of conditions and the following
+ *      disclaimer in the documentation and/or other materials
+ *      provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and
+ * documentation are those of the authors and should not be
+ * interpreted as representing official policies, either expressed
+ * or implied, of GRNET S.A.
+ */
+
+package gr.grnet.aquarium
+
+import com.ckkloverdos.props.Props
+
+/**
+ * 
+ * @author Christos KK Loverdos <loverdos@gmail.com>.
+ */
+trait Configurable {
+  def configure(props: Props): Unit
+}
\ No newline at end of file
index d5f00a4..145310c 100644 (file)
 
 package gr.grnet.aquarium
 
+import actor.ActorProvider
 import com.ckkloverdos.resource._
 import com.ckkloverdos.sys.SysProp
-import com.ckkloverdos.maybe.{Failed, Just, NoVal}
+import com.ckkloverdos.props.Props
+import com.ckkloverdos.maybe.{Maybe, Failed, Just, NoVal}
+import com.ckkloverdos.convert.Converters.{DefaultConverters => TheDefaultConverters}
 
 /**
  * The master configurator. Responsible to load all of application configuration and provide the relevant services.
  *
  * @author Christos KK Loverdos <loverdos@gmail.com>.
  */
-class MasterConf(masterConf: StreamResource) {
+class MasterConf(props: Props) {
+  import MasterConf.Keys
+
+  private[this] val _actorProvider: ActorProvider = {
+    val className = props.getEx(Keys.actor_provider_class)
+    val actorProvider = defaultClassLoader.loadClass(className).newInstance().asInstanceOf[ActorProvider]
+    
+    actorProvider match {
+      case configurable: Configurable ⇒
+        configurable configure props
+    }
+
+    actorProvider
+  }
+
+  def defaultClassLoader = Thread.currentThread().getContextClassLoader
+  
+  def actorProvider = _actorProvider
 }
 
 object MasterConf {
+  implicit val DefaultConverters = TheDefaultConverters
+
   val MasterConfName = "aquarium.properties"
 
   /**
@@ -108,5 +130,42 @@ object MasterConf {
     }
   }
 
-  lazy val MasterConf = new MasterConf(MasterConfResource)
+  lazy val MasterConfProps = {
+    val maybeProps = Props apply MasterConfResource
+    maybeProps match {
+      case Just(props) ⇒
+        props
+      case NoVal ⇒
+        throw new RuntimeException("Could not load master configuration file: %s".format(MasterConfName))
+      case Failed(e, m) ⇒
+        throw new RuntimeException(m, e)
+    }
+  }
+
+  lazy val MasterConf = {
+    Maybe(new MasterConf(MasterConfProps)) match {
+      case Just(masterConf) ⇒
+        masterConf
+      case NoVal ⇒
+        throw new RuntimeException("Could not initialize master configuration file: %s".format(MasterConfName))
+      case Failed(e, m) ⇒
+        throw new RuntimeException(m, e)
+    }
+  }
+
+  /**
+   * Defines the names of all the known keys inside the master properties file.
+   */
+  final object Keys {
+    /**
+     * The Aquarium version. Will be reported in any due occasion.
+     */
+    final val version = "version"
+
+    /**
+     * The fully qualified name of the class that implements the `ActorProvider`.
+     * Will be instantiated reflectively and should have a public default constructor.
+     */
+    final val actor_provider_class = "actor.provider.class"
+  }
 }
\ No newline at end of file