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}