Challenge Engineer Life !

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

PrimeFaces FileUpload component doen't work on Embedded Glassfish.

Now, I'm developing offline web system after finishing developing online web.

I had experience once. I wrote following posts about how I developed offline web before.But these are Japanese.

kikutaro777.hatenablog.com
kikutaro777.hatenablog.com

This time, I found some strange behavior.

In this system, we use PrimeFaces FileUpload component. The version of PrimeFaces is 5.2. Of course it works fine on GlassFish.

But, unfortunately, it doesn't work on Embedded GlsasFish :q

I don't understand what happened inside and what is different between GlassFish and Embedded GlassFish.

I checked the document of PrimeFaces. Really appreciate the good document.

http://www.primefaces.org/documentation

The document explained there are three options for FileUpload component.
auto / native / commons.

The default mode is auto.

PrimeFaces tries to detect the best method by checking the
runtime environment, if JSF runtime is at least 2.2 native uploader is selected, otherwise commons.

I tried to use the option "native", but nothing changed.
After that, I tried "commons".

Finally, it worked on Embedded Glassfish !!!

The explanation of the document about "Commons" is following.

This option chooses commons fileupload regardless of the environment, advantage of
this option is that it works even on a Servlet 2.5 environment.

I still don't understand what happened inside... anyway, it's good for us now.

Java EEを利用したオフラインWebシステム構築にChallenge! ~その2~

昨日の続きです。

f:id:kikutaro777:20140207202741p:plain

Java EEを利用したオフラインWebシステム構築にChallenge! ~その1~

