statistical-algorithms-impo.../src/main/java/org/gcube/portlets/user/statisticalalgorithmsimporter/server/storage/FilesStorage.java

764 lines
22 KiB
Java

package org.gcube.portlets.user.statisticalalgorithmsimporter.server.storage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.nio.file.Path;
import java.util.List;
import org.gcube.common.homelibrary.home.HomeLibrary;
import org.gcube.common.homelibrary.home.workspace.Workspace;
import org.gcube.common.homelibrary.home.workspace.WorkspaceFolder;
import org.gcube.common.homelibrary.home.workspace.WorkspaceItem;
import org.gcube.common.homelibrary.home.workspace.folder.FolderItem;
import org.gcube.common.homelibrary.home.workspace.folder.items.ExternalFile;
import org.gcube.common.homelibrary.util.zip.ZipUtil;
import org.gcube.portlets.user.statisticalalgorithmsimporter.shared.exception.StatAlgoImporterServiceException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author Giancarlo Panichi
*
*
*/
public class FilesStorage {
private static final String STATISTICAL_ALGORITHM_PROJECT_MIMETYPE = "text/xml";
private static final String STATISTICAL_ALGORITHM_PROJECT_FILE_DESCRIPTION = "Statistical Algorithm Project File";
private static final String STATISTICAL_ALGORITHM_PROJECT_FILE_NAME = "stat_algo.project";
public static final Logger logger = LoggerFactory.getLogger(FilesStorage.class);
/**
*
* @param user
* User
* @param itemId
* Item id
* @return public link
* @throws StatAlgoImporterServiceException
* exception
*/
public String getPublicLink(String user, String itemId) throws StatAlgoImporterServiceException {
Workspace ws;
try {
logger.info("Get public link: [user=" + user + ", itemId=" + itemId + "]");
ws = HomeLibrary.getUserWorkspace(user);
WorkspaceItem workSpaceItem = ws.getItem(itemId);
if (workSpaceItem.isFolder()) {
throw new StatAlgoImporterServiceException("Attention this is a folder!");
}
if (workSpaceItem instanceof FolderItem) {
return workSpaceItem.getPublicLink(false);
} else {
throw new StatAlgoImporterServiceException("Attention no public link for this item!");
}
} catch (Throwable e) {
logger.error("Get public link: " + e.getLocalizedMessage(), e);
throw new StatAlgoImporterServiceException(e.getLocalizedMessage());
}
}
/**
*
* @param user
* User
* @param itemId
* Item id
* @param folderId
* Folder id
* @return workspace item
* @throws StatAlgoImporterServiceException
* exception
*/
public WorkspaceItem copyItemOnFolder(String user, String itemId, String folderId)
throws StatAlgoImporterServiceException {
Workspace ws;
try {
logger.info("Copy item on folder: [user=" + user + ", itemId=" + itemId + ", folderId=" + folderId + "]");
ws = HomeLibrary.getUserWorkspace(user);
WorkspaceItem workSpaceItem = ws.getItem(folderId);
if (!workSpaceItem.isFolder()) {
throw new StatAlgoImporterServiceException("Destination is not a folder!");
}
WorkspaceItem item = ws.copy(itemId, folderId);
return item;
} catch (Throwable e) {
logger.error("Copy item on folder on workspace: " + e.getLocalizedMessage(), e);
throw new StatAlgoImporterServiceException(e.getLocalizedMessage());
}
}
/**
*
* @param user
* User
* @param itemId
* Item id
* @param folderId
* Destination folder id
* @param newName
* New name
* @return workspace item
* @throws StatAlgoImporterServiceException
* exception
*/
public WorkspaceItem copyItemOnFolderWithNewName(String user, String itemId, String folderId, String newName)
throws StatAlgoImporterServiceException {
Workspace ws;
try {
logger.info("Copy item on folder with new name: [user=" + user + ", itemId=" + itemId + ", folderId="
+ folderId + ", newName=" + newName + "]");
ws = HomeLibrary.getUserWorkspace(user);
WorkspaceItem workSpaceItem = ws.getItem(folderId);
if (!workSpaceItem.isFolder()) {
throw new StatAlgoImporterServiceException("Destination is not a folder!");
}
WorkspaceItem item = ws.copy(itemId, newName, folderId);
return item;
} catch (Throwable e) {
logger.error("Copy item on folder with new name on workspace: " + e.getLocalizedMessage(), e);
throw new StatAlgoImporterServiceException(e.getLocalizedMessage());
}
}
/**
*
* @param user
* User
* @param itemId
* Item id
* @throws StatAlgoImporterServiceException
* exception
*/
public void deleteItemOnFolder(String user, String itemId) throws StatAlgoImporterServiceException {
Workspace ws;
try {
logger.info("Delete item on folder: [user=" + user + ", itemId=" + itemId + "]");
ws = HomeLibrary.getUserWorkspace(user);
ws.removeItems(itemId);
return;
} catch (Throwable e) {
logger.error("Delete Item on workspace: " + e.getLocalizedMessage(), e);
throw new StatAlgoImporterServiceException(e.getLocalizedMessage());
}
}
/**
*
* @param user
* user
* @param parentId
* parent id
* @param folderName
* folder name
* @throws StatAlgoImporterServiceException
* exception
*/
public void deleteFolder(String user, String parentId, String folderName) throws StatAlgoImporterServiceException {
Workspace ws;
try {
logger.info("Delete folder: [user=" + user + ", parentId=" + parentId + ", folderName=" + folderName + "]");
ws = HomeLibrary.getUserWorkspace(user);
WorkspaceItem workSpaceItem = ws.getItem(parentId);
if (!workSpaceItem.isFolder()) {
throw new StatAlgoImporterServiceException("No valid project folder!");
}
WorkspaceItem target = ws.find(folderName, parentId);
if (target != null) {
ws.removeItems(target.getId());
}
return;
} catch (Throwable e) {
logger.error("Delete folder on workspace: " + e.getLocalizedMessage(), e);
throw new StatAlgoImporterServiceException(e.getLocalizedMessage());
}
}
/**
*
* @param user
* user
* @param parentId
* parent id
* @param folderName
* folder name
* @param folderDescription
* folder description
* @return workspace folder
* @throws StatAlgoImporterServiceException
* exception
*/
public WorkspaceFolder createFolder(String user, String parentId, String folderName, String folderDescription)
throws StatAlgoImporterServiceException {
Workspace ws;
try {
logger.info("Create folder: [user=" + user + ", parentId=" + parentId + ", folderName=" + folderName
+ ", folderDescription=" + folderDescription + "]");
ws = HomeLibrary.getUserWorkspace(user);
WorkspaceItem workSpaceItem = ws.getItem(parentId);
if (!workSpaceItem.isFolder()) {
throw new StatAlgoImporterServiceException("No valid project folder!");
}
WorkspaceFolder projectTargetFolder = ws.createFolder(folderName, folderDescription, parentId);
return projectTargetFolder;
} catch (Throwable e) {
logger.error("Create folder on workspace: " + e.getLocalizedMessage(), e);
throw new StatAlgoImporterServiceException(e.getLocalizedMessage());
}
}
/**
*
* @param user
* User
* @param parentId
* Parent id
* @param name
* Name
* @return workspace item
* @throws StatAlgoImporterServiceException
* Exception
*/
public WorkspaceItem find(String user, String parentId, String name) throws StatAlgoImporterServiceException {
Workspace ws;
try {
logger.info("Find: [user=" + user + ", parentId=" + parentId + ", name=" + name + "]");
ws = HomeLibrary.getUserWorkspace(user);
WorkspaceItem workSpaceItem = ws.getItem(parentId);
if (!workSpaceItem.isFolder()) {
throw new StatAlgoImporterServiceException("No valid project folder!");
}
return ws.find(name, parentId);
} catch (Throwable e) {
logger.error("Find: " + e.getLocalizedMessage(), e);
throw new StatAlgoImporterServiceException(e.getLocalizedMessage());
}
}
/**
*
* @param user
* User
* @param inputStream
* Input stream
* @param folderId
* Folder id
* @throws StatAlgoImporterServiceException
* Exception
*/
public void saveStatisticalAlgorithmProject(String user, InputStream inputStream, String folderId)
throws StatAlgoImporterServiceException {
Workspace ws;
try {
logger.info("Save project: [user=" + user + ", folderId=" + folderId + "]");
ws = HomeLibrary.getUserWorkspace(user);
WorkspaceItem workSpaceItem = ws.getItem(folderId);
if (!workSpaceItem.isFolder()) {
throw new StatAlgoImporterServiceException("Destination is not a folder!");
}
WorkspaceItem projectItem = ws.find(STATISTICAL_ALGORITHM_PROJECT_FILE_NAME, folderId);
if (projectItem == null) {
ws.createExternalFile(STATISTICAL_ALGORITHM_PROJECT_FILE_NAME,
STATISTICAL_ALGORITHM_PROJECT_FILE_DESCRIPTION, STATISTICAL_ALGORITHM_PROJECT_MIMETYPE,
inputStream, folderId);
} else {
ws.updateItem(projectItem.getId(), inputStream);
}
return;
} catch (Throwable e) {
logger.error("Save project on workspace: " + e.getLocalizedMessage(), e);
throw new StatAlgoImporterServiceException(e.getLocalizedMessage());
}
}
/**
*
* @param user
* User
* @param inputStream
* Input stream
* @param name
* Name
* @param description
* Description
* @param mimeType
* Mimetype
* @param folderId
* Folder destination
* @throws StatAlgoImporterServiceException
* Exception
*/
public void saveItemOnWorkspace(String user, InputStream inputStream, String name, String description,
String mimeType, String folderId) throws StatAlgoImporterServiceException {
Workspace ws;
try {
logger.info("Save item on workspace: [user=" + user + ", name=" + name + ", description=" + description
+ ", mimeType=" + mimeType + ", folderId=" + folderId + "]");
ws = HomeLibrary.getUserWorkspace(user);
WorkspaceItem workSpaceItem = ws.getItem(folderId);
if (!workSpaceItem.isFolder()) {
throw new StatAlgoImporterServiceException("Destination is not a folder!");
}
WorkspaceItem projectItem = ws.find(name, folderId);
if (projectItem == null) {
ws.createExternalFile(name, description, mimeType, inputStream, folderId);
} else {
ws.updateItem(projectItem.getId(), inputStream);
}
return;
} catch (Throwable e) {
logger.error("Save item on workspace: " + e.getLocalizedMessage(), e);
throw new StatAlgoImporterServiceException(e.getLocalizedMessage());
}
}
/**
*
* @param user
* User
* @param inputStream
* Input stream
* @param name
* Item name
* @param description
* Item description
* @param mimeType
* Item mimetype
* @param folderId
* Destination folder
* @return Workspace item
* @throws StatAlgoImporterServiceException
* Exceptioon
*/
public WorkspaceItem createItemOnWorkspace(String user, InputStream inputStream, String name, String description,
String mimeType, String folderId) throws StatAlgoImporterServiceException {
Workspace ws;
try {
logger.info("Create item on workspace: [user=" + user + ", name=" + name + ", description=" + description
+ ", mimeType=" + mimeType + ", folderId=" + folderId + "]");
ws = HomeLibrary.getUserWorkspace(user);
WorkspaceItem workSpaceItem = ws.getItem(folderId);
if (!workSpaceItem.isFolder()) {
throw new StatAlgoImporterServiceException("Destination is not a folder!");
}
ExternalFile workspaceItem = ws.createExternalFile(name, description, mimeType, inputStream, folderId);
return workspaceItem;
} catch (Throwable e) {
logger.error("Create item on workspace: " + e.getLocalizedMessage(), e);
throw new StatAlgoImporterServiceException(e.getLocalizedMessage());
}
}
/**
*
* @param user
* User
* @param folderId
* Folder id
* @return Input stream
* @throws StatAlgoImporterServiceException
* Exception
*
*/
public InputStream retrieveProjectItemOnWorkspace(String user, String folderId)
throws StatAlgoImporterServiceException {
Workspace ws;
try {
logger.info("Retrieve project item on workspace: [user=" + user + ", folderId=" + folderId + "]");
ws = HomeLibrary.getUserWorkspace(user);
WorkspaceItem workSpaceItem = ws.getItem(folderId);
if (!workSpaceItem.isFolder()) {
throw new StatAlgoImporterServiceException("Item is not valid folder!");
}
WorkspaceItem projectItem = ws.find(STATISTICAL_ALGORITHM_PROJECT_FILE_NAME, folderId);
if (projectItem == null) {
throw new StatAlgoImporterServiceException("No project found in this folder!");
}
return retrieveInputStream(user, projectItem);
} catch (Throwable e) {
logger.error("Retrieve project item on workspace: " + e.getLocalizedMessage(), e);
throw new StatAlgoImporterServiceException(e.getLocalizedMessage());
}
}
/**
*
* @param user
* User
* @param folderId
* Folder id
* @return boolean True if exist
* @throws StatAlgoImporterServiceException
* Exception
*/
public boolean existProjectItemOnWorkspace(String user, String folderId) throws StatAlgoImporterServiceException {
Workspace ws;
try {
logger.info("Exist project item on workspace: [user=" + user + ", folderId=" + folderId + "]");
ws = HomeLibrary.getUserWorkspace(user);
WorkspaceItem workSpaceItem = ws.getItem(folderId);
if (!workSpaceItem.isFolder()) {
throw new StatAlgoImporterServiceException("Item is not valid folder!");
}
WorkspaceItem projectItem = ws.find(STATISTICAL_ALGORITHM_PROJECT_FILE_NAME, folderId);
if (projectItem == null) {
return false;
} else {
return true;
}
} catch (Throwable e) {
logger.error("Exist project item on workspace: " + e.getLocalizedMessage(), e);
throw new StatAlgoImporterServiceException(e.getLocalizedMessage());
}
}
/**
*
* @param user
* User
* @param itemId
* Item id
* @return Workspace Item
* @throws StatAlgoImporterServiceException
* Exception
*/
public WorkspaceItem retrieveItemInfoOnWorkspace(String user, String itemId)
throws StatAlgoImporterServiceException {
Workspace ws;
try {
logger.info("Retrieve item info on workspace: [user=" + user + ", itemId=" + itemId + "]");
ws = HomeLibrary.getUserWorkspace(user);
WorkspaceItem workSpaceItem = ws.getItem(itemId);
return workSpaceItem;
} catch (Throwable e) {
logger.error("Retrieve item info on workspace: " + e.getLocalizedMessage(), e);
throw new StatAlgoImporterServiceException(e.getLocalizedMessage());
}
}
/**
*
* @param user
* User
* @param itemId
* Item id
* @return Input stream
* @throws StatAlgoImporterServiceException
* Excetpion
*/
public InputStream retrieveItemOnWorkspace(String user, String itemId) throws StatAlgoImporterServiceException {
Workspace ws;
try {
logger.info("Retrieve item on workspace: [user=" + user + ", itemId=" + itemId + "]");
ws = HomeLibrary.getUserWorkspace(user);
WorkspaceItem workSpaceItem = ws.getItem(itemId);
if (workSpaceItem.isFolder()) {
throw new StatAlgoImporterServiceException("Folder Item is not valid!");
}
return retrieveInputStream(user, workSpaceItem);
} catch (Throwable e) {
logger.error("Retieve item on workspace: " + e.getLocalizedMessage(), e);
throw new StatAlgoImporterServiceException(e.getLocalizedMessage());
}
}
/**
*
* @param user
* User
* @param wi
* Workspace item
* @return InputStream
* @throws StatAlgoImporterServiceException
* Exception
*/
public InputStream retrieveInputStream(String user, WorkspaceItem wi) throws StatAlgoImporterServiceException {
InputStream is = null;
try {
logger.info("Retrieve input stream: [user=" + user + ", workspaceItem=" + wi + "]");
org.gcube.common.homelibrary.home.workspace.folder.items.File gcubeItem = ((org.gcube.common.homelibrary.home.workspace.folder.items.File) wi);
is = gcubeItem.getData();
return is;
} catch (Throwable e) {
logger.error("Error retrieving file from storage: " + e.getLocalizedMessage(), e);
throw new StatAlgoImporterServiceException("Error retrieving file from storage: " + e.getLocalizedMessage(),
e);
}
}
/**
*
* @param user
* User
* @param itemId
* Item on workspace
* @param data
* String to save
* @throws StatAlgoImporterServiceException
* Exception
*/
public void saveStringInItem(String user, String itemId, String data) throws StatAlgoImporterServiceException {
Workspace ws;
try {
logger.info("Save string in item: [user=" + user + ", itemId=" + itemId + "]");
ws = HomeLibrary.getUserWorkspace(user);
WorkspaceItem workSpaceItem = ws.getItem(itemId);
if (workSpaceItem == null) {
throw new StatAlgoImporterServiceException("No item retrieved on workspace!");
} else {
if (workSpaceItem.isFolder()) {
throw new StatAlgoImporterServiceException("Item is a folder!");
} else {
}
}
// convert String into InputStream
InputStream is = new ByteArrayInputStream(data.getBytes());
ws.updateItem(itemId, is);
return;
} catch (Throwable e) {
logger.error("Save string in item on workspace: " + e.getLocalizedMessage(), e);
throw new StatAlgoImporterServiceException(e.getLocalizedMessage());
}
}
/**
*
* @param user
* User
* @param itemId
* Item id
* @param is
* Input stream
* @throws StatAlgoImporterServiceException
* Exception
*/
public void saveInputStreamInItem(String user, String itemId, InputStream is)
throws StatAlgoImporterServiceException {
Workspace ws;
try {
logger.info("Save input stream in item: [user=" + user + ", itemId=" + itemId + "]");
ws = HomeLibrary.getUserWorkspace(user);
WorkspaceItem workSpaceItem = ws.getItem(itemId);
if (workSpaceItem == null) {
throw new StatAlgoImporterServiceException("No item retrieved on workspace!");
} else {
if (workSpaceItem.isFolder()) {
throw new StatAlgoImporterServiceException("Item is a folder!");
} else {
}
}
// convert String into InputStream
ws.updateItem(itemId, is);
return;
} catch (Throwable e) {
logger.error("Save input stream in item on workspace: " + e.getLocalizedMessage(), e);
throw new StatAlgoImporterServiceException(e.getLocalizedMessage());
}
}
/**
*
* @param user
* User
* @param folderId
* Folder Id
* @return Zip folder
* @throws StatAlgoImporterServiceException
* Exception
*/
public File zipFolder(String user, String folderId) throws StatAlgoImporterServiceException {
Workspace ws;
try {
logger.info("Zip folder: [user=" + user + ", folderId=" + folderId + "]");
ws = HomeLibrary.getUserWorkspace(user);
WorkspaceItem workSpaceItem = ws.getItem(folderId);
if (!workSpaceItem.isFolder()) {
throw new StatAlgoImporterServiceException("Item is not valid folder!");
}
WorkspaceFolder folder = (WorkspaceFolder) workSpaceItem;
File fileZip = ZipUtil.zipFolder(folder);
return fileZip;
} catch (Throwable e) {
logger.error("Zip folder on workspace: " + e.getLocalizedMessage(), e);
throw new StatAlgoImporterServiceException(e.getLocalizedMessage());
}
}
/**
*
* @param user
* User
* @param folderId
* Folder id
* @param idsToExclude
* List of ids to exclude
* @return Zip folder
* @throws StatAlgoImporterServiceException
* Exception
*/
public File zipFolder(String user, String folderId, List<String> idsToExclude)
throws StatAlgoImporterServiceException {
Workspace ws;
try {
logger.info("Zip folder with exclude: [user=" + user + ", folderId=" + folderId + "]");
ws = HomeLibrary.getUserWorkspace(user);
WorkspaceItem workSpaceItem = ws.getItem(folderId);
if (!workSpaceItem.isFolder()) {
throw new StatAlgoImporterServiceException("Item is not valid folder!");
}
WorkspaceFolder folder = (WorkspaceFolder) workSpaceItem;
File fileZip = ZipUtil.zipFolder(folder, false, idsToExclude);
return fileZip;
} catch (Throwable e) {
logger.error("Zip folder with exclude on workspace: " + e.getLocalizedMessage(), e);
throw new StatAlgoImporterServiceException(e.getLocalizedMessage());
}
}
/**
*
* @param fileUrl
* Url
* @param destination
* Destination
* @throws StatAlgoImporterServiceException
* Exception
*/
public void downloadInputFile(String fileUrl, Path destination) throws StatAlgoImporterServiceException {
try {
logger.info("Download input file: [fileUrl=" + fileUrl + ", destination=" + destination + "]");
URL smpFile = new URL(fileUrl);
URLConnection uc = (URLConnection) smpFile.openConnection();
InputStream is = uc.getInputStream();
inputStreamToFile(is, destination);
is.close();
} catch (Throwable e) {
logger.error("Download input file: " + e.getLocalizedMessage(), e);
throw new StatAlgoImporterServiceException(e.getLocalizedMessage());
}
}
private void inputStreamToFile(InputStream is, Path destination) throws FileNotFoundException, IOException {
FileOutputStream out = new FileOutputStream(destination.toFile());
byte buf[] = new byte[1024];
int len = 0;
while ((len = is.read(buf)) > 0)
out.write(buf, 0, len);
out.close();
}
}