Fix bincompat issue introduced in #2268

This commit is contained in:
Eugene Yokota 2015-12-30 06:22:55 -05:00
parent d3cb46951b
commit db81fa2109
1 changed files with 56 additions and 27 deletions

View File

@ -35,6 +35,62 @@ object IO {
val utf8 = Charset.forName("UTF-8")
/**
* Returns a URL for the directory or jar containing the class file for type `T` (as determined by an implicit Manifest).
* If the location cannot be determined, an error is generated.
* Note that Java standard library classes typically do not have a location associated with them.
*/
@deprecated("Use classfileLocation or classLocationFile", "0.13.10")
def classLocation[T](implicit mf: SManifest[T]): URL = classLocation(mf.runtimeClass)
/**
* Returns a URL for the directory or jar containing the the class file `cl`.
* If the location cannot be determined, an error is generated.
*/
@deprecated("Use classfileLocation or classLocationFile", "0.13.10")
def classLocation(cl: Class[_]): URL = {
val codeSource = cl.getProtectionDomain.getCodeSource
if (codeSource ne null) {
codeSource.getLocation
} else {
// NB: This assumes that classes without code sources are System classes, and thus located in
// jars. It assumes that `urlAsFile` will truncate to the containing jar file.
val clsfile = s"${cl.getName.replace('.', '/')}.class"
Option(ClassLoader.getSystemClassLoader.getResource(clsfile))
.flatMap {
urlAsFile
}.getOrElse {
sys.error("No class location for " + cl)
}.toURI.toURL
}
}
/**
* Returns the directory or jar file containing the the class file for type `T` (as determined by an implicit Manifest).
* If the location cannot be determined, an error is generated.
* Note that Java standard library classes typically do not have a location associated with them.
*/
def classLocationFile[T](implicit mf: SManifest[T]): File = classLocationFile(mf.runtimeClass)
/**
* Returns the directory or jar file containing the class file `cl`.
* If the location cannot be determined or if it is not a file, an error is generated.
* Note that Java standard library classes typically do not have a location associated with them.
*/
def classLocationFile(cl: Class[_]): File = {
val classURL =
Option(cl.getProtectionDomain.getCodeSource).getOrElse {
sys.error("No class location for " + cl)
}.getLocation
toFile(classURL)
}
/**
* Returns a URL for the classfile containing the given class file for type `T` (as determined by an implicit Manifest).
* If the location cannot be determined, an error is generated.
*/
def classfileLocation[T](implicit mf: SManifest[T]): URL = classfileLocation(mf.runtimeClass)
/**
* Returns a URL for the classfile containing the given class
* If the location cannot be determined, an error is generated.
@ -54,33 +110,6 @@ object IO {
}
}
/**
* Returns the directory or jar file containing the class file `cl`.
* If the location cannot be determined or if it is not a file, an error is generated.
* Note that Java standard library classes typically do not have a location associated with them.
*/
def classLocationFile(cl: Class[_]): File = {
val classURL =
Option(cl.getProtectionDomain.getCodeSource).getOrElse {
sys.error("No class location for " + cl)
}.getLocation
toFile(classURL)
}
/**
* Returns a URL for the directory or jar containing the class file for type `T` (as determined by an implicit Manifest).
* If the location cannot be determined, an error is generated.
* Note that Java standard library classes typically do not have a location associated with them.
*/
def classfileLocation[T](implicit mf: SManifest[T]): URL = classfileLocation(mf.runtimeClass)
/**
* Returns the directory or jar file containing the the class file for type `T` (as determined by an implicit Manifest).
* If the location cannot be determined, an error is generated.
* Note that Java standard library classes typically do not have a location associated with them.
*/
def classLocationFile[T](implicit mf: SManifest[T]): File = classLocationFile(mf.runtimeClass)
/**
* Constructs a File corresponding to `url`, which must have a scheme of `file`.
* This method properly works around an issue with a simple conversion to URI and then to a File.