2018-11-30 12:51:17 +01:00
/ * *
*
* /
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 " ;
2018-11-30 14:23:54 +01:00
String queryString = " OperatorId= " + URLEncoder . encode ( operatorId , UTF_8 ) ;
2018-11-30 12:51:17 +01:00
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 < String , String > 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 ;
}
}