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 org.opengion.fukurou.system.OgRuntimeException ; // 6.4.2.0 (2016/01/29) 019import java.util.concurrent.ConcurrentMap; // 6.4.3.3 (2016/03/04) 020import java.util.concurrent.ConcurrentSkipListMap; // 6.4.3.3 (2016/03/04) 021 022import org.opengion.hayabusa.db.DBColumn; 023import org.opengion.hayabusa.db.DBTableModelUtil; 024import org.opengion.hayabusa.resource.ResourceManager; 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 * 065 * @param params パラメータのマップ 066 * @param table DBTableModelオブジェクト 067 * 068 */ 069 public void create( final ConcurrentMap<String, String> params, final DBTableModel table ){ 070 // 5.6.6.0 (2013/07/05) host指定対応 071 final MailPattern mailObj = new MailPattern( params ); 072 setHost(mailObj.getHost()); 073 setPort(mailObj.getSmtpPort()); 074 setAuthType(mailObj.getAuthType()); // 6.0.3.0 (2014/11/13) Ver6用キーワード変更 075 setAuthUser(mailObj.getAuthUser()); 076 setAuthPass(mailObj.getAuthPass()); 077 078 setInitParams( params ); 079 setAttachFiles( params.get( "ATTACH1" ) 080 , params.get( "ATTACH2" ) 081 , params.get( "ATTACH3" ) 082 , params.get( "ATTACH4" ) 083 , params.get( "ATTACH5" )); 084 final ConcurrentMap <String, String[]> dstMap = makeMailDstMap( table ); // 6.4.3.3 (2016/03/04) 085 setMailDstMap( dstMap ); 086 } 087 088 /** 089 * 画面に各宛先の送信状況を表示するために、送信の宛先マップに基づいてテーブルモデルを作成します。 090 * 作成されたテーブルモデルを指定されるスコープに入れます。 091 * 092 * @og.rev 5.1.9.0 (2010/08/01) keySet() → entrySet() に変更 093 * @og.rev 6.4.3.3 (2016/03/04) ConcurrentHashMap を受け取ることを明確にするため、I/FをConcurrentMapに変更します。 094 * @og.rev 6.4.3.4 (2016/03/11) forループを、forEach メソッドに置き換えます。 095 * 096 * @return 宛先マップに基づいたテーブルモデル 097 */ 098 public DBTableModel makeDstTable(){ 099 final ConcurrentMap<String, String[]> mailDst = getMailDstMap(); 100 DBTableModel table; 101 final int numberOfColumns = NAMES.length; 102 103 table = DBTableModelUtil.newDBTable(); 104 table.init( numberOfColumns ); 105 setTableDBColumn( table, NAMES ); 106 107 // 5.1.9.0 (2010/08/01) keySet() → entrySet() に変更 108 // 6.4.3.4 (2016/03/11) forループを、forEach メソッドに置き換えます。 109 mailDst.values().forEach( v -> table.addColumnValues( v ) ); 110 111 return table; 112 } 113 114 /** 115 * リソースマネージャーをセットします。 116 * これは、言語(ロケール)に応じた DBColumn をあらかじめ設定しておく為に 117 * 必要です。 118 * リソースマネージャーが設定されていない、または、所定のキーの DBColumn が 119 * リソースに存在しない場合は、内部で DBColumn オブジェクトを作成します。 120 * 121 * @param res リソースマネージャー 122 */ 123 // 注意:この resource は、実質利用されていません。 124 public void setResourceManager( final ResourceManager res ) { 125 resource = res; 126 } 127 128 /** 129 * DBColumn オブジェクトをテーブルモデルに設定します。 130 * 131 * @og.rev 6.3.9.0 (2015/11/06) コンストラクタで初期化されていないフィールドを null チェックなしで利用している(findbugs) 132 * 133 * @param table DBTableModelオブジェクト 134 * @param names カラム名配列(可変長引数) 135 */ 136 // 注意:この dbColumn は、実質利用されていません。 137 protected void setTableDBColumn( final DBTableModel table, final String... names ) { 138 // 6.3.9.0 (2015/11/06) コンストラクタで初期化されていないフィールドを null チェックなしで利用している(findbugs) 139 if( resource == null ) { 140 final String errMsg = "#setResourceManager(ResourceManager)を先に実行しておいてください。" ; 141 throw new OgRuntimeException( errMsg ); 142 } 143 144 for( int i=0; i<names.length; i++ ) { 145 final DBColumn clm = resource.makeDBColumn( names[i] ); 146 table.setDBColumn( i,clm ); 147 } 148 } 149 150 /** 151 * セッションから取得した宛先テーブルにより宛先マップを作成します。 152 * 宛先テーブルの各レコードに対して、"送信待ち"となっているレコードのみ宛先マップに入れるようにしています。 153 * 154 * @og.rev 6.4.3.3 (2016/03/04) ConcurrentHashMap を受け取ることを明確にするため、I/FをConcurrentMapに変更します。 155 * 156 * @param table セッションから取得した宛先テーブル 157 * 158 * @return 宛先マップ 159 */ 160 private ConcurrentMap<String, String[]> makeMailDstMap( final DBTableModel table ){ 161 final ConcurrentMap<String, String[]> dstMap = new ConcurrentSkipListMap<>(); // 6.4.3.3 (2016/03/04) 162 final int rowCount = table.getRowCount(); 163 final int colCount = NAMES.length; 164 for( int i=0; i<rowCount; i++ ) { 165 String[] tmpDst = new String[colCount]; 166 if( DefaultMailManager.FGJ_SEND_WAIT.equals( table.getValue( i, IDX_FGJ_MAIL ) ) ) { 167 for( int j=0; j<colCount; j++ ) { 168 tmpDst[j] = table.getValue( i, j ); 169 } 170 if( tmpDst[IDX_DST_ID] != null ) { // 6.4.3.3 (2016/03/04) not null 制限 171 dstMap.put( tmpDst[IDX_DST_ID], tmpDst ); 172 } 173 } 174 } 175 176 return dstMap; 177 } 178}