Skip to content

Commit

Permalink
CSAS-12 move json parsers in companion-objects
Browse files Browse the repository at this point in the history
  • Loading branch information
tomskikh committed Aug 30, 2018
1 parent e1e557e commit a9de710
Show file tree
Hide file tree
Showing 9 changed files with 106 additions and 54 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.bwsw.cloudstack.entities.common

import java.time.OffsetDateTime
import java.time.format.DateTimeFormatter
import java.util.UUID

import spray.json.{JsString, JsValue, JsonFormat, deserializationError}

/**
* @author Pavel Tomskikh
*/
object CommonJsonFormats {
val dateTimeFormatter: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd['T'][ ]HH:mm:ss[ ]X")

implicit val uuidJsonFormat: JsonFormat[UUID] = new JsonFormat[UUID] {
override def read(json: JsValue): UUID = {
json match {
case JsString(x) => UUID.fromString(x)
case x => deserializationError("Expected UUID as JsString, but got " + x)
}
}

override def write(obj: UUID): JsValue = JsString(obj.toString)
}

implicit val offsetDateTimeJsonFormat: JsonFormat[OffsetDateTime] = new JsonFormat[OffsetDateTime] {
override def read(json: JsValue): OffsetDateTime = {
json match {
case JsString(x) => OffsetDateTime.parse(x, dateTimeFormatter)
case x => deserializationError("Expected OffsetDateTime as JsString, but got " + x)
}
}

override def write(obj: OffsetDateTime): JsValue =
JsString(obj.format(dateTimeFormatter))
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,66 +18,16 @@
*/
package com.bwsw.cloudstack.entities.common

import java.time.OffsetDateTime
import java.time.format.DateTimeFormatter
import java.util.UUID

import com.bwsw.cloudstack.entities.common.JsonFormats._
import com.bwsw.cloudstack.entities.events.Constants.{Events, FieldNames}
import com.bwsw.cloudstack.entities.events.account.{AccountCreateEvent, AccountDeleteEvent}
import com.bwsw.cloudstack.entities.events.user.UserCreateEvent
import com.bwsw.cloudstack.entities.events.vm.{VirtualMachineCreateEvent, VirtualMachineDestroyEvent}
import com.bwsw.cloudstack.entities.events.{CloudStackEvent, UnknownEvent}
import spray.json.DefaultJsonProtocol._
import spray.json._

trait JsonFormats {

val dateTimeFormatter: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd['T'][ ]HH:mm:ss[ ]X")

implicit val uuidJsonFormat: JsonFormat[UUID] = new JsonFormat[UUID] {
override def read(json: JsValue): UUID = {
json match {
case JsString(x) => UUID.fromString(x)
case x => deserializationError("Expected UUID as JsString, but got " + x)
}
}

override def write(obj: UUID): JsValue = JsString(obj.toString)
}

implicit val offsetDateTimeJsonFormat: JsonFormat[OffsetDateTime] = new JsonFormat[OffsetDateTime] {
override def read(json: JsValue): OffsetDateTime = {
json match {
case JsString(x) => OffsetDateTime.parse(x, dateTimeFormatter)
case x => deserializationError("Expected OffsetDateTime as JsString, but got " + x)
}
}

override def write(obj: OffsetDateTime): JsValue =
JsString(obj.format(dateTimeFormatter))
}

implicit val accountCreateEventJsonFormat: RootJsonFormat[AccountCreateEvent] =
jsonFormat(
AccountCreateEvent,
"status",
"entityuuid",
"eventDateTime",
"Domain",
"description"
)
implicit val accountDeleteEventJsonFormat: RootJsonFormat[AccountDeleteEvent] =
jsonFormat4(AccountDeleteEvent)
implicit val userCreateEventJsonFormat: RootJsonFormat[UserCreateEvent] =
jsonFormat4(UserCreateEvent)
implicit val virtualMachineCreateEventJsonFormat: RootJsonFormat[VirtualMachineCreateEvent] =
jsonFormat4(VirtualMachineCreateEvent)
implicit val virtualMachineDestroyEventJsonFormat: RootJsonFormat[VirtualMachineDestroyEvent] =
jsonFormat4(VirtualMachineDestroyEvent)

implicit val unknownEventJsonReader: RootJsonReader[UnknownEvent] = (json: JsValue) => UnknownEvent(json)

protected val basicEvents: TypedEventParser = {
case (Events.ACCOUNT_CREATE, _) => implicitly[JsonReader[AccountCreateEvent]]
case (Events.ACCOUNT_DELETE, _) => implicitly[JsonReader[AccountDeleteEvent]]
Expand All @@ -99,7 +49,7 @@ trait JsonFormats {
): RootJsonReader[CloudStackEvent] = {
val parser = otherParsers.foldLeft(jsObjectParser)(_ orElse _)

json: JsValue => parser.applyOrElse(json, unknownEventJsonReader.read)
json: JsValue => parser.applyOrElse(json, implicitly[RootJsonReader[UnknownEvent]].read)
}

/**
Expand All @@ -119,12 +69,12 @@ trait JsonFormats {
basicEvents
.orElse(typedEvents)
.lift((eventType, jsObject))
.getOrElse(unknownEventJsonReader)
.getOrElse(implicitly[RootJsonReader[UnknownEvent]])

case _ =>
untypedEvents
.lift(jsObject)
.getOrElse(unknownEventJsonReader)
.getOrElse(implicitly[RootJsonReader[UnknownEvent]])
}

reader.read(jsObject)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ object Constants {
val Event: String = "event"
val EventDateTime: String = "eventDateTime"
val EntityUuid: String = "entityuuid"
val Description: String = "description"
val Status: String = "status"
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,12 @@
*/
package com.bwsw.cloudstack.entities.events

import spray.json.JsValue
import spray.json.{JsValue, RootJsonReader}

final case class UnknownEvent(json: JsValue)
extends CloudStackEvent


object UnknownEvent {
implicit val unknownEventJsonReader: RootJsonReader[UnknownEvent] = (json: JsValue) => UnknownEvent(json)
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,29 @@ package com.bwsw.cloudstack.entities.events.account
import java.time.OffsetDateTime
import java.util.UUID

import com.bwsw.cloudstack.entities.common.CommonJsonFormats._
import com.bwsw.cloudstack.entities.events.Constants.FieldNames
import com.bwsw.cloudstack.entities.events.{CloudStackEvent, EventDateTime}
import spray.json.DefaultJsonProtocol._
import spray.json.RootJsonFormat

final case class AccountCreateEvent(status: Option[String],
entityuuid: Option[UUID],
eventDateTime: Option[OffsetDateTime],
domain: Option[UUID],
description: Option[String])
extends CloudStackEvent with EventDateTime


object AccountCreateEvent {

implicit val accountCreateEventJsonFormat: RootJsonFormat[AccountCreateEvent] =
jsonFormat(
AccountCreateEvent.apply,
FieldNames.Status,
FieldNames.EntityUuid,
FieldNames.EventDateTime,
"Domain",
FieldNames.Description
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,20 @@ package com.bwsw.cloudstack.entities.events.account
import java.time.OffsetDateTime
import java.util.UUID

import com.bwsw.cloudstack.entities.common.CommonJsonFormats._
import com.bwsw.cloudstack.entities.events.{CloudStackEvent, EventDateTime}
import spray.json.DefaultJsonProtocol._
import spray.json.RootJsonFormat

final case class AccountDeleteEvent(status: Option[String],
entityuuid: Option[UUID],
eventDateTime: Option[OffsetDateTime],
description: Option[String])
extends CloudStackEvent with EventDateTime


object AccountDeleteEvent {

implicit val accountDeleteEventJsonFormat: RootJsonFormat[AccountDeleteEvent] =
jsonFormat4(AccountDeleteEvent.apply)
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,20 @@ package com.bwsw.cloudstack.entities.events.user
import java.time.OffsetDateTime
import java.util.UUID

import com.bwsw.cloudstack.entities.common.CommonJsonFormats._
import com.bwsw.cloudstack.entities.events.{CloudStackEvent, EventDateTime}
import spray.json.DefaultJsonProtocol._
import spray.json.RootJsonFormat

final case class UserCreateEvent(status: Option[String],
entityuuid: Option[UUID],
eventDateTime: Option[OffsetDateTime],
description: Option[String])
extends CloudStackEvent with EventDateTime


object UserCreateEvent {

implicit val userCreateEventJsonFormat: RootJsonFormat[UserCreateEvent] =
jsonFormat4(UserCreateEvent.apply)
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,20 @@ package com.bwsw.cloudstack.entities.events.vm
import java.time.OffsetDateTime
import java.util.UUID

import com.bwsw.cloudstack.entities.common.CommonJsonFormats._
import com.bwsw.cloudstack.entities.events.{CloudStackEvent, EventDateTime}
import spray.json.DefaultJsonProtocol._
import spray.json.RootJsonFormat

final case class VirtualMachineCreateEvent(status: Option[String],
entityuuid: Option[UUID],
eventDateTime: Option[OffsetDateTime],
description: Option[String])
extends CloudStackEvent with EventDateTime


object VirtualMachineCreateEvent {

implicit val virtualMachineCreateEventJsonFormat: RootJsonFormat[VirtualMachineCreateEvent] =
jsonFormat4(VirtualMachineCreateEvent.apply)
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,20 @@ package com.bwsw.cloudstack.entities.events.vm
import java.time.OffsetDateTime
import java.util.UUID

import com.bwsw.cloudstack.entities.common.CommonJsonFormats._
import com.bwsw.cloudstack.entities.events.{CloudStackEvent, EventDateTime}
import spray.json.DefaultJsonProtocol._
import spray.json.RootJsonFormat

final case class VirtualMachineDestroyEvent(status: Option[String],
entityuuid: Option[UUID],
eventDateTime: Option[OffsetDateTime],
description: Option[String])
extends CloudStackEvent with EventDateTime


object VirtualMachineDestroyEvent {

implicit val virtualMachineDestroyEventJsonFormat: RootJsonFormat[VirtualMachineDestroyEvent] =
jsonFormat4(VirtualMachineDestroyEvent.apply)
}

0 comments on commit a9de710

Please sign in to comment.