> 1. Loading .clj files
> Is it possible to load up .clj files from the classpath of an
> arbitrary java app? For example, could you proxy HttpServlet and run
> your servlet as a .clj from within a servlet container?

Hi Todd, here's a pattern for doing what you want;

1.) Create svlt/Svlt.clj as below
2.) Compile it separately using
(binding [*compile-path* "./tmp"] (compile 'svlt.Svlt))
3.) cp ./tmp/* [tomcat]/myctx/WEB-INF/classes/
4.) cp clojure.jar to myctx/WEB-INF/lib
It is better to have clojure.jar in each context's WEB-INF
as then class loading works correctly.
5.) Create your app clj functions in say myapp/clfns.clj
(as below) and copy this (not compiled)
to myctx/WEB-INF/classes/myapp/clfns.clj
6.) Add to myctx/WEB-INF/web.xml;
        <servlet>
            <servlet-name>Svlt</servlet-name>
            <servlet-class>svlt.Svlt</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>Svlt</servlet-name>
            <url-pattern>/svlt/*</url-pattern>
7.) Open http://whatever/myctx/svlt/myapp.clfns/html-hi

; -------------------- svlt/Svlt.clj
(ns svlt.Svlt
  (import (javax.servlet.http HttpServletRequest
     HttpServletResponse))
  (:gen-class :extends javax.servlet.http.HttpServlet))

(def re-ipath #"\/(.*)\/(.*)")

(defn -service
  [this #^HttpServletRequest req #^HttpServletRequest rsp]
  (let [ipath (.getPathInfo req)
        g (re-matches re-ipath ipath)
        _ (when (nil? g) (throw (java.io.IOException.
               (str "Invalid svlt ipath (parse): " ipath))))
        [_ ns-sym req-fn-nm] g
        ns-sym (symbol ns-sym)
        found-ns (find-ns ns-sym)
        found-ns (if (nil? found-ns)
                   (let [n (create-ns ns-sym)] (require ns-sym) n)
                   found-ns)
        _ (when (nil? found-ns) (throw (java.io.IOException.
              (str  "Namespace not found for: " ns-sym))))
        req-fn (get (ns-publics ns-sym) (symbol req-fn-nm)) ]
    (req-fn req rsp)))

; --------------------- myapp/clfns.clj
(ns myapp.clfns
 (:import (javax.servlet.http HttpServletRequest
   HttpServletResponse)))

(defn html-hi
  [#^HttpServletRequest req #^HttpServletResponse rsp]
  (.setContentType rsp "text/html")
  (with-open [wtr (java.io.PrintWriter. (.getOutputStream rsp))]
      (.println wtr "<html><body><p>Hi</p></body></html>"))))

Notes;
- to update, simply copy new app clj file/s to WEB-INF/classes and
reload the context.
- Borrow http://github.com/weavejester/hiccup for some cool html
generation stuff.
- you should be able to adapt the above (namespace requiring) to your
other java integration needs.

-Rgds, Adrian.

-- 
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

Reply via email to