« Client の引っ越し:REST(8) | トップページ | 受付情報の扱い »

2015年2月27日 (金)

beanBytes の処理:REST(付録)

以上の改造で RESTEasy で動くようになったが,1つ気になる部分があった。HealthInsuranceModel,StampModel,ModuleModel には beanBytes というフィールドがあり,bean object を xml 変換して,さらにbyte 配列に変換したものが入って永続化されている。今回,REST化で json を使ったため,object が xml に変換されてさらに byte 配列に変換された beanBytes が json 化でさらに Base64 の文字列に変換されて流されるという,何だかたいそう複雑なことになってしまっていた。そこで,beanBytes の encode/decode はサーバ側でするように書き直した。こうすると,流れるのは bean の json だけになる。

サーバの変更箇所

  • HealthInsuranceModel
    PatientServiceImpl.getHealthInsuranceList と PatientDelegater.fetchHealthInsurance で,サーバからクライアントに HealthInsuranceModel を返して,クライアントの delegater で HealthInsuranceModel の beanBytes を PVTHealthInsuranceModel にデコードしていたところを,サーバでデコードして,クライアントには PVTHelthInsuranceModel を返してそのまま使えるようにした。
  • StampModel
    StampModel に @JsonTypeInfo,@Transient を付けた IInfoModel stamp を追加する
    @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY)
    @Transient
    private IInfoModel stamp;
    
  • StampServiceImpl
    putStamp / getStamp で, stampBytes を Stamp 実体に encode / decode する処理を入れる。
  • KarteServiceImpl
    • getDocumentList で,ModuleModel を detach して beanBytes を decode してからクライアントに返す。
    • getModuleListで,ModuleModel 一つ一つ detach してから decode して返す。
    • addDocument で,model を beanBytes に encode してから永続化する。

client の変更箇所

  • StampDelegater
    StampDelegater を使っているクラス全て getStampBytes() しているところを getStamp() に変えていく
    DiangosisDocument, KartePane, StampBoxPluginExtraMenu, StampHolderTransferHandler, StampTree, StampTreeModules, StampMakerPanel
    
  • DocmentDelegater
    getDocuments,getModuleList の beanBytes のデコード部分を消す。
  • PnsServiceImpl
    peekKarte で beanBytes をデコードしてから返すようにする。

SchemaModel

SchemaModel にも byte[] のフィールドがあるが,これは jpegBytes で,bean ではないので,そのままにする

StampTreeModel

StampTreeModel にも treeBytes という byte[] のフィールドがある。これは単純な bean ではなく,StampTree のツリー構造を xml で表現したものである。json では byte[] は Base64 変換されて送信されるが,文字列の treeXml で送受信するように書き換えてみたところ,treeBytes で 607kb あった送信データが,treeXml では 469kb に減った。

StampTreeModel (InfoModel) の改名

StampTreeModel がクライアントの open.dolphin.client とサーバの open.dolphin.infomodel の両方にあって,以前から混乱の元になることがあった。この機会にこれを何とかすることにした。
  • サーバ側の open.dolphin.infomodel.StampTreeModel を PersonalTreeModel という名前に変更した。
  • PersonalTreeModel と PublishedTreeModel がほとんど同じだったため,これらの共通部分を @MappedSuperclass の StampTreeBean として書き出し,両者をこれを extend するように書き直した。これに伴い,IStampTreeModel を廃止した。
  • PersonalTreeModel の name フィールドに tree_name という名前が付いていたが,PublishedTreeModel にはついていなかったため,フィールド名は name に統一することにして,d_stamp_tree の tree_name フィールドを psql を使って name にリネームした。
    dolphin=> alter table d_stamp_tree rename tree_name to name;
    
    以前のバージョンのデータベースを restore した場合は,フィールド名の変更が必要になる。
  • これに合わせて,クライアント側で open.dolphin.infomodel.StampTreeModel を PersonalTreeModel に,IStampTreeModel を StampTreeBean に置き換えた。

REST 化の効果

結構大きなプログラム改変であったが,使用感はほとんど変わってないので,変更があったことに誰も気付いていないようだ。

« Client の引っ越し:REST(8) | トップページ | 受付情報の扱い »

OpenDolphin」カテゴリの記事