/*
* Aipo is a groupware program developed by TOWN, Inc.
* Copyright (C) 2004-2015 TOWN, Inc.
* http://www.aipo.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.aimluck.eip.services.storage.impl;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.nio.channels.FileChannel;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Calendar;
import org.apache.commons.io.IOUtils;
import org.apache.jetspeed.services.logging.JetspeedLogFactoryService;
import org.apache.jetspeed.services.logging.JetspeedLogger;
import com.aimluck.eip.orm.Database;
import com.aimluck.eip.services.storage.ALStorageHandler;
/**
*
*/
public class ALDefaultStorageHandler extends ALStorageHandler {
private static final JetspeedLogger logger = JetspeedLogFactoryService
.getLogger(ALDefaultStorageHandler.class.getName());
private static final String EXT_FILENAME = ".txt";
private static ALStorageHandler instance;
public static ALStorageHandler getInstance() {
if (instance == null) {
instance = new ALDefaultStorageHandler();
}
return instance;
}
@Override
public void saveFile(InputStream is, String folderPath, String filename) {
File path = new File(getAbsolutePath(folderPath));
if (!path.exists()) {
try {
path.mkdirs();
} catch (Exception e) {
logger.error("Can't create directory...:" + path);
}
}
String filepath = path + separator() + filename;
File file = new File(filepath);
FileOutputStream os = null;
try {
if (!file.exists()) {
if (!file.createNewFile()) {
throw new RuntimeException("createNewFile error");
}
}
os = new FileOutputStream(filepath);
int c;
while ((c = is.read()) != -1) {
os.write(c);
}
} catch (IOException e) {
logger.error("ALDefaultStorageHandler.saveFile", e);
} finally {
if (os != null) {
try {
os.flush();
os.close();
} catch (Throwable e) {
// ignore
}
}
}
}
/**
* @param inputStream
* @param filepath
*/
@Override
public void createNewFile(InputStream is, String filepath) {
File file = new File(getAbsolutePath(filepath));
if (!file.exists()) {
try {
String parent = file.getParent();
if (parent != null) {
File dir = new File(parent);
if (!dir.exists()) {
if (!dir.mkdirs()) {
throw new RuntimeException("mkdir error");
}
}
}
if (!file.createNewFile()) {
throw new RuntimeException("createNewFile error");
}
} catch (IOException e) {
logger.error("Can't create file...:" + file, e);
}
}
FileOutputStream os = null;
try {
os = new FileOutputStream(getAbsolutePath(filepath));
int c;
while ((c = is.read()) != -1) {
os.write(c);
}
} catch (IOException e) {
logger.error("ALDefaultStorageHandler.createNewFile", e);
} finally {
if (os != null) {
try {
os.flush();
os.close();
} catch (Throwable e) {
// ignore
}
}
}
}
/**
* @param is
* @param folderPath
* @param filename
*/
@Override
public void createNewFile(InputStream is, String folderPath, String filename) {
File path = new File(getAbsolutePath(folderPath));
if (!path.exists()) {
try {
path.mkdirs();
} catch (Exception e) {
logger.error("Can't create directory...:" + path);
}
}
String filepath = path + separator() + filename;
File file = new File(filepath);
FileOutputStream os = null;
try {
if (!file.createNewFile()) {
throw new RuntimeException("createNewFile error");
}
os = new FileOutputStream(filepath);
int c;
while ((c = is.read()) != -1) {
os.write(c);
}
} catch (IOException e) {
logger.error("ALDefaultStorageHandler.createNewFile", e);
} finally {
if (os != null) {
try {
os.flush();
os.close();
} catch (Throwable e) {
// ignore
}
}
}
}
/**
* @param is
* @param rootPath
* @param fileName
*/
@Override
public void createNewTmpFile(InputStream is, int uid, String dir,
String fileName, String realFileName) {
File path =
new File(getAbsolutePath(FOLDER_TMP_FOR_ATTACHMENT_FILES)
+ separator()
+ Database.getDomainName()
+ separator()
+ uid
+ separator()
+ dir);
if (!path.exists()) {
try {
path.mkdirs();
} catch (Exception e) {
logger.error("Can't create directory...:" + path);
}
}
// バッファリング修正START
try {
String filepath = path + separator() + fileName;
File file = new File(filepath);
if (!file.createNewFile()) {
throw new RuntimeException("createNewFile error");
}
int c;
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
bis = new BufferedInputStream(is, 1024 * 1024);
bos =
new BufferedOutputStream(new FileOutputStream(filepath), 1024 * 1024);
while ((c = bis.read()) != -1) {
bos.write(c);
}
} catch (IOException e) {
logger.error("ALDefaultStorageHandler.createNewTmpFile", e);
} finally {
IOUtils.closeQuietly(bis);
IOUtils.closeQuietly(bos);
}
// バッファリング修正END
PrintWriter w = null;
try {
w =
new PrintWriter(new OutputStreamWriter(new FileOutputStream(filepath
+ EXT_FILENAME), "UTF-8"));
w.println(realFileName);
} catch (IOException e) {
logger.error("ALDefaultStorageHandler.createNewTmpFile", e);
} finally {
if (w != null) {
try {
w.flush();
w.close();
} catch (Throwable e) {
// ignore
}
}
}
} catch (FileNotFoundException e) {
logger.error("ALDefaultStorageHandler.createNewTmpFile", e);
} catch (IOException e) {
logger.error("ALDefaultStorageHandler.createNewTmpFile", e);
}
}
@Override
public boolean copyFile(String srcRootPath, String srcDir,
String srcFileName, String destRootPath, String destDir,
String destFileName) {
File srcPath =
new File(getAbsolutePath(srcRootPath)
+ separator()
+ Database.getDomainName()
+ separator()
+ srcDir);
if (!srcPath.exists()) {
try {
srcPath.mkdirs();
} catch (Exception e) {
logger.error("Can't create directory...:" + srcPath);
return false;
}
}
File destPath =
new File(getAbsolutePath(destRootPath)
+ separator()
+ Database.getDomainName()
+ separator()
+ destDir);
if (!destPath.exists()) {
try {
destPath.mkdirs();
} catch (Exception e) {
logger.error("Can't create directory...:" + destPath);
return false;
}
}
File from = new File(srcPath + separator() + srcFileName);
File to = new File(destPath + separator() + destFileName);
boolean res = true;
FileChannel srcChannel = null;
FileChannel destChannel = null;
try {
srcChannel = new FileInputStream(from).getChannel();
destChannel = new FileOutputStream(to).getChannel();
destChannel.transferFrom(srcChannel, 0, srcChannel.size());
} catch (Exception ex) {
logger.error("ALDefaultStorageHandler.copyFile", ex);
res = false;
} finally {
if (destChannel != null) {
try {
destChannel.close();
} catch (IOException ex) {
logger.error("ALDefaultStorageHandler.copyFile", ex);
res = false;
}
}
if (srcChannel != null) {
try {
srcChannel.close();
} catch (IOException ex) {
logger.error("ALDefaultStorageHandler.copyFile", ex);
res = false;
}
}
}
return res;
}
/**
* @param rootPath
* @param dir
*/
@Override
public long getFolderSize(String rootPath, String dir) {
return getFolderSize(rootPath
+ separator()
+ Database.getDomainName()
+ separator()
+ dir);
}
protected long getFolderSize(String folderPath) {
if (folderPath == null || folderPath.equals("")) {
return 0;
}
File folder = new File(getAbsolutePath(folderPath));
if (!folder.exists()) {
return 0;
}
if (folder.isFile()) {
return getFileSize(folder);
}
int fileSizeSum = 0;
File file = null;
String[] files = folder.list();
int length = files.length;
for (int i = 0; i < length; i++) {
file = new File(getAbsolutePath(folderPath) + separator() + files[i]);
if (file.isFile()) {
fileSizeSum += getFileSize(file);
} else if (file.isDirectory()) {
fileSizeSum += getFolderSize(file.getAbsolutePath());
}
}
return fileSizeSum;
}
@Override
public long getFileSize(String rootPath, String dir, String filename) {
return getFileSize(new File(getAbsolutePath(rootPath)
+ separator()
+ Database.getDomainName()
+ separator()
+ dir
+ separator()
+ filename));
}
protected int getFileSize(File file) {
if (file == null) {
return -1;
}
FileInputStream fileInputStream = null;
int size = -1;
try {
fileInputStream = new FileInputStream(file);
BufferedInputStream input = new BufferedInputStream(fileInputStream);
ByteArrayOutputStream output = new ByteArrayOutputStream();
byte[] b = new byte[512];
int len = -1;
while ((len = input.read(b)) != -1) {
output.write(b, 0, len);
output.flush();
}
input.close();
fileInputStream.close();
byte[] fileArray = output.toByteArray();
size = fileArray.length;
output.close();
} catch (FileNotFoundException e) {
return -1;
} catch (IOException ioe) {
return -1;
}
return size;
}
@Override
public boolean deleteFolder(String rootPath, String dir) {
File file =
new File(getAbsolutePath(rootPath)
+ separator()
+ Database.getDomainName()
+ separator()
+ dir);
if (!file.exists()) {
return true;
}
return deleteFolder(file);
}
protected boolean deleteFolder(File folder) {
if (folder == null) {
return true;
}
String[] files = folder.list();
if (files == null) {
if (!folder.delete()) {
throw new RuntimeException("delete error");
}
return true;
}
int length = files.length;
if (length <= 0) {
if (!folder.delete()) {
throw new RuntimeException("delete error");
}
return true;
}
String folderPath = folder.getAbsolutePath() + separator();
File tmpfile = null;
for (int i = 0; i < length; i++) {
tmpfile = new File(folderPath + files[i]);
if (tmpfile.exists()) {
if (tmpfile.isFile()) {
if (!tmpfile.delete()) {
throw new RuntimeException("delete error");
}
} else if (tmpfile.isDirectory()) {
deleteFolder(tmpfile);
}
}
}
if (!folder.delete()) {
throw new RuntimeException("delete error");
}
return true;
}
@Override
public InputStream getFile(String rootPath, String dir, String fileName)
throws FileNotFoundException {
return getFile(rootPath
+ separator()
+ Database.getDomainName()
+ separator()
+ dir
+ separator()
+ fileName);
}
@Override
public InputStream getFile(String filePath) throws FileNotFoundException {
return new FileInputStream(getAbsolutePath(filePath));
}
@Override
public String getDocumentPath(String rootPath, String categoryKey) {
File rootDir = new File(getAbsolutePath(rootPath));
String org_name = Database.getDomainName();
if (!rootDir.exists()) {
try {
rootDir.mkdirs();
} catch (Exception e) {
logger.error("Can't create directory...:" + rootPath);
return rootDir.getAbsolutePath();
}
}
if (org_name == null) {
return rootDir.getAbsolutePath();
}
File base = null;
// パスを作成
base =
new File(rootDir.getAbsolutePath()
+ separator()
+ org_name
+ separator()
+ categoryKey);
if (!base.exists()) {
try {
base.mkdirs();
} catch (Exception e) {
logger.error("Can't create directory...:" + base);
return base.getAbsolutePath();
}
}
return base.getAbsolutePath();
}
/**
* @return
*/
@Override
public String separator() {
return File.separator;
}
/**
* @param rootPath
* @param dir
* @param filename
* @return
*/
@Override
public boolean deleteFile(String rootPath, String dir, String filename) {
File file =
new File(getDocumentPath(rootPath, dir) + separator() + filename);
if (file != null && file.exists()) {
if (!file.delete()) {
throw new RuntimeException("delete error");
}
}
return true;
}
@Override
public boolean deleteFile(String filePath) {
File file = new File(getAbsolutePath(filePath));
if (file != null && file.exists()) {
if (!file.delete()) {
throw new RuntimeException("delete error");
}
}
return true;
}
@Override
public boolean deleteOldFolder(String folderPath, Calendar cal) {
Calendar mod = Calendar.getInstance();
boolean flag = true;
File parent_folder = new File(getAbsolutePath(folderPath));
try {
if (!parent_folder.exists()) {
return false;
}
if (parent_folder.isFile()) {
return false;
}
String folders_path[] = parent_folder.list();
if (folders_path.length == 0) {
return true;
}
int length = folders_path.length;
for (int i = 0; i < length; i++) {
File folder =
new File(parent_folder.getAbsolutePath()
+ File.separator
+ folders_path[i]);
mod.setTimeInMillis(folder.lastModified());// ファイルの最終更新日時を格納
if (folder.isDirectory()) {
if (!deleteOldFolder(folder.getAbsolutePath(), cal)) {// フォルダの中身が空もしくは全部削除された場合
flag = false;
} else if (mod.before(cal)) {// 空のフォルダが古い場合
if (!folder.delete()) {
flag = false;
}
}
} else {
if (mod.before(cal)) {
// 一つでも消えないファイルがあればフラグを動かす
if (!folder.delete()) {
flag = false;
}
} else {
flag = false;
}
}
}
} catch (Exception e) {
logger.error("ALDefaultStorageHandler.deleteOldFolder", e);
return false;
}
return flag;
}
protected String getAbsolutePath(String folderPath) {
try {
Path path = Paths.get(folderPath);
if (path == null) {
return folderPath;
}
if (path.isAbsolute()) {
return folderPath;
}
String root = System.getProperty("catalina.home");
if (root == null) {
return folderPath;
}
return root + separator() + folderPath;
} catch (Throwable ignore) {
//
}
return folderPath;
}
}