MozSwingにビックリ

JavaでHTMLをレンダリングしようとすると、どえらく大変です。SwingコンポーネントもHTMLを解釈してレンダリングしてくれますが、CSSなどには対応しておらず、ごく基本的なHTMLしか使うことができません。

Javaでスタイルシートも含めてHTMLをレンダリングしたい! 自前でSwingコンポーネントを組み立てていくのはイヤだ! そう叫びたい方、現に叫んでいる方に朗報です。あのオープンソースで開発が進められている有名ブラウザ、FirefoxをSwingコンポーネントとして使うことができるようになっていたのです。

MozSwing (SourceForge)からパッケージをダウンロードすることができます。

内部ではXULRunnerという、XULとXPCOMを使ったアプリケーションを動作させるための基盤システムを使っています。パッケージには各プラットフォームごとのバイナリが入っており、内部としては、単純に、Javaを介してそれらのバイナリを動作させているだけということになります。

パッケージに入っているjarファイルをすべてクラスパスに組み込み、提供されているSwingコンポーネントMozillaPanelを使うことで、簡単にFirefox相当のブラウザを組み込むことができてしまいます。

ただ、事前に、システムプロパティmozswing.xulrunner.homeにXULRunnerのディレクトリを指定しておかなければならないようです。これをインストールされているFirefoxのディレクトリに合わせれば、最新版のFirefoxで動作することになるのかなあ? 内部動作など、まだよく分かっていないので、予想です。

サンプルコードはkaisehのブログに掲載されていました。まあ、JFrameにMozillaPanelを貼り付けるだけ、というシンプル極まりないものですが。これだけでブラウザが動作してしまうのですから、ちょっとビックリです。

JavaでSQLite

あえて説明するまでもありませんが、SQLiteは軽量で扱いやすいリレーショナルデータベースのエンジンです。これはC言語で使うために作られたライブラリですが、いろいろな人たちの努力により、Javaでも動作するようになっています。いくつか使ってみたところ、どういう場合に向いているのかが何となく分かりました。誰かの役に立つかもしれないので、ここにメモしておきます。

まずはSQLJetから。すべてJavaで書かれたSQLiteの実装で、データファイルにおいて完全な互換があります。SQLiteはC言語用のライブラリなので、これをJavaから使うためにはJNIを使ったラッパーを作らなければならないのですが、その必要がまったくなくなるという利点があります。JARファイルをクラスパスに加えるだけで使えるようになります。

しかし、あまりドキュメントが充実しておらず、どのようにプログラムを組めばよいのか、調べるのが大変という欠点があります。また、SQLをサポートしているわけではなく、SQLJetが提供しているAPIを使わなければなりません。そのため、データベースの実装について抽象化したようなプログラムを書くことが難しくなります(不可能ではないと思いますが…)。

逆に言えば、SQLを使うことなく、Javaのオブジェクトにアクセスすることでデータベースを操作することができるのですから、SQLに詳しくなくてもデータベースを扱うことができるということになり、ひとつの利点といえるのかもしれません。

次はSQLite JDBC Driverです。これは名前の通りJDBCドライバになっており、SQLiteのラッパーとして動作します。JARファイルの内部にコンパイルされた各環境用のライブラリが同梱されており、動的にロードするという仕組みになっているそうです。ですので、C言語で作成したアプリケーションにおいてSQLiteを使うのと変わりません。

このドライバ自体のドキュメントは少ないのですが、データベースの操作はJDBCのインターフェイスを使って行うため、JDBCに関する知識があれば扱えるということになり、それほどの欠点ではありません。また、SQLを発行することでデータベースの操作を行うため、操作の抽象化を行うことが比較的容易になります。もっとも、SQLが分からなければ使いこなせない、ということも意味するのですが。

残念ながら、ドライバの実装は最新のJDBCに対応していないようで、Java 1.6で追加されたメソッドを使用すると例外が発生してしまいます。この点は欠点になると思いますが、ほかのメソッドによって代用することができたり、そもそも必要のないメソッドもありますので、致命的なものではありません。

使ってみた所感は以上です。

ごく簡単に使いたいというのであれば、SQLJetを。抽象化なども交えて本格的に使いたい、最新のSQLiteを使いたいというのであれば、SQLite JDBC Driverを使うのがよいと思います。