diff options
author | Jakob Odersky <jodersky@gmail.com> | 2015-01-15 16:36:13 +0100 |
---|---|---|
committer | Jakob Odersky <jodersky@gmail.com> | 2015-01-15 16:42:42 +0100 |
commit | 20c4d8950ac56ae99fe80c1acff961f25c7d2e2d (patch) | |
tree | 3e33b1d25d3a11bd8e90513935f4dc914c9e860c | |
parent | d548c49b019845a1bf0c15da1a38db5eb48c8446 (diff) | |
download | akka-serial-20c4d8950ac56ae99fe80c1acff961f25c7d2e2d.tar.gz akka-serial-20c4d8950ac56ae99fe80c1acff961f25c7d2e2d.tar.bz2 akka-serial-20c4d8950ac56ae99fe80c1acff961f25c7d2e2d.zip |
Remove dependencies on scala-io.
Thanks go to EAD Fritz <ead.fritz@gmail.com> for implementing something similar on his fork.
-rw-r--r-- | CHANGELOG.md | 3 | ||||
-rw-r--r-- | flow/src/main/scala/com/github/jodersky/flow/internal/NativeLoader.scala | 61 | ||||
-rw-r--r-- | project/Dependencies.scala | 2 | ||||
-rw-r--r-- | project/FlowBuild.scala | 4 |
4 files changed, 45 insertions, 25 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 43f1285..557e3af 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +Version 2.0.10 +- Remove dependencies on scala-io + Version 2.0.9 - Fix termios initialization issues (#12) diff --git a/flow/src/main/scala/com/github/jodersky/flow/internal/NativeLoader.scala b/flow/src/main/scala/com/github/jodersky/flow/internal/NativeLoader.scala index 9f26ef0..2526293 100644 --- a/flow/src/main/scala/com/github/jodersky/flow/internal/NativeLoader.scala +++ b/flow/src/main/scala/com/github/jodersky/flow/internal/NativeLoader.scala @@ -1,37 +1,58 @@ package com.github.jodersky.flow.internal import java.io.File - -import scalax.file.Path -import scalax.io.Resource +import java.io.FileOutputStream +import java.io.InputStream +import java.io.OutputStream /** Handles loading of the current platform's native library for flow. */ object NativeLoader { - private def os = System.getProperty("os.name").toLowerCase.filter(_ != ' ') + private final val BufferSize = 4096 - private def arch = System.getProperty("os.arch").toLowerCase + private def os = System.getProperty("os.name").toLowerCase.replaceAll("\\s", "") - private def extractNative(nativeLibrary: String): Option[File] = { - val fqlib = System.mapLibraryName(nativeLibrary) //fully qualified library name - - val in = NativeLoader.getClass().getResourceAsStream(s"/native/${os}-${arch}/${fqlib}") - if (in == null) return None + private def arch = System.getProperty("os.arch").toLowerCase - val temp = Path.createTempFile(nativeLibrary) - Resource.fromInputStream(in).copyDataTo(temp) - temp.fileOption + /** Extract a resource from this class loader to a temporary file. */ + private def extract(path: String, prefix: String): Option[File] = { + var in: Option[InputStream] = None + var out: Option[OutputStream] = None + + try { + in = Option(NativeLoader.getClass.getResourceAsStream(path)) + if (in.isEmpty) return None + + val file = File.createTempFile(prefix, "") + out = Some(new FileOutputStream(file)) + + val buffer = new Array[Byte](BufferSize) + var length = -1; + do { + length = in.get.read(buffer) + if (length != -1) out.get.write(buffer, 0, length) + } while (length != -1) + + Some(file) + } finally { + in.foreach(_.close) + out.foreach(_.close) + } } - private def loadFromJar(nativeLibrary: String) = extractNative(nativeLibrary) match { - case Some(file) => System.load(file.getAbsolutePath) - case None => throw new UnsatisfiedLinkError("Cannot extract flow's native library, the native library may not exist for your specific architecture/OS combination.") + private def loadFromJar(library: String) = { + val fqlib = System.mapLibraryName(library) //fully qualified library name + extract(s"/native/${os}-${arch}/${fqlib}", fqlib) match { + case Some(file) => System.load(file.getAbsolutePath) + case None => throw new UnsatisfiedLinkError("Cannot extract flow's native library, " + + "the native library may not exist for your specific architecture/OS combination.") + } } - - def load(nativeLibrary: String) = try { - System.loadLibrary(nativeLibrary) + + def load(library: String) = try { + System.loadLibrary(library) } catch { - case ex: UnsatisfiedLinkError => loadFromJar(nativeLibrary) + case ex: UnsatisfiedLinkError => loadFromJar(library) } }
\ No newline at end of file diff --git a/project/Dependencies.scala b/project/Dependencies.scala index 0d97b22..d9c32be 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -3,7 +3,5 @@ import sbt._ object Dependencies { lazy val akkaActor = "com.typesafe.akka" %% "akka-actor" % "2.3.8" - lazy val ioCore = "com.github.scala-incubator.io" %% "scala-io-core" % "0.4.3" - lazy val ioFile = "com.github.scala-incubator.io" %% "scala-io-file" % "0.4.3" } diff --git a/project/FlowBuild.scala b/project/FlowBuild.scala index efac9b7..05883d6 100644 --- a/project/FlowBuild.scala +++ b/project/FlowBuild.scala @@ -70,9 +70,7 @@ object FlowBuild extends Build { javahHeaderDirectory := (baseDirectory in ThisBuild).value / "flow-native" / "src", javahClasses := Seq("com.github.jodersky.flow.internal.NativeSerial"), compileOrder in Compile := CompileOrder.Mixed, - libraryDependencies += Dependencies.akkaActor, - libraryDependencies += Dependencies.ioCore, - libraryDependencies += Dependencies.ioFile + libraryDependencies += Dependencies.akkaActor ) ) |