    001package org.opengion.plugin.cloud;
    002
    003import java.io.FileNotFoundException;
    004import java.io.IOException;
    005import java.io.InputStream;
    006import java.net.MalformedURLException;
    007import java.util.ArrayList;
    008import java.util.HashMap;
    009import java.util.List;
    010import java.util.Map;
    011
    012import org.apache.commons.lang3.StringUtils;
    013import org.opengion.fukurou.model.AbstractFileOperation;
    014import org.opengion.fukurou.model.FileOperation;
    015import org.opengion.fukurou.model.FileOperationFileFilter;
    016import org.opengion.fukurou.model.FileOperationInfo;
    017import org.opengion.fukurou.util.Closer;
    018import org.opengion.fukurou.util.StringUtil;
    019import org.opengion.hayabusa.common.HybsSystem;
    020import org.opengion.hayabusa.common.HybsSystemException;
    021
    022import oracle.cloud.storage.CloudStorage;
    023import oracle.cloud.storage.CloudStorageConfig;
    024import oracle.cloud.storage.CloudStorageFactory;
    025import oracle.cloud.storage.exception.NoSuchContainerException;
    026import oracle.cloud.storage.model.Key;
    027import oracle.cloud.storage.model.QueryOption;
    028import oracle.cloud.storage.model.QueryResult;
    029
    030/**
    031 * FileOperation_ORACLE.javaは、Oracleクラウドのストレージに対して、
    032 * ファイル操作を行うクラスです。
    033 *
    034 * @og.rev 5.10.8.0 (2019/02/01) 新規作成
    035 *
    036 * @version 5
    037 * @author oota
    038 * @since JDK7.0
    039 */
    040public class FileOperation_ORACLE  extends AbstractFileOperation {
    041        /** クラス変数 */
    042        private final CloudStorage oracleStorage;
    043        private final String conBuket;
    044
    045        /**
    046         * コンストラクター
    047         *
    048         * @param buket バケット
    049         * @param inPath パス
    050         */
    051        public FileOperation_ORACLE(String buket, String inPath) {
    052                super(StringUtil.nval( buket, HybsSystem.sys("CLOUD_BUCKET") ),inPath);
    053                conBuket = buket;
    054
    055                CloudStorageConfig config = new CloudStorageConfig();
    056
    057                // リソースパラメータ設定
    058                // サービス名
    059                final String serviceName = HybsSystem.sys("CLOUD_STORAGE_ORACLE_SERVICE_NAME");
    060                // ユーザ名
    061                final String userName = HybsSystem.sys("CLOUD_STORAGE_ORACLE_USERNAME");
    062                // パスワード
    063                final String password = HybsSystem.sys("CLOUD_STORAGE_ORACLE_PASSWORD");
    064                // サービスURL
    065                final String serviceUrl = HybsSystem.sys("CLOUD_STORAGE_ORACLE_SERVICEURL");
    066
    067                initCheck(serviceName, userName, password, serviceUrl);
    068
    069                try {
    070                        config.setServiceName(serviceName)
    071                                .setUsername(userName)
    072                                .setPassword(password.toCharArray())
    073                                .setServiceUrl(serviceUrl);
    074
    075                        oracleStorage = CloudStorageFactory.getStorage(config);
    076
    077                        // コンテナの存在チェック
    078                        try {
    079                                oracleStorage.describeContainer(bucket);
    080                        }catch(NoSuchContainerException nce) {
    081                                // コンテナが存在しない場合は、作成する
    082                                oracleStorage.createContainer(bucket);
    083                        }
    084                }catch(MalformedURLException me) {
    085                        throw new HybsSystemException(me.getMessage());
    086                }
    087        }
    088
    089        /**
    090         * 初期ﾁｪｯｸ
    091         */
    092        private void initCheck(String serviceName, String userName, String password, String serviceUrl){
    093                // ｼｽﾃﾑﾘｿｰｽに認証情報が登録されていない場合は、エラー
    094                StringBuilder errString = new StringBuilder();
    095                if(StringUtils.isEmpty(serviceName)){
    096                        errString.append("CLOUD_STORAGE_ORACLE_SERVICE_NAME");
    097                }
    098                if(StringUtils.isEmpty(userName)){
    099                        errString.append(",CLOUD_STORAGE_ORACLE_USERNAME");
    100                }
    101                if(StringUtils.isEmpty(password)){
    102                        errString.append(",CLOUD_STORAGE_ORACLE_PASSWORD");
    103                }
    104                if(StringUtils.isEmpty(serviceUrl)){
    105                        errString.append(",CLOUD_STORAGE_ORACLE_SERVICEURL");
    106                }
    107
    108                if(errString.length() > 0){
    109                        throw new HybsSystemException("クラウドストレージのキー情報("+errString.toString()+")がシステムリソースに登録されていません。");
    110                }
    111
    112        }
    113
    114        /**
    115         * InputStreamのデータを書き込みます。
    116         *
    117         * @param is 書き込みデータのInputStream
    118         * @throws IOException
    119         */
    120        @Override
    121        public void write(InputStream is) throws IOException {
    122                try {
    123                        System.out.println("ora-path:" + path);
    124                        oracleStorage.storeObject(bucket, path, "application/octet-stream", is);
    125                }catch(Exception e) {
    126                        StringBuilder errMsg = new StringBuilder(HybsSystem.BUFFER_MIDDLE);
    127                        errMsg.append("Oracleストレージに書き込みが失敗しました。path：").append(path);
    128                        errMsg.append(" システムエラー情報：").append(e.getMessage());
    129                        throw new IOException(errMsg.toString());
    130                }
    131        }
    132
    133        /**
    134         * データを読み込み、InputStreamとして、返します。
    135         *
    136         * @return 読み込みデータのInputStream
    137         * @throws FileNotFoundException
    138         */
    139        @Override
    140        public InputStream read() throws FileNotFoundException {
    141                InputStream is;
    142                try {
    143                        is = oracleStorage.retrieveObject(bucket, path);
    144                }catch(Exception e) {
    145                        StringBuilder errMsg = new StringBuilder(HybsSystem.BUFFER_MIDDLE);
    146                        errMsg.append("Oracleストレージから読み込みが失敗しました。path：").append(path);
    147                        errMsg.append(" システムエラー情報：").append(e.getMessage());
    148                        throw new FileNotFoundException(errMsg.toString());
    149                }
    150                return is;
    151        }
    152
    153        /**
    154         * ファイルを削除します。
    155         *
    156         * @return 成否フラグ
    157         */
    158        @Override
    159        public boolean delete() {
    160                boolean flgRtn = false;
    161
    162                try {
    163                        oracleStorage.deleteObject(bucket,  path);
    164                        flgRtn = true;
    165                }catch(Exception e) {
    166                        // エラーはスルーして、falseを返す
    167                }
    168
    169                return flgRtn;
    170        }
    171
    172        /**
    173         * ファイルを指定先に、コピーします。
    174         *
    175         * @param afPath コピー先
    176         * @return 成否フラグ
    177         */
    178        @Override
    179        public boolean copy(String afPath) {
    180                boolean flgRtn = false;
    181                InputStream is = null;
    182
    183                try {
    184                        is = read();
    185                        FileOperation_ORACLE afFile = new FileOperation_ORACLE(conBuket,afPath);
    186                        afFile.write(is);
    187                        flgRtn = true;
    188                }catch(IOException ie) {
    189                        // エラーはスルーして、falseを返す
    190                }finally {
    191                        Closer.ioClose(is);
    192                }
    193
    194                return flgRtn;
    195        }
    196
    197        /**
    198         * ファイルサイズを返します
    199         *
    200         * @return ファイルサイズ
    201         */
    202        @Override
    203        public long length() {
    204                long rtn = 0;
    205
    206                try {
    207                        rtn = oracleStorage.describeObject(bucket, path).getSize();
    208                }catch(Exception e) {
    209                        // エラーはスルーして、0を返す
    210                }
    211
    212                return rtn;
    213        }
    214
    215        /**
    216         * 最終更新時刻を取得します。
    217         *
    218         * @return 最終更新時刻
    219         */
    220        @Override
    221        public long lastModified() {
    222                long rtn = 0;
    223
    224                try {
    225                        rtn = oracleStorage.describeObject(bucket, path).getLastModified().getTime();
    226                }catch(Exception e) {
    227                        // エラーはスルーして、0を返す
    228                }
    229
    230                return rtn;
    231        }
    232
    233        /**
    234         * ファイルの場合は、trueを返します。
    235         *
    236         * @return ファイルフラグ
    237         */
    238        @Override
    239        public boolean isFile() {
    240                boolean flgRtn = false;
    241
    242                try {
    243                        oracleStorage.describeObject(bucket, path);
    244                        flgRtn = true;
    245                }catch(Exception e) {
    246                        // ここでのエラーはスルーして、falseを返す
    247                }
    248
    249                return flgRtn;
    250        }
    251
    252        /**
    253         * ディレクトリの場合は、trueを返します。
    254         *
    255         * @return ディレクトリフラグ
    256         */
    257        @Override
    258        public boolean isDirectory() {
    259                boolean blnRtn = false;
    260
    261                if(StringUtil.isNull(path)) {
    262                        return true;
    263                }
    264
    265                Map<QueryOption, String> map = new HashMap<QueryOption, String>();
    266                map.put(QueryOption.PREFIX,  setDirTail(path));
    267
    268                List<Key> list = oracleStorage.listObjects(bucket, map);
    269                if(list.size() > 0) {
    270                        blnRtn = true;
    271                }
    272
    273                return blnRtn;
    274        }
    275
    276        /**
    277         * パスのファイルとディレクトリ一覧を取得します。
    278         *
    279         * @return ファイルとティレクトリ一覧
    280         */
    281        @Override
    282        public FileOperation[] listFiles(FileOperationFileFilter filter){
    283                if(!exists()) {
    284                        return new FileOperationInfo[0];
    285                }
    286
    287                String search = path;
    288                if(isDirectory()) {
    289                        search = setDirTail(path);
    290                }
    291
    292                List<FileOperationInfo> rtnList = new ArrayList<FileOperationInfo>();
    293
    294                // 検索処理
    295                QueryResult result = oracleStorage.listObjectsByPath(bucket, "/", search, null);
    296
    297                // ファイル情報の設定
    298                for(Key trg: result.getKeys()) {
    299                        String key = trg.getKey();
    300
    301                        FileOperationInfo fi = new FileOperationInfo();
    302                        fi.setPath(key);
    303                        fi.setName(drawName(key));
    304                        fi.setParent(drawParent(key));
    305                        fi.setLastModifiedValue(trg.getLastModified().getTime());
    306                        fi.setSize(trg.getSize());
    307                        fi.setFile(true);
    308                        rtnList.add(fi);
    309                }
    310
    311                // サブディレクトリ情報の設定
    312                for(String path: result.getPaths()) {
    313                        String key = rTrim(path, '/');
    314
    315                        FileOperationInfo fi = new FileOperationInfo();
    316                        fi.setPath(key);
    317                        fi.setName(drawName(key));
    318                        fi.setParent(drawParent(key));
    319                        fi.setDirectory(true);
    320                        rtnList.add(fi);
    321                }
    322
    323                FileOperation[] filterList = filter(rtnList, filter);
    324
    325                return filterList;
    326        }
    327
    328        @Override
    329        public FileOperation getParentFile() {
    330                return new FileOperation_ORACLE(conBuket,getParent());
    331        }
    332
    333        /** 以下はローカル環境でのテスト用メソッドです。 */
    334//              public FileOperation_ORACLE(String buket, String inPath, boolean test) {
    335//                      // super( StringUtil.nval( buket, HybsSystem.sys("CLOUD_BUCKET") ), inPath);
    336//                      super( StringUtil.nval( buket, "opengiontestbucket" ), inPath);
    337//                      conBuket = buket;
    338//
    339//                      // proxy設定
    340//                      System.setProperty("https.proxyHost","mtc-px14");
    341//                  System.setProperty("https.proxyPort","8081");
    342//
    343//                      CloudStorageConfig config = new CloudStorageConfig();
    344//                      // リソースパラメータ設定
    345//                      final String serviceName = "[storage名]";
    346//                      final String userName = "[userId]";
    347//                      final String password = "[password]";
    348//                      final String serviceUrl = "https://aucom-east-1.storage.oraclecloud.com";
    349//
    350//                      initCheck(serviceName, userName, password, serviceUrl);
    351//
    352//                      try {
    353//                              config.setServiceName(serviceName)
    354//                                      .setUsername(userName)
    355//                                      .setPassword(password.toCharArray())
    356//                                      .setServiceUrl(serviceUrl);
    357//
    358//                              oracleStorage = CloudStorageFactory.getStorage(config);
    359//
    360//                              // コンテナの存在チェック
    361//                              try {
    362//                                      oracleStorage.describeContainer(bucket);
    363//                              }catch(NoSuchContainerException nce) {
    364//                                      // コンテナが存在しない場合は、作成する
    365//                                      oracleStorage.createContainer(bucket);
    366//                              }
    367//                      }catch(MalformedURLException me) {
    368//                              throw new HybsSystemException(me.getMessage());
    369//                      }
    370//              }
    371//
    372//              /** テスト用メソッド */
    373//              public static void main(String[] args) {
    374//      //              writeTest();
    375//                      listTest();
    376//      //              methodTest();
    377//              }
    378//
    379//              public static void writeTest() {
    380//                      FileOperation file = new FileOperation_ORACLE("", "sample/test.txt", true);
    381//
    382//                      try (InputStream is = new ByteArrayInputStream("sample".getBytes())) {
    383//                              file.write(is);
    384//                      } catch (Exception e) {
    385//                              System.out.println(e.getMessage());
    386//                      }
    387//              }
    388//
    389//              public static void listTest() {
    390//                      FileOperation file = new FileOperation_ORACLE("", "sample", true);
    391//
    392//                      FileOperation[] list = file.listFiles();
    393//                      System.out.println(list.length);
    394//                      for (FileOperation f : list) {
    395//                              System.out.println(f.getPath());
    396//                      }
    397//              }
    398//
    399//              public static void methodTest() {
    400//                      FileOperation file = new FileOperation_ORACLE("", "test", true);
    401//                      boolean rtn = false;
    402//                      rtn = file.isFile();
    403//
    404//                      System.out.println(rtn);
    405//              }
    406}