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/MoveDirOperator.java

111 lines
4.3 KiB
Java

/**
*
*/
package org.gcube.contentmanagement.blobstorage.transport.backend.operation;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import org.bson.types.ObjectId;
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.service.impl.ServiceEngine;
import org.gcube.contentmanagement.blobstorage.service.operation.Monitor;
import org.gcube.contentmanagement.blobstorage.service.operation.MoveDir;
import org.gcube.contentmanagement.blobstorage.transport.backend.MongoOperationManager;
import org.gcube.contentmanagement.blobstorage.transport.backend.util.Costants;
import org.gcube.contentmanagement.blobstorage.transport.backend.MongoIOManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
/**
* @author Roberto Cirillo (ISTI-CNR) 2018
*
*/
public class MoveDirOperator extends MoveDir {
Logger logger=LoggerFactory.getLogger(MoveDirOperator.class);
/**
* @param server
* @param user
* @param pwd
* @param bucket
* @param monitor
* @param isChunk
* @param backendType
* @param dbs
*/
public MoveDirOperator(String[] server, String user, String pwd, String bucket, Monitor monitor, boolean isChunk,
String backendType, String[] dbs) {
super(server, user, pwd, bucket, monitor, isChunk, backendType, dbs);
// TODO Auto-generated constructor stub
}
/* (non-Javadoc)
* @see org.gcube.contentmanagement.blobstorage.service.operation.MoveDir#execute(org.gcube.contentmanagement.blobstorage.transport.backend.MongoIO, org.gcube.contentmanagement.blobstorage.resource.MyFile, java.lang.String, java.lang.String)
*/
@Override
public List<String> execute(MongoIOManager mongoPrimaryInstance, MyFile resource, String sourcePath,
String destinationPath, MemoryType memoryType) throws UnknownHostException {
String source=sourcePath;
source = appendFileSeparator(source);
String parentFolder=extractParent(source);
String destination=destinationPath;
destination = appendFileSeparator(destination);
List<String> idList=null;
logger.debug("moveDir operation on Mongo backend, parameters: source path: "+source+" destination path: "+destination);
if((source != null) && (!source.isEmpty()) && (destination != null) && (!destination.isEmpty())){
DB db=mongoPrimaryInstance.getConnectionDB(MongoOperationManager.getPrimaryCollectionName(), true);
// GridFS meta = new GridFS(db);
DBCollection meta=mongoPrimaryInstance.getMetaDataCollection(db);
// create query for dir field
BasicDBObject query = new BasicDBObject();
query.put( "dir" , new BasicDBObject("$regex", source+"*"));
DBCursor folderCursor = meta.find(query);
if((folderCursor !=null)){
idList=new ArrayList<String>();
while(folderCursor.hasNext()){//GridFSDBFile f : folder){
DBObject f=folderCursor.next();
if(f.get("type").equals("file")){
String oldFilename=(String)f.get("filename");
String oldDir=(String)f.get("dir");
int relativePathIndex=source.length();
String relativeDirTree=parentFolder+Costants.FILE_SEPARATOR+oldDir.substring(relativePathIndex);
String relativePath=parentFolder+Costants.FILE_SEPARATOR+oldFilename.substring(relativePathIndex);
String filename=destination+relativePath;
String dir=destination+relativeDirTree;
f.put("filename", filename);
f.put("dir", dir);
mongoPrimaryInstance.updateCommonFields(f, resource, OPERATION.MOVE_DIR);
String id=f.get("_id").toString();
idList.add(id);
query = new BasicDBObject();
query.put( "_id" , new ObjectId(id));
if(!(memoryType== MemoryType.VOLATILE))
meta.update(query, f, true, false, Costants.DEFAULT_WRITE_TYPE);
else
meta.update(query, f, true, false);
// meta.update(query, f, true, true);
mongoPrimaryInstance.buildDirTree(meta, dir);
}
}
}
}else{
mongoPrimaryInstance.close();
throw new IllegalArgumentException("parameters not completed, source: "+source+", destination: "+destination);
}
mongoPrimaryInstance.close();
return idList;
}
}