「Clojure と slim3」の夏がやってくる (其の参)
さて、サービスの Clojure 化です。
本当は Pure Clojure で行きたかったところですが、そうすると、せっかくの Hot Reloading を無効にせねばなりません。
そうでなくとも、ゆとり Eclipse 世代w としては手動ビルドさえ面倒な状況ですから、ビルドのたびに開発サーバの再起動なんてやってられません。
なので、止むを得ず Java クラスとして扱うこととしました。
まずは、サービスのコードです。
Slim3Service.clj
(ns com.example.service.Slim3Service (:gen-class :methods [ #^{:static true} [newAndPut [String] void], #^{:static true} [queryAll [] java.util.List]]) (:import com.example.meta.Slim3ModelMeta, com.example.model.Slim3Model, com.google.appengine.api.datastore.Key, java.util.List, org.slim3.datastore.Datastore)) (defn -newAndPut "Docstring for new-and-put [prop1]." [prop1] (let [model (Slim3Model.)] (.setProp1 model prop1) (let [key (Datastore/put model)] (.setKey model key)))) (defn -queryAll "Docstring for queryAll." [] (.. (Datastore/query (Slim3ModelMeta/get)) asList))
次に、作成したサービスを使用するよう、コントローラーを変更します。
IndexController.clj
(ns com.example.controller.IndexController (:gen-class :extends org.slim3.controller.Controller :exposes {response {:get getResponce, :set setResponce}} :exposes-methods {forward forwardS, requestScope requestScopeS}) (:import com.example.meta.Slim3ModelMeta, com.example.model.Slim3Model, com.example.service.Slim3Service, java.util.Date, org.slim3.datastore.Datastore)) (defn -run "Docstring for -run." [this] (let [res (.. this getResponce)] (.println (.. res getWriter) "Hello, World!") (Slim3Service/newAndPut (.. (Date.) toString)) (doseq [x (Slim3Service/queryAll)] (.println (.. res getWriter) (.. x getProp1))) (.flushBuffer res)))
Java クラスの扱いの勘所が分かってくると、スイスイ記述できますね。本当に素晴らしいです。
さて、次は、本来であれば先に行なうべきなのですが、TestCase を記述してみたいと思います。