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