Cache resource mapping
[aquarium] / src / main / scala / gr / grnet / aquarium / Aquarium.scala
index e9c2041..19c1c71 100644 (file)
@@ -56,6 +56,8 @@ import java.util.concurrent.atomic.AtomicBoolean
 import org.slf4j.{LoggerFactory, Logger}
 import gr.grnet.aquarium.event.CreditsModel
 import gr.grnet.aquarium.charging.state.UserStateBootstrap
+import java.util.{Map ⇒ JMap}
+import java.util.{HashMap ⇒ JHashMap}
 
 /**
  *
@@ -68,6 +70,9 @@ final class Aquarium(env: Env) extends Lifecycle with Loggable {
 
   @volatile private[this] var _chargingBehaviorMap = Map[String, ChargingBehavior]()
 
+  // Caching value for the latest resource mapping
+  @volatile private[this] var _resourceMapping = apply(EnvKeys.defaultPolicyMsg).getResourceMapping
+
   private[this] lazy val cachingPolicyStore = new CachingPolicyStore(
     apply(EnvKeys.defaultPolicyMsg),
     apply(EnvKeys.storeProvider).policyStore
@@ -232,17 +237,50 @@ final class Aquarium(env: Env) extends Lifecycle with Loggable {
 
   }
 
-  def currentResourceTypesMap: Map[String, ResourceType] = {
-    val policyMspOpt = policyStore.loadPolicyAt(TimeHelpers.nowMillis())
+  /**
+   * @deprecated Use `currentResourceMapping` instead
+   */
+  def resourceMappingAtMillis(millis: Long): JMap[String, ResourceTypeMsg] = {
+    val policyMspOpt = policyStore.loadPolicyAt(millis)
     if(policyMspOpt.isEmpty) {
-      throw new AquariumInternalError("Not even the default policy found")
+      throw new AquariumInternalError(
+        "Cannot get resource mapping. Not even the default policy found for time %s",
+        TimeHelpers.toYYYYMMDDHHMMSSSSS(millis)
+      )
     }
 
     val policyMsg = policyMspOpt.get
-    // TODO optimize
-    ModelFactory.newPolicyModel(policyMsg).resourceTypesMap
+    policyMsg.getResourceMapping
   }
 
+  /**
+   * Provides the current resource mapping. This value is cached.
+   *
+   * NOTE: The assumption is that the resource mapping is always updated with new keys,
+   *       that is we allow only the addition of new resource types.
+   */
+  def currentResourceMapping = {
+    this._resourceMapping synchronized this._resourceMapping
+  }
+
+  //  def resourceTypesMapAtMillis(millis: Long): Map[String, ResourceType] = {
+//    val policyMspOpt = policyStore.loadPolicyAt(millis)
+//    if(policyMspOpt.isEmpty) {
+//      throw new AquariumInternalError(
+//        "Cannot get resource types map. Not even the default policy found for time %s",
+//        TimeHelpers.toYYYYMMDDHHMMSSSSS(millis)
+//      )
+//    }
+//
+//    val policyMsg = policyMspOpt.get
+//    // TODO optimize
+//    ModelFactory.newPolicyModel(policyMsg).resourceTypesMap
+//  }
+//
+//  def currentResourceTypesMap: Map[String, ResourceType] = {
+//    resourceTypesMapAtMillis(TimeHelpers.nowMillis())
+//  }
+
   def unsafeValidPolicyModelAt(referenceTimeMillis: Long): PolicyModel = {
     policyStore.loadPolicyAt(referenceTimeMillis) match {
       case None ⇒
@@ -487,7 +525,8 @@ object Aquarium {
     EnvKeys.eventBus,
     EnvKeys.restService,
     EnvKeys.rabbitMQService,
-    EnvKeys.storeWatcherService
+    EnvKeys.storeWatcherService,
+    EnvKeys.rabbitMQProducer
   )
 
   object EnvKeys {