diff --git a/.settings/org.eclipse.wst.common.component b/.settings/org.eclipse.wst.common.component
index cfa6374..facc6b9 100644
--- a/.settings/org.eclipse.wst.common.component
+++ b/.settings/org.eclipse.wst.common.component
@@ -4,6 +4,9 @@
+
+ uses
+
diff --git a/src/main/java/org/gcube/datatransfer/resolver/UriResolverRewriteFilter.java b/src/main/java/org/gcube/datatransfer/resolver/UriResolverRewriteFilter.java
index c8f6283..b64bb91 100644
--- a/src/main/java/org/gcube/datatransfer/resolver/UriResolverRewriteFilter.java
+++ b/src/main/java/org/gcube/datatransfer/resolver/UriResolverRewriteFilter.java
@@ -17,20 +17,32 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+
/**
* The Class UriResolverRewriteFilter.
*
* @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it
- * Apr 5, 2016
+ * Dec 5, 2016
*/
public class UriResolverRewriteFilter implements Filter{
+ /**
+ *
+ */
+ public static final String SERVLET_URI_RESOLVER = "/uri-resolver";
+
+ 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 = "#";
- protected static final String SMP_ID = "smp-id";
- protected static final String SERVLET_RESOLVER_BY_ID = "id";
+
+ public static final String PARAMETER_SMP_ID = "smp-id";
+ public static final String SERVLET_STORAGE_ID = "id";
+
+ public static final String PARAMETER_CATALOGUE_LINK = "cl";
+ public static final String SERVLET_CATALOGUE = "/catalogue";
+
protected static final Logger logger = LoggerFactory.getLogger(UriResolverRewriteFilter.class);
private FilterConfig config;
@@ -64,20 +76,25 @@ public class UriResolverRewriteFilter implements Filter{
logger.debug("Request URI: " + requestURI + ", QueryString: " +queryString+ ", Servlet path: "+multiReadRequest.getServletPath());
//IS A REQUEST FOR GEONETWORK AUTHENTICATION? (CKAN HARVESTING?)
- if(isGeonetworkRequest(multiReadRequest.getServletPath())){
+ if(multiReadRequest.getServletPath().startsWith(SERVLET_GEONETWORK) || multiReadRequest.getServletPath().startsWith(SERVLET_URI_RESOLVER+SERVLET_GEONETWORK)){
logger.debug("is geonetwork request");
GeonetworkRequestDecoder grd = new GeonetworkRequestDecoder(multiReadRequest.getServletPath(), queryString);
logger.debug("forward to: "+grd.getNewURI());
multiReadRequest.getRequestDispatcher(grd.getNewURI()).forward(multiReadRequest, response);
- }else if(multiReadRequest.getServletPath().compareTo("/catalogue")==0){
+ }else if(multiReadRequest.getServletPath().startsWith(SERVLET_CATALOGUE) || multiReadRequest.getServletPath().startsWith(SERVLET_URI_RESOLVER+SERVLET_CATALOGUE)){
logger.debug("is a catalogue request");
- chain.doFilter(multiReadRequest, response);
+ int lastSlash = requestURI.lastIndexOf(PATH_SEPARATOR);
+ String toCatalogueLink = requestURI.substring(lastSlash + 1, requestURI.length());
+ String newURI = SERVLET_CATALOGUE + "?" + PARAMETER_CATALOGUE_LINK + "=" + toCatalogueLink;
+ logger.debug("forward to: " + newURI);
+ multiReadRequest.getRequestDispatcher(newURI).forward(multiReadRequest, response);
+ //chain.doFilter(multiReadRequest, response);
}else{
//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("/");
+ int lastSlash = requestURI.lastIndexOf(PATH_SEPARATOR);
if (lastSlash + 1 == requestURI.length()) {
logger.debug("'/' is last index, doFilter Request");
// req.getRequestDispatcher("/").forward(req, res);
@@ -87,7 +104,7 @@ public class UriResolverRewriteFilter implements Filter{
String toStorageID = requestURI.substring(lastSlash + 1, requestURI.length());
// String newURI = requestURI.replace(toReplace,
// SERVLET_RESOLVER_BY_ID+"?"+SMP_ID+"="+toReplace);
- String newURI = SERVLET_RESOLVER_BY_ID + "?" + SMP_ID + "=" + toStorageID;
+ String newURI = SERVLET_STORAGE_ID + "?" + PARAMETER_SMP_ID + "=" + toStorageID;
logger.debug("forward to: " + newURI);
multiReadRequest.getRequestDispatcher(newURI).forward(multiReadRequest, response);
}
@@ -108,17 +125,7 @@ public class UriResolverRewriteFilter implements Filter{
private static String getScope(String scope){
logger.debug("Read scope path: "+scope);
// String scope = servletPath.substring(servletPath.indexOf("/"), servletPath.length());
- return "/"+scope.replaceAll("_", "/");
- }
-
- /**
- * Checks if is geonetwork request.
- *
- * @param servletPath the servlet path
- * @return true, if is geonetwork request
- */
- private boolean isGeonetworkRequest(String servletPath){
- return servletPath.startsWith(SERVLET_GEONETWORK);
+ return PATH_SEPARATOR+scope.replaceAll("_", PATH_SEPARATOR);
}
/* (non-Javadoc)
diff --git a/src/main/java/org/gcube/datatransfer/resolver/catalogue/CatalogueEntityRequest.java b/src/main/java/org/gcube/datatransfer/resolver/catalogue/CatalogueEntityRequest.java
index e128035..f3ce038 100644
--- a/src/main/java/org/gcube/datatransfer/resolver/catalogue/CatalogueEntityRequest.java
+++ b/src/main/java/org/gcube/datatransfer/resolver/catalogue/CatalogueEntityRequest.java
@@ -16,7 +16,7 @@ import java.util.Map;
public class CatalogueEntityRequest {
- Map parameters = new HashMap();
+ private Map parameters = new HashMap();
/**
* Instantiates a new catalogue entity request.
diff --git a/src/main/java/org/gcube/datatransfer/resolver/catalogue/CatalogueResolver.java b/src/main/java/org/gcube/datatransfer/resolver/catalogue/CatalogueResolver.java
index d5007da..5e1ab4e 100644
--- a/src/main/java/org/gcube/datatransfer/resolver/catalogue/CatalogueResolver.java
+++ b/src/main/java/org/gcube/datatransfer/resolver/catalogue/CatalogueResolver.java
@@ -17,6 +17,7 @@ import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.io.IOUtils;
import org.gcube.common.encryption.StringEncrypter;
import org.gcube.common.scope.api.ScopeProvider;
+import org.gcube.datatransfer.resolver.UriResolverRewriteFilter;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
@@ -37,7 +38,11 @@ public class CatalogueResolver extends HttpServlet{
private static final String TEXT_PALIN_CHARSET_UTF_8 = "text/plain;charset=UTF-8";
public static final String UTF_8 = "UTF-8";
- public static final String CATALOGUE_LINK_PARAM = "CL"; //CATALOGUE LINK
+ public static final String CATALOGUE_LINK_PARAM = UriResolverRewriteFilter.PARAMETER_CATALOGUE_LINK;
+
+ private static final String PATH_SEPARATOR = "/";
+
+ public static final String PARAMETER_PATH = "path";
public static final String ENV_SCOPE = "SCOPE"; //Environment Variable
@@ -88,40 +93,72 @@ public class CatalogueResolver extends HttpServlet{
logger.info("Trying to decode encoded catalogue query link: "+catalogueQueryLink);
if(catalogueQueryLink==null || catalogueQueryLink.isEmpty()){
- logger.error("");
- sendError(resp, HttpStatus.SC_BAD_REQUEST, "Data Catalogue Link is malformed, set "+CATALOGUE_LINK_PARAM+"parameter");
+ logger.error("Data Catalogue Link is malformed, set "+CATALOGUE_LINK_PARAM+" parameter");
+ sendError(resp, HttpStatus.SC_BAD_REQUEST, "Data Catalogue Link is malformed, set "+CATALOGUE_LINK_PARAM+" parameter");
+ return;
}
+ String base64DecodedId = "";
+ String decryptedDCId = "";
try {
- String base64DecodedId = base64DecodeString(catalogueQueryLink);
+
+ base64DecodedId = base64DecodeString(catalogueQueryLink);
logger.info("Base 64 decoded Data Catalogue Link: "+base64DecodedId +", now decrypting...");
if(scopeToEncDecr==null)
initScopeFromEnv();
ScopeProvider.instance.set(scopeToEncDecr);
- String decryptedDCId = StringEncrypter.getEncrypter().decrypt(base64DecodedId);
+ decryptedDCId = StringEncrypter.getEncrypter().decrypt(base64DecodedId);
logger.info("Decrypted Data Catalogue Link: "+decryptedDCId);
}catch (Exception e) {
-
- e.printStackTrace();
+ logger.error("An error occurred during decrypting data catalogue link: "+base64DecodedId+", using the scope: "+scopeToEncDecr, e);
+ sendError(resp, HttpStatus.SC_INTERNAL_SERVER_ERROR, "The system cannot decrypt the Catalogue Link");
+ return;
}
- /*String scope = cer.getValueOfParameter(CatalogueRequestParameter.GCUBE_SCOPE.getKey());
- logger.info("Using scope "+scope+ " to search Ckan Portlet URL from IS");
- ScopeProvider.instance.set(scope);
- String ckanPorltetUrl = CkanPorltetApplicationProfile.getPortletUrlFromInfrastrucure();
- if(ckanPorltetUrl == null || ckanPorltetUrl.isEmpty()){
- sendError(null, HttpStatus.SC_INTERNAL_SERVER_ERROR, "An error occurred during discovery Data Catalogue URL, try again later");
+ CatalogueEntityRequest cer = new CatalogueEntityRequest();
+ for (CatalogueRequestParameter parameter : CatalogueRequestParameter.values()) {
+ String value = getValueOfParameter(parameter.getKey(), decryptedDCId);
+ cer.addParameterToRequest(parameter.getKey(), value);
+ }
+
+ logger.debug("Read parameters: "+cer.toString());
+
+ String scope = cer.getValueOfParameter(CatalogueRequestParameter.GCUBE_SCOPE.getKey());
+ if(scope==null || scope.isEmpty()){
+ logger.error("An error occurred during resolving data catalogue link: "+base64DecodedId+", the scope to search CKan Portlet is null or empty");
+ sendError(resp, HttpStatus.SC_INTERNAL_SERVER_ERROR, "The system cannot resolve the Catalogue Link, the scope is null or empty");
return;
- }*/
- resp.getWriter().write("Get AVAILABLE");
+ }
+
+ String ckanPorltetUrl = "";
+ try{
+ logger.info("Using scope "+scope+ " to search Ckan Portlet URL from IS");
+ ScopeProvider.instance.set(scope);
+ ckanPorltetUrl = CkanPorltetApplicationProfile.getPortletUrlFromInfrastrucure();
+ if(ckanPorltetUrl == null || ckanPorltetUrl.isEmpty()){
+ sendError(resp, HttpStatus.SC_INTERNAL_SERVER_ERROR, "An error occurred during discovery Data Catalogue URL, try again later");
+ return;
+ }
+ }catch(Exception e){
+ logger.error("An error occurred during discovery Data Catalogue URL: ",e);
+ sendError(resp, HttpStatus.SC_INTERNAL_SERVER_ERROR, "An error occurred during discovery Data Catalogue URL, try again later");
+ return;
+ }
+
+ //UrlEncoderUtil.encodeQuery(cer.getParameters());
+ String buildPath = PARAMETER_PATH +"=";
+ buildPath+= PATH_SEPARATOR+cer.getValueOfParameter(CatalogueRequestParameter.ENTITY_CONTEXT.getKey()) + PATH_SEPARATOR;
+ buildPath+=cer.getValueOfParameter(CatalogueRequestParameter.ENTITY_NAME.getKey());
+
+ String finalUrl = ckanPorltetUrl+"?"+buildPath;
+ logger.info("Builded final URL: "+finalUrl);
+ resp.sendRedirect(resp.encodeRedirectURL(finalUrl));
}
-
-
/* (non-Javadoc)
* @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
@@ -194,14 +231,18 @@ public class CatalogueResolver extends HttpServlet{
String buildLink = getServerURL(req);
buildLink += req.getRequestURI();
- String query = UrlEncoderUtil.encodeQuery(cer.getParameters());
+ //String query = UrlEncoderUtil.encodeQuery(cer.getParameters());
+ String query = "";
+ for (String key : cer.getParameters().keySet()) {
+ query+=key+"="+ cer.getParameters().get(key) +"&";
+ }
+ query = UrlEncoderUtil.removeLastChar(query);
logger.info("Builded query string: "+query);
String encriptedQuery = StringEncrypter.getEncrypter().encrypt(query);
logger.info("Encrypted query: "+encriptedQuery);
String encodedQuery = base64EncodeStringURLSafe(encriptedQuery);
- String catalogueQueryLink = CATALOGUE_LINK_PARAM+"="+encodedQuery;
- logger.info("Catalogue Query Link: "+catalogueQueryLink);
- buildLink+="?"+catalogueQueryLink;
+ logger.info("Catalogue Query Link: "+encodedQuery);
+ buildLink+=PATH_SEPARATOR+encodedQuery;
logger.info("Writing Catalogue Link: "+buildLink);
resp.setContentType(TEXT_PALIN_CHARSET_UTF_8);
@@ -281,6 +322,33 @@ public class CatalogueResolver extends HttpServlet{
return uToS;
}
+
+ /**
+ * Gets the value of parameter in the passed query string, null otherwise
+ *
+ * @param parameter the parameter
+ * @param httpQueryString the http query string
+ * @return the value of parameter if exists, null otherwise
+ */
+ public static String getValueOfParameter(String parameter, String httpQueryString) {
+// logger.trace("finding: "+wmsParam +" into "+url);
+ int index = httpQueryString.toLowerCase().indexOf(parameter.toLowerCase()+"="); //ADDING CHAR "=" IN TAIL TO BE SECURE IT IS A PARAMETER
+// logger.trace("start index of "+wmsParam+ " is: "+index);
+ String value = "";
+ if(index > -1){
+
+ int start = index + parameter.length()+1; //add +1 for char '='
+ String sub = httpQueryString.substring(start, httpQueryString.length());
+ int indexOfSeparator = sub.indexOf("&");
+ int end = indexOfSeparator!=-1?indexOfSeparator:sub.length();
+ value = sub.substring(0, end);
+ }else
+ return null;
+
+// logger.trace("return value: "+value);
+ return value;
+ }
+
/**
* Base64 encode string url safe.
*