/*******************************************************************************
* ===========================================================
* Ankush : Big Data Cluster Management Solution
* ===========================================================
*
* (C) Copyright 2014, by Impetus Technologies
*
* This is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License (LGPL v3) as
* published by the Free Software Foundation;
*
* This software 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this software; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
******************************************************************************/
/**
*
*/
package com.impetus.ankush.common.utils;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.RandomStringUtils;
import org.springframework.http.HttpStatus;
import org.springframework.web.multipart.MultipartFile;
import com.impetus.ankush.AppStore;
import com.impetus.ankush.AppStoreWrapper;
import com.impetus.ankush.common.config.ConfigurationReader;
import com.impetus.ankush.common.exception.ControllerException;
/**
* The Class UploadHandler.
*
* @author hokam chauhan
*/
public class UploadHandler {
/** The Constant UPLOAD_PATH. */
private static final String UPLOAD_PATH;
/** The Constant REPO_PATH. */
private static final String REPO_PATH;
/** The Constant PATCH_REPO_PATH. */
private static final String PATCHES_REPO_PATH;
/** The Constant LICENSE_PATH. */
private static final String LICENSE_PATH;
/** The category. */
private String category = new String();
/** The license. */
private static String LICENSE = "license";
/** The patch. */
private static String PATCHES = "patches";
static {
String userHome = System.getProperty("user.home");
ConfigurationReader reader = AppStoreWrapper.getAnkushConfReader();
UPLOAD_PATH = userHome + reader.getStringValue("uploadpath");
REPO_PATH = userHome + reader.getStringValue("repo");
PATCHES_REPO_PATH = AppStoreWrapper.getServerPatchesRepoPath();
LICENSE_PATH = userHome + reader.getStringValue(LICENSE);
}
/** The multipart file. */
private MultipartFile multipartFile;
/**
* Instantiates a new upload handler.
*/
public UploadHandler() {
}
/**
* Instantiates a new upload handler.
*
* @param multipartFile
* the multipart file
*/
public UploadHandler(MultipartFile multipartFile) {
this.multipartFile = multipartFile;
}
/**
* Instantiates a new upload handler.
*
* @param multipartFile
* the multipart file
* @param category
* the category
*/
public UploadHandler(MultipartFile multipartFile, String category) {
this.multipartFile = multipartFile;
this.category = category;
}
/**
* Gets the hash.
*
* @return the hash
*/
private String getHash() {
return RandomStringUtils.randomAlphanumeric(20)
+ System.currentTimeMillis();
}
/**
* Gets the upload folder path.
*
* @return the uploadFolderPath
* @throws IOException
* Signals that an I/O exception has occurred.
*/
private String getUploadFolderPath() throws IOException {
String path = null;
// equals the category provide.
if (category.equalsIgnoreCase("bundle")) {
path = REPO_PATH;
} else if (category.equals("log")) {
// Getting application real path.
String appRealPath = AppStoreWrapper.getAppPath();
// Getting the application public/clusters folder.
String clustersFolderPath = FileNameUtils
.convertToValidPath(appRealPath) + "resources/clusters/";
// Getting the cluster folder path.
path = clustersFolderPath + "/logs/";
}else if(category.equals(LICENSE)){
path = LICENSE_PATH;
}else {
if(category.equals(PATCHES)){
path = PATCHES_REPO_PATH;
} else {
// other paths.
path = UPLOAD_PATH + getHash() + File.separator;
}
}
// Create file.
File file = new File(path);
FileUtils.forceMkdir(file);
return path;
}
/**
* Upload file.
*
* @return the string
*/
public String uploadFile() {
if (multipartFile == null) {
throw new ControllerException(HttpStatus.BAD_REQUEST,
HttpStatus.BAD_REQUEST.toString(),
"No payload with name \"file\" found in the request ");
}
// file path to upload.
String realFilePath = null;
try {
// getting original file name.
String originalFileName = multipartFile.getOriginalFilename();
// making real file path.
realFilePath = this.getUploadFolderPath() + originalFileName;
// destination file.
File dest = new File(realFilePath);
multipartFile.transferTo(dest);
} catch (IllegalStateException e) {
throw new ControllerException(HttpStatus.INTERNAL_SERVER_ERROR,
HttpStatus.INTERNAL_SERVER_ERROR.toString(), e.getMessage());
} catch (IOException e) {
throw new ControllerException(HttpStatus.INTERNAL_SERVER_ERROR,
HttpStatus.INTERNAL_SERVER_ERROR.toString(), e.getMessage());
}
return realFilePath;
}
/**
* Gets the available file list.
*
* @param parameters
* the parameters
* @return The List of file names for the found files inside the Category
* folder.
*/
public Map getAvailableFileList(Map<String, String> parameters) {
Map result = new HashMap<String, Object>();
/* Getting the Category value from the Parameters map */
String category = parameters.get("category");
/* Getting the Pattern value from the Parameters map */
final String pattern = parameters.get("pattern");
/* Getting the Path of folder for the category */
String folderPath = (String) AppStore.getObject(category.toLowerCase());
List<String> fileList = new ArrayList<String>();
if (folderPath != null) {
result.put("path", folderPath);
File repoDirs = new File(folderPath);
FileFilter fileFilter = new FileFilter() {
@Override
public boolean accept(File file) {
String regex = pattern;
if (regex == null) {
return true;
} else if (regex.startsWith("*")) {
return false;
}
return file.getName().matches(regex);
}
};
for (File file : repoDirs.listFiles(fileFilter)) {
fileList.add(file.getName());
}
result.put("files", fileList);
}
return result;
}
}