storagehub-application-pers.../src/main/java/org/gcube/storagehub/StorageHubManagement.java

207 lines
6.9 KiB
Java

package org.gcube.storagehub;
import java.io.InputStream;
import java.io.StringWriter;
import java.net.URL;
import java.util.List;
import org.gcube.common.scope.impl.ScopeBean;
import org.gcube.common.scope.impl.ScopeBean.Type;
import org.gcube.common.storagehub.client.dsl.ContainerType;
import org.gcube.common.storagehub.client.dsl.FileContainer;
import org.gcube.common.storagehub.client.dsl.FolderContainer;
import org.gcube.common.storagehub.client.dsl.ItemContainer;
import org.gcube.common.storagehub.client.dsl.ListResolver;
import org.gcube.common.storagehub.client.dsl.ListResolverTyped;
import org.gcube.common.storagehub.client.dsl.StorageHubClient;
import org.gcube.common.storagehub.model.Metadata;
import org.gcube.common.storagehub.model.exceptions.StorageHubException;
import org.gcube.common.storagehub.model.items.Item;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class StorageHubManagement {
private static final Logger logger = LoggerFactory.getLogger(StorageHubManagement.class);
protected MetadataMatcher metadataMatcher;
protected final StorageHubClient storageHubClient;
protected FileContainer persitedFile;
protected String mimeType;
public StorageHubManagement() {
storageHubClient = new StorageHubClient();
}
public void setCheckMetadata(MetadataMatcher checkMetadata) {
this.metadataMatcher = checkMetadata;
}
public String getMimeType() {
return mimeType;
}
public FileContainer getPersistedFile() {
return persitedFile;
}
protected void recursiveList(FolderContainer folder, int level) throws StorageHubException {
ListResolverTyped listResolverTyped = folder.list();
List<ItemContainer<? extends Item>> containers = listResolverTyped.includeHidden().getContainers();
for(ItemContainer<? extends Item> itemContainer : containers) {
Item item = itemContainer.get();
String name = item.getName();
ContainerType containerType = itemContainer.getType();
StringWriter indent = new StringWriter(level + 1);
for(int i = 0; i < level + 1; i++) {
indent.append('-');
}
logger.debug("{} {} {} (ID:{}) {}", indent.toString(), containerType, name, itemContainer.getId(), item.isHidden() ? " (hidden)" : "");
switch(containerType) {
case FOLDER:
FolderContainer folderContainer = (FolderContainer) itemContainer;
//if(item.getName().compareTo("553095a0-a14a-4e41-b014-2e6f3a1aeac7")!=0)
recursiveList(folderContainer, level + 1);
break;
case FILE:
break;
case GENERIC_ITEM:
break;
default:
break;
}
}
}
protected FolderContainer getWorkspaceRoot() {
return storageHubClient.getWSRoot();
}
protected FolderContainer getOrCreateFolder(FolderContainer parent, String name, String description, boolean hidden)
throws Exception {
FolderContainer destinationFolder = null;
ListResolverTyped listResolverTyped = parent.list();
List<ItemContainer<? extends Item>> containers = listResolverTyped.includeHidden().getContainers();
for(ItemContainer<? extends Item> itemContainer : containers) {
if(itemContainer instanceof FolderContainer) {
if(itemContainer.get().getName().compareTo(name) == 0) {
destinationFolder = (FolderContainer) itemContainer;
}
}
}
if(destinationFolder == null) {
if(hidden) {
destinationFolder = parent.newHiddenFolder(name, description);
} else {
destinationFolder = parent.newFolder(name, description);
}
}
return destinationFolder;
}
protected FolderContainer getContextFolder() throws Exception {
FolderContainer destinationFolder = getWorkspaceRoot();
String currentContext = ContextUtility.getCurrentContext();
ScopeBean scopeBean = new ScopeBean(currentContext);
switch(scopeBean.type()) {
case INFRASTRUCTURE:
case VO:
String folderName = currentContext.replaceFirst("/", "").replace("/", "_");
destinationFolder = getOrCreateFolder(destinationFolder, folderName, "", false);
break;
case VRE:
destinationFolder = storageHubClient.openVREFolder();
break;
default:
break;
}
return destinationFolder;
}
public FolderContainer getApplicationFolder() throws Exception {
FolderContainer destinationFolder = getContextFolder();
String currentContext = ContextUtility.getCurrentContext();
ScopeBean scopeBean = new ScopeBean(currentContext);
if(scopeBean.is(Type.VRE)) {
String username = ContextUtility.getUsername();
destinationFolder = getOrCreateFolder(destinationFolder, username, "Folder Created for user/application", true);
}
return destinationFolder;
}
public FolderContainer getDestinationFolder(String mimeType) throws Exception {
FolderContainer destinationFolder = getApplicationFolder();
String[] splittedMimeType = mimeType.split("/");
for(String name : splittedMimeType) {
destinationFolder = getOrCreateFolder(destinationFolder, name, "Folder Created using mimetype", false);
}
return destinationFolder;
}
protected boolean isPersistedFile(FileContainer fileContainer, String filename) {
// Checking if the file is already a persisted file of the workspace
if(fileContainer.get().getName().startsWith(filename)) {
if(metadataMatcher != null) {
Metadata metadata = fileContainer.get().getMetadata();
return metadataMatcher.check(metadata);
} else {
return true;
}
}
return false;
}
protected void tree(FolderContainer folderContainer) throws Exception {
logger.debug("{} (ID:{})", folderContainer.get().getName(), folderContainer.getId());
recursiveList(folderContainer, 0);
}
public URL persistFile(InputStream inputStream, String fileName, String mimeType, Metadata metadata)
throws Exception {
this.mimeType = mimeType;
FolderContainer destinationFolder = getDestinationFolder(mimeType);
persitedFile = destinationFolder.uploadFile(inputStream, fileName,
"This file has been created to ensure persistence");
if(metadata != null) {
persitedFile.setMetadata(metadata);
}
URL finalURL = persitedFile.getPublicLink();
logger.debug("File persistence has been ensured. The file is available at {}", finalURL);
return finalURL;
}
public FileContainer getPersistedFile(String filename, String mimeType) throws Exception {
FolderContainer destinationFolder = getDestinationFolder(mimeType);
ListResolver listResolver = destinationFolder.findByName(filename);
List<ItemContainer<? extends Item>> itemContainers = listResolver.withMetadata().getContainers();
for(ItemContainer<? extends Item> itemContainer : itemContainers) {
if(itemContainer.getType()==ContainerType.FILE) {
if(isPersistedFile((FileContainer) itemContainer, filename)) {
this.persitedFile = (FileContainer) itemContainer;
return this.persitedFile;
}
}
}
return this.persitedFile;
}
public void removePersistedFile(String filename, String mimeType) throws Exception {
getPersistedFile(filename, mimeType);
if(this.persitedFile !=null) {
this.persitedFile.delete();
}
}
}