From 1c0537f8e9830094ad105a24e7ad05d0046ceb08 Mon Sep 17 00:00:00 2001 From: bom Date: Fri, 29 Mar 2024 10:21:05 +0100 Subject: [PATCH] Add jar-file inlining --- src/main/cljc/dda/c4k_common/macros.cljc | 37 +++++++++++++++--- src/test/clj/dda/c4k_common/macros_test.clj | 20 +++++++--- src/test/cljs/dda/c4k_common/macros_test.cljs | 9 +++-- .../dda/c4k_common/inline_jar_test/test.jar | Bin 0 -> 1004 bytes 4 files changed, 50 insertions(+), 16 deletions(-) create mode 100644 src/test/resources/dda/c4k_common/inline_jar_test/test.jar diff --git a/src/main/cljc/dda/c4k_common/macros.cljc b/src/main/cljc/dda/c4k_common/macros.cljc index f53459a..3501936 100644 --- a/src/main/cljc/dda/c4k_common/macros.cljc +++ b/src/main/cljc/dda/c4k_common/macros.cljc @@ -1,9 +1,34 @@ (ns dda.c4k-common.macros - (:require [clojure.java.io :as io])) + (:require [clojure.java.io :as io] + [clojure.string :as str]) + (:import java.util.jar.JarFile)) -(defmacro inline-resources [resource-path] - (let [files (.listFiles (io/file (io/resource resource-path))) +(defn inline-resource-file [resource-url relative-resource-folder-path] + (let [files (.listFiles (io/file resource-url)) file-contents (map slurp files) - file-names (map #(str resource-path "/" (.getName %)) files)] - (zipmap file-names file-contents)) - ) + file-names (map #(str relative-resource-folder-path "/" (.getName %)) files)] + (zipmap file-names file-contents))) + +(defn inline-resource-jar [resource-url] + (let [resource-url-string (.toString resource-url) + ; Remove jar:file: + start-absolute (str/replace-first resource-url-string "jar:file:" "") + ; Split path into jar base and search folder + jar-split (str/split start-absolute #"!/") + absolute-jar-path (first jar-split) + relative-file-path (second jar-split) + jar (JarFile. absolute-jar-path) + files (->> (enumeration-seq (.entries jar)) + (filter #(str/starts-with? % relative-file-path)) + (filter #(not (.isDirectory %)))) + file-names (map #(.getName %) files) + file-contents (map #(slurp (.getInputStream jar %)) files)] + (zipmap file-names file-contents))) + +(defmacro inline-resources [resource-path] + (let [resource-url (io/resource resource-path) + resource-protocol (.getProtocol resource-url)] + (case resource-protocol + "file" (inline-resource-file resource-url resource-path) + "jar" (inline-resource-jar resource-url)))) + diff --git a/src/test/clj/dda/c4k_common/macros_test.clj b/src/test/clj/dda/c4k_common/macros_test.clj index f6f205e..99ec44a 100644 --- a/src/test/clj/dda/c4k_common/macros_test.clj +++ b/src/test/clj/dda/c4k_common/macros_test.clj @@ -1,13 +1,21 @@ (ns dda.c4k-common.macros-test - (:require + (:require [clojure.test :refer [deftest is are testing run-tests]] - [dda.c4k-common.macros :refer [inline-resources]])) + [dda.c4k-common.macros :as cut :refer [inline-resources]])) (deftest should-count-inline-resources (is (= 3 (count (inline-resources "dda/c4k_common/inline_resources_test"))))) (deftest should-inline-resources - (let [resource-path (fn [name] (str "dda/c4k_common/inline_resources_test/" name))] - (is (= "1" (get (inline-resources "dda/c4k_common/inline_resources_test") (resource-path "inline_resource_1.yaml")))) - (is (= "2" (get (inline-resources "dda/c4k_common/inline_resources_test") (resource-path "inline_resource_2.yaml")))) - (is (= "3" (get (inline-resources "dda/c4k_common/inline_resources_test") (resource-path "inline_resource_3.yaml")))))) + (let [resource-path (fn [name] (str "dda/c4k_common/inline_resources_test/" name)) + inlined-resources (inline-resources "dda/c4k_common/inline_resources_test")] + (is (= "1" (get inlined-resources (resource-path "inline_resource_1.yaml")))) + (is (= "2" (get inlined-resources (resource-path "inline_resource_2.yaml")))) + (is (= "3" (get inlined-resources (resource-path "inline_resource_3.yaml")))))) + +(deftest should-inline-jar-resources + (let [jar-url (java.net.URL. "jar:file:./src/test/resources/dda/c4k_common/inline_jar_test/test.jar!/inline_resources_test/") + inlined-resources (cut/inline-resource-jar jar-url)] + (is (= "1" (get inlined-resources "inline_resources_test/inline_resource_1.yaml"))) + (is (= "2" (get inlined-resources "inline_resources_test/inline_resource_2.yaml"))) + (is (= "3" (get inlined-resources "inline_resources_test/inline_resource_3.yaml"))))) \ No newline at end of file diff --git a/src/test/cljs/dda/c4k_common/macros_test.cljs b/src/test/cljs/dda/c4k_common/macros_test.cljs index cdae418..3a78e55 100644 --- a/src/test/cljs/dda/c4k_common/macros_test.cljs +++ b/src/test/cljs/dda/c4k_common/macros_test.cljs @@ -7,7 +7,8 @@ (is (= 4 (count (inline-resources "ingress"))))) (deftest should-inline-resources - (let [resource-path (fn [name] (str "dda/c4k_common/inline_resources_test/" name))] - (is (= "1" (get (inline-resources "dda/c4k_common/inline_resources_test") (resource-path "inline_resource_1.yaml")))) - (is (= "2" (get (inline-resources "dda/c4k_common/inline_resources_test") (resource-path "inline_resource_2.yaml")))) - (is (= "3" (get (inline-resources "dda/c4k_common/inline_resources_test") (resource-path "inline_resource_3.yaml")))))) + (let [resource-path (fn [name] (str "dda/c4k_common/inline_resources_test/" name)) + inlined-resources (inline-resources "dda/c4k_common/inline_resources_test")] + (is (= "1" (get inlined-resources (resource-path "inline_resource_1.yaml")))) + (is (= "2" (get inlined-resources (resource-path "inline_resource_2.yaml")))) + (is (= "3" (get inlined-resources (resource-path "inline_resource_3.yaml")))))) diff --git a/src/test/resources/dda/c4k_common/inline_jar_test/test.jar b/src/test/resources/dda/c4k_common/inline_jar_test/test.jar new file mode 100644 index 0000000000000000000000000000000000000000..f04678be3963c53e3a9ad81d5f32984658d7336b GIT binary patch literal 1004 zcmWIWW@Zs#;Nak3F!rg9U_b(#3@i-3t|5-Po_=on|4uP5Ff#;rvvYt{FhP|C;M6Pv zQ~}rQ>*(j{<{BKL=j-;__snS@Z(Y5MyxzK6=gyqp9At3C_`%a6JuhD!Pv48Bt5~>Z zyq0_+DW#FYB9c0d(N%PgmvM2BN#)LponY(zr!1Ug3pCsgh(XqKF)#p~v@SC%9O@=8 zB?crj^KvrtQsawKi}Op1l2eQ0OHzwV^bt;;nuV%I2d5r1lj05aDid>aj9I`A+W!7d zGc!;tBM?)=a3hG}Okl%#_g$63G<*u#E;oi4&IUGocHgC3gyD=#A`GYr0T#=kgn$a* zF$+o-0p6%ukz)vy3=jYmZ*Z+hi2`H-7X$8?M3}G#$V7_`c)TK90g74VXaU760(<~6 zv73P=3XNxE|A9