Created
January 23, 2015 17:06
-
-
Save platy/956b1c6ea9ec1d169281 to your computer and use it in GitHub Desktop.
Recursively copy files from the classpath onto the filesystem. In scala
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package amqptest | |
import java.io.{File, FileInputStream, FileOutputStream, InputStream} | |
import java.net.{JarURLConnection, URL} | |
import java.util.function.Consumer | |
import java.util.jar.{JarEntry, JarFile} | |
import sun.net.www.protocol.file.FileURLConnection | |
object ResourceCopy { | |
def copyFilesRecusively(origin: File, destination: File): Unit = origin match { | |
case dir if dir.isDirectory ⇒ | |
destination.exists() || destination.mkdir() | |
assert(destination.isDirectory) | |
dir.list().foreach(filename ⇒ | |
copyFilesRecusively(new File(origin, filename), new File(destination, filename)) | |
) | |
case file if file.isFile ⇒ | |
val in = new FileInputStream(file) | |
val out = new FileOutputStream(destination) | |
streamAll(in, out) | |
in.close() | |
out.close() | |
} | |
// an example of crappy integration between java8 and scala | |
def copyJarResourcesRecursively(connection: JarURLConnection, destination: File) = { | |
val jar: JarFile = connection.getJarFile | |
jar.stream().forEach(new Consumer[JarEntry] { | |
override def accept(t: JarEntry): Unit = | |
t match { | |
case nonmatch if !t.getName.startsWith(connection.getEntryName) ⇒ | |
case inFile if !inFile.isDirectory ⇒ | |
val destFile = new File(destination, t.getName.substring(connection.getEntryName.length)) | |
val in = jar.getInputStream(inFile) | |
val out = new FileOutputStream(destFile) | |
streamAll(in, out) | |
in.close() | |
out.close() | |
case _ ⇒ | |
} | |
} | |
) | |
} | |
def streamAll(in: InputStream, out: FileOutputStream) { | |
Iterator.continually(in.read()).takeWhile(-1 != _).foreach(out.write) | |
} | |
def copyResourcesRecursively(originUrl: URL, destination: File) = | |
originUrl.openConnection() match { | |
case jarConnection: JarURLConnection ⇒ | |
copyJarResourcesRecursively(jarConnection, destination); | |
case _: FileURLConnection ⇒ | |
copyFilesRecusively(new File(originUrl.getPath), destination); | |
case urlConnection ⇒ | |
throw new Exception("URLConnection[" + urlConnection.getClass.getSimpleName + | |
"] is not a recognized/implemented connection type."); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment