All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.comcast.xfinity.sirius.uberstore.data.BinaryEventCodec.scala Maven / Gradle / Ivy

The newest version!
/*
 *  Copyright 2012-2014 Comcast Cable Communications Management, LLC
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package com.comcast.xfinity.sirius.uberstore.data

import com.comcast.xfinity.sirius.api.impl.{Delete, Put, OrderedEvent}
import java.nio.ByteBuffer

/**
 * Class supplying binary encoding of OrderedEvents
 */
class BinaryEventCodec extends OrderedEventCodec {

  private final val PUT_CODE: Int = 1
  private final val DELETE_CODE: Int = 2

  private final val EMPTY_BYTES = new Array[Byte](0)

  /**
   * @inheritdoc
   */
  def serialize(event: OrderedEvent): Array[Byte] = {
    val typeCode = typeCodeFromOrderedEvent(event)

    val key = keyFromOrderedEvent(event).getBytes
    val body = bodyFromOrderedEvent(event)

    val keyLen = key.length
    val bodyLen = body.length

    val eventBuf = ByteBuffer.allocate(
      8 + // seq
      8 + // timestamp
      4 + // typeCode
      4 + // keyLen
      4 + // bodyLen
      keyLen + // key data
      bodyLen // bodyData
    )

    eventBuf.putLong(event.sequence).
      putLong(event.timestamp).
      putInt(typeCode).
      putInt(keyLen).
      putInt(bodyLen).
      put(key).
      put(body).array
  }

  /**
   * @inheritdoc
   */
  def deserialize(bytes: Array[Byte]): OrderedEvent = {
    val eventBuf = ByteBuffer.wrap(bytes)

    val seq = eventBuf.getLong()
    val timestamp = eventBuf.getLong()
    val typeCode = eventBuf.getInt()
    val keyLen = eventBuf.getInt()
    val bodyLen = eventBuf.getInt()

    val keyBytes = new Array[Byte](keyLen)
    eventBuf.get(keyBytes)
    val key = new String(keyBytes)

    val body = new Array[Byte](bodyLen)
    eventBuf.get(body)

    val req = if (typeCode == PUT_CODE) Put(key, body) else Delete(key)
    OrderedEvent(seq, timestamp, req)
  }


  private def typeCodeFromOrderedEvent(event: OrderedEvent): Int = event.request match {
    case _: Put => PUT_CODE
    case _: Delete => DELETE_CODE
  }

  private def keyFromOrderedEvent(event: OrderedEvent): String = event.request match {
    case Put(key, _) => key
    case Delete(key) => key
  }

  private def bodyFromOrderedEvent(event: OrderedEvent): Array[Byte] = event.request match {
    case Put(_, body) => body
    case _: Delete => EMPTY_BYTES
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy