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