moved to Smargears and Jersey

git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/data-transfer/uri-resolver@173395 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
Lucio Lelii 2018-10-12 14:20:46 +00:00
parent fd99c9f3a4
commit 582673819a
12 changed files with 479 additions and 308 deletions

117
pom.xml
View File

@ -8,7 +8,7 @@
</parent>
<groupId>org.gcube.data.transfer</groupId>
<artifactId>uri-resolver</artifactId>
<version>1.15.0-SNAPSHOT</version>
<version>2.0.0-SNAPSHOT</version>
<packaging>war</packaging>
<description>The URI Resolver is an HTTP URI resolver implemented as an HTTP servlet which gives access trough HTTP to different protocols URIs. </description>
@ -25,33 +25,43 @@
<!-- <additionalparam>-Xdoclint:none</additionalparam> -->
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.gcube.distribution</groupId>
<artifactId>maven-smartgears-bom</artifactId>
<version>LATEST</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.gcube.core</groupId>
<artifactId>common-smartgears</artifactId>
</dependency>
<dependency>
<groupId>org.gcube.common</groupId>
<artifactId>common-authorization</artifactId>
</dependency>
<!-- <dependency> -->
<!-- <groupId>org.apache.tomcat</groupId> -->
<!-- <artifactId>catalina</artifactId> -->
<!-- <version>6.0.16</version> -->
<!-- </dependency> -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.gcube.contentmanagement</groupId>
<artifactId>storage-manager-wrapper</artifactId>
<version>[2.0.0-SNAPSHOT, 3.0.0-SNAPSHOT)</version>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20140107</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.gcube.contentmanagement</groupId>
<artifactId>storage-manager-core</artifactId>
@ -63,6 +73,57 @@
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.gcube.core</groupId>
<artifactId>common-encryption</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.gcube.resources.discovery</groupId>
<artifactId>discovery-client</artifactId>
</dependency>
<dependency>
<groupId>org.gcube.common</groupId>
<artifactId>authorization-client</artifactId>
</dependency>
<!-- jersey -->
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>2.13</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers.glassfish</groupId>
<artifactId>jersey-gf-cdi</artifactId>
<version>2.13</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20140107</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
@ -79,30 +140,12 @@
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.gcube.core</groupId>
<artifactId>common-encryption</artifactId>
<version>[1.0.1-SNAPSHOT, 2.0.0-SNAPSHOT)</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.gcube.resources.discovery</groupId>
<artifactId>discovery-client</artifactId>
<version>[1.0.0-SNAPSHOT, 2.0.0-SNAPSHOT)</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>org.gcube.common</groupId>
<artifactId>authorization-client</artifactId>
<version>[2.0.0-SNAPSHOT, 3.0.0-SNAPSHOT)</version>
</dependency>
<!-- DOM -->
<dependency>
@ -131,6 +174,14 @@
<artifactId>commons-io</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.2</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>

View File

@ -0,0 +1,7 @@
package org.gcube.datatransfer.resolver;
public class Constants {
public static final String SERVLET_GEONETWORK = "geonetwork";
public static final String SERVLET_CATALOGUE = "catalogue";
}

View File

