2018-10-23 14:32:37 +02:00
package org.gcube.datatransfer.resolver.services ;
2018-10-31 11:52:04 +01:00
import java.io.ByteArrayInputStream ;
import java.io.ByteArrayOutputStream ;
2018-10-23 14:32:37 +02:00
import java.io.InputStream ;
import java.net.URI ;
import java.net.URISyntaxException ;
2018-10-31 11:52:04 +01:00
import java.util.ArrayList ;
2018-10-23 14:32:37 +02:00
import java.util.Arrays ;
import java.util.HashMap ;
import java.util.List ;
import java.util.Map ;
import javax.annotation.Nullable ;
import javax.servlet.http.HttpServletRequest ;
import javax.servlet.http.HttpServletResponse ;
import javax.ws.rs.GET ;
2018-10-31 11:52:04 +01:00
import javax.ws.rs.POST ;
2018-10-23 14:32:37 +02:00
import javax.ws.rs.Path ;
import javax.ws.rs.PathParam ;
import javax.ws.rs.QueryParam ;
import javax.ws.rs.core.Context ;
import javax.ws.rs.core.Response ;
import javax.ws.rs.core.Response.ResponseBuilder ;
import javax.ws.rs.core.StreamingOutput ;
import org.apache.commons.io.IOUtils ;
import org.gcube.common.scope.api.ScopeProvider ;
import org.gcube.datatransfer.resolver.GeonetworkRequestFilterParameters.MODE ;
import org.gcube.datatransfer.resolver.GeonetworkRequestFilterParameters.VISIBILITY ;
import org.gcube.datatransfer.resolver.SingleFileStreamingOutput ;
import org.gcube.datatransfer.resolver.gis.GeonetworkAccessParameter ;
import org.gcube.datatransfer.resolver.gis.GeonetworkInstance ;
2018-10-31 11:52:04 +01:00
import org.gcube.datatransfer.resolver.gis.GeonetworkServiceInterface ;
2018-10-23 14:32:37 +02:00
import org.gcube.datatransfer.resolver.gis.exception.GeonetworkInstanceException ;
2018-10-31 11:52:04 +01:00
import org.gcube.datatransfer.resolver.gis.geonetwork.FilterGetRecords ;
import org.gcube.datatransfer.resolver.gis.geonetwork.GNAuthentication ;
import org.gcube.datatransfer.resolver.gis.geonetwork.ReusableInputStream ;
2018-10-23 14:32:37 +02:00
import org.gcube.datatransfer.resolver.services.error.ExceptionManager ;
import org.gcube.datatransfer.resolver.services.exceptions.InternalServerException ;
2018-11-06 14:43:47 +01:00
import org.gcube.datatransfer.resolver.util.GetResponseRecordFilter ;
import org.gcube.datatransfer.resolver.util.HTTPCallsUtils ;
import org.gcube.datatransfer.resolver.util.ScopeUtil ;
import org.gcube.datatransfer.resolver.util.HTTPCallsUtils.HttpResponse ;
2018-10-23 14:32:37 +02:00
import org.gcube.spatial.data.geonetwork.configuration.Configuration ;
2018-10-31 11:52:04 +01:00
import org.gcube.spatial.data.geonetwork.model.Account ;
import org.gcube.spatial.data.geonetwork.model.Account.Type ;
2018-10-23 14:32:37 +02:00
import org.slf4j.Logger ;
import org.slf4j.LoggerFactory ;
2018-10-31 11:52:04 +01:00
import org.w3c.dom.Document ;
2018-10-23 14:32:37 +02:00
/ * *
* The Class GeonetworkResolver .
*
* @author Francesco Mangiacrapa at ISTI - CNR ( francesco . mangiacrapa @isti.cnr.it )
* Oct 23 , 2018
* /
2018-10-23 17:36:27 +02:00
@Path ( " geonetwork " )
2018-10-23 14:32:37 +02:00
public class GeonetworkResolver {
2018-10-31 15:58:37 +01:00
/ * *
*
* /
public static final String REPLACED_A_PUBLIC_UUID_PLEASE_IGNORE = " Replaced a public UUID, please ignore " ;
public static final String REPLACED_UUID_BY_FILTER_PLEASE_IGNORE = " Replaced UUID by " + GeonetworkResolver . class . getSimpleName ( ) + " filters, please ignore " ;
2018-10-23 14:32:37 +02:00
private static Logger logger = LoggerFactory . getLogger ( GeonetworkResolver . class ) ;
public static final String PATH_PARAM_MODE = " mode " ;
public static final String PATH_PARAM_REQUEST_DELIMITER = " requestDelimiter " ;
2018-10-31 15:58:37 +01:00
// public static final String PATH_PARAM_OWNER = "owner";
2018-10-23 14:32:37 +02:00
private static final String PATH_PARAM_VISIBILITY = " visibility " ;
private static final String PATH_PARAM_SCOPE = " scope " ;
public static final String CSW_SERVER = " srv/en/csw " ;
2018-10-23 17:36:27 +02:00
public static final String VALUE_OF_REQUEST_DELIMITIER = " $$ " ;
2018-10-31 11:52:04 +01:00
public static final String PATH_PARAM_REMAINPATH = " remainPath " ;
2018-10-23 14:32:37 +02:00
public static final String QUERY_PARAM_RESET_CACHE_PARAM = " resetcache " ;
public static final String QUERY_PARAM_RESET_CACHED_SCOPE_PARAM = " resetcachedscope " ;
public static final String SRV_EN_MEF_EXPORT = " /srv/en/mef.export " ; //MEF Geonetwork service
public static final String UUID = " uuid " ;
2018-10-31 15:58:37 +01:00
public static final String SCOPE_SEPARATOR = " | " ;
2018-10-23 14:32:37 +02:00
protected Map < String , GeonetworkInstance > cacheGNInstances ;
2018-10-23 17:36:27 +02:00
private String help = " https://wiki.gcube-system.org/gcube/GCube_Resource_Catalogue#Geonetwork_Resolver " ;
2018-10-23 14:32:37 +02:00
/ * *
* Gets the geonetwork request criteria .
* Creates a request criteria from input parameter pathWithoutGN
* The parameter pathWithoutGN should be an ordered string ( like REST request ) :
2018-10-23 17:36:27 +02:00
* SCOPE / MODE / VISIBILITY / OWNER / $$
2018-10-23 14:32:37 +02:00
* SCOPE must be : ROOT | VO | VRE
2018-10-23 17:36:27 +02:00
* MODE must be : { @link MODE }
2018-10-23 14:32:37 +02:00
* VISIBILITY must be : { @link VISIBILITY }
* OWNER ( is optional ) : filter by owner
*
* @param req the req
* @param mode the mode
* @param scope the scope
* @param visibility the visibility
2018-10-31 11:52:04 +01:00
* @param owner the owner - pass ' null ' as string if no filter applied
2018-10-23 14:32:37 +02:00
* @param requestDelimiter the request delimiter
* @param resetCache the reset cache
* @param resetScope the reset scope
* @return the geonetwork request criteria
* /
@GET
2018-10-31 15:58:37 +01:00
@Path ( " { " + PATH_PARAM_SCOPE + " }/{ " + PATH_PARAM_MODE + " }/{ " + PATH_PARAM_VISIBILITY + " }/{filterKey}/{filterValue}/$${ " + PATH_PARAM_REMAINPATH + " :(/[^?$]+)?} " )
2018-10-23 14:32:37 +02:00
public Response submitGet ( @Context HttpServletRequest req ,
2018-10-23 17:36:27 +02:00
@PathParam ( PATH_PARAM_SCOPE ) @Nullable String scope ,
@PathParam ( PATH_PARAM_MODE ) @Nullable String mode ,
@PathParam ( PATH_PARAM_VISIBILITY ) @Nullable String visibility ,
2018-10-31 15:58:37 +01:00
@PathParam ( " filterKey " ) @Nullable String filterKey ,
@PathParam ( " filterValue " ) @Nullable String filterValue ,
2018-10-31 11:52:04 +01:00
@PathParam ( PATH_PARAM_REMAINPATH ) @Nullable String remainPath ,
2018-10-23 17:36:27 +02:00
@QueryParam ( QUERY_PARAM_RESET_CACHE_PARAM ) @Nullable String resetCache ,
@QueryParam ( QUERY_PARAM_RESET_CACHED_SCOPE_PARAM ) @Nullable String resetScope ) {
2018-10-23 14:32:37 +02:00
2018-10-23 17:36:27 +02:00
logger . info ( this . getClass ( ) . getSimpleName ( ) + " GET starts... " ) ;
2018-10-31 15:58:37 +01:00
logger . info ( " Params are [mode: " + mode + " , scope: " + scope + " , visibility: " + visibility + " , filterKey: " + filterKey + " , filterValue: " + filterValue + " , remainPath: " + remainPath + " ] " ) ;
2018-10-23 14:32:37 +02:00
if ( scope = = null | | scope . isEmpty ( ) ) {
logger . error ( " Path Parameter 'scope' not found " ) ;
ExceptionManager . throwBadRequestException ( req , " Missing mandatory path parameter 'scope' " , GeonetworkResolver . class , help ) ;
}
2018-10-23 17:36:27 +02:00
if ( mode = = null | | mode . isEmpty ( ) ) {
logger . error ( " Path Parameter 'scope' not found " ) ;
ExceptionManager . throwBadRequestException ( req , " Missing mandatory path parameter 'mode' " , GeonetworkResolver . class , help ) ;
}
2018-10-31 18:23:31 +01:00
scope = ScopeUtil . normalizeScope ( scope ) ;
2018-10-23 17:36:27 +02:00
mode = mode . toUpperCase ( ) ;
try {
MODE . valueOf ( mode ) ;
} catch ( Exception e ) {
List < MODE > toPrint = Arrays . asList ( MODE . values ( ) ) ;
logger . error ( " The 'mode' parameter is wrong, Have you pass a valid parameter MODE like " + toPrint + " ? " ) ;
ExceptionManager . throwWrongParameterException ( req , " The 'mode' parameter must be value of " + toPrint , GeonetworkResolver . class , help ) ;
}
2018-10-23 14:32:37 +02:00
if ( visibility = = null ) {
logger . error ( " Path Parameter 'visibility' not found " ) ;
ExceptionManager . throwBadRequestException ( req , " Missing mandatory path parameter 'visibility' " , GeonetworkResolver . class , help ) ;
}
2018-10-23 17:36:27 +02:00
visibility = visibility . toUpperCase ( ) ;
try {
VISIBILITY . valueOf ( visibility ) ;
} catch ( Exception e ) {
List < VISIBILITY > toPrint = Arrays . asList ( VISIBILITY . values ( ) ) ;
logger . error ( " The 'visibility' parameter is wrong, Have you pass a valid parameter VISIBILITY like " + toPrint + " ? " ) ;
ExceptionManager . throwWrongParameterException ( req , " The 'visibility' parameter must be value of " + toPrint , GeonetworkResolver . class , help ) ;
}
2018-10-23 14:32:37 +02:00
if ( resetCache ! = null & & Boolean . parseBoolean ( resetCache ) ) {
purgeCacheGeonetworkInstances ( ) ;
}
if ( resetScope ! = null & & Boolean . parseBoolean ( resetScope ) ) {
resetGeonetoworkInstanceCacheForScope ( scope ) ;
}
logger . info ( " Remaining path is: " + remainPath ) ;
String gnGetlURL = null ;
try {
GeonetworkInstance gnInstance = getGeonetworkInstanceForScope ( scope ) ;
ScopeProvider . instance . set ( scope ) ;
HTTPCallsUtils httpUtils = new HTTPCallsUtils ( ) ;
Configuration config = gnInstance . getGeonetworkPublisher ( ) . getConfiguration ( ) ;
String geonetworkUrl = config . getGeoNetworkEndpoint ( ) ;
String baseURL = remainPath = = null | | remainPath . isEmpty ( ) ? geonetworkUrl + " / " + CSW_SERVER : geonetworkUrl + " / " + CSW_SERVER + remainPath ;
logger . info ( " The base URL is: " + baseURL ) ;
2018-10-31 15:58:37 +01:00
String queryString = req . getQueryString ( ) = = null | | req . getQueryString ( ) . isEmpty ( ) ? " " : " ? " + req . getQueryString ( ) ;
gnGetlURL = baseURL + queryString ;
2018-10-23 14:32:37 +02:00
logger . info ( " Sending get request to URL: " + gnGetlURL ) ;
HttpResponse proxedGNResponse = httpUtils . get ( gnGetlURL ) ;
switch ( proxedGNResponse . getStatus ( ) ) {
case HttpServletResponse . SC_OK :
//Building the response
InputStream streamToWrite = IOUtils . toInputStream ( proxedGNResponse . getResponse ( ) ) ;
StreamingOutput so = new SingleFileStreamingOutput ( streamToWrite ) ;
logger . info ( " Response return Content-Type: " + httpUtils . getLastContentType ( ) ) ;
ResponseBuilder responseBuilder = Response
. ok ( so )
//.header(ConstantsResolver.CONTENT_DISPOSITION,"attachment; filename = \""+fileName+"\"")
. header ( ConstantsResolver . CONTENT_TYPE , httpUtils . getLastContentType ( ) ) ;
return responseBuilder . build ( ) ;
case HttpServletResponse . SC_FORBIDDEN :
ExceptionManager . throwForbiddenException ( req , " You are not authorized to perform the request " + gnGetlURL , GeonetworkResolver . class , help ) ;
break ;
default :
ExceptionManager . throwInternalErrorException ( req , " Sorry, an error occurred performing the geonetwork request " + gnGetlURL + " with scope " + scope , GeonetworkResolver . class , help ) ;
}
} catch ( Exception e ) {
logger . error ( " Exception: " , e ) ;
String error = " Sorry, an error occurred on resolving geonetwork request with scope " + scope + " . Please, contact support! " ;
ExceptionManager . throwInternalErrorException ( req , error , GeonetworkResolver . class , help ) ;
}
//An error occurred
try {
throw new InternalServerException ( req , javax . ws . rs . core . Response . Status . INTERNAL_SERVER_ERROR , " Error during perform GET operation to: " + gnGetlURL , GeonetworkResolver . class , new URI ( help ) ) ;
}
catch ( URISyntaxException e ) {
//silent
return null ;
}
}
2018-10-23 17:36:27 +02:00
// /* (non-Javadoc)
// * @see javax.servlet.GenericServlet#init()
// */
// @Override
// public void init() throws ServletException {
// super.init();
// timer = new Timer(true);
// timer.schedule(new TimerTask() {
// @Override
// public void run() {
// logger.info("Resetting Geonetwork configuratiors cache...");
// purgeCacheGeonetworkInstances();
// }
// }, CACHE_RESET_DELAY, CACHE_RESET_TIME);
// }
2018-10-23 14:32:37 +02:00
@POST
2018-10-31 15:58:37 +01:00
@Path ( " { " + PATH_PARAM_SCOPE + " }/{ " + PATH_PARAM_MODE + " }/{ " + PATH_PARAM_VISIBILITY + " }/{filterKey}/{filterValue}/$${ " + PATH_PARAM_REMAINPATH + " :(/[^?$]+)?} " )
2018-10-23 14:32:37 +02:00
public Response submitPost ( @Context HttpServletRequest req ,
2018-10-23 17:36:27 +02:00
@PathParam ( PATH_PARAM_SCOPE ) @Nullable String scope ,
@PathParam ( PATH_PARAM_MODE ) @Nullable String mode ,
@PathParam ( PATH_PARAM_VISIBILITY ) @Nullable String visibility ,
2018-10-31 15:58:37 +01:00
@PathParam ( " filterKey " ) @Nullable String filterKey ,
@PathParam ( " filterValue " ) @Nullable String filterValue ,
@PathParam ( PATH_PARAM_REMAINPATH ) @Nullable String remainPath ,
@QueryParam ( QUERY_PARAM_RESET_CACHE_PARAM ) @Nullable String resetCache ,
@QueryParam ( QUERY_PARAM_RESET_CACHED_SCOPE_PARAM ) @Nullable String resetScope ) {
2018-10-23 15:02:50 +02:00
logger . info ( this . getClass ( ) . getSimpleName ( ) + " POST starts... " ) ;
2018-10-23 14:32:37 +02:00
if ( scope = = null | | scope . isEmpty ( ) ) {
logger . error ( " Path Parameter 'scope' not found " ) ;
ExceptionManager . throwBadRequestException ( req , " Missing mandatory path parameter 'scope' " , GeonetworkResolver . class , help ) ;
}
2018-10-23 17:36:27 +02:00
if ( mode = = null | | mode . isEmpty ( ) ) {
logger . error ( " Path Parameter 'scope' not found " ) ;
ExceptionManager . throwBadRequestException ( req , " Missing mandatory path parameter 'mode' " , GeonetworkResolver . class , help ) ;
2018-10-23 14:32:37 +02:00
}
2018-10-31 18:23:31 +01:00
scope = ScopeUtil . normalizeScope ( scope ) ;
2018-10-23 17:36:27 +02:00
mode = mode . toUpperCase ( ) ;
try {
MODE . valueOf ( mode ) ;
} catch ( Exception e ) {
List < MODE > toPrint = Arrays . asList ( MODE . values ( ) ) ;
logger . error ( " The 'mode' parameter is wrong, Have you pass a valid parameter MODE like " + toPrint + " ? " ) ;
ExceptionManager . throwWrongParameterException ( req , " The 'mode' parameter must be value of " + toPrint , GeonetworkResolver . class , help ) ;
}
2018-10-23 14:32:37 +02:00
2018-10-23 17:36:27 +02:00
if ( visibility = = null ) {
logger . error ( " Path Parameter 'visibility' not found " ) ;
ExceptionManager . throwBadRequestException ( req , " Missing mandatory path parameter 'visibility' " , GeonetworkResolver . class , help ) ;
2018-10-23 14:32:37 +02:00
}
2018-10-23 17:36:27 +02:00
visibility = visibility . toUpperCase ( ) ;
try {
VISIBILITY . valueOf ( visibility ) ;
} catch ( Exception e ) {
List < VISIBILITY > toPrint = Arrays . asList ( VISIBILITY . values ( ) ) ;
logger . error ( " The 'visibility' parameter is wrong, Have you pass a valid parameter VISIBILITY like " + toPrint + " ? " ) ;
ExceptionManager . throwWrongParameterException ( req , " The 'visibility' parameter must be value of " + toPrint , GeonetworkResolver . class , help ) ;
2018-10-23 14:32:37 +02:00
}
2018-10-31 15:58:37 +01:00
//HOW TO PASS MORE THAN ONE?
Map < String , String > filters = new HashMap < String , String > ( ) ;
if ( filterKey ! = null & & filterValue ! = null ) {
filters . put ( filterKey , filterValue ) ;
logger . debug ( " Added filter parmas to map filters: " + filters ) ;
2018-10-23 14:32:37 +02:00
}
2018-10-31 15:58:37 +01:00
2018-10-23 14:32:37 +02:00
String gnCSWlURL = null ;
try {
GeonetworkServiceInterface gntwAccess = new GeonetworkAccessParameter ( scope ) ;
GeonetworkInstance gnInstance = gntwAccess . getGeonetworkInstance ( ) ;
ScopeProvider . instance . set ( scope ) ;
logger . info ( " set scope provider " + scope ) ;
Configuration config = gnInstance . getGeonetworkPublisher ( ) . getConfiguration ( ) ;
Account account = config . getScopeConfiguration ( ) . getAccounts ( ) . get ( Type . CKAN ) ;
logger . info ( " CKAN user owner is: " + account . getUser ( ) ) ;
2018-10-31 18:23:31 +01:00
// logger.info("Parameters..");
// for (Enumeration<String> e = req.getParameterNames(); e.hasMoreElements();){
// String p = e.nextElement();
// logger.debug("param "+p + " value "+Arrays.toString(req.getParameterValues(p)));
// }
2018-10-23 14:32:37 +02:00
//DEBUG BODY
// String readBody = IOUtils.toString(req.getReader());
// logger.debug("doPost read body request: "+readBody);
ByteArrayOutputStream byteArray = new ByteArrayOutputStream ( ) ;
String geonetworkUrl = config . getGeoNetworkEndpoint ( ) ;
// SPECIFIC HANDLER FOR GEONETWORK REQUEST: /srv/en/mef.export
if ( remainPath ! = null & & remainPath . compareTo ( SRV_EN_MEF_EXPORT ) = = 0 ) {
logger . info ( " In case of mef.export, perfoming a custom handler " ) ;
gnCSWlURL = geonetworkUrl + SRV_EN_MEF_EXPORT ;
String [ ] uuidValues = req . getParameterValues ( UUID ) ;
if ( uuidValues ! = null ) {
String data = null ;
for ( String uuid : uuidValues ) {
data = UUID + " = " + uuid ;
}
if ( data ! = null ) {
logger . debug ( " Writing " + data + " into byte array " ) ;
byteArray . write ( data . getBytes ( ) ) ;
} else
2018-10-31 18:23:31 +01:00
IOUtils . copy ( req . getInputStream ( ) , byteArray ) ;
2018-10-23 14:32:37 +02:00
} else
2018-10-31 18:23:31 +01:00
IOUtils . copy ( req . getInputStream ( ) , byteArray ) ;
2018-10-23 14:32:37 +02:00
} else {
2018-10-31 18:23:31 +01:00
logger . info ( " IS NOT A REQUEST TO " + SRV_EN_MEF_EXPORT ) ;
gnCSWlURL = remainPath = = null | | remainPath . isEmpty ( ) ? geonetworkUrl + " / " + CSW_SERVER : geonetworkUrl + " / " + CSW_SERVER + remainPath ;
IOUtils . copy ( req . getInputStream ( ) , byteArray ) ;
2018-10-23 14:32:37 +02:00
}
HTTPCallsUtils httpUtils = new HTTPCallsUtils ( ) ;
//PRIVATE LAYERS
if ( visibility . equals ( VISIBILITY . PRV ) ) {
2018-10-31 18:23:31 +01:00
logger . info ( " Visibility: " + VISIBILITY . PRV + " getting private layers.. " ) ;
2018-10-23 14:32:37 +02:00
//VRE LAYERS
if ( mode . equals ( MODE . VRE ) ) {
2018-10-31 18:23:31 +01:00
logger . info ( " Getting " + MODE . VRE + " layers.. " ) ;
2018-10-23 14:32:37 +02:00
//HARVESTED LAYERS
} else {
2018-10-31 15:58:37 +01:00
filters . put ( " isHarvested " , " y " ) ;
2018-10-31 18:23:31 +01:00
logger . info ( " Getting " + MODE . HARVEST + " layers, I added 'isHarvested = y' to the filters [ " + filters + " ] " ) ;
2018-10-23 14:32:37 +02:00
}
if ( account . getUser ( ) ! = null ) {
boolean authorized = GNAuthentication . login ( httpUtils , geonetworkUrl , account . getUser ( ) , account . getPassword ( ) ) ;
2018-10-31 18:23:31 +01:00
logger . info ( " Authorized on " + geonetworkUrl + " ? " + authorized ) ;
2018-10-23 14:32:37 +02:00
} else
logger . info ( " Skipping authentication, ckan user (the owner) is null " ) ;
//PUBLIC LAYERS
} else {
2018-10-31 18:23:31 +01:00
logger . info ( " Visibility: " + VISIBILITY . PUB + " getting public layers.. " ) ;
2018-10-23 14:32:37 +02:00
//VRE LAYERS
if ( mode . equals ( MODE . VRE ) ) {
2018-10-31 18:23:31 +01:00
logger . info ( " Getting " + MODE . VRE + " layers, the VRE account: " + account . getUser ( ) + " will be used as owner user for filtering... Is it right? " ) ;
2018-10-31 15:58:37 +01:00
filters . put ( " ownername " , account . getUser ( ) ) ;
2018-10-23 14:32:37 +02:00
//HARVESTED LAYERS
} else {
2018-10-31 18:23:31 +01:00
//filters.put("isHarvested", "y");
logger . info ( " Getting " + MODE . HARVEST + " layers, I'm applying the filters [ " + filters + " ] " ) ;
2018-10-23 14:32:37 +02:00
}
}
logger . info ( " Sending CSW POST request to URL: " + gnCSWlURL ) ;
2018-10-31 18:23:31 +01:00
logger . info ( " Content-Type: " + req . getContentType ( ) ) ;
2018-10-23 14:32:37 +02:00
//DEBUG
//logger.debug("POST - BODY : "+byteArray.toString());
InputStream in = httpUtils . post ( gnCSWlURL , new ByteArrayInputStream ( byteArray . toByteArray ( ) ) , req . getContentType ( ) , req . getParameterMap ( ) ) ;
if ( in = = null ) {
logger . warn ( " Input stream returned is null, sending " + HttpServletResponse . SC_NOT_FOUND ) ;
ExceptionManager . throwNotFoundException ( req , " Input stream is null to the request " + gnCSWlURL + " with body: " + byteArray . toString ( ) , GeonetworkResolver . class , help ) ;
}
try {
ReusableInputStream reus = new ReusableInputStream ( in ) ;
if ( visibility . equals ( VISIBILITY . PRV ) ) {
2018-10-31 15:58:37 +01:00
logger . info ( " Private VISIBILITY requested, retrieving public file identifiers to apply filtering.. " ) ;
2018-10-23 14:32:37 +02:00
FilterGetRecords filterGetRecords = new FilterGetRecords ( byteArray . toString ( ) ) ;
if ( filterGetRecords . getFoundPublicIds ( ) ! = null & & filterGetRecords . getFoundPublicIds ( ) . size ( ) > 0 ) {
logger . info ( " I'm removing list of public IDs with " + filterGetRecords . getFoundPublicIds ( ) . size ( ) + " item/s. Is it right? " ) ;
2018-10-31 15:58:37 +01:00
in = GetResponseRecordFilter . overrideResponseIdsByListIds ( reus , filterGetRecords . getFoundPublicIds ( ) , REPLACED_A_PUBLIC_UUID_PLEASE_IGNORE ) ;
2018-10-23 14:32:37 +02:00
}
2018-10-31 15:58:37 +01:00
}
if ( filters . size ( ) > 0 ) {
logger . info ( " Applying filtering on geonet:info... filter/s used: " + filters ) ;
2018-10-23 14:32:37 +02:00
Document doc = GetResponseRecordFilter . inputStreamToW3CDocument ( reus ) ;
List < String > fileIdentifiers = GetResponseRecordFilter . getTextContentStringsForTagName ( doc , " gmd:fileIdentifier " ) ;
2018-10-31 15:58:37 +01:00
List < String > noMatchingFilter = new ArrayList < String > ( ) ;
2018-10-23 14:32:37 +02:00
for ( String fileId : fileIdentifiers ) {
2018-10-31 15:58:37 +01:00
//CKECKING THE FILTERS
for ( String fkey : filters . keySet ( ) ) {
String value = GetResponseRecordFilter . getMetadataValueByFileIdentifier ( fileId , config . getGeoNetworkEndpoint ( ) , config . getAdminAccount ( ) . getUser ( ) , config . getAdminAccount ( ) . getPassword ( ) , fkey ) ;
//String own = GetResponseRecordFilter.getMetaOwnerNameByFileIdentifier(fileId, config.getGeoNetworkEndpoint(),config.getAdminAccount().getUser(), config.getAdminAccount().getPassword());
String fValue = filters . get ( fkey ) ;
2018-10-31 18:23:31 +01:00
//Either the filter KEY doesn't matching any geonet:info (value==null)
//or the value of filterKey in geonet:info doesn't matching the passed filterValue (value.compareTo(fValue)!=0)
if ( value = = null | | value . compareTo ( fValue ) ! = 0 ) {
2018-10-31 15:58:37 +01:00
logger . trace ( fkey + " of File Identifier " + fileId + " not matching the filter: " + fkey + " with value: " + fValue + " , adding it to list to remove file identifier and exit from loop.. " ) ;
noMatchingFilter . add ( fileId ) ;
//WHEN I ADD THE FILE IDENTIFIER TO FILTERED ID, I CAN EXIT FROM CKECKING FILTERS LOOP
break ;
}
2018-10-23 14:32:37 +02:00
}
}
2018-10-31 15:58:37 +01:00
if ( noMatchingFilter . size ( ) > 0 ) {
logger . info ( " Removing " + noMatchingFilter . size ( ) + " layer/s that not macthing the filters: " + filters ) ;
//Document doc2 = GetResponseRecordFilter.inputStreamToW3CDocument(reus);
in = GetResponseRecordFilter . overrideResponseIdsByListIds ( reus , noMatchingFilter , REPLACED_UUID_BY_FILTER_PLEASE_IGNORE ) ;
//in = GetResponseRecordFilter.w3CDocumentToInputStream(doc);
2018-10-23 14:32:37 +02:00
} else {
2018-10-31 15:58:37 +01:00
logger . info ( " No replace on UUIDs was applied from filters: " + filters ) ;
2018-10-23 14:32:37 +02:00
in = reus ;
}
2018-10-31 15:58:37 +01:00
2018-10-23 14:32:37 +02:00
}
ReusableInputStream reusIs = new ReusableInputStream ( in ) ;
//END DEBUG
2018-10-31 18:23:31 +01:00
logger . info ( " Response return Content-Type: " + httpUtils . getLastContentType ( ) ) ;
2018-10-23 14:32:37 +02:00
return Response
. ok ( reusIs )
//.header(ConstantsResolver.CONTENT_DISPOSITION,"attachment; filename = \""+fileName+"\"")
. header ( ConstantsResolver . CONTENT_TYPE , httpUtils . getLastContentType ( ) ) . build ( ) ;
} catch ( Exception e ) {
logger . error ( " Error on copy the response to send to client: " , e ) ;
ExceptionManager . throwInternalErrorException ( req , " Error on copy the response! " , GeonetworkResolver . class , help ) ;
} finally {
IOUtils . closeQuietly ( in ) ;
}
} catch ( IllegalArgumentException e ) {
logger . error ( " IllegalArgumentException: " , e ) ;
ExceptionManager . throwBadRequestException ( req , " Illegal argument to carry out the request! " , GeonetworkResolver . class , help ) ;
} catch ( Exception e ) {
logger . error ( " Exception: " , e ) ;
String error = " Sorry, an error occurred on resolving geonetwork request with scope " + scope + " . Please, contact support! " ;
ExceptionManager . throwInternalErrorException ( req , error , GeonetworkResolver . class , help ) ;
}
//An error occurred
try {
throw new InternalServerException ( req , javax . ws . rs . core . Response . Status . INTERNAL_SERVER_ERROR , " Error during perform POST operation to: " + gnCSWlURL , GeonetworkResolver . class , new URI ( help ) ) ;
}
catch ( URISyntaxException e ) {
//silent
return null ;
}
2018-10-31 11:52:04 +01:00
}
2018-10-23 14:32:37 +02:00
2018-10-31 15:58:37 +01:00
// /**
// * Purge remain from query string.
// *
// * @param remain_value the scope
// * @param queryString the query string
// * @return the string
// */
// private static String purgeRemainFromQueryString(String remain_value, String queryString){
//// SCOPE is: /gcube/devsec/devVRE
//// [INFO ] 2016-04-05 15:01:42,808 org.gcube.datatransfer.resolver.gis.geonetwork.GeonetworkResolver -
//// Query String is: scope=/gcube/devsec/devVRE&version=2.0.2&request=GetCapabilities&service=CSW
// int start = queryString.indexOf(PATH_PARAM_REMAINPATH+"=");
//
// if(start>=0){
// int end = queryString.indexOf("&", start);
//
// if(end==-1 && queryString.length()==(PATH_PARAM_REMAINPATH+"="+remain_value).length()){ //SCOPE IS THE UNIQUE PARAMETER INTO QUETY STRING
// logger.debug("Scope is the unique parameter, returning empty query string");
// return "";
// }else if(end<queryString.length())
// return queryString.substring(end+1, queryString.length());
// }
//
// return queryString;
// }
2018-10-23 14:32:37 +02:00
/ * *
* Discovery geonetwork instance .
*
* @param scope the scope
* @return the geonetwork instance
* @throws GeonetworkInstanceException the geonetwork instance exception
* /
private GeonetworkInstance discoveryGeonetworkInstance ( String scope ) throws GeonetworkInstanceException {
GeonetworkAccessParameter gntwAccess = new GeonetworkAccessParameter ( scope ) ;
return gntwAccess . getGeonetworkInstance ( true , null ) ;
}
2018-10-31 15:58:37 +01:00
// /**
// * Purge scope from query string.
// *
// * @param scope_value the scope_value
// * @param queryString the query string
// * @return the string
// */
// private static String purgeScopeFromQueryString(String scope_value, String queryString){
//// SCOPE is: /gcube/devsec/devVRE
//// [INFO ] 2016-04-05 15:01:42,808 org.gcube.datatransfer.resolver.gis.geonetwork.GeonetworkResolver -
//// Query String is: scope=/gcube/devsec/devVRE&version=2.0.2&request=GetCapabilities&service=CSW
// int start = queryString.indexOf(PATH_PARAM_SCOPE+"=");
//
// if(start>=0){
// int end = queryString.indexOf("&", start);
//
// if(end==-1 && queryString.length()==(PATH_PARAM_SCOPE+"="+scope_value).length()){ //SCOPE IS THE UNIQUE PARAMETER INTO QUETY STRING
// logger.debug("Scope is the unique parameter, returning empty query string");
// return "";
// }else if(end<queryString.length())
// return queryString.substring(end+1, queryString.length());
// }
//
// return queryString;
// }
2018-10-23 14:32:37 +02:00
/ * *
* Reset geonetowork instance cache for scope .
*
* @param scope the scope
* /
private void resetGeonetoworkInstanceCacheForScope ( String scope ) {
if ( cacheGNInstances ! = null & & cacheGNInstances . get ( scope ) ! = null ) {
cacheGNInstances . remove ( scope ) ;
logger . info ( " Reset of " + scope + " in Cache Geonetwork server params perfomed! " ) ;
} else
logger . info ( " Reset of " + scope + " in Cache Geonetwork skipped, scope not exists! " ) ;
}
/ * *
* Purge cache geonetwork instances .
* /
private void purgeCacheGeonetworkInstances ( ) {
cacheGNInstances = new HashMap < String , GeonetworkInstance > ( ) ;
logger . info ( " Reset of GeonetworkInstance cache perfomed! " ) ;
}
/ * *
* Gets the geonetwork instance for scope .
*
* @param scope the scope
* @return the geonetwork instance for scope
* @throws Exception the exception
* /
protected GeonetworkInstance getGeonetworkInstanceForScope ( String scope ) throws Exception {
if ( cacheGNInstances = = null )
purgeCacheGeonetworkInstances ( ) ;
2018-10-31 18:23:31 +01:00
scope = ScopeUtil . normalizeScope ( scope ) ;
2018-10-23 14:32:37 +02:00
logger . info ( " Attempt to get geonetwork instance from GeonetworkInstance cache for scope: " + scope ) ;
GeonetworkInstance geoInstance = cacheGNInstances . get ( scope ) ;
if ( geoInstance = = null ) {
logger . info ( " Cache having null GeonetworkInstance for scope " + scope + " , reading by Geonetwork library... " ) ;
try {
geoInstance = discoveryGeonetworkInstance ( scope ) ;
cacheGNInstances . put ( scope , geoInstance ) ;
logger . info ( " Updated GeonetworkInstance Cache adding couple: Scope " + scope + " - GeonetworkInstance " + geoInstance ) ;
} catch ( Exception e ) {
logger . error ( " An error occurred on reading GeonetworkInstance for scope " + scope , e ) ;
throw new Exception ( " Sorry, An error occurred on reading GeonetworkInstance for scope " + scope ) ;
}
} else
logger . info ( " GeonetworkInstance cache for scope: " + scope + " is not null using it: " + geoInstance ) ;
return geoInstance ;
}
}