Event refactoring
[aquarium] / src / main / scala / gr / grnet / aquarium / store / PolicyStore.scala
index 3b13156..f587271 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2011 GRNET S.A. All rights reserved.
+ * Copyright 2011-2012 GRNET S.A. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or
  * without modification, are permitted provided that the following
 
 package gr.grnet.aquarium.store
 
+import scala.collection.immutable
+import collection.immutable.SortedMap
+import gr.grnet.aquarium.logic.accounting.dsl.{DSL, DSLPolicy, Timeslot}
 import com.ckkloverdos.maybe.Maybe
-import gr.grnet.aquarium.logic.events.PolicyEntry
+import gr.grnet.aquarium.event.model.PolicyEntry
 
 /**
  * A store for serialized policy entries.
@@ -49,15 +52,48 @@ trait PolicyStore {
    * Load all accounting policies valid after the specified time instance.
    * The results are returned sorted by PolicyEntry.validFrom
    */
-  def loadPolicies(after: Long): List[PolicyEntry]
+  def loadPolicyEntriesAfter(after: Long): List[PolicyEntry]
+
+  def loadAndSortPolicyEntriesWithin(fromMillis: Long, toMillis: Long): SortedMap[Timeslot, PolicyEntry] = {
+    val all = loadPolicyEntriesAfter(0L)
+    val filtered = all.filter { policyEntry ⇒
+      policyEntry.validFrom <= fromMillis &&
+      policyEntry.validTo   >= toMillis
+    }
+
+    (immutable.SortedMap[Timeslot, PolicyEntry]() /: filtered) { (map, policyEntry) ⇒
+      map.updated(policyEntry.fromToTimeslot, policyEntry)
+    }
+  }
+  
+  def loadAndSortPoliciesWithin(fromMillis: Long, toMillis: Long, dsl: DSL): SortedMap[Timeslot, DSLPolicy] = {
+    for((timeslot, policyEntry) <- loadAndSortPolicyEntriesWithin(fromMillis, toMillis))
+      yield (timeslot, dsl.parse(policyEntry.policyYAML))
+  }
+  
+  def loadValidPolicyEntryAt(atMillis: Long): Option[PolicyEntry] = {
+    loadPolicyEntriesAfter(0L).find { policyEntry ⇒
+      policyEntry.fromToTimeslot.containsTimeInMillis(atMillis)
+    }
+  }
+  
+  def loadValidPolicyAt(atMillis: Long, dsl: DSL): Option[DSLPolicy] = {
+    loadValidPolicyEntryAt(atMillis).map(policyEntry ⇒ dsl.parse(policyEntry.policyYAML))
+  }
 
   /**
    * Store an accounting policy.
    */
-  def storePolicy(policy: PolicyEntry): Maybe[RecordID]
+  def storePolicyEntry(policy: PolicyEntry): Maybe[RecordID]
+
+  /**
+   * Updates the policy record whose id is equal to the id
+   * of the provided policy entry.
+   */
+  def updatePolicyEntry(policy: PolicyEntry): Unit
 
   /**
-   * Updates the policy record whose id
+   * Find a policy by its unique id
    */
-  def updatePolicy(policy: PolicyEntry): Unit
+  def findPolicyEntry(id: String): Maybe[PolicyEntry]
 }
\ No newline at end of file