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.model;
017package org.opengion.cloud;                                             // 8.0.0.2 (2021/10/15) fukurou.model → cloud にパッケージ移動
018
019import java.io.ByteArrayInputStream;
020import java.io.ByteArrayOutputStream;
021import java.io.File;
022import java.io.FileFilter;
023import java.io.FileNotFoundException;
024import java.io.IOException;
025import java.io.InputStream;
026import java.net.URI;
027import java.util.ArrayList;
028import java.util.List;
029import java.util.regex.Matcher;
030import java.util.regex.Pattern;
031
032// import org.opengion.fukurou.system.Closer;                                   // 8.5.4.2 (2024/01/12) PMD 7.0.0 CloseResource 対応
033import org.opengion.fukurou.util.StringUtil;
034import org.opengion.fukurou.system.FileOperation;                               // 8.5.6.0 (2024/02/29) package変更 fukurou.model → fukurou.system
035
036/**
037 * クラウドストレージ対応用の抽象クラスです。
038 * 各ベンダーのストレージに対応したプラグインを作成する場合はこのクラスを継承してください。
039 *
040 *
041 * @og.group ファイル操作
042 *
043 * @og.rev 5.10.8.0 (2019/02/01) 新規作成
044 * @og.rev 5.10.9.0 (2019/03/01) 変更対応
045 * @og.rev 8.0.0.2 (2021/10/15) fukurou.model → cloud にパッケージ移動
046 * @author oota
047 * @since JDK7.0
048 */
049public abstract class CloudFileOperation extends FileOperation {
050        /** このプログラムのVERSION文字列を設定します。{@value} */
051        private static final String VERSION = "8.5.6.1 (2024/03/29)" ;
052        private static final long serialVersionUID = 856120240329L ;
053
054        /** バッファサイズ {@value} */
055        private static final int BUFFER_SIZE = 1024 * 4;
056
057        private static final String UNIMPLEMNTED_ERR="このクラスでは未実装のメソッドです。";
058        private static final char   FS = '/' ;
059        /** 5.10.12.2 (2019/06/17) 相対パス対応「../」と1つ前のディレクトリ情報を抽出(1つ前が先頭の場合は、/ではなく^) */
060        // 7.2.9.4 (2020/11/20) PMD:Variables that are final and static should be all capitals, 'ptnPreDir' is not all capitals.
061//      private static final Pattern ptnPreDir = Pattern.compile("(?<=/|^)[^/]+/\\.\\./");
062        private static final Pattern PTN_PRE_DIR = Pattern.compile("(?<=/|^)[^/]+/\\.\\./");
063
064        /** パス */
065        protected final String conPath;
066        /** バケット名 */
067        protected final String conBucket;
068
069        /**
070         * コンストラクタ
071         *
072         * @param bucket バケット名
073         * @param inPath ファイルパス
074         */
075        public CloudFileOperation( final String bucket, final String inPath ) {
076                super(inPath);
077
078                conPath   = editPath(replaceFileSeparetor(inPath));
079                conBucket = bucket;
080
081                if (StringUtil.isNull(conBucket)) {
082                        final String errMsg = "バケット未指定です。hayabusa利用ではシステム変数の「CLOUD_BUCKET」にバケット名を設定して下さい。";
083                        throw new RuntimeException(errMsg);
084                }
085        }
086
087        // ************* 《FileOperation クラスの継承》*************
088
089        /**
090         * 書き込み処理(評価用)
091         *
092         * Fileを書き込みます。
093         *
094         * @og.rev 8.0.0.1 (2021/10/08) 新規追加
095         * @param inFile 書き込みFile
096         * @throws IOException ファイル関連エラー情報
097         */
098        @Override                       // FileOperation
099        public abstract void write(final File inFile) throws IOException ;
100
101        /**
102         * データ書き込み
103         *
104         * InputStreamのデータを書き込みます。
105         *
106         * @param is 書き込みデータのInputStream
107         * @throws IOException IO関連のエラー情報
108         */
109        @Override                       // FileOperation
110        public abstract void write(InputStream is) throws IOException;
111
112        /**
113         * データ読み込み
114         *
115         * データを読み込み、InputStreamを返します。
116         *
117         * @og.rev 8.5.4.2 (2024/01/12) throws を FileNotFoundException ⇒ IOException に変更
118         *
119         * @return 読み込みデータのInputStream
120         * @throws FileNotFoundException ファイル非存在エラー情報
121         */
122        @Override                       // FileOperation
123//      public abstract InputStream read() throws FileNotFoundException;
124        public abstract InputStream read() throws IOException;
125
126        /**
127         * ファイルコピー
128         *
129         * ファイルを指定先にコピーします。
130         *
131         * @param afPath コピー先
132         * @return 成否フラグ
133         */
134        @Override                       // FileOperation
135        public abstract boolean copy(String afPath);
136
137        /**
138         * ファイル移動
139         *
140         * ファイルを指定先に移動します。
141         *
142         * @param afPath 移動先
143         * @return 成否フラグ
144         */
145        @Override                       // FileOperation
146        public boolean move(final String afPath) {
147                return copy(afPath) && delete();
148
149//              boolean flgRtn = false;
150//
151//              flgRtn = copy(afPath);
152//              if (flgRtn) {
153//                      flgRtn = delete();
154//              }
155//
156//              return flgRtn;
157        }
158
159        /**
160         * 保存先のクラウド判定。
161         *
162         * 判定結果を返します。
163         * trueの場合は、クラウドストレージ保存。
164         * falseの場合は、ローカルに保存です。
165         *
166         * @return クラウドならtrue
167         */
168        @Override                       // FileOperation
169        public boolean isCloud() {
170                return true;
171        }
172
173        // ************* 《File クラスの継承》*************
174        // ************* 《クラウド毎に再定義が必要》*************
175
176        /**
177         * ファイル削除
178         *
179         * ファイルを削除します。
180         *
181         * @return 成否フラグ
182         */
183        @Override                       // File
184        public abstract boolean delete();
185
186        /**
187         * ファイルサイズ取得(Fileクラス)
188         *
189         * ファイルサイズを返します。
190         *
191         * @return ファイルサイズ
192         * @see java.io.File#isFile()
193         */
194        @Override                       // File
195        public abstract long length();
196
197        /**
198         * 最終更新時刻取得(Fileクラス)
199         *
200         * 最終更新時刻を返します。
201         *
202         * @return 最終更新時刻
203         * @see java.io.File#lastModified()
204         */
205        @Override                       // File
206        public abstract long lastModified();
207
208        /**
209         * ファイル判定(Fileクラス)
210         *
211         * ファイルの場合は、trueを返します。
212         *
213         * @return ファイルフラグ
214         * @see java.io.File#isFile()
215         */
216        @Override                       // File
217        public abstract boolean isFile();
218
219        /**
220         * ディレクトリ判定(Fileクラス)
221         *
222         * ディレクトリの場合は、trueを返します。
223         *
224         * @return ディレクトリフラグ
225         * @see java.io.File#isDirectory()
226         */
227        @Override                       // File
228        public abstract boolean isDirectory();
229
230        /**
231         * 一覧取得(Fileクラス)
232         *
233         * パスのファイルと、ディレクトリ一覧を取得します。
234         *
235         * @param filter ファイルフィルター
236         * @return ファイルとティレクトリ一覧
237         * @see java.io.File#listFiles(FileFilter)
238         */
239        @Override                       // File
240        public abstract File[] listFiles(FileFilter filter);
241
242        /**
243         * 親ディレクトリの取得(Fileクラス)
244         *
245         * 親のディレクトリ情報を返します。
246         *
247         * @return 親のディレクトリ
248         * @see java.io.File#getParentFile()
249         */
250        @Override                       // File
251        public abstract File getParentFile();
252
253        // ************* 《File クラスの継承》*************
254        // ************* 《共通定義》*************
255
256        /**
257         * ファイルパス取得(Fileクラス)
258         *
259         * ファイルパスを取得します。
260         *
261         * @return 設定パス
262         * @see java.io.File#getPath()
263         */
264        @Override                       // File
265        public String getPath() {
266                return conPath;
267        }
268
269        /**
270         * 絶対パス取得(Fileクラス)
271         *
272         * 絶対パスを取得します。
273         *
274         * @return 絶対パス
275         * @see java.io.File#getAbsolutePath()
276         */
277        @Override                       // File
278        public String getAbsolutePath() {
279                return conPath;
280        }
281
282        /**
283         * ファイル名取得(Fileクラス)
284         *
285         * ファイル名を取得します。
286         *
287         * @og.rev 8.5.6.1 (2024/03/29) drawName(String) の処理をgetName()に移動
288         *
289         * @return 名称
290         * @see java.io.File#getName()
291         */
292        @Override                       // File
293        public String getName() {
294//              return drawName(conPath);
295                final int kk = conPath.lastIndexOf(FS);                                 // FS はシステム
296
297                return kk > 0 ? conPath.substring(kk + 1) : conPath ;
298        }
299
300        /**
301         * 親のパス取得(Fileクラス)
302         *
303         * 親のパスを取得します。
304         * 継承元の Fileクラスでは、親ディレクトリを示さない場合はnullを返しますが、
305         * ここでは、ファイルセパレータ(/ 固定)があればその上位を、なければ "" を返します。
306         * さらに、実行システムのファイルセパレータが(/)の場合は、先頭に、"/" を追加します。
307         *
308         * @og.rev 8.5.6.1 (2024/03/29) drawParent(String) の処理をgetParent()に移動
309         *
310         * @return 親のパス
311         * @see java.io.File#getParent()
312         */
313        @Override                       // File
314        public String getParent() {
315//              return drawParent(conPath);
316
317                String rtn = "";
318
319                // 8.5.4.2 (2024/01/12) PMD 7.0.0 ShortVariable k ⇒ kk に変更
320                final int kk = conPath.lastIndexOf(FS);
321                if (kk > 0) {
322                        rtn = conPath.substring(0, kk);
323                }
324                // システムが Linux系の場合、先頭に "/" を付けます。
325                if ("/".equals(File.separator)) {       // システム依存のファイル区切り文字との比較
326                        rtn = File.separator + rtn;
327                }
328
329                return rtn;
330        }
331
332        /**
333         * 存在チェック(Fileクラス)
334         *
335         * 存在する場合は、trueを返します。
336         *
337         * @return 存在フラグ
338         * @see java.io.File#exists()
339         */
340        @Override                       // File
341        public boolean exists() {
342                return isDirectory() | isFile();
343        }
344
345        /**
346         * ディレクトリの作成(Fileクラス)
347         *
348         * ※1つのディレクトリのみ作成します。
349         * クラウドストレージにはディレクトリの概念が無いため、
350         * 作成は行わず、trueを返します。
351         *
352         * @return 成否フラグ
353         * @see java.io.File#mkdir()
354         */
355        @Override                       // File
356        public boolean mkdir() {
357                return true;
358        }
359
360        /**
361         * ディレクトリの作成(複数)(Fileクラス)
362         *
363         * ※複数のディレクトリを作成します。
364         * クラウドストレージにはディレクトリの概念が無いため、
365         * 作成は行わず、trueを返します。
366         *
367         * @return 成否フラグ
368         * @see java.io.File#mkdirs()
369         */
370        @Override                       // File
371        public boolean mkdirs() {
372                return true;
373        }
374
375        /**
376         * ファイル名変更(Fileクラス)
377         *
378         * 指定のファイル情報のファイル名に変更します。
379         *
380         * @param dest 変更後のファイル情報
381         * @return 成否フラグ
382         * @see java.io.File#renameTo(File)
383         */
384        @Override                       // File
385        public boolean renameTo(final File dest) {
386                return move(dest.getPath());
387        }
388
389        /**
390         * 書き込み可能フラグ(Fileクラス)
391         *
392         * ※クラウドストレージの場合は、
393         * 存在すればtrueを返します。
394         *
395         * @return 書き込み可能フラグ
396         * @see java.io.File#canWrite()
397         */
398        @Override                       // File
399        public boolean canWrite() {
400                return exists();
401        }
402
403        /**
404         * 読み取り可能フラグ(Fileクラス)
405         *
406         * ※クラウドストレージの場合は、
407         * 存在すればtrueを返します。
408         *
409         * @return 読み取り可能フラグ
410         * @see java.io.File#canRead()
411         */
412        @Override                       // File
413        public boolean canRead() {
414                return exists();
415        }
416
417        /**
418         * 隠しファイルフラグ(Fileクラス)
419         *
420         * ※クラウドストレージの場合は、
421         * 必ずfalseを返します。
422         *
423         * @return 隠しファイルフラグ
424         * @see java.io.File#isHidden()
425         */
426        @Override                       // File
427        public boolean isHidden() {
428                return false;
429        }
430
431        /**
432         * 新規ファイル作成(Fileクラス)
433         *
434         * 既にファイルが存在しない場合のみ、
435         * 空のファイルを作成します。
436         *
437         * @og.rev 8.5.4.2 (2024/01/12) PMD 7.0.0 CloseResource 対応
438         *
439         * @return 指定されたファイルが存在せず、ファイルの生成に成功した場合はtrue、示されたファイルがすでに存在する場合はfalse
440         * @throws IOException ファイル関連エラー情報
441         * @see java.io.File#createNewFile()
442         */
443        @Override                       // File
444        public boolean createNewFile() throws IOException {
445                boolean rtn = false;
446
447                if (!exists()) {
448                        // 8.5.4.2 (2024/01/12) PMD 7.0.0 CloseResource 対応
449//                      InputStream is = null;
450//                      try {
451//                              is = new ByteArrayInputStream(new byte[0]);
452                        try ( InputStream is = new ByteArrayInputStream(new byte[0]) ) {
453                                write(is);
454                                rtn = true;
455                        }
456//                      finally {
457//                              Closer.ioClose(is);
458//                      }
459                }
460
461                return rtn;
462        }
463
464        /**
465         * 最終更新時刻の更新(Fileクラス)
466         *
467         * 最終更新時刻の更新を行います。
468         * ※クラウドストレージの場合は、
469         * 最終更新時刻の更新を行えません。
470         *
471         * @param time 更新する最終更新時刻
472         * @return 成否フラグ
473         * @see java.io.File#setLastModified(long)
474         */
475        @Override                       // File
476        public boolean setLastModified(final long time) {
477                // クラウドストレージでは、setLastModifiedによる、
478                // 最終更新時刻の設定はできないので、
479                // 処理を行わずにtrueを返します。
480                return true;
481        }
482
483        /**
484         * カノニカルファイル情報の取得
485         *
486         * ※ローカルサーバのみ通常ファイルと、
487         * カノニカルファイルで異なります。
488         *
489         * @return カノニカルファイル情報
490         * @throws IOException ファイル関連エラー情報
491         * @see java.io.File#getCanonicalFile()
492         */
493        @Override                       // FileOperation
494        public FileOperation getCanonicalFile() throws IOException {
495                return this;
496        }
497
498        /**
499         * toString(Fileクラス)
500         *
501         * パスを返します。
502         * Fileクラスの拡張なので、path のみを返します。
503         *
504         * @return ファイルパス
505         * @see java.io.File#toString()
506         */
507        @Override                       // File
508        public String toString() {
509                return conPath;
510        }
511
512        /** 共通関数 **/
513
514        /**
515         * ファイルパスの編集
516         *
517         * パスの先頭が「/」の場合は「/」の除去と、「//」を「/」に置換処理の追加。
518         *
519         * @og.rev 5.10.12.2 (2019/06/17) 相対パス対応
520         * @og.rev 8.0.0.1 (2021/10/08) protected → private
521         * @og.rev 8.0.2.0 (2021/11/30) fukurou.util.rTrim(String,char) 使用
522         *
523         * @param path ファイルパス
524         * @return 変更後パス
525         */
526//      protected String editPath(final String path) {
527        private String editPath(final String path) {
528                if (StringUtil.isNull(path)) { return ""; }
529
530                String rtn = path;
531
532                // 「//+」は「/」に置換
533                rtn = rtn.replaceAll("//+", "/");
534                // 先頭が「/」の場合は除去
535//              if ("/".equals(rtn.substring(0, 1))) {
536                if( FS == rtn.charAt(0) ) {
537                        rtn = rtn.substring(1);
538                }
539                // 後尾の「.」は除去
540//              rtn = rTrim(rtn, '.');
541                rtn = StringUtil.rTrim(rtn, '.');               // 8.0.2.0 (2021/11/30)
542                // 後尾の「/」は除去
543//              rtn = rTrim(rtn, FS);
544                rtn = StringUtil.rTrim(rtn, FS);                // 8.0.2.0 (2021/11/30)
545
546                // 5.10.12.2 (2019/06/17)
547                // 「../」の文字列は1つ上のディレクトリに変換を行います。
548                Matcher mtc = PTN_PRE_DIR.matcher(rtn);
549
550                // 「../」が無くなるまで、1つずづ変換します。
551                while(mtc.find()) {
552                        rtn = mtc.replaceFirst("");
553                        mtc = PTN_PRE_DIR.matcher(rtn);
554                }
555
556                return rtn;
557        }
558
559//      /**
560//       * 親のパスを抽出
561//       *
562//       * キーから親のパスを抽出します。
563//       *
564//       * @og.rev 8.0.0.1 (2021/10/08) protected → private
565//       * @og.rev 8.5.6.1 (2024/03/29) drawParent(String) の処理をgetParent()に移動
566//       *
567//       * @param key キー
568//       * @return 親のパス
569//       */
570////    protected String drawParent(final String key) {
571//      private String drawParent(final String key) {
572//              String rtn = "";
573//
574//              // 8.5.4.2 (2024/01/12) PMD 7.0.0 ShortVariable k ⇒ kk に変更
575//              final int kk = key.lastIndexOf(FS);
576//              if (kk > 0) {
577////                    rtn = key.substring(0, key.lastIndexOf(FS));
578//                      rtn = key.substring(0, kk);
579//              }
580//              if ("/".equals(File.separator)) {
581//                      rtn = File.separator + rtn;
582//              }
583//
584//              return rtn;
585//      }
586
587//      /**
588//       * 名称の抽出
589//       *
590//       * 引数のkeyから名称を抽出します。
591//       *
592//       * @og.rev 8.0.0.1 (2021/10/08) protected → private
593//       * @og.rev 8.5.6.1 (2024/03/29) drawName(String) の処理をgetName()に移動
594//       *
595//       * @param key キー(パス)
596//       * @return 名称
597//       */
598////    protected String drawName(final String key) {
599//      private String drawName(final String key) {
600//              String rtn = key;
601//
602//              // 8.5.4.2 (2024/01/12) PMD 7.0.0 ShortVariable k ⇒ kk に変更
603//              final int kk = key.lastIndexOf(FS);
604//              if (kk > 0) {
605////                    rtn = key.substring(key.lastIndexOf(FS) + 1);
606//                      rtn = key.substring(kk + 1);
607//              }
608//              return rtn;
609//      }
610
611        /**
612         * ディレクトリ用のパス編集
613         *
614         * 後尾に「/」がない場合は、付与します。
615         *
616         * @og.rev 8.5.4.2 (2024/01/12) PMD 7.0.0 LinguisticNaming 対応
617         *
618         * @param path パス
619         * @return 後尾に「/」ありのパス
620         */
621//      protected String setDirTail(final String path) {
622        protected String addDirTail(final String path) {
623                if (StringUtil.isNull(path)) { return path; }
624
625                final StringBuilder sb = new StringBuilder(path);
626//              if (!"/".equals(path.substring(path.length() - 1))) {
627                if ( FS != path.charAt(path.length() - 1) ) {
628                        sb.append(FS);
629                }
630                return sb.toString();
631        }
632
633//      /**
634//       * 右側トリム処理
635//       *
636//       * @og.rev 8.0.2.0 (2021/11/30) fukurou.util.rTrim(String,char) 使用
637//       *
638//       * 右側の文字が、指定の文字の場合、除去します。
639//       *
640//       * @param str 対象文字列
641//       * @param chr 指定文字
642//       * @return 右側から指定文字を除去後の文字列
643//       */
644//      protected String rTrim(final String str, final char chr) {
645//              String rtn = str;
646//              int trgPos = 0;
647//              for( int i = str.length() - 1; i >= 0; i--) {
648//                      if (str.charAt(i) == chr) {
649//                              trgPos = i;
650//                              // すべて合致した場合は、から文字を返す
651//                              if (trgPos == 0) {
652//                                      rtn = "";
653//                              }
654//                      } else {
655//                              break;
656//                      }
657//              }
658//
659//              if (trgPos > 0) {
660//                      rtn = str.substring(0, trgPos);
661//              }
662//
663//              return rtn;
664//      }
665
666        /**
667         * ファイル区切り文字変換
668         *
669         * ファイル区切り文字を変換します。
670         *
671         * @og.rev 8.0.0.1 (2021/10/08) protected → private
672         *
673         * @param path 変換前文字列
674         * @return 返還後文字列
675         */
676//      protected String replaceFileSeparetor(final String path) {
677        private String replaceFileSeparetor(final String path) {
678                // 8.5.5.1 (2024/02/29) PMD 7.0.0 OnlyOneReturn メソッドには終了ポイントが 1 つだけ必要
679//              if (StringUtil.isNull(path)) {
680//                      return "";
681//              }
682//              return path.replaceAll("\\\\", "/");
683
684                return StringUtil.isNull(path) ? "" : path.replaceAll("\\\\", "/");
685        }
686
687        /**
688         * フィルター処理
689         *
690         * フィルター処理を行います。
691         *
692         * @param list フィルタを行うリスト
693         * @param filter フィルタ情報
694         * @return フィルタ後のリスト
695         */
696        protected File[] filter(final List<File> list, final FileFilter filter) {
697                // 8.5.4.2 (2024/01/12) PMD 7.0.0 UseDiamondOperator 対応
698//              final List<File> files = new ArrayList<File>();
699                final List<File> files = new ArrayList<>();
700                for( final File file : list ) {
701                        if (filter.accept(file)) {
702                                files.add(file);
703                        }
704                }
705//              return files.toArray(new File[files.size()]);
706                return files.toArray(new File[0]);      // 8.5.4.2 (2024/01/12) PMD 7.0.0 OptimizableToArrayCall 対応
707        }
708
709        /**
710         * ストリームの変換処理
711         *
712         * InputStreamをbyte[]に変換。
713         * InputStreamのサイズ計算に利用。
714         *
715         * @param is byte配列変換するInputStream
716         * @return InpusStreamをbyte配列に変換した値
717         * @throws IOException ファイル関連エラー情報
718         */
719        protected byte[] toByteArray(final InputStream is) throws IOException {
720                // 8.5.4.2 (2024/01/12) PMD 7.0.0 UseTryWithResources 対応
721//              final ByteArrayOutputStream output = new ByteArrayOutputStream();
722//              try {
723                try ( ByteArrayOutputStream output = new ByteArrayOutputStream() ) {
724                        // 7.2.9.4 (2020/11/20) Avoid variables with short names like b   b → bt , n → no
725                        final byte[] bt = new byte[BUFFER_SIZE];
726                        // 8.5.4.2 (2024/01/12) PMD 7.0.0 UnusedAssignment
727//                      int no = 0;
728                        int no ;
729                        while ((no = is.read(bt)) != -1) {
730                                output.write(bt, 0, no);
731                        }
732                        return output.toByteArray();
733                }
734//              finally {
735//                      output.close();
736//              }
737        }
738
739//      /**
740//       * ローカル実行フラグ判定
741//       *
742//       * このabstract クラスの継承クラスはクラウド上で実行されるため、
743//       * falseを返します。
744//       *
745//       * @return ローカル実行フラグ
746//       */
747//      @Override
748//      public boolean isLocal() {
749//              return false;
750//      }
751
752        // ************* 《File クラスの継承》*************
753        // ************* 《クラウド用ファイルクラスに未実装のメソッドの定義》*************
754
755        /**
756         * canExecuteの実行(Fileクラス)
757         *
758         * クラウド側では未実装のメソッドです。
759         *
760         * @return フラグ
761         * @see java.io.File#canExecute()
762         */
763        @Override                       // File
764        public boolean canExecute() {
765                throw new RuntimeException(UNIMPLEMNTED_ERR);
766        }
767
768        /**
769         * deleteOnExitの実行(Fileクラス)
770         *
771         * クラウド側では未実装のメソッドです。
772         *
773         * @see java.io.File#deleteOnExit()
774         */
775        @Override                       // File
776        public void deleteOnExit() {
777                throw new RuntimeException(UNIMPLEMNTED_ERR);
778        }
779
780        /**
781         * getAbsoluteFileの実行(Fileクラス)
782         *
783         * クラウド側では未実装のメソッドです。
784         *
785         * @return Fileオブジェクト
786         * @see java.io.File#getAbsoluteFile()
787         */
788        @Override                       // File
789        public File getAbsoluteFile() {
790                throw new RuntimeException(UNIMPLEMNTED_ERR);
791        }
792
793        /**
794         * getFreeSpaceの実行(Fileクラス)
795         *
796         * クラウド側では未実装のメソッドです。
797         *
798         * @return 数値
799         * @see java.io.File#getFreeSpace()
800         */
801        @Override                       // File
802        public long getFreeSpace() {
803                throw new RuntimeException(UNIMPLEMNTED_ERR);
804        }
805
806        /**
807         * getTotalSpaceの実行(Fileクラス)
808         *
809         * クラウド側では未実装のメソッドです。
810         *
811         * @return 数値
812         * @see java.io.File#getTotalSpace()
813         */
814        @Override                       // File
815        public long getTotalSpace() {
816                throw new RuntimeException(UNIMPLEMNTED_ERR);
817        }
818
819        /**
820         * getUsableSpaceの実行(Fileクラス)
821         *
822         * クラウド側では未実装のメソッドです。
823         *
824         * @return 数値
825         * @see java.io.File#getUsableSpace()
826         */
827        @Override                       // File
828        public long getUsableSpace() {
829                throw new RuntimeException(UNIMPLEMNTED_ERR);
830        }
831
832        /**
833         * isAbsoluteの実行(Fileクラス)
834         *
835         * クラウド側では未実装のメソッドです。
836         *
837         * @return フラグ
838         * @see java.io.File#isAbsolute()
839         */
840        @Override                       // File
841        public boolean isAbsolute() {
842                throw new RuntimeException(UNIMPLEMNTED_ERR);
843        }
844
845        /**
846         * setReadableの実行(Fileクラス)
847         *
848         * クラウド側では未実装のメソッドです。
849         *
850         * @param readable フラグ
851         * @return フラグ
852         * @see java.io.File#setReadable(boolean)
853         */
854        @Override                       // File
855        public boolean setReadable(final boolean readable) {
856                throw new RuntimeException(UNIMPLEMNTED_ERR);
857        }
858
859        /**
860         * setReadableの実行(Fileクラス)
861         *
862         * クラウド側では未実装のメソッドです。
863         *
864         * @param readable フラグ
865         * @param ownerOnly フラグ
866         * @return フラグ
867         * @see java.io.File#setReadable(boolean,boolean)
868         */
869        @Override                       // File
870        public boolean setReadable(final boolean readable, final boolean ownerOnly) {
871                throw new RuntimeException(UNIMPLEMNTED_ERR);
872        }
873
874        /**
875         * setWritableの実行(Fileクラス)
876         *
877         * クラウド側では未実装のメソッドです。
878         *
879         * @param writable フラグ
880         * @return フラグ
881         * @see java.io.File#setWritable(boolean)
882         */
883        @Override                       // File
884        public boolean setWritable(final boolean writable) {
885                throw new RuntimeException(UNIMPLEMNTED_ERR);
886        }
887
888        /**
889         * setWritableの実行(Fileクラス)
890         *
891         * クラウド側では未実装のメソッドです。
892         *
893         * @param writable フラグ
894         * @param ownerOnly フラグ
895         * @return フラグ
896         * @see java.io.File#setWritable(boolean,boolean)
897         */
898        @Override                       // File
899        public boolean setWritable(final boolean writable, final boolean ownerOnly) {
900                throw new RuntimeException(UNIMPLEMNTED_ERR);
901        }
902
903        /**
904         * toURIの実行(Fileクラス)
905         *
906         * クラウド側では未実装のメソッドです。
907         *
908         * @return URI情報
909         * @see java.io.File#toURI()
910         */
911        @Override                       // File
912        public URI toURI() {
913                throw new RuntimeException(UNIMPLEMNTED_ERR);
914        }
915}