package gr.grnet.aquarium.message.avro
-import gr.grnet.aquarium.charging.state.UserStateBootstrap
import gr.grnet.aquarium.computation.BillingMonthInfo
-import gr.grnet.aquarium.event.{CreditsModel, DetailsModel}
+import gr.grnet.aquarium.event.DetailsModel
import gr.grnet.aquarium.message.avro.gen._
-import java.{util ⇒ ju}
-import org.apache.avro.generic.GenericData
import scala.collection.JavaConverters.mapAsJavaMapConverter
import scala.collection.JavaConverters.seqAsJavaListConverter
-
+import scala.Predef.Map
+import gr.grnet.aquarium.policy.ResourceType
+import gr.grnet.aquarium.util.date.TimeHelpers
+import gr.grnet.aquarium.Real
+import gr.grnet.aquarium.util.JavaFactory.{newJList, newJMap}
/**
* Provides helper methods that construct avro messages.
*
object MessageFactory {
def anyValueMsgOfBoolean(x: Boolean) = {
val av = new AnyValueMsg
- av.setAnyValue(x: java.lang.Boolean)
+ av.setAnyValue(java.lang.Boolean.valueOf(x))
av
}
av
}
- def newEffectiveUnitPriceMsg(unitPrice: Double, whenOpt: Option[CronSpecTupleMsg] = None) = {
+ def anyValueMsgOfList(l: java.util.List[AnyValueMsg]) = {
+ val av = new AnyValueMsg
+ av.setAnyValue(l)
+ av
+ }
+
+ def newEffectiveUnitPriceMsg(
+ unitPrice: String,
+ whenOpt: Option[CronSpecTupleMsg]
+ ): EffectiveUnitPriceMsg = {
EffectiveUnitPriceMsg.newBuilder().
setUnitPrice(unitPrice).
setWhen(whenOpt.getOrElse(null)).
build()
}
+ def newEffectiveUnitPriceMsg(
+ unitPrice: Double,
+ whenOpt: Option[CronSpecTupleMsg]
+ ): EffectiveUnitPriceMsg = {
+ newEffectiveUnitPriceMsg(unitPrice.toString, whenOpt)
+ }
+
def newEffectivePriceTableMsg(priceOverrides: EffectiveUnitPriceMsg*) = {
EffectivePriceTableMsg.newBuilder().
setPriceOverrides(priceOverrides.asJava).
build()
}
+ def newResourceTypeMsg(model: ResourceType): ResourceTypeMsg = {
+ newResourceTypeMsg(model.name, model.unit, model.chargingBehavior)
+ }
+
def newResourceTypeMsgs(rts: ResourceTypeMsg*) = {
rts.asJava
}
+// def newResourceTypeMsgsMap(rts: ResourceTypeMsg*): java.util.Map[String, ResourceTypeMsg] = {
+// rts.map(rt ⇒ (rt.getName, rt)).toMap.asJava
+// }
+
+ def newResourceTypeMsgsMap(resourceTypes: Map[String, ResourceType]): java.util.Map[String, ResourceTypeMsg] = {
+ resourceTypes.map(rtt ⇒ (rtt._1, newResourceTypeMsg(rtt._2))).asJava
+ }
+
def newChargingBehaviorMsgs(cbs: String*) = {
cbs.asJava
}
role: String,
eventVersion: String,
eventType: String,
- details: DetailsModel.Type = newDetails()
+ details: DetailsModel.Type = newDetails(),
+ inStoreID: String = null
) = {
IMEventMsg.newBuilder().
setOriginalID(originalID).
setEventVersion(eventVersion).
setEventType(eventType).
setDetails(details).
+ setInStoreID(inStoreID).
build()
}
def newWalletEntryMsg(
userID: String,
- sumOfCreditsToSubtract: CreditsModel.Type,
- oldTotalCredits: CreditsModel.Type,
- newTotalCredits: CreditsModel.Type,
+ sumOfCreditsToSubtract: String,
+ oldTotalCredits: String,
+ newTotalCredits: String,
whenComputedMillis: Long,
referenceStartMillis: Long,
referenceStopMillis: Long,
billingYear: Int,
billingMonth: Int,
billingMonthDay: Int,
- chargeslots: ju.List[ChargeslotMsg],
- resourceEvents: ju.List[ResourceEventMsg],
+ chargeslots: java.util.List[ChargeslotMsg],
+ resourceEvents: java.util.List[ResourceEventMsg],
resourceType: ResourceTypeMsg,
isSynthetic: Boolean
): WalletEntryMsg = {
WalletEntryMsg.newBuilder().
setUserID(userID).
- setSumOfCreditsToSubtract(CreditsModel.toTypeInMessage(sumOfCreditsToSubtract)).
- setOldTotalCredits(CreditsModel.toTypeInMessage(oldTotalCredits)).
- setNewTotalCredits(CreditsModel.toTypeInMessage(newTotalCredits)).
+ setSumOfCreditsToSubtract(sumOfCreditsToSubtract).
+ setOldTotalCredits(oldTotalCredits).
+ setNewTotalCredits(newTotalCredits).
setWhenComputedMillis(whenComputedMillis).
setReferenceStartMillis(referenceStartMillis).
setReferenceStopMillis(referenceStopMillis).
def newResourceInstanceChargingStateMsg(
details: DetailsModel.Type,
- previousEvents: ju.List[ResourceEventMsg],
- implicitlyIssuedStartEvents: ju.List[ResourceEventMsg],
- oldAccumulatingAmount: Double,
- accumulatingAmount: Double,
- previousValue: Double,
- currentValue: Double
+ previousEvents: java.util.List[ResourceEventMsg],
+ implicitlyIssuedStartEvents: java.util.List[ResourceEventMsg],
+ oldAccumulatingAmount: String,
+ accumulatingAmount: String,
+ previousValue: String,
+ currentValue: String,
+ clientID: String,
+ resource: String,
+ instanceID: String
): ResourceInstanceChargingStateMsg = {
val msg = new ResourceInstanceChargingStateMsg
msg.setAccumulatingAmount(accumulatingAmount)
msg.setPreviousValue(previousValue)
msg.setCurrentValue(currentValue)
+ msg.setClientID(clientID)
+ msg.setResource(resource)
+ msg.setInstanceID(instanceID)
msg
}
- def newEmptyUserAgreementHistoryMsg() = {
- val msg = new UserAgreementHistoryMsg
- msg.setAgreements(new ju.ArrayList[UserAgreementMsg]())
+ def newResourcesChargingStateMsg(
+ resourceName: String,
+ initialChargingDetails: DetailsModel.Type
+ ): ResourcesChargingStateMsg = {
+ val msg = new ResourcesChargingStateMsg
+ msg.setResource(resourceName)
+ msg.setDetails(initialChargingDetails)
+ msg.setStateOfResourceInstance(newJMap)
msg
}
- def newInitialUserAgreementHistoryMsg(initialAgreement: UserAgreementMsg) = {
+ def newEmptyUserAgreementHistoryMsg() = {
val msg = new UserAgreementHistoryMsg
- val list = new GenericData.Array[UserAgreementMsg](1, initialAgreement.getSchema)
- list.add(initialAgreement)
- msg.setAgreements(list)
+ msg.setAgreements(newJList[UserAgreementMsg])
msg
}
+ def newInitialUserAgreementHistoryMsg(
+ initialAgreement: UserAgreementMsg,
+ originalID: String = MessageHelpers.UserAgreementHistoryMsgIDGenerator.nextUID()
+ ) = {
+ val historyMsg = new UserAgreementHistoryMsg
+ historyMsg.setOriginalID(originalID)
+ MessageHelpers.insertUserAgreement(historyMsg, initialAgreement)
+ historyMsg
+ }
+
def newUserAgreementFromIMEventMsg(
imEvent: IMEventMsg,
- id: String = MessageHelpers.UserAgreementMsgIDGenerator.nextUID()
+ agreementOriginalID: String = MessageHelpers.UserAgreementMsgIDGenerator.nextUID()
) = {
val msg = new UserAgreementMsg
- msg.setId(id)
+ msg.setId(agreementOriginalID)
+ msg.setUserID(imEvent.getUserID)
msg.setRelatedIMEventOriginalID(imEvent.getOriginalID)
msg.setRole(imEvent.getRole)
msg.setValidFromMillis(imEvent.getOccurredMillis)
- msg.setValidToMillis(Long.MaxValue)
+ msg.setValidToMillis(java.lang.Long.valueOf(java.lang.Long.MAX_VALUE))
msg.setFullPriceTableRef(null) // get from current (= @imEvent.getOccurredMillis) policy
+ msg.setOccurredMillis(java.lang.Long.valueOf(TimeHelpers.nowMillis()))
+ msg.setRelatedIMEventMsg(imEvent)
+
+ msg
+ }
+ def newUserAgreementHistoryMsg(
+ userID: String,
+ originalID: String = MessageHelpers.UserAgreementHistoryMsgIDGenerator.nextUID()
+ ): UserAgreementHistoryMsg = {
+ val msg = new UserAgreementHistoryMsg
+ msg.setOriginalID(originalID)
+ msg.setUserID(userID)
+ msg.setAgreements(newJList)
msg
}
- def newWalletEntriesMsg(entries: ju.List[WalletEntryMsg] = new ju.ArrayList[WalletEntryMsg]()) = {
+ def newWalletEntriesMsg(entries: java.util.List[WalletEntryMsg] = newJList[WalletEntryMsg]) = {
val msg = new WalletEntriesMsg
msg.setEntries(entries)
msg
setParentID(null).
setValidFromMillis(millis).
setValidToMillis(Long.MaxValue).
- setChargingBehaviors(new ju.ArrayList[String]()).
- setResourceTypes(new ju.ArrayList[ResourceTypeMsg]()).
- setRoleMapping(new ju.HashMap[String, FullPriceTableMsg]()).
+ setChargingBehaviors(newJList).
+ setResourceMapping(newJMap).
+ setRoleMapping(newJMap).
build()
}
- def createInitialUserStateMsg(
- usb: UserStateBootstrap,
- occurredMillis: Long
+ /**
+ * Creates the initial (from the UserActor's perspective) user state.
+ * This may not be the very first user state ever, so we do not set `isFirst`.
+ * @param userID
+ * @param initialCredits
+ * @param occurredMillis
+ * @param originalID
+ * @return
+ */
+ def newInitialUserStateMsg(
+ userID: String,
+ initialCredits: Real,
+ occurredMillis: Long,
+ originalID: String = MessageHelpers.UserStateMsgIDGenerator.nextUID()
): UserStateMsg = {
val bmi = BillingMonthInfo.fromMillis(occurredMillis)
val msg = new UserStateMsg
- msg.setUserID(usb.userID)
- msg.setOccurredMillis(occurredMillis)
- msg.setBillingYear(bmi.year)
- msg.setBillingMonth(bmi.month)
- msg.setBillingMonthDay(bmi.day)
- msg.setTotalCredits(CreditsModel.toTypeInMessage(usb.initialCredits))
- msg.setAgreementHistory(newInitialUserAgreementHistoryMsg(usb.initialAgreement.msg))
- msg.setLatestUpdateMillis(occurredMillis)
+ msg.setUserID(userID)
+ msg.setOccurredMillis(java.lang.Long.valueOf(occurredMillis))
+ msg.setBillingYear(java.lang.Integer.valueOf(bmi.year))
+ msg.setBillingMonth(java.lang.Integer.valueOf(bmi.month))
+ msg.setBillingMonthDay(java.lang.Integer.valueOf(bmi.day))
+ msg.setTotalCredits(Real.toMsgField(initialCredits))
+ msg.setLatestUpdateMillis(java.lang.Long.valueOf(occurredMillis))
msg.setInStoreID(null)
- msg.setOriginalID("") // FIXME get a counter here
-
+ msg.setOriginalID(originalID)
+ msg.setStateOfResources(newJMap)
+ msg.setWalletEntries(newJList)
+ msg.setUserAgreementHistory(newUserAgreementHistoryMsg(userID))
+ msg.setStateOfResources(newJMap)
msg
}
-
}