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     */
016    package org.opengion.hayabusa.report;
017    
018    import org.opengion.hayabusa.common.HybsSystem;
019    import org.opengion.fukurou.util.StringUtil;
020    
021    import org.opengion.fukurou.mail.MailReceiveListener ;
022    import org.opengion.fukurou.mail.MailTX ;
023    import org.opengion.fukurou.mail.MailMessage ;
024    import org.opengion.fukurou.mail.MailAttachFiles ;
025    
026    import java.util.Date;
027    
028    /**
029     * MailReceiveListener ã®å®Ÿè£?‚¯ãƒ©ã‚¹ã§ã™ã?
030     * MailRX クラスã«ã‚»ãƒ?ƒˆã™ã‚‹ã“ã¨ã§ã€ãƒ¡ãƒ¼ãƒ«?‘ä»¶ã”ã¨ã« receive( MailMessage ) メソãƒ?ƒ‰ã?
031     * 呼ã³å‡ºã•れã¾ã™ã?
032     * メール?‘ä»¶ã«ã€æ·»ä»˜ãƒ•ァイルãŒè¤?•°ç™»éŒ²ã•れã¦ã?‚‹å ´åˆã?処ç?‚’行ã£ã¦ã?¾ã™ã?
033     * 添付ファイルã”ã¨ã«è¦æ±‚番å·ã‚’採番ã—ã¦ã€è¦æ±‚番å·.xls ã¨ã—ã¦ã‚»ãƒ¼ãƒ–ã—ã€å¸³ç¥¨è¦æ±‚テーブルã«
034     * 書ãè¾¼ã¿ã¾ã™ã?
035     *
036     * @og.rev 3.8.0.0 (2005/06/07) æ–°è¦è¿½åŠ?
037     * @og.group 帳票シスãƒ?ƒ 
038     *
039     * @version  4.0
040     * @author   Kazuhiko Hasegawa
041     * @since    JDK5.0,
042     */
043    public class ExcelInsertReceiveListener implements MailReceiveListener {
044    
045            // EXCELå–込時ã«ä½¿ç”¨ã™ã‚‹ãƒ?ƒ³ãƒãƒ©ãƒªãƒ•ォルãƒ?。ファイルåã?ã€è¦æ±‚番å·.xls
046            private final String EXCELIN_URL =
047                    HybsSystem.url2dir( StringUtil.nval(
048                                                                    HybsSystem.sys( "EXCEL_IN_FILE_URL" ) ,
049                                                                    HybsSystem.sys( "FILE_URL"   ) + "EXCELIN/" ) ) ;
050    
051            private GE50Access ge50 = null;
052    
053            /**
054             * メールå—信処ç?§ã€?¼‘メールå—ä¿¡ã”ã¨ã«å‘¼ã³å‡ºã•れã¾ã™ã?
055             * 処ç?µæžœã‚’ã?boolean ã§è¿”ã—ã¾ã™ã?
056             *
057             * @param message MailMessageオブジェク�
058             *
059             * @return      処�果(正常:true / 異常:false)
060             */
061            public boolean receive( final MailMessage message ) {
062                    System.out.println();
063                    System.out.println( "Receive " + new Date() );
064    
065                    String errMsg ;
066                    boolean okFlag = false;
067    
068                    // 毎回 オブジェクトを構築ã—ã¾ã™ã?登録日付ãŒåˆæœŸåŒ–ã•れã¾ã™ã?
069                    ge50 = new GE50Access( "CXXXXX","M_RECEIVE","ExcelInsert" );
070    
071                    try {
072                            String from             = message.getHeader( "From" );
073                            String subject  = message.getSubject();
074                            String content  = message.getContent();
075                            String msgid    = message.getMessageID();
076                            String comments = from + " " + subject + " " + msgid ;
077    
078                            String systemId = getContentParam( content,"SYSTEM_ID" );
079                            if( systemId == null ) {
080                                    errMsg = "メール本æ–?« SYSTEM_ID=[xx] ã®ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ãŒå­˜åœ¨ã—ã¾ã›ã‚“ã€? ;
081                                    errorReport( message,errMsg ) ;
082                                    return okFlag;
083                            }
084    
085                            System.out.println( " From:" + from );
086                            String joken = getContentParam( content,"JOKEN" );
087                            if( joken == null ) { joken = "EXCELIN"; }
088    
089                            ge50.setSystemId( systemId );
090                            ge50.setJoken   ( joken );
091                            ge50.setComments( comments );
092    
093                            MailAttachFiles attFiles = new MailAttachFiles( message.getMessage() );
094                            String[] files = attFiles.getNames();
095                            if( files == null || files.length == 0 ) {
096                                    errMsg = "メール㫠EXCEL 添付ファイルãŒå­˜åœ¨ã—ã¾ã›ã‚“ã€? ;
097                                    errorReport( message,errMsg ) ;
098                                    return okFlag;
099                            }
100    
101                            // æ·»ä»˜ãƒ•ã‚¡ã‚¤ãƒ«ã®æ•°ã?‘処ç?—ã¾ã™ã?
102                            for( int i=0; i<files.length; i++ ) {
103                                    String ykno    = ge50.makeYkno();               // æ–°ãŸãªè¦æ±‚番å·ãŒå?部ã«ã‚‚ã‚»ãƒ?ƒˆã•れるã?
104                                    String file    = ykno + ".xls" ;
105                                    String attFile = files[i];
106    
107                                    // LISTID ã‚’å–å¾—ã—ã¾ã™ã? EXCELファイルåã«(帳票ID)ã‚’å?れã¾ã™ã?
108                                    int st = attFile.indexOf( '(' );
109                                    int ed = attFile.indexOf( ')',st );
110                                    if( st < 0 || ed < 0 ) {
111                                            errMsg = "EXCEL 添付ファイルã«(帳票ID)ãŒå­˜åœ¨ã—ã¾ã›ã‚“ã€?" + attFile + "]" ;
112                                            errorReport( message,errMsg ) ;
113                                            return okFlag;
114                                    }
115    
116                                    String listId  = attFile.substring( st+1,ed );
117                                    if( listId.length() == 0 ) {
118                                            errMsg = "EXCEL 添付ファイルã®(帳票ID)ã‚’å?りå?ã›ã¾ã›ã‚“ã€?" + attFile + "]" ;
119                                            errorReport( message,errMsg ) ;
120                                            return okFlag;
121                                    }
122    
123                                    String fileDir = EXCELIN_URL + systemId + "/" + listId + "/" ;
124    
125                                    attFiles.saveFileName( fileDir,file,i );
126    
127                                    ge50.setListId( listId );
128                                    ge50.setOutDir( fileDir );
129                                    ge50.setOutFile( files[i] );
130    
131                                    ge50.insertGE50( GE50Access.FG_SET );
132    
133                                    System.out.println( attFile + " -> " + file );
134                            }
135                            System.out.println( " End." );
136                            okFlag = true;
137                    }
138                    catch( Throwable ex ) {
139                            errMsg = StringUtil.stringStackTrace( ex );
140                            errorReport( message,errMsg ) ;
141                            okFlag = false;
142                    }
143                    return okFlag;
144            }
145    
146            /**
147             * メール処ç?¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸå?åˆã?処ç?‚’行ã„ã¾ã™ã?
148             * 処ç??ã€?¼“種類ã‚りã¾ã™ã?
149             * ?‘.エラーメールをã?EXCELIN_URL/ERROR_MAIL フォルãƒ?«ã€ãƒ¡ãƒ?‚»ãƒ¼ã‚¸ID.txt ã§ä¿å­˜ã—ã¾ã™ã?
150             * ?’.COMMON_MAIL_SERVER 㨠ERROR_MAIL_TO_USERS ãŒè¨­å®šã•れã¦ã?‚‹å ´åˆã«ã€?
151             *     ãã?ã‚ã¦å…ˆã«ã€è¿”信メールをé?ä¿¡ã—ã¾ã™ã?
152             * ?“.GE50(å¸³ç¥¨è¦æ±‚テーブル)ã¨ã€GE51(帳票エラーãƒ??ブル)ã«ã‚¨ãƒ©ãƒ¼çжæ³ã‚’書ãè¾¼ã¿ã¾ã™ã?
153             *
154             * @param message MailMessageオブジェク�
155             * @param errorMessage エラーメãƒ?‚»ãƒ¼ã‚¸
156             */
157            private void errorReport( final MailMessage message,final String errorMessage ) {
158                    // エラーメールã‚?æ‰?®šã?ãƒ?‚£ãƒ¬ã‚¯ãƒˆãƒªã«å‡ºåŠ›ã—ã¾ã™ã?
159                    message.saveSimpleMessage( EXCELIN_URL + "/ERROR_MAIL/" );
160    
161                    String subject          = "EXCELå–込メールå—信中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€?;
162                    String org_from         = message.getHeader( "From" ) ;
163                    String ord_subject      = message.getSubject();
164                    String content          = message.getContent();
165                    String errMsg = subject + HybsSystem.CR
166                                            + " Subject=" + ord_subject + " From=" + org_from + HybsSystem.CR
167                                            + " MessageID=" + message.getMessageID() + HybsSystem.CR
168                                            + " Save ErrorMail=" + EXCELIN_URL + "/ERROR_MAIL/" + HybsSystem.CR
169                                            + errorMessage + HybsSystem.CR
170                                            + "==========================================================="
171                                            + HybsSystem.CR
172                                            + content ;
173    
174                    if( ge50 != null ) {
175                            String systemId = ge50.getSystemId() ;
176                            if( systemId == null ) { ge50.setSystemId( "ERR" ); }
177    
178                            // エラー時ã?è¦æ±‚番å·ã¯ã€æ–°ãŸã«æŽ¡ç•ªã—ãªãŠã—ã¾ã™ã?
179                            ge50.makeYkno();
180    
181                            ge50.insertGE50( GE50Access.FG_ERR2 );
182                            ge50.insertErrorGE56( errMsg );
183                    }
184    
185                    // host 㨠user ã®ãƒ¡ãƒ¼ãƒ«é€ä¿¡å…ˆãŒè¨˜è¿°ã•れã¦ã?‚‹å ´åˆã?ã€ãƒ¡ãƒ¼ãƒ«ã§ã‚‚転é€ã™ã‚‹ã?
186                    String   host = message.getHost();
187                    String   from = message.getUser();
188    
189                    if( host != null && from != null ) {
190                            String[] to             = new String[] { org_from };
191                            String[] cc = StringUtil.csv2Array( HybsSystem.sys( "ERROR_MAIL_TO_USERS" ) );
192    
193                            MailTX tx = new MailTX( host );
194    //                      tx.setHost( host );
195                            tx.setFrom( from );
196                            tx.setTo( to );
197                            if( cc.length > 0 ) { tx.setCc( cc ); }
198                            tx.setSubject( subject );
199                            tx.setMessage( errMsg );
200                            tx.sendmail();
201                    }
202            }
203    
204            /**
205             * メãƒ?‚»ãƒ¼ã‚¸æœ¬æ–?‚ˆã‚Šã?æŒ?®šã?キーã«é–¢é€£ä»˜ã‘られã¦ã?‚‹æƒ??ã‚’å?りå?ã—ã¾ã™ã?
206             * ã“れã¯ã€æŒ‡å®šã?æ–?­—å?=[設定å?] ã¨ã?†ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ã‹ã‚‰ã?設定å?ã‚’å–りå?ã—ã¾ã™ã?
207             * æŒ?®šã?æ–?­—å?ã¨=ã®ã¨é–“ã«ã€ã‚¹ãƒšã?スをå?れãªã?§ãã ã•ã„ã€?
208             * 設定å?ã®åˆ?‚Šå‡ºã—ã?ã€?æŒ?®šã?æ–?­—å?=[" 㨠"]" ã®é–“ã?æ–?­—å?ã‚’å?りå?ã—ã¾ã™ã?
209             * å†?ƒ¨ã«ã‚¹ãƒšã?スãŒå?ã£ã¦ã?¦ã‚‚ã?å•題ã‚りã¾ã›ã‚“。ãŸã?—ã€] ãŒå?ã£ã¦ã?‚‹å ´åˆã?ã€?
210             * 正常ã«åˆ?‚Šå‡ºã™ã“ã¨ã¯å‡ºæ¥ã¾ã›ã‚“ã—ã?エスケープ文字も用æ„ã—ã¦ã?¾ã›ã‚“ã€?
211             *
212             * @param       content コンãƒ?ƒ³ãƒ??æ–?­—å?
213             * @param       key     æƒ??ã‚’å?りå?ã™æ™‚ã®ã‚­ãƒ¼
214             *
215             * @return      設定å? (設定å?ãŒè¦‹ã¤ã‹ã‚‰ãªã??å?null
216             */
217            private String getContentParam( final String content,final String key ) {
218                    if( content == null || key == null ) { return null; }
219    
220                    String newKey = key + "=[" ;
221    
222                    // キーã®å­˜åœ¨ãƒã‚§ãƒ?‚¯ã¨å ´æ‰?‚’求ã‚ã‚‹ã?
223                    int keyAd = content.indexOf( newKey );
224                    if( keyAd >= 0 ) {
225                            // [設定å?] ã®çµ‚äº??æ‰?‚’求ã‚ã‚‹ã?(見ã¤ã‘ãŸä½ç½®?‹æ–‡å­—å?æ•°)
226                            int st = keyAd + newKey.length() ;
227                            int ed = content.indexOf( ']' , st );
228                            if( ed >= 0 ) {
229                                    return content.substring( st,ed );
230                            }
231                    }
232                    return null;
233            }
234    }