Hi Dmitri,

The problem is probably related to calling init with args. It requires
that super() gets called - I can't remember where I saw the
documentation, but here's an example of what works for me.

The following is a generic servlet which gets passed a clojure
namespace name as an init parameter at init time which is saved in an
atom. Then on each service call, it parses the servlet path and uses
the "ipath" (first component of the url after the context), along with
the ns name from the atom to load a clj namespace (once) and call a
function called <ipath> passing it the req and rsp. The clj fn cn then
handle the method type, GET, POST, etc and has access to all the
servlet stuff.

This way you have a servlet as a gateway to a clj ns and the function
called determined by the req url...

(ns svlt.Svlt
  (import (javax.servlet.http HttpServlet HttpServletRequest
     HttpServletResponse HttpSession)
    (javax.servlet ServletConfig)
    )
  (:gen-class :extends javax.servlet.http.HttpServlet
       :state state :init clinit))

(defn -clinit
  []
  [[] (atom (hash-map))])

(defn -init-void
  [this] ; NB - careful, must rather call init() (void) than with the cfg args.
           ; If with args, must call .super() which is problematic
  (let [;cfg (.getServletConfig this)
        ns-nm (.getInitParameter this "app-ns")]
    (println :Svlt :init :ns-nm ns-nm)
    (swap! (.state this) assoc :ns-nm ns-nm)))

(defn -service
  [this #^HttpServletRequest req #^HttpServletRequest rsp]
  (let [cpath (.getContextPath req)
        spath (.getServletPath req)
        ipath (.getPathInfo req)
        _ (println :Svlt :cpath cpath :spath spath :ipath ipath)
        ns-nm (get @(.state this) :ns-nm)
        _ (println :Svlt :ns-nm ns-nm)
        _ (when (nil? ns-nm) (throw (java.io.IOException.
              (str "No app-ns param found in Svlt config: " spath))))
        ipath (if (or (nil? ipath) (= ipath "")) "root" ipath)
        ipath (if (.startsWith ipath "/") (.substring ipath 1) ipath)
        ns-sym (symbol ns-nm)
        _ (println :ns-sym ns-sym :ipath-now ipath)
        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 ipath))
        ]
    (req-fn req rsp)))

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