2.5.4 ユーザ追加処理のカスタマイズ

ここでは,ユーザ追加処理で次の処理を追加します。

ユーザ追加処理をカスタマイズする手順を次に示します。

<この項の構成>
(1) ファイルのコピーとオープン
(2) ユーザ定義クラスのクラス名とコンストラクタ名の変更
(3) 宛先情報をドロップダウンリストへ追加するタイミングの決定
(4) メソッドのカスタマイズ
(5) 宛先情報をデータベースへ格納するタイミングの決定
(6) メソッドのカスタマイズ

(1) ファイルのコピーとオープン

カスタマイズの作業では,SampleConsultationEUR_1_userServerSideClass.javaを直接編集するのではなく,SampleConsultationEUR_1_userServerSideClass.javaをコピーして名称を変更し,このファイルを編集していきます。

ファイルのコピーからオープンまでの手順を次に示します。

操作手順

  1. 次のフォルダにあるSampleConsultationEUR_1_userServerSideClass.javaをコピーし,任意のフォルダに保存します。
    <BLSGのインストールディレクトリ>¥data¥usersource
  2. コピーしたファイルの名称を「Custom_SampleConsultationEUR_1_userServerSideClass.java」に変更します。
  3. EclipseなどでCustom_SampleConsultationEUR_1_userServerSideClass.javaを開きます。
    Custom_SampleConsultationEUR_1_userServerSideClass.javaを編集できるようになります。

(2) ユーザ定義クラスのクラス名とコンストラクタ名の変更

クラス名とコンストラクタ名を変更する手順を次に示します。

