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.
storage-manager-wrapper/src/main/java/org/gcube/contentmanager/storageclient/wrapper/StorageClient.java

465 lines
12 KiB
Java

package org.gcube.contentmanager.storageclient.wrapper;
import org.gcube.contentmanager.storageclient.wrapper.BackendType;
import org.gcube.contentmanager.storageclient.wrapper.AccessType;
//import org.gcube.contentmanagement.blobstorage.resource.MemoryType;
import org.gcube.contentmanager.storageclient.wrapper.MemoryType;
import org.gcube.common.scope.api.ScopeProvider;
import org.gcube.contentmanagement.blobstorage.service.IClient;
import org.gcube.contentmanagement.blobstorage.service.impl.ServiceEngine;
import org.gcube.contentmanagement.blobstorage.transport.backend.util.Costants;
import org.gcube.contentmanager.storageclient.protocol.utils.Utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Define the parameters for invoke the storage-manager-core library
* @author Roberto Cirillo (ISTI-CNR)
*
*/
public class StorageClient {
private String clientID;
// public | private | shared. If shared the rwx permits are extended to all services of the same type
private AccessType typeAccess;
private MemoryType memoryType;
private String serviceClass;
private String serviceName;
private String owner;
private String server;
private String scopeString;
private String currentScope;
private String backendType;
private String volatileHost;
private String RRScope;
private static final Logger logger = LoggerFactory.getLogger(StorageClient.class);
private static final String DEFAULT_SERVICE_CLASS="ExternalApplication";
private static final String DEFAULT_SERVICE_NAME="Default";
private static final MemoryType DEFAULT_MEMORY_TYPE=MemoryType.PERSISTENT;
/**
* Constructor without optional argument created for gcube infrastructure internal use
* @param ServiceClass
* @param ServiceName
* @param owner
* @param typeAccess
* @param scope scope identifier
* @param forceScope if true the scope used is the scope specified in scope parameter, else the scope specified in the parameter scope is used only for discovering the RuntimeResource
*/
@Deprecated
public StorageClient(String serviceClass, String serviceName, String owner, AccessType accessType, String scope, boolean forceScope){
checkScopeProvider();
if(forceScope){
this.currentScope=ScopeProvider.instance.get();
ScopeProvider.instance.set(scope);
this.scopeString=ScopeProvider.instance.get();
}else{
this.RRScope=scope;
this.scopeString=ScopeProvider.instance.get();
}
String id=owner;
this.owner=owner;
if(accessType!=null)
this.typeAccess=accessType;
else throw new RuntimeException("AccessType parameter must be not null");
this.memoryType=MemoryType.BOTH;
this.serviceClass=serviceClass;
this.serviceName=serviceName;
setClientId(serviceClass, serviceName, id);
}
/**
* Constructor without optional argument created for gcube infrastructure internal use
* @param ServiceClass
* @param ServiceName
* @param owner
* @param typeAccess
* @param scope
*/
public StorageClient(String serviceClass, String serviceName, String owner, AccessType accessType){
checkScopeProvider();
String id=owner;
this.owner=owner;
this.scopeString=ScopeProvider.instance.get();
if(accessType!=null)
this.typeAccess=accessType;
else throw new RuntimeException("AccessType parameter must be not null");
this.memoryType=MemoryType.BOTH;
this.serviceClass=serviceClass;
this.serviceName=serviceName;
setClientId(serviceClass, serviceName, id);
}
/**
* New constructor with another optional argument created for gcube infrastructure internal use.
* Available in v1.6.0
* It's possible to specify a specific backend.
* @param ServiceClass
* @param ServiceName
* @param owner
* @param typeAccess
* @param scope
*/
public StorageClient(String serviceClass, String serviceName, String owner, AccessType accessType, BackendType backend){
checkScopeProvider();
String id=owner;
this.owner=owner;
this.scopeString=ScopeProvider.instance.get();
if(accessType!=null)
this.typeAccess=accessType;
else throw new RuntimeException("AccessType parameter must be not null");
this.memoryType=MemoryType.BOTH;
this.serviceClass=serviceClass;
this.serviceName=serviceName;
this.setBackendType(backend.toString());
setClientId(serviceClass, serviceName, id);
}
/**
* Constructor created for external use
* @param owner
* @param typeAccess
* @param memory defines the kind of memory: VOLATILE or PERSISTENT
* @param scope
*/
public StorageClient(String owner, AccessType accessType, MemoryType memory){
checkScopeProvider();
String id=owner;
this.owner=owner;
this.scopeString=ScopeProvider.instance.get();
if(accessType!=null)
this.typeAccess=accessType;
else throw new RuntimeException("AccessType parameter must be not null");
if(memory!=null)
this.memoryType=memory;
else throw new RuntimeException("MemoryType parameter must be not null");
this.serviceClass=DEFAULT_SERVICE_CLASS;
this.serviceName=DEFAULT_SERVICE_NAME;
setClientId(serviceClass, serviceName, id);
}
/**
* Constructor with optional argument server
* @param ServiceClass
* @param ServiceName
* @param owner
* @param typeAccess
* @param scope
* @param server: define the mongoDBserver
*/
public StorageClient(String serviceClass, String serviceName, String owner, String server, AccessType accessType){
checkScopeProvider();
String id=owner;
this.owner=owner;
this.scopeString=ScopeProvider.instance.get();
if(accessType!=null)
this.typeAccess=accessType;
else throw new RuntimeException("AccessType parameter must be not null");
this.memoryType=MemoryType.BOTH;
this.serviceClass=serviceClass;
this.serviceName=serviceName;
this.server=server;
this.memoryType=DEFAULT_MEMORY_TYPE;
setClientId(serviceClass, serviceName, id);
}
/**
* Constructor with optional argument memoryType
* @param ServiceClass
* @param ServiceName
* @param owner
* @param typeAccess
* @param memory defines the kind of memory: VOLATILE or PERSISTENT
* @param scope
*/
public StorageClient(String serviceClass, String serviceName, String owner, AccessType accessType, MemoryType memory){
checkScopeProvider();
String id=owner;
this.owner=owner;
this.scopeString=ScopeProvider.instance.get();
if(accessType!=null)
this.typeAccess=accessType;
else throw new RuntimeException("AccessType parameter must be not null");
if(memory!=null)
this.memoryType=memory;
else throw new RuntimeException("MemoryType parameter must be not null");
this.serviceClass=serviceClass;
this.serviceName=serviceName;
setClientId(serviceClass, serviceName, id);
}
/**
* Available in v1.6.0
* It's possible to specify a specific backend.
* @param ServiceClass
* @param ServiceName
* @param owner
* @param typeAccess
* @param backend: specify mongodb (default) or s3
* @param memory defines the kind of memory: VOLATILE or PERSISTENT
* @param scope
*/
public StorageClient(String serviceClass, String serviceName, String owner, AccessType accessType, MemoryType memory, BackendType backend){
checkScopeProvider();
String id=owner;
this.owner=owner;
this.scopeString=ScopeProvider.instance.get();
if(accessType!=null)
this.typeAccess=accessType;
else throw new RuntimeException("AccessType parameter must be not null");
if(memory!=null)
this.memoryType=memory;
else throw new RuntimeException("MemoryType parameter must be not null");
this.serviceClass=serviceClass;
this.serviceName=serviceName;
setClientId(serviceClass, serviceName, id);
this.setBackendType(backend.toString());
}
/**
* Constructor with optional arguments server and memory
* @param ServiceClass
* @param ServiceName
* @param owner
* @param typeAccess
* @param memory defines the kind of memory: VOLATILE or PERSISTENT
* @param server: define the mongoDBserver
* @param scope
*/
public StorageClient(String serviceClass, String serviceName, String owner, AccessType accessType, MemoryType memory, String server){
checkScopeProvider();
String id=owner;
this.owner=owner;
this.scopeString=ScopeProvider.instance.get();
if(accessType!=null)
this.typeAccess=accessType;
else throw new RuntimeException("AccessType parameter must be not null");
if(memoryType!=null)
this.memoryType=memory;
else throw new RuntimeException("MemoryType parameter must be not null");
this.serviceClass=serviceClass;
this.serviceName=serviceName;
this.server=server;
setClientId(serviceClass, serviceName, id);
}
/**
* Get Instance remote client - storage-manager-core
* @return
* @throws IllegalStateException if the resource is not found on the IS
*/
public IClient getClient(){
Configuration cfg= new Configuration(serviceClass, serviceName, scopeString, owner, clientID, typeAccess.toString(), memoryType.toString());
cfg.getConfiguration();
ServiceEngine engine= new ServiceEngine(cfg.getPersistentHosts(), cfg.getVolatileHost(), cfg.getEnvironment(), cfg.getTypeAccess(), cfg.getOwner(), cfg.getMemoryType());
// set additional fields for the new engine object
engine.setServiceClass(getServiceClass());
engine.setServiceName(getServiceName());
engine.setGcubeAccessType(getTypeAccess().toString());
engine.setBackendType(getBackendType());
engine.setBackendUser(cfg.getUser());
engine.setBackendPassword(cfg.getPassword());
engine.setResolverHost(cfg.getResolverHost());
if(cfg.getPassPhrase()!=null)
engine.setPassPhrase(cfg.getPassPhrase());
if(getMemoryType() !=null)
engine.setGcubeMemoryType(getMemoryType().toString());
engine.setGcubeScope(ScopeProvider.instance.get());
engine.setOwnerGcube(owner);
cfg.getOptionalPropertiesFromRR( getCurrentScope(), engine);
if(getCurrentScope()!=null)
ScopeProvider.instance.set(getCurrentScope());
return engine;
}
private void setClientId(String serviceClass, String serviceName, String id) {
if(typeAccess == AccessType.PUBLIC){
clientID="";
}else if(typeAccess == AccessType.PRIVATE){
clientID=Costants.FILE_SEPARATOR+"home"+Costants.FILE_SEPARATOR+serviceClass+Costants.FILE_SEPARATOR+serviceName+Costants.FILE_SEPARATOR+id;
}else if(typeAccess==AccessType.SHARED){
clientID=Costants.FILE_SEPARATOR+"home"+Costants.FILE_SEPARATOR+serviceClass+Costants.FILE_SEPARATOR+serviceName;
}else{
throw new IllegalArgumentException("type is not correctly: public, private or shared");
}
}
/**
* if the scope provider is not set then check if the env variable: SCOPE is set and set the scopeProvider
*/
private void checkScopeProvider(){
String scopeProvided=ScopeProvider.instance.get();
if (scopeProvided==null){
scopeProvided=Utils.checkVarEnv("SCOPE");
if (scopeProvided != null){
ScopeProvider.instance.set(scopeProvided);
}else{
throw new RuntimeException("Scope not set ");
}
}else setCurrentScope(scopeProvided);
}
public String getClientID() {
return clientID;
}
public void setClientID(String clientID) {
this.clientID = clientID;
}
public AccessType getTypeAccess() {
return typeAccess;
}
public void setTypeAccess(AccessType typeAccess) {
this.typeAccess = typeAccess;
}
public MemoryType getMemoryType() {
return memoryType;
}
public void setMemoryType(MemoryType memoryType) {
this.memoryType = memoryType;
}
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 getOwner() {
return owner;
}
public void setOwner(String owner) {
this.owner = owner;
}
public String getServer() {
return server;
}
public void setServer(String server) {
this.server = server;
}
public String getScopeString() {
return scopeString;
}
public void setScopeString(String scopeString) {
this.scopeString = scopeString;
}
public String getCurrentScope() {
return currentScope;
}
public void setCurrentScope(String currentScope) {
this.currentScope = currentScope;
}
public String getBackendType() {
logger.debug("backend type returned is "+backendType);
return backendType;
}
public void setBackendType(String backendType) {
this.backendType = backendType;
}
public String getVolatileHost() {
return volatileHost;
}
public void setVolatileHost(String volatileHost) {
this.volatileHost = volatileHost;
}
public String getRRScope() {
return RRScope;
}
public void setRRScope(String rRScope) {
RRScope = rRScope;
}
}