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 org.opengion.hayabusa.common.HybsSystem;
019    import org.opengion.hayabusa.common.HybsSystemException;
020    import org.opengion.hayabusa.common.BuildNumber;
021    import org.opengion.hayabusa.resource.UserInfo;
022    import org.opengion.hayabusa.resource.GUIInfo;
023    
024    import org.opengion.fukurou.util.EnumType ;
025    import org.opengion.fukurou.util.ErrorMessage;
026    import org.opengion.fukurou.util.LogSender;
027    import org.opengion.fukurou.mail.MailTX ;
028    import org.opengion.fukurou.util.StringUtil ;
029    import static org.opengion.fukurou.util.StringUtil.nval ;
030    
031    /**
032     * JSPのエラー発生時の処ç�?‚’行うタグですã?
033     *
034     * JSPでは、エラー発生時に、エラーペã?ジに飛ã?す機è?がありますã?現在のエンジンではã€?
035     * common/error.jsp ペã?ジå†?�§、å?ç�?‚’行ってã�?�¾すが、表示形式ã?整形、エラーメールの送信ã€?
036     * ログへの出力ã?エラーæ–?­—å?の表示(Exceptionをそのままユーザーに見せるã?は良くなã�?
037     * などの、細かい対応がå¿?¦�ですã?
038     * ここでは、それらをタグ化して、属æ?でæŒ?®šできるようにしましたã€?
039     *
040     * エラー発生時にメールでエラーå†?®¹を飛ã?すことも可能ですã?
041     * これは、シスãƒ?ƒ パラメータの COMMON_MAIL_SERVER に、ERROR_MAIL_TO_USERS に送信しますã?
042     * ERROR_MAIL_TO_USERS が未設定ã?場合ã?ã€??信しませんã€?
043     *
044     * @og.formSample
045     * ●形式ï¼?
046     *     <og:error
047     *          useMail     = "[true|false]"                    メール送信可否を指定しまã�?初期値:true)
048     *          logMsgType  = "[LONG|MEDIUM|SHORT|NONE]"        ログに書き込ã‚?ƒ¡ãƒ?‚»ージの形式をæŒ?®?初期値:MEDIUM)
049     *          viewMsgType = "[LONG|MEDIUM|SHORT|NONE|ALLNONE|TABLE]"  画面に表示するメãƒ?‚»ージの形式をæŒ?®?初期値:SHORT)
050     *     />
051     *
052     * ●body?šあã‚?EVAL_BODY_BUFFERED:BODYを評価しã?{@XXXX} を解析しまã�?
053     *
054     * ●Tag定義??
055     *   <og:error
056     *       useMail            【TAG】メール送信可否を指定しまã�?初期値:true)
057     *       logMsgType         【TAG】ログに書き込ã‚?ƒ¡ãƒ?‚»ージの形式をæŒ?®?初期値:MEDIUM)
058     *       viewMsgType        【TAG】画面に書き込ã‚?ƒ¡ãƒ?‚»ージの形式をæŒ?®?初期値:MEDIUM)
059     *       debug              【TAG】デバッグæƒ??をå?力するかどã�?�‹[true/false]を指定しまã�?初期値:false)
060     *       skipPage           【TAG】エラーが発生した時に、以降ã?処ç�?‚’スキãƒ??するã�?初期値:false[=スキãƒ??しない])
061     *   >   ... Body ...
062     *   </og:error>
063     *
064     * ●使用ä¾?
065     *     <og:error />
066     *
067     * @og.rev 4.0.0.0 (2005/08/31) 新規作æ?
068     * @og.group エラー処ç�?
069     *
070     * @version  4.0
071     * @author       Kazuhiko Hasegawa
072     * @since    JDK5.0,
073     */
074    public class ErrorTag extends CommonTagSupport {
075            //* こã?プログラãƒ??VERSIONæ–?­—å?を設定しますã?       {@value} */
076            private static final String VERSION = "5.1.8.0 (2010/07/01)" ;
077    
078            private static final long serialVersionUID = 518020100701L ;
079    
080            /**
081             * ログメãƒ?‚»ージタイãƒ?属æ?としてæŒ?®šできる選択肢を定義しますã?
082             */
083            private static final EnumType<String> LOG_MSGTYPE =
084                                    new EnumType<String>( "ログメãƒ?‚»ージタイãƒ? , "MEDIUM" )
085                                            .append( "LONG"         ,"詳細メãƒ?‚»ージを作æ?しますã?" )
086                                            .append( "MEDIUM"       ,"標準メãƒ?‚»ージを作æ?しますã?" )
087                                            .append( "SHORT"        ,"簡易メãƒ?‚»ージを作æ?しますã?" )
088                                            .append( "NONE"         ,"メãƒ?‚»ージを作æ?しませんã€? ) ;
089    
090            /**
091             * 表示メãƒ?‚»ージタイãƒ?属æ?としてæŒ?®šできる選択肢を定義しますã?
092             */
093            private static final EnumType<String> VIEW_MSGTYPE =
094                                    new EnumType<String>( "表示メãƒ?‚»ージタイãƒ? , "SHORT" )
095                                            .append( "LONG"         ,"詳細メãƒ?‚»ージを作æ?しますã?" )
096                                            .append( "MEDIUM"       ,"標準メãƒ?‚»ージを作æ?しますã?" )
097                                            .append( "SHORT"        ,"簡易メãƒ?‚»ージを作æ?しますã?" )
098                                            .append( "NONE"         ,"メãƒ?‚»ージを作æ?しませんã€? )
099                                            .append( "ALLNONE"      ,"何も出力しませんã€? )
100                                            .append( "TABLE"        ,"ãƒ??ブル形式でエラーメãƒ?‚»ージのみを表示しますã?" );
101    
102            private final String MAIL_SERVER = nval( HybsSystem.sys( "COMMON_MAIL_SERVER" ),null );
103            private final String MAIL_USERS  = nval( HybsSystem.sys( "ERROR_MAIL_TO_USERS" ),null ) ;
104            //       private final String FROM_USER  = nval( HybsSystem.sys( "MAIL_DAEMON_DEFAULT_USER" ),"ENGINE" )
105            //                                                                                      + "@"
106            //                                                                                      + nval( HybsSystem.sys( "ERROR_MAIL_TO_USERS" ),"DUMMY" ) ;
107            private final String FROM_USER   = nval( HybsSystem.sys( "ERROR_MAIL_FROM_USER" ),"ENGINE@DUMMY" ); // 4.4.0.1 (2009/08/08)
108    
109            private final String TITLE = "� + HybsSystem.sys( "SYSTEM_ID" ) + "�
110                                                                                             + HybsSystem.sys( "GUI_TOP_TITLE" ) + "Error!" ;
111    
112            private boolean useMail = true;
113            private String  logMsgType      = LOG_MSGTYPE.getDefault();
114            private String  viewMsgType     = VIEW_MSGTYPE.getDefault();
115    
116            private boolean skipPage        = false;        // 4.1.0.0 (2008/01/11)
117            private String          messageBody     = null;         // 4.1.0.0 (2008/01/11)
118    
119            /**
120             * Taglibの開始タグが見つかったときに処ç�?�™ã‚?doStartTag() ã‚?オーバã?ライドしますã?
121             *
122             * @og.rev 4.1.0.0 (2008/01/11) 新規作æ?
123             *
124             * @return      後続å?ç�??æŒ?¤º( EVAL_BODY_BUFFERED )
125             */
126            @Override
127            public int doStartTag() {
128                    return( EVAL_BODY_BUFFERED );   // Body を評価するã€? extends BodyTagSupport æ™?
129            }
130    
131            /**
132             * Taglibのタグ本体を処ç�?�™ã‚?doAfterBody() ã‚?オーバã?ライドしますã?
133             *
134             * @og.rev 4.1.0.0 (2008/01/11) 新規作æ?
135             *
136             * @return      後続å?ç�??æŒ?¤º(SKIP_BODY)
137             */
138            @Override
139            public int doAfterBody() {
140                    messageBody = getBodyString();
141                    return(SKIP_BODY);
142            }
143    
144            /**
145             * Taglibの終äº?‚¿グが見つかったときに処ç�?�™ã‚?doEndTag() ã‚?オーバã?ライドしますã?
146             *
147             * @og.rev 4.0.0.0 (2005/12/31) UserInfo が存在しなã�??合ã?処ç�?‚’追åŠ?�—ますã?
148             * @og.rev 4.1.0.0 (2008/01/11) ボディー部åˆ??メãƒ?‚»ージを表示するã€?
149             * @og.rev 5.0.0.4 (2009/08/28) ALLNONE追åŠ?
150             * @og.rev 5.1.8.0 (2010/07/01) ãƒ??ブル形式メãƒ?‚»ージ表示対å¿?
151             *
152             * @return      後続å?ç�??æŒ?¤º
153             */
154            @Override
155            public int doEndTag() {
156                    debugPrint();           // 4.0.0 (2005/02/28)
157    
158                    StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
159                    buf.append( HybsSystem.CR );
160                    buf.append( "Title :" ).append( TITLE ).append( HybsSystem.CR );
161                    buf.append( "Version :" ).append( BuildNumber.ENGINE_INFO ).append( HybsSystem.CR );
162    
163                    // 4.0.0 (2005/12/31) UserInfo が存在しなã�??合ã?処ç�?‚’追åŠ?�—ますã?
164                    String userId = null;
165                    try {
166                            UserInfo userInfo = getUser() ;
167                            userId = userInfo.getUserID();
168                            buf.append( "ID=[" ).append( userId );
169            //              buf.append( "] NAME=[" ).append( userInfo.getJname() );
170                            buf.append( "] LOGIN=[" ).append( HybsSystem.getDate( userInfo.getLoginTime() ) );
171                            buf.append( "]" );
172                    }
173                    catch( HybsSystemException ex ) {
174                            buf.append( "User is null" );
175                    }
176                    buf.append( HybsSystem.CR );
177    
178                    GUIInfo guiInfo = (GUIInfo)getSessionAttribute( HybsSystem.GUIINFO_KEY );
179                    buf.append( "GUI Information  : " );
180                    final String guiId ;
181                    if( guiInfo != null ) {
182                            guiInfo.addErrorCount();
183                            guiId = guiInfo.getKey();
184                            buf.append( "KEY=[" ).append( guiId );
185                            buf.append( "] LABEL=[" ).append( guiInfo.getLabel() );
186                            buf.append( "]" );
187                    }
188                    else {
189                            guiId = null ;
190                            buf.append( "GUI is null" );
191                    }
192                    buf.append( HybsSystem.CR );
193    
194                    Throwable th = pageContext.getException() ;
195                    if( th != null ) {
196                            buf.append( th.getMessage() ).append( HybsSystem.CR );
197                    }
198                    buf.append( "-----" ).append( HybsSystem.CR );
199    
200                    String errHeader = buf.toString();
201    
202                    // ログæƒ??出åŠ?
203                    String logMsg = getStackTrace( th ,logMsgType );
204    
205                    // 4.0.0 (2005/12/31) UserInfo が存在しなã�??合ã?処ç�?‚’追åŠ?�—ますã?
206                    LogSender log = new LogSender( userId );
207                    log.setGuiId( guiId );
208                    log.setMsgId( messageBody ); // 4.1.0.0 (2008/01/12)
209                    log.error( errHeader );
210                    log.error( logMsg );
211                    log.flush();
212    
213                    // メール送信
214                    if( useMail && MAIL_SERVER != null && MAIL_USERS != null ) {
215                            String[] to = StringUtil.csv2Array( MAIL_USERS );
216    
217                            MailTX tx = new MailTX( MAIL_SERVER );
218    //                      tx.setHost( MAIL_SERVER );
219                            tx.setFrom( FROM_USER );
220                            tx.setTo( to );
221                            tx.setSubject( TITLE );
222                            tx.setMessage( errHeader + logMsg );
223                            tx.sendmail();
224                    }
225    
226                    // 画面出åŠ?
227                    // 5.0.0.2 (2009/09/15) ALLNONE以外ã?み出åŠ?
228                    if( !"ALLNONE".equals( viewMsgType ) ) {
229                            final String viewMsg ;
230                            if( logMsgType.equals( viewMsgType ) ) {
231                                    viewMsg = errHeader + logMsg ;
232                            }
233                            // 5.1.8.0 (2010/07/01) ãƒ??ブル形式メãƒ?‚»ージ表示対å¿?
234                            else if( "TABLE".equals( viewMsgType ) ) {
235                                    viewMsg = getTableMsg( pageContext.getException() );
236                            }
237                            else {
238                                    viewMsg = errHeader + getStackTrace( pageContext.getException() ,viewMsgType );
239                            }
240                            jspPrint( viewMsg );
241                    }
242    
243    //              return(EVAL_PAGE);
244                    if( skipPage )  {
245                            return SKIP_PAGE;
246                    }
247                    else {
248                            return EVAL_PAGE;
249                    }
250            }
251    
252            /**
253             * タグリブオブジェクトをリリースしますã?
254             * キャãƒ?‚·ュされて再利用されるã?で、フィールドã?初期設定を行いますã?
255             *
256             */
257            @Override
258            protected void release2() {
259                    super.release2();
260                    useMail         = true;
261                    logMsgType      = LOG_MSGTYPE.getDefault();
262                    viewMsgType     = VIEW_MSGTYPE.getDefault();
263                    skipPage        = false; // 4.1.0.0 (2008/01/11)
264                    messageBody     = null; // 4.1.0.0 (2008/01/11)
265            }
266    
267            /**
268             * こã? Throwable オブジェクトã?詳細メãƒ?‚»ージæ–?­—å?を返しますã?
269             * こã?クラスは、発生å?の Throwable の StackTrace をã?例外チェーン機è?
270             * を利用して取得してã�?�¾すã?
271             * またã?"org.opengion." を含ã‚?‚¹タãƒ?‚¯トレースのみ、メãƒ?‚»ージとして追åŠ?�—ますã?
272             *
273             * @og.rev 5.0.0.2 (2009/09/15) ALLNONE追åŠ?
274             *
275             * @param    thr Throwableオブジェクãƒ?
276             * @param    type スタãƒ?‚¯トレースを行うタイãƒ?LONG|MEDIUM|SHORT|NONE)
277             *
278             * @return   メãƒ?‚»ージ
279             */
280            private String getStackTrace( final Throwable thr,final String type ) {
281                    // if( "NONE".equals( type ) ) { return ""; }
282                    if( "NONE".equals( type ) || "ALLNONE".equals( type ) ) { return ""; } // 5.0.0.2 (2009/09/15)
283    
284                    StringBuilder buf   = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
285                    StringBuilder trace = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
286    
287                    Throwable th = thr ;
288                    while( th != null ) {
289                            trace = getStackData( trace,th,type );
290    
291                            // 同じメãƒ?‚»ージがあれã?、登録しなã�??
292                            String msg = th.getMessage();
293                            if( msg != null && buf.indexOf( msg ) < 0 ) {
294                                    buf.append( msg ).append( HybsSystem.CR );
295                            }
296    
297                            th = th.getCause();
298                    }
299    
300                    buf.append( trace.toString() );
301                    buf.append( "------------------------------------------------------" ).append( HybsSystem.CR );
302    
303                    return buf.toString();
304            }
305    
306            /**
307             * タイプに応じたスタãƒ?‚¯トレースæƒ??ã‚?StringBuilder に追åŠ?�—て返しますã?
308             * スタãƒ?‚¯トレースæƒ??は、type がã?NONE では、作æ?しませんã€?
309             * SHORT の場合ã?、ä¸?•ªæœ??に現れた org.opengionパッケージのみを追åŠ?�—ますã?
310             *
311             * @og.rev 5.0.0.2 (2009/09/15) ALLNONE追åŠ?
312             *
313             * @param       buf     以前ã?エラーメãƒ?‚»ージ
314             * @param       th      スタãƒ?‚¯トレースを取りå?すThrowableオブジェクãƒ?
315             * @param       type    スタãƒ?‚¯トレースを行うタイãƒ?LONG|MEDIUM|SHORT|NONE)
316             *
317             * @return      メãƒ?‚»ージ
318             */
319            private StringBuilder getStackData( final StringBuilder buf,final Throwable th,final String type ) {
320                    // type がã?NONE は、引数の StringBuilder をそのまま返しますã?
321                    // if( "NONE".equals( type ) ) { return buf; }
322                    if( "NONE".equals( type ) || "ALLNONE".equals( type ) ) { return buf; } // 5.0.0.2 (2009/09/15)
323    
324                    String pkgKey = "org.opengion.";                // type="SHORT,MEDIUM" の初期値
325                    int    stcCnt = 5;                      // type="MEDIUM" の初期値
326    
327                    if( "LONG".equals( type ) ) {
328                            pkgKey = "";
329                            stcCnt = 100;
330                    }
331    
332                    if( "SHORT".equals( type ) ) {
333                            stcCnt = 0;
334                    }
335    
336                    if( th != null ) {
337                            int cnt = 0;
338                            StackTraceElement[] trace = th.getStackTrace();
339                            for( int i=0; i<trace.length; i++ ) {
340                                    String msg = trace[i].toString();
341                                    if( msg != null && buf.indexOf( msg ) < 0 ) {
342                                            if( msg.indexOf( pkgKey ) >= 0 ) {
343                                                    buf.append( "\tat " ).append( msg ).append( HybsSystem.CR );
344                                                    if( "SHORT".equals( type ) ) { break; }
345                                            }
346                                            else if( cnt++ < stcCnt ) {
347                                                    buf.append( "\tat " ).append( msg ).append( HybsSystem.CR );
348                                            }
349                            //              else if( cnt++ == stcCnt ) {
350                            //                      buf.append( "\t   ......" ).append( HybsSystem.CR );
351                            //              }
352                                    }
353                            }
354                            buf.append( "\t   ... more ..." ).append( HybsSystem.CR );
355                    }
356                    return buf;
357            }
358    
359            /**
360             * こã? Throwable オブジェクトã?エラーメãƒ?‚»ージæ–?­—å?をテーブル形式で返しますã?
361             * こã?形式では、スタãƒ?‚¯トレースなどは表示されずã?エラーメãƒ?‚»ージのみが表示されますã?
362             *
363             * @og.rev 5.1.8.0 (2010/07/01) ãƒ??ブル形式メãƒ?‚»ージ表示対å¿?
364             *
365             * @param    thr Throwableオブジェクãƒ?
366             *
367             * @return   メãƒ?‚»ージ
368             */
369            private String getTableMsg( final Throwable thr ) {
370                    StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
371                    Throwable th = thr;
372                    ErrorMessage errMsgObj = new ErrorMessage( "System Error!" );
373                    while( th != null ) {
374                            String msg = StringUtil.nval( th.getMessage(), "System Error(null)" );
375                            // 重è¤?ƒ¡ãƒ?‚»ージは登録しなã�??
376                            if( msg != null && buf.indexOf( msg ) < 0 ) {
377                                    buf.append( msg );
378    //                              // org.opengion.hayabusa.common.HybsSystemException: xxx のパッケージ部åˆ??除外すã‚?
379    //                              int pkgIdx = msg.indexOf( ':' );
380    //                              if( pkgIdx >= 0 && msg.length() > pkgIdx ) {
381    //                                      msg = msg.substring( pkgIdx + 1 );
382    //                              }
383                                    errMsgObj.addMessage( 0,ErrorMessage.NG,"SYSERR",msg );
384                            }
385                            th = th.getCause();
386                    }
387                    return TaglibUtil.makeHTMLErrorTable( errMsgObj, getResource() );
388            }
389    
390            /**
391             * 【TAG】メール送信可否を指定しまã�?初期値:true)ã€?
392             *
393             * @og.tag
394             * エラー発生時に管ç�??にメールをé?信するかどã�?�‹を指定しますã?
395             * メールは、シスãƒ?ƒ パラメータの COMMON_MAIL_SERVER に、ERROR_MAIL_TO_USERS に送信しますã?
396             * ERROR_MAIL_TO_USERS が未設定ã?場合ã?ã€??信しませんã€?
397             * 初期値は、true(送信する)ですã?
398             *
399             * @param       flag メール送信可否
400             */
401            public void setUseMail( final String flag ) {
402                    useMail = nval( getRequestParameter( flag ),useMail );
403            }
404    
405            /**
406             * 【TAG】ログに書き込ã‚?ƒ¡ãƒ?‚»ージの形式をæŒ?®?初期値:MEDIUM)ã€?
407             *
408             * @og.tag
409             * ログ、およã?、メール送信時ã?メãƒ?‚»ージの形式をæŒ?®šしますã?
410             * エラー時ã?Exceptionはã€?šŽ層構é?になっており、ルートまでさかのぼることã�?
411             * 可能ですã?またã?通常は、スタãƒ?‚¯とレースæƒ??より、エラーのプログラãƒ?‚’
412             * 特定することで、早く対応することが可能になりますã?
413             * メãƒ?‚»ージの形式には、LONG|MEDIUM|SHORT|NONE が指定できますã?
414             * ボディー部åˆ?�«記述されたメãƒ?‚»ージは全ての場合で出力されますã?
415             *
416             *   ・LONG  :すべてのスタãƒ?‚¯トレースæƒ??を取得しますã?
417             *   ・MEDIUM:org.opengion以下ã?パッケージのみスタãƒ?‚¯トレースæƒ??を取得しますã?
418             *   ・SHORT :メãƒ?‚»ージ部åˆ??みæƒ??を取得しますã?
419             *   ・NONE  :取得しませんã€?
420             *
421             * 初期値は、MEDIUM ですã?
422             *
423             * @param       logType ログに書き込ã‚?ƒ¡ãƒ?‚»ージの形å¼?[LONG|MEDIUM|SHORT|NONE]
424             * @see         #setViewMsgType( String )
425             */
426            public void setLogMsgType( final String logType ) {
427                    logMsgType = LOG_MSGTYPE.nval( logType );
428            }
429    
430            /**
431             * 【TAG】画面に書き込ã‚?ƒ¡ãƒ?‚»ージの形式をæŒ?®?初期値:MEDIUM)ã€?
432             *
433             * @og.tag
434             * 画面に表示するメãƒ?‚»ージの形式をæŒ?®šしますã?
435             * エラー時ã?Exceptionはã€?šŽ層構é?になっており、ルートまでさかのぼることã�?
436             * 可能ですã?またã?通常は、スタãƒ?‚¯とレースæƒ??より、エラーのプログラãƒ?‚’
437             * 特定することで、早く対応することが可能になりますã?
438             * メãƒ?‚»ージの形式には、LONG|MEDIUM|SHORT|NONE|ALLNONE|TABLE が指定できますã?
439             * ボディー部åˆ?�«記述されたメãƒ?‚»ージは全ての場合で出力されますã?
440             *
441             *   ・LONG   :すべてのスタãƒ?‚¯トレースæƒ??を取得しますã?
442             *   ・MEDIUM :org.opengion以下ã?パッケージのみスタãƒ?‚¯トレースæƒ??を取得しますã?
443             *   ・SHORT  :メãƒ?‚»ージ部åˆ??みæƒ??を取得しますã?
444             *   ・NONE   :取得しませんã€?
445             *   ・ALLNONE:ヘッãƒ?‚‚表示しませんã€?
446             *   ・TABLE  :ãƒ??ブル形式でエラーメãƒ?‚»ージのみを表示しますã?
447             *
448             * 初期値は、SHORT ですã?
449             *
450             * @param       viewType 画面に出力するメãƒ?‚»ージの形å¼?[LONG|MEDIUM|SHORT|NONE|ALLNONE|TABLE]
451             * @see         #setLogMsgType( String )
452             */
453            public void setViewMsgType( final String viewType ) {
454                    viewMsgType = VIEW_MSGTYPE.nval( viewType );
455            }
456    
457            /**
458             * 【TAG】エラーが発生した時に、以降ã?処ç�?‚’スキãƒ??するã�?初期値:false[=スキãƒ??しない])ã€?
459             *
460             * @og.tag
461             * エラーが発生した時に、以降ã?処ç�?‚’スキãƒ??するかを設定しますã?
462             * trueが設定された場合ã?、以降ã?処ç�?‚’スキãƒ??しますã?
463             *
464             * 初期値は、false(スキãƒ??しなã�? ですã?
465             *
466             * @param       flag 以降ã?処ç�??スキãƒ??するã�?
467             */
468            public void setSkipPage( final String flag ) {
469                    skipPage = nval( getRequestParameter( flag ),skipPage );
470            }
471    
472            /**
473             * ãƒ?ƒ�ãƒ?‚°時ã?æ–?­—å?を返しますã?
474             *
475             * @return      こã?オブジェクトã?ãƒ?ƒ�ãƒ?‚°表現æ–?­—å?
476             */
477            @Override
478            public String toString() {
479                    return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
480                                    .println( "VERSION"                                             ,VERSION        )
481                                    .println( "useMail"                                             ,useMail        )
482                                    .println( "logMsgType"                                  ,logMsgType     )
483                                    .println( "viewMsgType"                                 ,viewMsgType)
484                                    .println( "messageBody"                                 ,messageBody)
485                                    .println( "skipPage"                                    ,skipPage)
486                                    .println( "COMMON_MAIL_SERVER"                  ,MAIL_SERVER    )
487                                    .println( "ERROR_MAIL_TO_USERS"                 ,MAIL_USERS             )
488                                    .println( "MAIL_DAEMON_DEFAULT_USER"    ,FROM_USER              )
489                                    .println( "Other..."                                    ,getAttributes().getAttribute() )
490                                    .fixForm().toString() ;
491            }
492    }