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(); } }