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-core/src/main/java/org/gcube/contentmanagement/blobstorage/transport/backend/operation/UploadOperator.java

113 lines
4.3 KiB
Java

/**
*
*/
package org.gcube.contentmanagement.blobstorage.transport.backend.operation;
import java.io.IOException;
import org.bson.types.ObjectId;
import org.gcube.contentmanagement.blobstorage.resource.MyFile;
import org.gcube.contentmanagement.blobstorage.resource.OperationDefinition;
import org.gcube.contentmanagement.blobstorage.resource.OperationDefinition.REMOTE_RESOURCE;
import org.gcube.contentmanagement.blobstorage.service.operation.Monitor;
import org.gcube.contentmanagement.blobstorage.service.operation.Upload;
import org.gcube.contentmanagement.blobstorage.transport.backend.MongoIOManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.mongodb.gridfs.GridFSDBFile;
/**
* @author Roberto Cirillo (ISTI-CNR) 2018
*
*/
public class UploadOperator extends Upload {
Logger logger= LoggerFactory.getLogger(UploadOperator.class);
/**
* @param server
* @param user
* @param pwd
* @param bucket
* @param monitor
* @param isChunk
* @param bck
* @param dbs
*/
public UploadOperator(String[] server, String user, String pwd, String bucket, Monitor monitor, boolean isChunk,
String bck, String[] dbs) {
super(server, user, pwd, bucket, monitor, isChunk, bck, dbs);
// TODO Auto-generated constructor stub
}
/* (non-Javadoc)
* @see org.gcube.contentmanagement.blobstorage.service.operation.Upload#execute(org.gcube.contentmanagement.blobstorage.transport.backend.MongoIO, org.gcube.contentmanagement.blobstorage.transport.backend.MongoIO)
*/
@Override
public String execute(MongoIOManager mongoPrimaryInstance, MongoIOManager mongoSecondaryInstance, MyFile resource, String bucket, boolean replace) throws IOException {
OperationDefinition op=((MyFile)resource).getOperationDefinition();
REMOTE_RESOURCE remoteResourceIdentifier=((MyFile)resource).getOperation().getRemoteResource();
logger.info("MongoClient put method: "+op.toString());
String dir=((MyFile)resource).getRemoteDir();
String name=((MyFile)resource).getName();
Object id=null;
ObjectId oldId=null;
// id of the remote file if present
GridFSDBFile fold = mongoPrimaryInstance.retrieveRemoteDescriptor(bucket, remoteResourceIdentifier, false);
if(fold != null){
// if a file is present
logger.info("a file is already present at: "+getBucket());
// keep old id
oldId=(ObjectId) fold.getId();
logger.info("get old id: "+oldId);
// remove old file
oldId = mongoPrimaryInstance.removeFile(resource, bucket, replace, oldId, fold);
//ADDED 03112015
if(!isReplaceOption()){
return oldId.toString();
}
// END ADDED
}
// create new file
logger.info("create new file "+bucket);
if((remoteResourceIdentifier != null) && ((remoteResourceIdentifier.equals(REMOTE_RESOURCE.ID))) && (ObjectId.isValid(getBucket()))){
id = mongoPrimaryInstance.createNewFile(resource, null, dir, name, new ObjectId(getBucket()));
}else{
id = mongoPrimaryInstance.createNewFile(resource, getBucket(), dir , name, oldId);
}
return id.toString();
}
public String executeSafeMode(MongoIOManager mongoPrimaryInstance, MongoIOManager mongoSecondaryInstance) throws IOException {
OperationDefinition op=((MyFile)resource).getOperationDefinition();
REMOTE_RESOURCE remoteResourceIdentifier=((MyFile)resource).getOperation().getRemoteResource();
logger.info("MongoClient put method: "+op.toString());
String dir=((MyFile)resource).getRemoteDir();
String name=((MyFile)resource).getName();
ObjectId id=null;
ObjectId oldId=null;
// id of the remote file if present
GridFSDBFile fold = mongoPrimaryInstance.retrieveRemoteDescriptor(getBucket(), remoteResourceIdentifier, false);
if(fold != null){
// if a file is present
logger.info("a file is already present at: "+getBucket());
// keep old id
oldId=(ObjectId) fold.getId();
logger.info("get old id: "+oldId);
// create new file
id = mongoPrimaryInstance.createNewFile(resource, getBucket(), dir, name, null);
// remove old file
oldId = mongoPrimaryInstance.removeFile(resource, getBucket(), isReplaceOption(), oldId, fold);
// oldId = removeOldMetadataFile(oldId);
// update the id to the new file
id=mongoPrimaryInstance.updateId(id, oldId);
}else{
// create new file
id = mongoPrimaryInstance.createNewFile(resource, getBucket(), dir, name, oldId);
}
return id.toString();
}
}