I know there are a lot of questions out there with this headline, but I can't glean my answer from them, so here goes.
I'm an experienced programmer, but fairly new to Clojure. I'm trying to parse a RTF file by converting it to a HTML file then calling the html parser.
The converter I'm using (unrtf) always prints to stdout, so I need to capture the output and write the file myself.
(defn parse-rtf "Use unrtf to parse a rtf file" [#^java.io.InputStream istream charset] (let [rtffile (File/createTempFile "parse" ".rtf" (File. "/vault/tmp/")) htmlfile (File/createTempFile "parse" ".ohtml" (File. "/vault/tmp/")) command (str "/usr/bin/unrtf " (.getPath rtffile) ) ] (try (with-open [rtfout (FileOutputStream. rtffile)] (IOUtils/copy istream rtfout)) (let [ proc (.exec (Runtime/getRuntime) command) ostream (.getInputStream proc) result (.waitFor proc)] (if (> result 0) ( (println "unrtf failed" command result) ; throwing an exception causes a parse failure to be logged (throw (Exception. (str "RTF to HTML conversion failed"))) ) ( (with-open [htmlout (FileOutputStream. htmlfile)] (IOUtils/copy ostream htmlout)) ; since we now have html, run it through the html parser (parse-html (FileInputStream. htmlfile) charset) ) ) ) (finally (.delete rtffile) (.delete htmlfile) ) )))
The exception points to the line with
(IOUtils/copy ostream htmlout))
which really confuses me, since I used that form earlier (just after the try:) and it seems to be OK there. I can't see the difference.
Thanks for any help you can give.
(if condition something something-else)
and you have(if condition (something) (something-else))
. – Diego Basch