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.db;
017
018import java.io.File;
019import java.io.FileFilter;
020import java.util.Arrays;
021import java.nio.file.FileSystems;
022import java.nio.file.PathMatcher;
023
024// import org.opengion.fukurou.system.LogWriter;
025// import org.opengion.fukurou.util.StringUtil;
026// import static org.opengion.fukurou.system.HybsConst.CR ;
027import static org.opengion.fukurou.system.HybsConst.BUFFER_MIDDLE;
028
029/**
030 * ファイルのプルダウンリストの作成するクラスです。
031 *
032 * ファイルの一覧リストからプルダウンリストを作成します。
033 * オプションタグを作成したり、与えられたキーをもとに、チェック済みのオプションタグを
034 * 作成したりします。
035 *
036 * 編集パラメータ に属性を ";" で区切って指定します。
037 *  スキャンするフォルダ名(必須);
038 *  nameOnly        … nameOnlyキーワードがあれば、ファイル名のみ(拡張子なし)のリストを作成する。
039 *  match=選択条件  … WHERE条件となるファイル選択のマッチャー を指定します。
040 *
041 * 例)
042 *  /gg/jsp/backimage;nameOnly;match=*.png
043 *
044 * @og.rev 7.2.4.0 (2020/05/11) 新規追加
045 * @og.rev 8.5.6.1 (2024/03/29) 継承で使えるように、一部修正します。
046 * @og.group 選択データ制御
047 *
048 * @version  7.1
049 * @author   Kazuhiko Hasegawa
050 * @since    JDK11.0,
051 */
052public class Selection_FILES extends Selection_NULL {
053//      private final String    CACHE ;                 // 8.5.6.1 (2024/03/29) 親クラスで定義
054
055        /**
056         * コンストラクター
057         *
058         * @og.rev 7.2.4.0 (2020/05/11) 新規追加
059         * @og.rev 7.2.9.4 (2020/11/20) spotbugs:null になっている可能性があるメソッドの戻り値を利用している
060         * @og.rev 7.4.2.0 (2021/05/08) パラメータの判定方法変更
061         *
062         * @param       param   パラメータ文字列(;で条件を区切ります)
063         */
064        public Selection_FILES( final String param ) {
065//              super();
066                super( param );         // 8.5.6.1 (2024/03/29) 継承親で、引数付きコンストラクタで初期設定されます。
067
068                // 7.4.2.0 (2021/05/08) パラメータの判定方法変更。
069                final int fst = param.indexOf( ';' );
070                final String from = fst < 0 ? param : param.substring( 0,fst ); // 開始フォルダは必ず指定する
071
072                final boolean nameOnly = param.contains( ";nameOnly" );
073        //      final boolean multi    = param.contains( ";multi" );
074
075                String matchStr = "*" ;
076                final int st = param.indexOf( ";match=" );
077                if( st > 0 ) {
078                        // 8.5.4.2 (2024/01/12) PMD 7.0.0 ConfusingTernary 対応
079                        final int ed = param.indexOf( ';',st+7 );
080                        if( ed > 0 ) {
081                                matchStr = param.substring( st+7,ed );
082                        }
083                        else {
084                                matchStr = param.substring( st+7 );
085                        }
086                }
087                final PathMatcher match = FileSystems.getDefault().getPathMatcher( "glob:" + matchStr );
088                final FileFilter PATH_FLTR = file -> { return match.matches( file.toPath().getFileName() ); };
089
090//              final String[] prms = param.split(";");
091//              final String   from = prms[0];
092//              final boolean  nameOnly = prms.length > 1 && "nameOnly".equalsIgnoreCase( prms[1] ) ;
093
094//              final PathMatcher match = prms.length > 2 ? FileSystems.getDefault().getPathMatcher(prms[2]) : null;
095//              final PathMatcher match = prms.length > 2 ? FileSystems.getDefault().getPathMatcher(prms[2]) : null;
096//              final FileFilter PATH_FLTR = file -> {
097//                      return match == null || match.matches( file.toPath().getFileName() ) ;
098//              };
099
100                final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE );
101
102                final File[] list = new File( from ).listFiles( PATH_FLTR );
103                if( list != null ) {                                                                                            // 7.2.9.4 (2020/11/20)
104                        Arrays.sort( list );
105
106                        // 8.5.4.2 (2024/01/12) PMD 7.0.0 ForLoopCanBeForeach
107//                      for( int i=0; i<list.length; i++ ) {
108//                              String value = list[i].getName();
109                        for( final File file : list ) {
110                                String value = file.getName();
111                                if( nameOnly ) {
112                                        final int ad = value.lastIndexOf( '.' );
113                                        if( ad >= 0 ) { value = value.substring( 0,ad ); }
114                                }
115
116                                buf.append( "<option value=\"" ).append( value )
117                                        .append( "\">" ).append( value ).append( "</option>" );
118                        }
119                }
120
121                cache = buf.toString();                                         // 8.5.6.1 (2024/03/29) super.cache
122        }
123
124//      /**
125//       * 初期値が選択済みの 選択肢(オプション)を返します。
126//       * このオプションは、引数の値を初期値とするオプションタグを返します。
127//       * このクラスでは、useShortLabel は、無視されます。(常に、false です)
128//       *
129//       * @og.rev 7.2.4.0 (2020/05/11) 新規追加
130//       * @og.rev 8.5.6.1 (2024/03/29) 継承元と同じなので削除
131//       *
132//       * @param   selectValue  選択されている値
133//       * @param   seqFlag  シーケンスアクセス機能 [true:ON/false:OFF]
134//       * @param   useShortLabel ラベル(短)をベースとしたオプション表示を行うかどうか(未使用)。
135//       *
136//       * @return  オプションタグ
137//       * @og.rtnNotNull
138//       */
139//      @Override
140//      public String getOption( final String selectValue,final boolean seqFlag, final boolean useShortLabel ) {
141//              // マッチするアドレスを探す。キーの前後のダブルクオートを加味して検索
142//              final String selVal = "\"" + selectValue + "\"" ;
143//
144//              // 8.5.5.1 (2024/02/29) PMD 7.0.0 OnlyOneReturn メソッドには終了ポイントが 1 つだけ必要
145//              final String rtn;
146//
147//              final int indx = CACHE.indexOf( selVal );
148//              if( indx < 0 ) {
149//                      if( selectValue != null && selectValue.length() > 0 ) {
150//                              final String errMsg = "コードに存在しない値が指定されました。"
151//                                                      + " value=[" + selectValue + "]" ;
152//                              LogWriter.log( errMsg );
153//                      }
154////                    return CACHE;
155//                      rtn = CACHE;
156//              }
157//              else {
158//                      final int addIndx = indx + selVal.length() ;    // selected の挿入位置
159//
160//                      final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE );
161//
162//                      if( seqFlag ) {
163//                              buf.append( "<option value=\"" ).append( selectValue ).append( '"' );           // 6.0.2.5 (2014/10/31) char を append する。
164//                      }
165//                      else {
166//                              buf.append( CACHE.substring( 0,addIndx ) );
167//                      }
168//                      buf.append( " selected=\"selected\"" )
169//                              .append( CACHE.substring( addIndx ) );
170////                    return buf.toString() ;
171//                      rtn = buf.toString() ;
172//              }
173//              return rtn;
174//      }
175
176//      /**
177//       * 選択肢(value)に対するラベルを返します。
178//       * 選択肢(value)が、存在しなかった場合は、選択肢そのものを返します。
179//       * getValueLabel( XX,false ) は、getValueLabel( XX ) と同じです。
180//       *
181//       * @og.rev 7.2.4.0 (2020/05/11) 新規追加
182//       * @og.rev 8.5.6.1 (2024/03/29) 継承で使えるように、一部修正します。
183//       * @og.rev 8.5.6.1 (2024/03/29) 継承元と同じなので削除
184//       *
185//       * @param       selectValue     選択肢の値
186//       * @param       isSLbl  短縮ラベルを [true:使用する/false:しない](未使用)
187//       *
188//       * @return  選択肢のラベル
189//       * @see     #getValueLabel( String )
190//       */
191//      @Override
192//      public String getValueLabel( final String selectValue,final boolean isSLbl ) {
193//              // マッチするアドレスを探す。キーの前後のダブルクオートを加味して検索
194//              final String selVal = "\"" + selectValue + "\"" ;
195//
196//              // 8.5.5.1 (2024/02/29) PMD 7.0.0 OnlyOneReturn メソッドには終了ポイントが 1 つだけ必要
197//              final String rtn;
198//
199//              final int indx = CACHE.indexOf( selVal );
200//              if( indx < 0 ) {
201//                      // マッチしなければ、選択肢そのものを返す。
202////                    return selectValue;
203//                      rtn = selectValue;
204//              }
205//              else {
206//                      // マッチすれば、キー以下のBODY部の文字列を切り出して返す。
207//                      final int stIdx = indx + selVal.length() + 1 ;                  // +1 は、">" の位置
208//                      final int edIdx = CACHE.indexOf( '<',stIdx );                           // 終了アドレス
209//
210////                    return CACHE.substring( stIdx,edIdx );
211//                      rtn = CACHE.substring( stIdx,edIdx );
212//              }
213//              return rtn;
214//      }
215}