    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 */
    020public class FileOperationFactory {
    021        private static final int BUFFER_MIDDLE = 200;
    022
    023        /**
    024         * インスタンス生成
    025         *
    026         * 引数を元に、ファイル操作インスタンスを生成します。
    027         * ローカルのファイル操作を行うFileOperationクラスを返します。
    028         *
    029         * @param path ファイルパス
    030         * @return ファイル操作インスタンス
    031         */
    032        public static FileOperation newStorageOperation(final String path) {
    033//              return newStorageOperation( (String)null, null, path.toString());
    034                return newStorageOperation( (String)null, null, path);
    035        }
    036
    037        /**
    038         * インスタンス生成
    039         *
    040         * 引数を元に、ファイル操作クラスを生成します。
    041         * プラグインとバケットを指定する事で、plugin.cloud内のクラウド用のクラスを返します。
    042         *
    043         * ディレクトリとファイル名からパスを生成します。
    044         *
    045         * @param plugin 利用プラグイン
    046         * @param buket バケット名
    047         * @param dir ディレクトリ
    048         * @param fileName ファイル名
    049         * @return ファイル操作インスタンス
    050         */
    051        public static FileOperation newStorageOperation(final String plugin, final String buket, final String dir, final String fileName) {
    052                final StringBuilder path = new StringBuilder(BUFFER_MIDDLE);
    053                path.append( dir );
    054
    055                if(fileName != null) {
    056                        path.append(File.separator).append(fileName);
    057                }
    058
    059                return newStorageOperation(plugin, buket, path.toString());
    060        }
    061
    062        /**
    063         * インスタンス生成
    064         *
    065         * 引数を元に、ファイル操作クラスを生成します。
    066         * プラグインとバケットを指定する事で、plugin.cloud内のクラウド用のクラスを返します。
    067         * プラグインがnull、もしくはDEFAULTの場合は標準のFileOperation(ローカルファイル用)を返します。
    068         *
    069         * @param plugin 利用プラグイン
    070         * @param buket バケット名
    071         * @param path ファイルパス
    072         * @return ファイル操作インスタンス
    073         */
    074        public static FileOperation newStorageOperation(final String plugin, final String buket, final String path) {
    075                FileOperation rtn;
    076                String cloudTarget = null;
    077
    078                final Object[] args = new Object[] { buket, path };
    079
    080                // 対象のクラウドサービスを取得(大文字化)。
    081                // 未指定の場合は、ローカルディレクトリを利用。
    082                if ( plugin != null && plugin.length() > 0 ) {
    083                        cloudTarget = plugin.toUpperCase( Locale.JAPAN );
    084                }
    085
    086                try {
    087                        final StringBuilder sb = new StringBuilder(BUFFER_MIDDLE);
    088
    089                        if (StringUtil.isNull(cloudTarget) || "DEFAULT".equals(cloudTarget)) {
    090                                sb.append("org.opengion.fukurou.model.FileOperation");
    091                        } else {
    092                                sb.append("org.opengion.plugin.cloud.");
    093                                sb.append("FileOperation_");
    094                                sb.append(cloudTarget);
    095                        }
    096
    097                        rtn = (FileOperation) Class.forName(sb.toString())
    098                                        .getConstructor(String.class, String.class)
    099                                        .newInstance(args);
    100//              } catch (Exception e) {
    101                } catch (final Throwable th) {
    102                        // キャッチしたエラー情報をスロー
    103                        throw new RuntimeException(th);
    104                }
    105
    106                return rtn;
    107        }
    108
    109        /**
    110         * インスタンス生成
    111         *
    112         * 引数を元に、ファイル操作クラスを生成します。
    113         * 与えたfileオブジェクトがFileOperationだった場合は、プラグインとバケットを取得して
    114         * それに基づいたFileOperationを返します。
    115         * 標準のFileの場合は、defaultのFileOperationを返します。
    116         * 元がnullの場合はnullを返します。
    117         *
    118         * @param file コピー元
    119         * @param dir 親パス(ディレクトリ)
    120         * @param fileName 子パス
    121         * @return 設定をコピーしたのFileOperation
    122         */
    123        public static FileOperation newStorageOperation(final File file, final String dir, final String fileName) {
    124                String plugin = null;
    125                String buket = null;
    126
    127                if( file == null) { return null; }
    128
    129                // FileOperation型の場合にプラグインを判定する
    130                if( file instanceof FileOperation ) {
    131                        plugin = ((FileOperation)file).getPlugin();
    132                        buket = ((FileOperation)file).getBucket();
    133                }
    134
    135                return newStorageOperation( plugin, buket, dir, fileName);
    136        }
    137
    138        /**
    139         * インスタンス生成。
    140         *
    141         * コピーするタイプで、子パスを与えないパターンです。
    142         *
    143         * @param file コピー元
    144         * @param path パス
    145         * @return 設定をコピーしたのFileOperation
    146         */
    147        public static FileOperation newStorageOperation(final File file, final String path) {
    148                return newStorageOperation( file, path, null);
    149        }
    150}