From 67faf855c2def1f9c21461c5fac107b223c92903 Mon Sep 17 00:00:00 2001 From: Francesco Mangiacrapa Date: Mon, 20 Jun 2016 13:22:21 +0000 Subject: [PATCH] Added logic to manage pathInfo and query in order to perform redirect to right URI from ckan-connector git-svn-id: http://svn.d4science-ii.research-infrastructures.eu/gcube/trunk/portlets/user/gcube-ckan-datacatalog@129181 82a268e6-3cf1-43bd-a215-b396298e98cf --- .settings/com.google.gdt.eclipse.core.prefs | 2 +- pom.xml | 5 + .../client/GCubeCkanDataCatalog.java | 3 +- .../client/GcubeCkanDataCatalogService.java | 29 +++-- .../GcubeCkanDataCatalogServiceAsync.java | 30 ++++- .../view/GCubeCkanDataCatalogPanel.java | 6 +- .../GcubeCkanDataCatalogServiceImpl.java | 116 ++++++++++++------ .../server/SessionUtil.java | 5 +- src/main/webapp/WEB-INF/web.xml | 3 +- 9 files changed, 147 insertions(+), 52 deletions(-) diff --git a/.settings/com.google.gdt.eclipse.core.prefs b/.settings/com.google.gdt.eclipse.core.prefs index d48a299..5dc3938 100644 --- a/.settings/com.google.gdt.eclipse.core.prefs +++ b/.settings/com.google.gdt.eclipse.core.prefs @@ -1,5 +1,5 @@ eclipse.preferences.version=1 jarsExcludedFromWebInfLib= -lastWarOutDir=/home/costantino/workspace/gcube-ckan-datacatalog/target/gcube-ckan-datacatalog-1.0.0-SNAPSHOT +lastWarOutDir=/home/francesco-mangiacrapa/wseclipseluna/gcube-ckan-datacatalog-TRUNK-1.0.0-SNAPSHOT/target/gcube-ckan-datacatalog-1.0.0-SNAPSHOT warSrcDir=src/main/webapp warSrcDirIsOutput=false diff --git a/pom.xml b/pom.xml index ea83264..00b2303 100644 --- a/pom.xml +++ b/pom.xml @@ -132,6 +132,11 @@ provided + + commons-codec + commons-codec + + log4j diff --git a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/GCubeCkanDataCatalog.java b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/GCubeCkanDataCatalog.java index ab7dd13..d61969b 100644 --- a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/GCubeCkanDataCatalog.java +++ b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/GCubeCkanDataCatalog.java @@ -20,7 +20,8 @@ public class GCubeCkanDataCatalog implements EntryPoint { public static final GcubeCkanDataCatalogServiceAsync service = GWT.create(GcubeCkanDataCatalogService.class); private final String DIV_PORTLET_ID = "gCubeCkanDataCatalog"; private CkanEventHandlerManager eventManager = new CkanEventHandlerManager(); - + public static final String GET_PATH_PARAMETER = "path"; + public static final String GET_QUERY_PARAMETER = "query"; /** * This is the entry point method. diff --git a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/GcubeCkanDataCatalogService.java b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/GcubeCkanDataCatalogService.java index 4834df6..f14c69f 100644 --- a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/GcubeCkanDataCatalogService.java +++ b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/GcubeCkanDataCatalogService.java @@ -7,21 +7,36 @@ import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; /** * The client side stub for the RPC service. + * + * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it + * Jun 20, 2016 */ @RemoteServiceRelativePath("ckandatacatalogue") public interface GcubeCkanDataCatalogService extends RemoteService { - String getCKanConnector() throws Exception; - /** - * @return + * Gets the c kan connector. + * + * @param pathInfoParameters the path info parameters + * @param queryStringParameters the query string parameters + * @return the c kan connector * @throws Exception */ - CkanRole getMyRole() throws Exception; - + String getCKanConnector( + String pathInfoParameters, String queryStringParameters) throws Exception; + /** - * Asks who is the current user - * @return + * Gets the my role. + * + * @return the my role + * @throws Exception the exception + */ + CkanRole getMyRole() throws Exception; + + /** + * Asks who is the current user. + * + * @return the user */ String getUser(); } diff --git a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/GcubeCkanDataCatalogServiceAsync.java b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/GcubeCkanDataCatalogServiceAsync.java index b0ff0ed..7f8a923 100644 --- a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/GcubeCkanDataCatalogServiceAsync.java +++ b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/GcubeCkanDataCatalogServiceAsync.java @@ -7,16 +7,40 @@ import org.gcube.portlets.gcubeckan.gcubeckandatacatalog.shared.CkanRole; import com.google.gwt.user.client.rpc.AsyncCallback; + /** + * The Interface GcubeCkanDataCatalogServiceAsync. * * @author Francesco Mangiacrapa francesco.mangiacrapa@isti.cnr.it - * Apr 12, 2016 + * Jun 20, 2016 */ public interface GcubeCkanDataCatalogServiceAsync { - void getCKanConnector(AsyncCallback callback); - + /** + * Gets the my role. + * + * @param callback the callback + * @return the my role + */ void getMyRole(AsyncCallback callback); + /** + * Gets the user. + * + * @param callback the callback + * @return the user + */ void getUser(AsyncCallback callback); + + /** + * Gets the c kan connector. + * + * @param queryStringParameters the query string parameters + * @param pathInfoParameters the path info parameters + * @param callback the callback + * @return the c kan connector + */ + void getCKanConnector( + String queryStringParameters, String pathInfoParameters, + AsyncCallback callback); } diff --git a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/view/GCubeCkanDataCatalogPanel.java b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/view/GCubeCkanDataCatalogPanel.java index 9997b40..38fee91 100644 --- a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/view/GCubeCkanDataCatalogPanel.java +++ b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/client/view/GCubeCkanDataCatalogPanel.java @@ -27,6 +27,7 @@ import com.google.gwt.user.client.ui.ScrollPanel; */ public class GCubeCkanDataCatalogPanel extends BaseViewTemplate{ + private CkanMetadataManagementPanel managementPanel; private ScrollPanel centerScrollable = new ScrollPanel(); private CkanFramePanel ckanFramePanel = new CkanFramePanel(); @@ -45,7 +46,10 @@ public class GCubeCkanDataCatalogPanel extends BaseViewTemplate{ this.eventBus = eventManager; managementPanel = new CkanMetadataManagementPanel(eventBus); initPanel(); - GCubeCkanDataCatalog.service.getCKanConnector(new AsyncCallback() { + final String pathParameter = Window.Location.getParameter(GCubeCkanDataCatalog.GET_PATH_PARAMETER); + final String queryParameter = Window.Location.getParameter(GCubeCkanDataCatalog.GET_QUERY_PARAMETER); + + GCubeCkanDataCatalog.service.getCKanConnector(pathParameter, queryParameter, new AsyncCallback() { @Override public void onSuccess(String ckanUrlConnector) { diff --git a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/server/GcubeCkanDataCatalogServiceImpl.java b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/server/GcubeCkanDataCatalogServiceImpl.java index 4b8cea4..5a8673c 100644 --- a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/server/GcubeCkanDataCatalogServiceImpl.java +++ b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/server/GcubeCkanDataCatalogServiceImpl.java @@ -7,6 +7,7 @@ import java.util.List; import javax.servlet.http.HttpSession; +import org.apache.commons.codec.binary.Base64; import org.gcube.application.framework.core.session.ASLSession; import org.gcube.application.framework.core.session.SessionManager; import org.gcube.common.scope.api.ScopeProvider; @@ -58,6 +59,9 @@ public class GcubeCkanDataCatalogServiceImpl extends RemoteServiceServlet implem // ckan utils methods private CKanUtilsImpl instance; + /* (non-Javadoc) + * @see javax.servlet.GenericServlet#init() + */ @Override public void init(){ @@ -70,44 +74,22 @@ public class GcubeCkanDataCatalogServiceImpl extends RemoteServiceServlet implem } } - /** - * Get current user's token - * @return String the ckan user's token - */ - private String getUserCKanTokenFromSession(){ - - HttpSession httpSession = this.getThreadLocalRequest().getSession(); - ASLSession session = getASLSession(httpSession); - String username = session.getUsername(); - logger.debug("User in session is " + username); - - String token = null; - if(this.getThreadLocalRequest().getSession().getAttribute(CKAN_TOKEN_KEY) != null) - token = (String)this.getThreadLocalRequest().getSession().getAttribute(CKAN_TOKEN_KEY); - else{ - - token = instance.getApiKeyFromUsername(username); - this.getThreadLocalRequest().getSession().setAttribute(CKAN_TOKEN_KEY, token); - logger.debug("Ckan token has been set for user " + username); - } - - logger.debug("Found ckan token " + token + " for user " + username); - return token; - - } /* (non-Javadoc) - * @see org.gcube.portlets.gcubeckan.gcubeckandatacatalog.client.GcubeCkanDataCatalogService#getCKanConnector() + * @see org.gcube.portlets.gcubeckan.gcubeckandatacatalog.client.GcubeCkanDataCatalogService#getCKanConnector(java.lang.String, java.lang.String) */ @Override - public String getCKanConnector() throws Exception{ - logger.trace("getCKanConnector..."); + public String getCKanConnector(String pathInfoParameters, String queryStringParameters) throws Exception { + logger.info("getCKanConnector [pathInfo: "+pathInfoParameters + ", query: "+queryStringParameters+"]"); + if(Base64.isBase64(queryStringParameters.getBytes())){ + byte[] valueDecoded=Base64.decodeBase64(queryStringParameters.getBytes()); + queryStringParameters = new String(valueDecoded); + logger.info("queryStringParameters detected like Base64 and decoded like: "+queryStringParameters); + } try{ String ckanContext = getServletContext().getInitParameter(CKANCONNECTORCONTEXT); logger.debug(CKANCONNECTORCONTEXT + " is: "+ckanContext); - String ckanHideHeader = getServletContext().getInitParameter(CKANHIDEHEADER); - logger.debug(CKANHIDEHEADER + " is: "+ckanHideHeader); ASLSession session = getASLSession(this.getThreadLocalRequest().getSession()); GcoreEndpointReader ckanEndPoint = SessionUtil.getCkanEndPoint(session); @@ -122,9 +104,11 @@ public class GcubeCkanDataCatalogServiceImpl extends RemoteServiceServlet implem ckanConnectorUri+="?"+GCUBE_TOKEN+"="+getGcubeSecurityToken(); }else{ logger.warn("******** Using TEST_USER security token!!!"); - ckanConnectorUri+="?"+GCUBE_TOKEN+"="+TEST_SEC_TOKEN +"&" +ckanHideHeader; + ckanConnectorUri+="?"+GCUBE_TOKEN+"="+TEST_SEC_TOKEN; } - ckanConnectorUri+="&" +ckanHideHeader; //added query string to hide header from portal + + String fullPath = getCkanConnectorParameters(pathInfoParameters, queryStringParameters); + ckanConnectorUri += ckanConnectorUri+fullPath; logger.info("returning ckanConnectorUri: "+ckanConnectorUri); return ckanConnectorUri; // return "http://ckan-d-d4s.d4science.org"; @@ -135,6 +119,33 @@ public class GcubeCkanDataCatalogServiceImpl extends RemoteServiceServlet implem } } + + /** + * Gets the ckan connector parameters. + * + * @param pathInfoParameters the path info parameters + * @param queryStringParameters the query string parameters + * @return the ckan connector parameters + */ + private String getCkanConnectorParameters(String pathInfoParameters, String queryStringParameters) { + + String ckanHideHeader = getServletContext().getInitParameter(CKANHIDEHEADER); + logger.debug(CKANHIDEHEADER + " is: "+ckanHideHeader); + + String pathInfo = ""; + if(pathInfoParameters!=null && !pathInfoParameters.isEmpty()){ + pathInfo="/"+pathInfoParameters; + } + + String queryString =""; + if(queryStringParameters!=null && !queryStringParameters.isEmpty()){ + queryString = "?"+queryStringParameters; + } + + queryString = queryString.isEmpty()?"?"+ckanHideHeader:"&"+ckanHideHeader; + return pathInfo+queryString; + } + /** * Gets the gcube security token. * @@ -214,6 +225,10 @@ public class GcubeCkanDataCatalogServiceImpl extends RemoteServiceServlet implem try{ + if(!SessionUtil.isIntoPortal()){ + logger.warn("OUT FROM PORTAL DETECTED RETURNING ROLE: "+CkanRole.ADMIN); + return CkanRole.ADMIN; + } // first of all, check if the user is a sysadmin in the catalog (in this case he can do everything) boolean isSysAdmin = instance.isSysAdmin(username, getUserCKanTokenFromSession()); @@ -266,9 +281,10 @@ public class GcubeCkanDataCatalogServiceImpl extends RemoteServiceServlet implem } /** - * Map between roles - * @param mainRole - * @return + * Map between roles. + * + * @param mainRole the main role + * @return the ckan role */ private CkanRole reMapRole(CkanRolesIntoLiferay mainRole) { switch(mainRole){ @@ -279,6 +295,9 @@ public class GcubeCkanDataCatalogServiceImpl extends RemoteServiceServlet implem } } + /* (non-Javadoc) + * @see org.gcube.portlets.gcubeckan.gcubeckandatacatalog.client.GcubeCkanDataCatalogService#getUser() + */ @Override public String getUser() { @@ -288,4 +307,31 @@ public class GcubeCkanDataCatalogServiceImpl extends RemoteServiceServlet implem return getASLSession(httpSession).getUsername(); } + + /** + * Get current user's token. + * + * @return String the ckan user's token + */ + private String getUserCKanTokenFromSession(){ + + HttpSession httpSession = this.getThreadLocalRequest().getSession(); + ASLSession session = getASLSession(httpSession); + String username = session.getUsername(); + logger.debug("User in session is " + username); + + String token = null; + if(this.getThreadLocalRequest().getSession().getAttribute(CKAN_TOKEN_KEY) != null) + token = (String)this.getThreadLocalRequest().getSession().getAttribute(CKAN_TOKEN_KEY); + else{ + + token = instance.getApiKeyFromUsername(username); + this.getThreadLocalRequest().getSession().setAttribute(CKAN_TOKEN_KEY, token); + logger.debug("Ckan token has been set for user " + username); + } + + logger.debug("Found ckan token " + token + " for user " + username); + return token; + + } } diff --git a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/server/SessionUtil.java b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/server/SessionUtil.java index 31fe329..721982d 100644 --- a/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/server/SessionUtil.java +++ b/src/main/java/org/gcube/portlets/gcubeckan/gcubeckandatacatalog/server/SessionUtil.java @@ -50,9 +50,8 @@ public class SessionUtil { try { UserLocalServiceUtil.getService(); return true; - } - catch (Exception ex) { - logger.trace("Development Mode ON"); + }catch (Exception ex) { + logger.debug("Development Mode ON"); return false; } } diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index a5664e5..d6c69cf 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -7,14 +7,15 @@ CkanConnectorContext - /gcube/service/connect + ckan connector context CkanHideHeader hh=true + Used like GET parameter in order to hide header section of CKAN template from gCube Portal