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}
/**
*
@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
}
- 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 ⇒
EnvKeys.eventBus,
EnvKeys.restService,
EnvKeys.rabbitMQService,
- EnvKeys.storeWatcherService
+ EnvKeys.storeWatcherService,
+ EnvKeys.rabbitMQProducer
)
object EnvKeys {