omnipaste

java2dot.clj

whoCreated: chouser whenCreated: 2008-03-13 14:54:25 mimetype: text/clojure
download   paste more
(def srcpath "/home/chouser/build/clojure/src/jvm/clojure/lang/")

(defn system [cmd writedata]
     (let [proc (.. java.lang.Runtime (getRuntime) (exec (into-array cmd)))
           isr  (new java.io.InputStreamReader
                     (. proc (getInputStream)) "ISO-8859-1")
           osr  (new java.io.OutputStreamWriter (. proc (getOutputStream)))
           baos (new java.io.ByteArrayOutputStream)]
       (. osr (write writedata))
       (. osr (close))
       (loop [c (. isr (read))]
         (if (neg? c)
           (do (. proc (waitFor))
               (. baos (toByteArray)))
           (do (. baos (write c))
               (recur (. isr (read))))))))

(defmacro str-for [& for-stuff]
 `(apply str (for ~@for-stuff)))

(def dotstr (str
 "digraph {\n"
 "  rankdir=LR;\n"
 "  dpi=55;\n"
 "  nodesep=0.10;\n"
 "  node[ fontname=Helvetica ];\n"
 (str-for [file (. (new java.io.File srcpath) (listFiles))]
   (when-not (. file (isDirectory))
     (with-open rdr (new java.io.BufferedReader (new java.io.FileReader file))
       (str-for [line (line-seq rdr)]
         (let [[line name subs]
                 (re-matches #"public.* (?:class|interface) (\\w+) (.*)" line)]
           (when name
             (str-for [[subline sub] (re-seq #"(\\w+)(?:<[^>]*>)?" subs)]
               (when-not (#{"extends" "implements"} sub)
                 (str "  " name " -> " sub ";\n")))))))))
 "}\n"))

;(print dotstr)

(def png (system ["dot" "-Tpng"] dotstr))

(doto (new javax.swing.JFrame "Clojure Classes")
 (add (new javax.swing.JLabel (new javax.swing.ImageIcon png)))
 (setVisible true))

omnipaste