General utilities. | (ns cljam.util
(:require [clojure.java.io :as cio]
[clojure.tools.logging :as logging]
[cljam.io.util.bgzf :as bgzf])
(:import [java.net MalformedURLException URL]
[java.nio.file Files FileVisitor FileVisitResult]
[java.nio.file.attribute FileAttribute]
[org.apache.commons.compress.compressors
CompressorStreamFactory CompressorException])) |
Disk cache | |
Returns a created temporary directory with the given | (defn create-temp-dir
[prefix]
(->> 0
(make-array FileAttribute)
(Files/createTempDirectory prefix)
.toFile)) |
Takes the temporary directory created by | (defn delete-temp-dir!
[^java.io.File dir]
(Files/walkFileTree
(.toPath dir)
(reify FileVisitor
(visitFile [_ file _attrs]
(when-not (Files/deleteIfExists file)
(logging/warnf
"The file could not be deleted because it did not exist: %s"
(str file)))
FileVisitResult/CONTINUE)
(visitFileFailed [_ _file _exc]
FileVisitResult/CONTINUE)
(preVisitDirectory [_ _dir _attrs]
FileVisitResult/CONTINUE)
(postVisitDirectory [_ dir _exc]
(when-not (Files/deleteIfExists dir)
(logging/warnf
"The directory could not be deleted because it did not exist: %s"
(str dir)))
FileVisitResult/CONTINUE)))) |
bindings => [dir prefix ...]
Creates a temporary directory with the given | (defmacro with-temp-dir
[bindings & body]
(assert (vector? bindings) "bindings must be a vector")
(assert (even? (count bindings)) "bindings must have an even number of forms")
(cond
(zero? (count bindings)) `(do ~@body)
(symbol? (bindings 0)) (let [[dir prefix] bindings]
`(let [~dir (create-temp-dir ~prefix)]
(try
(with-temp-dir ~(subvec bindings 2) ~@body)
(finally
(delete-temp-dir! ~dir)))))
:else (throw (IllegalArgumentException. "binding must be a symbol")))) |
byte array | |
Casts to byte avoiding an error about out of range for byte. | (defn ubyte
[^long n]
{:pre [(<= 0 n 255)]}
(byte (if (< n 0x80) n (- n 0x100)))) |
string utils | |
Converts a string to bytes. | (defn string->bytes ^"[B" [^String s] (.getBytes s)) |
Converts bytes to a string. | (defn bytes->string ^String [^bytes b] (String. b 0 (alength b))) |
Returns true if c is a visible character, false if not. | (defn graph? [c] (<= 0x20 (byte (int c)) 0x7E)) |
Returns true if c is a character that creates "white space" in displayed text. | (defn space?
[c]
(not (nil? (#{\space \tab \newline \formfeed \return (char 0x0b)} c)))) |
file utils | |
Converts an object to a URL. | (defn as-url
^URL
[x]
(try
(cio/as-url x)
(catch MalformedURLException _
(cio/as-url (cio/file x))))) |
Returns a file name without the last extension. | (defn basename
[x]
(when-let [url (as-url x)]
(second (re-find #"([^/]+)\.(?=[^\./]+$)" (.getPath url))))) |
(def ^:private compressor-map
{:gzip CompressorStreamFactory/GZIP
:bzip2 CompressorStreamFactory/BZIP2}) | |
Returns a compressor input stream from f, autodetecting the compressor type from the first few bytes of f. Returns java.io.BufferedInputStream if the compressor type is not known. Should be used inside with-open to ensure the InputStream is properly closed. | (defn compressor-input-stream
^java.io.InputStream
[f]
(let [is (cio/input-stream f)]
(try
(.createCompressorInputStream (CompressorStreamFactory. true) is)
(catch CompressorException _
is)))) |
Returns a compressor output stream from | (defn compressor-output-stream
(^java.io.OutputStream [f]
(compressor-output-stream f (condp re-find (.getPath (as-url f))
#"(?i)\.(bgz|bgzip|gz)$" :bgzip
#"(?i)\.gzip$" :gzip
#"(?i)\.(bz2|bzip2)$" :bzip2
nil)))
(^java.io.OutputStream [f k]
(if (= :bgzip k)
(bgzf/make-bgzf-output-stream f)
(let [os (cio/output-stream f)]
(if-let [s (get compressor-map k)]
(.createCompressorOutputStream (CompressorStreamFactory.) s os)
os))))) |