-
Notifications
You must be signed in to change notification settings - Fork 18
Expand file tree
/
Copy pathkey.clj
More file actions
57 lines (48 loc) · 1.9 KB
/
Copy pathkey.clj
File metadata and controls
57 lines (48 loc) · 1.9 KB
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
56
(ns hyperion.key
(:require [clojure.data.codec.base64 :refer [encode decode]]
[hyperion.abstr :refer :all])
(:import [java.lang IllegalArgumentException]))
(defn encode-key [value]
(.replace
(String. (encode (.getBytes value)))
"="
""))
(defn decode-key [value]
(String.
(decode
(.getBytes
(case (mod (.length value) 4)
3 (str value "=")
2 (str value "==")
1 (str value "===")
value)))))
(def key-fodder (.toCharArray "ABCDEFGHIJKLMNOPabcdefghijklmnop0123456789"))
(def fodder-count (count key-fodder))
(defn random-fodder-seq
"The default generator for `random-fodder-seq` is threadsafe for JDK 1.6b73
or greater (http://bugs.java.com/view_bug.do?bug_id=6379897). Calls to this on
multiple threads (i.e. `(pmap (fn [_] (take 10 random-fodder-seq)) (range 10))`)
will have a different seed for each instance of `java.util.Random`. If on a JDK
earlier than JDK 1.6b73 there is a chance that there will be multiple instances
of `java.util.Random` with the same seed causing collisions"
([] (random-fodder-seq (java.util.Random.)))
([generator]
(cons
(aget key-fodder (.nextInt generator fodder-count))
(lazy-seq (random-fodder-seq generator)))))
(defn generate-id []
(let [buffer (StringBuffer.)]
(doseq [c (take 8 (random-fodder-seq))]
(.append buffer c))
(.toString buffer)))
;(defn generate-id []
; (.replace (str (java.util.UUID/randomUUID)) "-" ""))
(defn compose-key
([kind] (compose-key kind (generate-id)))
([kind id] (encode-key (str (->kind kind) ":" (str id)))))
(defn decompose-key [key]
(let [decoded (decode-key key)
colon-index (.indexOf decoded (int \:))]
(if (< colon-index 1)
(throw (javax.management.openmbean.InvalidKeyException. (str "Invalid key form: " decoded)))
(list (.substring decoded 0 colon-index) (.substring decoded (inc colon-index))))))