uri-resolver/src/main/java/org/gcube/datatransfer/resolver/services/StorageManager.java

70 lines
2.3 KiB
Java
Raw Normal View History

package org.gcube.datatransfer.resolver.services;
import java.io.InputStream;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.core.StreamingOutput;
import org.gcube.contentmanagement.blobstorage.resource.MyFile;
import org.gcube.contentmanagement.blobstorage.service.IClient;
import org.gcube.contentmanager.storageclient.wrapper.AccessType;
import org.gcube.contentmanager.storageclient.wrapper.StorageClient;
import org.gcube.datatransfer.resolver.SingleFileStreamingOutput;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Path("/")
public class StorageManager {
private static Logger logger = LoggerFactory.getLogger(StorageManager.class);
@GET
@Path("{smpId}")
public Response getFile(@PathParam("smpId") String smpId) {
logger.info("resolve Storage Id called");
StorageClient client = new StorageClient("DataTransfer", "UriResolver", "storageid-resolver", AccessType.PUBLIC);
IClient iClient = client.getClient();
String toSEID = iClient.getId(smpId); //to Storage Encrypted ID
logger.debug("Decoded ID"+" = "+ toSEID);
if(toSEID==null){
String error = "Decrypted id is null, thrown exception!";
throw new WebApplicationException(error, Status.BAD_REQUEST);
}
long size = iClient.getSize().RFileById(toSEID);
String fileName="download";
String contentType=null;
try{
MyFile file = client.getClient().getMetaFile().RFile(toSEID);
logger.debug("MetaFile retrieved from storage? "+ (file!=null));
fileName= file.getName();
contentType = file.getMimeType();
}catch (Exception e) {
logger.warn("Error when getting file metadata from storage, printing this warning and trying to continue..", e);
}
logger.info("filename retrieved is {}",fileName);
InputStream streamToWrite=iClient.get().RFileAsInputStream(toSEID); //input stream
StreamingOutput so = new SingleFileStreamingOutput(streamToWrite);
ResponseBuilder response = Response
.ok(so)
.header("content-disposition","attachment; filename = \""+fileName+"\"")
.header("Content-Length", size);
if (contentType!= null) response.header("Content-Type",contentType);
return response.build();
}
}