上記のような仕組みでJava EEで構築したシステムをオフライン化してるのですが、昨日も書いたようにオンラインとオフラインで異なるデータベースを利用しています(^^;

ここが本当に気になって気になって、誰でも同じ心配をすると思うのですが

f:id:kikutaro777:20140208184410p:plain

という疑問が。

実際DDLとかの記述では違いもあって、自動採番で1ずつインクリメントするカラムなど

MS SQLだと IDENTITY(1,1)

ですが

Derby だと IDENTITY(START WITH 1,INCREMENT BY 1)

だったり(^^;

元々存在しているオンラインのシステムがどんなテーブル定義をしているか、それらをオフライン側のデータベースで使えるのか、はベタにコツコツ調査するしかないかなと。

今回特に注意してたのは

  • ストアドやトリガー、その他ベンダ依存の機能利用があるかないか
  • どんなデータ型を利用しているか、お互いで互換がありそうかどうか

辺りでした。幸い今回オフライン対象となったシステムでは前者で該当するものがないシンプルな作りだったので、後者をメインに調査。

MS SQL ServerもApache Derbyも各々ドキュメントは豊富なのでありがたいですが、どう調べて検証すればいいのか…よくわからず、以下のように行いました。

とりあえずMicrosoft SQL Serverを利用する際、JDBCドライバを介するので、そこのドキュメントを確認。
http://technet.microsoft.com/ja-jp/library/ms378599.aspx

基本型のマッピング表が以下のようにあります。
http://technet.microsoft.com/ja-jp/library/ms378878.aspx

まずはここから対象システムで利用しているSQLの型とJDBCのマッピングを抜粋しました。

SQL Server型 JDBC型
bit BIT
int INTEGER
nvarchar VARCHAR
NVARCHAR
datetime TIMESTAMP

などなど。他にも色々あるのですが、ここでは一部抜粋でこんな感じに。

Derbyのドキュメントでもデータ型に関する場所があります。
Data typesという章の部分。
http://db.apache.org/derby/docs/10.10/ref/
※利用バージョンごとにちゃんとドキュメントは分かれています

ここでデータ型をみてみると、JDBCでの型が確認できます。例えばINTEGERの部分をみると以下のような感じです。

f:id:kikutaro777:20140208192731j:plain

で、ここからJDBC型からDerbyでの型を拾っていくことで

SQL Server型 JDBC型 Derby型
bit BIT 該当なし
int INTEGER INTEGER
nvarchar VARCHAR VARCHAR
NVARCHAR VARCHAR
datetime TIMESTAMP TIMESTAMP

みたいな。JDBCを介してSQL ServerとDerbyの型マッピングができるかなと。
BITのようにピンポイントで該当するものがない場合は、CHAR FOR BIT DATAやBOOLEANで代替可能か?を実際に確認しました。

で、確認・検証方法ですが、実際にデータベース、テーブルを準備して行いました。

気にしているのは、オンライン時にMS SQL Serverで保存されたデータがオフライン環境のApache Derbyへ格納されたり、その逆があったり、というのをJPAを介して問題なくできるか、という所です。
なので、実際Sync(同期)するときに利用するJAX-RSで各々で作成したデータをJSONで比較しあうことで検証しました。

というのも、同期はJSONでJava Entityオブジェクトベースに行うので、JSONが同じであれば、利用してるプログラムは同じなので、同じEntityになるはず、と。

f:id:kikutaro777:20140208193109p:plain

こういう検証の仕方で適切なのか、わからないのですが、実際にシステムを介して作成したデータ同士を比較できるので安心感はあるかなと。

Java EEを利用したオフラインWebシステム構築にChallenge! ~その1~

少し前に「オフラインのWebシステム構築」を調査・検証・プロト作成することになりました(^^;

実際に動くモノがだいぶ形になったので、少しずつ書いていこうかなと。

まずは、そもそもなんでそんなことをすることになったか…の背景から整理してみます。

オフライン機能への需要

お客さんからよく聞く要望

自分の所属組織では日頃、案件管理や販売管理のシステムを主に受託開発しています。

昔はWindows Formなどで開発するのがメインでしたが、最近だとイントラでの利用であってもWebシステムを求められることが多くなり、直近で開発したものはほとんどWebシステムでした。

で、案件管理とか販売管理システムは、実際の利用者(エンドユーザ)の方が営業担当者であったりするため

「出先でネットにつながらない場合もあるので、オフラインでシステムを利用したい。」

と言った話をよく聞きます。

また、私は実際に触ったことはないのですが、Salesforce CRMにもそういった機能があるので、よくある話なのかなと。

どんな状況下でも仕事ができるようにならねばならないとは大変だなぁと思いつつ(^^;

自分達でも欲しいケース

一方で、自分達でも欲しいときがあります(^^;

それはオフラインというよりは、手軽に起動できるWebシステム、なのかもしれませんが。

例えば、営業さんのサポートでWebシステムをデモする場合など、自分がデモする際にはノートPCに環境整ってるし特に困ることはないです。

ただ、営業の方が突如「単独でデモしたいんだけど!!」となった場合

  • 操作動画でデモしてもらう
  • VPNでつないでもらう
  • デモ対象のWebシステムを公開サーバに置く
  • その人のノートPCに環境を構築する

などなど選択肢は色々ありますが、最後の選択肢を求める人が多い気がします。

で、それなりの時間をかけて

環境準備して…

DB入れて…

APサーバ立てて…

と、環境構築するだけでそれなりに手間がかかりますし

「マシン変えた」…「他の営業にも同じ構築を」…「お客さんに貸し出す」…

などなど。手順書渡したりしても失敗したり、インストーラ作っても環境によって失敗しちゃったり。

究極的には「コピペすれば動く」くらいにもっていけると…と思ったり(^^;

組込系を上手く使うことで、この辺りも実現できるかと。

実現方法は?

オフラインと聞いて、自分がまず思い浮かぶのはhtml5を利用して…Web Storageを利用して…といったイメージです。

去年参加したhtml5j conferenceで、まさにそういう内容の話を聞きました。
http://events.html5j.org/conference/2013/11/sessions

セッションの動画が公開されてました!↓

ただ、私のいる環境ではまだhtml5でシステム提供をした経験がないし、詳しい人もいない…。

そうなると、完全にクライアント専用のGUIを新たに構築する…といった選択肢?
元々クライアントがWindows Formなどで、Webサービスと通信、みたいなクラサバで作っていれば、少し頑張ればいける気がしますが(^^;

でもそもそも提供したのがWebシステムだったりすると、エンドユーザさんとしては日頃見慣れたブラウザでの画面で操作できるのが良いわけで…。

で、去年からJava EEをメインに開発しているので、それ前提にした場合、どのように構築できるか?を模索してきました。

そこで

  • Embedded GlassFish
  • 組込みデータベース

を利用しつつ、いくつかの条件が揃えば実現できるのでは?ということで、実際にJava EE6で構築した運用システムのオフライン化を検証していきました。

現在作ってるもの

最終的には以下のような構成図の仕組みです。

f:id:kikutaro777:20140207202741p:plain

わりと素直な構成だと思うのですが、一番の問題点はオンラインとオフラインで異なるベンダのデータベースとなっている点です。

今回オフライン構築対象のWebシステムでは、もともとMicrosoft SQL Server 2012がDBとして使われていました。

であればオフラインでは、SQL Server 2012のLocalDBとかを選択するのが素直なのですが、まだ対応したJDBCドライバがないっていう…(-_-;
まあLocalDBは開発用って感じで実際に運用で使えるかどうか、その辺りも見えないのですが;

ちなみに今後JDBCドライバを設ける予定はありそうな感じの情報も。
http://connect.microsoft.com/SQLServer/feedback/details/771612/jdbc-support-for-localdb

この「異なるベンダのデータベース」と聞いて思い出すのは、よくオラクルさんのJava EEセミナーなどでちょこちょこ聞く「JPAを使うことでデータベースの差異を吸収」「JPQLを使うことでクエリ変更も不要」という売りです(^^;

思想は理解しつつも、実際は大変だろうなぁ、ってかそもそも1つのシステム内で異なるDBを複数使うことはあまりないよなー、と聞き流していたのですが、まさか使うシチュエーションになるとはっ(^^;

でも実際に上記構築をしてみて、JPQLを利用してて良かった…と思いました。
1箇所だけNative Queryで書かれた部分があったのですが、幸いそこはJPQLに書き換え可能だったので書き換えることで問題なくいけました。

ただ、この辺に関しては色々条件がそろわないと駄目(利用してる型とかストアドがないとか)で、そこらへんはまた別途まとめようかなと思います。

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