001/*
002 * Copyright (c) 2009 The openGion Project.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *     http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013 * either express or implied. See the License for the specific language
014 * governing permissions and limitations under the License.
015 */
016package org.opengion.hayabusa.mail;
017
018import java.util.concurrent.ConcurrentMap;                                              // 6.4.3.3 (2016/03/04)
019// import java.util.concurrent.ConcurrentHashMap;                               // 6.4.3.1 (2016/02/12) refactoring
020import java.util.concurrent.ConcurrentSkipListMap;                              // 6.4.3.1 (2016/02/12) refactoring
021
022import org.opengion.fukurou.system.OgRuntimeException ;                 // 6.4.2.0 (2016/01/29)
023import org.opengion.fukurou.system.DateSet;                                             // 6.4.2.0 (2016/01/29)
024// import org.opengion.fukurou.db.DBUtil;
025// import org.opengion.fukurou.db.ApplicationInfo;
026// import org.opengion.fukurou.db.Transaction;                                  // 5.9.31.1 (2018/04/13)
027// import org.opengion.fukurou.db.TransactionReal;                              // 5.9.31.1 (2018/04/13)
028// import org.opengion.fukurou.db.ConnectionFactory;                    // 5.9.31.1 (2018/04/13)
029// import org.opengion.fukurou.db.DBFunctionName;                               // 5.9.31.1 (2018/04/13)
030import org.opengion.fukurou.util.StringUtil;
031// import org.opengion.hayabusa.common.HybsSystem;
032
033import static org.opengion.fukurou.util.StringUtil.nval;                // 6.4.3.3 (2016/03/04)
034
035/**
036 * メールモジュール関係の機能の一部を他から使用するためのクラスです。
037 *
038 * ※MailSenderTagからGE32,34へ履歴を出力する機能を追加する際に、モジュール系の動作を本パッケージに集約しておくために作成。
039 *   必要としている箇所のみ実装。
040 *
041 * @og.rev 5.9.2.3 (2015/11/27) 新規作成
042 * @og.rev 8.5.7.0 (2024/03/29) MailModuleUtil → MailSendHistory クラス名変更、DefaultMailManager継承
043 * @og.group メールモジュール
044 *
045 * @version  4.0
046 * @author   Takahashi Masakazu
047 * @since    JDK1.6
048 */
049// public class MailModuleUtil {
050public class MailSendHistory extends DefaultMailManager {
051
052//      // Ver4互換モード対応
053//      // 6.9.5.0 (2018/04/23) VER4_COMPATIBLE_MODE 廃止
054//      private static final String CONTENTS = HybsSystem.sysBool( "VER4_COMPATIBLE_MODE" ) ? "CONTENT" : "CONTENTS";
055
056//      // 6.4.1.1 (2016/01/16) selYkno → SEL_YKNO , insGE32 → INS_GE32 , insGE34 → INS_GE34 refactoring
057//      private static final String     SEL_YKNO        = "SELECT GE32S02.NEXTVAL YKNO FROM DUAL";
058
059        // 8.5.7.0 (2024/03/29) MailModuleUtil → MailSendHistory クラス名変更、DefaultMailManager継承
060//      private static final String     SEL_YKNO        = "GE32S02";            // 5.9.31.1 (2018/04/13)
061//      // 6.9.5.0 (2018/04/23) VER4_COMPATIBLE_MODE 廃止
062//      private static final String     INS_GE32                = "INSERT INTO GE32(YKNO,PARA_KEY,PTN_ID,FROM_ADDR,TITLE,"+CONTENTS+",ATTACH1,ATTACH2,ATTACH3,ATTACH4,ATTACH5,DYSET,USRSET,PGUPD,SYSTEM_ID,FGJ)"
063//      // 送信後履歴テーブル(GE32)
064//      private static final String     INS_GE32                = "INSERT INTO GE32(YKNO,PARA_KEY,PTN_ID,FROM_ADDR,TITLE,CONTENTS,ATTACH1,ATTACH2,ATTACH3,ATTACH4,ATTACH5,DYSET,USRSET,PGUPD,SYSTEM_ID,FGJ)"
065//                                                                                      + " VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,'1')";
066//      // 宛先テーブル(GE34)
067//      private static final String INS_GE34            = "INSERT INTO GE34(YKNO,DST_ID,GROUP_ID,DST_NAME,DST_ADDR,DST_KBN,FGJ,DYSET,USRSET,PGUPD)"
068//                                                                                      + " VALUES(?,?,?,?,?,?,?,?,?,?)";
069
070        // 8.5.7.0 (2024/03/29) MailModuleUtil → MailSendHistory クラス名変更、DefaultMailManager継承
071//      /** 内部データのカラム番号(履歴テーブル) */
072//      private static final int GE32_YKNO              = 0;
073//      private static final int GE32_PARAKEY   = 1;
074//      private static final int GE32_PTN_ID    = 2;
075//      private static final int GE32_FROM_ADDR = 3;
076//      private static final int GE32_TITLE             = 4;
077//      private static final int GE32_CONTENTS  = 5;
078//      private static final int GE32_ATTACH1   = 6;
079//      private static final int GE32_ATTACH2   = 7;
080//      private static final int GE32_ATTACH3   = 8;
081//      private static final int GE32_ATTACH4   = 9;
082//      private static final int GE32_ATTACH5   = 10;
083//      private static final int GE32_DYSET             = 11;
084//      private static final int GE32_USRSET    = 12;
085//      private static final int GE32_PGUPD             = 13;
086//      private static final int GE32_SYSTEM_ID = 14;
087//      /** 内部データのカラム番号(履歴テーブル) */
088//      private static final int GE34_YKNO              = 0 ;
089//      private static final int GE34_DST_ID    = 1 ;
090//      private static final int GE34_GROUP_ID  = 2 ;
091//      private static final int GE34_DST_NAME  = 3 ;
092//      private static final int GE34_DST_ADDR  = 4 ;
093//      private static final int GE34_DST_KBN   = 5 ;
094//      private static final int GE34_FGJ               = 6 ;
095//      private static final int GE34_DYSET             = 7 ;
096//      private static final int GE34_USRSET    = 8 ;
097//      private static final int GE34_PGUPD             = 9 ;
098
099// 8.5.7.0 (2024/03/29) MailPattern の定義を使用する。
100//      /** アドレスマップ */
101//      private static final int IDX_DST_ADDR   = 0;
102//      private static final int IDX_DST_KBN    = 1;
103
104// 8.5.7.0 (2024/03/29) MailPattern の定義を使用する。
105//      /** GE34 メール送信区分 {@value} */
106//      private static final int KBN_TO                 = 0 ;   // メール送信区分(TO)
107//      /** GE34 メール送信区分 {@value} */
108//      private static final int KBN_CC                 = 1 ;   // メール送信区分(CC)
109//      /** GE34 メール送信区分 {@value} */
110//      private static final int KBN_BCC                        = 2 ;   // メール送信区分(BCC)
111
112//      /** 6.4.3.1 (2016/02/12) PMD refactoring. TreeMap → ConcurrentSkipListMap に置き換え。 */
113//      private final ConcurrentMap<String, String[]> mailDstMap = new ConcurrentSkipListMap<>() ;              // 6.4.3.3 (2016/03/04)
114
115//      /** 6.4.3.1 (2016/02/12) PMD refactoring. HashMap → ConcurrentHashMap に置き換え。 */
116//      private final ConcurrentMap<String, String> initParamMap = new ConcurrentHashMap<>();                   // パラメータマップ
117
118//      /** データベース接続ID */
119//      private final String DBID = HybsSystem.sys( "RESOURCE_DBID" );                                                                  // 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対応
120        /** ファンクション名オブジェクト */
121//      protected final DBFunctionName dbName = DBFunctionName.getDBName( ConnectionFactory.getDBName( DBID ) );        // 5.9.31.1 (2018/04/13)
122//      private final DBFunctionName dbName = DBFunctionName.getDBName( ConnectionFactory.getDBName( DBID ) );  // 5.9.31.1 (2018/04/13)
123
124//      /** コネクションにアプリケーション情報を追記するかどうか指定 */
125//      private static final boolean USE_DB_APPLICATION_INFO  = HybsSystem.sysBool( "USE_DB_APPLICATION_INFO" ) ;
126
127//      /** アプリケーション情報 */
128//      private static final ApplicationInfo APP_INFO;                          // 6.4.1.1 (2016/01/16) appInfo → APP_INFO refactoring
129//      static {
130//              if( USE_DB_APPLICATION_INFO ) {
131//                      APP_INFO = new ApplicationInfo();
132//                      // ユーザーID,IPアドレス,ホスト名
133//                      APP_INFO.setClientInfo( "MailModuel", HybsSystem.HOST_ADRS, HybsSystem.HOST_NAME );
134//                      // 画面ID,操作,プログラムID
135//                      APP_INFO.setModuleInfo( "MailModuel", "MailManager", "MailManager" );
136//              }
137//              else {
138//                      APP_INFO = null;
139//              }
140//      }
141
142//      // 8.5.7.0 (2024/03/29) 最大5個まで
143//      private final String[] attachFiles = { "","","","","" };
144
145        /**
146         * デフォルトコンストラクター
147         *
148         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
149         * @og.rev 8.5.7.0 (2024/03/29) MailModuleUtil → MailSendHistory クラス名変更
150         */
151//      public MailModuleUtil() { super(); }            // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
152        public MailSendHistory() { super(); }           // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
153
154//      /**
155//       * 履歴テーブル(GE32)と宛先テーブル(GE34)に登録します。
156//       * 登録時に、桁数オーバーにならないように、テーブル定義の桁数を上限として、
157//       * 登録前に各項目の桁数整理を行います。
158//       *
159//       * @og.rev 5.9.3.0 (2015/12/04) 添付ファイル対応
160//       * @og.rev 6.4.2.0 (2016/01/29) DateSet.getDate( String ) を利用するように修正します。
161//       * @og.rev 6.4.3.2 (2016/02/19) Map を keySet() ではなく、values() に変更します。
162//       * @og.rev 8.5.7.0 (2024/03/29) ATTACH1~5は、直接突っ込む
163//       * @og.rev 8.5.7.0 (2024/03/29) DefaultMailManager継承
164//       *
165//       */
166//      public void commitMailDB() {
167//              // 履歴テーブルの追加
168//              final String[] insGE32Args = new String[15];            // 8.5.4.2 (2024/01/12) PMD 7.0.0 LocalVariableCouldBeFinal
169//              final String ykno = getYkno();
170//
171//              insGE32Args[GE32_YKNO]          = ykno;
172//              insGE32Args[GE32_PARAKEY]       = initParamMap.get( "PARAKEY" );
173//              insGE32Args[GE32_PTN_ID]        = trim( initParamMap.get( "PTN_ID" ), 20 );
174//              insGE32Args[GE32_FROM_ADDR] = trim( initParamMap.get( "FROM"   ), 100);
175//              insGE32Args[GE32_TITLE]         = trim( initParamMap.get( "TITLE"  ), 300);
176//              insGE32Args[GE32_CONTENTS]      = initParamMap.get( "CONTENT" );
177//
178//              insGE32Args[GE32_ATTACH1]       = trim( attachFiles[0], 256);
179//              insGE32Args[GE32_ATTACH2]       = trim( attachFiles[1], 256);
180//              insGE32Args[GE32_ATTACH3]       = trim( attachFiles[2], 256);
181//              insGE32Args[GE32_ATTACH4]       = trim( attachFiles[3], 256);
182//              insGE32Args[GE32_ATTACH5]       = trim( attachFiles[4], 256);
183////            // 5.9.3.0
184////            final String[] attachFiles = StringUtil.csv2Array( initParamMap.get( "FILES" ) ); // 5.9.3.0
185////            if( attachFiles != null ) {
186////                    final int attSize = attachFiles.length;
187////                    for( int i = 0; i < attSize; i++ ) {
188////                            insGE32Args[6 + i] = trim( attachFiles[i], 256);
189////                    }
190////            }
191//
192//              insGE32Args[GE32_DYSET]         = DateSet.getDate( "yyyyMMddHHmmss" );                                          // 6.4.2.0 (2016/01/29)
193//              insGE32Args[GE32_USRSET]        = initParamMap.get( "LOGIN_USERID" );
194//              insGE32Args[GE32_PGUPD]         = initParamMap.get( "PGID" );
195//              insGE32Args[GE32_SYSTEM_ID] = initParamMap.get( "SYSTEM_ID" );
196//              DBUtil.dbExecute( INS_GE32, insGE32Args, DefaultMailManager.APP_INFO, DBID );                   // 5.5.5.1 (2012/08/07)
197//
198//              // 宛先テーブル追加
199//              final String[] insGE34Args = new String[10];            // 8.5.4.2 (2024/01/12) PMD 7.0.0 LocalVariableCouldBeFinal
200//              insGE34Args[GE34_YKNO]= ykno;
201//              // 6.4.3.2 (2016/02/19) Map を keySet() ではなく、values() に変更します。
202//              // 8.5.7.0 (2024/03/29) 作成する dstInit 配列を、MailPattern と同じにします。
203//              for( final String[] dstInfo : mailDstMap.values() ) {
204////                    insGE34Args[GE34_DST_ID]        = trim( dstInfo[IDX_DST_ADDR], 10 );
205////                    insGE34Args[GE34_GROUP_ID]      = "";
206////                    insGE34Args[GE34_DST_NAME]      = "";
207////                    insGE34Args[GE34_DST_ADDR]      = trim( dstInfo[IDX_DST_ADDR], 100 );
208////                    insGE34Args[GE34_DST_KBN]       = dstInfo[IDX_DST_KBN];
209////                    insGE34Args[GE34_FGJ]           = "1";
210//                      insGE34Args[GE34_DST_ID]        = trim( dstInfo[MailPattern.IDX_DST_ID]  , 10 );
211//                      insGE34Args[GE34_GROUP_ID]      = trim( dstInfo[MailPattern.IDX_GROUP_ID], 20 );
212//                      insGE34Args[GE34_DST_NAME]      = trim( dstInfo[MailPattern.IDX_DST_NAME], 20 );
213//                      insGE34Args[GE34_DST_ADDR]      = trim( dstInfo[MailPattern.IDX_DST_ADDR], 100 );
214//                      insGE34Args[GE34_DST_KBN]       = dstInfo[MailPattern.IDX_DST_KBN];
215//                      insGE34Args[GE34_FGJ]           = dstInfo[MailPattern.IDX_FGJ];
216//                      insGE34Args[GE34_DYSET]         = DateSet.getDate( "yyyyMMddHHmmss" );                          // 6.4.2.0 (2016/01/29)
217//                      insGE34Args[GE34_USRSET]        = initParamMap.get( "LOGIN_USERID" );
218//                      insGE34Args[GE34_PGUPD]         = initParamMap.get( "PGID" );
219//                      DBUtil.dbExecute( INS_GE34, insGE34Args, DefaultMailManager.APP_INFO, DBID );   // 5.5.5.1 (2012/08/07)
220//              }
221//      }
222
223        /**
224         * パラメータマップをセットします。
225         *
226         * @param       params  パラメータのマップ
227         */
228
229        /**
230         * パラメータからマップをセットします(1)。
231         *
232         * @og.rev 5.9.3.0 (2015/11/30) files追加
233         * @og.rev 6.4.2.0 (2016/01/29) DateSet.getDate( String ) を利用するように修正します。
234         * @og.rev 6.4.3.1 (2016/02/12) PMD refactoring. Map → ConcurrentMap に置き換え。
235         * @og.rev 6.4.3.3 (2016/03/04) ConcurrentHashMap の not null制限のチェック追加
236         * @og.rev 8.5.7.0 (2024/03/29) initParamMap をメソッドで処理し、attachFiles を設定する。
237         *
238         * @param systemId      システムID(not null)
239         * @param from          FROMアドレス(not null)
240         * @param tos           TOアドレス(CSV形式)
241         * @param ccs           CCアドレス(CSV形式)
242         * @param bccs          BCCアドレス(CSV形式)
243         * @param content       本文
244         * @param title         タイトル
245         * @param userid        登録ユーザ
246         * @param pgid          登録PG
247         * @param files         添付ファイル
248         */
249        public void setInitParams( final String systemId, final String from, final String[] tos, final String[] ccs
250                                                                ,final String[] bccs, final String content, final String title, final String userid, final String pgid
251                                                                ,final String[] files ) {
252
253                // 6.4.3.3 (2016/03/04) ConcurrentHashMap の not null制限のチェック追加
254                if( systemId == null || from == null ) {
255                        final String errMsg = "systemId または、from  が null です。"
256                                                + " systemId=" + systemId + " , from=" + from  ;
257                        throw new OgRuntimeException( errMsg );
258                }
259
260                initParamMap.clear();
261
262                initParamMap.put( "SYSTEM_ID"   , systemId      );
263                initParamMap.put( "FROM"                , from          );
264                initParamMap.put( "TO"                  , StringUtil.array2csv( tos ) );
265                initParamMap.put( "CC"                  , StringUtil.array2csv( ccs ) );
266                initParamMap.put( "BCC"                 , StringUtil.array2csv( bccs ) );
267                initParamMap.put( "CONTENT"             , nval( content         , "No Content" ) );
268                initParamMap.put( "TITLE"               , nval( title           , "No Title" ) );
269                initParamMap.put( "DATE"                , DateSet.getDate("yyyy/MM/dd") );                              // 6.4.2.0 (2016/01/29)
270                initParamMap.put( "TIME"                , DateSet.getDate("HH:mm:ss") );                                // 6.4.2.0 (2016/01/29)
271                initParamMap.put( "LOGIN_USERID", nval( userid          , "No UserID" ) );
272                initParamMap.put( "PGID"                , nval( pgid            , "No PGID" ) );
273//              initParamMap.put( "FILES"               , StringUtil.array2csv( files ) );                              // 5.9.3.0 (2015/12/04)
274                setAttachFiles( files );                // 添付ファイルの設定
275
276//              getDstMap( tos, ccs, bccs );
277
278                final ConcurrentMap<String, String[]> mailDstMap = new ConcurrentSkipListMap<>() ;              // 6.4.3.3 (2016/03/04)
279                setDstMap( mailDstMap,tos, ccs, bccs );                         // 8.5.4.2 (2024/01/12) PMD 7.0.0 LinguisticNaming
280                setMailDstMap( mailDstMap );                                            // 親クラスに投げる
281        }
282
283//      /**
284//       * 指定の長さ以内の文字列を返します。
285//       *
286//       * @og.rev 5.9.1.3 (2015/10/30) 文字数ではなくByte数に変更
287//       * @og.rev 8.5.7.0 (2024/03/29) DefaultMailManager継承
288//       *
289//       * @param       src             オリジナルの文字列
290//       * @param       maxLen  指定の長さ
291//       *
292//       * @return      指定の長さに短縮された文字列
293//       */
294//      private String trim( final String src, final int maxLen ) {
295//              String rtn = src;
296//              if( src != null && src.length() > maxLen ) {
297//                      rtn = StringUtil.cut( src, maxLen );
298//              }
299//              return rtn;
300//      }
301
302//      /**
303//       * 要求NOを採番します。
304//       * この要求NOで履歴テーブル(GE32)と宛先テーブル(GE30)の関連付けを持たせます。
305//       *
306//       * @og.rev 5.5.5.1 (2012/08/07) リソース系DBID 付け忘れ対策
307//       * @og.rev 5.9.31.1 (2018/04/13) シーケンスの取り方変更
308//       * @og.rev 7.0.6.4 (2019/11/29) TransactionRealのclose漏れ対応
309//       * @og.rev 8.5.7.0 (2024/03/29) DefaultMailManager継承
310//       *
311//       * @return      要求NO
312//       */
313//      private String getYkno() {
314////            final String[][] tmp = DBUtil.dbExecute( SEL_YKNO, new String[0], APP_INFO, DBID );             // 5.5.5.1 (2012/08/07)
315////            if( tmp == null || tmp.length == 0 ) {
316////                    final String errMsg = "要求NO採番エラー"
317////                                            + " SQL=" + SEL_YKNO ;          // 5.1.8.0 (2010/07/01) errMsg 修正
318////                    throw new OgRuntimeException( errMsg );
319////            }
320////            return tmp[0][0];
321//
322////            final Transaction tran = new TransactionReal( APP_INFO );
323////            final int rtn_ykno = dbName.getSequence( SEL_YKNO,tran,DBID );
324////            return Integer.toString( rtn_ykno );
325//
326//              try( Transaction tran = new TransactionReal( DefaultMailManager.APP_INFO ) ) {                  // 7.0.6.4 (2019/11/29) try-with-resources文
327//                      return Integer.toString( dbName.getSequence( SEL_YKNO,tran,DBID ) );
328//              }
329//              catch( final Throwable ex ) {
330//                      final String errMsg = "要求NO採番エラー"
331//                                              + " SQL=" + SEL_YKNO ;          // 5.1.8.0 (2010/07/01) errMsg 修正
332////                    throw new OgRuntimeException( errMsg );
333//                      throw new OgRuntimeException( errMsg,ex );              // 8.0.0.0 (2021/07/31) original stack trace may be lost
334//              }
335//      }
336
337        /**
338         * 送信先のアドレスをセットします。
339         *
340         * ※ setInitParams(…) の場合のみ呼び出されます。
341         *
342         * @og.rev 6.4.3.1 (2016/02/12) インスタンス変数で初期化した、ConcurrentSkipListMap を使用します。
343         * @og.rev 8.5.4.2 (2024/01/12) PMD 7.0.0 LinguisticNaming 対応
344         *
345         * @param toId  送信先TOのアドレス
346         * @param ccId  送信先CCのアドレス
347         * @param bccId 送信先BCCのアドレス
348         */
349//      private void getDstMap( final String[] toId, final String[] ccId, final String[] bccId  ){
350        private void setDstMap( final ConcurrentMap<String, String[]> mailDstMap,final String[] toId, final String[] ccId, final String[] bccId  ){
351//              // 送信先(TO、CC、BCC)のマップを初期化します。
352//              mailDstMap.clear();
353
354                // 送信先(TO、CC、BCC)のマップに、値をセットします。セット順ではなく、自然ソート順です。
355//              setDstAddrMap( mailDstMap , bccId, KBN_BCC );
356//              setDstAddrMap( mailDstMap , ccId,  KBN_CC  );
357//              setDstAddrMap( mailDstMap , toId,  KBN_TO  );
358                setDstAddrMap( mailDstMap , bccId, MailPattern.KBN_BCC );               // 8.5.7.0 (2024/03/29) MailPattern の定義を使用する。
359                setDstAddrMap( mailDstMap , ccId,  MailPattern.KBN_CC  );
360                setDstAddrMap( mailDstMap , toId,  MailPattern.KBN_TO  );
361        }
362
363        /**
364         * 送信先のアドレス・マップを作成します。
365         *
366         * ※ setInitParams(…) の場合のみ呼び出されます。
367         *
368         * IDX_DST_ID ,IDX_GROUP_ID, IDX_GROUP_NAME ,IDX_DST_NAME ,IDX_DST_ADDR ,IDX_DST_KBN ,IDX_FGJ
369         *
370         * @og.rev 6.4.3.1 (2016/02/12) インスタンス変数で初期化した、ConcurrentSkipListMap を使用します。
371         * @og.rev 6.4.3.3 (2016/03/04) ConcurrentHashMap を受け取ることを明確にするため、I/FをConcurrentMapに変更します。
372         * @og.rev 5.9.33.0 (2018/06/01) dstBufがnullの場合の処理
373         * @og.rev 8.5.7.0 (2024/03/29) 作成する dstInit 配列を、MailPattern と同じにします。
374         *
375         * @param       dstMap  設定するMapオブジェクト
376         * @param       dstBuf  送信先配列
377         * @param       kbn             送信区分[0:TO/1:CC/2:BCC]
378         */
379        private void setDstAddrMap( final ConcurrentMap<String, String[]> dstMap, final String[] dstBuf, final int kbn ){
380                // IDX_DST_ID ,IDX_GROUP_ID, IDX_GROUP_NAME ,IDX_DST_NAME ,IDX_DST_ADDR ,IDX_DST_KBN ,IDX_FGJ
381                final String[] dstInit = { "", "", "", "", "", Integer.toString( kbn ), "1" };          // 8.5.7.0 (2024/03/29)
382
383                if( dstBuf != null && dstBuf.length > 0 ) {                             // 5.9.33.0 (2018/06/01)
384                        // IDX_DST_ADDR ,IDX_DST_KBN
385//                      final String[] dstInit = { "", Integer.toString( kbn ) };
386
387                        final int len = dstBuf.length;
388                        for( int i=0; i < len; i++ ){
389                                final String[] indMember = dstInit.clone();                     // 8.5.4.2 (2024/01/12) PMD 7.0.0 LocalVariableCouldBeFinal
390//                              indMember[IDX_DST_ADDR] = dstBuf[i];                            // メールアドレス
391                                indMember[MailPattern.IDX_DST_ID] = dstBuf[i];          // DST_ID   メールアドレス
392                                indMember[MailPattern.IDX_DST_ADDR] = dstBuf[i];        // DST_ADDR メールアドレス
393
394                                dstMap.put( dstBuf[i], indMember );
395                        }
396                }
397        }
398}