package org.gcube.datatransfer.resolver.services; import javax.enterprise.context.RequestScoped; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.core.Context; import javax.ws.rs.core.Response; import org.gcube.common.storagehub.client.StreamDescriptor; import org.gcube.common.storagehub.client.dsl.StorageHubClient; import org.gcube.datatransfer.resolver.services.error.ExceptionManager; import org.gcube.smartgears.utils.InnerMethodName; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Path("shub/{id}") public class StorageHubResolver { /** * */ public static final String STORAGE_HUB_ID = "id"; private static Logger logger = LoggerFactory.getLogger(StorageHubResolver.class); private String help = "https://wiki.gcube-system.org/gcube/URI_Resolver#STORAGE-HUB_Resolver"; @RequestScoped @PathParam(STORAGE_HUB_ID) String id; @GET @Path("") public Response download(@Context HttpServletRequest httpRequest) { InnerMethodName.instance.set("resolveStorageHubPublicLink"); logger.info(this.getClass().getSimpleName()+" GET starts..."); StorageHubClient shc = new StorageHubClient(); //Checking mandatory parameter id if(id==null || id.isEmpty()){ logger.error("Path Parameter "+STORAGE_HUB_ID+" not found"); ExceptionManager.throwBadRequestException(httpRequest, "Missing mandatory path parameter "+STORAGE_HUB_ID, StorageHubResolver.class, help); } try{ StreamDescriptor descriptor = shc.open(id).asFile().download(); return Response .ok(descriptor.getStream()) .header("content-disposition","attachment; filename = \""+descriptor.getFileName()+"\"").build(); }catch(Exception e){ logger.error("Error on getting file with "+id, e); String errorMsg = "Error on getting file with hub id '"+id+"'. "+e.getMessage(); ExceptionManager.throwInternalErrorException(httpRequest, errorMsg, StorageHubResolver.class, help); return null; } } @GET @Path("{version}") public Response downloadVersion(@Context HttpServletRequest httpRequest, @PathParam("version") String version) { InnerMethodName.instance.set("resolveStorageHubPublicLinkWithVersion"); logger.info(this.getClass().getSimpleName() +" downloadVersion called"); StorageHubClient shc = new StorageHubClient(); //Checking mandatory parameter id if(id==null || id.isEmpty()){ logger.error("Path Parameter "+STORAGE_HUB_ID+" not found"); ExceptionManager.throwBadRequestException(httpRequest, "Missing mandatory path parameter "+STORAGE_HUB_ID, StorageHubResolver.class, help); } //Checking mandatory parameter id if(version==null || version.isEmpty()){ logger.error("Parameter 'version' not found"); ExceptionManager.throwBadRequestException(httpRequest, "Missing mandatory parameter 'version'", StorageHubResolver.class, help); } try{ StreamDescriptor descriptor = shc.open(id).asFile().downloadSpecificVersion(version); return Response .ok(descriptor.getStream()) .header("content-disposition","attachment; filename = \""+descriptor.getFileName()+"\"").build(); }catch(Exception e){ String errorMsg = "Error on getting versioned file with hub id '"+id+ "' and version '"+version+"'"; logger.error(errorMsg, e); ExceptionManager.throwInternalErrorException(httpRequest, errorMsg, StorageHubResolver.class, help); return null; } } }