2 * Copyright 2011-2012 GRNET S.A. All rights reserved.
4 * Redistribution and use in source and binary forms, with or
5 * without modification, are permitted provided that the following
8 * 1. Redistributions of source code must retain the above
9 * copyright notice, this list of conditions and the following
12 * 2. Redistributions in binary form must reproduce the above
13 * copyright notice, this list of conditions and the following
14 * disclaimer in the documentation and/or other materials
15 * provided with the distribution.
17 * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
18 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
21 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
24 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
25 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
27 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 * POSSIBILITY OF SUCH DAMAGE.
30 * The views and conclusions contained in the software and
31 * documentation are those of the authors and should not be
32 * interpreted as representing official policies, either expressed
33 * or implied, of GRNET S.A.
36 package gr.grnet.aquarium.message.avro
38 import gr.grnet.aquarium.charging.state.UserStateBootstrap
39 import gr.grnet.aquarium.computation.BillingMonthInfo
40 import gr.grnet.aquarium.event.{CreditsModel, DetailsModel}
41 import gr.grnet.aquarium.message.avro.gen._
42 import java.{util ⇒ ju}
43 import java.util.{ArrayList ⇒ JArrayList}
44 import scala.collection.JavaConverters.mapAsJavaMapConverter
45 import scala.collection.JavaConverters.seqAsJavaListConverter
46 import scala.Predef.Map
47 import gr.grnet.aquarium.policy.ResourceType
48 import gr.grnet.aquarium.charging.state.UserStateBootstrap
49 import gr.grnet.aquarium.util.date.TimeHelpers
53 * Provides helper methods that construct avro messages.
55 * @author Christos KK Loverdos <loverdos@gmail.com>
57 object MessageFactory {
58 def anyValueMsgOfBoolean(x: Boolean) = {
59 val av = new AnyValueMsg
60 av.setAnyValue(java.lang.Boolean.valueOf(x))
64 def anyValueMsgOfString(x: String) = {
65 val av = new AnyValueMsg
70 def anyValueMsgOfList(l: JArrayList[AnyValueMsg]) = {
71 val av = new AnyValueMsg
76 def newEffectiveUnitPriceMsg(unitPrice: Double, whenOpt: Option[CronSpecTupleMsg] = None) = {
77 EffectiveUnitPriceMsg.newBuilder().
78 setUnitPrice(unitPrice).
79 setWhen(whenOpt.getOrElse(null)).
83 def newEffectivePriceTableMsg(priceOverrides: EffectiveUnitPriceMsg*) = {
84 EffectivePriceTableMsg.newBuilder().
85 setPriceOverrides(priceOverrides.asJava).
89 def newSelectorValueMsg(ept: EffectivePriceTableMsg): SelectorValueMsg = {
90 SelectorValueMsg.newBuilder().
91 setSelectorValue(ept).
95 def newSelectorValueMsg(map: Map[String, SelectorValueMsg]): SelectorValueMsg = {
96 SelectorValueMsg.newBuilder().
97 setSelectorValue(map.asJava).
101 def newSelectorValueMsg(pairs: (String, SelectorValueMsg)*): SelectorValueMsg = {
102 SelectorValueMsg.newBuilder().
103 setSelectorValue(Map(pairs:_*).asJava).
107 def newFullPriceTableMsg(perResource: (String, Map[String, SelectorValueMsg])*) = {
108 FullPriceTableMsg.newBuilder().
110 Map((for((k, v) ← perResource) yield (k, v.asJava)):_*).asJava
115 def newRoleMappingMsg(map: Map[String, FullPriceTableMsg]): java.util.Map[String, FullPriceTableMsg] = {
119 def newRoleMappingMsg(pairs: (String, FullPriceTableMsg)*): java.util.Map[String, FullPriceTableMsg] = {
123 def newResourceTypeMsg(name: String, unit: String, chargingBehavior: String) = {
124 ResourceTypeMsg.newBuilder().
127 setChargingBehaviorClass(chargingBehavior).
131 def newResourceTypeMsg(model: ResourceType): ResourceTypeMsg = {
132 newResourceTypeMsg(model.name, model.unit, model.chargingBehavior)
135 def newResourceTypeMsgs(rts: ResourceTypeMsg*) = {
139 // def newResourceTypeMsgsMap(rts: ResourceTypeMsg*): java.util.Map[String, ResourceTypeMsg] = {
140 // rts.map(rt ⇒ (rt.getName, rt)).toMap.asJava
143 def newResourceTypeMsgsMap(resourceTypes: Map[String, ResourceType]): java.util.Map[String, ResourceTypeMsg] = {
144 resourceTypes.map(rtt ⇒ (rtt._1, newResourceTypeMsg(rtt._2))).asJava
147 def newChargingBehaviorMsgs(cbs: String*) = {
151 def newBooleanDetail(name: String, value: Boolean) = {
152 (name, anyValueMsgOfBoolean(value))
155 def newStringDetail(name: String, value: String) = {
156 (name, anyValueMsgOfString(value))
159 def newDetails(details: (String, AnyValueMsg)*): DetailsModel.Type = {
160 DetailsModel.fromScalaTuples(details:_*)
163 def newResourceEventMsg(
165 occurredMillis: Long,
166 receivedMillis: Long,
172 eventVersion: String,
173 details: DetailsModel.Type = newDetails(),
174 inStoreID: String = null
176 ResourceEventMsg.newBuilder().
177 setOriginalID(originalID).
178 setOccurredMillis(occurredMillis).
179 setReceivedMillis(receivedMillis).
181 setClientID(clientID).
182 setResource(resource).
183 setInstanceID(instanceID).
185 setEventVersion(eventVersion).
187 setInStoreID(inStoreID).
193 occurredMillis: Long,
194 receivedMillis: Long,
199 eventVersion: String,
201 details: DetailsModel.Type = newDetails(),
202 inStoreID: String = null
204 IMEventMsg.newBuilder().
205 setOriginalID(originalID).
207 setOccurredMillis(occurredMillis).
208 setReceivedMillis(receivedMillis).
210 setClientID(clientID).
211 setIsActive(isActive).
213 setEventVersion(eventVersion).
214 setEventType(eventType).
216 setInStoreID(inStoreID).
220 def newWalletEntryMsg(
222 sumOfCreditsToSubtract: CreditsModel.Type,
223 oldTotalCredits: CreditsModel.Type,
224 newTotalCredits: CreditsModel.Type,
225 whenComputedMillis: Long,
226 referenceStartMillis: Long,
227 referenceStopMillis: Long,
230 billingMonthDay: Int,
231 chargeslots: ju.List[ChargeslotMsg],
232 resourceEvents: ju.List[ResourceEventMsg],
233 resourceType: ResourceTypeMsg,
235 ): WalletEntryMsg = {
236 WalletEntryMsg.newBuilder().
238 setSumOfCreditsToSubtract(CreditsModel.toTypeInMessage(sumOfCreditsToSubtract)).
239 setOldTotalCredits(CreditsModel.toTypeInMessage(oldTotalCredits)).
240 setNewTotalCredits(CreditsModel.toTypeInMessage(newTotalCredits)).
241 setWhenComputedMillis(whenComputedMillis).
242 setReferenceStartMillis(referenceStartMillis).
243 setReferenceStopMillis(referenceStopMillis).
244 setBillingYear(billingYear).
245 setBillingMonth(billingMonth).
246 setBillingMonthDay(billingMonthDay).
247 setChargeslots(chargeslots).
248 setResourceEvents(resourceEvents).
249 setResourceType(resourceType).
250 setIsSynthetic(isSynthetic).
254 def newResourceInstanceChargingStateMsg(
255 details: DetailsModel.Type,
256 previousEvents: ju.List[ResourceEventMsg],
257 implicitlyIssuedStartEvents: ju.List[ResourceEventMsg],
258 oldAccumulatingAmount: Double,
259 accumulatingAmount: Double,
260 previousValue: Double,
261 currentValue: Double,
265 ): ResourceInstanceChargingStateMsg = {
267 val msg = new ResourceInstanceChargingStateMsg
268 msg.setDetails(details)
269 msg.setPreviousEvents(previousEvents)
270 msg.setImplicitlyIssuedStartEvents(implicitlyIssuedStartEvents)
271 msg.setOldAccumulatingAmount(java.lang.Double.valueOf(oldAccumulatingAmount))
272 msg.setAccumulatingAmount(java.lang.Double.valueOf(accumulatingAmount))
273 msg.setPreviousValue(java.lang.Double.valueOf(previousValue))
274 msg.setCurrentValue(java.lang.Double.valueOf(currentValue))
275 msg.setClientID(clientID)
276 msg.setResource(resource)
277 msg.setInstanceID(instanceID)
281 def newEmptyUserAgreementHistoryMsg() = {
282 val msg = new UserAgreementHistoryMsg
283 msg.setAgreements(new ju.ArrayList[UserAgreementMsg]())
287 def newInitialUserAgreementHistoryMsg(
288 initialAgreement: UserAgreementMsg,
289 originalID: String = MessageHelpers.UserAgreementHistoryMsgIDGenerator.nextUID()
291 val historyMsg = new UserAgreementHistoryMsg
292 historyMsg.setOriginalID(originalID)
293 MessageHelpers.insertUserAgreement(historyMsg, initialAgreement)
297 def newUserAgreementFromIMEventMsg(
299 agreementOriginalID: String = MessageHelpers.UserAgreementMsgIDGenerator.nextUID()
302 val msg = new UserAgreementMsg
304 msg.setId(agreementOriginalID)
305 msg.setUserID(imEvent.getUserID)
306 msg.setRelatedIMEventOriginalID(imEvent.getOriginalID)
307 msg.setRole(imEvent.getRole)
308 msg.setValidFromMillis(imEvent.getOccurredMillis)
309 msg.setValidToMillis(java.lang.Long.valueOf(java.lang.Long.MAX_VALUE))
310 msg.setFullPriceTableRef(null) // get from current (= @imEvent.getOccurredMillis) policy
311 msg.setOccurredMillis(TimeHelpers.nowMillis())
312 msg.setRelatedIMEventMsg(imEvent)
317 def newUserAgreementHistoryMsg(userID: String): UserAgreementHistoryMsg = {
318 val msg = new UserAgreementHistoryMsg
319 msg.setOriginalID(MessageHelpers.UserAgreementHistoryMsgIDGenerator.nextUID())
320 msg.setUserID(userID)
324 def newWalletEntriesMsg(entries: ju.List[WalletEntryMsg] = new ju.ArrayList[WalletEntryMsg]()) = {
325 val msg = new WalletEntriesMsg
326 msg.setEntries(entries)
330 def newDummyPolicyMsgAt(millis: Long) : PolicyMsg = {
331 PolicyMsg.newBuilder().
335 setValidFromMillis(millis).
336 setValidToMillis(Long.MaxValue).
337 setChargingBehaviors(new ju.ArrayList[String]()).
338 setResourceTypes(new ju.ArrayList[ResourceTypeMsg]()).
339 setRoleMapping(new ju.HashMap[String, FullPriceTableMsg]()).
343 def newInitialUserStateMsg(
344 usb: UserStateBootstrap,
345 defaultResourceTypesMap: Map[String, ResourceType],
349 val bmi = BillingMonthInfo.fromMillis(occurredMillis)
350 val msg = new UserStateMsg
352 msg.setUserID(usb.userID)
353 msg.setOccurredMillis(java.lang.Long.valueOf(occurredMillis))
354 msg.setBillingYear(java.lang.Integer.valueOf(bmi.year))
355 msg.setBillingMonth(java.lang.Integer.valueOf(bmi.month))
356 msg.setBillingMonthDay(java.lang.Integer.valueOf(bmi.day))
357 msg.setTotalCredits(java.lang.Double.valueOf(CreditsModel.toTypeInMessage(usb.initialCredits)))
358 msg.setAgreementHistory(newInitialUserAgreementHistoryMsg(usb.initialAgreement.msg))
359 msg.setLatestUpdateMillis(java.lang.Long.valueOf(occurredMillis))
360 msg.setInStoreID(null)
361 msg.setOriginalID(MessageHelpers.UserStateMsgIDGenerator.nextUID())
362 msg.setResourceTypesMap(newResourceTypeMsgsMap(defaultResourceTypesMap))
363 msg.setStateOfResources(new java.util.HashMap())
364 msg.setWalletEntries(new java.util.ArrayList[WalletEntryMsg]())