@ -17,8 +17,8 @@ import java.util.List;
*/
public enum ResourceCatalogueCodes {
CTLG("ctlg","product", "Catalogue Product/Dataset"),
CTLGP("ctlg-p","product", "Catalogue Product"),
CTLG("ctlg","dataset", "Catalogue Product/Dataset"),
CTLGP("ctlg-p","dataset", "Catalogue Product"),
CTLGD("ctlg-d","dataset", "Catalogue Dataset"),
CTLGO("ctlg-o","organization", "Catalogue Organization"),
CTLGG("ctlg-g","group", "Catalogue Group");

View File

@ -0,0 +1,46 @@
package org.gcube.datatransfer.resolver;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.StreamingOutput;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SingleFileStreamingOutput implements StreamingOutput {
private static final Logger log = LoggerFactory.getLogger(SingleFileStreamingOutput.class);
InputStream streamToWrite;
public SingleFileStreamingOutput(InputStream streamToWrite) {
super();
this.streamToWrite = streamToWrite;
}
/**
* Overriding the write method to write request data directly to Jersey outputStream .
* @param outputStream
* @throws IOException
* @throws WebApplicationException
*/
@Override
public void write(OutputStream outputStream) throws IOException, WebApplicationException {
log.debug("writing StreamOutput");
copy(streamToWrite, outputStream);
log.debug("StreamOutput written");
}
private void copy(InputStream in, OutputStream out) throws IOException {
byte[] buffer = new byte[2048];
int readcount = 0;
while ((readcount=in.read(buffer))!=-1) {
out.write(buffer, 0, readcount);
}
}
}

View File

@ -0,0 +1,23 @@
package org.gcube.datatransfer.resolver;
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.Path;
import javax.ws.rs.core.Application;
import org.gcube.datatransfer.resolver.services.Catalogue;
import org.gcube.datatransfer.resolver.services.StorageManager;
@Path("uri-resolver")
public class UriResolver extends Application {
@Override
public Set<Class<?>> getClasses() {
final Set<Class<?>> classes = new HashSet<Class<?>>();
// register resources and features
classes.add(StorageManager.class);
classes.add(Catalogue.class);
return classes;
}
}

View File

@ -0,0 +1,20 @@
package org.gcube.datatransfer.resolver.catalogue;
public class CatalogueRequest {
private String gcube_scope;
private String entity_context;
private String entity_name;
public String getGcube_scope() {
return gcube_scope;
}
public String getEntity_context() {
return entity_context;
}
public String getEntity_name() {
return entity_name;
}
}

View File

@ -1,270 +0,0 @@
package org.gcube.datatransfer.resolver.http;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.IOUtils;
import org.gcube.contentmanagement.blobstorage.resource.MyFile;
import org.gcube.contentmanagement.blobstorage.service.IClient;
import org.gcube.contentmanagement.blobstorage.service.operation.GetHttpUrl;
import org.gcube.contentmanager.storageclient.model.protocol.smp.Handler;
import org.gcube.contentmanager.storageclient.wrapper.AccessType;
import org.gcube.contentmanager.storageclient.wrapper.MemoryType;
import org.gcube.contentmanager.storageclient.wrapper.StorageClient;
import org.gcube.datatransfer.resolver.MultiReadHttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* The Class StorageIDResolver.
*
* @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it
* Jan 19, 2016
*/
public class StorageIDResolver extends HttpServlet {
private static final long serialVersionUID = -5208562956923156697L;
protected static final String SMP_ID = "smp-id";
protected static final String VALIDATION = "validation";
protected static final String CONTENT_TYPE = "contentType";
protected static final String FILE_NAME = "fileName";
/** The logger. */
private static final Logger logger = LoggerFactory.getLogger(StorageIDResolver.class);
/* (non-Javadoc)
* @see javax.servlet.GenericServlet#init(javax.servlet.ServletConfig)
*/
public void init(ServletConfig conf) throws ServletException {
Handler.activateProtocol();
super.init(conf);
}
/* (non-Javadoc)
* @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
String smpID =null;
String fileName =null;
String contentType =null;
boolean validatingURI = false;
// logger.info("The http session id is: " + request.getSession().getId());
smpID = request.getParameter(SMP_ID);
if (smpID == null || smpID.equals("")) {
logger.warn(SMP_ID+" not found");
response.sendError(404);
return;
}
fileName = request.getParameter(FILE_NAME);
if (fileName == null || fileName.equals("")) {
logger.warn(FILE_NAME+" not found");
fileName = null;
}
contentType = request.getParameter(CONTENT_TYPE);
if (contentType == null || contentType.equals("")) {
logger.warn(CONTENT_TYPE+" not found");
contentType = null;
}
String validation = request.getParameter(VALIDATION);
validatingURI = Boolean.parseBoolean(validation);
logger.info("validation? "+validatingURI);
//we should not unescape the filename with spaces
logger.info(SMP_ID+" = "+ smpID);
MemoryType memory=null;
if(smpID.endsWith(GetHttpUrl.VOLATILE_URL_IDENTIFICATOR)){
memory=MemoryType.VOLATILE;
smpID=smpID.replace(GetHttpUrl.VOLATILE_URL_IDENTIFICATOR, "");
}
InputStream in = null;
String toSEID = null;
try {
OutputStream out = response.getOutputStream();
StorageClient client = null;
if(memory==null)
client=new StorageClient(StorageIDResolver.class.getName(), StorageIDResolver.class.getSimpleName(), "storageid-resolver", AccessType.PUBLIC);
else
client=new StorageClient(StorageIDResolver.class.getName(), StorageIDResolver.class.getSimpleName(), "storageid-resolver", AccessType.PUBLIC, memory);
try{
IClient icClient = client.getClient();
toSEID = icClient.getId(smpID); //to Storage Encrypted ID
logger.debug("Decoded ID"+" = "+ toSEID);
if(toSEID==null){
String error = "Decrypted id is null, thrown exception!";
throw new Exception(error);
}
in=icClient.get().RFileAsInputStream(toSEID); //input stream
}catch (Exception e) {
response.sendError(404);
logger.error("Storage Client Exception when getting file from storage: ", e);
return;
}
//CASE InputStream NULL
if(in==null){
logger.error("Input stream returned from storage is null, sending status error 404");
sendErrorQuietly(response, 404);
return;
}
try{
MyFile file = client.getClient().getMetaFile().RFile(toSEID);
logger.debug("MetaFile retrieved from storage? "+ (file!=null));
if(fileName==null || fileName.isEmpty()){ //filename
fileName = file.getName();
logger.debug("filename read from MetaFile: "+ fileName);
}
if(contentType==null || contentType.isEmpty()){ //mime type
contentType = file.getMimeType();
logger.debug("contentType read from MetaFile: "+ contentType);
}
}catch (Exception e) {
logger.warn("Error when getting file metadata from storage, printing this warning and trying to continue..", e);
}
//VALIDATING PARAMETERS: FILENAME AND CONTENT TYPE
if(fileName==null || fileName.isEmpty())
fileName = ConstantsHttpResolver.DEFAULT_FILENAME_FROM_STORAGE_MANAGER;
if(contentType==null || contentType.isEmpty())
contentType = ConstantsHttpResolver.DEFAULT_CONTENTTYPE_UNKNOWN_UNKNOWN;
//The filename should be a quoted string. (According to Section 19.5.1 of RFC 2616)
//http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html#sec19.5.1
response.setHeader(ConstantsHttpResolver.CONTENT_DISPOSITION, "attachment; filename=\"" + fileName + "\"");
response.setContentType(contentType);
//CASE VALIDATION
if(validatingURI){
byte[] bytes = new byte[1]; //1B
int c = in.read(bytes);
logger.info(c+" byte read from InputStream");
if(c>0){
logger.info("at least 1 byte read, returning status 200");
IOUtils.closeQuietly(in);
response.setStatus(200);
return;
}
}
try {
IOUtils.copy(in, out);
} catch (IOException e){
logger.warn("IOException class name: "+e.getClass().getSimpleName());
if (e.getClass().getSimpleName().equals("ClientAbortException"))
logger.warn("Skipping ClientAbortException: "+e.getMessage());
else
throw e; //Sending Exceptions
} catch (NullPointerException e) {
logger.warn("NullPointerException during copy, skipping printStrackTrace");
sendErrorQuietly(response, 404);
} catch (Exception e) {
logger.error("Exception: ",e);
sendErrorQuietly(response, 404);
} finally {
IOUtils.closeQuietly(in);
IOUtils.closeQuietly(out);
}
} catch (Exception e) {
logger.error("Exception:", e);
IOUtils.closeQuietly(in);
sendErrorQuietly(response, 404);
return;
}
}
/* (non-Javadoc)
* @see javax.servlet.http.HttpServlet#doHead(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
@Override
protected void doHead(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
logger.info("doHead working..");
String hpc = req.getParameter(ConstantsHttpResolver.HPC); //for HProxy check
try{
if(hpc==null || Boolean.parseBoolean(hpc)){
logger.trace("returning status 200 for Hproxy check");
resp.setStatus(200);
return;
}
}catch (Exception e) {
//silent exception to continue..
}
//ADDING PARAMETER TO PERFORM ONLY VALIDATION
Map<String, String[]> additionalParams = new HashMap<String, String[]>();
String[] value = new String[1];
value[0] = "true";
additionalParams.put(VALIDATION, value);
MultiReadHttpServletRequest request = new MultiReadHttpServletRequest(req, additionalParams);
doGet(request, resp);
}
/**
* Send error quietly.
*
* @param response the response
* @param code the code
*/
protected void sendErrorQuietly(HttpServletResponse response, int code){
if(response!=null){
try {
response.sendError(code);
logger.info("Response sent error: "+code);
} catch (IOException ioe) {
// ignore
}
}
}
/* (non-Javadoc)
* @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
doGet(request,response);
}
}

View File

@ -0,0 +1,196 @@
package org.gcube.datatransfer.resolver.services;
import java.net.URL;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import org.gcube.common.scope.api.ScopeProvider;
import org.gcube.datatransfer.resolver.Constants;
import org.gcube.datatransfer.resolver.ResourceCatalogueCodes;
import org.gcube.datatransfer.resolver.applicationprofile.ApplicationProfileNotFoundException;
import org.gcube.datatransfer.resolver.catalogue.CatalogueRequest;
import org.gcube.datatransfer.resolver.catalogue.CatalogueResolver;
import org.gcube.datatransfer.resolver.catalogue.resource.ApplicationProfileReaderForCatalogueResolver;
import org.gcube.datatransfer.resolver.catalogue.resource.CkanCatalogueConfigurationsReader;
import org.gcube.datatransfer.resolver.catalogue.resource.GatewayCKANCatalogueReference;
import org.gcube.datatransfer.resolver.catalogue.resource.UpdateApplicationProfileCatalogueResolver;
import org.gcube.datatransfer.resolver.scope.ScopeUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import eu.trentorise.opendata.jackan.model.CkanDataset;
@Path(Constants.SERVLET_CATALOGUE)
public class Catalogue {
private static Logger logger = LoggerFactory.getLogger(Catalogue.class);
private ApplicationProfileReaderForCatalogueResolver appPrCatResolver;
public static final String ENV_SCOPE = "SCOPE"; //Environment Variable
/** The scope to enc decr. */
private String scopeToEncDecr = null;
public void init() throws ServletException {
initScopeFromEnv();
}
/**
* Inits the scope from env.
*
* @return the string
* @throws ServletException the servlet exception
*/
private String initScopeFromEnv() throws ServletException{
if(scopeToEncDecr!=null)
return scopeToEncDecr;
try{
scopeToEncDecr = ScopeUtil.getScopeFromEnvironment();
}catch(ServletException e){
logger.error("I cannot encrypt/descrypt: ", e);
throw new ServletException(CatalogueResolver.class.getName() +" cannot work without set the Environment Variable: "+ENV_SCOPE);
}
appPrCatResolver = new ApplicationProfileReaderForCatalogueResolver(scopeToEncDecr, true);
logger.info("Resource read for CatalogueResolver: "+appPrCatResolver);
return scopeToEncDecr;
}
@GET
@Path("{ctlg(-(o|g|p|g))?}/{vreName}/{entityName}")
public Response resolveCatalogue(@PathParam("entityName") String entityName, @PathParam("vreName") String vreName, @PathParam("entityContext") String entityContext) {
try {
String entityContextValue = ResourceCatalogueCodes.valueOfCodeId(entityContext).getValue();
ApplicationProfileReaderForCatalogueResolver appPrCatResolver = new ApplicationProfileReaderForCatalogueResolver(vreName, true);
String fullScope = appPrCatResolver.getHashVreNameScope().get(vreName);
ScopeProvider.instance.set(fullScope);
GatewayCKANCatalogueReference ckanCatalogueReference = CkanCatalogueConfigurationsReader.loadCatalogueEndPoints();
logger.debug("Read fullScope: "+fullScope + " for VRE_NAME: "+vreName +" into Application Profile "+ApplicationProfileReaderForCatalogueResolver.RESOURCE_NAME);
//IS THE PRODUCT PLUBLIC OR PRIVATE?
//USING ACCESS TO PUBLIC PORTLET IF THE ITEM IS PUBLIC, OTHERWISE ACCESS TO PRIVATE PORTLET
String ckanPorltetUrl = ckanCatalogueReference.getPrivatePortletURL();
String datasetName = entityName;
if(ckanCatalogueReference.getCkanURL()!=null){
try{
CkanDataset dataset = CkanCatalogueConfigurationsReader.getDataset(datasetName, ckanCatalogueReference.getCkanURL());
if(dataset!=null){
ckanPorltetUrl = ckanCatalogueReference.getPublicPortletURL();
logger.info("The dataset "+datasetName+" is a public item using public access to CKAN portlet: "+ckanPorltetUrl);
}
}catch(Exception e){
logger.warn("Error on checking if dataset: "+datasetName+" is private or not", e);
ckanPorltetUrl = ckanCatalogueReference.getPublicPortletURL();
}
}
String url = String.format("%s?path=/%s/%s",ckanPorltetUrl,entityContextValue, entityName);
return Response.seeOther(new URL(url).toURI()).build();
}catch (Exception e) {
logger.error("error resolving catalogue link",e);
throw new WebApplicationException(e, Status.INTERNAL_SERVER_ERROR);
}
}
@POST
@Path("")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.TEXT_PLAIN)
public Response postCatalogue(@Context HttpServletRequest req, CatalogueRequest jsonRequest) {
//final CatalogueEntityRequest cer = new CatalogueEntityRequest();
//CHECK IF INPUT SCOPE IS VALID
String scope = jsonRequest.getGcube_scope();
if(!scope.startsWith("/")){
logger.info("Scope not start with char '/' adding it");
scope+="/"+scope;
}
String serverUrl = getServerURL(req);
final String vreName = scope.substring(scope.lastIndexOf("/")+1, scope.length());
ResourceCatalogueCodes rc = ResourceCatalogueCodes.valueOfCodeValue(jsonRequest.getEntity_context());
if(rc==null){
logger.error("Entity context is null/malformed");
throw new WebApplicationException("Entity context is null/malformed", Status.BAD_REQUEST);
}
String linkURL = String.format("%s/%s/%s/%s", serverUrl, rc.getId(), vreName, jsonRequest.getEntity_name());
logger.info("Writing Decoded Catalogue Link: "+linkURL);
//IT'S GOING TO UPDATE THE GENERIC RESOURCE IF IS NEEDED
final String fullscope = scope;
new Thread(){
public void run() {
try {
boolean endPointUpdated = UpdateApplicationProfileCatalogueResolver.validateEndPoint(scopeToEncDecr, vreName, fullscope);
if(endPointUpdated)
appPrCatResolver = new ApplicationProfileReaderForCatalogueResolver(fullscope, true);
}
catch (ApplicationProfileNotFoundException e) {
logger.error("Error during validating Application Profile", e);
}
};
}.start();
return Response.ok(linkURL).build();
}
/**
* Gets the server url.
*
* @param req the req
* @return the server url
*/
private String getServerURL(HttpServletRequest req) {
String scheme = req.getScheme(); // http
String serverName = req.getServerName(); // hostname.com
int serverPort = req.getServerPort(); // 80
//String contextPath = req.getContextPath(); // /mywebapp
// Reconstruct original requesting URL
StringBuffer url = new StringBuffer();
url.append(scheme).append("://").append(serverName);
if (serverPort != 80 && serverPort != 443)
url.append(":").append(serverPort);
// if(contextPath!=null)
// url.append(":").append(contextPath);
String uToS = url.toString();
logger.debug("returning servlet context URL: "+uToS);
return uToS;
}
}

