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 018 019import java.util.HashMap; 020import java.util.Map; 021import java.util.TreeMap; 022 023import org.opengion.fukurou.db.DBUtil; 024import org.opengion.fukurou.db.Transaction; 025import org.opengion.fukurou.db.TransactionReal; 026import org.opengion.fukurou.db.ConnectionFactory; 027import org.opengion.fukurou.db.DBFunctionName; 028import org.opengion.fukurou.util.ApplicationInfo; 029import org.opengion.fukurou.util.StringUtil; 030import org.opengion.hayabusa.common.HybsSystem; 031 032/** 033 * メールモジュール関係の機能の一部を他から使用するためのクラスです。 034 * 035 * ※MailSenderTagからGE32,34へ履歴を出力する機能を追加する際に、モジュール系の動作を本パッケージに集約しておくために作成。 036 * 必要としている箇所のみ実装。 037 * 038 * @og.rev 5.9.2.3 (2015/11/27) 新規作成 039 * 040 * @og.group メールモジュール 041 * 042 * @version 4.0 043 * @author Takahashi Masakazu 044 * @since JDK1.6 045 */ 046public class MailModuleUtil { 047 048 // Ver4互換モード対応 049 private static final String CONTENTS = HybsSystem.sysBool( "VER4_COMPATIBLE_MODE" ) ? "CONTENT" : "CONTENTS"; 050 051// private static final String selYkno = "SELECT GE32S02.NEXTVAL YKNO FROM DUAL"; 052 private static final String selYkno = "GE32S02"; 053 private static final String insGE32 = "INSERT INTO GE32(YKNO,PARA_KEY,PTN_ID,FROM_ADDR,TITLE,"+CONTENTS+",ATTACH1,ATTACH2,ATTACH3,ATTACH4,ATTACH5,DYSET,USRSET,PGUPD,SYSTEM_ID,FGJ)" 054 + " VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,'1')"; 055 private static final String insGE34 = "INSERT INTO GE34(YKNO,DST_ID,GROUP_ID,DST_NAME,DST_ADDR,DST_KBN,FGJ,DYSET,USRSET,PGUPD)" 056 + " VALUES(?,?,?,?,?,?,?,?,?,?)"; 057 058 // 内部データのカラム番号(履歴テーブル) 059 private static final int GE32_YKNO = 0 ; 060 private static final int GE32_PARAKEY = 1 ; 061 private static final int GE32_PTN_ID = 2; 062 private static final int GE32_FROM_ADDR = 3; 063 private static final int GE32_TITLE = 4; 064 private static final int GE32_CONTENTS = 5; 065 private static final int GE32_ATTACH1 = 6; 066 private static final int GE32_ATTACH2 = 7; 067 private static final int GE32_ATTACH3 = 8; 068 private static final int GE32_ATTACH4 = 9; 069 private static final int GE32_ATTACH5 = 10; 070 private static final int GE32_DYSET = 11; 071 private static final int GE32_USRSET = 12; 072 private static final int GE32_PGUPD = 13; 073 private static final int GE32_SYSTEM_ID = 14; 074 // 内部データのカラム番号(履歴テーブル) 075 private static final int GE34_YKNO = 0 ; 076 private static final int GE34_DST_ID = 1 ; 077 private static final int GE34_GROUP_ID = 2 ; 078 private static final int GE34_DST_NAME = 3 ; 079 private static final int GE34_DST_ADDR = 4 ; 080 private static final int GE34_DST_KBN = 5 ; 081 private static final int GE34_FGJ = 6 ; 082 private static final int GE34_DYSET = 7 ; 083 private static final int GE34_USRSET = 8 ; 084 private static final int GE34_PGUPD = 9 ; 085 086 // アドレスマップ 087 private static final int IDX_DST_ADDR = 0; 088 private static final int IDX_DST_KBN = 1; 089 090 /** メール送信区分 {@value} */ 091 private static final int KBN_TO = 0 ; // メール送信区分(TO) 092 /** メール送信区分 {@value} */ 093 private static final int KBN_CC = 1 ; // メール送信区分(CC) 094 /** メール送信区分 {@value} */ 095 private static final int KBN_BCC = 2 ; // メール送信区分(BCC) 096 097 private Map<String, String[]> mailDstMap = null; 098 private Map<String,String> initParamMap = null; // パラメータマップ 099 100 protected final String DBID = HybsSystem.sys( "RESOURCE_DBID" ); 101 protected final DBFunctionName dbName = DBFunctionName.getDBName( ConnectionFactory.getDBName( DBID ) ); // 5.9.31.1 (2018/04/13) 102 103 /** コネクションにアプリケーション情報を追記するかどうか指定 */ 104 private static final boolean USE_DB_APPLICATION_INFO = HybsSystem.sysBool( "USE_DB_APPLICATION_INFO" ) ; 105 106 /** アプリケーション情報 */ 107 public static final ApplicationInfo appInfo; 108 static { 109 if( USE_DB_APPLICATION_INFO ) { 110 appInfo = new ApplicationInfo(); 111 // ユーザーID,IPアドレス,ホスト名 112 appInfo.setClientInfo( "MailModuel", HybsSystem.HOST_ADRS, HybsSystem.HOST_NAME ); 113 // 画面ID,操作,プログラムID 114 appInfo.setModuleInfo( "MailModuel", "MailManager", "MailManager" ); 115 } 116 else { 117 appInfo = null; 118 } 119 } 120 121 122 /** 123 * 履歴テーブル(GE32)と宛先テーブル(GE34)に登録します。 124 * 登録時に、桁数オーバーにならないように、テーブル定義の桁数を上限として、 125 * 登録前に各項目の桁数整理を行います。 126 * 127 * @og.rev 5.9.3.0 (2015/12/04) 添付ファイル対応 128 * 129 */ 130 public void commitMailDB(){ 131 // 履歴テーブルの追加 132 String[] insGE32Args = new String[15]; 133 String ykno = getYkno(); 134 String[] attachFiles = StringUtil.csv2Array( initParamMap.get( "FILES" )); // 5.9.3.0 135 136 insGE32Args[GE32_YKNO] = ykno; 137 insGE32Args[GE32_PARAKEY] = initParamMap.get( "PARAKEY" ); 138 insGE32Args[GE32_PTN_ID] = trim( initParamMap.get( "PTN_ID" ), 20 ); 139 insGE32Args[GE32_FROM_ADDR] = trim( initParamMap.get( "FROM" ), 100); 140 insGE32Args[GE32_TITLE] = trim( initParamMap.get( "TITLE" ), 300); 141 insGE32Args[GE32_CONTENTS] = initParamMap.get( "CONTENT" ); 142// insGE32Args[GE32_ATTACH1] = ""; 143// insGE32Args[GE32_ATTACH2] = ""; 144// insGE32Args[GE32_ATTACH3] = ""; 145// insGE32Args[GE32_ATTACH4] = ""; 146// insGE32Args[GE32_ATTACH5] = ""; 147 // 5.9.3.0 148 if ( attachFiles != null ) { 149 int attSize = attachFiles.length; 150 for( int i = 0; i < attSize; i++ ) { 151 insGE32Args[6 + i] = trim( attachFiles[i], 256); 152 } 153 } 154 155 insGE32Args[GE32_DYSET] = HybsSystem.getDate( "yyyyMMddHHmmss" ); 156 insGE32Args[GE32_USRSET] = initParamMap.get( "LOGIN_USERID" ); 157 insGE32Args[GE32_PGUPD] = initParamMap.get( "PGID" ); 158 insGE32Args[GE32_SYSTEM_ID] = initParamMap.get( "SYSTEM_ID" ); 159 DBUtil.dbExecute( insGE32, insGE32Args, appInfo, DBID ); 160 161 // 宛先テーブル追加 162 String[] insGE34Args = new String[10]; 163 insGE34Args[GE34_YKNO]= ykno; 164 for( String dstId : mailDstMap.keySet() ) { 165 insGE34Args[GE34_DST_ID] = trim( mailDstMap.get( dstId )[IDX_DST_ADDR], 10 ); 166 insGE34Args[GE34_GROUP_ID] = ""; 167 insGE34Args[GE34_DST_NAME] = ""; 168 insGE34Args[GE34_DST_ADDR] = trim( mailDstMap.get( dstId )[IDX_DST_ADDR], 100 ); 169 insGE34Args[GE34_DST_KBN] = mailDstMap.get( dstId )[IDX_DST_KBN]; 170 insGE34Args[GE34_FGJ] = "1"; 171 insGE34Args[GE34_DYSET] = HybsSystem.getDate( "yyyyMMddHHmmss" ); 172 insGE34Args[GE34_USRSET] = initParamMap.get( "LOGIN_USERID" ); 173 insGE34Args[GE34_PGUPD] = initParamMap.get( "PGID" ); 174 DBUtil.dbExecute( insGE34, insGE34Args, appInfo, DBID ); 175 } 176 } 177 178 /** 179 * パラメータマップをセットします。 180 * 181 * @param params パラメータのマップ 182 */ 183// public void setInitParams( final Map<String, String> params ) { 184// initParamMap = params; 185// } 186 187 /** 188 * パラメータからマップをセットします。 189 * 190 * @og.rev 5.9.3.0 (2015/11/30) files追加 191 * 192 * @param systemId システムID 193 * @param from FROMアドレス 194 * @param tos TOアドレス(カンマ区切り) 195 * @param ccs CCアドレス(カンマ区切り) 196 * @param bccs BCCアドレス(カンマ区切り) 197 * @param content 本文 198 * @param title タイトル 199 * @param userid 登録ユーザ 200 * @param pgid 登録PG 201 * @param files 添付ファイル 202 * 203 */ 204 public void setInitParams( final String systemId, final String from, final String[] tos, final String[] ccs 205 ,final String[] bccs, final String content, final String title, final String userid, final String pgid 206 ,final String[] files) { 207 Map<String,String> paramMap = new HashMap<String,String>();; 208 209 paramMap.put( "SYSTEM_ID", systemId ); 210 paramMap.put( "FROM" , from ); 211 paramMap.put( "TO" , StringUtil.array2csv( tos ) ); 212 paramMap.put( "CC" , StringUtil.array2csv( ccs ) ); 213 paramMap.put( "BCC" , StringUtil.array2csv( bccs ) ); 214 paramMap.put( "CONTENT" , content ); 215 paramMap.put( "TITLE" , title ); 216 paramMap.put( "DATE", HybsSystem.getDate("yyyy/MM/dd") ); 217 paramMap.put( "TIME", HybsSystem.getDate("HH:mm:ss") ); 218 paramMap.put( "LOGIN_USERID", userid ); 219 paramMap.put( "PGID", pgid ); 220 paramMap.put( "FILES", StringUtil.array2csv( files ) ); // 5.9.3.0 (2015/12/04) 221 222 getDstMap(tos, ccs, bccs ); 223 224 initParamMap = paramMap; 225 } 226 227 /** 228 * 指定の長さ以内の文字列を返します。 229 * 230 * @param src オリジナルの文字列 231 * @param maxLen 指定の長さ 232 * 233 * @return 指定の長さに短縮された文字列 234 */ 235 private String trim( final String src, final int maxLen ) { 236 String rtn = src; 237 if( src != null && src.length() > maxLen ) { 238// rtn = src.substring( 0, maxLen ); 239 rtn = StringUtil.cut( src, maxLen ); 240 } 241 return rtn; 242 } 243 244 /** 245 * 要求NOを採番します。 246 * この要求NOで履歴テーブル(GE32)と宛先テーブル(GE30)の関連付けを持たせます。 247 * 248 * @og.rev 5.9.31.1 (2018/04/13) シーケンスの取り方変更 249 * 250 * @return 要求NO 251 */ 252 private String getYkno() { 253// String[][] tmp = DBUtil.dbExecute( selYkno, new String[0], appInfo, DBID ); 254// if( tmp == null || tmp.length == 0 ) { 255// String errMsg = "要求NO採番エラー" 256// + " SQL=" + selYkno ; 257// throw new RuntimeException( errMsg ); 258// } 259 Transaction tran = new TransactionReal( appInfo ); 260 int rtn_ykno = dbName.getSequence(selYkno,tran,DBID); 261 return Integer.toString( rtn_ykno ); 262 } 263 264 /** 265 * 送信先のアドレスをセットします。 266 * 267 * @param toId 268 * @param ccId 269 * @param bccId 270 */ 271 private void getDstMap( final String[] toId, final String[] ccId, final String[] bccId ){ 272 273 // 送信先(TO、CC、BCC)のマップを作成します。 274 mailDstMap = (TreeMap<String, String[]>)getDstAddrMap( bccId, KBN_BCC ); 275 mailDstMap.putAll( (TreeMap<String, String[]>) getDstAddrMap( ccId, KBN_CC ) ); 276 mailDstMap.putAll( (TreeMap<String, String[]>) getDstAddrMap( toId, KBN_TO ) ); 277 } 278 279 /** 280 * 送信先のアドレス・マップを作成します。 281 * 282 * @og.rev 5.9.33.0 (2018/06/01) dstBufがnullの場合の処理 283 * 284 * @param dstBuf 送信先配列 285 * @param kbn 送信区分[0:TO/1:CC/2:BCC] 286 * 287 * @return 送信先のアドレス・マップ 288 */ 289 private Map<String, String[]> getDstAddrMap( final String[] dstBuf, final int kbn ){ 290 Map<String,String[]> dstMap= new TreeMap<String,String[]>(); 291 // IDX_DST_ADDR ,IDX_DST_KBN 292 if( dstBuf != null ) { // 5.9.33.0 (2018/06/01) 293 String[] dstInit = { "", Integer.toString( kbn ) }; 294 295 int len = dstBuf.length; 296 for( int i=0; i < len; i++ ){ 297 String[] indMember = dstInit.clone(); 298 indMember[IDX_DST_ADDR] = dstBuf[i]; //メールアドレス 299 300 dstMap.put( dstBuf[i], indMember ); 301 } 302 } 303 return dstMap; 304 } 305 306}