diff --git a/src/main/java/org/gcube/portlets/user/workspace/server/GWTWorkspaceServiceImpl.java b/src/main/java/org/gcube/portlets/user/workspace/server/GWTWorkspaceServiceImpl.java index 6686939..dbbb1d8 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/server/GWTWorkspaceServiceImpl.java +++ b/src/main/java/org/gcube/portlets/user/workspace/server/GWTWorkspaceServiceImpl.java @@ -89,6 +89,7 @@ import org.gcube.portlets.user.workspace.shared.WorkspaceUserQuote; import org.gcube.portlets.user.workspace.shared.accounting.GxtAccountingEntryType; import org.gcube.portlets.user.workspace.shared.accounting.GxtAccountingField; import org.gcube.portlets.user.workspaceapplicationhandler.ApplicationReaderFromGenericResource; +import org.gcube.portlets.widgets.ckandatapublisherwidget.shared.GroupBean; import org.gcube.portlets.widgets.ckandatapublisherwidget.shared.OrganizationBean; import org.gcube.vomanagement.usermanagement.GroupManager; import org.gcube.vomanagement.usermanagement.UserManager; @@ -101,6 +102,8 @@ import org.gcube.vomanagement.usermanagement.model.GCubeUser; import com.google.gwt.user.server.rpc.RemoteServiceServlet; import com.liferay.portal.service.UserLocalServiceUtil; +import eu.trentorise.opendata.jackan.model.CkanGroup; + /** * The Class GWTWorkspaceServiceImpl. @@ -3504,6 +3507,7 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT // get key per scope String keyPerScopeRole = UtilMethods.concatenateSessionKeyScope(SessionCatalogueAttributes.CKAN_PUBLISH_WORKSPACE, scopePerCurrentUrl); String keyPerScopeOrganizations = UtilMethods.concatenateSessionKeyScope(SessionCatalogueAttributes.CKAN_ORGANIZATIONS_PUBLISH_KEY, scopePerCurrentUrl); + String keyPerScopeGroups = UtilMethods.concatenateSessionKeyScope(SessionCatalogueAttributes.CKAN_GROUPS_MEMBER, scopePerCurrentUrl); // check if this information was already into the ASL Session (true means the user has at least in one org // the role editor), false that he is just a member so he cannot publish @@ -3528,7 +3532,7 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT // 1) organizations in which he can publish (the widget will find these info in session) if(role){ httpSession.setAttribute(keyPerScopeOrganizations, orgsInWhichAtLeastEditorRole); - workspaceLogger.info("Set organizations in which he can publish to " + orgsInWhichAtLeastEditorRole + " into session for user " + username); + httpSession.setAttribute(keyPerScopeGroups, fetchUserGroups(scopePerCurrentUrl, username)); } }catch(Exception e){ workspaceLogger.error("Unable to retrieve the role information for this user. Returning FALSE", e); @@ -3544,6 +3548,40 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT // return false return role; } + + /** + * Fetch the list of ckan groups for which the user is member + * @param context + * @return + */ + private List fetchUserGroups(String context, String username) { + + List toReturn = null; + workspaceLogger.info("Preloading user's groups"); + + try{ + DataCatalogue catalogue = getCatalogue(context); + List ckanGroups = catalogue.getGroups(); + String apiKey = catalogue.getApiKeyFromUsername(username); + toReturn = new ArrayList(); + + // Members/Admin of the group + for (CkanGroup ckanGroup : ckanGroups) { + String role = catalogue.getRoleOfUserInGroup(username, ckanGroup.getName(), apiKey); + + if(role == null) + continue; + + toReturn.add(new GroupBean(ckanGroup.getTitle(), ckanGroup.getName())); + } + workspaceLogger.debug("List of groups to return is " + toReturn); + + }catch(Exception e){ + workspaceLogger.error("Failed to preload user's groups"); + } + + return toReturn; + } /* (non-Javadoc) * @see org.gcube.portlets.user.workspace.client.rpc.GWTWorkspaceService#markFolderAsPublicForFolderItemId(java.lang.String, boolean)