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.system;                                            // 8.5.6.0 (2024/02/29) package変更 fukurou.model → fukurou.system
017
018import java.io.File;
019import java.util.Locale;
020// import org.opengion.fukurou.util.StringUtil;                         // 8.5.6.0 (2024/02/29) package変更に伴い、使わない方向で対応
021
022import static org.opengion.fukurou.system.HybsConst.CR;
023
024/**
025 * ファイル操作のファクトリークラス
026 *
027 * デフォルトはローカルのファイル操作を行うFileOperationクラスを生成します。
028 * 利用プラグイン、バケット、パス等を指定する事でクラウドのオブジェクトストレージに対応した
029 * クラスを生成します。
030 * ローカルのファイルを扱いたい場合は、pluginかbucketに空文字列かLOCALを指定してください。
031 *
032 * @og.rev 5.10.8.0 (2019/02/01) 新規作成
033 * @og.rev 5.10.9.0 (2019/03/01) 変更対応
034 * @og.rev 8.0.0.1 (2021/10/08) クラウド修正
035 * @author oota
036 * @since JDK7.0
037 */
038public final class FileOperationFactory {       // 7.2.9.4 (2020/11/20) PMD:A class which only has private constructors should be final
039//      private static final int BUFFER_MIDDLE = 200;
040
041        private static final String CLOUD_PLUGIN = "org.opengion.cloud.FileOperation_" ;
042
043        /**
044         * デフォルトコンストラクターをprivateにして、
045         * オブジェクトの生成をさせないようにする。
046         *
047         * @og.rev 7.2.9.4 (2020/11/20) オブジェクトを作らせない為の、private コンストラクタ
048         */
049        private FileOperationFactory() {}
050
051        /**
052         * インスタンス生成(ローカルFile)。
053         *
054         * 引数を元に、ファイル操作インスタンスを生成します。
055         * ローカルのファイル操作を行うFileOperationクラスを返します。
056         *
057         * @og.rev 8.0.0.1 (2021/10/08) クラウド修正
058         *
059         * @param path ファイルパス
060         * @return ファイル操作インスタンス
061         */
062        public static FileOperation newStorageOperation(final String path) {
063                return new FileOperation( path );
064        }
065
066        /**
067         * インスタンス生成(クラウドFile)。
068         *
069         * 引数を元に、ファイル操作クラスを生成します。
070         * new File( dir,fileName ).getPath() で求めたパスで、生成します。
071         * プラグインとバケットを指定する事で、plugin.cloud内のクラウド用のクラスを返します。
072         *
073         * ディレクトリとファイル名からパスを生成します。
074         *
075         * @og.rev 8.0.0.1 (2021/10/08) クラウド修正
076         *
077         * @param plugin 利用プラグイン
078         * @param bucket バケット名
079         * @param dir ディレクトリ
080         * @param fileName ファイル名
081         * @return ファイル操作インスタンス
082         */
083        public static FileOperation newStorageOperation(final String plugin, final String bucket, final String dir, final String fileName) {
084                return newStorageOperation(plugin, bucket, new File(dir,fileName).getPath());
085        }
086
087        /**
088         * インスタンス生成(クラウドFile/ローカルFile)。
089         *
090         * 引数を元に、ファイル操作クラスを生成します。
091         * プラグインとバケットを指定する事で、plugin.cloud内のクラウド用のクラスを返します。
092         * pluginかbucketに空文字列かLOCALを指定した場合は標準のFileOperation(ローカルファイル用)を返します。
093         *
094         * @og.rev 8.0.0.1 (2021/10/08) クラウド修正
095         *
096         * @param plugin 利用プラグイン
097         * @param bucket バケット名
098         * @param path ファイルパス
099         * @return ファイル操作インスタンス
100         */
101        public static FileOperation newStorageOperation( final String plugin, final String bucket, final String path ) {
102                // bucket の null 判定も条件に加えます。
103//              if( StringUtil.isNull(plugin) || "LOCAL".equalsIgnoreCase(plugin)
104//                      || StringUtil.isNull(bucket) || "LOCAL".equalsIgnoreCase(bucket) ) {            // 8.0.1.0 (2021/10/29)
105//                      return new FileOperation( path );                       // ローカルFile
106//              }
107
108                // 8.5.6.0 (2024/02/29) package変更に伴い、使わない方向で対応
109//              if( StringUtil.isNull( plugin,bucket )
110                if( plugin == null || plugin.isEmpty() || bucket == null || bucket.isEmpty()
111                                || FileOperation.LOCAL.equalsIgnoreCase(plugin)
112                                || FileOperation.LOCAL.equalsIgnoreCase(bucket) ) {
113                        return new FileOperation( path );                       // ローカルFile
114                }
115
116                try {
117                        // 8.5.4.2 (2024/01/12) PMD 7.0.0 UseShortArrayInitializer
118//                      final Object[] args = new Object[] { bucket, path };
119                        final Object[] args = { bucket, path };
120                        final String cloudTarget = plugin.toUpperCase( Locale.JAPAN );  // 先に null 判定済み
121
122                        return (FileOperation)Class.forName( CLOUD_PLUGIN + cloudTarget )
123                                                .getConstructor(String.class, String.class)
124                                                .newInstance( args );
125                }
126                catch ( final Throwable th ) {
127                        final String errMsg = "FileOperation 生成で、失敗しました。" + CR
128                                                                + " plugin=" + plugin + " , bucket=" + bucket + CR
129                                                                + " path=" + path + CR ;
130
131                        throw new RuntimeException( errMsg,th );
132                }
133        }
134
135        /**
136         * 引数を元に、ファイル操作クラスのアドレスを解決した新しいオブジェクトを返します。
137         *
138         * 与えたfileオブジェクトがFileOperationだった場合は、プラグインとバケットを取得して
139         * それに基づいたFileOperationを返します。
140         * 標準のFileの場合は、defaultのFileOperationを返します。
141         * 元がnullの場合はnullを返します。
142         * new File( dir,fileName ).getPath() で求めたパスで、生成します。
143         * ※ ファイルのコピーは行いません。
144         *
145         * @og.rev 7.2.9.4 (2020/11/20) PMD:Avoid declaring a variable if it is unreferenced before a possible exit point.
146         * @og.rev 8.0.0.1 (2021/10/08) クラウド修正
147         *
148         * @param file コピー元
149         * @param dir 親パス(ディレクトリ)
150         * @param fileName 子パス
151         * @return 設定をコピーしたのFileOperation
152         */
153        public static FileOperation resolveFile(final File file, final String dir, final String fileName) {
154                return resolveFile( file, new File(dir,fileName).getPath() );
155        }
156
157        /**
158         * 引数を元に、ファイル操作クラスのアドレスを解決した新しいオブジェクトを返します。
159         *
160         * 与えたfileオブジェクトがFileOperationだった場合は、プラグインとバケットを取得して
161         * それに基づいた新しいFileOperationを返します。
162         * 標準のFileの場合は、defaultのFileOperationを返します。
163         * 元がnullの場合はnullを返します。
164         * ※ ファイルのコピーは行いません。
165         *
166         * @og.rev 8.0.0.1 (2021/10/08) クラウド修正
167         *
168         * @param file コピー元
169         * @param path パス
170         * @return 設定をコピーしたFileOperation
171         */
172        public static FileOperation resolveFile(final File file, final String path) {
173                if( file == null) { return null; }              // 元がnullの場合はnullを返します。
174
175                // 8.5.5.1 (2024/02/29) PMD 7.0.0 OnlyOneReturn メソッドには終了ポイントが 1 つだけ必要
176                final FileOperation rtn;
177
178                // FileOperation型の場合にプラグインを判定する
179                if( file instanceof FileOperation ) {
180                        final String plugin = ((FileOperation)file).getPlugin();
181                        final String bucket = ((FileOperation)file).getBucket();
182
183//                      return newStorageOperation( plugin, bucket, path );             // クラウドFile/(ローカルFile もありうる)
184                        rtn = newStorageOperation( plugin, bucket, path );              // クラウドFile/(ローカルFile もありうる)
185                }
186                else {
187//                      return newStorageOperation( path );                                             // ローカルFile
188                        rtn = newStorageOperation( path );                                              // ローカルFile
189                }
190                return rtn;
191        }
192}