Hi Walter, ... i was actually thinking too complicated. I was actually working myself deeper and deeper by extracting methods, but i completely overlooked to simply destructure the data ...
Thanx a lot :) Am Freitag, 7. März 2014 18:14:33 UTC+1 schrieb Walter van der Laan: > > Hi Florian, > > To unpack your edn-acls I entered these expressions in a repl. Each > expression goes one step deeper, so it is only the last expression that you > need to unpack the acls. The other steps are included to illustrate the > process. > > (for [acl edn-acls] > {:acl acl}) > > (for [acl edn-acls > [path rep-maps] acl > rep-map rep-maps] > {:path path :rep-map rep-map}) > > (for [acl edn-acls > [path rep-maps] acl > rep-map rep-maps > [rep privs] rep-map] > {:path path :rep rep :privs privs}) > > (for [acl edn-acls > [path rep-maps] acl > rep-map rep-maps > [rep privs] rep-map > priv privs] > {:path path :rep rep :priv priv}) > > (for [acl edn-acls > [path rep-maps] acl > rep-map rep-maps > [rep privs] rep-map > priv privs > [jcr groups] priv] > {:path path :rep rep :jcr jcr :groups groups}) > > (for [acl edn-acls > [path rep-maps] acl > rep-map rep-maps > [rep privs] rep-map > priv privs > [jcr groups] priv > group groups] > {:path path :rep rep :jcr jcr :group group}) > > Succes with your application. > > On Friday, March 7, 2014 9:44:32 AM UTC+1, Florian Salihovic wrote: >> >> I am working on my first "real" Clojure application. I started building >> tools and looking use cases for my daily work, so i would >> have a direct benefit from using Clojure. The first application would be an >> unpacking of an edn definition of access control lists >> for Apache JackRabbit. The edn-acls vector represents such lists. >> >> Privileges (:privilege i.e. "jcr:read", "jcr:all") to a path (:path i.e. >> "/content") can be granted or denied (:primaryType "rep:GrantACE", >> "rep:DenyACE") for principals (:principalName i.e. "admin" >> "workflow-editors"). >> >> I am currently stuck at the following questions: >> >> 1. How to (efficiently - that would be ) accumulate the data. It seems >> like i am not getting the data returned from unpack-aces-for-path into a >> list or vector. I tried to pass an accumulator to edn-acl-unpack but that >> didn't work out. >> 2. There are a bunch of zip methods already available, but i didn't find >> one which transforms a list/vector from a map {"jcr:read" ["anonymous" >> "workflow-users"] into [["jcr:read" "anonymous"] ["jcr:read" >> "workflow-users"]]. I didn't find an implementation in core, but i wonder if >> there was something like that already. >> 3. Getting more idiomatic ... >> >> The code ... >> >> (def edn-acls [{"/content" >> [{"rep:GrantACE" >> [{"jcr:read" ["anonymous" "workflow-users"]} >> {"jcr:all" ["admin" "workflow-editors"]}]}]} >> {"/etc" >> [{"rep:DenyACE" >> [{"jcr:all" ["anonymous" "workflow-users"]}]} >> {"rep:GrantACE" >> [{"jcr:read" ["anonymous" "workflow-users"]}]} >> {"rep:GrantACE" >> [{"jcr:all" ["admin" "workflow-editors"]}]}]}]) >> (defn map-privileges-to-principals >> [primary-type >> privileges] >> (for [privilege-for-principals privileges >> [privilege principals] privilege-for-principals] >> (for [principal principals] >> (hash-map :primaryType primary-type >> :privilege privilege >> :principalName principal)))) >> (defn unpack-aces >> [aces] >> (flatten >> (for [ace aces] >> (for [[primary-type privileges] ace] >> (map-privileges-to-principals primary-type privileges))))) >> (defn unpack-aces-for-path >> [aces-for-path] >> (for [[path aces] aces-for-path] >> (hash-map :path path >> :acls (unpack-aces aces)))) >> (defn edn-acl-unpack >> [policies] >> (let [head (first policies) >> tail (rest policies)] >> (when (not (empty? head)) >> (let [entry (unpack-aces-for-path head)] >> (when (not (empty? tail)) >> (recur tail)))))) >> (edn-acl-unpack edn-acls) >> >> -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.