Created
April 11, 2012 02:54
-
-
Save rathwell/2356565 to your computer and use it in GitHub Desktop.
Noir differences for GAE: app_servlet ns generated by lein appengine-new, and httpsession middleware for clustered environments. After running lein appengine-new, make the changes to app_servlet, and add the other 2 files to your project.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(ns my.ns.app_servlet | |
(:gen-class :extends javax.servlet.http.HttpServlet) | |
(:use [appengine-magic.servlet :only [make-servlet-service-method]] | |
[appengine-magic.multipart-params :only [wrap-multipart-params]]) | |
(:require [appengine-magic.core :as gae] | |
[noir.util.gae :as noir-gae] | |
[noir.server.handler :as handler] | |
[my.ns.middleware.httpsession :as httpsession])) | |
;; custom middlewares | |
(handler/add-custom-middleware wrap-multipart-params) | |
;; load views (must manually load all routes) | |
(require 'my.ns.views.welcome) | |
;; def the ring handler (with httpsession - must also enable sessions in appengine-web.xml) | |
(def ring-handler | |
(httpsession/wrap-http-session-store | |
(noir-gae/gae-handler | |
{:session-store (httpsession/http-session-store "my-app-session")})))) | |
;; if you don't want sessions, the ring handler looks like: | |
;; (def ring-handler | |
;; (noir-gae/gae-handler {})) | |
;; def the appengine app | |
(gae/def-appengine-app my-site ring-handler | |
:war-root "/Users/me/Devel/my-app/war") | |
;; entry point | |
(defn -service [this request response] | |
((make-servlet-service-method my-site) this request response)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(ns my.ns.middleware.httpsession | |
(:import | |
(java.io ByteArrayInputStream ByteArrayOutputStream) | |
(java.io ObjectInputStream ObjectOutputStream)) | |
(:use ring.middleware.session.store)) | |
(declare ^:dynamic *session*) | |
(defn serialize [obj] | |
(let [bos (ByteArrayOutputStream.)] | |
(with-open [oos (ObjectOutputStream. bos)] | |
(.writeObject oos obj)) | |
(.toByteArray bos))) | |
(defn deserialize [bytes] | |
(let [bis (ByteArrayInputStream. bytes)] | |
(with-open [ois (ObjectInputStream. bis)] | |
(.readObject ois)))) | |
(deftype HttpSessionStore [session-key] | |
SessionStore | |
(read-session [_ _] | |
(let [val (.getAttribute *session* session-key)] | |
(if val (deserialize val) {}))) | |
(write-session [_ key data] | |
(.setAttribute *session* session-key (serialize data)) | |
key) | |
(delete-session [_ _] | |
(.removeAttribute *session* session-key) | |
nil)) | |
(defn http-session-store [session-key] | |
(HttpSessionStore. session-key)) | |
(defn wrap-http-session-store | |
[handler] | |
(fn [request] | |
(binding [*session* (.getSession (:request request))] | |
(handler request)))) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(ns my.ns.views.welcome | |
(:use [noir.core :only (defpage)])) | |
(defpage "/welcome" [] | |
"Welcome to Noir!") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment