From b5e73449fea99450f4745529af3c5ff4dcacaf4a Mon Sep 17 00:00:00 2001 From: Francesco Mangiacrapa Date: Wed, 31 Oct 2018 17:23:31 +0000 Subject: [PATCH] fixing GeonetworkResolver git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/data-transfer/uri-resolver@173916 82a268e6-3cf1-43bd-a215-b396298e98cf --- .../resolver/scope/ScopeUtil.java | 15 ++++++ .../resolver/services/GeonetworkResolver.java | 53 ++++++++++--------- 2 files changed, 42 insertions(+), 26 deletions(-) diff --git a/src/main/java/org/gcube/datatransfer/resolver/scope/ScopeUtil.java b/src/main/java/org/gcube/datatransfer/resolver/scope/ScopeUtil.java index b43d724..cfb8dc5 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/scope/ScopeUtil.java +++ b/src/main/java/org/gcube/datatransfer/resolver/scope/ScopeUtil.java @@ -22,6 +22,8 @@ public class ScopeUtil { private static final Logger logger = LoggerFactory.getLogger(ScopeUtil.class); + public static final String SCOPE_SEPARATOR = "|"; + /** * Gets the scope from environment. @@ -40,4 +42,17 @@ public class ScopeUtil { logger.info("Read scope: "+scopeFromEnv+" from Environment Variable: "+ENV_SCOPE); return scopeFromEnv; } + + /** + * Normalize scope. + * Add the '/' as prefix and remove all '|' + * @param scope the scope + * @return the normalized scope + */ + public static String normalizeScope(String scope){ + if(!scope.startsWith("/")) + scope="/"+scope; + scope = scope.replaceAll("\\"+SCOPE_SEPARATOR, "/"); + return scope; + } } 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 8a14872..0ff8375 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/services/GeonetworkResolver.java +++ b/src/main/java/org/gcube/datatransfer/resolver/services/GeonetworkResolver.java @@ -7,7 +7,6 @@ import java.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Arrays; -import java.util.Enumeration; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -40,6 +39,7 @@ import org.gcube.datatransfer.resolver.gis.geonetwork.HTTPCallsUtils; import org.gcube.datatransfer.resolver.gis.geonetwork.HTTPCallsUtils.HttpResponse; import org.gcube.datatransfer.resolver.gis.geonetwork.ReusableInputStream; import org.gcube.datatransfer.resolver.gis.util.GetResponseRecordFilter; +import org.gcube.datatransfer.resolver.scope.ScopeUtil; import org.gcube.datatransfer.resolver.services.error.ExceptionManager; import org.gcube.datatransfer.resolver.services.exceptions.InternalServerException; import org.gcube.spatial.data.geonetwork.configuration.Configuration; @@ -136,7 +136,7 @@ public class GeonetworkResolver { ExceptionManager.throwBadRequestException(req, "Missing mandatory path parameter 'mode'", GeonetworkResolver.class, help); } - scope = scope.replaceAll("\\"+SCOPE_SEPARATOR, "/"); + scope = ScopeUtil.normalizeScope(scope); mode = mode.toUpperCase(); try{ MODE.valueOf(mode); @@ -305,7 +305,7 @@ public class GeonetworkResolver { ExceptionManager.throwBadRequestException(req, "Missing mandatory path parameter 'mode'", GeonetworkResolver.class, help); } - scope = scope.replaceAll("\\"+SCOPE_SEPARATOR, "/"); + scope = ScopeUtil.normalizeScope(scope); mode = mode.toUpperCase(); try{ MODE.valueOf(mode); @@ -362,11 +362,11 @@ public class GeonetworkResolver { 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))); - } +// 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 @@ -390,12 +390,13 @@ public class GeonetworkResolver { logger.debug("Writing "+data +" into byte array"); byteArray.write(data.getBytes()); }else - IOUtils.copy(req.getReader(), byteArray); + IOUtils.copy(req.getInputStream(), byteArray); }else - IOUtils.copy(req.getReader(), byteArray); + IOUtils.copy(req.getInputStream(), byteArray); }else{ - gnCSWlURL = remainPath==null ||remainPath.isEmpty()?geonetworkUrl+"/"+CSW_SERVER:geonetworkUrl+"/"+CSW_SERVER+remainPath; - IOUtils.copy(req.getReader(), byteArray); + 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); } //filterPublicMetadata = theVisibility.equals(VISIBILITY.PRV)?true:false; @@ -404,10 +405,10 @@ public class GeonetworkResolver { //PRIVATE LAYERS if(visibility.equals(VISIBILITY.PRV)){ - logger.debug("Visibility: "+VISIBILITY.PRV+" getting private layers.."); + logger.info("Visibility: "+VISIBILITY.PRV+" getting private layers.."); //VRE LAYERS if(mode.equals(MODE.VRE)){ - logger.debug("Getting "+MODE.VRE+" layers.."); + logger.info("Getting "+MODE.VRE+" layers.."); //HARVESTED LAYERS }else{ @@ -419,21 +420,21 @@ public class GeonetworkResolver { // } filters.put("isHarvested", "y"); - logger.debug("Getting "+MODE.HARVEST+" layers, I'm using filters ["+filters+"]"); + 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.trace("Authorized on "+geonetworkUrl +" ? "+authorized); + logger.info("Authorized on "+geonetworkUrl +" ? "+authorized); }else logger.info("Skipping authentication, ckan user (the owner) is null"); //PUBLIC LAYERS }else{ - logger.debug("Visibility: "+VISIBILITY.PUB+" getting public layers.."); + logger.info("Visibility: "+VISIBILITY.PUB+" getting public layers.."); //VRE LAYERS if(mode.equals(MODE.VRE)){ - logger.debug("Getting "+MODE.VRE+" layers, the VRE account: "+account.getUser() +" will be used as owner user for filtering... Is it right?"); + 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 @@ -444,13 +445,13 @@ public class GeonetworkResolver { // logger.error(error); // ExceptionManager.throwBadRequestException(req, error, GeonetworkResolver.class, help); // } - filters.put("isHarvested", "y"); - logger.debug("Getting "+MODE.HARVEST+" layers, I added 'isHarvested = y' to filters ["+filters+"]"); + //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.debug("Content-Type: "+req.getContentType()); + logger.info("Content-Type: "+req.getContentType()); //DEBUG @@ -511,7 +512,9 @@ public class GeonetworkResolver { 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); - if(value!=null && value.compareTo(fValue)!=0){ + //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 @@ -536,7 +539,7 @@ public class GeonetworkResolver { ReusableInputStream reusIs = new ReusableInputStream(in); //END DEBUG - logger.debug("Response return Content-Type: "+httpUtils.getLastContentType()); + logger.info("Response return Content-Type: "+httpUtils.getLastContentType()); return Response .ok(reusIs) //.header(ConstantsResolver.CONTENT_DISPOSITION,"attachment; filename = \""+fileName+"\"") @@ -672,9 +675,7 @@ public class GeonetworkResolver { if(cacheGNInstances==null) purgeCacheGeonetworkInstances(); - if(!scope.startsWith("/")) - scope="/"+scope; - + scope = ScopeUtil.normalizeScope(scope); logger.info("Attempt to get geonetwork instance from GeonetworkInstance cache for scope: "+scope); GeonetworkInstance geoInstance = cacheGNInstances.get(scope);