summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/io/ClassAndJarInfo.scala
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)
}