/*
 * Copyright (c) 2007 NTT DATA Corporation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package jp.terasoluna.rich.functionsample.upload.service;

import java.io.IOException;
import java.io.InputStream;

import jp.terasoluna.fw.service.rich.exception.ServiceException;
import jp.terasoluna.rich.functionsample.upload.bean.FileUploadInputData;
import jp.terasoluna.rich.functionsample.upload.bean.FileUploadResultData;

import org.springframework.web.multipart.MultipartFile;

/**
 * ファイルアップロードサービスの実装クラス
 */

public class FileUploadServiceImpl implements FileUploadService {

    /**
     * ファイルアップロードを行う。
     * 
     * @param input
     *            入力データ
     * @return fileUploadResultData 結果データ
     */
    public FileUploadResultData execute(FileUploadInputData input) {

        /**
         * 戻り値の初期化
         */
        String multipartFileName = null;
        long multipartFileSize = 0;
        String multipartFileValue = null;
        String byteFileValue = null;

        // MultipartFile型の属性からファイルデータ習得
        MultipartFile multipartFile = input.getMultipartFile();

        // バイト配列型の属性からファイルデータ取得
        byte[] byteFile = input.getBytefile();

        // MultipartFile型のファイルデータのファイル名・ファイルサイズを習得
        if (multipartFile != null) {
            multipartFileName = multipartFile.getOriginalFilename();
            multipartFileSize = multipartFile.getSize();
        }

        // MultipartFile型のファイルデータの内容を習得
        if (multipartFile != null) {
            InputStream in = null;
            try {
                in = multipartFile.getInputStream();
                byte[] buffer = new byte[1024];
                int rsize;
                while ((rsize = in.read(buffer)) != -1) {
                    multipartFileValue = new String(buffer, 0, rsize);
                }
            } catch (IOException e) {
                throw new ServiceException("errors.8004C999");
            } finally {
                try {
                    if (in != null) {
                        in.close();
                    }
                } catch (Exception e) {
                    throw new ServiceException("errors.8004C999");
                }
            }
        }

        // byte型のファイルデータの内容を習得
        if (byteFile != null) {
            byteFileValue = new String(byteFile, 0, byteFile.length);
        }

        // /結果データ型を宣言し、値を格納する。
        FileUploadResultData fileUploadResultData = new FileUploadResultData();
        fileUploadResultData.setMultipartFileName(multipartFileName);
        fileUploadResultData.setMultipartFileSize(multipartFileSize);
        fileUploadResultData.setMultipartFileValue(multipartFileValue);
        fileUploadResultData.setByteFileValue(byteFileValue);

        // / 結果データを返却する。
        return fileUploadResultData;
    }
}
