読者です 読者をやめる 読者になる 読者になる

Challenge Java EE !

Java EEを中心に趣味や仕事における開発メモを書いています。

Salesforce Driver by JavaFX

JavaFX AdventCalendar NetBeans

この記事は、JavaFX Advent Calendar 201524 日目の記事です。

昨日は id:kozake (@s_kozake) さんの 「続・AndroidでJavaFXを動かしてみたよ!」 でした。
明日は id:skrb (@skrb) さんがトリを飾られます(^^)!!


今年1年を振り返ってみると、技術的に新しいものを探したり・触ったりする余裕がない1年でした。逆に言えば真面目に仕事をしていたというか(^^;

そんなわけで、残念ながらJavaFXに関してもあまり新しいネタはありません。(すみません…

ということで、今日は実際の仕事でJavaFXをこんな風に使ってみた、というネタにしたいと思います。

現場 x JavaFX

ちょうど昨日のJavaFX Adventでこざけさんが「JavaFXは僕の好きな技術ですが、イマイチ現場で使われている感がありません。」と書かれていました(^^;

皆さんの現場ではどうでしょう(^^;?

ちなみに自分の所(部門)では、デスクトップアプリを作る際はWindows FormやWPFといった.NET技術を使っています(C#)

JavaFXは存在は知っているものの(多分…)、最終的には使い慣れた技術のほうが実案件で選ばれるのは仕方がない…という所でしょうか(^^;

元々Windows系が多いので、あえてJavaFXを選択するラインがないです。

また、会社全体でみると、同様に.NET系が多いようですが、Javaの場合だと、やっぱりSwingが主力みたいなところは普通にあるようです。

仮配属にきた新人さんへJavaFXを少し触ってもらったのですが、本配属先ではSwingでした、というのが今年はありました。

テストドライバ x JavaFX

実案件は難しいけど、脇で使ったり、直接お客さんが触るものでない所でJavaFXを…と思って1年くらい経つのですが、少し前にちょうどいい感じの仕事が出てきました。

その仕事は、Salesforceと連携して使う、とあるWebシステム構築案件です。

Salesforceをご存じの方はわかると思いますが、Salesforceは非常にカスタマイズ性が高く、Apexという言語で画面作ったり、ボタンで複雑な処理を呼び出したり、色々なことができます。

うちは導入ベンダなどではないので、Salesforce部分は専門ベンダさんが構築で、うちが作るWebと連携する形です。

f:id:kikutaro777:20151224185907p:plain

当初連携ではSalesforceのRESTを使おうとしてましたが、最終的にはSOAPを使っています(詳細は以下エントリ)

kikutaro777.hatenablog.com

実際やってみるとSOAP使った連携は楽だよなぁと。SFDCのWSDLからクラス自動生成できますし。

さて、本題です。

今回のシステムでは、Salesforce側でうちのWeb画面を呼び出す前に色々とオブジェクトを操作する流れがあります。その後、うちのシステム側に情報が来て、加工して、SOAP APIで更新する、みたいな。更新するには先にSaleforceのロジックでオブジェクトが作成されていないといけない、などですね。

連携とかの開発ではよくある話だと思いますが、両社の開発過程では、まだ色々出揃ってないのでドライバやスタブなどが必要となります。

ドライバやスタブがわからない場合は情報処理試験の本以下ページにある図などがイメージしやすいかと。

What is the difference between stubs and drivers in software testing? - Quora

実際Salesforce上のApexなどでドライバが作れれば最高なわけですが、今回は期間的にもドライバを相手方に作ってもらう時間や、うちがApexを習得して自前でドライバを作る余裕はありませんでした。

なので、Javaで普通にSOAP APIを叩いて、Salesforce上で何かの操作をした後のオブジェクト構造とかを作り出すドライバを作りました。

f:id:kikutaro777:20151224190748p:plain

せっかくなので、JavaFXで作って、ドライバで作ったデータをすぐ確認できるように、WebViewもつけてます。以下のような感じ。

f:id:kikutaro777:20151224191326j:plain

ドライバでテストデータを作って、ブラウザ使わずともWebViewでみれたり。

f:id:kikutaro777:20151224191340j:plain

現場への導入第一歩としては良い感じではないかなーと(^^;

JavaFX使うと何がどこまでできるのか、とかも徐々にナレッジが溜まりそうですし。

書いてるコード

このプロジェクトで作ってるドライバは、非常に簡単なコードの集まりです(^^;

以下に、明日トリを飾る@skrbさんが以前JJUGでハンズオンをされたときの資料がありますが、これを1回やれば普通にできるレベルです。

上記ハンズオン資料は非常に細かく手順も書かれているので、新人さんでも普通にこなせます。
実際、プログラミング経験がほとんどない新人さんにやってもらったりもしてるので。

NetBeansでunpackingが遅い

ドライバ作ってるときにちょっと出会ったネタを最後に1つだけ。

自分はNetBeansでMavenを利用してJavaFXアプリを作っています。画面はSceneBuilderで。

で、今回のドライバはSalesforceのライブラリを使ったり、その他、諸々と依存性があったのですが

ビルドが超遅い(^^;

コンソールみると

f:id:kikutaro777:20151224192542j:plain

unpackingをすごいしています。調べると、java -jarで実行可能なjarファイルを作ってくれてて、そのために依存ライブラリをいれてるっぽい。

で、以下に同じ話がありました。

stackoverflow.com

上記StackOverflowにあった解決案としてprofileを作成するというのがあって、自分はそうしました。

NetBeans(ちなみに8.0.2) & Mavenで自動作成されたpom.xmlには

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.2.1</version>
    <executions>
        <execution>
            <id>unpack-dependencies</id>

            <phase>package</phase>
            <goals>
                <goal>exec</goal>
            </goals>
            <configuration>
                <executable>${java.home}/../bin/javafxpackager</executable>
                <arguments>
                    <argument>-createjar</argument>
                    <argument>-nocss2bin</argument>
                    <argument>-appclass</argument>
                    <argument>${mainClass}</argument>
                    <argument>-srcdir</argument>
                    <argument>${project.build.directory}/classes</argument>
                    <argument>-outdir</argument>
                    <argument>${project.build.directory}</argument>
                    <argument>-outfile</argument>
                    <argument>${project.build.finalName}.jar</argument>
                </arguments>
            </configuration>
        </execution>
        <execution>
            <id>default-cli</id>
            <goals>
                <goal>exec</goal>                            
            </goals>
            <configuration>
                <executable>${java.home}/bin/java</executable>
                <commandlineArgs>${runfx.args}</commandlineArgs>
            </configuration>
        </execution>
    </executions>  
</plugin>

のような定義があるので、これを

<profiles>
    <profile>
        <id>executable</id>
        <build>
            <plugins>
                <plugin>
                    <!-- <groupId>以降をここへ移動 -->
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

これで、通常ビルドではunpackingせずに、実行可能なjarを作成したいときは以下プロファイルを指定してビルドすればいいような形になりました。

f:id:kikutaro777:20151224193022j:plain

明日は@skrbさんがトリを飾られます(^^)!!!

OpenDolphinでEnterprise JavaFX

JavaFX OpenDolphin

このエントリーは 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 さんです!

JavaFX Nightに参加しました~ #javafx_ja

JavaFX

最近、勉強会に参加しましたエントリしか書いてない気がするのですが…(^^;

昨日11/25に行われた「JavaFX Night」に参加してきました。

JavaFX Night - 日本 JavaFX ユーザグループ | Doorkeeper

ここ最近JavaFXを触っていないのですが、いつか仕事で使ってみたいと思っているのでネタ収集はしていかないと。

発表はスライドが公開されているのと、@yusukeさんによって早くもYouTubeに動画がアップされているので、参加できなかった方はそちらでみれます!!以下スライドと動画リンクもまとめておきます。

JavaFXにダイアログがやってくる @btnrougeさん

@btnrougeさん講演動画
JavaFXにダイアログがやってくる #javafx_ja #jjug - YouTube

Twitter上で多数「なんで今までダイアログなかったんだ…」とつぶやいてるのが見えたのですが(^^;

やはりGUI作る上では欲しいですよね。

仕事で使う場合には、標準としてダイアログがないと上司が「は?ダイアログもないやつ使うな」とか言いそうで不便かなと。

それにしても蓮沼さんってJava SE, EEそしてJavaFXと、なんでこんな守備範囲広いんだ…すごいなぁ。

HeapStats loves JavaFX @YaSuenagさん

@YaSuenagさん講演動画
今さらはじめるJavaFX 北面 正英 @mshdktom #javafx_ja #jjug - YouTube

Java障害解析支援ツール「HeapStats」のアナライザをSwingからJavaFXへ移行したというお話。

プラグインで新たな機能を追加できる(画面的にはタブで)という仕組みが興味深かったです。これ絶対便利そう!

デモをみると、グラフがきれいで、やはりJavaFXいいなーと。

発表内容の後半は、実際の開発における苦労話もあって、細かい所では色々大変なんだなぁと。

とても勉強になりました。

Bind Me Softly @skrbさん

@skrbさん講演動画
Bind Me Softly 櫻庭 祐一 @skrb #javafx_ja #jjug - YouTube

日本で一番JavaFXについて詳しく書かれている「JavaFX 2で始めるGUI開発」の著者である櫻庭さんからのお話。
「JavaFX 2で始めるGUI開発」は以下ITProの「Java技術最前線」連載の中にあります(^^)って多分JavaFX書いたことある人なら一度はみてるはず。

前にJavaFXで遊んでいたときはバインドを知らなくて全然触っていなかったのですが、この話を聞いたら「めっちゃ便利そう!」となりました(>_<;

スライドの12ページとか14ページとかでスライダーを例にしたデモ(デモといっても、櫻庭さんのスライドはJavaFXで作られているので、スライドの中でそのまま動いているというww)とかみると「おおー」ってなりますね。是非動画で確認を!

プロパティとバインドの話は上記連載の中にもあるので、改めて全部じっくり読まねば(>_<;

LT

最後は2本のLTでした。

@mine_neckさんによる「サーバーサイドJavaFX」のお話。

jettyのServletからJavaFXをキックして音楽鳴らすという試みの話でした。
クラウドの音楽サービスの名前メモし忘れました(^^;;

@mshdktomさんから「今さらはじめるJavaFX」のお話。

初LTとのことでしたが、落ち着いて発表されててすごいなーと。私もJavaFX初心者な中、JavaFX勉強会で発表させて頂いたのですが、緊張しっぱなしだった記憶が(^^;
(ピンマイクつけたまま席戻ってしまった苦い思い出が)

LTの中でアプリ配信の仕組みがあれば~という話をされていて、個人的に.NETのClickOnceを思い出して以下つぶやいたのですが、Web Start使えばとコメント頂きました。なるほどー。

JavaFX Advent Calendar 2014

ということで、まだJavaFXを触ったことがない方も、触ったことがあることも、JavaFX Advent Calendarに登録してJavaFXを楽しみましょう~!

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