diff options
Diffstat (limited to 'kamon-autoweave/src/main/scala/kamon/autoweave/loader/AttachmentProviders.scala')
-rw-r--r-- | kamon-autoweave/src/main/scala/kamon/autoweave/loader/AttachmentProviders.scala | 41 |
1 files changed, 31 insertions, 10 deletions
diff --git a/kamon-autoweave/src/main/scala/kamon/autoweave/loader/AttachmentProviders.scala b/kamon-autoweave/src/main/scala/kamon/autoweave/loader/AttachmentProviders.scala index ebb112e4..fff23735 100644 --- a/kamon-autoweave/src/main/scala/kamon/autoweave/loader/AttachmentProviders.scala +++ b/kamon-autoweave/src/main/scala/kamon/autoweave/loader/AttachmentProviders.scala @@ -17,13 +17,20 @@ package kamon.autoweave.loader import java.io.File import java.net.{ URL, URLClassLoader } -import java.security.{ PrivilegedAction, AccessController } +import java.security.{ AccessController, PrivilegedAction } -object AttachmentProviders extends { +import scala.util.control.NonFatal +import scala.util.{ Failure, Success, Try } - val VirtualMachineTyeName = "com.sun.tools.attach.VirtualMachine" +object AttachmentProviders { sealed trait AttachmentProvider { + def resolve(): Option[Class[_]] + } + + trait DefaultAttachmentProvider extends AttachmentProvider { + val VirtualMachineTyeName = "com.sun.tools.attach.VirtualMachine" + def toolsJarPath: String /** @@ -34,17 +41,31 @@ object AttachmentProviders extends { */ def resolve(): Option[Class[_]] = { val toolsJar = new File(System.getProperty("java.home").replace('\\', '/') + "/../" + toolsJarPath) - if (toolsJar.isFile && toolsJar.canRead) - Some(AccessController.doPrivileged(new ClassLoaderCreationAction(toolsJar)).loadClass(VirtualMachineTyeName)) - else None + if (toolsJar.isFile && toolsJar.canRead) { + Try(AccessController.doPrivileged(new ClassLoaderCreationAction(toolsJar)).loadClass(VirtualMachineTyeName)) match { + case Success(vm) ⇒ Some(vm) + case Failure(NonFatal(_)) ⇒ None + } + } else None } } - case object JVM extends AttachmentProvider { val toolsJarPath = "../lib/tools.jar" } - case object JDK extends AttachmentProvider { val toolsJarPath = "lib/tools.jar" } - case object MAC extends AttachmentProvider { val toolsJarPath = "../Classes/classes.jar" } + case object JVM extends DefaultAttachmentProvider { val toolsJarPath = "../lib/tools.jar" } + case object JDK extends DefaultAttachmentProvider { val toolsJarPath = "lib/tools.jar" } + case object MAC extends DefaultAttachmentProvider { val toolsJarPath = "../Classes/classes.jar" } + case object IBM extends AttachmentProvider { + + val IBMVirtualMachineTyeName = "com.ibm.tools.attach.VirtualMachine" + + override def resolve(): Option[Class[_]] = { + Try(ClassLoader.getSystemClassLoader.loadClass(IBMVirtualMachineTyeName)) match { + case Success(vm) ⇒ Some(vm) + case Failure(NonFatal(_)) ⇒ None + } + } + } - private val providers = Seq(JVM, JDK, MAC) + private val providers = Seq(JVM, JDK, MAC, IBM) private final class ClassLoaderCreationAction(toolsJar: File) extends PrivilegedAction[ClassLoader] { override def run(): ClassLoader = new URLClassLoader(Array[URL](toolsJar.toURI.toURL), null) |