操作手順

  1. クラス名とコンストラクタ名を次のように「Custom_SampleConsultationEUR_1_userServerSideClass」に変更します。

    //サンプルソース(ご参考)
    public class Custom_SampleConsultationEUR_1_userServerSideClass extends SampleConsultationEUR_1_Class {

     //コンストラクタ
     public Custom_SampleConsultationEUR_1_userServerSideClass(){
     }
    ・・・

    太字部分が,変更部分です。
  2. 変更内容を保存します。

(3) 宛先情報をドロップダウンリストへ追加するタイミングの決定

ユーザ定義クラス(Custom_SampleConsultationEUR_1_userServerSideClass)は,帳票クラス(SampleConsultationEUR_1_Class)を継承して,BLCEURFormBaseクラスのメソッドをオーバーライドしています。このため,BLCEURFormBaseクラスのどのメソッドを使用するかを決定することで,稟議2作業の宛先情報をドロップダウンリストへ追加するタイミングを決定します。

ここではEUR Form帳票を表示する直前のタイミングで処理を実行させたいため,ufsv_addEURFormPreparation(帳票前処理)メソッドを使用します。

参考
  • 帳票クラスは,「帳票の生成」時,BLSGによって生成されます。「SampleConsultationEUR_1_Class」は,マニュアル「uCosminexus 電子フォームワークフロー システム構築ガイド」に従って作成したときに,BLSGが生成した帳票クラスです。
  • 帳票クラス名(SampleConsultationEUR_1_Class)は,BLSGで帳票定義を作成する際に設定する帳票IDから決定されます。
    このため,「帳票の生成」時,帳票IDを変更(帳票定義を新たに作成するなど)し,ユーザ追加処理として,「Custom_SampleConsultationEUR_1_userServerSideClass」を使用する設定をした場合,「Custom_SampleConsultationEUR_1_userServerSideClass」が継承する帳票クラスを「SampleConsultationEUR_1_Class」から変更したあとの帳票クラスに変更する必要があります。
    帳票IDと帳票クラス名の対応を次に示します。

    図2-18 帳票IDと帳票クラス名の対応

    [図データ]

(4) メソッドのカスタマイズ

ufsv_addEURFormPreparation(帳票前処理)メソッドを次のようにカスタマイズします。

try{
 if("受付-受付".equals(befpi.getInfo(befpi.BEF_NODENAME))){
     ////////////////////////////////////////////////////////////
     // 宛先プルダウンのソート処理開始(EUR Form連携帳票)
     ////////////////////////////////////////////////////////////

     // ユーザIDの取得
     String l_strUserID = befpi.getBLCInfo().getAuthenticateObject().getUserId();

     // BLCDirsオブジェクトの取得
     BLCDirs l_blcdir = new BLCDirsLoader().getDirsObject();
     ArrayList l_arrylist = new ArrayList();

     //取得属性を指定:指定可能な属性は,以下のマニュアル参照。
     //「uCosminexus 電子フォームワークフロー APIリファレンス」
     //「BLCDirsクラス getTargetInfo メソッド」
     l_arrylist.add("CDTARGET");    // 宛先ユーザID
     l_arrylist.add("NMBELONGTO");  // 宛先の所属組織略称
     l_arrylist.add("CDJOBTITLE");  // 宛先の役職コード
     l_arrylist.add("NMJOBTITLE");  // 宛先の役職略称
     l_arrylist.add("NMLASTNAME");  // 宛先の名字
     l_arrylist.add("NMFIRSTNAME"); // 宛先の名前

     //役職コード昇順でソートした宛先リストを取得し,宛先情報ディクショナリに設定。
     //例:宛先の役職コードの降順
     BLCDictionary l_DicTarget = l_blcdir.getTargetInfo(l_strUserID,l_arrylist,"CDJOBTITLE DESC");

     //EUR Formドロップダウンオブジェクトの生成
     EFormDropdownListSetter l_efDDLSetter = new EFormDropdownListSetter();

     //宛先ドロップダウンにデフォルト表示項目を追加
     //「宛先を選択してください。」
     l_efDDLSetter.add(BLCSTRPortal.get(BLCSTRPortal.FMTARGETCLICK),"未選択");
     StringBuffer l_sbTarget = null;
     String l_strIndex = null;
     String l_strTargetUser = null;

     // 宛先登録件数取得
     int l_cntTarget = ((Integer)l_DicTarget.get("blc_target_total")).intValue();

     // 宛先登録件数分ループ
     for (int i=1;i <= l_cntTarget;i++){
       l_strIndex = String.valueOf(i);

       //宛先ユーザIDの取得
       l_strTargetUser = l_DicTarget.item("blc_target_id_" + l_strIndex);

       // 宛先ユーザの表示文字列生成
       // 表示内容は「氏名(組織略称 役職略称)」
       l_sbTarget = new StringBuffer();
       l_sbTarget.append(l_DicTarget.item("blc_target_nmfull_" + l_strIndex));
       l_sbTarget.append("(");;
       l_sbTarget.append(l_DicTarget.item("blc_target_aborg_" + l_strIndex));
       l_sbTarget.append(" ");
       l_sbTarget.append(l_DicTarget.item("blc_target_abjob_" + l_strIndex));
       l_sbTarget.append(")");

       // 宛先ユーザをプルダウンリストに追加
       l_efDDLSetter.add(l_sbTarget.toString(),l_strTargetUser);
       l_sbTarget = null;
     }

     // EUR帳票コントロールの変更
     //受付-受付の時は,ドロップダウンリストを必須入力にする。
     //modifyInstanceDataItem:初期値の設定
     efDoc.modifyControl("CID_DL_ADDRESS2", l_efDDLSetter);
     efDoc.modifyInstanceDataItem("CID_DL_ADDRESS2", "未選択");

     ////////////////////////////////////////////////////////////
     // 宛先プルダウンのソート処理終了
     ////////////////////////////////////////////////////////////
 }
} catch ( BLCException err ) {
   throw err;
} catch ( Exception err ) {  
   BLCException blcErr = BLCException.getUserException( err, 50001, new String [] { "arg1" } );
   throw blcErr;
}

ufsv_addEURFormPreparationメソッドのカスタマイズの詳細を以降で説明します。

(a) 宛先情報をドロップダウンリストへ追加する条件の決定

(3)で決定したメソッド(EUR Form帳票を表示する直前のタイミングで呼ばれるメソッド)に,受付作業でだけ稟議2作業の宛先情報をドロップダウンリストへ追加するよう,条件文を設定します。条件判定には,BLCEURFormProcessInfoクラス(SampleConsultationEUR_1_Class.javaでの変数名は「befpi」)のgetInfoメソッドを使用します。

条件文の設定内容を次に示します。

カスタマイズの内容を次に示します。

if("受付-受付".equals(befpi.getInfo(befpi.BEF_NODENAME))){
}

(b) 宛先情報の取得

稟議2作業の宛先情報の取得は,次の六つの部分に分かれます。

それぞれについて説明します。

ログインユーザIDの取得
ログインユーザIDを取得するには,BLCAuthenticateクラスのgetUserIdメソッドを使用します。
カスタマイズの内容を次に示します。

String l_strUserID = befpi.getBLCInfo().getAuthenticateObject().getUserId();

BLCDirsオブジェクトの取得
BLCDirsオブジェクトを取得するには,BLCDirsLoaderクラスのgetDirsObjectメソッドを使用します。
カスタマイズの内容を次に示します。

BLCDirs l_blcdir = new BLCDirsLoader().getDirsObject();

宛先情報の取得
宛先情報を取得するには,取得したBLCDirsオブジェクトのgetTargetInfoメソッドを使用します。
カスタマイズの内容を次に示します。ここでは,役職コードの降順で取得するようにしています。

ArrayList l_arrylist = new ArrayList();
//取得属性を指定:指定可能な属性は,以下のマニュアル参照。
//「uCosminexus 電子フォームワークフロー APIリファレンス」
//「BLCDirsクラス getTargetInfo メソッド」
l_arrylist.add("CDTARGET");    // 宛先ユーザID
l_arrylist.add("NMBELONGTO");  // 宛先の所属組織略称
l_arrylist.add("CDJOBTITLE");  // 宛先の役職コード
l_arrylist.add("NMJOBTITLE");  // 宛先の役職略称
l_arrylist.add("NMLASTNAME");  // 宛先の名字
l_arrylist.add("NMFIRSTNAME"); // 宛先の名前

//役職コード昇順でソートした宛先リストを取得し,宛先情報ディクショナリに設定。
//例:宛先の役職コードの降順
BLCDictionary l_DicTarget = l_blcdir.getTargetInfo(l_strUserID,l_arrylist,"CDJOBTITLE DESC");

デフォルト表示項目の追加
EUR Formドロップダウンオブジェクトを生成し,デフォルト表示項目を追加します。ここでは項目の追加だけを実施し,追加した項目をデフォルトで表示させるカスタマイズはあとで実施します。
EUR Formドロップダウンオブジェクトとして,EFormDropdownListSetterクラスを使用します。
デフォルト表示項目としてキャプションに「宛先を選択してください。」を,値に「未選択」を追加します。
カスタマイズの内容を次に示します。

//EUR Formドロップダウンオブジェクトの生成
EFormDropdownListSetter l_efDDLSetter = new EFormDropdownListSetter();

//宛先ドロップダウンにデフォルト表示項目を追加
//「宛先を選択してください。」
l_efDDLSetter.add(BLCSTRPortal.get(BLCSTRPortal.FMTARGETCLICK),"未選択");

宛先ユーザの帳票ドロップダウンへの追加
取得した宛先ユーザを帳票ドロップダウンのオブジェクト(EFormDropdownListSetter)に,取得した順序で追加します。
カスタマイズの内容を次に示します。

StringBuffer l_sbTarget = null;
String l_strIndex = null;
String l_strTargetUser = null;

//宛先登録件数取得
int l_cntTarget = ((Integer)l_DicTarget.get("blc_target_total")).intValue();

//宛先登録件数分ループ
for(int i=1;i<=l_cntTarget;i++){
 l_strIndex = String.valueOf(i);

 //宛先ユーザIDの取得
 l_strTargetUser = l_DicTarget.item("blc_target_id_" + l_strIndex);

 //宛先ユーザの表示文字列生成
 //表示内容は「氏名(組織略称 役職略称)」
 l_sbTarget = new StringBuffer();
 l_sbTarget.append(l_DicTarget.item("blc_target_nmfull_" + l_strIndex));
 l_sbTarget.append("(");
 l_sbTarget.append(l_DicTarget.item("blc_target_aborg_" + l_strIndex));
 l_sbTarget.append(" ");
 l_sbTarget.append(l_DicTarget.item("blc_target_abjob_" + l_strIndex));
 l_sbTarget.append(")");

 //宛先ユーザをプルダウンリストに追加
 l_efDDLSetter.add(l_sbTarget.toString(),l_strTargetUser);
 l_sbTarget = null;
}

帳票コントロールの変更およびデフォルト表示項目の選択
帳票コントロールの変更およびデフォルト表示項目の選択には,EFormDocumentクラスを使用します。
カスタマイズの内容を次に示します。

//EUR帳票コントロールの変更
//受付-受付のときは,ドロップダウンリストを必須入力にする。
//modifyInstanceDataItem:初期値の設定
efDoc.modifyControl("CID_DL_ADDRESS2",l_efDDLSetter);
efDoc.modifyInstanceDataItem("CID_DL_ADDRESS2","未選択");

(5) 宛先情報をデータベースへ格納するタイミングの決定

ユーザ定義クラス(Custom_SampleConsultationEUR_1_userServerSideClass)は,帳票クラス(SampleConsultationEUR_1_Class)を継承して,BLCEURFormBaseクラスのメソッドをオーバーライドしています。このため,BLCEURFormBaseクラスのどのメソッドを使用するかを決定することで,宛先情報をデータベースへ格納するタイミングを決定します。

ここではボタンをクリックしたタイミングで処理を実行させたいため,ufsv_addEURButtonPreparation(ボタンDB更新前処理)メソッドを使用します。

(6) メソッドのカスタマイズ

ufsv_addEURButtonPreparation(ボタンDB更新前処理)メソッドを次のようにカスタマイズします。

if("受付-受付".equals(befpi.getInfo(befpi.BEF_NODENAME)) && "ID_WICOMPLETE".equals(befpi.getInfo(befpi.BEF_ACCEPTID))){
         //フォームデータの取得
         String l_strFormData = befpi.getInfo(befpi.BEF_EURFORMDATA);

         //DOMオブジェクトの生成
         DocumentBuilderFactory l_dbfObj = null;
         DocumentBuilder l_dbObj = null;

         StringReader l_srReader = null;
         InputSource l_isSource = null;

         Document l_doc = null;

         l_srReader = new StringReader(l_strFormData);
         l_isSource = new InputSource((Reader)l_srReader);

         l_dbfObj = DocumentBuilderFactory.newInstance();
         l_dbObj = l_dbfObj.newDocumentBuilder();
         l_doc =l_dbObj.parse(l_isSource);

         //宛先除法の取得
         NodeList l_nodeList = null;
         NodeList l_nodeList2 = null;
         Node l_nodeWork = null;
         Node l_nodeChildWork = null;
         Node l_nodeWork2 = null;
         Node l_nodeChildWork2 = null;

         String l_str = null;
         String l_str2 = null;

         // 指定されたメンバ名(タグ名)のノードリストを取得
         l_nodeList = l_doc.getElementsByTagName("宛先");
         l_nodeList2 = l_doc.getElementsByTagName("宛先2");

         if(l_nodeList.getLength() == 1  && l_nodeList2.getLength() == 1){
             // 1個存在した場合
             l_nodeWork = l_nodeList.item(0);
             l_nodeWork2 = l_nodeList2.item(0);

             // 子ノードを取得
             l_nodeChildWork = l_nodeWork.getFirstChild();
             l_nodeChildWork2 = l_nodeWork2.getFirstChild();
             if(l_nodeChildWork != null &&
                 l_nodeChildWork.getNodeType() == Node.TEXT_NODE &&
                 l_nodeChildWork2 != null &&
                 l_nodeChildWork2.getNodeType() == Node.TEXT_NODE){
                 // 子ノードが存在,かつノード種別がTextの場合
                 l_str = l_nodeChildWork.getNodeValue();
                 l_str2 = l_nodeChildWork2.getNodeValue();
             }
         }else{
             // 存在しない or 複数存在
             // error
         }
         befpi.setInfo(befpi.BEF_ATTRNUM,"4");
         befpi.setInfo(befpi.BEF_ATTRDATA+"3",l_str);
         befpi.setInfo(befpi.BEF_ATTRDATA+"4",l_str2);
     }

なお,コンパイルを通すには,次のパッケージをインポートする必要があります。

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;

ufsv_addEURButtonPreparationメソッドのカスタマイズの詳細を以降で説明します。

(a) 宛先情報をデータベースへ格納する条件の決定

(5)で決定したメソッド(ボタンをクリックするタイミングで呼ばれるメソッド)に,受付作業の[承認]ボタンがクリックされた場合に宛先情報をデータベースへ追加するよう,条件文を設定します。条件判定には,BLCEURFormProcessInfoクラス(SampleConsultationEUR_1_Class.javaでの変数名は「befpi」)のgetInfoメソッドを使用します。

条件文の設定内容を次に示します。

カスタマイズの内容を次に示します。

if("受付-受付".equals(befpi.getInfo(befpi.BEF_NODENAME))
  &&"ID_WICOMPLETE".equals(befpi.getInfo(befpi.BEF_ACCEPTID))){
}

(b) 宛先情報の取得

宛先情報の取得は,次の三つの部分に分かれます。

それぞれについて説明します。

フォームデータの取得
フォームデータを取得するには,BLCEURFormProcessInfoクラス(SampleConsultationEUR_1_Class.javaでの変数名はbefpi)のgetInfoメソッドを使用します。
getInfoメソッドの引数にbefpi.BEF_EURFORMDATAを指定して,フォームデータを取得できるようにします。フォームデータには,送信ユニットを文字列化したデータが格納されています。
カスタマイズの内容を次に示します。

String l_strFormData = befpi.getInfo(befpi.BEF_EURFORMDATA);

DOMオブジェクトの生成
フォームデータからDOMオブジェクトを生成します。
カスタマイズの内容を次に示します。

//DOMオブジェクトの生成
DocumentBuilderFactory l_dbfObj = null;
DocumentBuilder l_dbfObj = null;

StringReader l_srReader = null;
InputSource l_isSource = null;

Document l_doc = null;

l_srReader = new StringReader(l_strFormData);
l_isSource = new InputSource((Reader)l_srReader);

l_dbfObj = DocumentBuilderFactory.newInstance();
l_dbObj = l_dbfObj.newDocumentBuilder();
l_doc = l_dbObj.parse(l_isSource);

宛先情報の取得
DOMオブジェクトから宛先情報を取得するには,getElementsByTagNameメソッドの引数にタグ名を指定します。指定するタグ名は,帳票作成時に指定したメンバ名になります。
帳票作成時に指定したメンバ名を次に示します。

図2-19 帳票作成時に指定したメンバ名

[図データ]
ここでは,「宛先」および「宛先2」をgetElementsByTagNameメソッドの引数に指定します。
カスタマイズの内容を次に示します。

//宛先情報の取得
NodeList l_nodeList = null;
NodeList l_nodeList2 = null;
Node l_nodeWork = null;
Node l_nodeChildWork = null;
Node l_nodeWork2 = null;
Node l_nodeChildWork2 = null;

String l_str = null;
String l_str2 = null;

// 指定されたメンバ名(タグ名)のノードリストを取得
l_nodeList = l_doc.getElementsByTagName("宛先");
l_nodeList2 = l_doc.getElementsByTagName("宛先2");

if(l_nodeList.getLength() ==  1 &&l_nodeList2.getLength() == 1){
   // 1個存在した場合
   l_nodeWork = l_nodeList.item(0);
   l_nodeWork2 = l_nodeList2.item(0);

  // 子ノードを取得
   l_nodeChildWork = l_nodeWork.getFirstChild();
   l_nodeChildWork2 = l_nodeWork2.getFirstChild();
   if(l_nodeChildWork != null &&
       l_nodeChildWork.getNodeType() == Node.TEXT_NODE &&
       l_nodeChildWork2 != null &&
       l_nodeChildWork2.getNodeType() == Node.TEXT_NODE){
         // 子ノードが存在,かつノード種別がTextの場合
         l_str = l_nodeChildWork.getNodeValue();
         l_str2 = l_nodeChildWork2.getNodeValue();
   }
}else{
   // 存在しない or 複数存在
   // error
}

(c) BLC_INBOX_TのNMITEM3カラムおよびNMITEM4カラムへの設定

宛先情報をNMITEM3カラムおよびNMITEM4カラムへ設定するには,BLCEURFormProcessInfoクラス(SampleConsultationEUR_1_Class.javaでの変数名はbefpi)のsetInfoメソッドを使用します。

カスタマイズの内容を次に示します。

befpi.setInfo(befpi.BEF_ATTRNUM,"4");
befpi.setInfo(befpi.BEF_ATTRDATA+"3",l_str);
befpi.setInfo(befpi.BEF_ATTRDATA+"4",l_str2);