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}