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.resource.UserInfo;
019    import org.opengion.hayabusa.db.DBTableModel;
020    import org.opengion.hayabusa.db.Query;
021    import org.opengion.hayabusa.db.QueryFactory;
022    import org.opengion.fukurou.db.Transaction;
023    import org.opengion.fukurou.db.TransactionReal;
024    
025    import static org.opengion.fukurou.util.StringUtil.nval ;
026    
027    import java.util.Locale ;
028    import java.io.ObjectOutputStream;
029    import java.io.ObjectInputStream;
030    import java.io.IOException;
031    
032    /**
033     * ユーザーæƒ??を管ç�?�—てã�?‚‹タグですã?
034     *
035     * 設定したå?は、{@USER.XXXX} 形式で 取り出すことができますã?
036     * またã?command 属æ?で 直接画面に値を書きå?すことも可能ですã?
037     *
038     * 以下ã?値は UserInfo オブジェクトã?é ?›®から取得しますã?
039     * ・USER.JNAME     ユーザー日本語名称
040     * ・USER.ID        ユーザー?©?¤
041     * ・USER.IDNO      USER.ID が5Byte以上ã?時ã?み先é??‘文字を除ã�?�Ÿユーザー?©?¤
042     * ・USER.INFO      ユーザーæƒ??(ユーザーID?š日本語名称)
043     * ・USER.LANG      è¨?ª?
044     * ・USER.ROLES     ロール
045     * ・USER.IPADDRESS IPアドレス
046     * ・USER.LOGINTIME ログイン時刻
047     *
048     * 以下ã?値はあらかじめã?動的に作æ?されますã?
049     * ・USER.YMD       ?˜byte の今日のシスãƒ?ƒ 日ä»?
050     * ・USER.YMDH    ?‘4byte の今日のシスãƒ?ƒ 日æ™?
051     *
052     * それ以外ã?、外部より設定された値ですã?
053     *
054     * ※ こã?タグは、Transaction タグの対象ですã?
055     *
056     * @og.formSample
057     * ●形式ï¼?lt;og:userInfo command="[…]" key="[…]" value="[…]" />
058     * ●body?šあã‚?EVAL_BODY_BUFFERED:BODYを評価しã?{@XXXX} を解析しまã�?
059     *
060     * ●Tag定義??
061     *   <og:userInfo
062     *       command            【TAG】コマンãƒ?SET,GET,NVLGET,REMOVE,SQL)をセãƒ?ƒˆしまã�?初期値:SET)
063     *       key                【TAG】UserInfo に登録するキーをセãƒ?ƒˆしまã�?予ç´?ª?JNAME,ID,PASSWD,IDNO,INFO,LANG,ROLE,IPADDRESS,LOGINTIME)
064     *       value              【TAG】UserInfo に登録する値をセãƒ?ƒˆしまã�?
065     *       dbid               【TAGã€?通常は使ã�?�¾せん)Queryオブジェクトを作æ?する時ã?DB接続IDを指定しまã�?
066     *       save               【TAG】UserInfo に登録した値を永続化するかをæŒ?®šしまã�?
067     *       caseKey            【TAG】このタグ自体を利用するかどã�?�‹の条件キーを指定しまã�?初期値:null)
068     *       caseVal            【TAG】このタグ自体を利用するかどã�?�‹の条件値を指定しまã�?初期値:null)
069     *       caseNN             【TAG】指定ã?値がã?null/ゼロæ–?­—å? でなã�??å�?Not Null=NN)は、このタグは使用されまã�?初期値:true)
070     *       caseNull           【TAG】指定ã?値がã?null/ゼロæ–?­—å? の場合ã?、このタグは使用されまã�?初期値:true)
071     *       debug              【TAG】デバッグæƒ??をå?力するかどã�?�‹[true/false]を指定しまã�?初期値:false)
072     *   >   ... Body ...
073     *   </og:userInfo>
074     *
075     * ●使用ä¾?
076     *      <og:userInfo
077     *         command       = "コマンãƒ?SET,GET,NVLGET,REMOVE,SQL)をセãƒ?ƒˆしまã�?初期値:SET)ã€?quot;
078     *         key           = "UserInfo に登録するキーをセãƒ?ƒˆしまã�?予ç´?ª?JNAME,ID,PASSWD,IDNO,INFO,LANG,ROLE,IPADDRESS,LOGINTIME)ã€?quot;
079     *         value         = "UserInfo に登録する値をセãƒ?ƒˆしますã?"
080     *         dbid          = "(通常は使ã�?�¾せん)Queryオブジェクトを作æ?する時ã?DB接続IDを指定しますã?"
081     *      >
082     *
083     * @og.group そã?他部å“?
084     *
085     * @version  4.0
086     * @author   Kazuhiko Hasegawa
087     * @since    JDK5.0,
088     */
089    public class UserInfoTag extends CommonTagSupport {
090            //* こã?プログラãƒ??VERSIONæ–?­—å?を設定しますã?       {@value} */
091            private static final String VERSION = "5.3.8.0 (2011/08/01)" ;
092    
093            private static final long serialVersionUID = 538020110801L ;
094    
095            /** command 引数に渡す事ã?出来ã‚?コマンãƒ? セãƒ?ƒˆ {@value} */
096            public static final String CMD_SET   = "SET" ;
097            /** command 引数に渡す事ã?出来ã‚?コマンãƒ? ゲãƒ?ƒˆ {@value} */
098            public static final String CMD_GET   = "GET" ;
099            /** command 引数に渡す事ã?出来ã‚?コマンãƒ? ゲãƒ?ƒˆ {@value} */
100            public static final String CMD_REMOVE   = "REMOVE" ;
101            /** command 引数に渡す事ã?出来ã‚?コマンãƒ? ゲãƒ?ƒˆ {@value} */
102            public static final String CMD_SQL   = "SQL" ;
103            // 3.5.5.3 (2004/04/09) 値ã�?null の場合ã?ã€?"(ゼロæ–?­—å?)を返すNVLGETを採用
104            /** command 引数に渡す事ã?出来ã‚?コマンãƒ? NVLゲãƒ?ƒˆ {@value} */
105            public static final String CMD_NVLGET   = "NVLGET" ;
106    
107            // 3.5.5.3 (2004/04/09) 値ã�?null の場合ã?ã€?"(ゼロæ–?­—å?)を返すNVLGETを採用
108            /** command 引数に渡す事ã?出来ã‚?コマンãƒ?リスãƒ? */
109            private static final String[] COMMAND_LIST = new String[] {
110                    CMD_SET , CMD_GET , CMD_NVLGET , CMD_REMOVE , CMD_SQL };
111    
112            // 3.5.6.0 (2004/06/18) すべてã‚?protected から private に変更しますã?
113            private String                  command         = CMD_SET;
114            private String                  key                     = null;
115            private String                  value           = null;
116    //      private boolean                 isNullSet       = true;                 // NULL のときにセãƒ?ƒˆし直すかどã�?�‹ã€?
117            private transient DBTableModel  table           = null;
118            // 4.0.0.0 (2007/10/10) dbid の初期値をã?"DEFAULT" から null に変更
119    //      private String                  dbid            = "DEFAULT";
120            private String                  dbid            = null;
121            private String                  sql                     = null;
122            // 4.3.4.0 (2008/12/01) save属æ?追åŠ?
123            private boolean                 save            = false;
124    
125            /**
126             * Taglibの開始タグが見つかったときに処ç�?�™ã‚?doStartTag() ã‚?オーバã?ライドしますã?
127             *
128             * @og.rev 5.2.2.0 (2010/11/01) caseKey 、caseVal 属æ?対å¿?
129             *
130             * @return      後続å?ç�??æŒ?¤º
131             */
132            @Override
133            public int doStartTag() {
134                    // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属æ?対å¿?
135    //              if( CMD_SQL.equals( command ) ) {
136                    if( useTag() && CMD_SQL.equals( command ) ) {
137                            return( EVAL_BODY_BUFFERED );           // Body を評価する
138                    }
139                    else {
140                            return( SKIP_BODY ); // Body を評価しなã�?
141                    }
142            }
143    
144            /**
145             * Taglibのタグ本体を処ç�?�™ã‚?doAfterBody() ã‚?オーバã?ライドしますã?
146             *
147             * @og.rev 3.1.1.0 (2003/03/28) ボディのå†?®¹を取得するå?ç�?‚’、CommonTagSupport で行うã€?
148             * @og.rev 3.6.0.8 (2004/11/19) エラー発生時に確実にリリースされるよã�?�« try finally 追åŠ?
149             * @og.rev 3.8.6.3 (2006/11/30) SQL æ–??前後ã?スペã?スを取り除きますã?
150             * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得ã?為,ApplicationInfoオブジェクトを設å®?
151             * @og.rev 4.0.0.0 (2005/01/31) lang â‡?ResourceManager へ変更
152             * @og.rev 5.1.9.0 (2010/08/01) TransactionTag 対応ã?上位に TransactionTag があれã?、そこからConnection をもらうã€?
153             * @og.rev 5.3.7.0 (2011/07/01) TransactionReal の引数変更
154             * @og.rev 5.3.8.0 (2011/08/01) Transaction発生ç®?‰€でclose()
155             *
156             * @return      後続å?ç�??æŒ?¤º(SKIP_BODY)
157             */
158            @Override
159            public int doAfterBody() {
160                    sql = getBodyString().trim();
161    
162                    Query query = QueryFactory.newInstance();               // 4.0.0 (2005/01/31)
163                    Transaction tran = null;
164                    try {
165                            // 5.1.9.0 (2010/08/01) TransactionTag 対å¿?
166    //                      final Transaction tran ;
167                            TransactionTag tranTag = (TransactionTag)findAncestorWithClass( this,TransactionTag.class );
168                            if( tranTag == null ) {
169    //                              tran = new TransactionReal( dbid,getApplicationInfo() );
170                                    tran = new TransactionReal( getApplicationInfo() );             // 5.3.7.0 (2011/07/01) 引数変更
171                            }
172                            else {
173                                    tran = tranTag.getTransaction();
174                            }
175                            query.setTransaction( dbid,tran );      // 5.1.9.0 (2010/08/01) TransactionTag 対å¿?
176    
177    //                      query.setConnectionID( dbid );
178                            query.setResourceManager( getResource() );      // 4.0.0 (2005/01/31)
179    
180                            query.setStatement( sql );
181    //                      query.setApplicationInfo( getApplicationInfo() );       // 3.8.7.0 (2006/12/15)
182                            query.execute();
183    
184                            table = query.getDBTableModel();
185                    }
186                    finally {
187    //                      if( query != null ) { query.close(); }
188                            QueryFactory.close( query );
189                            if( tran != null ) { tran.close(); }            // 5.3.8.0 (2011/08/01) Transaction発生ç®?‰€でclose()
190                    }
191                    return(SKIP_BODY);
192            }
193    
194            /**
195             * Taglibの終äº?‚¿グが見つかったときに処ç�?�™ã‚?doEndTag() ã‚?オーバã?ライドしますã?
196             *
197             * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応ã?release2() ã‚?doEndTag()で呼ぶã€?
198             * @og.rev 3.5.5.3 (2004/04/09) 値ã�?null の場合ã?ã€?"(ゼロæ–?­—å?)を返すフラグを採用
199             * @og.rev 5.2.2.0 (2010/11/01) caseKey 、caseVal 属æ?対å¿?
200             *
201             * @return      後続å?ç�??æŒ?¤º
202             */
203            @Override
204            public int doEndTag() {
205                    debugPrint();           // 4.0.0 (2005/02/28)
206                    // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属æ?対å¿?
207    //              if( check( command, COMMAND_LIST ) ) {
208                    if( useTag() && check( command, COMMAND_LIST ) ) {
209                            commandExec( command );
210    
211                            if( CMD_GET.equals( command ) ) {
212                                    jspPrint( value );
213                            }
214                            else if( CMD_NVLGET.equals( command ) ) {       // 3.5.5.3 (2004/04/09)
215                                    jspPrint( nval(value,"") );
216                            }
217                    }
218    
219                    return(EVAL_PAGE);
220            }
221    
222            /**
223             * タグリブオブジェクトをリリースしますã?
224             * キャãƒ?‚·ュされて再利用されるã?で、フィールドã?初期設定を行いますã?
225             *
226             * @og.rev 2.0.0.4 (2002/09/27) カスタãƒ?‚¿グの release() メソãƒ?ƒ‰をã?追åŠ?
227             * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応ã?release2() ã‚?doEndTag()で呼ぶã€?
228             * @og.rev 4.0.0.0 (2007/10/10) dbid の初期値をã?"DEFAULT" から null に変更
229             * @og.rev 4.3.4.0 (2008/12/01) save属æ?対å¿?
230             *
231             */
232            @Override
233            protected void release2() {
234                    super.release2();
235                    command         = CMD_SET;
236                    key                     = null;
237                    value           = null;
238    //              isNullSet       = true;                 // NULL のときにセãƒ?ƒˆし直すかどã�?�‹ã€?
239                    table           = null;
240    //              dbid            = "DEFAULT";
241                    dbid            = null;
242                    sql                     = null;
243                    save            = false;
244            }
245    
246            /**
247             * コマンドを実行しますã?
248             *
249             * コマンドã?,HTMLから(get/post)æŒ?®šされますã?で,setCommand()メソãƒ?ƒ‰で
250             * 登録しますã?
251             * コマンドを登録すると同時に,実行も行なã�?�¾すã?
252             *
253             * @og.rev 3.5.5.3 (2004/04/09) 値ã�?null の場合ã?ã€?"(ゼロæ–?­—å?)を返すフラグを採用
254             *
255             * @param   command コマンãƒ?public static final 宣è¨?�•れてã�?‚‹æ–?­—å?)
256             * @see         <a href="../../../../constant-values.html#org.opengion.hayabusa.taglib.UserInfoTag.CMD_GET">コマンド定数</a>
257             */
258            protected void commandExec( final String command ) {
259                    if( CMD_SQL.equals( command ) ) { setSQLAttribute() ; }
260                    else if( CMD_SET.equals(    command ) ) { setAttribute() ;    }
261                    else if( CMD_GET.equals(    command ) ) { getAttribute() ;    }
262                    else if( CMD_NVLGET.equals( command ) ) { getAttribute() ;    } // 3.5.5.3 (2004/04/09)
263                    else if( CMD_REMOVE.equals( command ) ) { removeAttribute() ; }
264            }
265    
266            /**
267             * UserInfoのæ–?­—å?を登録しますã?
268             *
269             * @og.rev 4.3.4.0 (2008/12/01) GE20(ユーザー定数)へ登録するかã?フラグを追åŠ?
270             *
271             */
272            private void setAttribute() {
273    //              if( isNullSet ) {
274    //                      setUserInfo( key, value );
275                            setUserInfo( key, value, save );
276    //              }
277            }
278    
279            /**
280             * UserInfoのæ–?­—å?を作æ?しますã?
281             *
282             */
283            private void getAttribute() {
284                    value = getUserInfo( key );
285            }
286    
287            /**
288             * UserInfoのæ–?­—å?を削除しますã?
289             *
290             * @og.rev 5.3.6.0 (2011/06/01) GE20(ユーザー定数)から削除するかã?フラグを追åŠ?
291             */
292            private void removeAttribute() {
293                    UserInfo userInfo = getUser();
294    //              userInfo.removeAttribute( key );
295                    userInfo.removeAttribute( key, save );
296            }
297    
298            /**
299             * UserInfoのæ–?­—å?を指定ã?SQLæ–?‚ˆり作æ?しますã?
300             *
301             * @og.rev 4.3.4.0 (2008/12/01) GE20(ユーザー定数)へ登録するかã?フラグを追åŠ?
302             *
303             */
304            private void setSQLAttribute() {
305                    if( table == null || table.getRowCount() == 0 ) { return ; }
306    
307                    int row    = 0;
308                    int clmCnt = table.getColumnCount();
309                    for( int clm=0; clm<clmCnt; clm++ ) {
310                            String clmkey = table.getColumnName( clm );
311                            String clmval = table.getValue( row,clm );
312    //                      setUserInfo( clmkey,clmval );
313                            setUserInfo( clmkey, clmval, save );
314                    }
315            }
316    
317            /**
318             * 【TAG】コマンãƒ?SET,GET,NVLGET,REMOVE,SQL)をセãƒ?ƒˆしまã�?初期値:SET)ã€?
319             *
320             * @og.tag
321             * コマンドã?,HTMLから(get/post)æŒ?®šされますã?で,CMD_xxx で設定される
322             * フィールド定数値のã�?�šれかをã?æŒ?®šできますã?
323             * 何も設定されなã�??またã?、null の場合ã?ã€?SET" がå?期å?にセãƒ?ƒˆされますã?
324             * SQL の場合ã?検索結果の戻りå?がè¤?•°存在する場合ã?、最初ã??‘件目のみ使用しますã?
325             *
326             * @param       cmd コマンãƒ?public static final 宣è¨?�•れてã�?‚‹æ–?­—å?)
327             * @see         <a href="../../../../constant-values.html#org.opengion.hayabusa.taglib.UserInfoTag.CMD_SET">コマンド定数</a>
328             */
329            public void setCommand( final String cmd ) {
330                    String cmd2 = getRequestParameter( cmd );
331                    if( cmd2 != null && cmd2.length() > 0 ) { command = cmd2.toUpperCase(Locale.JAPAN); }
332            }
333    
334            /**
335             * 【TAG】UserInfo に登録するキーをセãƒ?ƒˆしまã�?予ç´?ª?JNAME,ID,PASSWD,IDNO,INFO,LANG,ROLE,IPADDRESS,LOGINTIME)ã€?
336             *
337             * @og.tag UserInfo に登録するキーをセãƒ?ƒˆしますã?
338             *
339             * @param       inkey UserInfo に登録するキー
340             */
341            public void setKey( final String inkey ) {
342                    key = getRequestParameter( inkey ).toUpperCase(Locale.JAPAN);
343                    if( key.startsWith( "USER." ) ) {
344                            key = key.substring( 5 );
345                    }
346            }
347    
348            /**
349             * 【TAG】UserInfo に登録する値をセãƒ?ƒˆしますã?
350             *
351             * @og.tag UserInfo に登録する値をセãƒ?ƒˆしますã?
352             *
353             * @param       val     UserInfoに登録する値
354             */
355            public void setValue( final String val ) {
356                    value = getRequestParameter( val );
357            }
358    
359            /**
360             * 【TAG】UserInfo に登録した値を永続化するかをæŒ?®šしますã?
361             *
362             * @og.tag
363             * UserInfo に登録した値を永続化するかをæŒ?®šしますã?
364             * trueが指定された場合ã?UserInfoに設定された値は、GE20(ユーザー定数)に保存されã?
365             * UserInfoがå?作æ?されるタイミングで自動的に復å…?�•れますã?
366             * ここで、登録されたå?は、そのユーザーの全てのロールに対して有効となりますã?
367             * 初期値は、false(永続化しなã�?ですã?
368             *
369             * @param       sv      登録値を永続化するã�?
370             */
371            public void setSave( final String sv ) {
372                    save = nval( getRequestParameter( sv ),save );
373            }
374    
375    //      /**
376    //       * 【å»?­¢】Query を実行して、value に値をセãƒ?ƒˆするかどã�?�‹を指定しますã?
377    //       *
378    //       * @og.tag
379    //       * 初期値は、実行しなã�?("false")
380    //       *
381    //       * @og.rev 3.1.0.1 (2003/03/26) query 属æ?を非推奨属æ?としますã?å†?ƒ¨では使用しませんã€?
382    //       *
383    //       * @param   flag Query を実行すã‚?("true")?�実行しなã�?それ以å¤?
384    //       * @deprecated
385    //       */
386    //      @Deprecated public void setQuery( final String flag ) {
387    //              // ここでは処ç�?‚’行いませんã€?
388    //      }
389    
390    //      /**
391    //       * 【å»?­¢】value ã�?NULL の時に、設定するかどã�?�‹[true/false]を指定しまã�?初期値:true)ã€?
392    //       *
393    //       * @og.tag
394    //       * true の場合ã?, null のときでもセãƒ?ƒˆしますã?
395    //       * false の場合ã?, null のときã?、既存ã?値を置き換えませんã€?
396    //       * 初期値は、null のときでもセãƒ?ƒˆするですã? ("true")
397    //       *
398    //       * @param   flag NULL の時に、設定すã‚?("true")?�設定しなã�?それ以å¤?
399    //       * @deprecated
400    //       */
401    //      @Deprecated public void setNullSet( final String flag ) {
402    //              isNullSet = nval( getRequestParameter( flag ),isNullSet );
403    //      }
404    
405            /**
406             * 【TAGã€?通常は使ã�?�¾せん)Queryオブジェクトを作æ?する時ã?DB接続IDを指定しますã?
407             *
408             * @og.tag Queryオブジェクトを作æ?する時ã?DB接続IDを指定しますã?
409             *
410             * @param       id ãƒ??タベã?ス接続ID
411             */
412            public void setDbid( final String id ) {
413                    dbid = nval( getRequestParameter( id ),dbid );
414            }
415    
416            /**
417             * シリアライズ用のカスタãƒ?‚·リアライズ書き込みメソãƒ?ƒ‰
418             *
419             * @og.rev 4.0.0.0 (2006/09/31) 新規追åŠ?
420             * @serialData ä¸?ƒ¨のオブジェクトã?、シリアライズされませんã€?
421             *
422             * @param       strm    ObjectOutputStreamオブジェクãƒ?
423             * @throws IOException  入出力エラーが発生したå?å�?
424             */
425            private void writeObject( final ObjectOutputStream strm ) throws IOException {
426                    strm.defaultWriteObject();
427            }
428    
429            /**
430             * シリアライズ用のカスタãƒ?‚·リアライズ読み込みメソãƒ?ƒ‰
431             *
432             * ここでは、transient 宣è¨?�•れたå†?ƒ¨変数のå†??初期化がå¿?¦�なフィールドã?み設定しますã?
433             *
434             * @og.rev 4.0.0.0 (2006/09/31) 新規追åŠ?
435             * @serialData ä¸?ƒ¨のオブジェクトã?、シリアライズされませんã€?
436             *
437             * @param       strm    ObjectInputStreamオブジェクãƒ?
438             * @see #release2()
439             * @throws IOException  シリアライズに関する入出力エラーが発生したå?å�?
440             * @throws ClassNotFoundException       クラスを見つけることができなかったå?å�?
441             */
442            private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException {
443                    strm.defaultReadObject();
444            }
445    
446            /**
447             * こã?オブジェクトã?æ–?­—å?表現を返しますã?
448             * 基本çš?�«ãƒ?ƒ�ãƒ?‚°目çš?�«使用しますã?
449             *
450             * @return こã?クラスのæ–?­—å?表現
451             */
452            @Override
453            public String toString() {
454                    return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
455                                    .println( "VERSION"                     ,VERSION        )
456                                    .println( "command"                     ,command        )
457                                    .println( "key"                         ,key            )
458                                    .println( "value"                       ,value          )
459    //                              .println( "isNullSet"           ,isNullSet      )
460                                    .println( "dbid"                        ,dbid           )
461                                    .println( "sql"                         ,sql            )
462                                    .println( "save"                        ,save           )
463                                    .println( "COMMAND_LIST"        ,COMMAND_LIST   )
464                                    .println( "Other..."    ,getAttributes().getAttribute() )
465                                    .fixForm().toString() ;
466            }
467    }