X-Git-Url: https://code.grnet.gr/git/aquarium/blobdiff_plain/48ea54e86403e6b311ea769aa206956b322a2029..b917bb616c4d510bb36f3dcf987728e14a9858d2:/src/main/scala/gr/grnet/aquarium/message/avro/MessageFactory.scala?ds=sidebyside diff --git a/src/main/scala/gr/grnet/aquarium/message/avro/MessageFactory.scala b/src/main/scala/gr/grnet/aquarium/message/avro/MessageFactory.scala index 09e8459..90f196e 100644 --- a/src/main/scala/gr/grnet/aquarium/message/avro/MessageFactory.scala +++ b/src/main/scala/gr/grnet/aquarium/message/avro/MessageFactory.scala @@ -35,9 +35,24 @@ 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.message.avro.gen._ +import java.{util ⇒ ju} +import java.util.{ArrayList ⇒ JArrayList} +import java.util.{List ⇒ JList} +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.charging.bill._ +import gr.grnet.aquarium.charging.bill.ChargeEntry +import gr.grnet.aquarium.policy.ResourceType +import gr.grnet.aquarium.charging.state.UserStateBootstrap +import gr.grnet.aquarium.charging.bill.ResourceEntry +import gr.grnet.aquarium.charging.bill.ServiceEntry /** * Provides helper methods that construct avro messages. @@ -45,6 +60,24 @@ import scala.collection.JavaConverters.seqAsJavaListConverter * @author Christos KK Loverdos */ object MessageFactory { + def anyValueMsgOfBoolean(x: Boolean) = { + val av = new AnyValueMsg + av.setAnyValue(java.lang.Boolean.valueOf(x)) + av + } + + def anyValueMsgOfString(x: String) = { + val av = new AnyValueMsg + av.setAnyValue(x) + av + } + + def anyValueMsgOfList(l: JArrayList[AnyValueMsg]) = { + val av = new AnyValueMsg + av.setAnyValue(l) + av + } + def newEffectiveUnitPriceMsg(unitPrice: Double, whenOpt: Option[CronSpecTupleMsg] = None) = { EffectiveUnitPriceMsg.newBuilder(). setUnitPrice(unitPrice). @@ -64,19 +97,19 @@ object MessageFactory { build() } - def newSelectorValueMsg(map: Map[CharSequence, SelectorValueMsg]): SelectorValueMsg = { + def newSelectorValueMsg(map: Map[String, SelectorValueMsg]): SelectorValueMsg = { SelectorValueMsg.newBuilder(). setSelectorValue(map.asJava). build() } - def newSelectorValueMsg(pairs: (CharSequence, SelectorValueMsg)*): SelectorValueMsg = { + def newSelectorValueMsg(pairs: (String, SelectorValueMsg)*): SelectorValueMsg = { SelectorValueMsg.newBuilder(). setSelectorValue(Map(pairs:_*).asJava). build() } - def newFullPriceTableMsg(perResource: (CharSequence, Map[CharSequence, SelectorValueMsg])*) = { + def newFullPriceTableMsg(perResource: (String, Map[String, SelectorValueMsg])*) = { FullPriceTableMsg.newBuilder(). setPerResource( Map((for((k, v) ← perResource) yield (k, v.asJava)):_*).asJava @@ -84,15 +117,15 @@ object MessageFactory { build() } - def newRoleMappingMsg(map: Map[CharSequence, FullPriceTableMsg]): java.util.Map[CharSequence, FullPriceTableMsg] = { + def newRoleMappingMsg(map: Map[String, FullPriceTableMsg]): java.util.Map[String, FullPriceTableMsg] = { map.asJava } - def newRoleMappingMsg(pairs: (CharSequence, FullPriceTableMsg)*): java.util.Map[CharSequence, FullPriceTableMsg] = { + def newRoleMappingMsg(pairs: (String, FullPriceTableMsg)*): java.util.Map[String, FullPriceTableMsg] = { Map(pairs:_*).asJava } - def newResourceTypeMsg(name: CharSequence, unit: CharSequence, chargingBehavior: CharSequence) = { + def newResourceTypeMsg(name: String, unit: String, chargingBehavior: String) = { ResourceTypeMsg.newBuilder(). setName(name). setUnit(unit). @@ -100,20 +133,289 @@ object MessageFactory { build() } + def newResourceTypeMsg(model: ResourceType): ResourceTypeMsg = { + newResourceTypeMsg(model.name, model.unit, model.chargingBehavior) + } + def newResourceTypeMsgs(rts: ResourceTypeMsg*) = { rts.asJava } - def newChargingBehaviorMsgs(cbs: CharSequence*) = { - val ret = cbs.asJava - println(cbs.toList) - println("========") - var i = 0 - while(i < ret.size()) { - println(ret.get(i)) - i += 1 - } +// 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 + } + + def newBooleanDetail(name: String, value: Boolean) = { + (name, anyValueMsgOfBoolean(value)) + } + + def newStringDetail(name: String, value: String) = { + (name, anyValueMsgOfString(value)) + } + + def newDetails(details: (String, AnyValueMsg)*): DetailsModel.Type = { + DetailsModel.fromScalaTuples(details:_*) + } + + def newResourceEventMsg( + originalID: String, + occurredMillis: Long, + receivedMillis: Long, + userID: String, + clientID: String, + resource: String, + instanceID: String, + value: String, + eventVersion: String, + details: DetailsModel.Type = newDetails(), + inStoreID: String = null + ) = { + ResourceEventMsg.newBuilder(). + setOriginalID(originalID). + setOccurredMillis(occurredMillis). + setReceivedMillis(receivedMillis). + setUserID(userID). + setClientID(clientID). + setResource(resource). + setInstanceID(instanceID). + setValue(value). + setEventVersion(eventVersion). + setDetails(details). + setInStoreID(inStoreID). + build() + } + + def newIMEventMsg( + originalID: String, + occurredMillis: Long, + receivedMillis: Long, + userID: String, + clientID: String, + isActive: Boolean, + role: String, + eventVersion: String, + eventType: String, + details: DetailsModel.Type = newDetails(), + inStoreID: String = null + ) = { + IMEventMsg.newBuilder(). + setOriginalID(originalID). + setInStoreID(null). + setOccurredMillis(occurredMillis). + setReceivedMillis(receivedMillis). + setUserID(userID). + setClientID(clientID). + setIsActive(isActive). + setRole(role). + setEventVersion(eventVersion). + setEventType(eventType). + setDetails(details). + setInStoreID(inStoreID). + build() + } + + def newWalletEntryMsg( + userID: String, + sumOfCreditsToSubtract: CreditsModel.Type, + oldTotalCredits: CreditsModel.Type, + newTotalCredits: CreditsModel.Type, + whenComputedMillis: Long, + referenceStartMillis: Long, + referenceStopMillis: Long, + billingYear: Int, + billingMonth: Int, + billingMonthDay: Int, + chargeslots: ju.List[ChargeslotMsg], + resourceEvents: ju.List[ResourceEventMsg], + resourceType: ResourceTypeMsg, + isSynthetic: Boolean + ): WalletEntryMsg = { + WalletEntryMsg.newBuilder(). + setUserID(userID). + setSumOfCreditsToSubtract(CreditsModel.toTypeInMessage(sumOfCreditsToSubtract)). + setOldTotalCredits(CreditsModel.toTypeInMessage(oldTotalCredits)). + setNewTotalCredits(CreditsModel.toTypeInMessage(newTotalCredits)). + setWhenComputedMillis(whenComputedMillis). + setReferenceStartMillis(referenceStartMillis). + setReferenceStopMillis(referenceStopMillis). + setBillingYear(billingYear). + setBillingMonth(billingMonth). + setBillingMonthDay(billingMonthDay). + setChargeslots(chargeslots). + setResourceEvents(resourceEvents). + setResourceType(resourceType). + setIsSynthetic(isSynthetic). + build() + } + + def newResourceInstanceChargingStateMsg( + details: DetailsModel.Type, + previousEvents: ju.List[ResourceEventMsg], + implicitlyIssuedStartEvents: ju.List[ResourceEventMsg], + oldAccumulatingAmount: Double, + accumulatingAmount: Double, + previousValue: Double, + currentValue: Double, + clientID: String, + resource: String, + instanceID: String + ): ResourceInstanceChargingStateMsg = { - ret + val msg = new ResourceInstanceChargingStateMsg + msg.setDetails(details) + msg.setPreviousEvents(previousEvents) + msg.setImplicitlyIssuedStartEvents(implicitlyIssuedStartEvents) + msg.setOldAccumulatingAmount(java.lang.Double.valueOf(oldAccumulatingAmount)) + msg.setAccumulatingAmount(java.lang.Double.valueOf(accumulatingAmount)) + msg.setPreviousValue(java.lang.Double.valueOf(previousValue)) + msg.setCurrentValue(java.lang.Double.valueOf(currentValue)) + msg.setClientID(clientID) + msg.setResource(resource) + msg.setInstanceID(instanceID) + msg + } + + def newEmptyUserAgreementHistoryMsg() = { + val msg = new UserAgreementHistoryMsg + msg.setAgreements(new ju.ArrayList[UserAgreementMsg]()) + msg + } + + def newInitialUserAgreementHistoryMsg(initialAgreement: UserAgreementMsg) = { + val msg = new UserAgreementHistoryMsg + val list = new JArrayList[UserAgreementMsg]() + list.add(initialAgreement) + msg.setAgreements(list) + msg + } + + def newUserAgreementFromIMEventMsg( + imEvent: IMEventMsg, + id: String = MessageHelpers.UserAgreementMsgIDGenerator.nextUID() + ) = { + + val msg = new UserAgreementMsg + + msg.setId(id) + msg.setUserID(imEvent.getUserID) + msg.setRelatedIMEventOriginalID(imEvent.getOriginalID) + msg.setRole(imEvent.getRole) + msg.setValidFromMillis(imEvent.getOccurredMillis) + msg.setValidToMillis(java.lang.Long.valueOf(java.lang.Long.MAX_VALUE)) + msg.setFullPriceTableRef(null) // get from current (= @imEvent.getOccurredMillis) policy + + msg + } + + def newWalletEntriesMsg(entries: ju.List[WalletEntryMsg] = new ju.ArrayList[WalletEntryMsg]()) = { + val msg = new WalletEntriesMsg + msg.setEntries(entries) + msg + } + + def newDummyPolicyMsgAt(millis: Long) : PolicyMsg = { + PolicyMsg.newBuilder(). + setOriginalID(""). + setInStoreID(null). + setParentID(null). + setValidFromMillis(millis). + setValidToMillis(Long.MaxValue). + setChargingBehaviors(new ju.ArrayList[String]()). + setResourceTypes(new ju.ArrayList[ResourceTypeMsg]()). + setRoleMapping(new ju.HashMap[String, FullPriceTableMsg]()). + build() + } + + def createInitialUserStateMsg( + usb: UserStateBootstrap, + defaultResourceTypesMap:Map[String, ResourceType], + occurredMillis: Long + ): UserStateMsg = { + + val bmi = BillingMonthInfo.fromMillis(occurredMillis) + val msg = new UserStateMsg + + msg.setUserID(usb.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(java.lang.Double.valueOf(CreditsModel.toTypeInMessage(usb.initialCredits))) + msg.setAgreementHistory(newInitialUserAgreementHistoryMsg(usb.initialAgreement.msg)) + msg.setLatestUpdateMillis(java.lang.Long.valueOf(occurredMillis)) + msg.setInStoreID(null) + msg.setOriginalID("") // FIXME get a counter here + msg.setResourceTypesMap(newResourceTypeMsgsMap(defaultResourceTypesMap)) + msg.setStateOfResources(new java.util.HashMap()) + msg.setWalletEntries(new java.util.ArrayList[WalletEntryMsg]()) + msg + } + + def toJavaList[A](l:List[A]) : java.util.List[A] = { + val al = new java.util.ArrayList[A]() + l.foreach(al.add(_)) + al + } + + def chargeEntryMsg(chargeEntry:ChargeEntry) : ChargeEntryMsg = { + val msg = new ChargeEntryMsg + msg.setId(chargeEntry.id) + msg.setUnitPrice(chargeEntry.unitPrice) + msg.setStartTime(chargeEntry.startTime) + msg.setEndTime(chargeEntry.endTime) + msg.setElapsedTime(chargeEntry.elapsedTime) + msg.setUnits(chargeEntry.units) + msg.setCredits(chargeEntry.credits) + msg + } + + def eventEntryMsg(eventEntry:EventEntry) : EventEntryMsg = { + val msg = new EventEntryMsg + msg.setEventType(eventEntry.eventType) + msg.setDetails(toJavaList(eventEntry.details.map(chargeEntryMsg(_)))) + msg + } + + def resourceEntryMsg(resourceEntry:ResourceEntry) : ResourceEntryMsg = { + val msg = new ResourceEntryMsg + msg.setResourceName(resourceEntry.resourceName) + msg.setResourceType(resourceEntry.resourceType) + msg.setUnitName(resourceEntry.unitName) + msg.setTotalCredits(resourceEntry.totalCredits) + msg.setTotalElapsedTime(resourceEntry.totalElapsedTime) + msg.setTotalUnits(resourceEntry.totalUnits) + msg.setDetails(toJavaList(resourceEntry.details.map(eventEntryMsg(_)))) + msg + } + + def createServiceEntryMsg(serviceEntry:ServiceEntry) : ServiceEntryMsg = { + val msg = new ServiceEntryMsg + msg.setServiceName(serviceEntry.serviceName) + msg.setTotalCredits(serviceEntry.totalCredits) + msg.setTotalElapsedTime(serviceEntry.totalElapsedTime) + msg.setTotalUnits(serviceEntry.totalUnits) + msg.setUnitName(serviceEntry.unitName) + msg.setDetails(toJavaList(serviceEntry.details.map(resourceEntryMsg(_)))) + msg + } + def createBillEntryMsg(billEntry:BillEntry) : BillEntryMsg = { + val msg = new BillEntryMsg + msg.setId(billEntry.id) + msg.setUserID(billEntry.userID) + msg.setStatus(billEntry.status) + msg.setRemainingCredits(billEntry.remainingCredits) + msg.setDeductedCredits(billEntry.deductedCredits) + msg.setStartTime(billEntry.startTime) + msg.setEndTime(billEntry.endTime) + msg.setBill(toJavaList(billEntry.bill.map(createServiceEntryMsg(_)))) + msg } }