diff --git a/src/main/java/org/gcube/datatransfer/resolver/gis/util/GetResponseRecordFilter.java b/src/main/java/org/gcube/datatransfer/resolver/gis/util/GetResponseRecordFilter.java index 9787954..0dbae53 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/gis/util/GetResponseRecordFilter.java +++ b/src/main/java/org/gcube/datatransfer/resolver/gis/util/GetResponseRecordFilter.java @@ -393,7 +393,7 @@ public class GetResponseRecordFilter { * @param metadataName the metadata name * @return the metadata value by file identifier */ - private static String getMetadataValueByFileIdentifier(String fileIdentifier, String geonetworkURL, String user, String pwd, String metadataName){ + public static String getMetadataValueByFileIdentifier(String fileIdentifier, String geonetworkURL, String user, String pwd, String metadataName){ String response = requestXmlMetadataGet(fileIdentifier, geonetworkURL, user, pwd); 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 ef67cd1..8a14872 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/services/GeonetworkResolver.java +++ b/src/main/java/org/gcube/datatransfer/resolver/services/GeonetworkResolver.java @@ -27,11 +27,9 @@ 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; 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.Util; import org.gcube.datatransfer.resolver.gis.GeonetworkAccessParameter; import org.gcube.datatransfer.resolver.gis.GeonetworkInstance; import org.gcube.datatransfer.resolver.gis.GeonetworkServiceInterface; @@ -60,11 +58,17 @@ import org.w3c.dom.Document; @Path("geonetwork") public class GeonetworkResolver { + /** + * + */ + 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"; + 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"; - public static final String PATH_PARAM_OWNER = "owner"; +// public static final String PATH_PARAM_OWNER = "owner"; private static final String PATH_PARAM_VISIBILITY = "visibility"; private static final String PATH_PARAM_SCOPE = "scope"; @@ -80,6 +84,8 @@ public class GeonetworkResolver { public static final String UUID = "uuid"; + public static final String SCOPE_SEPARATOR = "|"; + protected Map cacheGNInstances; private String help = "https://wiki.gcube-system.org/gcube/GCube_Resource_Catalogue#Geonetwork_Resolver"; @@ -106,18 +112,19 @@ public class GeonetworkResolver { */ @GET - @Path("{"+PATH_PARAM_SCOPE+"}/{"+PATH_PARAM_MODE+"}/{"+PATH_PARAM_VISIBILITY+"}/{"+PATH_PARAM_OWNER+"}/$${"+PATH_PARAM_REMAINPATH+":(/[^?$]+)?}") + @Path("{"+PATH_PARAM_SCOPE+"}/{"+PATH_PARAM_MODE+"}/{"+PATH_PARAM_VISIBILITY+"}/{filterKey}/{filterValue}/$${"+PATH_PARAM_REMAINPATH+":(/[^?$]+)?}") public Response submitGet(@Context HttpServletRequest req, @PathParam(PATH_PARAM_SCOPE) @Nullable String scope, @PathParam(PATH_PARAM_MODE) @Nullable String mode, @PathParam(PATH_PARAM_VISIBILITY) @Nullable String visibility, - @PathParam(PATH_PARAM_OWNER) @Nullable String owner, + @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) { logger.info(this.getClass().getSimpleName()+" GET starts..."); - logger.info("Params are [mode: "+mode+", scope: "+scope+", visibility: "+visibility+", owner: "+owner+", remainPath: "+remainPath+"]"); + 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"); @@ -129,6 +136,7 @@ public class GeonetworkResolver { ExceptionManager.throwBadRequestException(req, "Missing mandatory path parameter 'mode'", GeonetworkResolver.class, help); } + scope = scope.replaceAll("\\"+SCOPE_SEPARATOR, "/"); mode = mode.toUpperCase(); try{ MODE.valueOf(mode); @@ -165,13 +173,13 @@ public class GeonetworkResolver { resetGeonetoworkInstanceCacheForScope(scope); } - String fullURL = Util.getFullURL(req); - int index = fullURL.indexOf(GeonetworkRequestFilterParameters.REQUEST_DELIMITIER); - int delimiterIndex = index+GeonetworkRequestFilterParameters.REQUEST_DELIMITIER.length(); - //BUILDING REMAINING PATH WITHOUT GeonetworkRequestFilterParameters.REQUEST_DELIMITIER - if(delimiterIndex filters = new HashMap(); + if(filterKey!=null && filterValue!=null){ + filters.put(filterKey, filterValue); + logger.debug("Added filter parmas to map filters: "+filters); } - String fullURL = Util.getFullURL(req); - int index = fullURL.indexOf(GeonetworkRequestFilterParameters.REQUEST_DELIMITIER); - int delimiterIndex = index+GeonetworkRequestFilterParameters.REQUEST_DELIMITIER.length(); - //BUILDING REMAINING PATH WITHOUT GeonetworkRequestFilterParameters.REQUEST_DELIMITIER - String remainPath = null; - if(delimiterIndex0){ 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"); + in = GetResponseRecordFilter.overrideResponseIdsByListIds(reus, filterGetRecords.getFoundPublicIds(), REPLACED_A_PUBLIC_UUID_PLEASE_IGNORE); } - }else { + } +// else { +// +// logger.info("Public VISIBILITY perfoming check on ownership..."); +// Document doc = GetResponseRecordFilter.inputStreamToW3CDocument(reus); +// List fileIdentifiers = GetResponseRecordFilter.getTextContentStringsForTagName(doc, "gmd:fileIdentifier"); +// List noMatchingOwner = new ArrayList(); +// for (String fileId : fileIdentifiers) { +// String own = GetResponseRecordFilter.getMetaCategoryByFileIdentifier(fileId, config.getGeoNetworkEndpoint(),config.getAdminAccount().getUser(), config.getAdminAccount().getPassword()); +// //String own = GetResponseRecordFilter.getMetaOwnerNameByFileIdentifier(fileId, config.getGeoNetworkEndpoint(),config.getAdminAccount().getUser(), config.getAdminAccount().getPassword()); +// if(own.compareTo(owner)!=0){ +// logger.debug("Owner of file Identifier "+fileId+" not matching the owner passed: "+owner+", removing it.."); +// noMatchingOwner.add(fileId); +// } +// } +// if(noMatchingOwner.size()>0){ +// logger.info("Removing "+noMatchingOwner.size()+" layer/s not macthing the owner: "+owner); +// in = GetResponseRecordFilter.overrideResponseIdsByListIds(reus, noMatchingOwner, "Replaced UUID owned by another user, please ignore"); +// }else{ +// logger.info("No replace on UUIDs was applied for the owner: "+owner); +// in = reus; +// } +// } - logger.info("Public VISIBILITY perfoming check on ownership..."); + 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 noMatchingOwner = new ArrayList(); + List noMatchingFilter = new ArrayList(); for (String fileId : fileIdentifiers) { - String own = GetResponseRecordFilter.getMetaCategoryByFileIdentifier(fileId, config.getGeoNetworkEndpoint(),config.getAdminAccount().getUser(), config.getAdminAccount().getPassword()); - //String own = GetResponseRecordFilter.getMetaOwnerNameByFileIdentifier(fileId, config.getGeoNetworkEndpoint(),config.getAdminAccount().getUser(), config.getAdminAccount().getPassword()); - if(own.compareTo(owner)!=0){ - logger.debug("Owner of file Identifier "+fileId+" not matching the owner passed: "+owner+", removing it.."); - noMatchingOwner.add(fileId); + + //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); + 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(noMatchingOwner.size()>0){ - logger.info("Removing "+noMatchingOwner.size()+" layer/s not macthing the owner: "+owner); - in = GetResponseRecordFilter.overrideResponseIdsByListIds(reus, noMatchingOwner, "Replaced UUID owned by another user, 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); + }else{ - logger.info("No replace on UUIDs was applied for the owner: "+owner); + logger.info("No replace on UUIDs was applied from filters: "+filters); in = reus; } + } ReusableInputStream reusIs = new ReusableInputStream(in); @@ -484,11 +542,6 @@ public class GeonetworkResolver { //.header(ConstantsResolver.CONTENT_DISPOSITION,"attachment; filename = \""+fileName+"\"") .header(ConstantsResolver.CONTENT_TYPE, httpUtils.getLastContentType()).build(); - //int bytes = IOUtils.copy(reusIs, out); - //logger.trace("POST - RETURN : "+IOUtils.toString(reusIs)); - -// if(bytes==0) -// logger.warn("ResponseBody is empty, returning empty resp"); }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); @@ -518,31 +571,31 @@ public class GeonetworkResolver { } - /** - * 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=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=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=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