View File

@ -0,0 +1,14 @@
package org.gcube.datatransfer.resolver.services;
import javax.ws.rs.Path;
import org.gcube.datatransfer.resolver.Constants;
@Path(Constants.SERVLET_GEONETWORK)
public class GeoServer {
public void resolveGeoserver() {
}
}

View File

@ -0,0 +1,67 @@
package org.gcube.datatransfer.resolver.services;
import java.io.InputStream;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
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);
@Path("{smpId}")
@Produces()
public Response getFile(@PathParam("smpId") String smpId) {
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);
}
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();
}
}

View File

@ -0,0 +1,7 @@
<application mode='online'>
<name>URIResolver</name>
<group>DataTransfer</group>
<version>1.0.0-SNAPSHOT</version>
<description>Storage Hub webapp</description>
<local-persistence location='target' />
</application>

View File

@ -1,7 +1,7 @@
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<!--
<display-name>http resolver</display-name>
<filter>
@ -72,6 +72,16 @@
<servlet-mapping>
<servlet-name>geonetwork</servlet-name>
<url-pattern>/geonetwork</url-pattern>
</servlet-mapping> -->
<servlet>
<servlet-name>org.gcube.data.access.storagehub.StorageHub</servlet-name>
</servlet>
<servlet-mapping>
<servlet-name>org.gcube.data.access.storagehub.StorageHub</servlet-name>
<url-pattern>/workspace/*</url-pattern>
</servlet-mapping>
</web-app>