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 */ 016 package org.opengion.fukurou.process; 017 018 import org.opengion.fukurou.util.FileUtil; 019 import org.opengion.fukurou.util.Closer; 020 import org.opengion.fukurou.util.HybsDateUtil; 021 022 import org.opengion.fukurou.security.HybsCryptography ; // 5.7.2.1 (2014/01/17) 023 024 import java.io.File; 025 import java.io.BufferedReader; 026 import java.io.IOException; 027 // import java.util.Date; 028 // import java.util.Locale; 029 // import java.text.DateFormat; 030 // import java.text.SimpleDateFormat; 031 032 /** 033 * FileLineModel は、LineModel を継承した ファイルリスト専用の 034 * LineModel の実?ラスです? 035 * 036 * FileLineModel オブジェクトには、ファイル属?(Level,File,Length,Modify) 037 * が設定されます? 038 * 039 * ??タの?行??FileLineModel に割り当てます? 040 * カラ?号は? から始まります?カラ?よりカラ?号を求める?合に? 041 * 存在しな??合??1 を返します? 042 * カラ?号?-1 の場合?、??行いません? 043 * 044 * 注意:このクラスは、同期??れて?せん? 045 * 046 * @version 4.0 047 * @author Kazuhiko Hasegawa 048 * @since JDK5.0, 049 */ 050 public class FileLineModel extends LineModel { 051 // 5.7.2.1 (2014/01/17) MD5 ?追? 052 // private static final String[] KEYS = new String[] { "Level","File","Length","Modify","LineCnt","Biko" }; 053 private static final String[] KEYS = new String[] { "Level","File","Length","Modify","LineCnt","Biko","MD5" }; 054 055 private static final int LEVEL = 0; 056 private static final int FILE = 1; 057 private static final int LENGTH = 2; 058 private static final int MODIFY = 3; 059 private static final int LINECNT = 4; 060 private static final int BIKO = 5; 061 private static final int MD5 = 6; // 5.7.2.1 (2014/01/17) 062 063 // private final DateFormat formatter = new SimpleDateFormat( "yyyy/MM/dd HH:mm:ss",Locale.JAPAN ); 064 065 private final boolean useLineCnt ; 066 private final boolean useMD5 ; // 5.7.2.1 (2014/01/17) MD5 ?追? 067 068 /** 069 * コンストラクターです? 070 * ラインカウントとMD5計算?初期値は、false です? 071 * 072 * @og.rev 5.7.2.1 (2014/01/17) MD5対? 073 * 074 */ 075 public FileLineModel() { 076 // this( false ); 077 this( false,false ); // 5.7.2.1 (2014/01/17) 078 // super(); 079 // init( KEYS ); 080 } 081 082 /** 083 * ラインカウント?有無を指定した?コンストラクターです? 084 * MD5計算?初期値は、false です? 085 * 086 * @og.rev 4.2.2.0 (2008/05/10) 行数カウント?使用有無 087 * @og.rev 5.7.2.1 (2014/01/17) MD5対? 088 * 089 * @param isLineCnt 行数カウント?使用有無 090 */ 091 public FileLineModel( final boolean isLineCnt ) { 092 this( isLineCnt,false ); // 5.7.2.1 (2014/01/17) 093 094 // 4.3.4.4 (2009/01/01) 095 // super(); 096 // useLineCnt = isLineCnt; 097 // init( KEYS ); 098 } 099 100 /** 101 * ラインカウント?有無と、MD5計算?有無を指定した?コンストラクターです? 102 * 103 * @og.rev 5.7.2.1 (2014/01/17) 新規追?MD5対? 104 * 105 * @param isLineCnt 行数カウント?使用有無 106 * @param isMD5 ファイルのMD5の使用有無 107 */ 108 public FileLineModel( final boolean isLineCnt,final boolean isMD5 ) { 109 // 4.3.4.4 (2009/01/01) 110 // super(); 111 useLineCnt = isLineCnt; 112 useMD5 = isMD5; // 5.7.2.1 (2014/01/17) 113 init( KEYS ); 114 } 115 116 /** 117 * LineModel を?に、FileLineModel を構築します? 118 * これは、?ファイル等にセーブされた FileLineModel 形式を 119 * ?戻す簡易コンストラクタです? 120 * 121 * @og.rev 4.2.3.0 (2008/05/26) 新規追? 122 * @og.rev 5.7.2.1 (2014/01/17) MD5の設定??? 123 * 124 * @param model ??LineModel 125 */ 126 public FileLineModel( final LineModel model ) { 127 // 4.3.4.4 (2009/01/01) 128 // super(); 129 init( model.getNames() ); 130 131 Object[] obj = model.getValues(); 132 133 setValue( LEVEL ,Integer.valueOf( (String)obj[LEVEL] ) ); 134 setValue( FILE ,new File((String)obj[FILE]) ); 135 setValue( LENGTH ,Long.valueOf( (String)obj[LENGTH] ) ); 136 setValue( MODIFY ,(String)obj[MODIFY] ); 137 138 String cnt = (String)obj[LINECNT] ; 139 // useLineCnt = ( cnt != null && cnt.length() > 0 && ! "null".equals( cnt ) ); 140 useLineCnt = ( cnt != null && cnt.length() > 0 && ! "null".equalsIgnoreCase( cnt ) ); 141 if( useLineCnt ) { setValue( LINECNT ,cnt ); } 142 143 setValue( BIKO ,(String)obj[BIKO] ); 144 145 // 5.7.2.1 (2014/01/17) 146 String md5Data = (String)obj[MD5] ; 147 useMD5 = ( md5Data != null && md5Data.length() > 0 && ! "null".equalsIgnoreCase( md5Data ) ); 148 if( useMD5 ) { setValue( MD5 ,md5Data ); } 149 } 150 151 /** 152 * File属?値をセ?します? 153 * LEVEL,FILE,LENGTH,MODIFY,LINECNT,MD5 の??を設定します? 154 * 155 * @og.rev 4.2.2.0 (2008/05/10) 行数カウント?使用有無 156 * @og.rev 5.5.7.2 (2012/10/09) HybsDateUtil を利用するように修正します? 157 * @og.rev 5.7.2.1 (2014/01/17) MD5計算???追? 158 * 159 * @param level ファイルの?レクトリ階層 160 * @param file ファイルオブジェク? 161 */ 162 public void setFileVals( final int level, final File file ) { 163 setValue( LEVEL ,Integer.valueOf( level ) ); 164 setValue( FILE ,file ); 165 setValue( LENGTH ,Long.valueOf( file.length() ) ); 166 // setValue( MODIFY ,formatter.format( new Date( file.lastModified() ) ) ); 167 setValue( MODIFY ,HybsDateUtil.getDate( file.lastModified(),"yyyy/MM/dd HH:mm:ss" ) ); // 5.5.7.2 (2012/10/09) HybsDateUtil を利用する 168 if( useLineCnt ) { 169 setValue( LINECNT ,getLineCnt( file ) ); 170 } 171 172 // 5.7.2.1 (2014/01/17) MD5計算がtrue で、かつ、ファイルの場合?MD5 計算を行います? 173 if( useMD5 && file.isFile() ) { 174 setValue( MD5 ,HybsCryptography.getMD5( file ) ); 175 } 176 } 177 178 /** 179 * File属?値をセ?します? 180 * 181 * @param file ファイルオブジェク? 182 */ 183 public void setFile( final File file ) { 184 setValue( FILE,file ); 185 } 186 187 /** 188 * 備???属?値をセ?します? 189 * 190 * @og.rev 4.2.2.0 (2008/05/10) 行数カウント?使用有無 191 * 192 * @param biko 備??? 193 */ 194 public void setBiko( final String biko ) { 195 setValue( BIKO,biko ); 196 } 197 198 /** 199 * レベル File属?値を取得します? 200 * 201 * @return ファイルの?レクトリ階層 202 */ 203 public int getLebel() { 204 return ((Integer)getValue( LEVEL )).intValue(); 205 } 206 207 /** 208 * ファイルを取得します? 209 * 210 * @return ファイル 211 */ 212 public File getFile() { 213 return (File)getValue( FILE ); 214 } 215 216 /** 217 * ファイルサイズ File属?値を取得します? 218 * 219 * @return ファイルサイズ 220 */ 221 public long getLength() { 222 return ((Long)getValue( LENGTH )).longValue(); 223 } 224 225 /** 226 * 更新日?File属?値を取得します? 227 * 228 * @return 更新日?yyyy/MM/dd HH:mm:ss) 229 */ 230 public String getModify() { 231 return (String)getValue( MODIFY ); 232 } 233 234 /** 235 * MD5 File属?値を取得します? 236 * ただし?useMD5 ?true でな?値は返しません? 237 * 238 * @og.rev 5.7.2.1 (2014/01/17) 新規追?MD5対? 239 * 240 * @return MD5の値 241 */ 242 public String getMD5() { 243 return (String)getValue( MD5 ); 244 } 245 246 /** 247 * 行数を取得します? 248 * 249 * @param file 行数を数えるファイルオブジェク? 250 * 251 * @return 行数 252 */ 253 private String getLineCnt( final File file ) { 254 int cnt = 0; 255 256 BufferedReader reader = FileUtil.getBufferedReader( file,"JISAutoDetect" ); 257 258 try { 259 if( ! file.isDirectory() ) { 260 // String line ; // findbugs で、意味の無?入チェ?がかかりますが、OKです? 261 // while((line = reader.readLine()) != null) { 262 // cnt++; 263 // } 264 while( reader.readLine() != null) { 265 cnt++; 266 } 267 } 268 } 269 catch( IOException ex ) { 270 String errMsg = "ファイルカウント中に例外が発生しました?" + file + "]" ; 271 throw new RuntimeException( errMsg,ex ); 272 } 273 finally { 274 Closer.ioClose( reader ) ; 275 } 276 277 return String.valueOf( cnt ); 278 } 279 }