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.
1196 lines
35 KiB
Java
1196 lines
35 KiB
Java
package org.gcube.contentmanagement.blobstorage.service.impl;
|
|
|
|
import java.io.UnsupportedEncodingException;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
import java.util.Objects;
|
|
import java.util.Set;
|
|
|
|
import org.gcube.contentmanagement.blobstorage.resource.AccessType;
|
|
import org.gcube.contentmanagement.blobstorage.resource.MemoryType;
|
|
import org.gcube.contentmanagement.blobstorage.resource.MyFile;
|
|
import org.gcube.contentmanagement.blobstorage.resource.OperationDefinition.OPERATION;
|
|
import org.gcube.contentmanagement.blobstorage.resource.OperationDefinition.REMOTE_RESOURCE;
|
|
import org.gcube.contentmanagement.blobstorage.resource.StorageObject;
|
|
import org.gcube.contentmanagement.blobstorage.service.IClient;
|
|
import org.gcube.contentmanagement.blobstorage.service.directoryOperation.BucketCoding;
|
|
import org.gcube.contentmanagement.blobstorage.service.directoryOperation.Encrypter;
|
|
import org.gcube.contentmanagement.blobstorage.service.directoryOperation.Encrypter.EncryptionException;
|
|
import org.gcube.contentmanagement.blobstorage.service.operation.*;
|
|
import org.gcube.contentmanagement.blobstorage.transport.TransportManager;
|
|
import org.gcube.contentmanagement.blobstorage.transport.backend.RemoteBackendException;
|
|
import org.gcube.contentmanagement.blobstorage.transport.backend.util.Costants;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.apache.commons.codec.binary.Base64;
|
|
import org.bson.types.ObjectId;
|
|
|
|
|
|
|
|
/**
|
|
* This is the client's engine, implements the IClient interface
|
|
* and starts the build's operations for the transport manager
|
|
*
|
|
* @author Roberto Cirillo (ISTI - CNR)
|
|
*/
|
|
|
|
public class ServiceEngine implements IClient {
|
|
|
|
/**
|
|
* Logger for this class
|
|
*/
|
|
|
|
final Logger logger = LoggerFactory.getLogger(ServiceEngine.class);
|
|
public String[] primaryBackend;
|
|
public String[] volatileBackend;
|
|
protected OperationManager service;
|
|
protected MyFile file;
|
|
protected String bucket;
|
|
protected String bucketID;
|
|
protected String author;
|
|
protected String owner;
|
|
// root Directory server side
|
|
protected String environment;
|
|
protected String currentOperation;
|
|
protected boolean replaceOption;
|
|
protected String publicArea;
|
|
protected String homeArea;
|
|
protected Map<String, String> attributes;
|
|
//identifies the scope : public, private or group
|
|
private AccessType accessType;
|
|
// parameters for GCube instance
|
|
private String serviceName;
|
|
private String ownerGcube;
|
|
private String gcubeScope;
|
|
private AccessType gcubeAccessType;
|
|
private MemoryType gcubeMemoryType;
|
|
private String serviceClass;
|
|
// identifies the backend server type eg MongoDB, UStore
|
|
private String backendType;
|
|
// backend server username
|
|
private String user;
|
|
//backend server password
|
|
private String password;
|
|
// if the backend is mongodb, this field is used for crypt/decrypt. If the backend is S3, this field is a token.
|
|
private String passPhrase;
|
|
private String resolverHost;
|
|
private String[] dbNames;
|
|
// private static final String DEFAULT_RESOLVER_HOST= "data.d4science.org";
|
|
private String write;
|
|
private String read;
|
|
private String token;
|
|
private String region;
|
|
|
|
|
|
|
|
|
|
public ServiceEngine(String[] server){
|
|
this.primaryBackend=server;
|
|
}
|
|
|
|
/**
|
|
* Constructor for version 2.0.0: The object stored from version 2.0.0 are incompatibily with previous version @
|
|
* @param server List of servers
|
|
* @param environment root directory in the remote storage
|
|
* @param accessType type of sharing: private, shared or public
|
|
* @param owner the owner of the file
|
|
*
|
|
*/
|
|
public ServiceEngine(String[] server, String environment, String accessType, String owner){
|
|
this.primaryBackend=server;
|
|
setOwner(owner);
|
|
this.setEnvironment(environment);
|
|
setAccessType(accessType);
|
|
if(accessType.equalsIgnoreCase("public"))
|
|
this.setPublicArea(Costants.FILE_SEPARATOR+getEnvironment()+Costants.FILE_SEPARATOR+"public"+Costants.FILE_SEPARATOR);
|
|
else
|
|
this.setPublicArea(Costants.FILE_SEPARATOR+getEnvironment()+Costants.FILE_SEPARATOR);
|
|
this.setHomeArea(Costants.FILE_SEPARATOR+getEnvironment()+Costants.FILE_SEPARATOR);//+"home"+FILE_SEPARATOR+owner+FILE_SEPARATOR);
|
|
}
|
|
|
|
|
|
|
|
public ServiceEngine(String[] server, String [] volatileBackend, String environment, String accessType, String owner, String memory){
|
|
if(memory.equals(MemoryType.VOLATILE.toString())&& (volatileBackend[0]!=null)){
|
|
this.primaryBackend=volatileBackend;
|
|
}else if(memory.equals(MemoryType.VOLATILE.toString())&& (volatileBackend[0]==null)){
|
|
this.primaryBackend=server;
|
|
this.volatileBackend=null;
|
|
}else{
|
|
this.primaryBackend=server;
|
|
this.volatileBackend=volatileBackend;
|
|
}
|
|
setOwner(owner);
|
|
this.setEnvironment(environment);
|
|
setAccessType(accessType);
|
|
if(accessType.equalsIgnoreCase("public"))
|
|
this.setPublicArea(Costants.FILE_SEPARATOR+getEnvironment()+Costants.FILE_SEPARATOR+"public"+Costants.FILE_SEPARATOR);
|
|
else
|
|
this.setPublicArea(Costants.FILE_SEPARATOR+getEnvironment()+Costants.FILE_SEPARATOR);
|
|
this.setHomeArea(Costants.FILE_SEPARATOR+getEnvironment()+Costants.FILE_SEPARATOR);//+"home"+FILE_SEPARATOR+owner+FILE_SEPARATOR);
|
|
}
|
|
|
|
|
|
/**
|
|
* Constructor for version < 2.0.0
|
|
* @param server backend server list
|
|
* @param id complete client id
|
|
* @param environment scope and root directory in the cluster
|
|
*/
|
|
@Deprecated
|
|
public ServiceEngine(String[] server, String id, String environment, String scope, String owner){
|
|
this.primaryBackend=server;
|
|
setOwner(owner);
|
|
this.setEnvironment(environment);
|
|
setAccessType(scope);
|
|
this.setPublicArea(Costants.FILE_SEPARATOR+environment);
|
|
this.setHomeArea(Costants.FILE_SEPARATOR+environment);
|
|
}
|
|
|
|
|
|
private String getPublicArea() {
|
|
return publicArea;
|
|
}
|
|
|
|
private void setPublicArea(String publicArea) {
|
|
logger.trace("public area is "+publicArea);
|
|
this.publicArea = publicArea;
|
|
}
|
|
|
|
private String getHomeArea() {
|
|
return homeArea;
|
|
}
|
|
|
|
private void setHomeArea(String rootPath) {
|
|
this.homeArea = rootPath;
|
|
}
|
|
|
|
private String getEnvironment() {
|
|
return environment;
|
|
}
|
|
|
|
/**
|
|
* set the remote root path
|
|
* @param environment
|
|
*/
|
|
private void setEnvironment(String environment) {
|
|
// delete initial / from variable environment
|
|
String newEnv=environment;
|
|
int ind=newEnv.indexOf('/');
|
|
while(ind == 0){
|
|
newEnv=environment.substring(1);
|
|
environment=newEnv;
|
|
ind=newEnv.indexOf('/');
|
|
}
|
|
this.environment = newEnv;
|
|
}
|
|
|
|
private String getBucketID() {
|
|
return bucketID;
|
|
}
|
|
|
|
private void setBucketID(String bucketID) {
|
|
this.bucketID=bucketID;
|
|
|
|
}
|
|
|
|
/**
|
|
* download operation
|
|
* (non-Javadoc)
|
|
*/
|
|
@Override
|
|
public LocalResource get(){
|
|
return get(Costants.DEFAULT_TRANSPORT_MANAGER);
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param backendType if specified it identifies the type of backend servers. eg. MongoDB, Ustore
|
|
* @return
|
|
*/
|
|
@Override
|
|
public LocalResource get(String backendType){
|
|
file=null;
|
|
backendType=setBackendType(backendType);
|
|
if (logger.isDebugEnabled()) {
|
|
logger.debug("get() - start");
|
|
}
|
|
setCurrentOperation("download");
|
|
this.service=new OperationManager(primaryBackend, user, password, getCurrentOperation(), file, backendType, getDbNames(), getToken());
|
|
file=setOperationInfo(file, OPERATION.DOWNLOAD);
|
|
return new LocalResource(file, this);
|
|
}
|
|
|
|
|
|
/**
|
|
* getSize operation: return the size of a remote file
|
|
*/
|
|
@Override
|
|
public RemoteResourceInfo getSize(){
|
|
return getSize(Costants.DEFAULT_TRANSPORT_MANAGER);
|
|
}
|
|
|
|
/**
|
|
* @param backendType if specified it identifies the type of backend servers. eg. MongoDB, Ustore
|
|
*/
|
|
@Override
|
|
public RemoteResourceInfo getSize(String backendType){
|
|
file=null;
|
|
backendType=setBackendType(backendType);
|
|
if (logger.isDebugEnabled()) {
|
|
logger.debug("get() - start");
|
|
}
|
|
setCurrentOperation("getSize");
|
|
this.service=new OperationManager(primaryBackend, user, password, getCurrentOperation(), file, backendType, getDbNames(), getToken());
|
|
file=setOperationInfo(file, OPERATION.GET_SIZE);
|
|
return new RemoteResourceInfo(file, this);
|
|
}
|
|
|
|
|
|
@Override
|
|
public RemoteResourceComplexInfo getMetaFile(){
|
|
file=null;
|
|
if (logger.isDebugEnabled()) {
|
|
logger.debug("get() - start");
|
|
}
|
|
setCurrentOperation("getMetaFile");
|
|
this.service=new OperationManager(primaryBackend, user, password, getCurrentOperation(), file, backendType, getDbNames(), getToken());
|
|
file=setOperationInfo(file, OPERATION.GET_META_FILE);
|
|
return new RemoteResourceComplexInfo(file, this);
|
|
}
|
|
|
|
public String getTotalUserVolume(){
|
|
file=null;
|
|
if (logger.isDebugEnabled()) {
|
|
logger.debug("get() - start");
|
|
}
|
|
setCurrentOperation("getTotalUserVolume");
|
|
this.service=new OperationManager(primaryBackend, user, password, getCurrentOperation(), file, backendType, getDbNames(), getToken());
|
|
file=setOperationInfo(file, OPERATION.GET_TOTAL_USER_VOLUME);
|
|
file = new Resource(file, this).setGenericProperties(getContext(), owner, null, "remote");
|
|
file.setRemotePath("/");
|
|
file.setOwner(owner);
|
|
getMyFile().setRemoteResource(REMOTE_RESOURCE.PATH);
|
|
setMyFile(file);
|
|
service.setResource(getMyFile());
|
|
Object info=null;
|
|
try {
|
|
if(((file.getInputStream() != null) || (file.getOutputStream()!=null)) || ((file.getLocalPath() != null) || (file.getRemotePath() != null)))
|
|
info=(String)service.startOperation(file,file.getRemotePath(), owner, primaryBackend, Costants.DEFAULT_CHUNK_OPTION, getContext(), isReplaceOption());
|
|
else{
|
|
logger.error("parameters incompatible ");
|
|
}
|
|
|
|
} catch (Throwable t) {
|
|
logger.error("get()", t.getCause());
|
|
throw new RemoteBackendException(" Error in "+currentOperation+" operation ", t.getCause());
|
|
}
|
|
if(info!=null)
|
|
return info.toString();
|
|
else
|
|
return null;
|
|
}
|
|
|
|
public String getUserTotalItems(){
|
|
file=null;
|
|
if (logger.isDebugEnabled()) {
|
|
logger.debug("get() - start");
|
|
}
|
|
setCurrentOperation("getTotalUserItems");
|
|
this.service=new OperationManager(primaryBackend, user, password, getCurrentOperation(), file, backendType, getDbNames(), getToken());
|
|
file=setOperationInfo(file, OPERATION.GET_USER_TOTAL_ITEMS);
|
|
file = new Resource(file, this).setGenericProperties(getContext(), owner, "", "remote");
|
|
file.setRemotePath("/");
|
|
file.setOwner(owner);
|
|
getMyFile().setRemoteResource(REMOTE_RESOURCE.PATH);
|
|
setMyFile(file);
|
|
service.setResource(getMyFile());
|
|
Object info=null;
|
|
try {
|
|
if(((file.getInputStream() != null) || (file.getOutputStream()!=null)) || ((file.getLocalPath() != null) || (file.getRemotePath() != null)))
|
|
info=(String)service.startOperation(file,file.getRemotePath(), owner, primaryBackend, Costants.DEFAULT_CHUNK_OPTION, getContext(), isReplaceOption());
|
|
else{
|
|
logger.error("parameters incompatible ");
|
|
}
|
|
|
|
} catch (Throwable t) {
|
|
logger.error("get()", t.getCause());
|
|
throw new RemoteBackendException(" Error in "+currentOperation+" operation ", t.getCause());
|
|
}
|
|
if(info!=null)
|
|
return info.toString();
|
|
else
|
|
return null;
|
|
}
|
|
|
|
public RemoteResourceFolderInfo getFolderTotalVolume(){
|
|
file=null;
|
|
if (logger.isDebugEnabled()) {
|
|
logger.debug("get() - start");
|
|
}
|
|
setCurrentOperation("getFolderSize");
|
|
this.service=new OperationManager(primaryBackend, user, password, getCurrentOperation(), file, backendType, getDbNames(), getToken());
|
|
file=setOperationInfo(file, OPERATION.GET_FOLDER_TOTAL_VOLUME);
|
|
return new RemoteResourceFolderInfo(file, this);
|
|
}
|
|
|
|
public RemoteResourceFolderInfo getFolderTotalItems(){
|
|
file=null;
|
|
if (logger.isDebugEnabled()) {
|
|
logger.debug("get() - start");
|
|
}
|
|
setCurrentOperation("getFolderCount");
|
|
this.service=new OperationManager(primaryBackend, user, password, getCurrentOperation(), file, backendType, getDbNames(), getToken());
|
|
file=setOperationInfo(file, OPERATION.GET_FOLDER_TOTAL_ITEMS);
|
|
return new RemoteResourceFolderInfo(file, this);
|
|
}
|
|
|
|
public RemoteResourceFolderInfo getFolderLastUpdate(){
|
|
file=null;
|
|
if (logger.isDebugEnabled()) {
|
|
logger.debug("get() - start");
|
|
}
|
|
setCurrentOperation("getFolderLastUpdate");
|
|
this.service=new OperationManager(primaryBackend, user, password, getCurrentOperation(), file, backendType, getDbNames(), getToken());
|
|
file=setOperationInfo(file, OPERATION.GET_FOLDER_LAST_UPDATE);
|
|
return new RemoteResourceFolderInfo(file, this);
|
|
}
|
|
|
|
|
|
/**
|
|
* upload operation
|
|
* path nome bucket
|
|
* @param replace true if the remote file will be replaced
|
|
* @return LocalResource object
|
|
*/
|
|
@Override
|
|
public LocalResource put(boolean replace){
|
|
file=null;
|
|
if (logger.isDebugEnabled()) {
|
|
logger.debug("put() - start");
|
|
}
|
|
setCurrentOperation("upload");
|
|
setReplaceOption(replace);
|
|
this.service=new OperationManager(primaryBackend, user, password, getCurrentOperation(), getMyFile(), backendType, getDbNames(), getToken());
|
|
file=setOperationInfo(file, OPERATION.UPLOAD);
|
|
file.setReplaceOption(replace);
|
|
return new LocalResource(file, this);
|
|
}
|
|
|
|
|
|
/**
|
|
* upload operation
|
|
* path nome bucket
|
|
* @param replace true if the remote file will be replaced
|
|
* @param mimeType: the file mimeType
|
|
* @return LocalResource object
|
|
*/
|
|
@Override
|
|
public LocalResource put(boolean replace, String mimeType){
|
|
file=null;
|
|
if (logger.isDebugEnabled()) {
|
|
logger.debug("put() - start");
|
|
}
|
|
setCurrentOperation("upload");
|
|
setReplaceOption(replace);
|
|
this.service=new OperationManager(primaryBackend, user, password, getCurrentOperation(), getMyFile(), backendType, getDbNames(), getToken());
|
|
file=setOperationInfo(file, OPERATION.UPLOAD);
|
|
file=setMimeType(file, mimeType);
|
|
file.setReplaceOption(replace);
|
|
return new LocalResource(file, this);
|
|
}
|
|
|
|
/**
|
|
* remove operation
|
|
* @return RemoteResource object
|
|
*/
|
|
@Override
|
|
public RemoteResource remove(){
|
|
return remove(Costants.DEFAULT_TRANSPORT_MANAGER);
|
|
}
|
|
|
|
|
|
@Override
|
|
public RemoteResource remove(String backendType){
|
|
backendType=setBackendType(backendType);
|
|
file=new MyFile(getGcubeMemoryType());
|
|
file.setGcubeAccessType(this.getGcubeAccessType());
|
|
file.setGcubeScope(this.getGcubeScope());
|
|
file.setOwnerGcube(this.getOwnerGcube());
|
|
file.setServiceName(this.getServiceName());
|
|
file.setServiceClass(this.getServiceClass());
|
|
// remove object operation
|
|
setCurrentOperation("remove");
|
|
file=setOperationInfo(file, OPERATION.REMOVE);
|
|
this.service=new OperationManager(primaryBackend, user, password, getCurrentOperation(), file, backendType, getDbNames(), getToken());
|
|
return new RemoteResource(file, this);
|
|
}
|
|
|
|
|
|
public MyFile getMyFile() {
|
|
return file;
|
|
}
|
|
|
|
public void setMyFile(MyFile myFile) {
|
|
this.file = myFile;
|
|
}
|
|
|
|
public String getBucket() {
|
|
return bucket;
|
|
}
|
|
|
|
public void setBucket(String bucket) {
|
|
this.bucket = bucket;
|
|
}
|
|
|
|
/**
|
|
* show the content of the remote directory
|
|
*/
|
|
@Override
|
|
public RemoteResource showDir(){
|
|
return showDir(Costants.DEFAULT_TRANSPORT_MANAGER);
|
|
}
|
|
|
|
|
|
/**
|
|
* show the content of the remote directory
|
|
*/
|
|
@Override
|
|
public RemoteResource showDir(String backendType){
|
|
backendType=setBackendType(backendType);
|
|
file=new MyFile(this.getGcubeMemoryType());
|
|
file.setGcubeAccessType(this.getGcubeAccessType());
|
|
file.setGcubeScope(this.getGcubeScope());
|
|
file.setOwnerGcube(this.getOwnerGcube());
|
|
file.setServiceName(this.getServiceName());
|
|
file.setServiceClass(this.getServiceClass());
|
|
setCurrentOperation("showDir");
|
|
file=setOperationInfo(file, OPERATION.SHOW_DIR);
|
|
return new RemoteResource(file, this);
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* @param mapDirs
|
|
* @return
|
|
*/
|
|
List<StorageObject> addObjectsDirBucket(Map<String, StorageObject> mapDirs) {
|
|
List<StorageObject> dirs;
|
|
Set<String> dirsKeys=mapDirs.keySet();
|
|
dirs= new ArrayList<StorageObject> (dirsKeys.size());
|
|
for(java.util.Iterator<String> it=dirsKeys.iterator();it.hasNext(); ){
|
|
String key=it.next();
|
|
key =new BucketCoding().bucketDirDecoding(key, getContext());
|
|
logger.debug("add "+key);
|
|
dirs.add(mapDirs.get(key));
|
|
}
|
|
return dirs;
|
|
}
|
|
|
|
@Override
|
|
public RemoteResource removeDir(){
|
|
return removeDir(Costants.DEFAULT_TRANSPORT_MANAGER);
|
|
}
|
|
|
|
@Override
|
|
public RemoteResource removeDir(String backendType){
|
|
backendType=setBackendType(backendType);
|
|
file=new MyFile(this.getGcubeMemoryType());
|
|
file.setGcubeAccessType(this.getGcubeAccessType());
|
|
file.setGcubeScope(this.getGcubeScope());
|
|
file.setOwnerGcube(this.getOwnerGcube());
|
|
file.setServiceName(this.getServiceName());
|
|
file.setServiceClass(this.getServiceClass());
|
|
setCurrentOperation("removedir");
|
|
file=setOperationInfo(file, OPERATION.REMOVE_DIR);
|
|
return new RemoteResource(file, this);
|
|
}
|
|
|
|
|
|
@Override
|
|
public RemoteResource getUrl(){
|
|
return getUrl(Costants.DEFAULT_TRANSPORT_MANAGER);
|
|
}
|
|
|
|
@Override
|
|
public RemoteResource getUrl(boolean forceCreation){
|
|
return getUrl(Costants.DEFAULT_TRANSPORT_MANAGER, forceCreation);
|
|
}
|
|
|
|
|
|
@Override
|
|
public RemoteResource getUrl(String backendType){
|
|
return getUrl(backendType, false);
|
|
}
|
|
|
|
|
|
@Override
|
|
public RemoteResource getUrl(String backendType, boolean forceCreation){
|
|
backendType=setBackendType(backendType);
|
|
file=new MyFile(this.getGcubeMemoryType());
|
|
file.setGcubeAccessType(this.getGcubeAccessType());
|
|
file.setGcubeScope(this.getGcubeScope());
|
|
file.setOwnerGcube(this.getOwnerGcube());
|
|
file.setServiceName(this.getServiceName());
|
|
file.setServiceClass(this.getServiceClass());
|
|
file.setResolverHost(getResolverHost());
|
|
file.forceCreation(forceCreation);
|
|
file.setPassPhrase(passPhrase);
|
|
setCurrentOperation("getUrl");
|
|
file=setOperationInfo(file, OPERATION.GET_URL);
|
|
this.service=new OperationManager(primaryBackend, user, password, getCurrentOperation(), file, backendType, getDbNames(), getToken());
|
|
RemoteResource resource=new RemoteResource(file, this);
|
|
return resource;
|
|
}
|
|
|
|
@Override
|
|
public RemoteResource getHttpUrl(){
|
|
return getHttpUrl(Costants.DEFAULT_TRANSPORT_MANAGER);
|
|
}
|
|
|
|
@Override
|
|
public RemoteResource getHttpUrl(boolean forceCreation){
|
|
return getHttpUrl(Costants.DEFAULT_TRANSPORT_MANAGER, forceCreation);
|
|
}
|
|
|
|
@Override
|
|
public RemoteResource getHttpUrl(String backendType){
|
|
return getHttpUrl(backendType, false);
|
|
}
|
|
|
|
|
|
@Override
|
|
public RemoteResource getHttpUrl(String backendType, boolean forceCreation){
|
|
backendType=setBackendType(backendType);
|
|
file=new MyFile(this.getGcubeMemoryType());
|
|
file.setGcubeAccessType(this.getGcubeAccessType());
|
|
file.setGcubeScope(this.getGcubeScope());
|
|
file.setOwnerGcube(this.getOwnerGcube());
|
|
file.setServiceName(this.getServiceName());
|
|
file.setServiceClass(this.getServiceClass());
|
|
file.setResolverHost(getResolverHost());
|
|
file.forceCreation(forceCreation);
|
|
file.setPassPhrase(passPhrase);
|
|
setCurrentOperation("getHttpUrl");
|
|
file=setOperationInfo(file, OPERATION.GET_HTTP_URL);
|
|
this.service=new OperationManager(primaryBackend, user, password, getCurrentOperation(), file, backendType, getDbNames(), getToken());
|
|
RemoteResource resource=new RemoteResource(file, this);
|
|
return resource;
|
|
}
|
|
|
|
/*HTTPS URL BEGIN*/
|
|
|
|
@Override
|
|
public RemoteResource getHttpsUrl(){
|
|
return getHttpsUrl(Costants.DEFAULT_TRANSPORT_MANAGER);
|
|
}
|
|
|
|
@Override
|
|
public RemoteResource getHttpsUrl(boolean forceCreation){
|
|
return getHttpsUrl(Costants.DEFAULT_TRANSPORT_MANAGER, forceCreation);
|
|
}
|
|
|
|
@Override
|
|
public RemoteResource getHttpsUrl(String backendType){
|
|
return getHttpsUrl(backendType, false);
|
|
}
|
|
|
|
|
|
@Override
|
|
public RemoteResource getHttpsUrl(String backendType, boolean forceCreation){
|
|
backendType=setBackendType(backendType);
|
|
file=new MyFile(this.getGcubeMemoryType());
|
|
file.setGcubeAccessType(this.getGcubeAccessType());
|
|
file.setGcubeScope(this.getGcubeScope());
|
|
file.setOwnerGcube(this.getOwnerGcube());
|
|
file.setServiceName(this.getServiceName());
|
|
file.setServiceClass(this.getServiceClass());
|
|
file.setResolverHost(getResolverHost());
|
|
file.forceCreation(forceCreation);
|
|
file.setPassPhrase(passPhrase);
|
|
setCurrentOperation("getHttpsUrl");
|
|
file=setOperationInfo(file, OPERATION.GET_HTTPS_URL);
|
|
this.service=new OperationManager(primaryBackend, user, password, getCurrentOperation(), file, backendType, getDbNames(), getToken());
|
|
RemoteResource resource=new RemoteResource(file, this);
|
|
return resource;
|
|
}
|
|
|
|
/*HTTPS URL END*/
|
|
|
|
|
|
|
|
/**
|
|
*
|
|
* @return private o public
|
|
*/
|
|
public String getContext(){
|
|
if(isPublic()){
|
|
return getPublicArea();
|
|
}
|
|
return getHomeArea();
|
|
}
|
|
|
|
|
|
public boolean isPublic(){
|
|
if(getScope()!=null)
|
|
return getScope().equalsIgnoreCase("public");
|
|
return Costants.DEFAULT_SCOPE.equalsIgnoreCase("public");
|
|
}
|
|
|
|
public String getScope() {
|
|
return accessType.toString();
|
|
}
|
|
|
|
// public void setScope(String scope) {
|
|
// if(scope.equalsIgnoreCase("public") || scope.equalsIgnoreCase("private") || scope.equalsIgnoreCase("group"))
|
|
// this.accessType = scope;
|
|
// else
|
|
// throw new IllegalArgumentException("bad scope usage: public | group | private ");
|
|
// }
|
|
|
|
|
|
public String getCurrentOperation() {
|
|
return currentOperation;
|
|
}
|
|
|
|
public void setCurrentOperation(String currentOperation) {
|
|
this.currentOperation = currentOperation;
|
|
}
|
|
|
|
public boolean isReplaceOption() {
|
|
return replaceOption;
|
|
}
|
|
|
|
public void setReplaceOption(boolean replaceOption) {
|
|
this.replaceOption = replaceOption;
|
|
}
|
|
|
|
|
|
public AmbiguousResource lock() {
|
|
return lock(Costants.DEFAULT_TRANSPORT_MANAGER);
|
|
}
|
|
|
|
public AmbiguousResource lock(String backendType) {
|
|
backendType=setBackendType(backendType);
|
|
file = new MyFile(true);
|
|
setCurrentOperation("lock");
|
|
this.service=new OperationManager(primaryBackend, user, password, getCurrentOperation(), file, backendType, getDbNames(), getToken());
|
|
file=setOperationInfo(file, OPERATION.LOCK);
|
|
return new AmbiguousResource(file, this);
|
|
}
|
|
|
|
|
|
@Override
|
|
public AmbiguousResource unlock(String key) {
|
|
return unlock(key, Costants.DEFAULT_TRANSPORT_MANAGER);
|
|
}
|
|
|
|
@Override
|
|
public AmbiguousResource unlock(String key, String backendType) {
|
|
backendType=setBackendType(backendType);
|
|
file=new MyFile(this.getGcubeMemoryType());
|
|
file.setLockedKey(key);
|
|
// put(true);
|
|
setCurrentOperation("unlock");
|
|
file=setOperationInfo(file, OPERATION.UNLOCK);
|
|
this.service=new OperationManager(primaryBackend, user, password, getCurrentOperation(), file, backendType, getDbNames(), getToken());
|
|
return new AmbiguousResource(file, this);
|
|
}
|
|
|
|
|
|
@Override
|
|
public RemoteResourceInfo getTTL() {
|
|
return getTTL(Costants.DEFAULT_TRANSPORT_MANAGER);
|
|
}
|
|
|
|
@Override
|
|
public RemoteResourceInfo getTTL(String backendType) {
|
|
backendType=setBackendType(backendType);
|
|
file=new MyFile(this.getGcubeMemoryType());
|
|
// put(true);
|
|
setCurrentOperation("getTTL");
|
|
file=setOperationInfo(file, OPERATION.GET_TTL);
|
|
this.service=new OperationManager(primaryBackend, user, password, getCurrentOperation(), file, backendType, getDbNames(), getToken());
|
|
return new RemoteResourceInfo(file, this);
|
|
}
|
|
|
|
|
|
@Override
|
|
public RemoteResource getMetaInfo(String field) {
|
|
return getMetaInfo(field, Costants.DEFAULT_TRANSPORT_MANAGER);
|
|
|
|
}
|
|
|
|
@Override
|
|
public RemoteResource getMetaInfo(String field, String backendType) {
|
|
backendType=setBackendType(backendType);
|
|
file=new MyFile(this.getGcubeMemoryType());
|
|
file.setGenericPropertyField(field);
|
|
setCurrentOperation("getMetaInfo");
|
|
file=setOperationInfo(file, OPERATION.GET_META_INFO);
|
|
this.service=new OperationManager(primaryBackend, user, password, getCurrentOperation(), file, backendType, getDbNames(), getToken());
|
|
return new RemoteResource(file, this);
|
|
}
|
|
|
|
@Override
|
|
public RemoteResource setMetaInfo(String field, String value) {
|
|
return setMetaInfo(field, value, Costants.DEFAULT_TRANSPORT_MANAGER);
|
|
}
|
|
|
|
@Override
|
|
public RemoteResource setMetaInfo(String field, String value, String backendType) {
|
|
backendType=setBackendType(backendType);
|
|
file=new MyFile(this.getGcubeMemoryType());
|
|
file.setGenericPropertyField(field);
|
|
file.setGenericPropertyValue(value);
|
|
setCurrentOperation("setMetaInfo");
|
|
file=setOperationInfo(file, OPERATION.SET_META_INFO);
|
|
this.service=new OperationManager(primaryBackend, user, password, getCurrentOperation(), file, backendType, getDbNames(), getToken());
|
|
return new RemoteResource(file, this);
|
|
}
|
|
|
|
@Override
|
|
public RemoteResourceInfo renewTTL(String key) {
|
|
return renewTTL(key, Costants.DEFAULT_TRANSPORT_MANAGER);
|
|
}
|
|
|
|
@Override
|
|
public RemoteResourceInfo renewTTL(String key, String backendType) {
|
|
backendType=setBackendType(backendType);
|
|
file=new MyFile(this.getGcubeMemoryType());
|
|
file.setLockedKey(key);
|
|
// put(true);
|
|
setCurrentOperation("renewTTL");
|
|
file=setOperationInfo(file, OPERATION.RENEW_TTL);
|
|
this.service=new OperationManager(primaryBackend, user, password, getCurrentOperation(), file, backendType, getDbNames(), getToken());
|
|
return new RemoteResourceInfo(file, this);
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
public RemoteResourceSource linkFile() {
|
|
return linkFile(Costants.DEFAULT_TRANSPORT_MANAGER);
|
|
}
|
|
|
|
@Override
|
|
public RemoteResourceSource linkFile(String backendType) {
|
|
backendType=setBackendType(backendType);
|
|
file=null;
|
|
setCurrentOperation("link");
|
|
file=setOperationInfo(file, OPERATION.LINK);
|
|
this.service=new OperationManager(primaryBackend, user, password, getCurrentOperation(), getMyFile(), backendType, getDbNames(), getToken());
|
|
return new RemoteResourceSource(file, this);
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
public RemoteResourceSource copyFile() {
|
|
return copyFile(Costants.DEFAULT_TRANSPORT_MANAGER, Costants.DEFAULT_REPLACE_OPTION);
|
|
}
|
|
|
|
|
|
@Override
|
|
public RemoteResourceSource copyFile(String backendType) {
|
|
return copyFile(backendType, Costants.DEFAULT_REPLACE_OPTION);
|
|
}
|
|
|
|
@Override
|
|
public RemoteResourceSource copyFile(boolean replaceOption) {
|
|
return copyFile(Costants.DEFAULT_TRANSPORT_MANAGER, replaceOption);
|
|
}
|
|
|
|
@Override
|
|
public RemoteResourceSource copyFile(String backendType, boolean replaceOption) {
|
|
backendType=setBackendType(backendType);
|
|
file=null;
|
|
setCurrentOperation("copy");
|
|
file=setOperationInfo(file, OPERATION.COPY);
|
|
file.setReplaceOption(replaceOption);
|
|
this.service=new OperationManager(primaryBackend, user, password, getCurrentOperation(), getMyFile(), backendType, getDbNames(), getToken());
|
|
return new RemoteResourceSource(file, this);
|
|
}
|
|
|
|
|
|
@Override
|
|
public RemoteResource duplicateFile() {
|
|
return duplicateFile(Costants.DEFAULT_TRANSPORT_MANAGER);
|
|
}
|
|
|
|
|
|
@Override
|
|
public RemoteResource duplicateFile(String backendType) {
|
|
backendType=setBackendType(backendType);
|
|
file=null;
|
|
setCurrentOperation("duplicate");
|
|
file=setOperationInfo(file, OPERATION.DUPLICATE);
|
|
this.service=new OperationManager(primaryBackend, user, password, getCurrentOperation(), getMyFile(), backendType, getDbNames(), getToken());
|
|
return new RemoteResource(file, this);
|
|
}
|
|
|
|
@Override
|
|
public RemoteResourceSource softCopy() {
|
|
return softCopy(Costants.DEFAULT_TRANSPORT_MANAGER, Costants.DEFAULT_REPLACE_OPTION);
|
|
}
|
|
|
|
|
|
@Override
|
|
public RemoteResourceSource softCopy(String backendType) {
|
|
return softCopy(backendType, Costants.DEFAULT_REPLACE_OPTION);
|
|
}
|
|
|
|
@Override
|
|
public RemoteResourceSource softCopy(boolean replaceOption) {
|
|
return softCopy(Costants.DEFAULT_TRANSPORT_MANAGER, replaceOption);
|
|
}
|
|
|
|
@Override
|
|
public RemoteResourceSource softCopy(String backendType, boolean replaceOption) {
|
|
file=null;
|
|
setCurrentOperation("softcopy");
|
|
file=setOperationInfo(file, OPERATION.SOFT_COPY);
|
|
file.setReplaceOption(replaceOption);
|
|
this.service=new OperationManager(primaryBackend, user, password, getCurrentOperation(), getMyFile(), backendType, getDbNames(), getToken());
|
|
return new RemoteResourceSource(file, this);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
public RemoteResourceSource moveFile() {
|
|
return moveFile(Costants.DEFAULT_TRANSPORT_MANAGER);
|
|
}
|
|
|
|
@Override
|
|
public RemoteResourceSource moveFile(String backendType) {
|
|
backendType=setBackendType(backendType);
|
|
file=null;
|
|
setCurrentOperation("move");
|
|
file=setOperationInfo(file, OPERATION.MOVE);
|
|
this.service=new OperationManager(primaryBackend, user, password, getCurrentOperation(), getMyFile(), backendType, getDbNames(), getToken());
|
|
return new RemoteResourceSource(file, this);
|
|
}
|
|
|
|
|
|
@Override
|
|
public RemoteResourceSource copyDir() {
|
|
return copyDir(Costants.DEFAULT_TRANSPORT_MANAGER);
|
|
}
|
|
|
|
|
|
@Override
|
|
public RemoteResourceSource copyDir(String backendType) {
|
|
backendType=setBackendType(backendType);
|
|
file=null;
|
|
setCurrentOperation("copy_dir");
|
|
file=setOperationInfo(file, OPERATION.COPY_DIR);
|
|
this.service=new OperationManager(primaryBackend, user, password, getCurrentOperation(), getMyFile(), backendType, getDbNames(), getToken());
|
|
return new RemoteResourceSource(file, this);
|
|
}
|
|
|
|
|
|
@Override
|
|
public RemoteResourceSource moveDir() {
|
|
return moveDir(Costants.DEFAULT_TRANSPORT_MANAGER);
|
|
}
|
|
|
|
|
|
@Override
|
|
public RemoteResourceSource moveDir(String backendType) {
|
|
backendType=setBackendType(backendType);
|
|
file=null;
|
|
setCurrentOperation("move_dir");
|
|
file=setOperationInfo(file, OPERATION.MOVE_DIR);
|
|
this.service=new OperationManager(primaryBackend, user, password, getCurrentOperation(), getMyFile(), backendType, getDbNames(), getToken());
|
|
return new RemoteResourceSource(file, this);
|
|
}
|
|
|
|
@Override
|
|
public void forceClose(){
|
|
currentOperation="forceclose";
|
|
file.setOwner(owner);
|
|
getMyFile().setRemoteResource(REMOTE_RESOURCE.PATH);
|
|
setMyFile(file);
|
|
service.setResource(getMyFile());
|
|
service.setTypeOperation("forceclose");
|
|
try {
|
|
if(((file.getInputStream() != null) || (file.getOutputStream()!=null)) || ((file.getLocalPath() != null) || (file.getRemotePath() != null)))
|
|
service.startOperation(file,file.getRemotePath(), owner, primaryBackend, Costants.DEFAULT_CHUNK_OPTION, getContext(), isReplaceOption());
|
|
else{
|
|
logger.error("parameters incompatible ");
|
|
}
|
|
|
|
} catch (Throwable t) {
|
|
logger.error("get()", t.getCause());
|
|
throw new RemoteBackendException(" Error in "+currentOperation+" operation ", t.getCause());
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public String getServiceClass() {
|
|
return serviceClass;
|
|
}
|
|
|
|
public void setServiceClass(String serviceClass) {
|
|
this.serviceClass = serviceClass;
|
|
}
|
|
|
|
public String getServiceName() {
|
|
return serviceName;
|
|
}
|
|
|
|
public void setServiceName(String serviceName) {
|
|
this.serviceName = serviceName;
|
|
}
|
|
|
|
public String getOwnerGcube() {
|
|
return ownerGcube;
|
|
}
|
|
|
|
public void setOwnerGcube(String ownerGcube) {
|
|
this.ownerGcube = ownerGcube;
|
|
}
|
|
|
|
public String getGcubeScope() {
|
|
return gcubeScope;
|
|
}
|
|
|
|
public void setGcubeScope(String gcubeScope) {
|
|
this.gcubeScope = gcubeScope;
|
|
}
|
|
|
|
public AccessType getGcubeAccessType() {
|
|
return gcubeAccessType;
|
|
}
|
|
|
|
public void setGcubeAccessType(String gcubeAccessType) {
|
|
if(gcubeAccessType.equals(AccessType.PUBLIC.toString())){
|
|
this.gcubeAccessType=AccessType.PUBLIC;
|
|
}else if(gcubeAccessType.equals(AccessType.SHARED.toString())){
|
|
this.gcubeAccessType=AccessType.SHARED;
|
|
}else if(gcubeAccessType.equals(AccessType.PRIVATE.toString())){
|
|
// the shared scope is a private scope.
|
|
this.gcubeAccessType=AccessType.PRIVATE;
|
|
}else{
|
|
throw new RuntimeException("invalid AccessType");
|
|
}
|
|
// this.gcubeAccessType = gcubeAccessType;
|
|
}
|
|
|
|
public MemoryType getGcubeMemoryType() {
|
|
return gcubeMemoryType;
|
|
}
|
|
|
|
public void setGcubeMemoryType(String gcubeMemoryType) {
|
|
if(gcubeMemoryType.equals(MemoryType.PERSISTENT.toString())){
|
|
this.gcubeMemoryType=MemoryType.PERSISTENT;
|
|
}else if(gcubeMemoryType.equals(MemoryType.VOLATILE.toString())){
|
|
this.gcubeMemoryType=MemoryType.VOLATILE;
|
|
}else if(gcubeMemoryType.equals(MemoryType.BOTH.toString())){
|
|
// the shared scope is a private scope.
|
|
this.gcubeMemoryType=MemoryType.BOTH;
|
|
}else{
|
|
throw new RuntimeException("invalid MemoryType");
|
|
}
|
|
// this.gcubeMemoryType = gcubeMemoryType;
|
|
}
|
|
|
|
private MyFile setOperationInfo(MyFile file, OPERATION op) {
|
|
if(file==null)
|
|
file=new MyFile(this.getGcubeMemoryType());
|
|
file.setOperation(op);
|
|
if(getWriteConcern() != null)
|
|
file.setWriteConcern(getWriteConcern());
|
|
if(getReadConcern() != null)
|
|
file.setReadPreference(getReadConcern());
|
|
if(!Objects.isNull(getToken()))
|
|
file.setToken(getToken());
|
|
if(!Objects.isNull(getRegion()))
|
|
file.setRegion(getRegion());
|
|
return file;
|
|
}
|
|
|
|
private MyFile setMimeType(MyFile file, String mime) {
|
|
if(file==null)
|
|
file=new MyFile(this.getGcubeMemoryType());
|
|
file.setMimeType(mime);
|
|
return file;
|
|
}
|
|
|
|
public String setBackendType(String backendType) {
|
|
if(backendType!=null)
|
|
this.backendType=backendType;
|
|
return this.backendType;
|
|
}
|
|
|
|
public String getBackendType(){
|
|
return backendType;
|
|
}
|
|
|
|
public String getBackendUser(){
|
|
return this.user;
|
|
}
|
|
|
|
public void setBackendUser(String user) {
|
|
if(user!=null)
|
|
this.user=user;
|
|
|
|
}
|
|
|
|
public String getBackendPassword(){
|
|
return this.password;
|
|
}
|
|
|
|
public void setBackendPassword(String password) {
|
|
if(password != null)
|
|
this.password=password;
|
|
|
|
}
|
|
|
|
public void setResolverHost(String resolverHost) {
|
|
this.resolverHost=resolverHost;
|
|
|
|
}
|
|
|
|
public String getResolverHost(){
|
|
if (resolverHost != null)
|
|
return resolverHost;
|
|
return Costants.DEFAULT_RESOLVER_HOST;
|
|
}
|
|
|
|
public String getPassPhrase() {
|
|
return passPhrase;
|
|
}
|
|
|
|
public void setPassPhrase(String passPhrase) {
|
|
this.passPhrase = passPhrase;
|
|
}
|
|
|
|
|
|
public String getId(String id){
|
|
if (getBackendType().equals("MongoDB")){
|
|
if(ObjectId.isValid(id))
|
|
return id;
|
|
try {
|
|
if(Base64.isBase64(id)){
|
|
byte[] valueDecoded= Base64.decodeBase64(id);
|
|
String encryptedID = new String(valueDecoded);
|
|
return new Encrypter("DES", getPassPhrase()).decrypt(encryptedID);
|
|
}else{
|
|
return new Encrypter("DES", getPassPhrase()).decrypt(id);
|
|
}
|
|
} catch (EncryptionException e) {
|
|
e.printStackTrace();
|
|
}
|
|
}else {
|
|
throw new RemoteBackendException("THe backend is not mongodb, the id cannot be decrypted because it should be not crypted");
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
public RemoteResource getRemotePath(){
|
|
backendType=setBackendType(backendType);
|
|
file=new MyFile(this.getGcubeMemoryType());
|
|
// put(true);
|
|
setCurrentOperation("getRemotePath");
|
|
file=setOperationInfo(file, OPERATION.GET_REMOTE_PATH);
|
|
file.setRootPath(this.getPublicArea());
|
|
this.service=new OperationManager(primaryBackend, user, password, getCurrentOperation(), file, backendType, getDbNames(), getToken());
|
|
return new RemoteResource(file, this);
|
|
}
|
|
|
|
public String getWriteConcern() {
|
|
return write;
|
|
}
|
|
|
|
public void setWriteConcern(String write) {
|
|
this.write = write;
|
|
}
|
|
|
|
public String getReadConcern() {
|
|
return read;
|
|
}
|
|
|
|
public void setReadConcern(String read) {
|
|
this.read = read;
|
|
}
|
|
|
|
public String getOwner() {
|
|
return owner;
|
|
}
|
|
|
|
public void setOwner(String owner) {
|
|
if (owner == null)
|
|
throw new RuntimeException("The owner cannot be null");
|
|
this.owner = owner;
|
|
}
|
|
|
|
private void setAccessType(String accessType) {
|
|
if(accessType.equals(AccessType.PUBLIC.toString())){
|
|
this.accessType=AccessType.PUBLIC;
|
|
}else{
|
|
// the shared scope is a private scope.
|
|
this.accessType=AccessType.PRIVATE;
|
|
}
|
|
}
|
|
|
|
/* (non-Javadoc)
|
|
* @see org.gcube.contentmanagement.blobstorage.service.IClient#setDbNames(java.lang.String[])
|
|
*/
|
|
@Override
|
|
public void setDbNames(String[] dbs) {
|
|
this.dbNames=dbs;
|
|
|
|
}
|
|
|
|
public String[] getDbNames(){
|
|
return this.dbNames;
|
|
}
|
|
|
|
/**
|
|
* getSize operation: return the size of a remote file
|
|
*/
|
|
@Override
|
|
public RemoteResourceBoolean exist(){
|
|
return exist(Costants.DEFAULT_TRANSPORT_MANAGER);
|
|
}
|
|
|
|
/**
|
|
* @param backendType if specified it identifies the type of backend servers. eg. MongoDB, Ustore
|
|
*/
|
|
@Override
|
|
public RemoteResourceBoolean exist(String backendType){
|
|
file=null;
|
|
backendType=setBackendType(backendType);
|
|
if (logger.isDebugEnabled()) {
|
|
logger.debug("get() - start");
|
|
}
|
|
setCurrentOperation("exist");
|
|
this.service=new OperationManager(primaryBackend, user, password, getCurrentOperation(), file, backendType, getDbNames(), getToken());
|
|
file=setOperationInfo(file, OPERATION.EXIST);
|
|
return new RemoteResourceBoolean(file, this);
|
|
}
|
|
|
|
public String getToken() {
|
|
return token;
|
|
}
|
|
|
|
public void setToken(String token) {
|
|
this.token = token;
|
|
}
|
|
|
|
public String getRegion() {
|
|
return region;
|
|
}
|
|
|
|
public void setRegion(String region) {
|
|
this.region = region;
|
|
}
|
|
} |