    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.fukurou.util.XHTMLTag;
    021import org.opengion.fukurou.util.Attributes;
    022import org.opengion.fukurou.util.ToString;                                              // 6.1.1.0 (2015/01/17)
    023import org.opengion.fukurou.util.ArraySet;                                              // 6.4.3.4 (2016/03/11)
    024import org.opengion.hayabusa.io.HybsFileOperationFactory;               // 8.0.0.2 (2021/10/08)
    025
    026import static org.opengion.fukurou.util.StringUtil.nval ;
    027
    028import java.io.File;
    029import java.io.FileFilter;
    030import java.io.Serializable;
    031import java.util.Set;                                                                                   // 6.4.3.4 (2016/03/11)
    032import java.util.Arrays;
    033import java.util.Comparator;
    034
    035/**
    036 * ﾌｧｲﾙのﾌﾟﾙﾀﾞｳﾝﾘｽﾄの作成するﾀｸﾞです｡
    037 *
    038 * SelectﾀｸﾞのBODY部に指定します｡
    039 * 並び替えについては､このﾀｸﾞで指定しますが､ﾌｧｲﾙの選別は､
    040 * BODY 部に記述する fileWhere ﾀｸﾞで指定します｡
    041 *
    042 * @og.formSample
    043 * ●形式：&lt;og:fileOption from="…" value="[…]" ･･･ &gt;･･･&lt;/og:fileOption&gt;
    044 * ●body：あり(EVAL_BODY_BUFFERED:BODYを評価し､{&#064;XXXX} を解析します)
    045 *
    046 * ●Tag定義：
    047 *   &lt;og:fileOption
    048 *       from               【TAG】ﾌｧｲﾙの検索元となるﾃﾞｨﾚｸﾄﾘを指定します (初期値:FILE_URL[=filetemp/])
    049 *       value              【TAG】Optionの初期値で選ばれる値を指定します
    050 *       nameOnly           【TAG】ﾌｧｲﾙの拡張子を除いた名前部分のみの値で行います｡7.2.4.0 (2020/05/11)
    051 *       groupDir           【TAG】optgroupを､ﾃﾞｨﾚｸﾄﾘの値で作成します(１ﾚﾍﾞﾙのみ)｡
    052 *       orderBy            【TAG】検索した結果を表示する表示順をﾌｧｲﾙ属性名で指定します(初期値:自然順序)
    053 *       desc               【TAG】表示順を逆転するかどうか[true/false]を指定します(初期値:false)
    054 *       useLocal           【TAG】ｼｽﾃﾑ定数でｸﾗｳﾄﾞ設定されていても､ｸﾗｳﾄﾞ環境を使用しない場合､trueを指定します(初期値:false) 8.0.1.0 (2021/10/29)
    055 *       caseKey            【TAG】このﾀｸﾞ自体を利用するかどうかの条件ｷｰを指定します(初期値:null) 6.8.0.0 (2017/06/02)
    056 *       caseVal            【TAG】このﾀｸﾞ自体を利用するかどうかの条件値を指定します(初期値:null) 6.8.0.0 (2017/06/02)
    057 *       caseNN             【TAG】指定の値が､null/ｾﾞﾛ文字列 でない場合(Not Null=NN)は､このﾀｸﾞは使用されます(初期値:判定しない) 6.8.0.0 (2017/06/02)
    058 *       caseNull           【TAG】指定の値が､null/ｾﾞﾛ文字列 の場合は､このﾀｸﾞは使用されます(初期値:判定しない) 6.8.0.0 (2017/06/02)
    059 *       caseIf             【TAG】指定の値が､true/TRUE文字列の場合は､このﾀｸﾞは使用されます(初期値:判定しない) 6.8.0.0 (2017/06/02)
    060 *       debug              【TAG】ﾃﾞﾊﾞｯｸﾞ情報を出力するかどうか[true/false]を指定します(初期値:false)
    061 * X     useDir             【廃止】(廃止：7.2.6.0 (2020/06/30))optionﾘｽﾄの作成を､ﾃﾞｨﾚｸﾄﾘの値で行います｡
    062 *   &gt;   ... Body ...
    063 *   &lt;/og:fileOption&gt;
    064 *
    065 * ●使用例
    066 *      ･&lt;og:fileOption val1="ABCD" val2="{&#064;value}" &gt;
    067 *            &lt;og:fileWhere startsWith="ABCD" ･･･ /&gt;
    068 *        &lt;/og:fileOption&gt;
    069 *
    070 * @og.rev 2.1.1.0 (2002/11/11) 新規作成
    071 * @og.rev 4.0.0.0 (2005/01/31) 内部ﾛｼﾞｯｸ改定
    072 * @og.group その他入力
    073 *
    074 * @version  4.0
    075 * @author   Kazuhiko Hasegawa
    076 * @since    JDK5.0,
    077 */
    078public class FileOptionTag extends CommonTagSupport {
    079        /** このﾌﾟﾛｸﾞﾗﾑのVERSION文字列を設定します｡ {@value} */
    080        private static final String VERSION = "8.0.1.0 (2021/10/29)" ;
    081        private static final long serialVersionUID = 801020211029L ;
    082
    083        private transient       FileFilter      filter  ;       // FileWhere で指定したﾌｨﾙﾀｰ
    084
    085        private String          from            = HybsSystem.sys( "FILE_URL" ); // 検索起点ﾌｧｲﾙ
    086        private String          selValue        ;                       // 選択済み初期値にする場合
    087//      private boolean         useDir          ;                       // 6.3.4.0 (2015/08/01) 7.2.6.0 (2020/06/30) useDIR 属性 廃止
    088        private boolean         nameOnly        ;                       // 7.2.4.0 (2020/05/11)
    089        private boolean         groupDir        ;                       // 6.3.4.0 (2015/08/01)
    090        private String          orderBy         ;                       // ｿｰﾄ項目
    091        private boolean         desc            ;                       // 降順ﾌﾗｸﾞ
    092        private boolean         useLocal        ;                       // 8.0.1.0 (2021/10/29) ｸﾗｳﾄﾞ設定を使用しない場合は､true
    093
    094        // 6.4.3.4 (2016/03/11) String配列 から､Setに置き換えます｡
    095        private static final Set<String> ORDER_BY_SET = new ArraySet<>( "NAME","LASTMODIFIED","FILE_LENGTH","LENGTH" );
    096
    097        /**
    098         * ﾃﾞﾌｫﾙﾄｺﾝｽﾄﾗｸﾀｰ
    099         *
    100         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
    101         */
    102        public FileOptionTag() { super(); }             // これも､自動的に呼ばれるが､空のﾒｿｯﾄﾞを作成すると警告されるので､明示的にしておきます｡
    103
    104        /**
    105         * Taglibの開始ﾀｸﾞが見つかったときに処理する doStartTag() を ｵｰﾊﾞｰﾗｲﾄﾞします｡
    106         *
    107         * @og.rev 6.8.0.0 (2017/06/02) caseKey,caseVal,caseNN,caseNull 属性を追加
    108         *
    109         * @return      後続処理の指示( EVAL_BODY_BUFFERED )
    110         */
    111        @Override
    112        public int doStartTag() {
    113                // 6.8.0.0 (2017/06/02) caseKey,caseVal,caseNN,caseNull 属性を追加
    114                return useTag() ? EVAL_BODY_BUFFERED : SKIP_BODY ;
    115        }
    116
    117        /**
    118         * Taglibのﾀｸﾞ本体を処理する doAfterBody() を ｵｰﾊﾞｰﾗｲﾄﾞします｡
    119         *
    120         * @return      後続処理の指示(SKIP_BODY)
    121         */
    122        @Override
    123        public int doAfterBody() {
    124                return SKIP_BODY ;
    125        }
    126
    127        /**
    128         * Taglibの終了ﾀｸﾞが見つかったときに処理する doEndTag() を ｵｰﾊﾞｰﾗｲﾄﾞします｡
    129         *
    130         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応｡release2() を doEndTag()で呼ぶ｡
    131         * @og.rev 6.3.4.0 (2015/08/01) useDir 属性と､groupDir 属性 を追加します｡
    132         * @og.rev 6.8.0.0 (2017/06/02) caseKey,caseVal,caseNN,caseNull 属性を追加
    133         * @og.rev 8.0.0.1 (2021/10/08) cloud対応
    134         *
    135         * @return      後続処理の指示
    136         */
    137        @Override
    138        public int doEndTag() {
    139                debugPrint();           // 4.0.0 (2005/02/28)
    140                // 6.8.0.0 (2017/06/02) caseKey,caseVal,caseNN,caseNull 属性を追加
    141                if( useTag() ) {
    142                        final OptionAncestorIF select = (OptionAncestorIF)findAncestorWithClass( this, OptionAncestorIF.class );
    143                        if( select == null ) {
    144                                final String errMsg = "<b>" + getTagName() + "ﾀｸﾞは､SelectTag または､DatalistTag のBODY に記述する必要があります｡</b>";
    145                                throw new HybsSystemException( errMsg );
    146                        }
    147                        final Comparator<File> comp = makeComparator( orderBy,desc );
    148        //              makeLabel( select,comp );
    149//                      makeLabel( new File( from ) , select , comp , groupDir );
    150                        final File path = HybsFileOperationFactory.create( useLocal,from );             // 8.0.0.1 (2021/10/08)
    151                        makeLabel( path , select , comp , groupDir );
    152                }
    153
    154                return EVAL_PAGE ;
    155        }
    156
    157        /**
    158         * ﾀｸﾞﾘﾌﾞｵﾌﾞｼﾞｪｸﾄをﾘﾘｰｽします｡
    159         * ｷｬｯｼｭされて再利用されるので､ﾌｨｰﾙﾄﾞの初期設定を行います｡
    160         *
    161         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応｡release2() を doEndTag()で呼ぶ｡
    162         * @og.rev 6.3.4.0 (2015/08/01) useDir 属性と､groupDir 属性 を追加します｡
    163         * @og.rev 7.2.4.0 (2020/05/11) nameOnly 属性 を追加します｡
    164         * @og.rev 7.2.6.0 (2020/06/30) ﾃﾞｨﾚｸﾄﾘ処理を統一します｡
    165         * @og.rev 8.0.1.0 (2021/10/29) useLocal 属性を追加｡
    166         */
    167        @Override
    168        protected void release2() {
    169                super.release2();
    170                filter          = null;
    171                from            = HybsSystem.sys( "FILE_URL" );
    172                selValue        = null;
    173                nameOnly        = false;        // 7.2.4.0 (2020/05/11)
    174                groupDir        = false;        // 6.3.4.0 (2015/08/01)
    175                orderBy         = null;         // ｿｰﾄ項目
    176                desc            = false;        // 降順ﾌﾗｸﾞ
    177                useLocal        = false;        // 8.0.1.0 (2021/10/29) ｸﾗｳﾄﾞ設定を使用しない場合は､true
    178//              useDir          = false;        // 6.3.4.0 (2015/08/01) 7.2.6.0 (2020/06/30)
    179        }
    180
    181        /**
    182         * ｵﾌﾟｼｮﾝを作成します｡
    183         *
    184         * ﾌｧｲﾙ名を "value" に､
    185         * BODY属性 に登録するOptionを作成します｡
    186         *
    187         * @og.rev 5.3.4.0 (2011/04/01) FILE_LENGTH 追加
    188         *
    189         * @param       orderBy ｿｰﾄする属性 [NAME/LASTMODIFIED/FILE_LENGTH/LENGTH]
    190         * @param       desc    並び順 [true:昇順/false:降順]
    191         *
    192         * @return      ﾌｧｲﾙ比較用のComparatorｵﾌﾞｼﾞｪｸﾄ
    193         */
    194        private Comparator<File> makeComparator( final String orderBy,final boolean desc ) {
    195                if( orderBy == null ) { return null; }
    196
    197                Comparator<File> comp = null ;
    198
    199                if( "NAME".equalsIgnoreCase( orderBy ) ) {
    200                        comp = new NameComparator( desc );
    201                }
    202                else if( "LASTMODIFIED".equalsIgnoreCase( orderBy ) ) {
    203                        comp = new ModifiedComparator( desc );
    204                }
    205                // "LENGTH" を残すのは､互換性のため
    206                else if( "FILE_LENGTH".equalsIgnoreCase( orderBy ) || "LENGTH".equalsIgnoreCase( orderBy ) ) {
    207                        comp = new LengthComparator( desc );
    208                }
    209
    210                return comp ;
    211        }
    212
    213        /**
    214         * ｵﾌﾟｼｮﾝを作成します｡
    215         *
    216         * ﾌｧｲﾙ名を "value" と､BODY属性 に登録するOptionを作成します｡
    217         *
    218         * @og.rev 3.8.0.9 (2005/10/17) 複数選択可能時に全選択を設定する｡
    219         * @og.rev 6.3.4.0 (2015/08/01) useDir 属性と､groupDir 属性 を追加します｡
    220         * @og.rev 6.8.0.0 (2017/06/02) ﾌｫﾙﾀﾞ内のﾌｧｲﾙが無い場合は､階層に加えない｡
    221         * @og.rev 7.2.4.0 (2020/05/11) nameOnly 属性 を追加します｡
    222         *
    223         * @param       path    処理の開始ﾊﾟｽ名(ﾃﾞｨﾚｸﾄﾘ)
    224         * @param       select  SelectTagｵﾌﾞｼﾞｪｸﾄ
    225         * @param       comp    並び順を指定するためのComparatorｵﾌﾞｼﾞｪｸﾄ
    226         * @param       grpDir  ﾌｫﾙﾀﾞ階層を､optgroup ﾀｸﾞで表すかどうか [true:階層/false:１層]
    227         * @return      ﾌｫﾙﾀﾞ内のﾌｧｲﾙが無い場合は階層に加えないためのﾌﾗｸﾞ [true:階層/false:ﾌｧｲﾙなし]
    228         */
    229        private boolean makeLabel( final File path , final OptionAncestorIF select , final Comparator<File> comp , final boolean grpDir ) {
    230
    231                final File[] list = path.listFiles( filter );
    232
    233                final boolean multipleAll = select.isMultipleAll();             // 3.8.0.9 (2005/10/17)
    234                if( list != null )  {
    235                        Arrays.sort( list, comp );
    236                        boolean isSet = false;                                                          // 6.8.0.0 (2017/06/02)
    237                        for( int i=0; i<list.length; i++ ) {
    238//                              final String value = list[i].getName();
    239                                String value = list[i].getName();                               // 7.2.4.0 (2020/05/11) 書き換える
    240                                // 6.3.4.0 (2015/08/01) useDir 属性と､groupDir 属性 を追加
    241                                if( grpDir && list[i].isDirectory() ) {
    242                                        select.addOption( "<optgroup label=\"" + value + "\">" );
    243                                        if( makeLabel( list[i] , select , comp , false ) ) {    // ﾘｽﾄに追加されたかどうかを判定します｡
    244                                                select.addOption( "</optgroup>" );
    245                                                isSet = true;                                                           // 6.8.0.0 (2017/06/02)
    246                                        }
    247                                        else {
    248                                                select.removeLast();                                            // 6.8.0.0 (2017/06/02) ﾘｽﾄに追加されなかった場合は､最後に追加した optgroup を削除します｡
    249                                        }
    250
    251                                        continue;
    252                                }
    253//                              // 7.2.6.0 (2020/06/30) useDIR 属性 廃止
    254//                              else {
    255//                                      // ﾃﾞｨﾚｸﾄﾘ時のuseDir=true と､ﾌｧｲﾙ時useDir=false でない場合( XOR )時は､処理しない｡
    256//                                      if( list[i].isDirectory() ^ useDir ) { continue; }
    257//                              }
    258
    259                                // 7.2.4.0 (2020/05/11) nameOnly 属性 を追加します｡
    260                                if( nameOnly ) {
    261                                        final int ad = value.lastIndexOf( '.' );
    262                                        if( ad >= 0 ) { value = value.substring( 0,ad ); }
    263                                }
    264
    265                                // 6.1.1.0 (2015/01/17) Attributesの連結記述
    266                                final String selected = ( selValue != null && selValue.equalsIgnoreCase( value ) ) || multipleAll
    267                                                                                        ? "selected" : null ;
    268
    269                                select.addOption(
    270                                        XHTMLTag.option(
    271                                                new Attributes()
    272                                                        .set( "value"   , value )
    273                                                        .set( "selected", selected )
    274                                                        .set( "body"    , value )
    275                                        )
    276                                );
    277                        }
    278                        return isSet;   // 6.8.0.0 (2017/06/02)
    279                }
    280                return false;           // 6.8.0.0 (2017/06/02) ﾌｫﾙﾀﾞ内のﾌｧｲﾙが無い場合は､階層に加えない｡
    281        }
    282
    283        /**
    284         * 【TAG】Optionの初期値で選ばれる値を指定します｡
    285         *
    286         * @og.tag
    287         * ｷｰになるのは､ﾌｧｲﾙ属性の NAME です｡(ﾃﾞｨﾚｸﾄﾘなしのﾌｧｲﾙ名)
    288         * ここで value属性に指定した場合､このﾌｧｲﾙ名と(大文字小文字を無視して)
    289         * 一致する場合に､ﾌﾟﾙﾀﾞｳﾝの初期値に表示されます｡(selected 属性が設定される｡)
    290         *
    291         * @param   val  初期値で選ばれる値
    292         */
    293        public void setValue( final String val ) {
    294                selValue = nval( getRequestParameter( val ),selValue );
    295        }
    296
    297        /**
    298         * 【廃止】optionﾘｽﾄの作成を､ﾃﾞｨﾚｸﾄﾘの値で行います(初期値:false)｡
    299         *
    300         * @og.tag
    301         * ﾌｧｲﾙ検索で､ﾃﾞｨﾚｸﾄﾘ名のﾘｽﾄで､ｵﾌﾟｼｮﾝを作成します｡
    302         * 初期値は､false (ﾌｧｲﾙ名でﾘｽﾄ) です｡
    303         *
    304         * @og.rev 6.3.4.0 (2015/08/01) useDir 属性の追加
    305         * @og.rev 7.2.6.0 (2020/06/30) ﾃﾞｨﾚｸﾄﾘ処理を統一します｡
    306         *
    307         * @param       flag ﾃﾞｨﾚｸﾄﾘ名のﾘｽﾄで､ｵﾌﾟｼｮﾝを作成するかどうか [true:ﾃﾞｨﾚｸﾄﾘ/false:ﾌｧｲﾙ]
    308         */
    309        public void setUseDir( final String flag ) {
    310//              useDir = nval( getRequestParameter( flag ),useDir );
    311        }
    312
    313        /**
    314         * 【TAG】ﾌｧｲﾙの拡張子を除いた名前部分のみの値で行います(初期値:false)｡
    315         *
    316         * @og.tag
    317         * ﾌｧｲﾙ検索の値を､ﾌｧｲﾙの拡張子を取り除いた値のみで､ｵﾌﾟｼｮﾝを作成します｡
    318         * 初期値は､false (拡張子付きﾌｧｲﾙ名でﾘｽﾄ) です｡
    319         *
    320         * @og.rev 7.2.4.0 (2020/05/11) nameOnly 属性 を追加します｡
    321         *
    322         * @param       flag ﾌｧｲﾙの拡張子を除いた名前部分のみで､ｵﾌﾟｼｮﾝを作成するかどうか [true:名前部分のみ/false:ﾌｧｲﾙ名]
    323         */
    324        public void setNameOnly( final String flag ) {
    325                nameOnly = nval( getRequestParameter( flag ),nameOnly );
    326        }
    327
    328        /**
    329         * 【TAG】optgroupを､ﾃﾞｨﾚｸﾄﾘの値で作成します(１ﾚﾍﾞﾙのみ)(初期値:false)｡
    330         *
    331         * @og.tag
    332         * optgroupをﾃﾞｨﾚｸﾄﾘで作成することで､階層のﾒﾆｭｰを作成します｡
    333         * 初期値は､false(通常) です｡
    334         *
    335         * @og.rev 6.3.4.0 (2015/08/01) groupDir 属性の追加
    336         *
    337         * @param       flag ﾃﾞｨﾚｸﾄﾘで階層ﾒﾆｭｰを作成するかどうか [true:階層/false:通常]
    338         */
    339        public void setGroupDir( final String flag ) {
    340                groupDir = nval( getRequestParameter( flag ),groupDir );
    341        }
    342
    343        /**
    344         * 【TAG】ﾌｧｲﾙの検索元となるﾃﾞｨﾚｸﾄﾘを指定します
    345         *              (初期値:FILE_URL[={@og.value SystemData#FILE_URL}])｡
    346         *
    347         * @og.tag ﾌｧｲﾙの検索元となるﾃﾞｨﾚｸﾄﾘを指定します｡
    348         * (初期値:ｼｽﾃﾑ定数のFILE_URL[={@og.value SystemData#FILE_URL}])｡
    349         *
    350         * @og.rev 4.0.0.0 (2007/11/20) 指定されたﾃﾞｨﾚｸﾄﾘ名の最後が"\"or"/"で終わっていない場合に､"/"を付加する｡
    351         * @og.rev 6.4.2.1 (2016/02/05) URLの最後に､"/" を追加する処理を廃止｡
    352         * @og.rev 6.4.2.1 (2016/02/05) HybsSystem.url2dir に引数追加｡
    353         *
    354         * @param       url ﾌｧｲﾙの検索元となるﾃﾞｨﾚｸﾄﾘ
    355         * @see         org.opengion.hayabusa.common.SystemData#FILE_URL
    356         */
    357        public void setFrom( final String url ) {
    358                final String furl = nval( getRequestParameter( url ),null );
    359                from = HybsSystem.url2dir( from,furl,"." );                     // 6.4.2.1 (2016/02/05)
    360        }
    361
    362        /**
    363         * 【TAG】検索した結果を表示する表示順をﾌｧｲﾙ属性名[null/NAME/LASTMODIFIED/FILE_LENGTH]で指定します(初期値:自然順序)｡
    364         *
    365         * @og.tag
    366         * ﾌｧｲﾙをｿｰﾄする順(Comparator)を指定します｡ｿｰﾄに指定できる
    367         * ﾌｧｲﾙ属性名は､"NAME","LASTMODIFIED","FILE_LENGTH" の内のどれかひとつです｡
    368         * 何も指定しない場合は､Fileｵﾌﾞｼﾞｪｸﾄの自然順序でのｿｰﾄになります｡
    369         * (※ 下位互換性のため､LENGTH も残しますが､廃止予定です｡)
    370         *
    371         * @og.rev 3.5.6.2 (2004/07/05) 文字列の連結にStringBuilderを使用します｡
    372         * @og.rev 4.0.0.0 (2005/01/31) 新規ﾛｼﾞｯｸで改定
    373         * @og.rev 5.3.4.0 (2011/04/01) ORDER_BYﾘｽﾄの出力方法 見直し
    374         * @og.rev 6.3.4.0 (2015/08/01) Arrays.toString から String.join に置き換え｡
    375         * @og.rev 6.4.3.4 (2016/03/11) String配列 から､Setに置き換えます｡
    376         *
    377         * @param       ordr  ｿｰﾄｷｰ [null/NAME/LASTMODIFIED/FILE_LENGTH]
    378         */
    379        public void setOrderBy( final String ordr ) {
    380                orderBy = nval( getRequestParameter( ordr ),orderBy );
    381
    382                if( orderBy != null && ! check( orderBy, ORDER_BY_SET ) ) {
    383                        final String errMsg = "orderBy 属性に､下記の属性名以外の値が設定されました｡" + CR
    384                                                        + "orderBy=[" + orderBy + "] "                                                          + CR
    385                                                        + "orderBy List=" + String.join( ", " , ORDER_BY_SET ) ;
    386                        throw new HybsSystemException( errMsg );
    387                }
    388        }
    389
    390        /**
    391         * 【TAG】表示順を逆転するかどうか[true/false]を指定します(初期値:false)｡
    392         *
    393         * @og.tag
    394         * orderBy 属性で指定した表示順を､逆順にするかどうかを指定できます｡
    395         * 初期値は､false (昇順) です｡
    396         *
    397         * @param       flag 表示順を逆転するかどうか [true:逆順/false:昇順]
    398         */
    399        public void setDesc( final String flag ) {
    400                desc = nval( getRequestParameter( flag ),desc );
    401        }
    402
    403        /**
    404         * 【TAG】ｼｽﾃﾑ定数でｸﾗｳﾄﾞ設定されていても､ｸﾗｳﾄﾞ環境を使用しない場合､trueを指定します(初期値:false)｡
    405         *
    406         * @og.tag
    407         * ｸﾗｳﾄﾞ設定は､ｼｽﾃﾑ定数の『CLOUD_TARGET』と『CLOUD_BUCKET』の設定で自動的に使用しますが､
    408         * どうしてもﾛｰｶﾙでのみ使いたい場合は､この属性を true に設定します｡
    409         * 標準はfalse:設定どおりとなります｡
    410         *
    411         * true/false以外を指定した場合はfalse扱いとします｡
    412         *
    413         * @og.rev 8.0.1.0 (2021/10/29) useLocal 属性を追加｡
    414         *
    415         * @param flag ﾛｰｶﾙ環境のみ [true:ﾛｰｶﾙのみ/false:設定どおり]
    416         */
    417        public void setUseLocal( final String flag ) {
    418                useLocal = nval( getRequestParameter( flag ),useLocal );
    419        }
    420
    421        /**
    422         * FileFilterｵﾌﾞｼﾞｪｸﾄをｾｯﾄします｡
    423         * これは､BODY 部に登録した､FileWhereﾀｸﾞによって設定された
    424         * ﾌｧｲﾙﾌｨﾙﾀｰです｡
    425         *
    426         * @param       filter  ｵﾌﾞｼﾞｪｸﾄ
    427         */
    428        protected void setFileFilter( final FileFilter filter ) {
    429                this.filter = filter;
    430        }
    431
    432        /**
    433         * 名前順でのｿｰﾄ順を指定する Comparator の実体内部ｸﾗｽ
    434         *
    435         * @og.rev 6.3.9.1 (2015/11/27) 修飾子を､なし → private static final class に変更｡
    436         *
    437         * @version  4.0
    438         * @author   Kazuhiko Hasegawa
    439         * @since    JDK5.0,
    440         */
    441        private static final class NameComparator implements Comparator<File>,Serializable {
    442                private static final long serialVersionUID = 400020050131L ;    // 4.0.0.0 (2005/01/31)
    443
    444                private final boolean desc ;
    445
    446                /**
    447                 * 名前順での比較を行うｵﾌﾞｼﾞｪｸﾄを作成します｡
    448                 *
    449                 * @param desc 表示順逆転 [true:昇順/false:降順]
    450                 */
    451                public NameComparator( final boolean desc ) { this.desc = desc; }
    452
    453                /**
    454                 * Comparator ｲﾝﾀｰﾌｪｰｽの compare( File,File ) ﾒｿｯﾄﾞ｡
    455                 *
    456                 * @param o1 比較元１のﾌｧｲﾙｵﾌﾞｼﾞｪｸﾄ
    457                 * @param o2 比較元２のﾌｧｲﾙｵﾌﾞｼﾞｪｸﾄ
    458                 * @return      最初の引数が 2 番目の引数より小さい場合は負の整数､両方が等しい場合は 0､最初の引数が 2 番目の引数より大きい場合は正の整数
    459                 */
    460                public int compare( final File o1, final File o2 ) {
    461                        final File f1 = desc ? o2 : o1 ;
    462                        final File f2 = desc ? o1 : o2 ;
    463                        return f1.getName().compareTo( f2.getName() ) ;
    464                }
    465        }
    466
    467        /**
    468         * 更新日順でのｿｰﾄ順を指定する Comparator の実体内部ｸﾗｽ
    469         *
    470         * @og.rev 6.3.9.1 (2015/11/27) 修飾子を､なし → private static final class に変更｡
    471         *
    472         * @version  4.0
    473         * @author   Kazuhiko Hasegawa
    474         * @since    JDK5.0,
    475         */
    476        private static final class ModifiedComparator implements Comparator<File>,Serializable {
    477                private static final long serialVersionUID = 400020050131L ;    // 4.0.0.0 (2005/01/31)
    478
    479                private final boolean desc ;
    480
    481                /**
    482                 * 更新日順での比較を行うｵﾌﾞｼﾞｪｸﾄを作成します｡
    483                 *
    484                 * @param desc 表示順逆順 [true:昇順/false:降順]
    485                 */
    486                public ModifiedComparator( final boolean desc ) { this.desc = desc; }
    487
    488                /**
    489                 * Comparator ｲﾝﾀｰﾌｪｰｽの compare( File,File ) ﾒｿｯﾄﾞ｡
    490                 *
    491                 * @param o1 比較元１のﾌｧｲﾙｵﾌﾞｼﾞｪｸﾄ
    492                 * @param o2 比較元２のﾌｧｲﾙｵﾌﾞｼﾞｪｸﾄ
    493                 * @return      最初の引数が 2 番目の引数より小さい場合は負の整数､両方が等しい場合は 0､最初の引数が 2 番目の引数より大きい場合は正の整数
    494                 */
    495                public int compare( final File o1, final File o2 ) {
    496                        final File f1 = desc ? o2 : o1 ;
    497                        final File f2 = desc ? o1 : o2 ;
    498                        return (int)( f1.lastModified() - f2.lastModified() ) ;
    499                }
    500        }
    501
    502        /**
    503         * ﾌｧｲﾙｻｲｽﾞ順でのｿｰﾄ順を指定する Comparator の実体内部ｸﾗｽ
    504         *
    505         * @og.rev 6.3.9.1 (2015/11/27) 修飾子を､なし → private static final class に変更｡
    506         *
    507         * @version  4.0
    508         * @author   Kazuhiko Hasegawa
    509         * @since    JDK5.0,
    510         */
    511        private static final class LengthComparator implements Comparator<File>,Serializable {
    512                private static final long serialVersionUID = 400020050131L ;    // 4.0.0.0 (2005/01/31)
    513
    514                private final boolean desc ;
    515
    516                /**
    517                 * ﾌｧｲﾙｻｲｽﾞでの比較を行うｵﾌﾞｼﾞｪｸﾄを作成します｡
    518                 *
    519                 * @param desc 表示順逆順 [true:昇順/false:降順]
    520                 */
    521                public LengthComparator( final boolean desc ) { this.desc = desc; }
    522
    523                /**
    524                 * Comparator ｲﾝﾀｰﾌｪｰｽの compare( File,File ) ﾒｿｯﾄﾞ｡
    525                 *
    526                 * @param o1 比較元１のﾌｧｲﾙｵﾌﾞｼﾞｪｸﾄ
    527                 * @param o2 比較元２のﾌｧｲﾙｵﾌﾞｼﾞｪｸﾄ
    528                 * @return      最初の引数が 2 番目の引数より小さい場合は負の整数､両方が等しい場合は 0､最初の引数が 2 番目の引数より大きい場合は正の整数
    529                 */
    530                public int compare( final File o1, final File o2 ) {
    531                        final File f1 = desc ? o2 : o1 ;
    532                        final File f2 = desc ? o1 : o2 ;
    533                        return (int)( f1.length() - f2.length() ) ;
    534                }
    535        }
    536
    537        /**
    538         * このｵﾌﾞｼﾞｪｸﾄの文字列表現を返します｡
    539         * 基本的にﾃﾞﾊﾞｯｸﾞ目的に使用します｡
    540         *
    541         * @return このｸﾗｽの文字列表現
    542         * @og.rtnNotNull
    543         */
    544        @Override
    545        public String toString() {
    546                return ToString.title( this.getClass().getName() )
    547                                .println( "VERSION"             ,VERSION        )
    548                                .println( "orderBy"             ,orderBy        )
    549                                .println( "desc"                ,desc           )
    550                                .println( "from"                ,from           )
    551                                .println( "selValue"    ,selValue       )
    552                                .println( "Other..."    ,getAttributes().getAttribute() )
    553                                .fixForm().toString() ;
    554        }
    555}