-
Notifications
You must be signed in to change notification settings - Fork 0
/
core.clj
55 lines (46 loc) · 1.44 KB
/
core.clj
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
45
46
47
48
49
50
51
52
53
54
55
(ns re-share.core
"Common re-ops functions"
(:require
[taoensso.timbre :refer (refer-timbre)]
[minderbinder.time :refer (parse-time-unit)])
(:import
java.io.StringWriter
java.io.PrintWriter
java.util.Date
java.security.MessageDigest
java.math.BigInteger))
(refer-timbre)
(defn find-port
"find the first available port within a given range"
[from to]
(first
(filter
(fn [p] (try (with-open [s (java.net.ServerSocket. p)] true) (catch Exception e false))) (range from to))))
(defn curr-time [] (.getTime (Date.)))
(def flag (atom true))
(defn wait-for
"A general wait for pred function
(wait-for {:timeout [1 :minute] #() \"waiting for nothing failed\")}
"
[{:keys [timeout sleep] :or {sleep [100 :ms]} :as timings} pred message]
{:pre [(map? timings)]}
(let [wait (+ (curr-time) (parse-time-unit timeout))]
(loop []
(if (> wait (curr-time))
(if (pred)
true
(when @flag
(do (Thread/sleep (parse-time-unit sleep)) (recur))))
(throw (ex-info message timings))))))
(defn stop-waits []
(reset! flag false))
(defn enable-waits []
(reset! flag true))
(defn md5 [^String s]
(let [algorithm (MessageDigest/getInstance "MD5")
raw (.digest algorithm (.getBytes s))]
(format "%032x" (BigInteger. 1 raw))))
(defn error-m [e]
(let [sw (StringWriter.) p (PrintWriter. sw)]
(.printStackTrace e p)
(error (.getMessage e) (.toString sw))))