Challenge Engineer Life !

エンジニア人生を楽しみたい!仕事や趣味で学んだ技術的なことを書いていくブログです。

OpenDolphinでEnterprise JavaFX

このエントリーは JavaFX Advent Calendar 2014 の 20 日目です。

昨日は @aoetk さんの「JavaFX の WebView に文字列検索機能を付けてみる - AOEの日記」でした。

少し前に、JavaFXをキーワードに色々調べていた時、OpenDolphinなるアプリケーションを知りました。
ロゴがどことなくGlassFishに似てて、なんとなく興味を抱いた…というものなのですが(^^;


OpenDolphinのロゴ
f:id:kikutaro777:20141219084246p:plain

GlassFishのロゴ
f:id:kikutaro777:20141219084311j:plain

そんなOpenDolphinについて調べたことを簡単にまとめたいと思います。

OpenDolphin

OpenDolphinのサイト
f:id:kikutaro777:20141220101845j:plain

先に書いておくと、Googleとかで単純に「OpenDolphin」と調べると、OSSの電子カルテが出てきます(^^;なので、「OpenDolphin JavaFX」と調べるのが良さそうです。

しかし、その全然関係ないOSSの電子カルテ「OpenDolphin」のほうですが、サイトみるとGitHubのリンクがあって

dolphin-dev/OpenDolphin · GitHub

なんとJava EE6で作られてて、NetBeans、Mavenという構成のようです!!なんか不思議なつながりw

おっと、いきなり脱線してしまいましたが、話を戻します。

OpenDolphinとはなんぞや?ということについては、OracleのJava Magazine(日本語翻訳版)でわかりやすく解説されていました。
http://www.oracle.com/webfolder/technetwork/jp/javamagazine/Java-JA13-RichClient-konig.pdf

すごく雑にいってしまえば、サーバサイドはJava EE、クライアントサイドはJavaFXのような構成でシステムを作る際に、クラサバを疎な結合したまま、うまいこと繋げて橋渡ししてくれるライブラリです。実際にはJavaFXに限らず、SwingでもAWTなどでも良く、柔軟にサポートされているようです。同様にサーバサイドもSpringとかでもよくて、Javaで作ってるクラサバの架け橋といった感じのようです。

解説の表題に「OpenDolphinで実現するエンタープライズJavaFX」とありますが、エンタープライズで従来多くあるサーバ中心型のモデルに対して、OpenDolphinが架け橋となってリッチなJavaFX UIを使ったりできるよ、という意味合いで「エンタープライズ」と付けているのかな…?と思います。(実際にはもっと風呂敷の大きい意味がありそうですが)

イメージ図を拝借すると次のような図で、PMというのはプレゼンテーションモデルというもので、これがデータモデルの中心となってクラサバ間をやりとりする形。
f:id:kikutaro777:20141220010331p:plain
http://open-dolphin.org/download/guide/guide/introduction.html

DolphinJumpStart

説明だけ読んでると、なんとなくわかったけど……という微妙な感じでした。
で、具体的なサンプルとして「DolphinJumpStart」なるものが。

とりあえずこれを落として、次のドキュメントを読むのが一番良さそうです。
3 How to get started with OpenDolphin - Reference Documentation

コードはMavenでもGradleでもビルドできるようになっているようですが、今回はMavenを利用しました。

Gitでcloneか、zipを落として
f:id:kikutaro777:20141220092147j:plain

NetBeansで開いてみました
f:id:kikutaro777:20141220092240j:plain

親子階層のプロジェクトになっているようです。

step

サンプルコードは、0から7のstepに分かれていて、最初はシンプルな例から始まって、モジュール分割したり、クライアント・サーバに分けたり、と理解できるようになっていました。

Step0はOpenDolphin関係なく、簡単なJavaFXアプリが起動するかどうかのコードでした。

combinedプロジェクトをダブルクリックすると個別に表示されるのでビルドします。
f:id:kikutaro777:20141220092717j:plain

自分の環境ではプロジェクトの設定でJava 5が指定されててビルドエラーになりました(^^;のでプロジェクトのプロパティでJava 7に変えてビルドしました。
(サンプルはJava 7前提のようで、Java 8にすると動かなかったです…)
f:id:kikutaro777:20141220092903j:plain

で、step_0パッケージのmainを実行すると次のような表示になります。

f:id:kikutaro777:20141220093341j:plain

それだけ(^^;

Step1はテキストとボタンがあって、ボタンを押すと入力内容が標準出力されるサンプル。これもJavaFXの基礎を確認、みたいな感じですね。

f:id:kikutaro777:20141220093534j:plain

次のStep2から、やっとOpenDolphinを使う形になります。

実行すると、一見同じ画面なのですが、文字入力するたびに標準出力されてます。
f:id:kikutaro777:20141220094731j:plain

「maki」と入力してclick meボタンを押すと、「server text field contains : maki」と出ます。

f:id:kikutaro777:20141220095400j:plain

コードではClientDolphin、ServerDolphinが定義されていて、これがそれぞれクライアントとサーバを表すオブジェクトのようです。

ClientDolphin clientDolphin = config.getClientDolphin();
ServerDolphin serverDolphin = config.getServerDolphin();

で、ここでやっと最初の図にあった「モデル」がでてきます。
まずはクライアントのclientDolphinに「input」という文字列をIDにしたPrensetationModelに「text」という属性があるよ、と定義します。

PresentationModel input = clientDolphin.presentationModel("input", new ClientAttribute("text"));

で、JavaFXのInputFieldのtextプロパティと、定義したinputというPresentationModelのtextをバインドしてね、と。

JFXBinder.bind("text").of(field).to("text").of(input);

そしてサーバのserverDolphinでは、PresentationModelのinputにあるtext属性の値を受け取って標準出力する形です。

config.getServerDolphin().action("PrintText", new NamedCommandHandler() {
    public void handleCommand(NamedCommand namedCommand, List<Command> commands) {
        Object text = serverDolphin.getAt("input").getAt("text").getValue();
        System.out.println("server text field contains: " + text);
    }
});

serverDolphinからすると、クライアント側がどんな実装でどんなオブジェクトかは気にしてない所がポイントのようです。
PresentationModelのinputにあるtext属性をみてるだけで、そこにバインドするのはクライアント側の実装次第。

なるほどー。

Step3以降はこれをベースに色々と拡張していき、Step5ではモジュールを完全に分割したりしています(clientプロジェクト、serverプロジェクトがそれにあたる)
最後はserver-appでServletベースのサーバを使った、より現実的な所まで含まれているので、興味ある方は実際に1つ1つ動かしながら確認するのがいいのかなと思います。

ここまで書いてふと思ったのですが、サーバサイドはREST APIでJSONベースにリッチクライアントとやりとりするような構成と何が違うんだろうなぁ…と(^^;簡単なレベルでしかみてないので、PresentationModelを使うことの大きなメリットとか、その辺がイマイチぴんときてなかったり…。

OpenDolphinはJavaOneなどでも発表があったり、海外では結構情報ありそうですが、日本語が全然なかったので、その辺の流行り具合とかもご存じの方がいれば是非コメント頂ければと思います(>_<;

JavaFX Advent Calendar 2014 、明日は @tomo_taka01 さんです!

にほんブログ村 IT技術ブログへ
にほんブログ村 にほんブログ村 IT技術ブログ Javaへ
にほんブログ村