    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}