You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.
geoportal-service/src/main/java/org/gcube/application/geoportal/service/engine/WorkspaceManager.java

141 lines
4.4 KiB
Java

package org.gcube.application.geoportal.service.engine;
import java.io.FileNotFoundException;
import java.io.InputStream;
import javax.validation.constraints.NotNull;
import org.gcube.application.geoportal.common.model.legacy.WorkspaceContent;
import org.gcube.application.geoportal.common.utils.Files;
import org.gcube.application.geoportal.model.fault.ConfigurationException;
import org.gcube.common.storagehub.client.dsl.FileContainer;
import org.gcube.common.storagehub.client.dsl.FolderContainer;
import org.gcube.common.storagehub.client.dsl.StorageHubClient;
import org.gcube.common.storagehub.model.exceptions.StorageHubException;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import lombok.Synchronized;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class WorkspaceManager {
private static final String APP_FOLDER=".GNA_RECORDS";
private StorageHubClient sgClient=null;
private FolderContainer appBase=null;
@Getter
@Setter
@AllArgsConstructor
@RequiredArgsConstructor
public static class FolderOptions{
@NotNull
private String folderName;
private String folderDescription;
private FolderContainer parent;
}
@Getter
@Setter
@AllArgsConstructor
@RequiredArgsConstructor
public static class FileOptions{
@NotNull
private String fileName;
@NonNull
private InputStream is;
private String fileDescription;
private FolderContainer parent;
}
public WorkspaceManager() throws ConfigurationException, StorageHubException {
sgClient= ImplementationProvider.get().getSHubProvider().getObject();
appBase=getApplicationBaseFolder(sgClient);
}
public FolderContainer createFolder(FolderOptions opts) throws StorageHubException {
if(opts.getParent()==null)
opts.setParent(appBase);
return createFolder(opts,sgClient);
}
public FileContainer getFileById(String id) throws StorageHubException {
return sgClient.open(id).asFile();
}
public FolderContainer getFolderById(String id) throws StorageHubException {
return sgClient.open(id).asFolder();
}
public FolderContainer getSubFolder(FolderContainer parentFolder,String path) throws StorageHubException {
try{
return parentFolder.openByRelativePath(path).asFolder();
}catch(StorageHubException e) {
log.debug("Missing subPath "+path);
FolderContainer targetParent=parentFolder;
String targetName=path;
if(path.contains("/")) {
String parent=path.substring(0, path.lastIndexOf("/"));
log.debug("Checking intermediate "+parent);
targetParent=getSubFolder(parentFolder,parent);
targetName=path.substring(path.lastIndexOf("/")+1);
}
log.debug("Creating "+targetName);
return createFolder(new FolderOptions(targetName,"",targetParent),sgClient);
}
}
public WorkspaceContent storeToWS(FileOptions opts) throws FileNotFoundException, StorageHubException {
FileContainer item=createFile(opts,sgClient);
item=sgClient.open(item.getId()).asFile();
WorkspaceContent content=new WorkspaceContent();
content.setLink(item.getPublicLink().toString());
content.setMimetype(item.get().getContent().getMimeType());
content.setStorageID(item.getId());
return content;
}
public void deleteFromWS(WorkspaceContent toDelete) throws StorageHubException {
sgClient.open(toDelete.getStorageID()).asFile().forceDelete();
}
// STATIC SYNCH METHODS
@Synchronized
private static FolderContainer getApplicationBaseFolder(StorageHubClient sgClient) throws StorageHubException {
FolderContainer vre=sgClient.openVREFolder();
try {
return vre.openByRelativePath(APP_FOLDER).asFolder();
}catch(StorageHubException e) {
log.debug("APP Fodler missing. Initializing..");
FolderContainer toReturn= vre.newFolder(APP_FOLDER, "Base folder for GNA records");
toReturn.setHidden();
return toReturn;
}
}
@Synchronized
private static FolderContainer createFolder(FolderOptions opts, StorageHubClient sgClient) throws StorageHubException {
opts.setFolderName(Files.fixFilename(opts.getFolderName()));
return opts.getParent().newFolder(opts.getFolderName(),opts.getFolderDescription());
}
@Synchronized
private static FileContainer createFile(FileOptions opts, StorageHubClient sgClient) throws StorageHubException {
opts.setFileName(Files.fixFilename(opts.getFileName()));
return opts.getParent().uploadFile(opts.getIs(), opts.getFileName(), opts.getFileDescription());
}
}