# パッケージ org.opengion.hayabusa.report2

package org.opengion.hayabusa.report2

     OpenOfficeを利用した帳票システム関係のクラスです。

     従来のExcel帳票は、互換性のため残っていますが、こちらのパッケージが今後の主流の帳票システムになります。

- Related Packages
  パッケージ
  説明
  org.opengion.hayabusa
  このドキュメントは、Ｗｅｂアプリケーションフレームワーク『はやぶさ』の ＡＰＩ 仕様です。
- クラス
  説明
  DocConverter_OOO
  OpenOfficeを利用して様々な形式のﾌｧｲﾙを読み込み､出力･印刷を行うための変換ｸﾗｽです｡ 変換を行うことのできる入出力のﾌｫｰﾏｯﾄ以下の通りです｡ [対応ﾌｫｰﾏｯﾄ] 入力[Calc(ods) ,Excel(xls) ] ⇒ 出力[Calc(ods) ,Excel(xls,xlsx) ,PDF] 入力[Writer(odt) ,Word(doc) ] ⇒ 出力[Writer(odt) ,Word(doc,docx) ,PDF] 入力[Impress(odp),PowerPoint(ppt)] ⇒ 出力[Impress(odp),PowerPoint(ppt,pptx) ,PDF] 入力[ * 上記の全て ] ⇒ 印刷 ※ xlsx,docx,pptx は､MS 2007形式の為､LibreOffice のみ利用できます｡ 変換を行うには､以下の2通りの方法があります｡ (1)簡易的な変換ﾒｿｯﾄﾞを利用する場合 #convert(String, String)を利用して､変換を行います｡ この場合､出力形式は､出力ﾌｧｲﾙの拡張子に従って自動的に決定されます｡ このため､印刷処理などを行う場合は､(2)の方法で出力して下さい｡ (2)段階的に各ﾒｿｯﾄﾞを呼び出して変換する場合 ｵﾌﾞｼﾞｪｸﾄを生成した後､`DocConverter_OOO.open()`､#(各種変換ﾒｿｯﾄﾞ)､`Object.clone()`を 順番に呼び出して変換を行います｡ この場合､出力形式は､それに対応するﾒｿｯﾄﾞを呼び出すことで決定されます｡ また､変換を行うための､各種ﾒｿｯﾄﾞは､例外としてThrowableを投げるように定義されています｡ このｸﾗｽを利用する場合は､このThrowableをcatchし､catch句で､必ず`DocConverter_OOO.close(boolean)`に､ "true"(ｴﾗｰ発生時のｸﾛｰｽﾞ処理)を指定して､終了処理を行って下さい｡ (これを行わない場合､OpenOfficeの不要なﾌﾟﾛｾｽが残ってしまう可能性があります) また､出力ﾌｧｲﾙが既に存在する場合､出力ﾌｧｲﾙは一旦削除された後､処理されます｡ なお､入力ﾌｧｲﾙと出力ﾌｧｲﾙが同じ場合､何も処理されません｡(例外も発行されません) 入力ﾌｧｲﾙを､CSV形式で複数指定した場合､複数の入力ﾌｧｲﾙをﾏｰｼﾞして出力します｡ ※1 現状は､ﾌｧｲﾙのﾏｰｼﾞは､入力ﾌｧｲﾙがExcelまたはCalcの場合のみ対応しています｡ ※ DocConverter は､ｸﾗｳﾄﾞ対応されていません｡変換時はﾛｰｶﾙﾌｧｲﾙ間で行ってください｡
  ExecProcess
  帳票要求に設定された実行方法により､各種出力､Excel取り込み処理を行います｡ 1.出力 雛形ﾌｧｲﾙを一時ﾃﾞｨﾚｸﾄﾘに展開した後､帳票ﾃﾞｰﾀを埋め込み､最後にOpenOffice.orgの ﾌﾟﾛｾｽを利用して出力を行います｡ 対応している出力方法は､印刷､PDF出力､Excel出力です｡ 一時ﾃﾞｨﾚｸﾄﾘは､ｼｽﾃﾑﾘｿｰｽのREPORT_FILE_URLで定義されたﾃﾞｨﾚｸﾄﾘです｡ これが定義されていない場合は､ｼｽﾃﾑﾘｿｰｽのFILE_URLで定義されたﾃﾞｨﾚｸﾄ以下の/REPORTに 展開されます｡ 一時ﾌｧｲﾙは､処理が正常に終了した場合､削除されます｡(ODS出力のみにした場合は､出力直前の ODSﾌｧｲﾙは残ります) 処理でｴﾗｰが発生した場合は､一時ﾌｧｲﾙはﾃﾞﾊﾞｯｸﾞのため､削除されません｡ 2.取り込み 旧帳票ｼｽﾃﾑの取り込み処理及びその後のPG起動を行います｡ 実行方法により､出力､入力を行います｡
  ExecQueue
  帳票処理要求を管理するｷｭｰｵﾌﾞｼﾞｪｸﾄです｡ このｵﾌﾞｼﾞｪｸﾄでは､帳票の定義及びﾃﾞｰﾀと､処理中に発生したｴﾗｰﾒｯｾｰｼﾞを管理します｡ また､このｷｭｰを生成したｵﾌﾞｼﾞｪｸﾄもこのｵﾌﾞｼﾞｪｸﾄにｾｯﾄされます｡
  ExecThread
  帳票要求ｽﾚｯﾄﾞの本体です｡ 外部からｽﾀｯｸされたｷｭｰを先入れ先出しの順番に処理します｡ あるｷｭｰに対してｴﾗｰが発生すると､ｼｽﾃﾑﾘｿｰｽのRETRY_COUNTで設定された回数再処理を試みます｡ この回数分ｴﾗｰが発生した場合は､そのｷｭｰのみがｱﾌﾟﾘｴﾗｰとなります｡ このｽﾚｯﾄﾞは一度生成されると､外部から明示的に終了の要求を起こさない限り生存し続けます｡ 終了するには､finish()ﾒｿｯﾄﾞを呼び出します｡ このﾒｿｯﾄﾞが呼ばれると､内部でｽﾀｯｸしているｷｭｰは全てｸﾘｱされるため､その時点で 処理されているｷｭｰの処理が完了した時点で､ｽﾚｯﾄﾞが終了します｡
  ExecThreadManager
  帳票処理を行う各スレッドを管理するクラスです。
  OdsContentParser
  指定されたﾊﾟｽに存在するODSの各XMLﾌｧｲﾙをﾊﾟｰｽし､帳票定義及び 帳票ﾃﾞｰﾀから書き換えます｡ 書き換えは読み取り先と同じﾌｧｲﾙであるため､一旦読み取った各XMLを ﾒﾓﾘ上に格納したからﾊﾟｰｽ後のXMLﾌｧｲﾙの書き込みを行います｡ ﾊﾟｰｽ対象となるﾌｧｲﾙは以下の3つです｡ content.xml ｼｰﾄの中身を定義 meta.xml ﾒﾀﾃﾞｰﾀを定義 style.xml 帳票ﾍｯﾀﾞｰﾌｯﾀｰを定義 content.xmlのﾊﾟｰｽ処理として､まずxmlﾌｧｲﾙをｼｰﾄ+行単位に分解します｡ その後､分解された行毎に帳票ﾃﾞｰﾀを埋め込み､出力先のXMLに書き込みを行います｡ 書き込みは行単位に行われます｡ また､Calcの特性として､関数の引数に不正な引数が指定された場合､(Text関数の 引数にnullが指定された場合等)､ｴﾗｰ:XXXという文字が表示されます｡ ここでは､これを回避するため､全ての関数にisError関数を埋め込み､ｴﾗｰ表示を 行わないようにしています｡
  OdsSheet
  ｼｰﾄ単位のcontent.xmlを管理するためのｸﾗｽです｡ ｼｰﾄのﾍｯﾀﾞｰ､行の配列､ﾌｯﾀｰ及びｼｰﾄ名を管理します｡ 7.0.1.5 (2018/12/10) FORMAT_LINEでは､同一行をｺﾋﾟｰするため､ｾﾙの選択行(A5とか$C7とか)までｺﾋﾟｰされ 行ﾚﾍﾞﾙの計算が出来ません｡その場合は､INDIRECT(ADDRESS(ROW();列番号))関数を 使用することでｾﾙのｱﾄﾞﾚｽが指定可能です｡ 列番号は､A=1 です｡ ※ OpenOffice系は､区切り文字が『;』 EXCELの場合は､『,』 要注意 ※ 繰り返しを使用する場合で､ﾍｯﾀﾞｰ部分の印刷領域を繰り返したい場合は､ 1.
  ProcessFactory
  Sofficeのﾌﾟﾛｾｽを管理するﾌｧｸﾄﾘｸﾗｽです｡ ﾌﾟﾛｾｽﾌﾟｰﾙの実装は､AbstractObjectPoolを継承して実装されています｡ ﾌﾟﾛｾｽの初期生成数は0です｡最大生成数は､ｼｽﾃﾑﾘｿｰｽのREPORT_MAX_PROCESS_COUNTで 定義されます｡また､生存時間は､REPORT_PROCESS_ALIVEで定義されています｡ ﾌﾟﾛｾｽを全て終了するには､clearﾒｿｯﾄﾞを呼び出します｡ clearﾒｿｯﾄﾞは､Cleanableｲﾝﾀｰﾌｪｰｽの実装として組み込まれ､SytemManagerに登録されるため､ Tomcat終了時に､自動的にﾌﾟﾛｾｽが終了されます｡ 但し､貸し出し中(処理中)のﾌﾟﾛｾｽは､AbstractObjecgPoolの実装から､終了されないため､別の方法で 明示的にkillする必要があります
  ProcessFactory.ProcessPool
  ProcessPool は､AbstractObjectPool を継承した ｵﾌﾞｼﾞｪｸﾄﾌﾟｰﾙです｡ OpenOfficeのﾌﾟﾛｾｽをﾌﾟｰﾙします｡
  QueueManager
  帳票処理のキューの処理方法を定義するインターフェースです。
  QueueManager_DB
  DBからｷｭｰを作成するためのｸﾗｽです｡ ｷｭｰはGE5xﾃｰﾌﾞﾙから作成されます｡ ｷｭｰ生成時点(処理ｽﾚｯﾄﾞにｽﾀｯｸした時点)では､帳票ﾃﾞｰﾀのﾃｰﾌﾞﾙﾓﾃﾞﾙは作成されません｡ 帳票ﾃﾞｰﾀは､各ｽﾚｯﾄﾞからset()ﾒｿｯﾄﾞを呼び出したﾀｲﾐﾝｸﾞで生成されます｡ 処理開始及び､完了のｽﾃｰﾀｽは､GE50の完成ﾌﾗｸﾞに更新されます｡ また､ｴﾗｰ発生時のﾒｯｾｰｼﾞは､GE56に更新されます｡
  QueueManager_DB.DBTableModelCreator
  帳票明細ﾃﾞｰﾀを帳票ﾚｲｱｳﾄﾃｰﾌﾞﾙに従って分割し､その結果をDBTableModelとして 生成します｡ ﾃﾞｰﾀの分割は､ﾊﾞｲﾄ数ﾍﾞｰｽで行われるため､ｴﾝｺｰﾄﾞを正しく指定する必要があります｡ ｴﾝｺｰﾄﾞ指定は､ｼｽﾃﾑﾘｿｰｽのDB_ENCODEで指定します｡ ﾚｲｱｳﾄﾃｰﾌﾞﾙが存在しない場合､又は､帳票ﾃﾞｰﾀが存在しない場合､DBTableModelは nullで返されます｡
  QueueManager_DIRECT
  画面から直接キューを作成するためのクラスです。
  SOfficeProcess
  OpenOfficeのﾌﾟﾛｾｽを表すｸﾗｽです｡ bootstrap()ﾒｿｯﾄﾞが呼ばれたﾀｲﾐﾝｸﾞでsoffice.binのﾌﾟﾛｾｽを生成します｡ soffice.binのﾌﾟﾛｾｽを引数なしで実装した場合､通常は各ﾕｰｻﾞｰで1ﾌﾟﾛｾｽしか 生成されないため､-env:UserInstallationの引数を指定することで､仮想的に別ﾕｰｻﾞｰ として起動しています｡ この"ﾕｰｻﾞｰ"を表すｷｰは､ｺﾝｽﾄﾗｸﾀの引数のidです｡ また､この仮想ﾕｰｻﾞｰで起動した場合､初回起動時にﾕｰｻﾞｰ登録を促す画面が立ち上がります｡ これを回避するため､ﾃﾞﾌｫﾙﾄの環境ﾌｧｲﾙをﾌﾟﾛｾｽ生成前にｺﾋﾟｰすることで､認証済みの 状態で立ち上がるようにしています｡ 起動したﾌﾟﾛｾｽとの通知は名前付きﾊﾟｲﾌﾟで行われます｡ﾊﾟｲﾌﾟ名は､"env"+ｺﾝｽﾄﾗｸﾀのidです｡ ﾌﾟﾛｾｽ起動と､名前付きﾊﾟｲﾌﾟでの接続は非同期で行われます｡ ﾌﾟﾛｾｽ起動後､60秒経過しても接続できない場合は､BootstrapExceptionが発生します｡
  SOfficeProcessTcp
  OpenOfficeのプロセスを表すクラスです。
  TagParser
  Calc帳票ｼｽﾃﾑでﾀｸﾞのﾊﾟｰｽを行うためのｸﾗｽです｡ 主に開始ﾀｸﾞ､終了ﾀｸﾞを指定したﾊﾟｰｽのﾙｰﾌﾟ処理を行うための機能を提供します｡ 具体的には､`TagParser.doParse(String, String, String)`により､ﾊﾟｰｽ文字列､開始ﾀｸﾞ､終了ﾀｸﾞを 指定し､ﾊﾟｰｽを行います｡ ﾊﾟｰｽ後の文字列は､`TagParser.doParse(String, String, String)`の戻り値になります｡ ﾊﾟｰｽ実行中に､発見された開始ﾀｸﾞから終了ﾀｸﾞまでの間の文字列の処理は､`TagParser.exec(String, StringBuilder, int)`を ｵｰﾊﾞｰﾗｲﾄﾞすることにより定義します｡ また､このｸﾗｽでは､ﾊﾟｰｽに必要な各種ﾕｰﾃｨﾘﾃｨﾒｿｯﾄﾞについても同様に定義されています｡
  TagParser.SplitKey
  ｱﾝﾀﾞｰﾊﾞｰで､ｷｰと行番号の分離を行います｡