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