    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.taglib;
    017
    018import org.opengion.hayabusa.common.HybsSystem;
    019import org.opengion.hayabusa.common.HybsSystemException;
    020import org.opengion.hayabusa.db.DBTableModel;
    021import org.opengion.hayabusa.db.DBColumn;
    022import org.opengion.hayabusa.db.DBTableModelUtil;
    023import org.opengion.hayabusa.resource.LDAPSearch;
    024
    025import org.opengion.fukurou.util.ErrorMessage;
    026import org.opengion.fukurou.util.StringUtil ;
    027import static org.opengion.fukurou.util.StringUtil.nval ;
    028
    029import java.util.List;
    030import java.util.Locale;
    031
    032/**
    033 * LDAPの内容を検索するための、ldapQueryタグです。
    034 *
    035 * 検索した結果は、DBTableModel にセットされるため、
    036 * JDBCQuery と同様に、viewタグで表示させることが可能です。
    037 *
    038 * 下記の項目については、src/resource/システムパラメータ に、予め
    039 * 設定しておくことで、タグごとに指定する必要がなくなります。
    040 * ・LDAP_INITIAL_CONTEXT_FACTORY
    041 * ・LDAP_PROVIDER_URL
    042 * ・LDAP_ENTRYDN
    043 * ・LDAP_SEARCH_BASE
    044 * ・LDAP_SEARCH_SCOPE
    045 *
    046 * このタグリブでは、検索のみサポートしています。
    047 *
    048 * @og.formSample
    049 * ●形式：
    050 *     &lt;og:ldapQuery  debug=&quot;false&quot;
    051 *         command     = &quot;NEW&quot;                                       NEW,RENEW が使用可能です。
    052 *         initctx     = &quot;com.sun.jndi.ldap.LdapCtxFactory&quot;          初期コンテキストファクトリ
    053 *         providerURL = &quot;ldap://ldap.opengion.org:389&quot;              サービスプロバイダの構成情報
    054 *         entrydn     = &quot;cn=inquiry-sys,o=opengion,c=JP&quot;            属性の取得元のオブジェクトの名前
    055 *         password    = &quot;xxxxxx&quot;                                    属性の取得元のオブジェクトのパスワード
    056 *         searchbase  = &quot;soouid=employeeuser,o=opengion,c=JP&quot;       検索するコンテキストまたはオブジェクトのベース名
    057 *         filter      = &quot;(objectClass=person)&quot;                      検索に使用するフィルタ式。null は不可
    058 *         attributes  = &quot;uid,cn,officeName,ou,mail,belongOUID&quot;      属性を識別する属性 IDをカンマ区切りで指定
    059 *         searchScope = &quot;SUBTREE&quot;                                   検索範囲を設定(『OBJECT』『ONELEVEL』『SUBTREE』のどれか)
    060 *         maxRowCount = &quot;0&quot;                                         検索時の最大検索数(0は、無制限：デフォルト)
    061 *     /&gt;
    062 * ●body：なし
    063 *
    064 * ●Tag定義：
    065 *   &lt;og:ldapQuery
    066 *       initctx            【TAG】初期コンテキストファクトリを指定します (初期値:LDAP_INITIAL_CONTEXT_FACTORY[=com.sun.jndi.ldap.LdapCtxFactory])
    067 *       providerURL        【TAG】サービスプロバイダの構成情報を指定します (初期値:LDAP_PROVIDER_URL[=ldap://ldap.opengion.org:389])
    068 *       entrydn            【TAG】属性の取得元のオブジェクトの名前を設定します (初期値:LDAP_ENTRYDN[=cn=inquiry-sys,o=opengion,c=JP])
    069 *       password           【TAG】属性の取得元のオブジェクトのパスワードを設定します (初期値:LDAP_PASSWORD[=password])
    070 *       searchbase         【TAG】検索するコンテキストまたはオブジェクトの名前を設定します (初期値:LDAP_SEARCH_BASE[=soouid=employeeuser,o=opengion,c=JP])
    071 *       filter           ○【TAG】検索に使用するフィルタ式(例：belongOUID=61200)(必須)。
    072 *       searchScope        【TAG】検索範囲(OBJECT/ONELEVEL/SUBTREE)を設定します (初期値:LDAP_SEARCH_SCOPE[=SUBTREE])
    073 *       timeLimit          【TAG】これらの SearchControls の時間制限をミリ秒単位で設定します(初期値:0[無制限])
    074 *       derefLinkFlag      【TAG】検索中のリンクへの間接参照を有効または無効[true/false]にします(初期値:false)
    075 *       maxRowCount        【TAG】レジストリの最大検索件数をセットします(初期値:0[無制限])
    076 *       returningObjFlag   【TAG】結果の一部としてオブジェクトを返すことを有効または無効[true/false]にします(初期値:false)
    077 *       attributes         【TAG】検索の一部として返される属性をCSVで複数指定します
    078 *       columns            【TAG】作成する DBTableModel のカラム名をCSV形式で指定します
    079 *       orderBy            【TAG】検索した結果を表示する表示順をファイル属性名で指定します
    080 *       tableId            【TAG】(通常は使いません)結果をDBTableModelに書き込んで、sessionに登録するときのキーを指定します
    081 *       command            【TAG】コマンド(NEW,RENEW)をセットします(初期値:NEW)
    082 *       displayMsg         【TAG】検索結果を画面上に表示するメッセージリソースIDを指定します(初期値は検索件数)
    083 *       notfoundMsg        【TAG】検索結果がゼロ件の場合に表示するメッセージリソースIDを指定します(初期値:MSG0077[対象データはありませんでした])
    084 *       overflowMsg        【TAG】オーバーフロー時に画面上に表示するメッセージIDを指定します(初期値:MSG0007)
    085 *       scope              【TAG】キャッシュする場合のスコープ[request/page/session/applicaton]を指定します(初期値:session)
    086 *       mainTrans          【TAG】(通常使いません)タグで処理される処理がメインとなるトランザクション処理かどうかを指定します(初期値:false)
    087 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
    088 *   /&gt;
    089 *
    090 * ●使用例
    091 *     システムパラメータ に、必要なLDAP定数を定義しておいた場合は、下記のタグで検索できます。
    092 *     例では、filter にあいまい検索(*)とAND条件(&amp;(条件A)(条件B)) を指定した例を挙げておきます。
    093 *     filter の形式と解釈は、RFC 2254 に準拠しています。
    094 *     (RFC 2254 で定義されている演算子のすべてをすべての属性に適用できるわけではありません。)
    095 *
    096 *      &lt;og:ldapQuery  debug=&quot;false&quot;
    097 *          command     = &quot;NEW&quot;
    098 *          filter      = &quot;(&amp;(cnphoneticlangjp=OPENGION*)(businessName=*COMMON*))&quot;
    099 *          attributes  = &quot;uid,cn,officeName,ou,mail,belongOUID&quot;
    100 *      /&gt;
    101 *
    102 *    ・queryOption タグの内部に記述すれば、プルダウンメニューを作成することが可能です。
    103 *    &lt;og:select name="UID"&gt;
    104 *        &lt;og:queryOption&gt;
    105 *            &lt;og:ldapQuery
    106 *                filter      = "(&amp;amp;(|(belongOUID=60000)(belongOUID=70000))(uid=C*))"
    107 *                attributes  = "uid,uid,sn"
    108 *                orderBy     = "uid"
    109 *            /&gt;
    110 *        &lt;/og:queryOption&gt;
    111 *    &lt;/og:select&gt;
    112 *
    113 * @og.rev 3.1.0.0 (2003/03/20) ＬＤＡＰにアクセスできる、LDAPQueryTag.java を新規に作成。
    114 * @og.group その他入力
    115 *
    116 * @version  4.0
    117 * @author       Kazuhiko Hasegawa
    118 * @since    JDK5.0,
    119 */
    120public class LDAPQueryTag extends CommonTagSupport {
    121        //* このプログラムのVERSION文字列を設定します。   {@value} */
    122        private static final String VERSION = "5.1.6.0 (2010/05/01)" ;
    123
    124        private static final long serialVersionUID = 516020100501L ;
    125
    126        /** command 引数に渡す事の出来る コマンド  新規 {@value} */
    127        public static final String CMD_NEW       = "NEW" ;
    128        /** command 引数に渡す事の出来る コマンド  再検索 {@value} */
    129        public static final String CMD_RENEW = "RENEW" ;
    130        /** command 引数に渡す事の出来る コマンド リスト  */
    131        private static final String[] COMMAND_LIST = new String[] { CMD_NEW , CMD_RENEW };
    132
    133        private String                  initctx                         = HybsSystem.sys( "LDAP_INITIAL_CONTEXT_FACTORY" );
    134        private String                  providerURL             = HybsSystem.sys( "LDAP_PROVIDER_URL" );
    135        private String                  entrydn                         = HybsSystem.sys( "LDAP_ENTRYDN" );
    136        private String                  password                        = HybsSystem.sys( "LDAP_PASSWORD" );            // 4.2.2.0 (2008/05/10)
    137        private String                  searchbase                      = HybsSystem.sys( "LDAP_SEARCH_BASE" );
    138        private String                  filter                          = null;         // "employeeNumber=87019";
    139
    140        // 検索範囲。OBJECT_SCOPE、ONELEVEL_SCOPE、SUBTREE_SCOPE のどれか 1 つ
    141        private String                  searchScope                     = HybsSystem.sys( "LDAP_SEARCH_SCOPE" );
    142        private static final long       COUNTLIMIT              = 0;                    // 返すエントリの最大数。0 の場合、フィルタを満たすエントリをすべて返す
    143        private int                             timeLimit                       = 0;                    // 結果が返されるまでのミリ秒数。0 の場合、無制限
    144        private String[]                attrs                           = null;                 // エントリと一緒に返される属性の識別子。null の場合、すべての属性を返す。空の場合、属性を返さない
    145        private String[]                columns                         = null;                 // DBTableModel を作成する場合のカラム名になります。null の場合は、attributes 属性
    146        private boolean                 returningObjFlag        = false;                // true の場合、エントリの名前にバインドされたオブジェクトを返す。false 場合、オブジェクトを返さない
    147        private boolean                 derefLinkFlag           = false;                // true の場合、検索中にリンクを間接参照する
    148
    149        private String                  tableId                         = HybsSystem.TBL_MDL_KEY;       // sessionｷｰ
    150        private String                  orderBy                         = null;                                         // ｿｰﾄ項目(csv)
    151        private String                  command                         = CMD_NEW;                                      // ｺﾏﾝﾄﾞ
    152        private int                             executeCount            = 0;                                            // 検索/実行件数
    153        private int                             errCode                         = ErrorMessage.OK;                      // Ver4.3.1.1 (2008/09/05) 検索エラーコード
    154        private int                     maxRowCount                     = 0;                    // 最大検索数(0は無制限)
    155        private String                  displayMsg                      = HybsSystem.sys( "VIEW_DISPLAY_MSG" );
    156        private String                  overflowMsg             = "MSG0007";    // 検索結果が、制限行数を超えましたので、残りはカットされました。
    157        private String                  notfoundMsg                     = "MSG0077";    // 対象データはありませんでした。
    158        private boolean                 isMainTrans                     = true;                 // 5.1.6.0 (2010/05/01) DBLastSqlの処理の見直し
    159
    160        /**
    161         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
    162         *
    163         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
    164         * @og.rev 3.6.0.8 (2004/11/19) DBTableModel をセーブする時に、トランザクションチェックを行います。
    165         * @og.rev 4.0.0.0 (2007/10/18) メッセージリソース統合( getResource().getMessage ⇒ getResource().getLabel )
    166         * @og.rev 4.3.1.1 (2008/09/03) 検索結果の件数、状況コードをリクエスト変数 "DB.COUNT"、"DB.ERR_CODE" にセットする。
    167         * @og.rev 5.1.6.0 (2010/05/01) DBLastSqlの処理は、DBTableModelが新規作成された処理でのみ行う。
    168         *
    169         * @return      後続処理の指示
    170         */
    171        @Override
    172        public int doEndTag() {
    173                debugPrint();           // 4.0.0 (2005/02/28)
    174
    175                // QueryOptionTag の内部で記述された場合の処理。
    176                QueryOptionTag queryOption = (QueryOptionTag)findAncestorWithClass( this,QueryOptionTag.class );
    177                if( queryOption != null ) {
    178                        queryOption.setTableModel( makeDBTable() );
    179                        return EVAL_PAGE ;
    180                }
    181
    182                // 通常の LDAPQuery 処理
    183                if( check( command, COMMAND_LIST ) ) {
    184                        useMainTrans( isMainTrans );                    // 5.1.6.0 (2010/05/01) DBLastSqlの処理の見直し
    185                        startQueryTransaction( tableId );               // 3.6.0.8 (2004/11/19)
    186
    187                        DBTableModel table = makeDBTable();
    188
    189                        // 3.6.0.8 (2004/11/19) トランザクションチェックを行います。
    190                        if( ! commitTableObject( tableId, table ) ) {
    191                                jspPrint( "LDAPQueryTag Query処理が割り込まれました。DBTableModel は登録しません。" );
    192                                return SKIP_PAGE ;
    193                        }
    194                        StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_SMALL );
    195
    196                        // 実行件数の表示 command="NEW" のときのみ、displayMsg を表示させます。
    197                        // 4.0.0 (2005/11/30) 出力順の変更。一番最初に出力します。
    198                        if( CMD_NEW.equals( command ) ) {
    199                                if( executeCount > 0 && displayMsg != null && displayMsg.length() > 0 ) {
    200                                        buf.append( executeCount );
    201                                        buf.append( getResource().getLabel( displayMsg ) );
    202                                        buf.append( HybsSystem.BR );
    203                                }
    204                                else if( executeCount == 0 && notfoundMsg != null && notfoundMsg.length() > 0 ) {
    205                                        buf.append( getResource().getLabel( notfoundMsg ) );
    206                                        buf.append( HybsSystem.BR );
    207                                }
    208                        }
    209
    210                        if( maxRowCount > 0 && maxRowCount <= executeCount ) {
    211                                buf.append( getResource().getLabel( overflowMsg ) );
    212                                buf.append( HybsSystem.BR ).append( HybsSystem.CR );
    213                        }
    214                        // 4.3.1.1 (2008/09/03) 検索結果の件数、エラーコードをセットする。
    215                        setRequestAttribute( "DB.COUNT" , String.valueOf( executeCount ) );
    216                        setRequestAttribute( "DB.ERR_CODE", String.valueOf( errCode ) );
    217
    218                        jspPrint( buf.toString() );
    219                }
    220
    221                return EVAL_PAGE ;
    222        }
    223
    224        /**
    225         * タグリブオブジェクトをリリースします。
    226         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
    227         *
    228         * @og.rev 2.0.0.4 (2002/09/27) カスタムタグの release() メソッドを、追加
    229         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
    230         * @og.rev 4.2.2.0 (2008/05/10) password 追加
    231         * @og.rev 5.1.6.0 (2010/05/01) DBLastSqlの処理は、DBTableModelが新規作成された処理でのみ行う。
    232         *
    233         */
    234        @Override
    235        protected void release2() {
    236                super.release2();
    237
    238                searchScope                     = HybsSystem.sys( "LDAP_SEARCH_SCOPE" );        // 検索範囲。OBJECT_SCOPE、ONELEVEL_SCOPE、SUBTREE_SCOPE のどれか 1 つ
    239                timeLimit                       = 0;                    // 結果が返されるまでのミリ秒数。0 の場合、無制限
    240                derefLinkFlag           = false;                // true の場合、検索中にリンクを間接参照する
    241                returningObjFlag        = false;                // true の場合、エントリの名前にバインドされたオブジェクトを返す。false 場合、オブジェクトを返さない
    242                attrs                           = null;                 // エントリと一緒に返される属性の識別子。null の場合、すべての属性を返す。空の場合、属性を返さない
    243                columns                         = null;                 // DBTableModel を作成する場合のカラム名になります。null の場合は、attributes 属性
    244
    245                initctx                         = HybsSystem.sys( "LDAP_INITIAL_CONTEXT_FACTORY" );
    246                providerURL             = HybsSystem.sys( "LDAP_PROVIDER_URL" );
    247                entrydn                         = HybsSystem.sys( "LDAP_ENTRYDN" );
    248                password                        = HybsSystem.sys( "LDAP_PASSWORD" );            // 4.2.2.0 (2008/05/10)
    249                searchbase                      = HybsSystem.sys( "LDAP_SEARCH_BASE" );
    250                filter                          = null;         // "employeeNumber=87019";
    251
    252                tableId                         = HybsSystem.TBL_MDL_KEY;       // sessionｷｰ
    253                orderBy                         = null;                 // ｿｰﾄ項目(csv)
    254                command                         = CMD_NEW;              // ｺﾏﾝﾄﾞ
    255                executeCount            = 0;                    // 検索/実行件数
    256                errCode                         = ErrorMessage.OK; // Ver4.3.1.1 (2008/09/05) 検索エラーコード
    257                maxRowCount                     = 0;                    // 最大検索数(0は無制限)
    258                displayMsg                      = HybsSystem.sys( "VIEW_DISPLAY_MSG" );
    259                overflowMsg             = "MSG0007";    // 検索結果が、制限行数を超えましたので、残りはカットされました。              */
    260                notfoundMsg                     = "MSG0077";    // 対象データはありませんでした。
    261                isMainTrans                     = true;                 // 5.1.6.0 (2010/05/01) DBLastSqlの処理の見直し
    262        }
    263
    264        /**
    265         * LDPA から、値を取り出し、DBTableModel を作成します。
    266         *
    267         * @og.rev 4.2.2.0 (2008/05/10) entrydn と、password 処理の追加
    268         *
    269         * @return      テーブルモデル
    270         */
    271        private DBTableModel makeDBTable() {
    272                if( filter == null ) {
    273                        String errMsg = "S検索フィルターに null が指定されました。" ;
    274                        throw new HybsSystemException( errMsg );
    275                }
    276
    277                LDAPSearch serch = new LDAPSearch();
    278                serch.setSearchScope( searchScope ) ;
    279                serch.setTimeLimit( timeLimit ) ;
    280                serch.setDerefLinkFlag( derefLinkFlag ) ;
    281                serch.setReturningObjFlag( returningObjFlag ) ;
    282                serch.setMaxRowCount( maxRowCount ) ;
    283                serch.setAttributes( attrs ) ;
    284                serch.setInitctx( initctx ) ;
    285                serch.setProviderURL( providerURL ) ;
    286                serch.setSearchbase( searchbase ) ;
    287                if( entrydn != null  ) { serch.setEntrydn( entrydn ) ; }        //4 .2.2.0 (2008/05/10)
    288                if( password != null ) { serch.setPassword( password ) ; }      //4 .2.2.0 (2008/05/10)
    289                serch.setOrderBy( orderBy ) ;
    290                serch.init();
    291
    292                List<String[]> list = serch.search( filter );
    293                executeCount = list.size();
    294
    295                String[] ids = serch.getAttributes();   // attrs が null の場合、全件。それ以外は、attrs
    296
    297                // DBTableModel に使用するカラム名の登録
    298                if( columns != null && columns.length > 0 ) {
    299                        if( ids.length != columns.length ) {
    300                                String errMsg = "attributes 属性とcolumns属性の個数が異なります。"
    301                                                        + "attrs=[" + attrs.length + "]:" + StringUtil.array2csv( attrs )
    302                                                        + HybsSystem.CR
    303                                                        + " columns=[" + columns.length + "]:" + StringUtil.array2csv( columns )
    304                                                        + HybsSystem.CR ;
    305                                throw new HybsSystemException( errMsg );
    306                        }
    307                        for( int i=0; i<columns.length; i++ ) {
    308                                // columns にカラム名が設定されている場合のみ、使用する。
    309                                if( columns[i] != null && columns[i].length() > 0 ) {
    310                                        ids[i] = columns[i];
    311                                }
    312                        }
    313                }
    314
    315                DBTableModel table = null;
    316                if( ids.length > 0 ) {
    317                        table = DBTableModelUtil.newDBTable();
    318                        table.init( ids.length );
    319                        for( int clm=0; clm<ids.length; clm++ ) {
    320                                DBColumn dbColumn = getResource().makeDBColumn( ids[clm] );
    321                                table.setDBColumn( clm,dbColumn );
    322                        }
    323
    324                        for( int row=0; row<executeCount; row++ ) {
    325                                table.addColumnValues( list.get( row ) );
    326                        }
    327                }
    328                return table ;
    329        }
    330
    331        /**
    332         * 【TAG】検索範囲(OBJECT/ONELEVEL/SUBTREE)を設定します
    333         *              (初期値:LDAP_SEARCH_SCOPE[={@og.value org.opengion.hayabusa.common.SystemData#LDAP_SEARCH_SCOPE}])。
    334         *
    335         * @og.tag
    336         * 検索範囲を OBJECT_SCOPE、ONELEVEL_SCOPE、SUBTREE_SCOPE のどれか 1 つです。
    337         * 指定文字列は、それぞれ『OBJECT』『ONELEVEL』『SUBTREE』です。
    338         * (初期値:システム定数のLDAP_SEARCH_SCOPE[={@og.value org.opengion.hayabusa.common.SystemData#LDAP_SEARCH_SCOPE}])。
    339         *
    340         * @param       scope SearchControls の検索範囲
    341         * @see         org.opengion.hayabusa.common.SystemData#LDAP_SEARCH_SCOPE
    342         */
    343        public void setSearchScope( final String scope ) {
    344                searchScope = nval( getRequestParameter( scope ), searchScope );
    345        }
    346
    347        /**
    348         * 【TAG】これらの SearchControls の時間制限をミリ秒単位で設定します(初期値:0[無制限])。
    349         *
    350         * @og.tag
    351         * 値が 0 の場合、無制限に待つことを意味します。
    352         *
    353         * @param       limit ミリ秒単位の時間制限(初期値:無制限)
    354         */
    355        public void setTimeLimit( final String limit ) {
    356                timeLimit = nval( getRequestParameter( limit ), timeLimit );
    357        }
    358
    359        /**
    360         * 【TAG】検索中のリンクへの間接参照を有効または無効[true/false]にします(初期値:false)。
    361         *
    362         * @og.tag 検索中のリンクへの間接参照を有効または無効にします。
    363         *
    364         * @param       deref リンクを逆参照する場合は true、そうでない場合は false(初期値:false)
    365         */
    366        public void setDerefLinkFlag( final String deref ) {
    367                derefLinkFlag = nval( getRequestParameter( deref ), derefLinkFlag );
    368        }
    369
    370        /**
    371         * 【TAG】結果の一部としてオブジェクトを返すことを有効または無効[true/false]にします(初期値:false)。
    372         *
    373         * @og.tag
    374         * 無効にした場合、オブジェクトの名前およびクラスだけが返されます。
    375         * 有効にした場合、オブジェクトが返されます。
    376         *
    377         * @param       pbjflag オブジェクトが返される場合は true、そうでない場合は false(初期値:false)
    378         */
    379        public void setReturningObjFlag( final String pbjflag ) {
    380                returningObjFlag = nval( getRequestParameter( pbjflag ), returningObjFlag );
    381        }
    382
    383        /**
    384         * 【TAG】レジストリの最大検索件数をセットします(初期値:0[無制限])。
    385         *
    386         * @og.tag
    387         * DBTableModelのデータとして登録する最大件数をこの値に設定します。
    388         * サーバーのメモリ資源と応答時間の確保の為です。
    389         * 初期値は、0 は、無制限です。
    390         *
    391         * @param       count レジストリの最大検索件数
    392         */
    393        public void setMaxRowCount( final String count ) {
    394                maxRowCount = nval( getRequestParameter( count ),maxRowCount );
    395        }
    396
    397        /**
    398         * 【TAG】検索の一部として返される属性をCSVで複数指定します。
    399         *
    400         * @og.tag
    401         * null は属性が何も返されないことを示します。
    402         * このメソッドからは、空の配列をセットすることは出来ません。
    403         *
    404         * @og.rev 3.5.6.2 (2004/07/05) 先に配列に分解してからリクエスト変数の値を取得
    405         * @og.rev 3.7.0.4 (2005/03/18) リクエスト変数の値を取得後、分解します。
    406         *
    407         * @param       val 返される属性を識別する属性 ID の羅列(カンマ区切り文字)
    408         */
    409        public void setAttributes( final String val ) {
    410                String att = nval( getRequestParameter( val ),null );
    411                if( att != null ) {
    412                        attrs = StringUtil.csv2Array( att );
    413                }
    414        }
    415
    416        /**
    417         * 【TAG】作成する DBTableModel のカラム名をCSV形式で指定します。
    418         *
    419         * @og.tag
    420         * なにも指定しない場合は、attributes 属性が使用されます。
    421         * LDAP検索結果に、別名をつけるイメージで使用します。
    422         *
    423         * @og.rev 3.7.1.0 (2005/04/26) 新規追加
    424         *
    425         * @param       clm 作成する DBTableModel のカラム名(カンマ区切り文字)
    426         */
    427        public void setColumns( final String clm ) {
    428                String cl = nval( getRequestParameter( clm ),null );
    429                if( cl != null ) {
    430                        columns = StringUtil.csv2Array( cl );
    431                }
    432        }
    433
    434        /**
    435         * 【TAG】初期コンテキストファクトリを指定します
    436         *              (初期値:LDAP_INITIAL_CONTEXT_FACTORY[={@og.value org.opengion.hayabusa.common.SystemData#LDAP_INITIAL_CONTEXT_FACTORY}])。
    437         *
    438         * @og.tag
    439         * 例)com.sun.jndi.ldap.LdapCtxFactory
    440         * (初期値:システム定数のLDAP_INITIAL_CONTEXT_FACTORY[={@og.value org.opengion.hayabusa.common.SystemData#LDAP_INITIAL_CONTEXT_FACTORY}])。
    441         *
    442         * @param       ctx 初期コンテキストファクトリ
    443         * @see         org.opengion.hayabusa.common.SystemData#LDAP_INITIAL_CONTEXT_FACTORY
    444         */
    445        public void setInitctx( final String ctx ) {
    446                initctx = nval( getRequestParameter( ctx ), initctx );
    447        }
    448
    449        /**
    450         * 【TAG】サービスプロバイダの構成情報を指定します
    451         *              (初期値:LDAP_PROVIDER_URL[={@og.value org.opengion.hayabusa.common.SystemData#LDAP_PROVIDER_URL}])。
    452         *
    453         * @og.tag
    454         * プロトコルとサーバーとポートを指定します。
    455         * 例)『ldap://ldap.opengion.org:389』
    456         * (初期値:システム定数のLDAP_PROVIDER_URL[={@og.value org.opengion.hayabusa.common.SystemData#LDAP_PROVIDER_URL}])。
    457         *
    458         * @param       url サービスプロバイダの構成情報
    459         * @see         org.opengion.hayabusa.common.SystemData#LDAP_PROVIDER_URL
    460         */
    461        public void setProviderURL( final String url ) {
    462                providerURL = nval( getRequestParameter( url ), providerURL );
    463        }
    464
    465        /**
    466         * 【TAG】検索するコンテキストまたはオブジェクトの名前を設定します
    467         *              (初期値:LDAP_SEARCH_BASE[={@og.value org.opengion.hayabusa.common.SystemData#LDAP_SEARCH_BASE}])。
    468         *
    469         * @og.tag
    470         * 例)『soOUID=employeeuser,o=opengion,c=JP』
    471         * (初期値:システム定数のLDAP_SEARCH_BASE[={@og.value org.opengion.hayabusa.common.SystemData#LDAP_SEARCH_BASE}])。
    472         *
    473         * @param       base 検索ベース
    474         * @see         org.opengion.hayabusa.common.SystemData#LDAP_SEARCH_BASE
    475         */
    476        public void setSearchbase( final String base ) {
    477                searchbase = nval( getRequestParameter( base ), searchbase );
    478        }
    479
    480        /**
    481         * 【TAG】検索に使用するフィルタ式(例：belongOUID=61200)。
    482         *
    483         * @og.tag
    484         * 例)『belongOUID=61200』
    485         *
    486         * @param       siki フィルタ式
    487         */
    488        public void setFilter( final String siki ) {
    489                filter = nval( getRequestParameter( siki ), filter );
    490        }
    491
    492        /**
    493         * 【TAG】属性の取得元のオブジェクトの名前を設定します
    494         *              (初期値:LDAP_ENTRYDN[={@og.value org.opengion.hayabusa.common.SystemData#LDAP_ENTRYDN}])。
    495         *
    496         * @og.tag
    497         * 例)『soOUID=opengion-sys,o=opengion,c=JP』
    498         * (初期値:システム定数のLDAP_ENTRYDN[={@og.value org.opengion.hayabusa.common.SystemData#LDAP_ENTRYDN}])。
    499         *
    500         * @og.rev 4.2.2.0 (2008/05/10) 初期値変更
    501         *
    502         * @param       dn 取得元のオブジェクトの名前
    503         * @see         org.opengion.hayabusa.common.SystemData#LDAP_ENTRYDN
    504         */
    505        public void setEntrydn( final String dn ) {
    506                entrydn = nval( getRequestParameter( dn ), entrydn );
    507        }
    508
    509        /**
    510         * 【TAG】属性の取得元のオブジェクトのパスワードを設定します
    511         *              (初期値:LDAP_PASSWORD[={@og.value org.opengion.hayabusa.common.SystemData#LDAP_PASSWORD}])。
    512         *
    513         * @og.tag
    514         * (初期値:システム定数のLDAP_PASSWORD[={@og.value org.opengion.hayabusa.common.SystemData#LDAP_PASSWORD}])。
    515         *
    516         * @og.rev 4.2.2.0 (2008/05/10) 新規追加
    517         *
    518         * @param       pwd 取得元のオブジェクトのパスワード
    519         * @see         org.opengion.hayabusa.common.SystemData#LDAP_PASSWORD
    520         */
    521        public void setPassword( final String pwd ) {
    522                password = nval( getRequestParameter( pwd ), password );
    523        }
    524
    525        /**
    526         * 【TAG】(通常は使いません)結果のDBTableModelを、sessionに登録するときのキーを指定します
    527         *              (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])。
    528         *
    529         * @og.tag
    530         * 検索結果より、DBTableModelオブジェクトを作成します。これを、下流のviewタグ等に
    531         * 渡す場合に、通常は、session を利用します。その場合の登録キーです。
    532         * query タグを同時に実行して、結果を求める場合、同一メモリに配置される為、
    533         * この tableId 属性を利用して、メモリ空間を分けます。
    534         *              (初期値:HybsSystem#TBL_MDL_KEY[={@og.value org.opengion.hayabusa.common.HybsSystem#TBL_MDL_KEY}])。
    535         *
    536         * @param       id sessionに登録する時の ID
    537         */
    538        public void setTableId( final String id ) {
    539                tableId = nval( getRequestParameter( id ), tableId );
    540        }
    541
    542        /**
    543         * 【TAG】検索した結果を表示する表示順をファイル属性名で指定します。
    544         *
    545         * @og.tag
    546         * attributes 属性で指定するキー、または、LDAPから返されたキーについて
    547         * その属性でソートします。逆順を行う場合は、DESC を指定のカラム名の後ろに
    548         * 付けて下さい。
    549         *
    550         * @param       ordr    ソートキーを指定。
    551         */
    552        public void setOrderBy( final String ordr ) {
    553                orderBy = nval( getRequestParameter( ordr ), orderBy );
    554                if( orderBy != null ) { orderBy = orderBy.toUpperCase(Locale.JAPAN) ; }
    555        }
    556
    557        /**
    558         * 【TAG】コマンド(NEW,RENEW)をセットします(初期値:NEW)。
    559         *
    560         * @og.tag
    561         * コマンドは,HTMLから(get/post)指定されますので,CMD_xxx で設定される
    562         * フィールド定数値のいづれかを、指定できます。
    563         * 何も設定されない、または、null の場合は、"NEW" が初期値にセットされます。
    564         *
    565         * @param       cmd コマンド(public static final 宣言されている文字列)
    566         * @see         <a href="../../../../constant-values.html#org.opengion.hayabusa.taglib.LDAPQueryTag.CMD_NEW">コマンド定数</a>
    567         */
    568        public void setCommand( final String cmd ) {
    569                String cmd2 = getRequestParameter( cmd );
    570                if( cmd2 != null && cmd2.length() > 0 ) { command = cmd2.toUpperCase(Locale.JAPAN); }
    571        }
    572
    573        /**
    574         * 【TAG】検索結果を画面上に表示するメッセージリソースIDを指定します(初期値は検索件数)。
    575         *
    576         * @og.tag
    577         * ここでは、検索結果の件数や登録された件数をまず出力し、
    578         * その次に、ここで指定したメッセージをリソースから取得して
    579         * 表示します。
    580         * 表示させたくない場合は, displayMsg = "" をセットしてください。
    581         * 初期値は、検索件数を表示します。
    582         *
    583         * @param       id ディスプレイに表示させるメッセージ ID
    584         */
    585        public void setDisplayMsg( final String id ) {
    586                displayMsg = getRequestParameter( id );
    587        }
    588
    589        /**
    590         * 【TAG】検索結果がゼロ件の場合に表示するメッセージリソースIDを指定します(初期値:MSG0077[対象データはありませんでした])。
    591         *
    592         * @og.tag
    593         * ここでは、検索結果がゼロ件の場合のみ、特別なメッセージを表示させます。
    594         * 従来は、displayMsg と兼用で、『0　件検索しました』という表示でしたが、
    595         * displayMsg の初期表示は、OFF になりましたので、ゼロ件の場合のみ別に表示させます。
    596         * 表示させたくない場合は, notfoundMsg = "" をセットしてください。
    597         * 初期値は、MSG0077[対象データはありませんでした]です。
    598         *
    599         * @param       id ディスプレイに表示させるメッセージ ID
    600         */
    601        public void setNotfoundMsg( final String id ) {
    602                String ids = getRequestParameter( id );
    603                if( ids != null ) { notfoundMsg = ids; }
    604        }
    605
    606        /**
    607         * 【TAG】オーバーフロー時に画面上に表示するメッセージIDを指定します(初期値:MSG0007)。
    608         *
    609         * @og.tag
    610         * 表示させたくない場合は, overflowMsg = "" をセットしてください。
    611         *
    612         * @param       id ディスプレイに表示させるメッセージ ID
    613         */
    614        public void setOverflowMsg( final String id ) {
    615                overflowMsg = getRequestParameter( id );
    616        }
    617
    618        /**
    619         * 【TAG】(通常使いません)タグで処理される処理がメインとなるトランザクション処理かどうかを指定します(初期値:false)。
    620         *
    621         * @og.tag
    622         * この値は、ファイルダウンロード処理に影響します。この値がtrueに指定された時にcommitされたDBTableModelが
    623         * ファイルダウンロードの対象の表になります。
    624         *
    625         * このパラメーターは、通常、各タグにより実装され、ユーザーが指定する必要はありません。
    626         * 但し、1つのJSP内でDBTableModelが複数生成される場合に、前に処理したDBTableModelについてファイルダウンロードをさせたい
    627         * 場合は、後ろでDBTableModelを生成するタグで、明示的にこの値をfalseに指定することで、ファイルダウンロード処理の対象から
    628         * 除外することができます。
    629         *
    630         * @og.rev 5.1.6.0 (2010/05/01) 新規作成
    631         *
    632         * @param  flag メイントランザクションかどうか
    633         */
    634        public void setMainTrans( final String flag ) {
    635                isMainTrans = nval( getRequestParameter( flag ),isMainTrans );
    636        }
    637
    638        /**
    639         * このオブジェクトの文字列表現を返します。
    640         * 基本的にデバッグ目的に使用します。
    641         *
    642         * @return このクラスの文字列表現
    643         */
    644        @Override
    645        public String toString() {
    646                return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
    647                                .println( "VERSION"                             ,VERSION                )
    648                                .println( "initctx"                     ,initctx                )
    649                                .println( "providerURL"                 ,providerURL    )
    650                                .println( "entrydn"                     ,entrydn                )
    651                                .println( "searchbase"                  ,searchbase             )
    652                                .println( "filter"                              ,filter                 )
    653                                .println( "searchScope"                 ,searchScope    )
    654                                .println( "COUNTLIMIT"                  ,COUNTLIMIT             )
    655                                .println( "timeLimit"                   ,timeLimit              )
    656                                .println( "attrs"                               ,attrs                  )
    657                                .println( "columns"                             ,columns                )
    658                                .println( "returningObjFlag"    ,returningObjFlag)
    659                                .println( "derefLinkFlag"               ,derefLinkFlag  )
    660                                .println( "tableId"                     ,tableId                )
    661                                .println( "orderBy"                             ,orderBy                )
    662                                .println( "command"                             ,command                )
    663                                .println( "executeCount"                ,executeCount   )
    664                                .println( "errCode"                             ,errCode                )
    665                                .println( "maxRowCount"                 ,maxRowCount    )
    666                                .println( "displayMsg"                  ,displayMsg     )
    667                                .println( "overflowMsg"                 ,overflowMsg    )
    668                                .println( "Other..."                    ,getAttributes().getAttribute() )
    669                                .fixForm().toString() ;
    670        }
    671}