diff --git a/pom.xml b/pom.xml index 0d3361f..fe0fcbf 100644 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ org.gcube.data.transfer uri-resolver - 1.7.0-SNAPSHOT + 1.8.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/GeonetworkRequestCriteria.java b/src/main/java/org/gcube/datatransfer/resolver/GeonetworkRequestCriteria.java index ef685ea..bbea192 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/GeonetworkRequestCriteria.java +++ b/src/main/java/org/gcube/datatransfer/resolver/GeonetworkRequestCriteria.java @@ -5,6 +5,7 @@ package org.gcube.datatransfer.resolver; /** + * The Class GeonetworkRequestCriteria. * * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it * Jun 15, 2016 @@ -12,7 +13,6 @@ package org.gcube.datatransfer.resolver; public class GeonetworkRequestCriteria { private String scope; - private final String FILTER_PUBLIC_IDS = "FILTER_PUBLIC_IDS"; private boolean valueOfFilterPublicIds; private boolean authOnGeonetwork; private boolean noAuthOnGeonetwork; @@ -24,15 +24,16 @@ public class GeonetworkRequestCriteria { * @param valueOfFilterPublicIds the value of filter public ids * @param noAuthOnGeonetowrk the no auth on geonetowrk */ - GeonetworkRequestCriteria(String scope, boolean valueOfFilterPublicIds, boolean noAuthOnGeonetowrk){ + public GeonetworkRequestCriteria(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() { @@ -42,6 +43,8 @@ public class GeonetworkRequestCriteria { /** + * Gets the scope. + * * @return the scope */ public String getScope() { @@ -51,6 +54,8 @@ public class GeonetworkRequestCriteria { /** + * Checks if is value of filter public ids. + * * @return the valueOfFilterPublicIds */ public boolean isValueOfFilterPublicIds() { @@ -60,6 +65,8 @@ public class GeonetworkRequestCriteria { /** + * Sets the scope. + * * @param scope the scope to set */ public void setScope(String scope) { @@ -69,6 +76,8 @@ public class GeonetworkRequestCriteria { /** + * Sets the value of filter public ids. + * * @param valueOfFilterPublicIds the valueOfFilterPublicIds to set */ public void setValueOfFilterPublicIds(boolean valueOfFilterPublicIds) { @@ -87,12 +96,12 @@ public class GeonetworkRequestCriteria { StringBuilder builder = new StringBuilder(); builder.append("GeonetworkRequestCriteria [scope="); builder.append(scope); - builder.append(", FILTER_PUBLIC_IDS="); - builder.append(FILTER_PUBLIC_IDS); 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/GeonetworkRequestDecoder.java b/src/main/java/org/gcube/datatransfer/resolver/GeonetworkRequestDecoder.java index e0bb205..c313ebc 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/GeonetworkRequestDecoder.java +++ b/src/main/java/org/gcube/datatransfer/resolver/GeonetworkRequestDecoder.java @@ -12,11 +12,18 @@ import org.slf4j.LoggerFactory; /** - * The Class GeonetworkScopeDecoder. + * The Class GeonetworkRequestDecoder. * * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it - * Gets the new uri to forward the request to {@link GeonetworkResolver} - * Jun 15, 2016 + * Jul 27, 2016 + * + * This class parses a request from servletpath and queryString + * + * The request must be: SCOPE#PARMETERS + * SCOPE must be: separated by _ + * PARAMETERS can be: + * {@link GeonetworkResolver#PARAMETER_FILTER_PUBLIC_IDS} + * {@link GeonetworkResolver#PARAMETER_NO_AUTHENTICATION} */ public class GeonetworkRequestDecoder { @@ -24,6 +31,8 @@ public class GeonetworkRequestDecoder { private String newURI; + private GeonetworkRequestCriteria geonetworkRequestCriteria; + /** * Instantiates a new geonetwork request decoder. * @@ -41,11 +50,11 @@ public class GeonetworkRequestDecoder { throw new ServletException("Scope is null or empty, you must set a valid scope /geonetwork/root_vo_vre"); } - GeonetworkRequestCriteria rc = getGeonetworkRequestCriteria(params[0]); - logger.debug("scope value is: "+rc.getScope()); - newURI = UriResolverRewriteFilter.SERVLET_GEONETWORK + "?" + GeonetworkResolver.SCOPE + "=" + rc.getScope() +"&"+ GeonetworkResolver.PARAMETER_FILTER_PUBLIC_IDS +"="+rc.isValueOfFilterPublicIds() +"&"+GeonetworkResolver.PARAMETER_NO_AUTHENTICATION+"="+rc.isNoAuthOnGeonetwork(); - logger.debug(GeonetworkResolver.PARAMETER_FILTER_PUBLIC_IDS +" is: "+rc.isValueOfFilterPublicIds()); - logger.debug(GeonetworkResolver.PARAMETER_NO_AUTHENTICATION +" is: "+rc.isNoAuthOnGeonetwork()); + geonetworkRequestCriteria = getGeonetworkRequestCriteria(params[0]); + 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(); + logger.debug(GeonetworkResolver.PARAMETER_FILTER_PUBLIC_IDS +" is: "+geonetworkRequestCriteria.isValueOfFilterPublicIds()); + logger.debug(GeonetworkResolver.PARAMETER_NO_AUTHENTICATION +" is: "+geonetworkRequestCriteria.isNoAuthOnGeonetwork()); if(params.length>1){ String remainPath = ""; @@ -63,7 +72,6 @@ public class GeonetworkRequestDecoder { } - /** * Gets the geonetwork request criteria. * Parses a request like root_vo_vre#filterPublicIds or root_vo_vre @@ -99,9 +107,28 @@ public class GeonetworkRequestDecoder { return newURI; } - public static void main(String[] args) { + /** + * @return the geonetworkRequestCriteria + */ + public GeonetworkRequestCriteria getGeonetworkRequestCriteria() { - System.out.println(getGeonetworkRequestCriteria("gcube_devsec_devVRE#filterpublicids")); + return geonetworkRequestCriteria; + } + + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + + StringBuilder builder = new StringBuilder(); + builder.append("GeonetworkRequestDecoder [newURI="); + builder.append(newURI); + builder.append(", geonetworkRequestCriteria="); + builder.append(geonetworkRequestCriteria); + builder.append("]"); + return builder.toString(); } } diff --git a/src/main/java/org/gcube/datatransfer/resolver/UriResolverRewriteFilter.java b/src/main/java/org/gcube/datatransfer/resolver/UriResolverRewriteFilter.java index 96ad191..f946656 100644 --- a/src/main/java/org/gcube/datatransfer/resolver/UriResolverRewriteFilter.java +++ b/src/main/java/org/gcube/datatransfer/resolver/UriResolverRewriteFilter.java @@ -126,43 +126,4 @@ public class UriResolverRewriteFilter implements Filter{ logger.trace("run init"); this.config = config; } - /* - public static void main(String[] args) throws ServletException { - - String path = "/geonetwork/gcube_devsec_devVRE/srv/en/mef.export"; - String queryString = "p1=1&p2=2"; - String pathWithoutGN = path.substring(SERVLET_GEONETWORK.length()+1, path.length()); - logger.debug("servlet path without "+SERVLET_GEONETWORK + " is:" +pathWithoutGN); - String[] params = pathWithoutGN.split("/"); - - System.out.println(Arrays.asList(params)); - - if(params[0]==null || params[0].isEmpty()){ - logger.error("Scope is null or empty, you must set a valid scope /geonetwork/root_vo_vre"); - throw new ServletException("Scope is null or empty, you must set a valid scope /geonetwork/root_vo_vre"); - } - - String scopeValue = getScope(params[0]); - logger.debug("scope value is: "+scopeValue); - String newURI = SERVLET_GEONETWORK + "?" + GeonetworkResolver.SCOPE + "=" + scopeValue; - - 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; - - logger.debug("forward "+newURI); - }*/ - } 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 833f3bd..7a983f1 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 @@ -338,7 +338,7 @@ public class GeonetworkResolver extends HttpServlet{ logger.info("Sending CSW POST request to URL: "+gnCSWlURL); logger.info("Content-Type: "+req.getContentType()); //DEBUG - logger.trace("POST - BODY : "+byteArray.toString()); + //logger.debug("POST - BODY : "+byteArray.toString()); InputStream in = httpUtils.post(gnCSWlURL, new ByteArrayInputStream(byteArray.toByteArray()), req.getContentType(), req.getParameterMap()); //END DEBUG logger.info("Response return Content-Type: "+httpUtils.getLastContentType()); 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 4a8b615..f6a5419 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 @@ -84,12 +84,26 @@ public class GetResponseRecordFilter { logger.debug("gmd:MD_Metadata are: " + nodes.getLength()); for (int i = 0; i < nodes.getLength(); i++) { Element mdMetadata = (Element) nodes.item(i); + // - Element id = (Element) mdMetadata.getElementsByTagName("gmd:fileIdentifier").item(0); - Element gco = (Element) id.getElementsByTagName("gco:CharacterString").item(0); + NodeList fileIdentifierLst = mdMetadata.getElementsByTagName("gmd:fileIdentifier"); + if(fileIdentifierLst==null || fileIdentifierLst.getLength()==0 || fileIdentifierLst.item(0)==null){ + logger.info("skipping identifier: " + identifier +" it has not fileidentifier"); + return false; + } + + Element id = (Element) fileIdentifierLst.item(0); + + NodeList gcoLst = id.getElementsByTagName("gco:CharacterString"); + if(gcoLst==null || gcoLst.getLength()==0 || gcoLst.item(0)==null){ + logger.info("skipping identifier: " + identifier +" it has not gco:CharacterString"); + return false; + } + + Element gco = (Element) gcoLst.item(0); String idValue = gco.getTextContent(); logger.trace("Summary gmd:fileIdentifier is: " + idValue); - if (idValue.equals(identifier)) { + if (idValue!=null && idValue.equals(identifier)) { gco.setTextContent(A_PUBLIC_ID_PLEASE_IGNORE); logger.debug("Overrided child " + idValue); return true; @@ -121,7 +135,7 @@ public class GetResponseRecordFilter { if(overrideSummaryRecord(doc, identifier)) override++; } - logger.debug("Overrided "+override +" node/s"); + logger.info("Overrided "+override +" node/s"); //TODO IS IT POSSIBLE TO REMOVE? /*NodeList nodeList = doc.getElementsByTagName("csw:SearchResults"); diff --git a/src/test/java/GeonetworkMefServiceTest.java b/src/test/java/GeonetworkMefServiceTest.java new file mode 100644 index 0000000..2e7855b --- /dev/null +++ b/src/test/java/GeonetworkMefServiceTest.java @@ -0,0 +1,51 @@ + +/** + * + */ +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Jul 29, 2016 + */ +public class GeonetworkMefServiceTest { + + /* + public static void main(String[] args) throws ServletException { + + String path = "/geonetwork/gcube_devsec_devVRE/srv/en/mef.export"; + String queryString = "p1=1&p2=2"; + String pathWithoutGN = path.substring(SERVLET_GEONETWORK.length()+1, path.length()); + logger.debug("servlet path without "+SERVLET_GEONETWORK + " is:" +pathWithoutGN); + String[] params = pathWithoutGN.split("/"); + + System.out.println(Arrays.asList(params)); + + if(params[0]==null || params[0].isEmpty()){ + logger.error("Scope is null or empty, you must set a valid scope /geonetwork/root_vo_vre"); + throw new ServletException("Scope is null or empty, you must set a valid scope /geonetwork/root_vo_vre"); + } + + String scopeValue = getScope(params[0]); + logger.debug("scope value is: "+scopeValue); + String newURI = SERVLET_GEONETWORK + "?" + GeonetworkResolver.SCOPE + "=" + scopeValue; + + 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; + + logger.debug("forward "+newURI); + }*/ + +} diff --git a/src/test/java/GeonetworkRequestDecoderTest.java b/src/test/java/GeonetworkRequestDecoderTest.java new file mode 100644 index 0000000..955e9bb --- /dev/null +++ b/src/test/java/GeonetworkRequestDecoderTest.java @@ -0,0 +1,44 @@ +import javax.servlet.ServletException; + +import org.gcube.datatransfer.resolver.GeonetworkRequestDecoder; +import org.junit.Test; + + +/** + * + */ +/** + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Jul 27, 2016 + */ +public class GeonetworkRequestDecoderTest { + + + //@Test + public void test1() throws ServletException{ + String request = "/geonetwork/gcube_devsec_devVRE#filterpublicids"; + System.out.println("Testing request: "+request); + GeonetworkRequestDecoder gd = new GeonetworkRequestDecoder(request,""); + System.out.println(gd); + } + + //@Test + public void test2() throws ServletException{ + String request = "/geonetwork/gcube_devsec_devVRE#noauthentication"; + System.out.println("Testing request: "+request); + GeonetworkRequestDecoder gd = new GeonetworkRequestDecoder(request,""); + System.out.println(gd); + } + + + @Test + public void test3() throws ServletException{ + String request = "/gcube_devsec"; + System.out.println("Testing request: "+request); + GeonetworkRequestDecoder gd = new GeonetworkRequestDecoder(request,""); + System.out.println(gd); + } + + +}