    001/*
    002 * Copyright (c) 2017 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.fukurou.fileexec;
    017
    018import java.nio.file.Path;
    019import java.util.Set;                                                                   // 7.2.1.0 (2020/03/13) ｽｷｬﾝ対象外判定
    020// import java.util.HashSet;                                                    // 7.2.2.0 (2020/03/27) javadoc用のjdk8に対応します。
    021
    022/**
    023 * システムのベースフォルダ基準で、各種パスを管理するクラスです。
    024 *
    025 *<pre>
    026 * 本システムでは、ベースフォルダを基準として、各種管理フォルダを規定しています。
    027 * それらのパスオブジェクトを管理します。
    028 *
    029 *</pre>
    030 *
    031 * <table class="plain" style="font-family: monospace;">
    032 *  <caption>各種管理フォルダの規定</caption>
    033 *  <tr><th>フォルダ        </th><th>説明</th></tr>
    034 *  <tr><td>BASE_PATH   </td><td>基本となるフォルダパス</td></tr>
    035 *  <tr><td>SUB_PATH    </td><td>ベースパスの下位のサブパス。これがスキャン対象になる。</td></tr>
    036 *  <tr><td>WORK_PATH   </td><td>中間パス。サブパスのファイルを一旦このワークに移動してから、取込処理を行います</td></tr>
    037 *  <tr><td>OK_PATH             </td><td>処理が成功した場合のファイルの移動先</td></tr>
    038 *  <tr><td>NG_PATH             </td><td>処理が失敗した場合のファイルの移</td></tr>
    039 *</table>
    040 *
    041 * @og.rev 7.0.0.0 (2017/07/07) 新規作成
    042 *
    043 * @version  7.0
    044 * @author   Kazuhiko Hasegawa
    045 * @since    JDK1.8,
    046 */
    047public final class BasePath {
    048        private static final XLogger LOGGER= XLogger.getLogger( BasePath.class.getSimpleName() );               // ログ出力
    049
    050        /** システム依存の改行記号(String)。        */
    051        public static final String CR = System.getProperty("line.separator");
    052
    053        /** BASEフォルダの相対パスの処理ﾌｫﾙﾀﾞ(WORK)の初期値 {@value} */
    054        public static final String DEF_WORK_DIR = "work" ;
    055        /** BASEフォルダの相対パスの処理済ﾌｫﾙﾀﾞ(正常)の初期値 {@value} */
    056        public static final String DEF_OK_DIR   = "bkup_ok" ;
    057        /** BASEフォルダの相対パスの処理済ﾌｫﾙﾀﾞ(異常)の初期値 {@value} */
    058        public static final String DEF_NG_DIR   = "bkup_ng" ;
    059
    060        /** ベースパス  */
    061        public final Path BASE_PATH     ;
    062
    063        /** サブパス(実際にｽｷｬﾝを行うﾄｯﾌﾟﾊﾟｽ)  */
    064        public final Path SUB_PATH      ;
    065
    066        /** 処理ﾌｫﾙﾀﾞ(WORK)のパス  */
    067        public final Path WORK_PATH     ;
    068        /** 処理済ﾌｫﾙﾀﾞ(正常)のパス  */
    069        public final Path OK_PATH ;
    070        /** 処理済ﾌｫﾙﾀﾞ(異常)のパス  */
    071        public final Path NG_PATH       ;
    072
    073//      private final Set<String> omitScanDir ;
    074        private final Set<Path> omitScanDir ;                           // 7.2.9.4 (2020/11/20) Path を直接管理します。
    075
    076        /**
    077         * フォルダを指定して、オブジェクトを作成します。
    078         *
    079         * DIR_BASE,DIR_SUB,DIR_WORK,DIR_BKUP_OK,DIR_BKUP_NG の順にセットされます。
    080         * 指定されていない(null)の場合は、初期設定を使用します。
    081         *
    082         * @og.rev 7.2.1.0 (2020/03/13) FileUtil#isAbsolute(String)を利用します。
    083         * @og.rev 7.2.2.0 (2020/03/27) javadoc用のjdk8に対応します。
    084         * @og.rev 7.2.9.4 (2020/11/20) スキャン除外判定は、Path を直接管理します。
    085         *
    086         * @param       dirs    フォルダ配列
    087         */
    088        public BasePath( final String... dirs ) {
    089                if( dirs == null || dirs.length != 5 ) {
    090                        // MSG0005 = フォルダのファイル読み込み時にエラーが発生しました。file=[{0}]
    091                        throw MsgUtil.throwException( "MSG0005" , "DIR_BASE,DIR_SUB,DIR_WORK,DIR_BKUP_OK,DIR_BKUP_NG" );
    092                }
    093
    094                final String baseDir = dirs[0];
    095
    096                BASE_PATH       = FileUtil.writePath( baseDir );                                                // ベースフォルダのチェック
    097
    098                SUB_PATH        = dirs[1] == null || dirs[1].isEmpty()
    099                                                        ? BASE_PATH
    100                                                        : FileUtil.writePath( baseDir , dirs[1] );
    101
    102                WORK_PATH       = makePath( baseDir,dirs[2],DEF_WORK_DIR );
    103                OK_PATH         = makePath( baseDir,dirs[3],DEF_OK_DIR );
    104                NG_PATH         = makePath( baseDir,dirs[4],DEF_NG_DIR );
    105
    106//              omitScanDir = new HashSet<>();
    107//              omitScanDir.add( WORK_PATH.getFileName().toString()  );                         // ミス？ OK_PATH → WORK_PATH に変更
    108//              omitScanDir.add( OK_PATH.getFileName().toString()  );
    109//              omitScanDir.add( NG_PATH.getFileName().toString()  );
    110
    111                omitScanDir = Set.of( WORK_PATH , OK_PATH , NG_PATH );                          // 7.2.9.4 (2020/11/20)
    112
    113                LOGGER.debug( () ->     "③ [BasePath]"                                          + CR
    114                                                +       "\t  BASE_PATH="        + BASE_PATH             + CR
    115                                                +       "\t  SUB_PATH ="        + SUB_PATH              + CR
    116                                                +       "\t  WORK_PATH="        + WORK_PATH             + CR
    117                                                +       "\t  OK_PATH  ="        + OK_PATH               + CR
    118                                                +       "\t  NG_PATH  ="        + NG_PATH
    119                );
    120        }
    121
    122        /**
    123         * WORK,OK,NG の各Pathパスを生成するロジックのまとめメソッド。
    124         *
    125         * パスの元となるフォルダ(dir)が、nullかゼロ文字列の場合は、ベース＋初期DIRを返し
    126         * dirが、絶対パスの場合は、そのパスを、そうでない場合は、baseDir + dir でパスを生成します。
    127         * ここで生成するパスは、FileUtil#writePath で指定し、フォルダ作成も同時に行います。
    128         *
    129         * @og.rev 7.2.1.0 (2020/03/13) FileUtil#isAbsolute(String)を利用します。
    130         *
    131         * @param       baseDir 基準フォルダ
    132         * @param       dir             パスの元となるフォルダ
    133         * @param       def             パスが未設定時のフォルダ
    134         * @return      path    生成したPathオブジェクト
    135         */
    136        private Path makePath( final String baseDir , final String dir , final String def ) {
    137                return dir == null || dir.isEmpty()
    138                                        ? FileUtil.writePath( baseDir , def )                   // ベース＋初期DIR
    139                                        : FileUtil.isAbsolute( dir )
    140                                                ? FileUtil.writePath( dir )                                     // 絶対パス
    141                                                : FileUtil.writePath( baseDir , dir );          // ベース＋相対パス
    142        }
    143
    144        /**
    145         * WORK,OK,NG,LOG をスキャン対象外にするための簡易判定メソッド。
    146         *
    147         * 指定のパスが、WORK_PATH,OK_PATH,NG_PATH,LOG_PATH の場合は、false を返します。
    148         *
    149         * @og.rev 7.2.9.4 (2020/11/20) スキャン除外判定は、Path を直接管理します。
    150         *
    151         * @param       path    判定するパス
    152         * @return      スキャン対象なら、true
    153         */
    154        public boolean isScanPath( final Path path ) {
    155                return !omitScanDir.contains( path );
    156
    157//              final String fname = path.getFileName().toString();
    158//              return !omitScanDir.contains( fname );
    159        }
    160}