summaryrefslogtreecommitdiff
path: root/compojure-3.2/src/compojure/server/grizzly.clj
blob: c33a1d55f751fad44c2fb27b98ee7936659f325b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
;; Copyright (c) James Reeves. All rights reserved.
;; The use and distribution terms for this software are covered by the Eclipse
;; Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) which
;; can be found in the file epl-v10.html at the root of this distribution. By
;; using this software in any fashion, you are agreeing to be bound by the
;; terms of this license. You must not remove this notice, or any other, from
;; this software.

(ns compojure.server.grizzly
  "Clojure interface to start an embedded Grizzly server. To compile, use:
   ant -Dwith.grizzly"
  (:use compojure.control
        compojure.server.common)
  (:import javax.servlet.Servlet
           com.sun.grizzly.http.embed.GrizzlyWebServer
           com.sun.grizzly.http.servlet.ServletAdapter))

(defn #^ServletAdapter servlet-adapter
  "Wrap a servlet in a ServletAdapter object with a supplied set of parameters
  to be set on servlet init."
  [#^Servlet servlet & params]
  (let [adapter (new ServletAdapter servlet)
        params (partition 2 params)]
    (doseq [[key val] params]
      (.addInitParameter adapter (name key) (str val)))
    adapter))

(defn add-servlet!
  "Add a servlet to a Grizzly server. Servlets can be connected to a relative
  path or an absolute URL. Unlike the Jetty server, no Virtual Hosts
  are setup."
  [#^GrizzlyWebServer server url-or-path servlet]
  (let [[host path] (get-host-and-path url-or-path)
        #^ServletAdapter adapter (if (instance? ServletAdapter servlet)
                                   servlet
                                   ;; Otherwise, assume it's a servlet.
                                   (let [#^Servlet ss (cast Servlet servlet)]
                                     (ServletAdapter. ss)))]
    (.addGrizzlyAdapter server adapter (into-array [path]))))

(defn- #^GrizzlyWebServer create-server
  "Construct a Grizzly Server instance."
  [options servlets]
  (let [port     (options :port 80)
        server   (GrizzlyWebServer. (int port))
        servlets (partition 2 servlets)]
    (doseq [[url-or-path servlet] servlets]
      (add-servlet! server url-or-path servlet))
    server))

(defn #^GrizzlyWebServer grizzly-server
  "Create a new Grizzly HTTP server with the supplied options and servlets."
  [options & servlets]
  (server-with-options create-server options servlets))

(defmacro defserver
  "Shortcut for (def name (http-server args))"
  [name & args]
  `(def ~name (grizzly-server ~@args)))

(defn start "Start a HTTP server."
  [#^GrizzlyWebServer server]
  (.start server))

(defn stop  "Stop a HTTP server."
  [#^GrizzlyWebServer server]
  (.stop server))

(defn run-server
  "Create and start a new Grizzly HTTP server."
  [& server-args]
  (let [#^GrizzlyWebServer server (apply grizzly-server server-args)]
    (.start server)
    server))