From bbd52dcca66caa3cbd78478a1d075ff54da4f65a Mon Sep 17 00:00:00 2001 From: Ivan Topolnjak Date: Mon, 24 Apr 2017 14:10:46 +0200 Subject: bring the new skeleton into place --- kamon-core/src/main/scala/kamon/package.scala | 49 +++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 kamon-core/src/main/scala/kamon/package.scala (limited to 'kamon-core/src/main/scala/kamon/package.scala') diff --git a/kamon-core/src/main/scala/kamon/package.scala b/kamon-core/src/main/scala/kamon/package.scala new file mode 100644 index 00000000..3d8c3515 --- /dev/null +++ b/kamon-core/src/main/scala/kamon/package.scala @@ -0,0 +1,49 @@ +import com.typesafe.config.Config + +import scala.collection.concurrent.TrieMap + +package object kamon { + + + + /** + * Workaround to the non thread-safe [[scala.collection.concurrent.TrieMap#getOrElseUpdate]] method. More details on + * why this is necessary can be found at [[https://issues.scala-lang.org/browse/SI-7943]]. + */ + implicit class AtomicGetOrElseUpdateOnTrieMap[K, V](val trieMap: TrieMap[K, V]) extends AnyVal { + + def atomicGetOrElseUpdate(key: K, op: ⇒ V): V = + atomicGetOrElseUpdate(key, op, { v: V ⇒ Unit }) + + def atomicGetOrElseUpdate(key: K, op: ⇒ V, cleanup: V ⇒ Unit): V = + trieMap.get(key) match { + case Some(v) ⇒ v + case None ⇒ + val d = op + trieMap.putIfAbsent(key, d).map { oldValue ⇒ + // If there was an old value then `d` was never added + // and thus need to be cleanup. + cleanup(d) + oldValue + + } getOrElse (d) + } + } + + + implicit class UtilsOnConfig(val config: Config) extends AnyVal { + import scala.collection.JavaConverters._ + + def firstLevelKeys: Set[String] = { + config.entrySet().asScala.map { + case entry ⇒ entry.getKey.takeWhile(_ != '.') + } toSet + } + + def configurations: Map[String, Config] = { + firstLevelKeys + .map(entry => (entry, config.getConfig(entry))) + .toMap + } + } +} -- cgit v1.2.3