blob: d0a0b17494ca7741cdfc27f2e0e035bfb6645965 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
/* NSC -- new Scala compiler
* Copyright 2005-2011 LAMP/EPFL
* @author Paul Phillips
*/
package scala.tools.nsc
package io
import java.net.{ URL, URLClassLoader }
import java.io.IOException
import collection.JavaConverters._
/** A convenience class for finding the jar with the bytecode for
* a given Class object and similar common tasks.
*/
class ClassAndJarInfo[T: ClassManifest] {
val man = classManifest[T]
def clazz = man.erasure
def internalName = clazz.getName.replace('.', '/')
def resourceURL = new URLClassLoader(Array[URL]()) getResource internalName + ".class"
def baseOfPath(path: String) = path indexOf '!' match {
case -1 => path stripSuffix internalName + ".class"
case idx => path take idx
}
def simpleClassName = clazz.getName split """[$.]""" last
def classUrl = clazz getResource simpleClassName + ".class"
def codeSource = protectionDomain.getCodeSource()
def jarManifest = (
try new JManifest(jarManifestUrl.openStream())
catch { case _: IOException => new JManifest() }
)
def jarManifestMainAttrs = jarManifest.getMainAttributes().asScala
def jarManifestUrl = new URL(baseOfPath("" + classUrl) + "!/META-INF/MANIFEST.MF")
def locationFile = File(locationUrl.toURI.getPath())
def locationUrl = if (codeSource == null) new URL("file:///") else codeSource.getLocation()
def protectionDomain = clazz.getProtectionDomain()
def rootClasspath = rootPossibles find (_.exists)
def rootFromLocation = Path(locationUrl.toURI.getPath())
def rootFromResource = Path(baseOfPath(classUrl.getPath) stripPrefix "file:")
def rootPossibles = Iterator(rootFromResource, rootFromLocation)
}
|