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.taglib;
017
018 import static org.opengion.fukurou.util.StringUtil.nval;
019
020 import java.util.Locale;
021 import java.util.Map;
022 import java.util.HashMap;
023 import java.util.Enumeration;
024
025 import org.opengion.fukurou.util.ErrorMessage;
026 import org.opengion.fukurou.util.StringUtil;
027 import org.opengion.hayabusa.common.HybsSystem;
028 import org.opengion.hayabusa.common.HybsSystemException;
029 import org.opengion.hayabusa.mail.MailManager_DIRECT;
030 import org.opengion.hayabusa.db.DBTableModel;
031
032 import javax.servlet.ServletRequest ;
033
034 /**
035 * 定型æ–?�Šよã?パラメータの設定によるメールをé?信するためのタグですã?
036 *
037 * @og.formSample
038 * ●形式ï¼?lt;og:mailSender ptnId="…" action="…" from="…" to="…" />
039 * ●body?šなã�?
040 *
041 * ●Tag定義??
042 * <og:mailSender2
043 * ptnId ○ã?TAG】メール定型æ–??IDを指定しまã�?å¿??)ã€?
044 * from ○ã?TAG】é?信å…??¦?²?¯?)の社員IDを指定しまã�?å¿??)ã€?
045 * action ○ã?TAG】アクション[CHECK/SEND/NOCHECK]をセãƒ?ƒˆしまã�?å¿??)ã€?
046 * addrCheck 【TAG】メールアドレスの構文とメールアカウントã?チェãƒ?‚¯をするかどã�?�‹[true/false]を指定しまã�?
047 * to 【TAG】é?信å…??´?¯)の社員ID、グループIDをCSV形式でæŒ?®šしまã�?
048 * cc 【TAG】é?信å…??£?£)の社員ID、グループIDをCSV形式でæŒ?®šしまã�?
049 * bcc 【TAG】é?信å…??¢?£?£)の社員ID、グループIDをCSV形式でæŒ?®šしまã�?
050 * tableId 【TAGã€?通常は使ã�?�¾せん)宛å?のDBTableModelをã?sessionに登録するときã?キーを指定しまã�?
051 * scope 【TAG】キャãƒ?‚·ュする場合ã?スコープ[request/page/session/applicaton]を指定しまã�?初期値:session)
052 * fileURL 【TAG】添付ファイルのセーブディレクトリを指定しまã�?(初期値:FILE_URL[=filetemp/])
053 * filename 【TAG】添付ファイル名をCSV形式でæŒ?®šしまã�?
054 * useStop 【TAG】例外発生したå?合ã?後続JSPの評価を中止するかどã�?�‹[true:中止/false:継続]を指定しまã�?
055 * debug 【TAG】デバッグæƒ??をå?力するかどã�?�‹[true/false]を指定しまã�?初期値:false)
056 * />
057 *
058 * ●使用ä¾?
059 * <og:mailSender2 >
060 * ptnId = PtnId 定型文ID(定型æ–??スタに登録されてã�?‚‹定型文ID)
061 * action = Action アクション(CHECK:確認あã‚?SEND:確認後ã?送信/NOCHECK:確認なã�?
062 * from = From 送信å…?送信è€?¤¾員ID)
063 * to = To 送信å…?コンマ区åˆ?‚Šでè¤?•°セãƒ?ƒˆ可能、社員ID、グループID)
064 * cc = Cc 送信å…?コンマ区åˆ?‚Šでè¤?•°セãƒ?ƒˆ可能、社員ID、グループID)
065 * bcc = Bcc 送信å…?コンマ区åˆ?‚Šでè¤?•°セãƒ?ƒˆ可能、社員ID、グループID)
066 * fileURL = 添付ファイルのセーブディレクトリ
067 * filename = 添付ファイルå�?ローカルにセーブされたファイルå�?(コンマ区åˆ?‚Šでè¤?•°登録可能)
068 * addrCheck = true/false(メールアカウントã?有効チェãƒ?‚¯)
069 * useStop = true/falseã€?‚¨ラー発生時に後続JSPの評価を中止する(true)/中止しなã�?false)
070 * scope = request/session 宛å?ãƒ??ブルの格納スコーãƒ?ãƒ?ƒ•ォルト:session)
071 * tableId = TableId 宛å?ãƒ??ブルのID(通常はãƒ?ƒ•ォルトã?ãƒ??ブルモãƒ?ƒ«ID名称を利用しまã�?
072 * debug = true/false
073 * </og:mailSender >
074 *
075 * from には社員IDしかセãƒ?ƒˆできませんã€?
076 * to,cc,bccには社員ID、またã?グループIDをコンマ区åˆ?‚Šでè¤?•°セãƒ?ƒˆできますã?
077 * action:CHECK は送信前に、ä¸?º¦送信å†?®¹を確認したい場合に利用しますã?action=CHECKの場合ã?scopeにはsessionしかセãƒ?ƒˆできませんã€?
078 * action:SEND は確認済ã?メールæ–?‚’送信する場合に利用しますã?
079 * action:NOCHECK は確認なしで送信したã�??合に利用しますã?
080 *
081 * @og.group そã?他å?åŠ?
082 *
083 * @version 4.0
084 * @author Sen.Li
085 * @since JDK1.6
086 */
087 public class MailSenderTag2 extends CommonTagSupport {
088 private static final String VERSION = "4.4.0.0 (2009/01/05)";
089 private static final long serialVersionUID = 440020090105L;
090
091 private static final String ACT_CHECK = "CHECK" ;
092 private static final String ACT_SEND = "SEND" ;
093 private static final String ACT_NOCHECK = "NOCHECK" ;
094 private static final int MAX_FILE_COUNT = 5 ;
095 private static final String[] ACTION_LIST = new String[] { ACT_CHECK , ACT_SEND, ACT_NOCHECK };
096 private String ptnId = null;
097 private String action = null;
098 private String from = null;
099 private String to = null;
100 private String cc = null;
101 private String bcc = null;
102 private String fileURL = HybsSystem.sys( "FILE_URL" );
103 private String[] filename = null;
104 private String tableId = HybsSystem.TBL_MDL_KEY ;
105 private boolean addrCheck = false;
106 private boolean useStop = true;
107
108 /**
109 * Taglibの終äº?‚¿グが見つかったときに処ç�?�™ã‚?doEndTag() ã‚?オーバã?ライドしますã?
110 *
111 * @return 後続å?ç�??æŒ?¤º
112 */
113 @Override
114 public int doEndTag() {
115 debugPrint();
116 int rtnCode = EVAL_PAGE;
117 int errCode = ErrorMessage.OK;
118
119 if( check( action, ACTION_LIST ) ) {
120 try {
121 tableId = ( tableId == null ) ? HybsSystem.TBL_MDL_KEY:tableId;
122 MailManager_DIRECT manager = new MailManager_DIRECT();
123 manager.setResourceManager( getResource() );
124 DBTableModel table = null;
125
126 if ( ACT_NOCHECK.equals( action ) || ACT_CHECK.equals( action ) ){
127 Map<String,String> initParamMap = makeParamMap();
128 manager.create( initParamMap );
129 }
130 if( ACT_NOCHECK.equals( action ) ) {
131 manager.setDebug( isDebug() );
132 manager.send();
133 }
134 else if ( ACT_CHECK.equals( action ) ) {
135 setSessionAttribute( "MAIL.FROM_ADDR", manager.getFromAddr() );
136 setSessionAttribute( "MAIL.PTN_ID", ptnId );
137 setSessionAttribute( "MAIL.TITLE", manager.getTitle() );
138 setSessionAttribute( "MAIL.CONTENT", manager.getContent() );
139 }
140 else if ( ACT_SEND.equals( action ) ) {
141 ptnId = (String) getSessionAttribute( "MAIL.PTN_ID" );
142 Map<String,String> initParamMap = makeParamMap();
143 manager.setFromAddr( (String) getSessionAttribute( "MAIL.FROM_ADDR" ) );
144 manager.setTitle( (String) getSessionAttribute( "MAIL.TITLE" ) );
145 manager.setContent( (String) getSessionAttribute( "MAIL.CONTENT" ) );
146 table = ( DBTableModel )getObject( tableId );
147 manager.create( initParamMap, table );
148 manager.setDebug( isDebug() );
149 manager.send();
150 }
151 startQueryTransaction( tableId );
152 table = manager.makeDstTable();
153 if( ! commitTableObject( tableId, table ) ) {
154 jspPrint( "DBTableModel は登録しませんã€? );
155 }
156 }
157 catch( RuntimeException rex ){
158 if ( useStop ) {
159 ErrorMessage errMsg = new ErrorMessage();
160 errMsg.addMessage( 0, ErrorMessage.NG, "ERR0040", rex.getMessage() );
161 jspPrint( TaglibUtil.makeHTMLErrorTable( errMsg, getResource() ) );
162 rtnCode = SKIP_PAGE;
163 }
164 rex.printStackTrace();
165 errCode = ErrorMessage.WARNING;
166 }
167 setSessionAttribute( "MAIL.ERR_CODE", String.valueOf( errCode ) );
168 }
169 else {
170 String errMsg = "設定ã?アクションはサポã?トされてã�?�¾せん?? + action ;
171 throw new HybsSystemException( errMsg );
172 }
173 return rtnCode;
174 }
175
176 /**
177 * 【TAG】アクション[CHECK/SEND/NOCHECK]をセãƒ?ƒˆしますã?
178 * @og.tag
179 * 送信前に、ä¸?º¦送信å†?®¹を確認するå?合ã?"CHECK "をセãƒ?ƒˆしますã?
180 * 確認済ã?メールæ–?‚’送信する場合ã?"SEND"をセãƒ?ƒˆしますã?
181 * 確認なしで送信する場合ã?"NOCHECK"をセãƒ?ƒˆしますã?
182 *
183 * @param act アクション[CHECK/SEND/NOCHECK]
184 */
185 public void setAction( final String act ) {
186 String act2 = getRequestParameter( act );
187 if( act2 != null && act2.length() > 0 ) { action = act2.toUpperCase(Locale.JAPAN); }
188 }
189
190 /**
191 * 【TAG】メール定型æ–??IDを指定しますã?
192 *
193 * @og.tag
194 * 定型æ–??スタに定義されてã�?‚‹定型文IDを指定しますã?
195 *
196 * @param pid 定型文ID
197 */
198 public void setPtnId( final String pid ) {
199 ptnId = nval( getRequestParameter( pid ),null );
200 }
201
202 /**
203 * 【TAG】é?信å…??¦?²?¯?)の社員IDを指定しますã?
204 *
205 * @og.tag
206 * 送信å…??¦?²?¯?)の社員IDを指定しますã?社員マスタに存在してã�?‚‹社員ID(例ï¼?C12345")しかセãƒ?ƒˆできませんã€?
207 *
208 * @param fromId 送信å…??¦?²?¯?)の社員ID
209 */
210 public void setFrom( final String fromId ) {
211 from = nval( getRequestParameter( fromId ), from );
212 setRequestAttribute( "FROM", from );
213 }
214
215 /**
216 * 【TAG】é?信å…??´?¯)の社員ID、グループIDをCSV形式でæŒ?®šしますã?
217 *
218 * @og.tag
219 * è¤?•°のID(社員ID、グループID)をカンマ区åˆ?‚Šでセãƒ?ƒˆできますã?
220 * グループIDはグループã?スタ管ç�?”»面により定義するå¿?¦�がありますã?"GP.XXXXX"の形式でセãƒ?ƒˆしますã?
221 *
222 * @param toIds 送信å…??´?¯)の社員ID、グループID(CSV形å¼?
223 */
224 public void setTo( final String toIds ) {
225 to = getRequestParameter( toIds );
226 }
227
228 /**
229 * 【TAG】é?信å…??£?£)の社員ID、グループIDをCSV形式でæŒ?®šしますã?
230 *
231 * @og.tag
232 * è¤?•°のID(社員ID、グループID)をカンマ区åˆ?‚Šでセãƒ?ƒˆできますã?
233 * グループIDはグループã?スタ管ç�?”»面により定義するå¿?¦�がありますã?"GP.XXXXX"の形式でセãƒ?ƒˆしますã?
234 *
235 * @param ccIds 送信å…??£?£)の社員ID、グループID(CSV形å¼?
236 */
237 public void setCc( final String ccIds ) {
238 cc = getRequestParameter( ccIds );
239 }
240
241 /**
242 * 【TAG】é?信å…??¢?£?£)の社員ID、グループIDをCSV形式でæŒ?®šしますã?
243 *
244 * @og.tag
245 * è¤?•°のID(社員ID、グループID)をカンマ区åˆ?‚Šでセãƒ?ƒˆできますã?
246 * グループIDはグループã?スタ管ç�?”»面により定義するå¿?¦�がありますã?"GP.XXXXX"の形式でセãƒ?ƒˆしますã?
247 *
248 * @param bccIds 送信å…??¢?£?£)の社員ID、グループID(CSV形å¼?
249 */
250 public void setBcc( final String bccIds ) {
251 bcc = getRequestParameter( bccIds );
252 }
253
254 /**
255 * 【TAG】添付ファイルのセーブディレクトリを指定しまã�?
256 * (初期値:FILE_URL[={@og.value org.opengion.hayabusa.common.SystemData#FILE_URL}])ã€?
257 *
258 * @og.tag
259 * こã?属æ?でæŒ?®šされるãƒ?‚£レクトリに、添付ファイルが存在すると仮定しますã?
260 * æŒ?®š方法ã?ã€??常の fileURL 属æ?と同様に、å?頭がã?'/' (UNIX) またã?ã€?¼’文字目がã?
261 * ":" (Windows)の場合ã?、指定ã?URLそã?ままのãƒ?‚£レクトリに、そã�?�§なã�??合ã?ã€?
262 * fileURL = "{@USER.ID}" とæŒ?®šすると、FILE_URL 属æ?でæŒ?®šã?フォルãƒ??下にã€?
263 * さらに、各個人ID別のフォルãƒ?‚’作æ?して、そこを使用しますã?
264 * (初期値:シスãƒ?ƒ 定数のFILE_URL[={@og.value org.opengion.hayabusa.common.SystemData#FILE_URL}])ã€?
265 *
266 * @param url 添付ファイルのセーブディレクトリ
267 * @see org.opengion.hayabusa.common.SystemData#FILE_URL
268 */
269 public void setFileURL( final String url ) {
270 String furl = nval( getRequestParameter( url ),null );
271 if( furl != null ) {
272 char ch = furl.charAt( furl.length()-1 );
273 if( ch != '/' && ch != '\\' ) { furl = furl + "/"; }
274 fileURL = StringUtil.urlAppend( fileURL,furl );
275 }
276 }
277
278 /**
279 * 【TAG】添付ファイル名をCSV形式でæŒ?®šしますã?
280 *
281 * @og.tag
282 * è¤?•°ファイルをセãƒ?ƒˆできますã?
283 * 設定方法ã?、カンマで区åˆ?�£て並べè¤?•°æŒ?®šできますã?
284 *
285 * @param fname 添付ファイルå�?
286 */
287 public void setFilename( final String fname ) {
288 filename = StringUtil.csv2ArrayOnly( getRequestParameter( fname ) );
289 }
290
291 /**
292 * 【TAG】メールアドレスの構文とメールアカウントã?チェãƒ?‚¯をするかどã�?�‹[true/false]を指定しますã?
293 *
294 * @og.tag
295 * メールアドレスの構文とメールアカウントã?チェãƒ?‚¯をすã‚?true)/しなã�?false)を指定しますã?
296 * メールæ–?�ˆ成ã?段階では、メールアドレスの構文æ–?³•につã�?�¦チェãƒ?‚¯しますã?
297 * メール送信の段階では、メールアカウントが有効かにつã�?�¦チェãƒ?‚¯しますã?
298 * "true"とæŒ?®šするå?合ã??´?—ーが検å?されたら、例外を投げて本タグの処ç�?�Œ中止されますã?
299 * "false"とæŒ?®šするå?合ã??´?—ーが検å?されてもã?例外を投げませんã€?
300 *
301 * @param addrChk 構文,アカウントチェãƒ?‚¯おするかどã�?�‹[true/false]
302 */
303 public void setAddrCheck( final String addrChk ) {
304 addrCheck = nval( getRequestParameter( addrChk ), addrCheck );
305 }
306
307 /**
308 * 【TAG】例外発生したå?合ã?後続JSPの評価を中止するかどã�?�‹[true:中止/false:継続]を指定しますã?
309 *
310 * @og.tag
311 * "true"とæŒ?®šするå?合ã?例外が発生したら、後続JSPが評価されませんã€?
312 * "false"とæŒ?®šするå?合ã?例外が発生してもã?後続JSPが評価されますã?後続ã?JSPでは変数
313 * {@MAIL.ERR_CODE}で本タグの実行状æ³??´?—ー発生したか)を取得できますã?
314 *
315 * @param stop 例外時に後続å?ç�?‚’中止するかどã�?�‹[true:中止/false:継続]
316 */
317 public void setUseStop( final String stop ) {
318 useStop = nval( getRequestParameter( stop ), useStop );
319 }
320
321 /**
322 * 【TAGã€?通常は使ã�?�¾せん)結果のDBTableModelをã?sessionに登録するときã?キーを指定しまã�?
323 * (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])ã€?
324 *
325 * @og.tag
326 * 検索結果より、DBTableModelオブジェクトを作æ?しますã?これをã?下流ã?viewタグ等に
327 * 渡すå?合にã€??常は、session を利用しますã?そã?場合ã?登録キーですã?
328 * query タグを同時に実行して、結果を求めるå?合ã?同ä¸?ƒ¡モリに配置される為ã€?
329 * こã? tableId 属æ?を利用して、メモリ空間をåˆ?�‘ますã?
330 * (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])ã€?
331 *
332 * @param id sessionに登録する時ã? ID
333 */
334 public void setTableId( final String id ) {
335 tableId = nval( getRequestParameter( id ),tableId ); // 3.8.0.9 (2005/10/17)
336 }
337
338 /**
339 * タグリブオブジェクトをリリースしますã?
340 * キャãƒ?‚·ュされて再利用されるã?で、フィールドã?初期設定を行いますã?
341 *
342 */
343 @Override
344 protected void release2() {
345 super.release2();
346 from = null;
347 to = null;
348 cc = null;
349 bcc = null;
350 fileURL = HybsSystem.sys( "FILE_URL" );
351 filename = null;
352 ptnId = null;
353 action = null;
354 tableId = HybsSystem.TBL_MDL_KEY ;
355 addrCheck = false;
356 useStop = true;
357 }
358
359 /**
360 * こã?オブジェクトã?æ–?—å?表現を返しますã?
361 * 基本çš?�«ãƒ?ƒ�ãƒ?‚°目çš?�«使用しますã?
362 *
363 * @return こã?クラスのæ–?—å?表現
364 */
365 @Override
366 public String toString() {
367 return org.opengion.fukurou.util.ToString.title(this.getClass().getName() )
368 .println( "VERSION" ,VERSION )
369 .println( "ptnId" ,ptnId )
370 .println( "action" ,action )
371 .println( "tableId" ,tableId )
372 .println( "addrCheck" ,addrCheck )
373 .println( "useStop" ,useStop )
374 .println( "from" ,from )
375 .println( "to" ,to )
376 .println( "cc" ,cc )
377 .println( "bcc" ,bcc )
378 .println( "filename" ,filename )
379 .println( "fileURL" ,fileURL )
380 .println( "Other...", getAttributes().getAttribute() )
381 .fixForm().toString();
382 }
383
384 /**
385 * リクエスト変数の値より、定型æ–?�«å¿?¦�なパラメータを取得して、パレメータマップに入れますã?
386 * パラメータマップã?引数としてメールモジュールのマネージャに渡しますã?
387 * マネージャの中には、定型æ–?‚’å…?�«、パラメータマップã?値とマã?ジしてメールのå�??目を合成しますã?
388 *
389 * @return 定型æ–?�«å¿?¦�なパレメータマッãƒ?
390 */
391 private Map<String, String> makeParamMap() {
392 Map<String, String> paramMap = new HashMap<String, String>();
393 if( action.endsWith( ACT_NOCHECK ) || action.equals( ACT_CHECK ) ) {
394 ServletRequest request = this.getRequest();
395 Enumeration<?> enu1 = request.getAttributeNames();
396 while( enu1.hasMoreElements() ) {
397 String name = (String) enu1.nextElement();
398 Object tmpObj = request.getAttribute( name );
399 if ( tmpObj instanceof String ) {
400 paramMap.put( name, (String) request.getAttribute( name ) );
401 }
402 }
403 Enumeration<?> enu2 = request.getParameterNames();
404 while( enu2.hasMoreElements() ) {
405 String name = (String) enu2.nextElement();
406 paramMap.put( name, request.getParameter( name ) );
407 }
408
409 paramMap.put( "FROM", from );
410 paramMap.put( "TO", to );
411 paramMap.put( "CC", cc );
412 paramMap.put( "BCC", bcc );
413 }
414 paramMap.put( "PTN_ID", ptnId );
415 paramMap.put( "SYSTEM_ID", HybsSystem.sys( "SYSTEM_ID" ) );
416 paramMap.put( "ADDR_CHECK", String.valueOf( addrCheck ) );
417 paramMap.put( "LOGIN_USERID", getRequestValue( "USER.ID" ) );
418 paramMap.put( "LOGIN_USERNAME", getRequestValue( "USER.JNAME" ) );
419 paramMap.put( "PGID", getRequestValue( "GUI.KEY" ) );
420 paramMap.put( "DATE", HybsSystem.getDate( "yyyy/MM/dd" ) );
421 paramMap.put( "TIME", HybsSystem.getDate( "HH:mm:ss" ) );
422
423 String[] temp = { "", "", "", "", "" };
424 if( filename != null && filename.length > 0 ) {
425 String directory = HybsSystem.url2dir( fileURL );
426 int fileCount = filename.length > MAX_FILE_COUNT ? MAX_FILE_COUNT : filename.length;
427 for( int i = 0; i < fileCount; i++ ) {
428 temp[i] = StringUtil.urlAppend( directory, filename[i] );
429 }
430 }
431 paramMap.put( "ATTACH1", temp[0] );
432 paramMap.put( "ATTACH2", temp[1] );
433 paramMap.put( "ATTACH3", temp[2] );
434 paramMap.put( "ATTACH4", temp[3] );
435 paramMap.put( "ATTACH5", temp[4] );
436 return paramMap;
437 }
438 }