Undertowのソースツリーを眺める
JBoss / WildFly (全部俺) Advent Calendar 2013の24日目です。
Undertowのソースツリーをおもむろに見てみます。
io.undertow
UndertowというUndertowのサーバのビルダークラスとHandlersという各HttpHandlerのビルダークラス。あとはロギングクラスとかなのでスルー。
io.undertow.attribute
ExchangeAttributeというクラス群。ServiceLoaderでロードされているので、META-INF/services/io.undertow.attribute.ExchangeAttributeBuilderに実装クラスが羅列されている。
io.undertow.channels
書き込み用のDetachableStreamSinkChannelと読み込み用のDetachableStreamSourceChannel。リクエスト毎にI/Oを切り離すために使われてるっぽい。
他にもChannelがいくつかあるけど使われているようには見えず、調べてみるとこれら使われていないchannel群はBeta8でconduitと呼ばれる仕組みに置き換わっている。
io.undertow.client
HTTPクライアントAPI。後で遊ぼう。
io.undertow.conduits
conduit(コンディット)とは導管、ルート、パイプという意味らしい。NIOのChannelにデコレータパターンを当てはめてフィルタ処理とかするためのAPIっぽい。
io.undertow.io
送信処理と送信完了およびエラーのコールバックAPI、非同期送信と同期送信の実装が同梱されている。
io.undertow.predicate
リクエストの前提条件を組み立てるAPIと前提条件式のパーサ、リライト処理の条件式などで利用。
io.undertow.security
セキュリティ関連。
io.undertow.server
サーバ実装のためのAPI。リクエストレスポンスのデータを全て保持しているHttpServerExchangeクラスと、HTTPに関するさまざまな処理を行うHttpHandlerの実装クラスが含まれている。
io.undertow.util
かなりごった煮。multipartのパーサなど、HTTP関連のめんどくさそうな処理の実装とかがほとんどこの中に居そう。
io.undertow.websockets
JSR 356の実装のベースとなるWebSocket関連のAPI。JSR 356実装自体は別のサブプロジェクトになっている。
番外編
channels見ているときにxnioのソースツリーも参照したんだけどjava/nio/channels/FileChannel.javaというのが存在していて何だろなと思ったらJava 6とJava 7でAPI違う部分のクロスコンパイルのためのもの。
感想
XNIOも含めてI/Oものすごい作り込まれてる印象、読むのなかなか大変。というかNIOが大変。