diff --git a/distro/changelog.xml b/distro/changelog.xml index c56aeea..ed36f17 100644 --- a/distro/changelog.xml +++ b/distro/changelog.xml @@ -88,7 +88,13 @@ - [Feature #9108] Edit the GenericResource (ApplicationProfile-Gis Viewer Application) + [Feature #9108] Edit the GenericResource + (ApplicationProfile-Gis Viewer Application) + + + + [Task #9538] Geonetwork-Uri Resolver enhancement: provide new filters and improve current ones \ No newline at end of file diff --git a/pom.xml b/pom.xml index e5feb6e..f8f9141 100644 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ org.gcube.data.transfer uri-resolver - 1.13.0-SNAPSHOT + 1.14.0-SNAPSHOT war The URI Resolver is an HTTP URI resolver implemented as an HTTP servlet which gives access trough HTTP to different protocols URIs. diff --git a/src/main/java/org/gcube/datatransfer/resolver/BadRequestException.java b/src/main/java/org/gcube/datatransfer/resolver/BadRequestException.java new file mode 100644 index 0000000..c350248 --- /dev/null +++ b/src/main/java/org/gcube/datatransfer/resolver/BadRequestException.java @@ -0,0 +1,25 @@ +/** + * + */ +package org.gcube.datatransfer.resolver; + +import javax.servlet.ServletException; + + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Aug 29, 2017 + */ +public class BadRequestException extends ServletException { + + private static final long serialVersionUID = 567117691399245474L; + + public BadRequestException() { + super(); + } + + public BadRequestException(String arg0){ + super(arg0); + } +} diff --git a/src/main/java/org/gcube/datatransfer/resolver/CopyOfGeonetworkRequestCriteria.java b/src/main/java/org/gcube/datatransfer/resolver/CopyOfGeonetworkRequestCriteria.java new file mode 100644 index 0000000..c35af80 --- /dev/null +++ b/src/main/java/org/gcube/datatransfer/resolver/CopyOfGeonetworkRequestCriteria.java @@ -0,0 +1,109 @@ +/** + * + */ +package org.gcube.datatransfer.resolver; + + +/** + * The Class GeonetworkRequestCriteria. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Jun 15, 2016 + */ +public class CopyOfGeonetworkRequestCriteria { + + private String scope; + private boolean valueOfFilterPublicIds; + private boolean authOnGeonetwork; + private boolean noAuthOnGeonetwork; + + /** + * Instantiates a new geonetwork request criteria. + * + * @param scope the scope + * @param valueOfFilterPublicIds the value of filter public ids + * @param noAuthOnGeonetowrk the no auth on geonetowrk + */ + public CopyOfGeonetworkRequestCriteria(String scope, boolean valueOfFilterPublicIds, boolean noAuthOnGeonetowrk){ + this.scope = scope; + this.valueOfFilterPublicIds = valueOfFilterPublicIds; + this.noAuthOnGeonetwork = noAuthOnGeonetowrk; + } + + + /** + * Checks if is no auth on geonetwork. + * + * @return the noAuthOnGeonetwork + */ + public boolean isNoAuthOnGeonetwork() { + + return noAuthOnGeonetwork; + } + + + /** + * Gets the scope. + * + * @return the scope + */ + public String getScope() { + + return scope; + } + + + /** + * Checks if is value of filter public ids. + * + * @return the valueOfFilterPublicIds + */ + public boolean isValueOfFilterPublicIds() { + + return valueOfFilterPublicIds; + } + + + /** + * Sets the scope. + * + * @param scope the scope to set + */ + public void setScope(String scope) { + + this.scope = scope; + } + + + /** + * Sets the value of filter public ids. + * + * @param valueOfFilterPublicIds the valueOfFilterPublicIds to set + */ + public void setValueOfFilterPublicIds(boolean valueOfFilterPublicIds) { + + this.valueOfFilterPublicIds = valueOfFilterPublicIds; + } + + + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + + StringBuilder builder = new StringBuilder(); + builder.append("GeonetworkRequestCriteria [scope="); + builder.append(scope); + builder.append(", valueOfFilterPublicIds="); + builder.append(valueOfFilterPublicIds); + builder.append(", authOnGeonetwork="); + builder.append(authOnGeonetwork); + builder.append(", noAuthOnGeonetwork="); + builder.append(noAuthOnGeonetwork); + builder.append("]"); + return builder.toString(); + } + +} diff --git a/src/main/java/org/gcube/datatransfer/resolver/GeonetworkRequestCriteria.java b/src/main/java/org/gcube/datatransfer/resolver/GeonetworkRequestCriteria.java index bbea192..cfe7938 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/GeonetworkRequestCriteria.java +++ b/src/main/java/org/gcube/datatransfer/resolver/GeonetworkRequestCriteria.java @@ -3,6 +3,9 @@ */ package org.gcube.datatransfer.resolver; +import org.gcube.datatransfer.resolver.GeonetworkRequestFilterParameters.MODE; +import org.gcube.datatransfer.resolver.GeonetworkRequestFilterParameters.VISIBILITY; + /** * The Class GeonetworkRequestCriteria. @@ -13,38 +16,26 @@ package org.gcube.datatransfer.resolver; public class GeonetworkRequestCriteria { private String scope; - private boolean valueOfFilterPublicIds; - private boolean authOnGeonetwork; - private boolean noAuthOnGeonetwork; - + private MODE mode; + private String owner; //This is optional + private VISIBILITY visibility; /** - * Instantiates a new geonetwork request criteria. - * - * @param scope the scope - * @param valueOfFilterPublicIds the value of filter public ids - * @param noAuthOnGeonetowrk the no auth on geonetowrk + * @param scope + * @param mode + * @param owner + * @param visibility */ - public GeonetworkRequestCriteria(String scope, boolean valueOfFilterPublicIds, boolean noAuthOnGeonetowrk){ + public GeonetworkRequestCriteria( + String scope, MODE mode, String owner, VISIBILITY visibility) { + + super(); this.scope = scope; - this.valueOfFilterPublicIds = valueOfFilterPublicIds; - this.noAuthOnGeonetwork = noAuthOnGeonetowrk; + this.mode = mode; + this.owner = owner; + this.visibility = visibility; } - /** - * Checks if is no auth on geonetwork. - * - * @return the noAuthOnGeonetwork - */ - public boolean isNoAuthOnGeonetwork() { - - return noAuthOnGeonetwork; - } - - - /** - * Gets the scope. - * * @return the scope */ public String getScope() { @@ -52,21 +43,31 @@ public class GeonetworkRequestCriteria { return scope; } - /** - * Checks if is value of filter public ids. - * - * @return the valueOfFilterPublicIds + * @return the mode */ - public boolean isValueOfFilterPublicIds() { + public MODE getMode() { - return valueOfFilterPublicIds; + return mode; } + /** + * @return the owner + */ + public String getOwner() { + + return owner; + } + + /** + * @return the visibility + */ + public VISIBILITY getVisibility() { + + return visibility; + } /** - * Sets the scope. - * * @param scope the scope to set */ public void setScope(String scope) { @@ -74,18 +75,29 @@ public class GeonetworkRequestCriteria { this.scope = scope; } - /** - * Sets the value of filter public ids. - * - * @param valueOfFilterPublicIds the valueOfFilterPublicIds to set + * @param mode the mode to set */ - public void setValueOfFilterPublicIds(boolean valueOfFilterPublicIds) { + public void setMode(MODE mode) { - this.valueOfFilterPublicIds = valueOfFilterPublicIds; + this.mode = mode; } + /** + * @param owner the owner to set + */ + public void setOwner(String owner) { + this.owner = owner; + } + + /** + * @param visibility the visibility to set + */ + public void setVisibility(VISIBILITY visibility) { + + this.visibility = visibility; + } /* (non-Javadoc) * @see java.lang.Object#toString() @@ -96,14 +108,16 @@ public class GeonetworkRequestCriteria { StringBuilder builder = new StringBuilder(); builder.append("GeonetworkRequestCriteria [scope="); builder.append(scope); - builder.append(", valueOfFilterPublicIds="); - builder.append(valueOfFilterPublicIds); - builder.append(", authOnGeonetwork="); - builder.append(authOnGeonetwork); - builder.append(", noAuthOnGeonetwork="); - builder.append(noAuthOnGeonetwork); + builder.append(", mode="); + builder.append(mode); + builder.append(", owner="); + builder.append(owner); + builder.append(", visibility="); + builder.append(visibility); builder.append("]"); return builder.toString(); } + + } diff --git a/src/main/java/org/gcube/datatransfer/resolver/GeonetworkRequestDecoder.java b/src/main/java/org/gcube/datatransfer/resolver/GeonetworkRequestDecoder.java index 44517c9..367351e 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/GeonetworkRequestDecoder.java +++ b/src/main/java/org/gcube/datatransfer/resolver/GeonetworkRequestDecoder.java @@ -5,7 +5,8 @@ package org.gcube.datatransfer.resolver; import javax.servlet.ServletException; -import org.apache.commons.lang.StringUtils; +import org.gcube.datatransfer.resolver.GeonetworkRequestFilterParameters.MODE; +import org.gcube.datatransfer.resolver.GeonetworkRequestFilterParameters.VISIBILITY; import org.gcube.datatransfer.resolver.gis.geonetwork.GeonetworkResolver; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -34,7 +35,7 @@ public class GeonetworkRequestDecoder { public static final Logger logger = LoggerFactory.getLogger(GeonetworkRequestDecoder.class); - private String newURI; + private String gnResolverUriRequest; private GeonetworkRequestCriteria geonetworkRequestCriteria; @@ -46,12 +47,44 @@ public class GeonetworkRequestDecoder { * @throws ServletException the servlet exception */ public GeonetworkRequestDecoder(String theServletPath, String queryString) throws ServletException{ - String path = theServletPath; - String pathWithoutGN = path.substring(UriResolverRewriteFilter.SERVLET_GEONETWORK.length()+1, path.length()); + + int index = theServletPath.indexOf(GeonetworkRequestFilterParameters.REQUEST_DELIMITIER); + + if(index==-1) + throw new BadRequestException("Invalid request. Your request must append the '"+GeonetworkRequestFilterParameters.REQUEST_DELIMITIER+"' as final delimiter"); + + int delimiterIndex = index+GeonetworkRequestFilterParameters.REQUEST_DELIMITIER.length(); + + String pathWithoutGN = theServletPath.substring(UriResolverRewriteFilter.SERVLET_GEONETWORK.length()+1, index); logger.debug("servlet path without "+UriResolverRewriteFilter.SERVLET_GEONETWORK + " is: " +pathWithoutGN); + geonetworkRequestCriteria = getGeonetworkRequestCriteria(pathWithoutGN); + logger.info("performing query by filters: "+geonetworkRequestCriteria); + logger.debug("scope value is: "+geonetworkRequestCriteria.getScope()); + //newURI = UriResolverRewriteFilter.SERVLET_GEONETWORK + "?" + GeonetworkResolver.SCOPE + "=" + geonetworkRequestCriteria.getScope() +"&"+ GeonetworkResolver.PARAMETER_FILTER_PUBLIC_IDS +"="+geonetworkRequestCriteria.isValueOfFilterPublicIds() +"&"+GeonetworkResolver.PARAMETER_NO_AUTHENTICATION+"="+geonetworkRequestCriteria.isNoAuthOnGeonetwork(); + + gnResolverUriRequest = UriResolverRewriteFilter.SERVLET_GEONETWORK + "?" + + GeonetworkResolver.SCOPE + "=" + geonetworkRequestCriteria.getScope() +"&" + + GeonetworkRequestFilterParameters.MODE.class.getSimpleName() +"="+geonetworkRequestCriteria.getMode() +"&" + + GeonetworkRequestFilterParameters.VISIBILITY.class.getSimpleName()+"="+geonetworkRequestCriteria.getVisibility(); + + if(geonetworkRequestCriteria.getOwner()!=null){ + gnResolverUriRequest+="&"+GeonetworkRequestFilterParameters.OWNER_PARAM +"="+geonetworkRequestCriteria.getOwner(); + } + + //BUILDING REMAINING PATH WITHOUT GeonetworkRequestFilterParameters.REQUEST_DELIMITIER + if(delimiterIndex1){ +// String remainPath = ""; +//// newURI +="&remainPath="; +// for (int i = 1; i < params.length; i++) { +// String httpGetParam = params[i]; +// if(httpGetParam!=null && !httpGetParam.isEmpty()) +// remainPath+="/"+httpGetParam; +// } +// newURI +="&"+GeonetworkResolver.REMAIN_PATH+"="+remainPath; +// } +// +// if(queryString!=null && !queryString.isEmpty()) +// newURI+="&"+queryString; - if(params.length>1){ - String remainPath = ""; -// newURI +="&remainPath="; - for (int i = 1; i < params.length; i++) { - String httpGetParam = params[i]; - if(httpGetParam!=null && !httpGetParam.isEmpty()) - remainPath+="/"+httpGetParam; - } - newURI +="&"+GeonetworkResolver.REMAIN_PATH+"="+remainPath; - } - - if(queryString!=null && !queryString.isEmpty()) - newURI+="&"+queryString; } /** * Gets the geonetwork request criteria. - * Parses a request like root_vo_vre#filterPublicIds or root_vo_vre + + * Creates a request criteria from input parameter pathWithoutGN + * The parameter pathWithoutGN should be an ordered string (like REST request): + * MODE/SCOPE/VISIBILITY/OWNER + * MODE must be: {@link MODE} + * SCOPE must be: ROOT|VO|VRE + * VISIBILITY must be: {@link VISIBILITY} + * OWNER (is optional): filter by owner + * @param pathWithoutGN the path without Geonetwork base URL * - * @param request the request * @return the geonetwork request criteria + * @throws ServletException the servlet exception */ - private static GeonetworkRequestCriteria getGeonetworkRequestCriteria(String request){ - logger.debug("Read request: "+request); - int index = request.indexOf(UriResolverRewriteFilter.REQUEST_PARAMETER_SEPARATOR); - String scope = ""; - boolean filterPublicIds = false; - boolean authOnGN = false; - logger.trace("Index of "+UriResolverRewriteFilter.REQUEST_PARAMETER_SEPARATOR+ " is "+index); - if(index!=-1){ - scope = request.substring(0,index); - filterPublicIds = StringUtils.containsIgnoreCase(request,UriResolverRewriteFilter.PARAMETER_FILTER_PUBLIC_IDS); - authOnGN = StringUtils.containsIgnoreCase(request,UriResolverRewriteFilter.PARAMETER_NO_AUTHENTICATION); + private static GeonetworkRequestCriteria getGeonetworkRequestCriteria(String pathWithoutGN) throws ServletException{ + + String[] params = pathWithoutGN.split("/"); + MODE mode = null; + String theScope = null; + VISIBILITY visibility = null; + String owner = null; + + if(params.length < 3){ + throw new BadRequestException("Bad request. Read the request "+pathWithoutGN+". You must pass a valid request like [GEONETWORK_BASE_URL]/SCOPE/MODE/VISIBILITY/OWNER"); + } + + //SCOPE + if(params[0]!=null && !params[0].isEmpty()){ + theScope = params[0]; + logger.debug("Read parameter scope: "+theScope); + theScope = theScope.replaceAll("\\"+SCOPE_SEPARATOR, "/"); + if (!theScope.startsWith("/")) + theScope="/"+theScope; + }else{ + logger.error("The first parameter 'scope' is null or empty, you must set a valid scope as ROOT"+SCOPE_SEPARATOR+"VO"+SCOPE_SEPARATOR+"VRE as first parameter"); + throw new ServletException("Scope is null or empty. You must pass a valid scope as ROOT"+SCOPE_SEPARATOR+"VO"+SCOPE_SEPARATOR+"VRE as first parameter"); + } + + //MODE + if(params[1]!=null && !params[1].isEmpty()){ + String modeTU = params[1].toUpperCase(); + logger.debug("Read parameter mode (to upper case): "+modeTU); + try{ + mode = MODE.valueOf(modeTU); + if(mode==null){ + logger.error("Mode is null"); + throw new Exception("Mode is null"); + } + + logger.info("MODE IS: "+mode); + + }catch (Exception e) { + logger.error("The second parameter is wrong, Have you pass a valid parameter MODE like vre/harvest?"); + throw new BadRequestException("Bad parameter. You must set a valid MODE parameter as "+MODE.VRE + " or "+MODE.HARVEST+" as second parameter"); + } }else - scope = request; + throw new BadRequestException("The parameter MODE is null or empty. You must pass a valid MODE parameter as "+MODE.VRE + " or "+MODE.HARVEST +" as second parameter"); - return new GeonetworkRequestCriteria("/"+scope.replaceAll("\\"+SCOPE_SEPARATOR, "/"), filterPublicIds, authOnGN); + //VISIBILITY + if(params[2]!=null && !params[2].isEmpty()){ + String visTU = params[2].toUpperCase(); + logger.debug("Read parameter mode (to upper case): "+visTU); + try{ + visibility = VISIBILITY.valueOf(visTU); + if(visibility==null){ + logger.error("VISIBILITY is null"); + throw new Exception("VISIBILITY is null"); + } + + logger.info("VISIBILITY IS: "+visibility); + + }catch (Exception e) { + logger.error("The third parameter is wrong, Have you pass a valid parameter VISIBILITY like vre/harvest?"); + throw new BadRequestException("Bad parameter. You must set a valid VISIBILITY parameter as "+VISIBILITY.PRV + " or "+VISIBILITY.PUB+ " as third parameter"); + } + }else + throw new BadRequestException("The parameter VISIBILITY is null or empty. You must pass a valid VISIBILITY parameter as "+VISIBILITY.PRV + " or "+VISIBILITY.PUB +" as third parameter"); + + + //OWNER + if(params.length > 3 && params[3]!=null && params[3]!=GeonetworkRequestFilterParameters.REQUEST_DELIMITIER){ + owner = params[3]; + logger.debug("Read parameter owner: "+owner); + } + + return new GeonetworkRequestCriteria(theScope, mode, owner, visibility); } /** - * Gets the new uri. + * Gets the geonetwork resolver uri request. * - * @return the newURI + * @return the geonetwork resolver uri request */ - public String getNewURI() { + public String getGeonetworkResolverURIRequest() { - return newURI; + return gnResolverUriRequest; } /** + * Gets the geonetwork request criteria. + * * @return the geonetworkRequestCriteria */ public GeonetworkRequestCriteria getGeonetworkRequestCriteria() { @@ -128,12 +229,14 @@ public class GeonetworkRequestDecoder { public String toString() { StringBuilder builder = new StringBuilder(); - builder.append("GeonetworkRequestDecoder [newURI="); - builder.append(newURI); + builder.append("GeonetworkRequestDecoder [gnResolverUriRequest="); + builder.append(gnResolverUriRequest); builder.append(", geonetworkRequestCriteria="); builder.append(geonetworkRequestCriteria); builder.append("]"); return builder.toString(); } + + } diff --git a/src/main/java/org/gcube/datatransfer/resolver/GeonetworkRequestFilterParameters.java b/src/main/java/org/gcube/datatransfer/resolver/GeonetworkRequestFilterParameters.java new file mode 100644 index 0000000..763e5cf --- /dev/null +++ b/src/main/java/org/gcube/datatransfer/resolver/GeonetworkRequestFilterParameters.java @@ -0,0 +1,19 @@ +/** + * + */ +package org.gcube.datatransfer.resolver; + + +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Aug 30, 2017 + */ +public interface GeonetworkRequestFilterParameters { + + public static enum MODE {HARVEST, VRE}; + public static enum VISIBILITY {PUB, PRV}; + public static String REQUEST_DELIMITIER = "/$$"; + + public static String OWNER_PARAM = "OWNER"; +} diff --git a/src/main/java/org/gcube/datatransfer/resolver/UriResolverRewriteFilter.java b/src/main/java/org/gcube/datatransfer/resolver/UriResolverRewriteFilter.java index 00d8605..a7f77b4 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/UriResolverRewriteFilter.java +++ b/src/main/java/org/gcube/datatransfer/resolver/UriResolverRewriteFilter.java @@ -14,6 +14,7 @@ import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import org.gcube.datatransfer.resolver.catalogue.CatalogueRequestParameter; import org.gcube.datatransfer.resolver.catalogue.UrlEncoderUtil; @@ -37,8 +38,6 @@ public class UriResolverRewriteFilter implements Filter{ private static final String PATH_SEPARATOR = "/"; public static final String SERVLET_GEONETWORK = "/geonetwork"; - public static final String PARAMETER_FILTER_PUBLIC_IDS = "filterpublicids"; - public static final String PARAMETER_NO_AUTHENTICATION = "noauthentication"; public static final String REQUEST_PARAMETER_SEPARATOR = "#"; public static final String PARAMETER_SMP_ID = "smp-id"; @@ -86,108 +85,115 @@ public class UriResolverRewriteFilter implements Filter{ String servletPath = multiReadRequest.getServletPath(); logger.debug("Request URI: " + requestURI + ", QueryString: " +queryString+ ", Servlet path: "+servletPath); - //IS A REQUEST FOR GEONETWORK AUTHENTICATION? (CKAN HARVESTING?) - if(servletPath.startsWith(SERVLET_GEONETWORK) || servletPath.startsWith(SERVLET_URI_RESOLVER+SERVLET_GEONETWORK)){ - logger.debug("It is a request to geonetwork"); - GeonetworkRequestDecoder grd = new GeonetworkRequestDecoder(servletPath, queryString); - logger.debug("forward to: "+grd.getNewURI()); - multiReadRequest.getRequestDispatcher(grd.getNewURI()).forward(multiReadRequest, response); + try{ + //IS A REQUEST FOR GEONETWORK AUTHENTICATION? (CKAN HARVESTING?) + if(servletPath.startsWith(SERVLET_GEONETWORK) || servletPath.startsWith(SERVLET_URI_RESOLVER+SERVLET_GEONETWORK)){ + logger.debug("It is a request to geonetwork"); + GeonetworkRequestDecoder grd = new GeonetworkRequestDecoder(servletPath, queryString); + logger.debug("forward to: "+grd.getGeonetworkResolverURIRequest()); + multiReadRequest.getRequestDispatcher(grd.getGeonetworkResolverURIRequest()).forward(multiReadRequest, response); - }else{ - logger.debug("checking if it is a request to catologue..."); - boolean isCatalogueServletReference = servletPath.startsWith(SERVLET_CATALOGUE); + }else{ + logger.debug("checking if it is a request to catologue..."); + boolean isCatalogueServletReference = servletPath.startsWith(SERVLET_CATALOGUE); - String idCodeCatalogue = null; - boolean isIdCodeCatalogue = false; - String splittedServletPath[] = servletPath.split(PATH_SEPARATOR); - if(!isCatalogueServletReference){ - idCodeCatalogue = splittedServletPath[1]; - logger.trace("checking if the code: "+idCodeCatalogue+" belongs to a catalogue code"); - isIdCodeCatalogue = resourceCataloguesCodes.contains(idCodeCatalogue); - logger.debug("\tIs it a catalogue code? "+isIdCodeCatalogue); - } + String idCodeCatalogue = null; + boolean isIdCodeCatalogue = false; + String splittedServletPath[] = servletPath.split(PATH_SEPARATOR); + if(!isCatalogueServletReference){ + idCodeCatalogue = splittedServletPath[1]; + logger.trace("checking if the code: "+idCodeCatalogue+" belongs to a catalogue code"); + isIdCodeCatalogue = resourceCataloguesCodes.contains(idCodeCatalogue); + logger.debug("\tIs it a catalogue code? "+isIdCodeCatalogue); + } - if(isCatalogueServletReference || isIdCodeCatalogue){ + if(isCatalogueServletReference || isIdCodeCatalogue){ - //int startIndex = requestURI.indexOf(SERVLET_CATALOGUE))+SERVLET_CATALOGUE.length(); - //String vreName = requestURI.substring(beginIndex) - HttpServletRequest request = (HttpServletRequest) req; - logger.trace("method is: "+request.getMethod()); + //int startIndex = requestURI.indexOf(SERVLET_CATALOGUE))+SERVLET_CATALOGUE.length(); + //String vreName = requestURI.substring(beginIndex) + HttpServletRequest request = (HttpServletRequest) req; + logger.trace("method is: "+request.getMethod()); - if(request.getMethod().compareToIgnoreCase("POST")==0){ - logger.debug("Managing as Catalogue POST request.."); - logger.debug("forward to: " + SERVLET_CATALOGUE); - multiReadRequest.getRequestDispatcher(SERVLET_CATALOGUE).forward(multiReadRequest, response); - }else{ - logger.debug("Managing as Catalogue GET request.."); - String newURI = SERVLET_CATALOGUE; - //String[] pathSplit = newServletPath.split(PATH_SEPARATOR); - if(isIdCodeCatalogue){ - //TO BUILD A COMPLETE URL -// logger.debug("is a catalogue code, rebuilding complete url..."); -// ResourceCatalogueCodes rcc = ResourceCatalogueCodes.valueOfId(idCodeCatalogue); -// newServletPath = SERVLET_CATALOGUE+splittedServletPath[2]+PATH_SEPARATOR+rcc.getValue()+PATH_SEPARATOR+splittedServletPath[3]; -// logger.debug("rebuilded complete url: "+newServletPath); - logger.debug("is a catalogue code, resolving a short url in clear ..."); - ResourceCatalogueCodes rcc = ResourceCatalogueCodes.valueOfCodeId(idCodeCatalogue); - logger.debug("found VRE name: "+splittedServletPath[2]); - String gcubeScope = CatalogueRequestParameter.GCUBE_SCOPE.getKey() +"="+splittedServletPath[2]; - String eC = CatalogueRequestParameter.ENTITY_CONTEXT.getKey() +"="+rcc.getValue(); - logger.debug("found id code: "+idCodeCatalogue+", resolving it with context name: "+eC); - String eN = CatalogueRequestParameter.ENTITY_NAME.getKey() +"="+splittedServletPath[3]; - logger.debug("found entity name: "+eN); - String encodedQuery = UrlEncoderUtil.encodeQuery(gcubeScope,eC,eN); - newURI+= "?" + PARAMETER_DIRECT_CATALOGUE_LINK + "=" + encodedQuery; - }else - if(splittedServletPath.length==5){ - logger.info("resolving a complete URL in clear..."); + if(request.getMethod().compareToIgnoreCase("POST")==0){ + logger.debug("Managing as Catalogue POST request.."); + logger.debug("forward to: " + SERVLET_CATALOGUE); + multiReadRequest.getRequestDispatcher(SERVLET_CATALOGUE).forward(multiReadRequest, response); + }else{ + logger.debug("Managing as Catalogue GET request.."); + String newURI = SERVLET_CATALOGUE; + //String[] pathSplit = newServletPath.split(PATH_SEPARATOR); + if(isIdCodeCatalogue){ + //TO BUILD A COMPLETE URL + // logger.debug("is a catalogue code, rebuilding complete url..."); + // ResourceCatalogueCodes rcc = ResourceCatalogueCodes.valueOfId(idCodeCatalogue); + // newServletPath = SERVLET_CATALOGUE+splittedServletPath[2]+PATH_SEPARATOR+rcc.getValue()+PATH_SEPARATOR+splittedServletPath[3]; + // logger.debug("rebuilded complete url: "+newServletPath); + logger.debug("is a catalogue code, resolving a short url in clear ..."); + ResourceCatalogueCodes rcc = ResourceCatalogueCodes.valueOfCodeId(idCodeCatalogue); logger.debug("found VRE name: "+splittedServletPath[2]); String gcubeScope = CatalogueRequestParameter.GCUBE_SCOPE.getKey() +"="+splittedServletPath[2]; - String eC = CatalogueRequestParameter.ENTITY_CONTEXT.getKey() +"="+splittedServletPath[3]; - logger.debug("found context name: "+eC); - String eN = CatalogueRequestParameter.ENTITY_NAME.getKey() +"="+splittedServletPath[4]; + String eC = CatalogueRequestParameter.ENTITY_CONTEXT.getKey() +"="+rcc.getValue(); + logger.debug("found id code: "+idCodeCatalogue+", resolving it with context name: "+eC); + String eN = CatalogueRequestParameter.ENTITY_NAME.getKey() +"="+splittedServletPath[3]; logger.debug("found entity name: "+eN); String encodedQuery = UrlEncoderUtil.encodeQuery(gcubeScope,eC,eN); newURI+= "?" + PARAMETER_DIRECT_CATALOGUE_LINK + "=" + encodedQuery; - }else{ + }else + if(splittedServletPath.length==5){ + logger.info("resolving a complete URL in clear..."); + logger.debug("found VRE name: "+splittedServletPath[2]); + String gcubeScope = CatalogueRequestParameter.GCUBE_SCOPE.getKey() +"="+splittedServletPath[2]; + String eC = CatalogueRequestParameter.ENTITY_CONTEXT.getKey() +"="+splittedServletPath[3]; + logger.debug("found context name: "+eC); + String eN = CatalogueRequestParameter.ENTITY_NAME.getKey() +"="+splittedServletPath[4]; + logger.debug("found entity name: "+eN); + String encodedQuery = UrlEncoderUtil.encodeQuery(gcubeScope,eC,eN); + newURI+= "?" + PARAMETER_DIRECT_CATALOGUE_LINK + "=" + encodedQuery; + }else{ - logger.info("Resolving an encrypted URL to catalogue..."); - int lastSlash = requestURI.lastIndexOf(PATH_SEPARATOR); - String toCatalogueLink = requestURI.substring(lastSlash + 1, requestURI.length()); - newURI+= "?" + PARAMETER_ENC_CATALOGUE_LINK + "=" + toCatalogueLink; + logger.info("Resolving an encrypted URL to catalogue..."); + int lastSlash = requestURI.lastIndexOf(PATH_SEPARATOR); + String toCatalogueLink = requestURI.substring(lastSlash + 1, requestURI.length()); + newURI+= "?" + PARAMETER_ENC_CATALOGUE_LINK + "=" + toCatalogueLink; + } + + logger.debug("forward to: " + newURI); + multiReadRequest.getRequestDispatcher(newURI).forward(multiReadRequest, response); } - logger.debug("forward to: " + newURI); - multiReadRequest.getRequestDispatcher(newURI).forward(multiReadRequest, response); - } - - //chain.doFilter(multiReadRequest, response); - }else{ - logger.debug("It is a request to workspace/storage"); - //LAST CASE, IS WORKSPACE REQUEST? - if (queryString == null) { // IS A /XXXXX - logger.debug("QueryString is null, is It a new SMP public uri by ID?"); - int lastSlash = requestURI.lastIndexOf(PATH_SEPARATOR); - if (lastSlash + 1 == requestURI.length()) { - logger.debug("'/' is last index, doFilter Request"); - // req.getRequestDispatcher("/").forward(req, res); - chain.doFilter(multiReadRequest, response); + //chain.doFilter(multiReadRequest, response); + }else{ + logger.debug("It is a request to workspace/storage"); + //LAST CASE, IS WORKSPACE REQUEST? + if (queryString == null) { // IS A /XXXXX + logger.debug("QueryString is null, is It a new SMP public uri by ID?"); + int lastSlash = requestURI.lastIndexOf(PATH_SEPARATOR); + if (lastSlash + 1 == requestURI.length()) { + logger.debug("'/' is last index, doFilter Request"); + // req.getRequestDispatcher("/").forward(req, res); + chain.doFilter(multiReadRequest, response); + } + else { + String toStorageID = requestURI.substring(lastSlash + 1, requestURI.length()); + // String newURI = requestURI.replace(toReplace, + // SERVLET_RESOLVER_BY_ID+"?"+SMP_ID+"="+toReplace); + String newURI = SERVLET_STORAGE_ID + "?" + PARAMETER_SMP_ID + "=" + toStorageID; + logger.debug("forward to: " + newURI); + multiReadRequest.getRequestDispatcher(newURI).forward(multiReadRequest, response); + } } else { - String toStorageID = requestURI.substring(lastSlash + 1, requestURI.length()); - // String newURI = requestURI.replace(toReplace, - // SERVLET_RESOLVER_BY_ID+"?"+SMP_ID+"="+toReplace); - String newURI = SERVLET_STORAGE_ID + "?" + PARAMETER_SMP_ID + "=" + toStorageID; - logger.debug("forward to: " + newURI); - multiReadRequest.getRequestDispatcher(newURI).forward(multiReadRequest, response); + logger.debug("It is NOT a SMP public uri by ID, doFilter Request"); + chain.doFilter(multiReadRequest, response); } } - else { - logger.debug("It is NOT a SMP public uri by ID, doFilter Request"); - chain.doFilter(multiReadRequest, response); - } - } + } + }catch(BadRequestException bre){ + if (response instanceof HttpServletResponse){ + HttpServletResponse httpResponse = (HttpServletResponse) response; + httpResponse.sendError(HttpServletResponse.SC_BAD_REQUEST, bre.getMessage()); + } } } diff --git a/src/main/java/org/gcube/datatransfer/resolver/gis/geonetwork/GeonetworkResolver.java b/src/main/java/org/gcube/datatransfer/resolver/gis/geonetwork/GeonetworkResolver.java index cacf5ae..3fe87fb 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/gis/geonetwork/GeonetworkResolver.java +++ b/src/main/java/org/gcube/datatransfer/resolver/gis/geonetwork/GeonetworkResolver.java @@ -3,14 +3,10 @@ */ package org.gcube.datatransfer.resolver.gis.geonetwork; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.StringReader; -import java.util.Arrays; -import java.util.Enumeration; import java.util.HashMap; import java.util.Map; import java.util.Timer; @@ -23,17 +19,14 @@ import javax.servlet.http.HttpServletResponse; import org.apache.commons.io.IOUtils; import org.gcube.common.scope.api.ScopeProvider; -import org.gcube.datatransfer.resolver.UriResolverRewriteFilter; +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.gis.GeonetworkAccessParameter; import org.gcube.datatransfer.resolver.gis.GeonetworkInstance; -import org.gcube.datatransfer.resolver.gis.GeonetworkServiceInterface; import org.gcube.datatransfer.resolver.gis.exception.GeonetworkInstanceException; -import org.gcube.datatransfer.resolver.gis.exception.IllegalArgumentException; import org.gcube.datatransfer.resolver.gis.geonetwork.HTTPCallsUtils.HttpResponse; -import org.gcube.datatransfer.resolver.gis.util.GetResponseRecordFilter; import org.gcube.spatial.data.geonetwork.configuration.Configuration; -import org.gcube.spatial.data.geonetwork.model.Account; -import org.gcube.spatial.data.geonetwork.model.Account.Type; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -67,12 +60,13 @@ public class GeonetworkResolver extends HttpServlet{ */ private static final long serialVersionUID = -61097584153314181L; public static final String SCOPE = "scope"; - public static final String REMAIN_PATH = "remainPath"; - public static final String RESET_CACHE = "resetcache"; - public static final String RESET_CACHED_SCOPE = "resetcachedscope"; + public static final String REMAIN_PATH_PARAM = "remainPath"; + public static final String RESET_CACHE_PARAM = "resetcache"; + public static final String RESET_CACHED_SCOPE_PARAM = "resetcachedscope"; public static final String CSW_SERVER = "srv/en/csw"; - public static final String PARAMETER_FILTER_PUBLIC_IDS = UriResolverRewriteFilter.PARAMETER_FILTER_PUBLIC_IDS; - public static final String PARAMETER_NO_AUTHENTICATION = UriResolverRewriteFilter.PARAMETER_NO_AUTHENTICATION; + +// public static final String PARAMETER_FILTER_PUBLIC_IDS = UriResolverRewriteFilter.PARAMETER_FILTER_PUBLIC_IDS; +// public static final String PARAMETER_NO_AUTHENTICATION = UriResolverRewriteFilter.PARAMETER_NO_AUTHENTICATION; /** The logger. */ private static final Logger logger = LoggerFactory.getLogger(GeonetworkResolver.class); @@ -109,11 +103,14 @@ public class GeonetworkResolver extends HttpServlet{ */ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - logger.info("doGET running..."); + logger.info("doGET running... query string: "+req.getQueryString()); String scopeValue = req.getParameter(SCOPE); - String remainValue = req.getParameter(REMAIN_PATH); - String resetCache = req.getParameter(RESET_CACHE); - String resetScope = req.getParameter(RESET_CACHED_SCOPE); + String remainValue = req.getParameter(REMAIN_PATH_PARAM); + String mode = req.getParameter(GeonetworkRequestFilterParameters.MODE.class.getSimpleName()); + String visibility = req.getParameter(GeonetworkRequestFilterParameters.VISIBILITY.class.getSimpleName()); + String owner = req.getParameter(GeonetworkRequestFilterParameters.OWNER_PARAM); + String resetCache = req.getParameter(RESET_CACHE_PARAM); + String resetScope = req.getParameter(RESET_CACHED_SCOPE_PARAM); String originalScope = ScopeProvider.instance.get(); @@ -123,6 +120,12 @@ public class GeonetworkResolver extends HttpServlet{ return; } + MODE theMode; + VISIBILITY theVisibility; + + theMode = GeonetworkRequestFilterParameters.MODE.valueOf(mode); + theVisibility = GeonetworkRequestFilterParameters.VISIBILITY.valueOf(visibility); + if(resetCache!=null && Boolean.parseBoolean(resetCache)){ purgeCacheGeonetworkInstances(); } @@ -131,7 +134,11 @@ public class GeonetworkResolver extends HttpServlet{ resetGeonetoworkInstanceCacheForScope(scopeValue); } - logger.info("SCOPE: " + scopeValue +", Query String: " + req.getQueryString()); + logger.info("SCOPE: " + scopeValue); + logger.info("MODE is: "+theMode); + logger.info("VISIBILITY is: "+theVisibility); + logger.info(GeonetworkRequestFilterParameters.OWNER_PARAM +" is: "+owner); + try { GeonetworkInstance gnInstance = getGeonetworkInstanceForScope(scopeValue); @@ -214,12 +221,12 @@ public class GeonetworkResolver extends HttpServlet{ // 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(REMAIN_PATH+"="); + int start = queryString.indexOf(REMAIN_PATH_PARAM+"="); if(start>=0){ int end = queryString.indexOf("&", start); - if(end==-1 && queryString.length()==(REMAIN_PATH+"="+remain_value).length()){ //SCOPE IS THE UNIQUE PARAMETER INTO QUETY STRING + if(end==-1 && queryString.length()==(REMAIN_PATH_PARAM+"="+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