/** * */ package org.gcube.datatransfer.resolver.services; import java.io.UnsupportedEncodingException; import java.net.URI; import java.net.URLEncoder; import java.util.Map; import java.util.concurrent.ExecutionException; 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.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.gcube.common.scope.impl.ScopeBean; import org.gcube.common.scope.impl.ScopeBean.Type; import org.gcube.datatransfer.resolver.caches.LoadingVREsScopeCache; import org.gcube.datatransfer.resolver.dataminer.DataMinerRequest; import org.gcube.datatransfer.resolver.services.error.ExceptionManager; import org.gcube.datatransfer.resolver.util.Util; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * The Class DataMinerResolver. * * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it * Nov 28, 2018 */ @Path("/dataminer") public class DataMinerResolver { /** * */ private static final String UTF_8 = "UTF-8"; private static Logger logger = LoggerFactory.getLogger(CatalogueResolver.class); private static String helpURI = "https://wiki.gcube-system.org/gcube/URI_Resolver"; /** * Gets the data miner. * * @param req the req * @param provider the provider * @param path the path * @param remainPath the remain path * @return the data miner */ @GET @Path("/{vreName}/{operatorId}") public Response getDataMiner(@Context HttpServletRequest req, @PathParam("vreName") String vreName, @PathParam("operatorId") String operatorId) { logger.info(this.getClass().getSimpleName()+" GET starts..."); try { if(vreName==null || vreName.isEmpty()){ logger.error("The path parameter 'vreName' not found or empty in the path"); ExceptionManager.throwBadRequestException(req, "Mandatory path parameter 'vreName' not found or empty", this.getClass(), helpURI); } if(operatorId==null || operatorId.isEmpty()){ logger.error("The path parameter 'operatorId' not found or empty in the JSON object"); ExceptionManager.throwBadRequestException(req, "Mandatory path parameter 'operatorId' not found or empty", this.getClass(), helpURI); } try{ String fullScope = LoadingVREsScopeCache.getCache().get(vreName); //READ THE DATAMINER URL PORTLET FROM APPLICATION PROFRILE IN THE SCOPE fullScope String dataminerEndPoint = "https://pre.d4science.org/group/prevre/dataminer-manager"; String queryString = "OperatorId="+URLEncoder.encode(operatorId, UTF_8); if(req.getQueryString()!=null && !req.getQueryString().isEmpty()){ queryString+="&"+req.getQueryString(); } String dataMinerResolveURL = String.format("%s?%s", dataminerEndPoint, queryString); logger.info("Resolving the request as DataMinerURL: "+dataMinerResolveURL); return Response.seeOther(new URI(dataMinerResolveURL)).build(); }catch (ExecutionException e) { logger.error("The input VRE Name "+vreName+" not found", e); ExceptionManager.throwBadRequestException(req, "The input 'VRE Name' "+"+vreName+"+ "not found on Informatiion System. Is it a valid VRE?", this.getClass(), helpURI); } return null; }catch (Exception e) { logger.error("error resolving catalogue link",e); ExceptionManager.throwInternalErrorException(req, "Error occurred resolving catalogue link", this.getClass(), helpURI); return null; } } /** * Post catalogue. * * @param req the req * @param jsonRequest the json request * @return the response */ @POST @Path("") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.TEXT_PLAIN) public Response postCatalogue(@Context HttpServletRequest req, DataMinerRequest jsonRequest) { logger.info(this.getClass().getSimpleName()+" POST starts..."); logger.info("The body contains the request: "+jsonRequest.toString()); String scope = jsonRequest.getScope(); String operatorID = jsonRequest.getOperatorId(); if(scope==null || scope.isEmpty()){ logger.error("The parameter 'scope' not found or empty in the JSON object"); ExceptionManager.throwBadRequestException(req, "Mandatory body parameter 'scope' not found or empty in the JSON object", this.getClass(), helpURI); } if(operatorID==null || operatorID.isEmpty()){ logger.error("The parameter 'operatorId' not found or empty in the JSON object"); ExceptionManager.throwBadRequestException(req, "Mandatory body parameter 'operatorId' not found or empty in the JSON object", this.getClass(), helpURI); } ScopeBean scopeBean = new ScopeBean(scope); if(scopeBean.is(Type.VRE)){ String vreName = scopeBean.name(); try { //CHECK IF IT IS A VALID SCOPE LoadingVREsScopeCache.getCache().get(vreName); String dataminerResolverURL = String.format("%s/%s", Util.getServerURL(req), "dataminer"); String theOperator = ""; String queryString = ""; try { theOperator = URLEncoder.encode(operatorID, UTF_8); Map parameters = jsonRequest.getParameters(); for (String param : parameters.keySet()) { String value = parameters.get(param); if(value!=null) queryString+=String.format(param+"=%s", URLEncoder.encode(parameters.get(param), UTF_8))+"&"; } queryString = Util.removeLastChar(queryString); } catch (UnsupportedEncodingException e) { logger.error("Encoding error: ",e); ExceptionManager.throwBadRequestException(req, "Encoding error: "+e.getMessage(), this.getClass(), helpURI); } String dataMinerURL = String.format("%s/%s/%s?%s", dataminerResolverURL, vreName, theOperator, queryString); logger.info("Returning DataMinerURL: "+dataMinerURL); return Response.ok(dataMinerURL).header("Location", dataMinerURL).build(); } catch (ExecutionException e) { logger.error("The input scope "+scope+" not found", e); ExceptionManager.throwBadRequestException(req, "The input 'scope' "+"+scope+"+ "not found on Informatiion System. Is it a valid VRE?", this.getClass(), helpURI); } return null; }else{ logger.error("The input scope "+scope+" is not a VRE"); ExceptionManager.throwBadRequestException(req, "The input 'scope' "+"+scope+"+ "is not a VRE", this.getClass(), helpURI); } return null; } }