diff --git a/src/main/java/org/gcube/datatransfer/resolver/services/AnalyticsCreateResolver.java b/src/main/java/org/gcube/datatransfer/resolver/services/AnalyticsCreateResolver.java index 3b4caf5..17d0270 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/services/AnalyticsCreateResolver.java +++ b/src/main/java/org/gcube/datatransfer/resolver/services/AnalyticsCreateResolver.java @@ -163,7 +163,7 @@ public class AnalyticsCreateResolver { if(!(e instanceof WebApplicationException)){ //UNEXPECTED EXCEPTION managing it as WebApplicationException - String error = "Error occurred on creating the Analytics for the request "+body+". Please, contact the support!"; + String error = "Error occurred on creating the Analytics for the request "+body+". Please, contact the support!"+"\nCause: "+e.getCause().getMessage(); throw ExceptionManager.internalErrorException(req, error, this.getClass(), helpURI); } //ALREADY MANAGED AS WebApplicationException diff --git a/src/main/java/org/gcube/datatransfer/resolver/services/AnalyticsGetResolver.java b/src/main/java/org/gcube/datatransfer/resolver/services/AnalyticsGetResolver.java index 74b2391..43a6de8 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/services/AnalyticsGetResolver.java +++ b/src/main/java/org/gcube/datatransfer/resolver/services/AnalyticsGetResolver.java @@ -88,7 +88,7 @@ public class AnalyticsGetResolver { if(!(e instanceof WebApplicationException)){ //UNEXPECTED EXCEPTION managing it as WebApplicationException - String error = "Error occurred on resolving the Analytics URL. Please, contact the support!"; + String error = "Error occurred on resolving the Analytics URL. Please, contact the support!"+"\nCause: "+e.getCause().getMessage(); throw ExceptionManager.internalErrorException(req, error, this.getClass(), helpURI); } //ALREADY MANAGED AS WebApplicationException diff --git a/src/main/java/org/gcube/datatransfer/resolver/services/CatalogueResolver.java b/src/main/java/org/gcube/datatransfer/resolver/services/CatalogueResolver.java index 354d0b7..bc900da 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/services/CatalogueResolver.java +++ b/src/main/java/org/gcube/datatransfer/resolver/services/CatalogueResolver.java @@ -10,6 +10,7 @@ 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; @@ -53,10 +54,15 @@ public class CatalogueResolver { */ @GET @Path("{entityContext:ctlg(-(o|g|p|d))?}/{vreName}/{entityName}") - public Response resolveCatalogue(@Context HttpServletRequest req, @PathParam("entityName") String entityName, @PathParam("vreName") String vreName, @PathParam("entityContext") String entityContext) { - InnerMethodName.instance.set("resolveCataloguePublicLink"); - logger.info(CatalogueResolver.class.getSimpleName()+" GET starts..."); + public Response resolveCatalogue(@Context HttpServletRequest req, + @PathParam("entityName") String entityName, + @PathParam("vreName") String vreName, + @PathParam("entityContext") String entityContext) throws WebApplicationException{ + + logger.info(this.getClass().getSimpleName()+" GET starts..."); + try { + InnerMethodName.instance.set("resolveCataloguePublicLink"); ItemCatalogueURLs itemCatalogueURLs = getItemCatalogueURLs(vreName, entityContext, entityName); String itemCatalogueURL; @@ -71,9 +77,15 @@ public class CatalogueResolver { return Response.seeOther(new URL(itemCatalogueURL).toURI()).build(); }catch (Exception e) { - logger.error("error resolving catalogue link",e); - ExceptionManager.internalErrorException(req, "Error occurred resolving catalogue link", this.getClass(), helpURI); - return null; + + if(!(e instanceof WebApplicationException)){ + //UNEXPECTED EXCEPTION managing it as WebApplicationException + String error = "Error occurred on resolving the Catalgoue URL. Please, contact the support!"+"\nCause: "+e.getCause().getMessage(); + throw ExceptionManager.internalErrorException(req, error, this.getClass(), helpURI); + } + //ALREADY MANAGED AS WebApplicationException + logger.error("Exception:", e); + throw (WebApplicationException) e; } } @@ -88,44 +100,57 @@ public class CatalogueResolver { @Path("catalogue") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.TEXT_PLAIN) - public Response postCatalogue(@Context HttpServletRequest req, CatalogueRequest jsonRequest) { - InnerMethodName.instance.set("postCataloguePublicLink"); - logger.info(CatalogueResolver.class.getSimpleName()+" POST starts..."); - logger.info("The body contains the request: "+jsonRequest.toString()); - //final CatalogueEntityRequest cer = new CatalogueEntityRequest(); + public Response postCatalogue(@Context HttpServletRequest req, CatalogueRequest jsonRequest) throws WebApplicationException{ + logger.info(this.getClass().getSimpleName()+" POST starts..."); - //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; + try{ + + InnerMethodName.instance.set("postCataloguePublicLink"); + logger.info("The body contains the request: "+jsonRequest.toString()); + + //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 = Util.getServerURL(req); + + final String vreName = scope.substring(scope.lastIndexOf("/")+1, scope.length()); + String fullScope = null; + //CHECK IF THE vreName has a valid scope, so it is a valid VRE + try { + fullScope = LoadingVREsScopeCache.getCache().get(vreName); + } + catch (ExecutionException e1) { + logger.error("Error on getting full scope for vre name: "+vreName, e1); + } + + if(fullScope==null) + throw ExceptionManager.notFoundException(req, "The scope '"+scope+"' does not matching any scope in the infrastructure. Is it valid?", this.getClass(), helpURI); + + ResourceCatalogueCodes rc = ResourceCatalogueCodes.valueOfCodeValue(jsonRequest.getEntity_context()); + if(rc==null){ + logger.error("Entity context is null/malformed"); + throw ExceptionManager.badRequestException(req, "Entity context is null/malformed", this.getClass(), helpURI); + } + + String linkURL = String.format("%s/%s/%s/%s", serverUrl, rc.getId(), vreName, jsonRequest.getEntity_name()); + logger.info("Returining Catalogue URL: "+linkURL); + return Response.ok(linkURL).header("Location", linkURL).build(); + + }catch (Exception e) { + + if(!(e instanceof WebApplicationException)){ + //UNEXPECTED EXCEPTION managing it as WebApplicationException + String error = "Error occurred on resolving the Analytics URL. Please, contact the support!"; + throw ExceptionManager.internalErrorException(req, error, this.getClass(), helpURI); + } + //ALREADY MANAGED AS WebApplicationException + logger.error("Exception:", e); + throw (WebApplicationException) e; } - - String serverUrl = Util.getServerURL(req); - - final String vreName = scope.substring(scope.lastIndexOf("/")+1, scope.length()); - String fullScope = null; - //CHECK IF THE vreName has a valid scope, so it is a valid VRE - try { - fullScope = LoadingVREsScopeCache.getCache().get(vreName); - } - catch (ExecutionException e1) { - logger.error("Error on getting full scope for vre name: "+vreName, e1); - } - - if(fullScope==null) - ExceptionManager.notFoundException(req, "The scope '"+scope+"' does not matching any scope in the infrastructure. Is it valid?", this.getClass(), helpURI); - - ResourceCatalogueCodes rc = ResourceCatalogueCodes.valueOfCodeValue(jsonRequest.getEntity_context()); - if(rc==null){ - logger.error("Entity context is null/malformed"); - ExceptionManager.badRequestException(req, "Entity context is null/malformed", this.getClass(), helpURI); - //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("Returining Catalogue URL: "+linkURL); - return Response.ok(linkURL).header("Location", linkURL).build(); } @@ -172,7 +197,7 @@ public class CatalogueResolver { String privatePortletURL = String.format("%s?path=/%s/%s",ckanCatalogueReference.getPrivatePortletURL(),entityContextValue, entityName); return new ItemCatalogueURLs(entityName, isPublicItem, privatePortletURL, publicPorltetURL); }catch (Exception e) { - logger.error("error resolving catalogue link",e); + logger.error("Error when resolving CatalogueURL:", e); throw e; } diff --git a/src/main/java/org/gcube/datatransfer/resolver/services/GeonetworkResolver.java b/src/main/java/org/gcube/datatransfer/resolver/services/GeonetworkResolver.java index aa9a78e..b00b372 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/services/GeonetworkResolver.java +++ b/src/main/java/org/gcube/datatransfer/resolver/services/GeonetworkResolver.java @@ -3,8 +3,6 @@ package org.gcube.datatransfer.resolver.services; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; -import java.net.URI; -import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -19,6 +17,7 @@ import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.QueryParam; +import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Context; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.ResponseBuilder; @@ -37,7 +36,6 @@ import org.gcube.datatransfer.resolver.gis.geonetwork.GeonetworkRequestFilterPar import org.gcube.datatransfer.resolver.gis.geonetwork.GeonetworkRequestFilterParameters.VISIBILITY; import org.gcube.datatransfer.resolver.gis.geonetwork.ReusableInputStream; import org.gcube.datatransfer.resolver.services.error.ExceptionManager; -import org.gcube.datatransfer.resolver.services.exceptions.InternalServerException; import org.gcube.datatransfer.resolver.util.GetResponseRecordFilter; import org.gcube.datatransfer.resolver.util.HTTPCallsUtils; import org.gcube.datatransfer.resolver.util.HTTPCallsUtils.HttpResponse; @@ -89,7 +87,7 @@ public class GeonetworkResolver { protected Map cacheGNInstances; - private String help = "https://wiki.gcube-system.org/gcube/GCube_Resource_Catalogue#Geonetwork_Resolver"; + private String helpURI = "https://wiki.gcube-system.org/gcube/GCube_Resource_Catalogue#Geonetwork_Resolver"; /** * Gets the geonetwork request criteria. @@ -122,107 +120,110 @@ public class GeonetworkResolver { @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) { + @QueryParam(QUERY_PARAM_RESET_CACHED_SCOPE_PARAM) @Nullable String resetScope) throws WebApplicationException{ logger.info(this.getClass().getSimpleName()+" GET starts..."); - logger.info("Params are [mode: "+mode+", scope: "+scope+", visibility: "+visibility+", filterKey: "+filterKey+", filterValue: "+filterValue+", remainPath: "+remainPath+"]"); - - if(scope==null || scope.isEmpty()){ - logger.error("Path Parameter 'scope' not found"); - ExceptionManager.badRequestException(req, "Missing mandatory path parameter 'scope'", this.getClass(), help); - } - - if(mode==null || mode.isEmpty()){ - logger.error("Path Parameter 'scope' not found"); - ExceptionManager.badRequestException(req, "Missing mandatory path parameter 'mode'", this.getClass(), help); - } - - scope = ScopeUtil.normalizeScope(scope, "|"); - mode = mode.toUpperCase(); - try{ - MODE.valueOf(mode); - }catch(Exception e){ - List toPrint = Arrays.asList(MODE.values()); - logger.error("The 'mode' parameter is wrong, Have you pass a valid parameter MODE like "+toPrint+"?"); - ExceptionManager.wrongParameterException(req, "The 'mode' parameter must be value of "+toPrint, this.getClass(), help); - } - - if(visibility==null){ - logger.error("Path Parameter 'visibility' not found"); - ExceptionManager.badRequestException(req, "Missing mandatory path parameter 'visibility'", this.getClass(), help); - } - - visibility = visibility.toUpperCase(); - try{ - VISIBILITY.valueOf(visibility); - }catch (Exception e) { - List toPrint = Arrays.asList(VISIBILITY.values()); - logger.error("The 'visibility' parameter is wrong, Have you pass a valid parameter VISIBILITY like "+toPrint+"?"); - ExceptionManager.wrongParameterException(req, "The 'visibility' parameter must be value of "+toPrint, this.getClass(), help); - } - - 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 { + logger.info("Params are [mode: "+mode+", scope: "+scope+", visibility: "+visibility+", filterKey: "+filterKey+", filterValue: "+filterValue+", remainPath: "+remainPath+"]"); - 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); - String queryString = req.getQueryString()==null || req.getQueryString().isEmpty()?"":"?"+req.getQueryString(); - gnGetlURL = baseURL+queryString; - 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_TYPE, httpUtils.getLastContentType()); - return responseBuilder.build(); - - case HttpServletResponse.SC_FORBIDDEN: - ExceptionManager.forbiddenException(req, "You are not authorized to perform the request "+gnGetlURL, this.getClass(), help); - break; - - default: - ExceptionManager.internalErrorException(req, "Sorry, an error occurred performing the geonetwork request "+gnGetlURL+" with scope "+scope, this.getClass(), help); + if(scope==null || scope.isEmpty()){ + logger.error("Path Parameter 'scope' not found"); + throw ExceptionManager.badRequestException(req, "Missing mandatory path parameter 'scope'", this.getClass(), helpURI); } - } catch (Exception e) { + if(mode==null || mode.isEmpty()){ + logger.error("Path Parameter 'scope' not found"); + throw ExceptionManager.badRequestException(req, "Missing mandatory path parameter 'mode'", this.getClass(), helpURI); + } + + scope = ScopeUtil.normalizeScope(scope, "|"); + mode = mode.toUpperCase(); + try{ + MODE.valueOf(mode); + }catch(Exception e){ + List toPrint = Arrays.asList(MODE.values()); + logger.error("The 'mode' parameter is wrong, Have you pass a valid parameter MODE like "+toPrint+"?"); + throw ExceptionManager.wrongParameterException(req, "The 'mode' parameter must be value of "+toPrint, this.getClass(), helpURI); + } + + if(visibility==null){ + logger.error("Path Parameter 'visibility' not found"); + throw ExceptionManager.badRequestException(req, "Missing mandatory path parameter 'visibility'", this.getClass(), helpURI); + } + + visibility = visibility.toUpperCase(); + try{ + VISIBILITY.valueOf(visibility); + }catch (Exception e) { + List toPrint = Arrays.asList(VISIBILITY.values()); + logger.error("The 'visibility' parameter is wrong, Have you pass a valid parameter VISIBILITY like "+toPrint+"?"); + throw ExceptionManager.wrongParameterException(req, "The 'visibility' parameter must be value of "+toPrint, this.getClass(), helpURI); + } + + if(resetCache!=null && Boolean.parseBoolean(resetCache)){ + purgeCacheGeonetworkInstances(); + } + + if(resetScope!=null && Boolean.parseBoolean(resetScope)){ + resetGeonetoworkInstanceCacheForScope(scope); + } + + logger.info("Remaining path is: "+remainPath); + 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); + String queryString = req.getQueryString()==null || req.getQueryString().isEmpty()?"":"?"+req.getQueryString(); + gnGetlURL = baseURL+queryString; + 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_TYPE, httpUtils.getLastContentType()); + return responseBuilder.build(); + + case HttpServletResponse.SC_FORBIDDEN: + throw ExceptionManager.forbiddenException(req, "You are not authorized to perform the request "+gnGetlURL, this.getClass(), helpURI); + + default: + throw ExceptionManager.internalErrorException(req, "Sorry, an error occurred performing the geonetwork request "+gnGetlURL+" with scope "+scope, this.getClass(), helpURI); + } + + } catch (Exception e) { + logger.error("Exception:", e); + String error = "Sorry, an error occurred on resolving geonetwork request with scope "+scope+". Please, contact support!"; + throw ExceptionManager.internalErrorException(req, error, this.getClass(), helpURI); + } + + }catch (Exception e) { + + if(!(e instanceof WebApplicationException)){ + //UNEXPECTED EXCEPTION managing it as WebApplicationException + String error = "Error during perform GET operation to: "+gnGetlURL+". Please, contact the support!"; + throw ExceptionManager.internalErrorException(req, error, this.getClass(), helpURI); + } + //ALREADY MANAGED AS WebApplicationException logger.error("Exception:", e); - String error = "Sorry, an error occurred on resolving geonetwork request with scope "+scope+". Please, contact support!"; - ExceptionManager.internalErrorException(req, error, this.getClass(), 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, this.getClass(), new URI(help)); - } - catch (URISyntaxException e) { - //silent - return null; + throw (WebApplicationException) e; } } @@ -237,233 +238,238 @@ public class GeonetworkResolver { @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) { + @QueryParam(QUERY_PARAM_RESET_CACHED_SCOPE_PARAM) @Nullable String resetScope) throws WebApplicationException{ logger.info(this.getClass().getSimpleName()+" POST starts..."); - logger.info("Params are [mode: "+mode+", scope: "+scope+", visibility: "+visibility+", filterKey: "+filterKey+", filterValue: "+filterValue+", remainPath: "+remainPath+"]"); - - if(scope==null || scope.isEmpty()){ - logger.error("Path Parameter 'scope' not found"); - ExceptionManager.badRequestException(req, "Missing mandatory path parameter 'scope'", this.getClass(), help); - } - - if(mode==null || mode.isEmpty()){ - logger.error("Path Parameter 'scope' not found"); - ExceptionManager.badRequestException(req, "Missing mandatory path parameter 'mode'", this.getClass(), help); - } - - scope = ScopeUtil.normalizeScope(scope, "|"); - mode = mode.toUpperCase(); - try{ - MODE.valueOf(mode); - }catch(Exception e){ - List toPrint = Arrays.asList(MODE.values()); - logger.error("The 'mode' parameter is wrong, Have you pass a valid parameter MODE like "+toPrint+"?"); - ExceptionManager.wrongParameterException(req, "The 'mode' parameter must be value of "+toPrint, this.getClass(), help); - } - - if(visibility==null){ - logger.error("Path Parameter 'visibility' not found"); - ExceptionManager.badRequestException(req, "Missing mandatory path parameter 'visibility'", this.getClass(), help); - } - - visibility = visibility.toUpperCase(); - try{ - VISIBILITY.valueOf(visibility); - }catch (Exception e) { - List toPrint = Arrays.asList(VISIBILITY.values()); - logger.error("The 'visibility' parameter is wrong, Have you pass a valid parameter VISIBILITY like "+toPrint+"?"); - ExceptionManager.wrongParameterException(req, "The 'visibility' parameter must be value of "+toPrint, this.getClass(), help); - } - - //HOW TO PASS ANY FILTER? - //TODO INVESTIGATE ON HOW TO PASS MORE THAN ONE FILTER... - Map filters = new HashMap(); - if(filterKey!=null && filterValue!=null){ - //IGNORING THE EMPTY FILTER 'null|null' - if(filterKey.compareToIgnoreCase("null")!=0){ - filters.put(filterKey, filterValue); - logger.debug("Added filter parmas to map filters: "+filters); - } - } - String gnCSWlURL = null; - try { - GeonetworkServiceInterface gntwAccess = new GeonetworkAccessParameter(scope); - GeonetworkInstance gnInstance = gntwAccess.getGeonetworkInstance(); + try{ + logger.info("Params are [mode: "+mode+", scope: "+scope+", visibility: "+visibility+", filterKey: "+filterKey+", filterValue: "+filterValue+", remainPath: "+remainPath+"]"); - 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()); + if(scope==null || scope.isEmpty()){ + logger.error("Path Parameter 'scope' not found"); + throw ExceptionManager.badRequestException(req, "Missing mandatory path parameter 'scope'", this.getClass(), helpURI); + } -// logger.info("Parameters.."); -// for (Enumeration e = req.getParameterNames(); e.hasMoreElements();){ -// String p = e.nextElement(); -// logger.debug("param "+p + " value "+Arrays.toString(req.getParameterValues(p))); -// } + if(mode==null || mode.isEmpty()){ + logger.error("Path Parameter 'scope' not found"); + ExceptionManager.badRequestException(req, "Missing mandatory path parameter 'mode'", this.getClass(), helpURI); + } - //DEBUG BODY -// String readBody = IOUtils.toString(req.getReader()); -// logger.debug("doPost read body request: "+readBody); - ByteArrayOutputStream byteArray = new ByteArrayOutputStream(); + scope = ScopeUtil.normalizeScope(scope, "|"); + mode = mode.toUpperCase(); + try{ + MODE.valueOf(mode); + }catch(Exception e){ + List toPrint = Arrays.asList(MODE.values()); + logger.error("The 'mode' parameter is wrong, Have you pass a valid parameter MODE like "+toPrint+"?"); + throw ExceptionManager.wrongParameterException(req, "The 'mode' parameter must be value of "+toPrint, this.getClass(), helpURI); + } - String geonetworkUrl = config.getGeoNetworkEndpoint(); + if(visibility==null){ + logger.error("Path Parameter 'visibility' not found"); + throw ExceptionManager.badRequestException(req, "Missing mandatory path parameter 'visibility'", this.getClass(), helpURI); + } - // 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()); + visibility = visibility.toUpperCase(); + try{ + VISIBILITY.valueOf(visibility); + }catch (Exception e) { + List toPrint = Arrays.asList(VISIBILITY.values()); + logger.error("The 'visibility' parameter is wrong, Have you pass a valid parameter VISIBILITY like "+toPrint+"?"); + throw ExceptionManager.wrongParameterException(req, "The 'visibility' parameter must be value of "+toPrint, this.getClass(), helpURI); + } + + //HOW TO PASS ANY FILTER? + //TODO INVESTIGATE ON HOW TO PASS MORE THAN ONE FILTER... + Map filters = new HashMap(); + if(filterKey!=null && filterValue!=null){ + //IGNORING THE EMPTY FILTER 'null|null' + if(filterKey.compareToIgnoreCase("null")!=0){ + filters.put(filterKey, filterValue); + logger.debug("Added filter parmas to map filters: "+filters); + } + } + + + 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()); + + // logger.info("Parameters.."); + // for (Enumeration e = req.getParameterNames(); e.hasMoreElements();){ + // String p = e.nextElement(); + // logger.debug("param "+p + " value "+Arrays.toString(req.getParameterValues(p))); + // } + + //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 + IOUtils.copy(req.getInputStream(), byteArray); }else IOUtils.copy(req.getInputStream(), byteArray); - }else + }else{ + 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); - }else{ - 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); - } - - HTTPCallsUtils httpUtils = new HTTPCallsUtils(); - - //PRIVATE LAYERS - if(visibility.equals(VISIBILITY.PRV.name())){ - logger.info("Visibility: "+VISIBILITY.PRV+" getting private layers.."); - //VRE LAYERS - if(mode.equals(MODE.VRE)){ - logger.info("Getting "+MODE.VRE+" layers.."); - //HARVESTED LAYERS - }else{ - filters.put("isHarvested", "y"); - logger.info("Getting "+MODE.HARVEST+" layers, I added 'isHarvested = y' to the filters ["+filters+"]"); } - if(account.getUser()!=null){ - boolean authorized = GNAuthentication.login(httpUtils, geonetworkUrl, account.getUser(), account. getPassword()); - logger.info("Authorized on "+geonetworkUrl +" ? "+authorized); - }else - logger.info("Skipping authentication, ckan user (the owner) is null"); - - //PUBLIC LAYERS - }else{ - logger.info("Visibility: "+VISIBILITY.PUB+" getting public layers.."); - //VRE LAYERS - if(mode.equals(MODE.VRE.name())){ - logger.info("Getting "+MODE.VRE+" layers, the VRE account: "+account.getUser() +" will be used as owner user for filtering... Is it right?"); - filters.put("ownername", account.getUser()); - //HARVESTED LAYERS - }else{ - //filters.put("isHarvested", "y"); - logger.info("Getting "+MODE.HARVEST+" layers, I'm applying the filters ["+filters+"]"); - } - } - - logger.info("Sending CSW POST request to URL: "+gnCSWlURL); - logger.info("Content-Type: "+req.getContentType()); - - //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.notFoundException(req, "Input stream is null to the request "+gnCSWlURL+ " with body: "+byteArray.toString(), this.getClass(), help); - } - - try{ - - ReusableInputStream reus = new ReusableInputStream(in); + HTTPCallsUtils httpUtils = new HTTPCallsUtils(); + //PRIVATE LAYERS if(visibility.equals(VISIBILITY.PRV.name())){ - logger.info("Private VISIBILITY requested, retrieving public file identifiers to apply filtering.."); - 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?"); - in = GetResponseRecordFilter.overrideResponseIdsByListIds(reus, filterGetRecords.getFoundPublicIds(), REPLACED_A_PUBLIC_UUID_PLEASE_IGNORE); + logger.info("Visibility: "+VISIBILITY.PRV+" getting private layers.."); + //VRE LAYERS + if(mode.equals(MODE.VRE)){ + logger.info("Getting "+MODE.VRE+" layers.."); + //HARVESTED LAYERS + }else{ + filters.put("isHarvested", "y"); + logger.info("Getting "+MODE.HARVEST+" layers, I added 'isHarvested = y' to the filters ["+filters+"]"); + } + + if(account.getUser()!=null){ + boolean authorized = GNAuthentication.login(httpUtils, geonetworkUrl, account.getUser(), account. getPassword()); + logger.info("Authorized on "+geonetworkUrl +" ? "+authorized); + }else + logger.info("Skipping authentication, ckan user (the owner) is null"); + + //PUBLIC LAYERS + }else{ + logger.info("Visibility: "+VISIBILITY.PUB+" getting public layers.."); + //VRE LAYERS + if(mode.equals(MODE.VRE.name())){ + logger.info("Getting "+MODE.VRE+" layers, the VRE account: "+account.getUser() +" will be used as owner user for filtering... Is it right?"); + filters.put("ownername", account.getUser()); + //HARVESTED LAYERS + }else{ + //filters.put("isHarvested", "y"); + logger.info("Getting "+MODE.HARVEST+" layers, I'm applying the filters ["+filters+"]"); } } - if(filters.size()>0){ - logger.info("Applying filtering on geonet:info... filter/s used: "+filters); - Document doc = GetResponseRecordFilter.inputStreamToW3CDocument(reus); - List fileIdentifiers = GetResponseRecordFilter.getTextContentStringsForTagName(doc, "gmd:fileIdentifier"); - List noMatchingFilter = new ArrayList(); - for (String fileId : fileIdentifiers) { + logger.info("Sending CSW POST request to URL: "+gnCSWlURL); + logger.info("Content-Type: "+req.getContentType()); - //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); - //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){ - 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; - } + //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); + throw ExceptionManager.notFoundException(req, "Input stream is null to the request "+gnCSWlURL+ " with body: "+byteArray.toString(), this.getClass(), helpURI); + } + + try{ + + ReusableInputStream reus = new ReusableInputStream(in); + + if(visibility.equals(VISIBILITY.PRV.name())){ + logger.info("Private VISIBILITY requested, retrieving public file identifiers to apply filtering.."); + 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?"); + in = GetResponseRecordFilter.overrideResponseIdsByListIds(reus, filterGetRecords.getFoundPublicIds(), REPLACED_A_PUBLIC_UUID_PLEASE_IGNORE); } } - 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); + if(filters.size()>0){ + logger.info("Applying filtering on geonet:info... filter/s used: "+filters); + Document doc = GetResponseRecordFilter.inputStreamToW3CDocument(reus); + List fileIdentifiers = GetResponseRecordFilter.getTextContentStringsForTagName(doc, "gmd:fileIdentifier"); + List noMatchingFilter = new ArrayList(); + for (String fileId : fileIdentifiers) { + + //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); + //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){ + 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; + } + } + } + + 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); + + }else{ + logger.info("No replace on UUIDs was applied from filters: "+filters); + in = reus; + } - }else{ - logger.info("No replace on UUIDs was applied from filters: "+filters); - in = reus; } + ReusableInputStream reusIs = new ReusableInputStream(in); + + //END DEBUG + logger.info("Response return Content-Type: "+httpUtils.getLastContentType()); + 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); + throw ExceptionManager.internalErrorException(req, "Error on copy the response!", this.getClass(), helpURI); + }finally{ + IOUtils.closeQuietly(in); } - ReusableInputStream reusIs = new ReusableInputStream(in); + } catch (IllegalArgumentException e){ + logger.error("IllegalArgumentException:", e); + throw ExceptionManager.badRequestException(req, "Illegal argument to carry out the request!", this.getClass(), helpURI); - //END DEBUG - logger.info("Response return Content-Type: "+httpUtils.getLastContentType()); - 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.internalErrorException(req, "Error on copy the response!", this.getClass(), help); - }finally{ - IOUtils.closeQuietly(in); + } catch (Exception e) { + logger.error("Exception:", e); + String error = "Sorry, an error occurred on resolving geonetwork request with scope "+scope+". Please, contact support!"; + throw ExceptionManager.internalErrorException(req, error, this.getClass(), helpURI); } - } catch (IllegalArgumentException e){ - logger.error("IllegalArgumentException:", e); - ExceptionManager.badRequestException(req, "Illegal argument to carry out the request!", this.getClass(), help); + }catch (Exception e) { - } catch (Exception e) { + if(!(e instanceof WebApplicationException)){ + //UNEXPECTED EXCEPTION managing it as WebApplicationException + String error = "Error during perform POST operation to: "+gnCSWlURL+". Please, contact the support!"+"\nCause: "+e.getCause().getMessage(); + throw ExceptionManager.internalErrorException(req, error, this.getClass(), helpURI); + } + //ALREADY MANAGED AS WebApplicationException logger.error("Exception:", e); - String error = "Sorry, an error occurred on resolving geonetwork request with scope "+scope+". Please, contact support!"; - ExceptionManager.internalErrorException(req, error, this.getClass(), 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, this.getClass(), new URI(help)); - } - catch (URISyntaxException e) { - //silent - return null; + throw (WebApplicationException) e; } } diff --git a/src/main/java/org/gcube/datatransfer/resolver/services/GisResolver.java b/src/main/java/org/gcube/datatransfer/resolver/services/GisResolver.java index 6616e0a..e42d229 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/services/GisResolver.java +++ b/src/main/java/org/gcube/datatransfer/resolver/services/GisResolver.java @@ -11,6 +11,7 @@ import javax.servlet.http.HttpServletRequest; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.QueryParam; +import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Context; import javax.ws.rs.core.Response; @@ -29,11 +30,12 @@ import org.slf4j.LoggerFactory; import com.google.common.cache.CacheLoader.InvalidCacheLoadException; + /** * The Class GisResolver. * - * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it - * Nov 2, 2018 + * @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it) + * Dec 14, 2018 */ @Path("gis") public class GisResolver { @@ -57,44 +59,49 @@ public class GisResolver { * @param gisUUID the gis uuid * @param geoExplorerUUID the geo explorer uuid * @return the response + * @throws WebApplicationException the web application exception */ @GET @Path("") - public Response submitGet(@Context HttpServletRequest req, @QueryParam(SCOPE) String scope, @QueryParam(GIS_UUID) String gisUUID, @QueryParam(GEO_EXPLORER_LAYER_UUID) String geoExplorerUUID){ + public Response submitGet(@Context HttpServletRequest req, @ + QueryParam(SCOPE) String scope, + @QueryParam(GIS_UUID) String gisUUID, + @QueryParam(GEO_EXPLORER_LAYER_UUID) String geoExplorerUUID) throws WebApplicationException{ logger.info(this.getClass().getSimpleName()+" GET starts..."); - boolean isGisLink = false; - boolean isGeoExplorerLink = false; + try{ + boolean isGisLink = false; + boolean isGeoExplorerLink = false; - if(scope==null || scope.isEmpty()){ - logger.error("Query Parameter 'scope' not found"); - ExceptionManager.badRequestException(req, "Missing mandatory query parameter 'scope'", this.getClass(), help); - } + if(scope==null || scope.isEmpty()){ + logger.error("Query Parameter 'scope' not found"); + throw ExceptionManager.badRequestException(req, "Missing mandatory query parameter 'scope'", this.getClass(), help); + } - if(gisUUID==null || gisUUID.isEmpty()){ - logger.error("Path Parameter 'gis-UUID' not found"); - ExceptionManager.badRequestException(req, "Missing mandatory query parameter 'gis-UUID'", this.getClass(), help); - }else - isGisLink = true; + if(gisUUID==null || gisUUID.isEmpty()){ + logger.error("Path Parameter 'gis-UUID' not found"); + throw ExceptionManager.badRequestException(req, "Missing mandatory query parameter 'gis-UUID'", this.getClass(), help); + }else + isGisLink = true; - logger.info(SCOPE +" is: " + scope); - logger.info(GIS_UUID +" is: " + gisUUID); + logger.info(SCOPE +" is: " + scope); + logger.info(GIS_UUID +" is: " + gisUUID); - if (geoExplorerUUID == null || geoExplorerUUID.isEmpty()) { - logger.debug(GEO_EXPLORER_LAYER_UUID+ " not found"); - }else - isGeoExplorerLink = true; + if (geoExplorerUUID == null || geoExplorerUUID.isEmpty()) { + logger.debug(GEO_EXPLORER_LAYER_UUID+ " not found"); + }else + isGeoExplorerLink = true; - logger.info(GEO_EXPLORER_LAYER_UUID +" is: " + geoExplorerUUID); + logger.info(GEO_EXPLORER_LAYER_UUID +" is: " + geoExplorerUUID); + + if(!isGisLink && !isGeoExplorerLink){ + String err = GIS_UUID+" or "+GEO_EXPLORER_LAYER_UUID+" not found or empty in the query string"; + logger.error(err); + throw ExceptionManager.badRequestException(req, err, this.getClass(), help); + } - if(!isGisLink && !isGeoExplorerLink){ - String err = GIS_UUID+" or "+GEO_EXPLORER_LAYER_UUID+" not found or empty in the query string"; - logger.error(err); - ExceptionManager.badRequestException(req, err, this.getClass(), help); - } - try { if(isGisLink){ ScopeProvider.instance.set(scope); @@ -115,7 +122,7 @@ public class GisResolver { String gisViewerPortletUrl = LoadingGisViewerApplicationURLCache.getCache().get(scope); //CHECKING IF THE GisViewer Portlet URL is valid if(gisViewerPortletUrl==null || gisViewerPortletUrl.isEmpty()) - ExceptionManager.notFoundException(req, "GisViewer Portlet URL not found in the scope: "+scope +". Please contact the support", this.getClass(), help); + throw ExceptionManager.notFoundException(req, "GisViewer Portlet URL not found in the scope: "+scope +". Please contact the support", this.getClass(), help); logger.info("Gis Viewer Application url is: " + gisViewerPortletUrl); gisViewerPortletUrl+="?rid="+new Random().nextLong() @@ -140,7 +147,7 @@ public class GisResolver { String geoExplorerPortletUrl = LoadingGeoExplorerApplicationURLCache.getCache().get(scope); //CHECKING IF THE GeoExplorer Portlet URL is valid if(geoExplorerPortletUrl==null || geoExplorerPortletUrl.isEmpty()) - ExceptionManager.notFoundException(req, "GeoExplorer Portlet URL not found in the scope: "+scope +". Please contact the support", this.getClass(), help); + throw ExceptionManager.notFoundException(req, "GeoExplorer Portlet URL not found in the scope: "+scope +". Please contact the support", this.getClass(), help); logger.info("GeoExplorer Application url is: " + geoExplorerPortletUrl); geoExplorerPortletUrl+="?rid="+new Random().nextLong() @@ -149,18 +156,22 @@ public class GisResolver { return Response.seeOther(new URI(geoExplorerPortletUrl)).build(); }catch (InvalidCacheLoadException e) { logger.error("Error on getting GeoExplorer Portlet URL for scope: "+scope, e); - //ExceptionManager.throwNotFoundException(req, "GeoExplorer Portlet URL not found in the scope: "+scope +". Please add it or contact the support", this.getClass(), help); + throw ExceptionManager.notFoundException(req, "GeoExplorer Portlet URL not found in the scope: "+scope +". Please add it or contact the support", this.getClass(), help); } } - ExceptionManager.badRequestException(req, GIS_UUID+" or "+GEO_EXPLORER_LAYER_UUID+" not found or empty in the query string", this.getClass(), help); - return null; + throw ExceptionManager.badRequestException(req, GIS_UUID+" or "+GEO_EXPLORER_LAYER_UUID+" not found or empty in the query string", this.getClass(), help); - } catch (Exception e) { + }catch (Exception e) { + + if(!(e instanceof WebApplicationException)){ + //UNEXPECTED EXCEPTION managing it as WebApplicationException + String error = "Sorry, an error occurred on resolving request with UUID "+gisUUID+" and scope "+scope+". Please, contact support!"+"\n Cause: "+e.getCause().getMessage(); + throw ExceptionManager.internalErrorException(req, error, this.getClass(), help); + } + //ALREADY MANAGED AS WebApplicationException logger.error("Exception:", e); - String error = "Sorry, an error occurred on resolving request with UUID "+gisUUID+" and scope "+scope+". Please, contact support!"; - ExceptionManager.internalErrorException(req, error, this.getClass(), help); - return null; + throw (WebApplicationException) e; } } diff --git a/src/main/java/org/gcube/datatransfer/resolver/services/PartheosRegistryResolver.java b/src/main/java/org/gcube/datatransfer/resolver/services/PartheosRegistryResolver.java index d7605d2..133d544 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/services/PartheosRegistryResolver.java +++ b/src/main/java/org/gcube/datatransfer/resolver/services/PartheosRegistryResolver.java @@ -79,8 +79,7 @@ public class PartheosRegistryResolver { }catch (Exception e) { logger.error("Exception:", e); String error = "Error occurred on resolving the path "+remainPathParthenosURL+". Please, contact the support!"; - ExceptionManager.internalErrorException(req, error, this.getClass(), helpURI); - return null; + throw ExceptionManager.internalErrorException(req, error, this.getClass(), helpURI); } }