2009-03-22 17:26:42 +01:00
|
|
|
/**
|
2010-12-22 15:35:50 +01:00
|
|
|
* Copyright (C) 2009-2011 Scalable Solutions AB <http://scalablesolutions.se>
|
2009-03-22 17:26:42 +01:00
|
|
|
*/
|
|
|
|
|
|
2010-10-26 12:49:25 +02:00
|
|
|
package akka.util
|
2009-03-22 17:26:42 +01:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
|
|
|
|
*/
|
|
|
|
|
object Helpers extends Logging {
|
|
|
|
|
|
2010-09-28 11:21:05 +02:00
|
|
|
implicit def null2Option[T](t: T): Option[T] = Option(t)
|
2009-08-11 13:13:16 +02:00
|
|
|
|
|
|
|
|
def intToBytes(value: Int): Array[Byte] = {
|
|
|
|
|
val bytes = new Array[Byte](4)
|
|
|
|
|
bytes(0) = (value >>> 24).asInstanceOf[Byte]
|
|
|
|
|
bytes(1) = (value >>> 16).asInstanceOf[Byte]
|
|
|
|
|
bytes(2) = (value >>> 8).asInstanceOf[Byte]
|
|
|
|
|
bytes(3) = value.asInstanceOf[Byte]
|
|
|
|
|
bytes
|
|
|
|
|
}
|
|
|
|
|
|
2010-10-26 12:04:32 +02:00
|
|
|
def bytesToInt(bytes: Array[Byte], offset: Int): Int = {
|
|
|
|
|
(0 until 4).foldLeft(0)((value, index) => value + ((bytes(index + offset) & 0x000000FF) << ((4 - 1 - index) * 8)))
|
2009-07-23 20:01:37 +02:00
|
|
|
}
|
2009-03-22 17:26:42 +01:00
|
|
|
|
2010-06-18 16:31:25 +02:00
|
|
|
/**
|
|
|
|
|
* Convenience helper to cast the given Option of Any to an Option of the given type. Will throw a ClassCastException
|
|
|
|
|
* if the actual type is not assignable from the given one.
|
|
|
|
|
*/
|
|
|
|
|
def narrow[T](o: Option[Any]): Option[T] = {
|
2010-09-28 11:21:05 +02:00
|
|
|
require((o ne null), "Option to be narrowed must not be null!")
|
2010-06-18 16:31:25 +02:00
|
|
|
o.asInstanceOf[Option[T]]
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Convenience helper to cast the given Option of Any to an Option of the given type. Will swallow a possible
|
|
|
|
|
* ClassCastException and return None in that case.
|
|
|
|
|
*/
|
|
|
|
|
def narrowSilently[T: Manifest](o: Option[Any]): Option[T] =
|
|
|
|
|
try {
|
|
|
|
|
narrow(o)
|
|
|
|
|
} catch {
|
|
|
|
|
case e: ClassCastException =>
|
2010-11-24 13:53:53 +01:00
|
|
|
log.slf4j.warn("Cannot narrow {} to expected type {}!", o, implicitly[Manifest[T]].erasure.getName)
|
2010-11-24 13:42:41 +01:00
|
|
|
log.slf4j.trace("narrowSilently", e)
|
2010-06-18 16:31:25 +02:00
|
|
|
None
|
|
|
|
|
}
|
2010-10-29 16:33:31 +02:00
|
|
|
|
2010-10-26 12:04:32 +02:00
|
|
|
/**
|
|
|
|
|
* Reference that can hold either a typed value or an exception.
|
|
|
|
|
*
|
|
|
|
|
* Usage:
|
|
|
|
|
* <pre>
|
|
|
|
|
* scala> ResultOrError(1)
|
|
|
|
|
* res0: ResultOrError[Int] = ResultOrError@a96606
|
|
|
|
|
*
|
|
|
|
|
* scala> res0()
|
|
|
|
|
res1: Int = 1
|
|
|
|
|
*
|
|
|
|
|
* scala> res0() = 3
|
|
|
|
|
*
|
|
|
|
|
* scala> res0()
|
|
|
|
|
* res3: Int = 3
|
2010-10-29 16:33:31 +02:00
|
|
|
*
|
2010-10-26 12:04:32 +02:00
|
|
|
* scala> res0() = { println("Hello world"); 3}
|
|
|
|
|
* Hello world
|
|
|
|
|
*
|
|
|
|
|
* scala> res0()
|
|
|
|
|
* res5: Int = 3
|
2010-10-29 16:33:31 +02:00
|
|
|
*
|
2010-10-26 12:04:32 +02:00
|
|
|
* scala> res0() = error("Lets see what happens here...")
|
|
|
|
|
*
|
|
|
|
|
* scala> res0()
|
|
|
|
|
* java.lang.RuntimeException: Lets see what happens here...
|
2010-10-26 23:44:13 +02:00
|
|
|
* at ResultOrError.apply(Helper.scala:11)
|
|
|
|
|
* at .<init>(<console>:6)
|
|
|
|
|
* at .<clinit>(<console>)
|
|
|
|
|
* at Re...
|
2010-10-26 12:04:32 +02:00
|
|
|
* </pre>
|
|
|
|
|
*/
|
|
|
|
|
class ResultOrError[R](result: R){
|
|
|
|
|
private[this] var contents: Either[R, Throwable] = Left(result)
|
2010-10-29 16:33:31 +02:00
|
|
|
|
2010-10-26 12:04:32 +02:00
|
|
|
def update(value: => R) = {
|
2010-10-29 16:33:31 +02:00
|
|
|
contents = try {
|
|
|
|
|
Left(value)
|
|
|
|
|
} catch {
|
|
|
|
|
case (error : Throwable) => Right(error)
|
|
|
|
|
}
|
2010-10-26 12:04:32 +02:00
|
|
|
}
|
2010-10-29 16:33:31 +02:00
|
|
|
|
2010-10-26 12:04:32 +02:00
|
|
|
def apply() = contents match {
|
|
|
|
|
case Left(result) => result
|
|
|
|
|
case Right(error) => throw error.fillInStackTrace
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
object ResultOrError {
|
|
|
|
|
def apply[R](result: R) = new ResultOrError(result)
|
|
|
|
|
}
|
2010-06-18 16:31:25 +02:00
|
|
|
}
|