001package org.opengion.fukurou.model;
002
003import java.io.File;
004import java.util.Locale;
005import org.opengion.fukurou.util.StringUtil;
006
007
008/**
009 * ファイル操作のファクトリークラス
010 *
011 * デフォルトはローカルのファイル操作を行うFileOperationクラスを生成します。
012 * 利用プラグイン、バケット、パス等を指定する事でクラウドのオブジェクトストレージに対応した
013 * クラスを生成します。
014 *
015 * @og.rev 5.10.8.0 (2019/02/01) 新規作成
016 * @og.rev 5.10.9.0 (2019/03/01) 変更対応
017 * @author oota
018 * @since JDK7.0
019 */
020// public class FileOperationFactory {
021public final class FileOperationFactory {                                       // 7.2.9.4 (2020/11/20) PMD:A class which only has private constructors should be final
022        private static final int BUFFER_MIDDLE = 200;
023
024        /**
025         * オブジェクトを作らせない為の、private コンストラクタ
026         *
027         * @og.rev 7.2.9.4 (2020/11/20) オブジェクトを作らせない為の、private コンストラクタ
028         */
029        private FileOperationFactory() {}
030
031        /**
032         * インスタンス生成
033         *
034         * 引数を元に、ファイル操作インスタンスを生成します。
035         * ローカルのファイル操作を行うFileOperationクラスを返します。
036         *
037         * @param path ファイルパス
038         * @return ファイル操作インスタンス
039         */
040        public static FileOperation newStorageOperation(final String path) {
041//              return newStorageOperation( (String)null, null, path.toString());
042                return newStorageOperation( (String)null, null, path);
043        }
044
045        /**
046         * インスタンス生成
047         *
048         * 引数を元に、ファイル操作クラスを生成します。
049         * プラグインとバケットを指定する事で、plugin.cloud内のクラウド用のクラスを返します。
050         *
051         * ディレクトリとファイル名からパスを生成します。
052         *
053         * @param plugin 利用プラグイン
054         * @param buket バケット名
055         * @param dir ディレクトリ
056         * @param fileName ファイル名
057         * @return ファイル操作インスタンス
058         */
059        public static FileOperation newStorageOperation(final String plugin, final String buket, final String dir, final String fileName) {
060                final StringBuilder path = new StringBuilder(BUFFER_MIDDLE);
061                path.append( dir );
062
063                if(fileName != null) {
064                        path.append(File.separator).append(fileName);
065                }
066
067                return newStorageOperation(plugin, buket, path.toString());
068        }
069
070        /**
071         * インスタンス生成
072         *
073         * 引数を元に、ファイル操作クラスを生成します。
074         * プラグインとバケットを指定する事で、plugin.cloud内のクラウド用のクラスを返します。
075         * プラグインがnull、もしくはDEFAULTの場合は標準のFileOperation(ローカルファイル用)を返します。
076         *
077         * @param plugin 利用プラグイン
078         * @param buket バケット名
079         * @param path ファイルパス
080         * @return ファイル操作インスタンス
081         */
082        public static FileOperation newStorageOperation(final String plugin, final String buket, final String path) {
083                FileOperation rtn;
084                String cloudTarget = null;
085
086                final Object[] args = new Object[] { buket, path };
087
088                // 対象のクラウドサービスを取得(大文字化)。
089                // 未指定の場合は、ローカルディレクトリを利用。
090                if ( plugin != null && plugin.length() > 0 ) {
091                        cloudTarget = plugin.toUpperCase( Locale.JAPAN );
092                }
093
094                try {
095                        final StringBuilder sb = new StringBuilder(BUFFER_MIDDLE);
096
097                        if (StringUtil.isNull(cloudTarget) || "DEFAULT".equals(cloudTarget)) {
098                                sb.append("org.opengion.fukurou.model.FileOperation");
099                        } else {
100                                sb.append("org.opengion.plugin.cloud.")
101                                        .append("FileOperation_")
102                                        .append(cloudTarget);
103                        }
104
105                        rtn = (FileOperation) Class.forName(sb.toString())
106                                        .getConstructor(String.class, String.class)
107                                        .newInstance(args);
108//              } catch (Exception e) {
109                } catch (final Throwable th) {
110                        // キャッチしたエラー情報をスロー
111                        throw new RuntimeException(th);
112                }
113
114                return rtn;
115        }
116
117        /**
118         * インスタンス生成
119         *
120         * 引数を元に、ファイル操作クラスを生成します。
121         * 与えたfileオブジェクトがFileOperationだった場合は、プラグインとバケットを取得して
122         * それに基づいたFileOperationを返します。
123         * 標準のFileの場合は、defaultのFileOperationを返します。
124         * 元がnullの場合はnullを返します。
125         *
126         * @og.rev 7.2.9.4 (2020/11/20) PMD:Avoid declaring a variable if it is unreferenced before a possible exit point.
127         *
128         * @param file コピー元
129         * @param dir 親パス(ディレクトリ)
130         * @param fileName 子パス
131         * @return 設定をコピーしたのFileOperation
132         */
133        public static FileOperation newStorageOperation(final File file, final String dir, final String fileName) {
134                if( file == null) { return null; }
135
136                String plugin = null;
137                String buket = null;
138
139//              if( file == null) { return null; }              // PMD:Avoid declaring a variable if it is unreferenced before a possible exit point.
140
141                // FileOperation型の場合にプラグインを判定する
142                if( file instanceof FileOperation ) {
143                        plugin = ((FileOperation)file).getPlugin();
144                        buket = ((FileOperation)file).getBucket();
145                }
146
147                return newStorageOperation( plugin, buket, dir, fileName);
148        }
149
150        /**
151         * インスタンス生成。
152         *
153         * コピーするタイプで、子パスを与えないパターンです。
154         *
155         * @param file コピー元
156         * @param path パス
157         * @return 設定をコピーしたのFileOperation
158         */
159        public static FileOperation newStorageOperation(final File file, final String path) {
160                return newStorageOperation( file, path, null);
161        }
162}