001package org.opengion.fukurou.model;
002
003import java.io.File;
004import java.io.FileFilter;
005import java.io.FileNotFoundException;
006import java.io.IOException;
007import java.io.InputStream;
008
009/**
010 * CloudFileOperation用のファイル情報の格納クラス
011 *
012 * listFilesで取得した、ディレクトリとファイル一覧情報を格納します。
013 *
014 * パフォーマンスや分かりやすさを考慮してCloudFileOperationからは分離しています
015 *
016 * @og.group ファイル操作
017 *
018 * @og.rev 5.10.8.0 (2019/02/01) 新規作成
019 * @og.rev 5.10.9.0 (2019/03/01) 変更対応
020 * @author oota
021 * @since JDK7.0
022 */
023public class FileOperationInfo extends CloudFileOperation {
024        //* このプログラムのVERSION文字列を設定します。{@VALUE} */
025        private static final String VERSION = "7.2.9.4 (2020/11/20)" ;
026        private static final long serialVersionUID = 729420201120L ;
027
028        /** クラス変数 */
029        private final String plugin;
030
031        private long size;
032        private long lastModified;
033        private boolean isFile;
034        private boolean isDirectory;
035        private FileOperation file;
036
037        /**
038         * コンストラクタ
039         *
040         * 生成時の初期処理。
041         *
042         * @param plugin プラグイン名
043         * @param bucket バケット名
044         * @param path ファイルパス
045         */
046        public FileOperationInfo(final String plugin, final String bucket, final String path) {
047                super(bucket, path);
048                this.plugin = plugin;
049                size = 0;
050                lastModified = 0;
051                isFile = false;
052                isDirectory = false;
053                file = null;
054        }
055
056        /**
057         * FileOperationクラスの生成
058         *
059         * 呼び出し時に、FileOperationインスタンスが未生成の場合は、
060         * 生成を行います。
061         */
062        private void setFileOperation() {
063                if(file == null) {
064                        file = FileOperationFactory.newStorageOperation( plugin, conBucket, conPath );
065                }
066        }
067
068        /** Method */
069        /**
070         * 書き込み処理
071         *
072         * InputStreamのデータを書き込みます。
073         *
074         * @param is 書き込みデータのInputStream
075         * @throws IOException ファイル関連エラー情報
076         */
077        @Override
078        public void write(final InputStream is) throws IOException {
079                setFileOperation();
080                file.write(is);
081        }
082
083        /**
084         * 読み込み処理
085         *
086         * データを読み込み、InputStreamとして、返します。
087         *
088         * @return 読み込みデータのInputStream
089         * @throws FileNotFoundException ファイル非存在エラー情報
090         */
091        @Override
092        public InputStream read() throws FileNotFoundException {
093                setFileOperation();
094                return file.read();
095        }
096
097        /**
098         * 削除処理
099         *
100         * ファイルを削除します。
101         *
102         * @return 成否フラグ
103         */
104        @Override
105        public boolean delete() {
106                setFileOperation();
107                return file.delete();
108        }
109
110        /**
111         * コピー処理
112         *
113         * ファイルを指定先に、コピーします。
114         *
115         * @param afPath コピー先
116         * @return 成否フラグ
117         */
118        @Override
119        public boolean copy(final String afPath) {
120                setFileOperation();
121                return file.copy(afPath);
122        }
123
124        /**
125         * 一覧取得
126         *
127         * 1つ下の、ディレクトリ・ファイル一覧を取得します。
128         *
129         * @param filter フィルタ情報
130         * @return ファイル一覧
131         */
132        @Override
133        public File[] listFiles(final FileFilter filter) {
134                setFileOperation();
135                return file.listFiles(filter);
136        }
137
138        /**
139         * ファイルサイズ取得
140         *
141         * ファイルサイズを取得します。
142         *
143         * @return ファイルサイズ
144         */
145        @Override
146        public long length() {
147                return size;
148        }
149
150        /**
151         * ファイルサイズ設定
152         *
153         * ファイルサイズを設定します。
154         *
155         * @param size ファイルサイズ
156         */
157        public void setSize(final long size) {
158                this.size = size;
159        }
160
161        /**
162         * 最終更新時刻の取得
163         *
164         * 最終更新時刻を取得します。
165         *
166         * @return 最終更新時刻
167         */
168        @Override
169        public long lastModified() {
170                return lastModified;
171        }
172
173        /**
174         * 最終更新時刻の設定
175         *
176         * 最終更新時刻を設定します。
177         *
178         * @param lastModified 最終更新時刻
179         */
180        public void setLastModifiedValue(final long lastModified) {
181                this.lastModified = lastModified;
182        }
183
184        /**
185         * ファイル判定取得
186         *
187         * ファイルであるかの判定を返します。
188         *
189         * @return ファイル判定
190         */
191        @Override
192        public boolean isFile() {
193                return isFile;
194        }
195
196        /**
197         * ファイル判定設定
198         *
199         * ファイルであるかの判定を設定します。
200         *
201         * @param isFile ファイル判定
202         */
203        public void setFile(final boolean isFile) {
204                this.isFile = isFile;
205        }
206
207        /**
208         * ディレクトリ判定取得
209         *
210         * ディレクトリであるかの判定を返します。
211         *
212         * @return ディレクトリ判定
213         */
214        @Override
215        public boolean isDirectory() {
216                return isDirectory;
217        }
218
219        /**
220         * ディレクトリ判定設定
221         *
222         * ディレクトリであるかの判定を設定します。
223         *
224         * @param isDirectory ディレクトリ判定
225         */
226        public void setDirectory(final boolean isDirectory) {
227                this.isDirectory = isDirectory;
228        }
229
230        /**
231         * 親情報の取得
232         *
233         * 親情報を返します。
234         *
235         * @return 親情報
236         */
237        @Override
238        public File getParentFile() {
239                 return  FileOperationFactory.newStorageOperation( file , this.getParent() );
240        }
241
242        /**
243         * このオブジェクトと他のオブジェクトが等しいかどうかを示します。
244         * インタフェース Comparable の 実装に関連して、再定義しています。
245         *
246         * @og.rev 7.2.9.4 (2020/11/20) spotbugs:スーパークラスの equals メソッドをオーバーライドしていないクラス
247         *
248         * @param   object 比較対象の参照オブジェクト
249         *
250         * @return      引数に指定されたオブジェクトとこのオブジェクトが等しい場合は true、そうでない場合は false
251         */
252        @Override
253        public boolean equals( final Object object ) {
254                return object instanceof File && super.equals( object );
255        }
256
257        /**
258         * オブジェクトのハッシュコード値を返します。
259         * このメソッドは、java.io.File のハッシュ値を返すことで、equals メソッドとの整合性を取っています。
260         *
261         * @og.rev 7.2.9.4 (2020/11/20) spotbugs:equals メソッドは定義していますが hashCode メソッドは定義していないクラス
262         *
263         * @return  このオブジェクトのハッシュコード値
264         */
265        @Override
266        public int hashCode() {
267                return super.hashCode() ;                               // PMD:Overriding method merely calls super が出る。多分定義不要
268        }
269
270//      // テスト用メソッドです
271//      public static void main(String[] args) {
272//              System.out.println("start");
273//
274//              FileOperation file = new FileOperationInfo("aws", "otest20190205", "sample/test.txt");
275//
276//              File parent = file.getParentFile();
277//              System.out.println(parent.getPath());
278//              System.out.println(parent.isDirectory());
279//              System.out.println(parent.isFile());
280//
281//              System.out.println("end");
282//      }
283}