    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;
    019// import java.util.logging.Handler;                                            // 7.2.1.0 (2020/03/13) ﾛｸﾞﾌｫﾙﾀﾞ作成
    020// import java.util.logging.FileHandler;                                        // 7.2.1.0 (2020/03/13) ﾛｸﾞﾌｫﾙﾀﾞ作成
    021// import java.util.logging.Logger;                                             // 7.2.1.0 (2020/03/13) ﾛｸﾞﾌｫﾙﾀﾞ作成
    022// import java.io.IOException;                                                          // 7.2.1.0 (2020/03/13) ﾛｸﾞﾌｫﾙﾀﾞ作成
    023// import java.util.concurrent.ConcurrentMap;                           // 7.2.1.0 (2020/03/13) ﾛｸﾞﾌｫﾙﾀﾞ作成
    024// import java.util.concurrent.ConcurrentHashMap;                       // 7.2.1.0 (2020/03/13) ﾛｸﾞﾌｫﾙﾀﾞ作成
    025
    026import java.util.Set;                                                                   // 7.2.1.0 (2020/03/13) ｽｷｬﾝ対象外判定
    027import java.util.HashSet;                                                               // 7.2.2.0 (2020/03/27) javadoc用のjdk8に対応します。
    028
    029/**
    030 * システムのベースフォルダ基準で、各種パスを管理するクラスです。
    031 *
    032 *<pre>
    033 * 本システムでは、ベースフォルダを基準として、各種管理フォルダを規定しています。
    034 * それらのパスオブジェクトを管理します。
    035 *
    036 *</pre>
    037 *
    038 * <table class="plain" style="font-family: monospace;">
    039 *  <caption>各種管理フォルダの規定</caption>
    040 *  <tr><th>フォルダ        </th><th>説明</th></tr>
    041 *  <tr><td>BASE_PATH   </td><td>基本となるフォルダパス</td></tr>
    042 *  <tr><td>SUB_PATH    </td><td>ベースパスの下位のサブパス。これがスキャン対象になる。</td></tr>
    043 *  <tr><td>WORK_PATH   </td><td>中間パス。サブパスのファイルを一旦このワークに移動してから、取込処理を行います</td></tr>
    044 *  <tr><td>OK_PATH             </td><td>処理が成功した場合のファイルの移動先</td></tr>
    045 *  <tr><td>NG_PATH             </td><td>処理が失敗した場合のファイルの移</td></tr>
    046 *</table>
    047 *
    048 * @og.rev 7.0.0.0 (2017/07/07) 新規作成
    049 *
    050 * @version  7.0
    051 * @author   Kazuhiko Hasegawa
    052 * @since    JDK1.8,
    053 */
    054public final class BasePath {
    055        private static final XLogger LOGGER= XLogger.getLogger( BasePath.class.getName() );             // ログ出力
    056
    057        /** システム依存の改行記号(String)。        */
    058        public static final String CR = System.getProperty("line.separator");
    059
    060        /** BASEフォルダの相対パスの処理ﾌｫﾙﾀﾞ(WORK)の初期値 {@value} */
    061        public static final String DEF_WORK_DIR = "work" ;
    062        /** BASEフォルダの相対パスの処理済ﾌｫﾙﾀﾞ(正常)の初期値 {@value} */
    063        public static final String DEF_OK_DIR   = "bkup_ok" ;
    064        /** BASEフォルダの相対パスの処理済ﾌｫﾙﾀﾞ(異常)の初期値 {@value} */
    065        public static final String DEF_NG_DIR   = "bkup_ng" ;
    066
    067//      /** BASEフォルダの相対パスのログフォルダ {@value} */
    068//      public static final String DEF_LOG_DIR  = "log" ;
    069
    070//      /** ﾛｸﾞﾌｧｲﾙ名 java.util.logging.FileHandler の pattern の定義 {@value} */
    071//      public static final String LOG_FILE             = "fileExec_%u%g.log" ;
    072
    073//      // ﾛｸﾞﾌｫﾙﾀﾞをﾍﾞｰｽﾌｫﾙﾀﾞの下に作成する場合、ﾍﾞｰｽﾌｫﾙﾀﾞでﾕﾆｰｸに設定する。ｷｰは、ﾍﾞｰｽﾌｫﾙﾀﾞ
    074//      private static final ConcurrentMap<String,Handler> HANDLER_MAP = new ConcurrentHashMap<>();
    075
    076        /** ベースパス  */
    077        public final Path BASE_PATH     ;
    078
    079        /** サブパス(実際にｽｷｬﾝを行うﾄｯﾌﾟﾊﾟｽ)  */
    080        public final Path SUB_PATH      ;
    081
    082        /** 処理ﾌｫﾙﾀﾞ(WORK)のパス  */
    083        public final Path WORK_PATH     ;
    084        /** 処理済ﾌｫﾙﾀﾞ(正常)のパス  */
    085        public final Path OK_PATH ;
    086        /** 処理済ﾌｫﾙﾀﾞ(異常)のパス  */
    087        public final Path NG_PATH       ;
    088//      /** 処理済ﾌｫﾙﾀﾞ(ログ)のパス  */
    089//      public final Path LOG_PATH      ;
    090
    091        private final Set<String> omitScanDir ;
    092
    093        /**
    094         * フォルダを指定して、オブジェクトを作成します。
    095         *
    096         * DIR_BASE,DIR_SUB,DIR_WORK,DIR_BKUP_OK,DIR_BKUP_NG の順にセットされます。
    097         * 指定されていない(null)の場合は、初期設定を使用します。
    098         *
    099         * @og.rev 7.2.1.0 (2020/03/13) FileUtil#isAbsolute(String)を利用します。
    100         * @og.rev 7.2.2.0 (2020/03/27) javadoc用のjdk8に対応します。
    101         *
    102         * @param       dirs    フォルダ配列
    103         */
    104        public BasePath( final String... dirs ) {
    105                final String baseDir = dirs[0];
    106
    107                BASE_PATH       = FileUtil.writePath( baseDir );                                                // ベースフォルダのチェック
    108
    109                SUB_PATH        = dirs[1] == null || dirs[1].isEmpty()
    110                                                        ? BASE_PATH
    111                                                        : FileUtil.writePath( baseDir , dirs[1] );
    112
    113                WORK_PATH       = makePath( baseDir,dirs[2],DEF_WORK_DIR );
    114                OK_PATH         = makePath( baseDir,dirs[3],DEF_OK_DIR );
    115                NG_PATH         = makePath( baseDir,dirs[4],DEF_NG_DIR );
    116        //      LOG_PATH        = makePath( baseDir,null   ,DEF_LOG_DIR );                              // logﾌｫﾙﾀﾞの作成
    117
    118        //      makeLogger( baseDir );
    119
    120//              // 7.2.2.0 (2020/03/27) javadoc用のjdk8に対応します。
    121//              omitScanDir = Set.of(   WORK_PATH.getFileName().toString()
    122//                                                      ,       OK_PATH.getFileName().toString()
    123//                                                      ,       NG_PATH.getFileName().toString()
    124//      //                                              ,       LOG_PATH.getFileName().toString()
    125//              );
    126
    127                omitScanDir = new HashSet<>();
    128                omitScanDir.add( OK_PATH.getFileName().toString()  );
    129                omitScanDir.add( OK_PATH.getFileName().toString()  );
    130                omitScanDir.add( NG_PATH.getFileName().toString()  );
    131        //      omitScanDir.add( LOG_PATH.getFileName().toString() );
    132
    133                LOGGER.debug( () ->     "③ [BasePath]"                                          + CR
    134                                                +       "\t  BASE_PATH="        + BASE_PATH             + CR
    135                                                +       "\t  SUB_PATH ="        + SUB_PATH              + CR
    136                                                +       "\t  WORK_PATH="        + WORK_PATH             + CR
    137                                                +       "\t  OK_PATH  ="        + OK_PATH               + CR
    138                                                +       "\t  NG_PATH  ="        + NG_PATH
    139                );
    140        }
    141
    142        /**
    143         * WORK,OK,NG の各Pathパスを生成するロジックのまとめメソッド。
    144         *
    145         * パスの元となるフォルダ(dir)が、nullかゼロ文字列の場合は、ベース＋初期DIRを返し
    146         * dirが、絶対パスの場合は、そのパスを、そうでない場合は、baseDir + dir でパスを生成します。
    147         * ここで生成するパスは、FileUtil#writePath で指定し、フォルダ作成も同時に行います。
    148         *
    149         * @og.rev 7.2.1.0 (2020/03/13) FileUtil#isAbsolute(String)を利用します。
    150         *
    151         * @param       baseDir 基準フォルダ
    152         * @param       dir             パスの元となるフォルダ
    153         * @param       def             パスが未設定時のフォルダ
    154         * @return      path    生成したPathオブジェクト
    155         */
    156        private Path makePath( final String baseDir , final String dir , final String def ) {
    157                return ( dir == null || dir.isEmpty() )
    158                                        ? FileUtil.writePath( baseDir , def )                   // ベース＋初期DIR
    159                                        : FileUtil.isAbsolute( dir )
    160                                                ? FileUtil.writePath( dir )                                     // 絶対パス
    161                                                : FileUtil.writePath( baseDir , dir );          // ベース＋相対パス
    162        }
    163
    164//      /**
    165//       * ﾍﾞｰｽﾌｫﾙﾀﾞの下に、ﾛｸﾞﾌｫﾙﾀﾞを作成します。
    166//       *
    167//       * ﾛｸﾞﾌｫﾙﾀﾞをﾍﾞｰｽﾌｫﾙﾀﾞの下に作成する場合、ﾍﾞｰｽﾌｫﾙﾀﾞでﾕﾆｰｸに設定しないと
    168//       * ﾛｰﾃｰｼｮﾝされたﾛｸﾞﾌｧｲﾙが作成されてしまいます。
    169//       * ﾍﾞｰｽﾌｫﾙﾀﾞをｷｰにMapでｷｬｯｼｭします。
    170//       *
    171//       * @og.rev 7.2.1.0 (2020/03/13) 新規追加
    172//       *
    173//       * @param       baseDir 基準フォルダ
    174//       */
    175//      private void makeLogger( final String baseDir ) {
    176//              // ﾍﾞｰｽﾌｫﾙﾀﾞの下に、ﾛｸﾞﾌｫﾙﾀﾞを作成します。ﾍﾞｰｽﾌｫﾙﾀﾞごとに設定します。
    177//              HANDLER_MAP.computeIfAbsent( baseDir , dir -> {
    178//                      FileHandler han = null;
    179//                      try {
    180//                              han = new FileHandler( LOG_PATH.resolve( LOG_FILE ).toString(), 5000000L, 1, true );
    181//                              han.setEncoding( "UTF-8" );
    182//                              han.setFormatter( new java.util.logging.SimpleFormatter() );
    183//                              han.setLevel​(XLogger.L_DEBUG );
    184//
    185//                              final Logger log = Logger.getGlobal();
    186//                              if( log.getUseParentHandlers() ) {
    187//                                      Logger plog = log.getParent();
    188//                                      plog.addHandler( han );
    189//                              }
    190//                      }
    191//                      catch( final IOException ex ) {
    192//                              ex.printStackTrace();
    193//                      }
    194//                      return han ;
    195//              } );
    196//      }
    197
    198        /**
    199         * WORK,OK,NG,LOG をスキャン対象外にするための簡易判定メソッド。
    200         *
    201         * 指定のパスが、WORK_PATH,OK_PATH,NG_PATH,LOG_PATH の場合は、false を返します。
    202         *
    203         * @param       path    判定するパス
    204         * @return      スキャン対象なら、true
    205         */
    206        public boolean isScanPath( final Path path ) {
    207                final String fname = path.getFileName().toString();
    208
    209                return !omitScanDir.contains( fname );
    210
    211//              return ! (      fname.equalsIgnoreCase( WORK_PATH.getFileName().toString() )    ||
    212//                                      fname.equalsIgnoreCase( OK_PATH.getFileName().toString() )              ||
    213//                                      fname.equalsIgnoreCase( NG_PATH.getFileName().toString() )              ||
    214//                                      fname.equalsIgnoreCase( LOG_PATH.getFileName().toString() )
    215//                              ) ;
    216        }
    217}