その手の平は尻もつかめるさ

ギジュツ的な事をメーンで書く予定です

donovan という1枚 java ファイルを書けばウェブアプリを立ち上げられる WAF を書いた

※ WAF: Web Application Framework


表題の通りです.Maven Central にも上がっています.


avans という tokuhirom さんが書いた WAF があり,Sledge や Amon2 の流れをくむシンプルで良いフレームワークがあって,最近はもっぱらそれでウェブアプリケーションを書く日々が続いているわけですが,
avans でウェブアプリ―ケーションを立ち上げるには class を真面目に定義したり設定ファイルをちゃんと書いてやる必要があり,もう少しゆるふわ,というか雑にやりたいな〜という欲求が生まれる瞬間があります.

そうした思いから,この donovan という WAF を作成しました.
ご多分に漏れず,avans の影響をバリバリ受けているというか,コードの多くを参考にしています.


簡単に説明すると

  • 組み込みの Servlet Container (Embedded Tomcat or Embedded Jetty) により動作する
  • ディスパッチャとそのパスの動作を lambda によって一緒に書ける
  • java のファイルを1枚書けば動く
  • 割と依存が少ない

という特徴を持ったミニマルな WAF になります.


donovan で Embedded Jetty を使った例を書くと,

@Slf4j
public class App {
    public static void main(String[] args) throws Exception {
        DonovanJetty dj = new DonovanJetty()) 
        dj.get("/", (c) -> {
            return c.renderJSON(new BasicAPIResponse(200, "hello!"));
        });

        dj.start();
        log.info("{}", dj.getURL());
        dj.join();
    }
}

と書いて起動してやると*1,「ルートを GET で叩くと "hello!" が返ってくるというようなアプリケーション」をザクッと書くことが可能となります.
各エンドポイントは donovan からコンテキストが渡され (色々な情報が入っている),WebResponse (webscrew が提供する interface) を返すという処理を実装すれば良いという感じです.
詳細は README.mdjavadoc をご覧ください.


こうした感じで,donovan を使うとゆるふわにウェブアプリをガツンと立ち上げることが可能となります.
主に API のモックや,ちょっと動作を確認したいときなんかに使う為に作成した WAF なので本チャンの環境で使うようなものではございませんのでやめたほうが良いでしょう *2.まあ小さいものならいけそうではある *3

ご利用くださいませ.

*1:djという変数名が良いですね

*2:というかこれでちょっとでもデカいもの書こうとすると設計が破綻する気がする

*3:spark なんかは似ている思想っぽいし……まあとはいえ組み込み servlet container ではないので微妙なところ http://sparkjava.com/