「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 を記述してみたいと思います。