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)
019import java.util.concurrent.ConcurrentSkipListMap;                                      // 6.4.3.3 (2016/03/04)
020
021import org.opengion.fukurou.system.OgRuntimeException ;         // 6.4.2.0 (2016/01/29)
022import org.opengion.hayabusa.resource.ResourceManager;
023import org.opengion.hayabusa.db.DBColumn;
024import org.opengion.hayabusa.db.DBTableModelUtil;
025import org.opengion.hayabusa.db.DBTableModel;
026
027/**
028 * タグ mailSender2 による送信を行う際に利用するメール送信マネージャの処理クラスです。
029 * タグ mailSender2 よりパラメータマップを受取って、メール文の合成、送信を行います。
030 * バッチ送信する場合と共通する部分はスーパークラス DefaultMailManager に実装していますが、
031 * タグ独自ロジックの部分は本クラスより実装を行っています。
032 * 独自ロジックはセッションから取得した宛先テーブルにより宛先マップを作成、セッションから取得したメール
033 * 文により送信を行うロジックとあります。
034 *
035 * @og.group メールモジュール
036 *
037 * @version  4.0
038 * @author   Sen.Li
039 * @since    JDK1.6
040 */
041public class MailManager_DIRECT extends DefaultMailManager {
042
043        // 6.4.1.1 (2016/01/16) names → NAMES refactoring
044        private static final String[] NAMES     = { "DST_ID", "GROUP_ID", "GROUP_NAME", "DST_NAME", "DST_ADDR", "DST_KBN", "FGJ_MAIL" };
045        private static final int IDX_DST_ID     = 0;
046        private static final int IDX_FGJ_MAIL   = 6;
047        private ResourceManager resource                ;
048
049        /**
050         * デフォルトコンストラクター
051         *
052         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
053         */
054        public MailManager_DIRECT() { super(); }                // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
055
056        /**
057         * action="SEND"の時にこのメソッドが呼ばれます。
058         * セッションから取得した宛先テーブルにより宛先マップを作成します。
059         * まだ、action="CHECK"の時に、確認画面から添付ファイルを追加するケースがあるため、
060         * パラメータを再読込を行います。そして、action="SEND"の時に添付ファイルを送信します。
061         *
062         * @og.rev 6.0.3.0 (2014/11/13) Ver6用キーワード変更
063         * @og.rev 6.4.3.3 (2016/03/04) ConcurrentHashMap を受け取ることを明確にするため、I/FをConcurrentMapに変更します。
064         * @og.rev 8.5.7.0 (2024/03/29) initParamMap をメソッドで処理し、attachFiles を設定する。
065         *
066         * @param       params  パラメータのマップ
067         * @param       table   DBTableModelオブジェクト
068         *
069         */
070        public void create( final ConcurrentMap<String, String> params, final DBTableModel table ){
071                // 5.6.6.0 (2013/07/05) host指定対応
072                final MailPattern mailObj = new MailPattern( params );
073                setHost(mailObj.getHost());
074                setPort(mailObj.getSmtpPort());
075                setAuthType(mailObj.getAuthType());             // 6.0.3.0 (2014/11/13) Ver6用キーワード変更
076                setAuthUser(mailObj.getAuthUser());
077                setAuthPass(mailObj.getAuthPass());
078
079                setInitParams( params );
080                // 8.5.7.0 (2024/03/29) initParamMap をメソッドで処理し、attachFiles を設定する。
081//              setAttachFiles(   params.get( "ATTACH1" )
082//                                              , params.get( "ATTACH2" )
083//                                              , params.get( "ATTACH3" )
084//                                              , params.get( "ATTACH4" )
085//                                              , params.get( "ATTACH5" ));
086                final ConcurrentMap <String, String[]> dstMap = makeMailDstMap( table );                        // 6.4.3.3 (2016/03/04)
087                setMailDstMap( dstMap );
088        }
089
090        /**
091         * 画面に各宛先の送信状況を表示するために、送信の宛先マップに基づいてテーブルモデルを作成します。
092         * 作成されたテーブルモデルを指定されるスコープに入れます。
093         *
094         * @og.rev 5.1.9.0 (2010/08/01) keySet() → entrySet() に変更
095         * @og.rev 6.4.3.3 (2016/03/04) ConcurrentHashMap を受け取ることを明確にするため、I/FをConcurrentMapに変更します。
096         * @og.rev 6.4.3.4 (2016/03/11) forループを、forEach メソッドに置き換えます。
097         *
098         * @return      宛先マップに基づいたテーブルモデル
099         */
100        public DBTableModel makeDstTable(){
101                final ConcurrentMap<String, String[]> mailDst = getMailDstMap();
102                DBTableModel table;
103                final int numberOfColumns = NAMES.length;
104
105                table = DBTableModelUtil.newDBTable();
106                table.init( numberOfColumns );
107                setTableDBColumn( table, NAMES );
108
109                // 5.1.9.0 (2010/08/01) keySet() → entrySet() に変更
110                // 6.4.3.4 (2016/03/11) forループを、forEach メソッドに置き換えます。
111                mailDst.values().forEach( v -> table.addColumnValues( v ) );
112
113                return table;
114        }
115
116        /**
117         * リソースマネージャーをセットします。
118         * これは、言語(ロケール)に応じた DBColumn をあらかじめ設定しておく為に
119         * 必要です。
120         * リソースマネージャーが設定されていない、または、所定のキーの DBColumn が
121         * リソースに存在しない場合は、内部で DBColumn オブジェクトを作成します。
122         *
123         * @param  res リソースマネージャー
124         */
125        // 注意:この resource は、実質利用されていません。
126        public void setResourceManager( final ResourceManager res ) {
127                resource = res;
128        }
129
130        /**
131         * DBColumn オブジェクトをテーブルモデルに設定します。
132         *
133         * @og.rev 6.3.9.0 (2015/11/06) コンストラクタで初期化されていないフィールドを null チェックなしで利用している(findbugs)
134         *
135         * @param       table   DBTableModelオブジェクト
136         * @param       names   カラム名配列(可変長引数)
137         */
138        // 注意:この dbColumn は、実質利用されていません。
139        protected void setTableDBColumn( final DBTableModel table, final String... names ) {
140                // 6.3.9.0 (2015/11/06) コンストラクタで初期化されていないフィールドを null チェックなしで利用している(findbugs)
141                if( resource == null ) {
142                        final String errMsg = "#setResourceManager(ResourceManager)を先に実行しておいてください。" ;
143                        throw new OgRuntimeException( errMsg );
144                }
145
146                for( int i=0; i<names.length; i++ ) {
147                        final DBColumn clm = resource.makeDBColumn( names[i] );
148                        table.setDBColumn( i,clm );
149                }
150        }
151
152        /**
153         * セッションから取得した宛先テーブルにより宛先マップを作成します。
154         * 宛先テーブルの各レコードに対して、"送信待ち"となっているレコードのみ宛先マップに入れるようにしています。
155         *
156         * @og.rev 6.4.3.3 (2016/03/04) ConcurrentHashMap を受け取ることを明確にするため、I/FをConcurrentMapに変更します。
157         *
158         * @param       table   セッションから取得した宛先テーブル
159         *
160         * @return      宛先マップ
161         */
162        private ConcurrentMap<String, String[]> makeMailDstMap( final DBTableModel table ){
163                final ConcurrentMap<String, String[]> dstMap = new ConcurrentSkipListMap<>();           // 6.4.3.3 (2016/03/04)
164                final int rowCount = table.getRowCount();
165                final int colCount = NAMES.length;
166                for( int i=0; i<rowCount; i++ ) {
167                        final String[] tmpDst = new String[colCount];           // 8.5.4.2 (2024/01/12) PMD 7.0.0 LocalVariableCouldBeFinal
168                        if( DefaultMailManager.FGJ_SEND_WAIT.equals( table.getValue( i, IDX_FGJ_MAIL ) ) ) {
169                                for( int j=0; j<colCount; j++ ) {
170                                        tmpDst[j] = table.getValue( i, j );
171                                }
172                                if( tmpDst[IDX_DST_ID] != null ) {                                                                                      // 6.4.3.3 (2016/03/04) not null 制限
173                                        dstMap.put( tmpDst[IDX_DST_ID], tmpDst );
174                                }
175                        }
176                }
177
178                return dstMap;
179        }
180}