removed catalogue information preloading operations. Publish on catalogue will be always available on directories, and permission check will performed on button click

git-svn-id: http://svn.d4science-ii.research-infrastructures.eu/gcube/trunk/portlets/user/workspace-tree-widget@141754 82a268e6-3cf1-43bd-a215-b396298e98cf
This commit is contained in:
Costantino Perciante 2017-01-25 11:05:57 +00:00
parent eb618e3dd3
commit c766bfeeaa
5 changed files with 34 additions and 381 deletions

View File

@ -183,7 +183,6 @@ public class AppControllerExplorer implements EventHandler, TreeAppControllerInt
private boolean selectRootItem;
public static String myLogin;
public static String myLoginFirstName;
public static Boolean ckanEditorOrAdmin;
//PRE-LOAD LIST OF USER FORM LIFERAY
private UserStore userStore = new UserStore();
private static AppControllerExplorer singleton;
@ -2299,7 +2298,6 @@ public class AppControllerExplorer implements EventHandler, TreeAppControllerInt
GWT.log("My login is: "+user.getUsername());
myLogin = user.getUsername();
myLoginFirstName = user.getFirstName();
ckanEditorOrAdmin = user.hasCataloguePermission();
}
});
}

View File

@ -127,42 +127,42 @@ public class ContextMenuTree {
//Open Report Template
//TODO REMOVE
// MenuItem openReportTemplate = new MenuItem();
// openReportTemplate.setId(WorkspaceOperation.OPEN_REPORT_TEMPLATE.getId());
// openReportTemplate.setText(ConstantsExplorer.MESSAGE_OPEN_REPORT_TEMPLATE);
// openReportTemplate.setIcon(Resources.getIconShow());
//
// openReportTemplate.addSelectionListener(new SelectionListener<MenuEvent>() {
// public void componentSelected(MenuEvent ce) {
//
// FileModel selected = listSelectedItems.get(0);
//
// if(selected!=null){
// eventBus.fireEvent(new OpenReportsEvent(selected));
// }
// }
// });
// MenuItem openReportTemplate = new MenuItem();
// openReportTemplate.setId(WorkspaceOperation.OPEN_REPORT_TEMPLATE.getId());
// openReportTemplate.setText(ConstantsExplorer.MESSAGE_OPEN_REPORT_TEMPLATE);
// openReportTemplate.setIcon(Resources.getIconShow());
//
// openReportTemplate.addSelectionListener(new SelectionListener<MenuEvent>() {
// public void componentSelected(MenuEvent ce) {
//
// FileModel selected = listSelectedItems.get(0);
//
// if(selected!=null){
// eventBus.fireEvent(new OpenReportsEvent(selected));
// }
// }
// });
//contextMenu.add(openReportTemplate);
//Open Report Template
//TODO REMOVE
// MenuItem openReport = new MenuItem();
// openReport.setId(WorkspaceOperation.OPEN_REPORT.getId());
// openReport.setText(ConstantsExplorer.MESSAGE_OPEN_REPORT);
// openReport.setIcon(Resources.getIconShow());
//
// openReport.addSelectionListener(new SelectionListener<MenuEvent>() {
// public void componentSelected(MenuEvent ce) {
//
// FileModel selected = listSelectedItems.get(0);
//
// if (selected != null){
// eventBus.fireEvent(new OpenReportsEvent(selected));
// }
//
// }
// });
// MenuItem openReport = new MenuItem();
// openReport.setId(WorkspaceOperation.OPEN_REPORT.getId());
// openReport.setText(ConstantsExplorer.MESSAGE_OPEN_REPORT);
// openReport.setIcon(Resources.getIconShow());
//
// openReport.addSelectionListener(new SelectionListener<MenuEvent>() {
// public void componentSelected(MenuEvent ce) {
//
// FileModel selected = listSelectedItems.get(0);
//
// if (selected != null){
// eventBus.fireEvent(new OpenReportsEvent(selected));
// }
//
// }
// });
//contextMenu.add(openReport);
contextMenu.add(new SeparatorMenuItem());
@ -879,9 +879,7 @@ public class ContextMenuTree {
//CASE DIRECTORY
if(selectedItem.isDirectory()){
if(AppControllerExplorer.ckanEditorOrAdmin)
contextMenu.getItemByItemId(WorkspaceOperation.PUBLISH_ON_DATA_CATALOGUE.getId()).setVisible(true);
contextMenu.getItemByItemId(WorkspaceOperation.PUBLISH_ON_DATA_CATALOGUE.getId()).setVisible(true);
contextMenu.getItemByItemId(WorkspaceOperation.SHARE.getId()).setVisible(true); //SHARE
contextMenu.getItemByItemId(WorkspaceOperation.SHOW.getId()).setVisible(false); //show
contextMenu.getItemByItemId(WorkspaceOperation.REFRESH_FOLDER.getId()).setVisible(true); //refresh

View File

@ -13,7 +13,6 @@ import java.util.concurrent.TimeUnit;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.log4j.Logger;
import org.gcube.common.encryption.StringEncrypter;
@ -42,11 +41,6 @@ import org.gcube.common.homelibrary.home.workspace.search.SearchItem;
import org.gcube.common.homelibrary.home.workspace.trash.WorkspaceTrashFolder;
import org.gcube.common.homelibrary.home.workspace.trash.WorkspaceTrashItem;
import org.gcube.common.portal.PortalContext;
import org.gcube.datacatalogue.ckanutillibrary.ApplicationProfileScopePerUrlReader;
import org.gcube.datacatalogue.ckanutillibrary.DataCatalogue;
import org.gcube.datacatalogue.ckanutillibrary.DataCatalogueFactory;
import org.gcube.datacatalogue.ckanutillibrary.utils.SessionCatalogueAttributes;
import org.gcube.datacatalogue.ckanutillibrary.utils.UtilMethods;
import org.gcube.portlets.user.urlshortener.UrlShortener;
import org.gcube.portlets.user.workspace.client.ConstantsExplorer;
import org.gcube.portlets.user.workspace.client.interfaces.GXTCategorySmartFolder;
@ -89,8 +83,6 @@ import org.gcube.portlets.user.workspace.shared.WorkspaceTrashOperation;
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.widgets.ckandatapublisherwidget.shared.GroupBean;
import org.gcube.portlets.widgets.ckandatapublisherwidget.shared.OrganizationBean;
import org.gcube.vomanagement.usermanagement.GroupManager;
import org.gcube.vomanagement.usermanagement.UserManager;
import org.gcube.vomanagement.usermanagement.exception.UserManagementSystemException;
@ -102,8 +94,6 @@ 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.
@ -2628,7 +2618,6 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT
String email = info.getUserEmail();
String firstName = "Testing";
String lastName = "User";
boolean publishRights = false;
if (isWithinPortal() && username != null) {
try {
@ -2637,9 +2626,6 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT
firstName = user.getFirstName();
lastName = user.getLastName();
email = user.getEmail();
// check if he has catalogue role
publishRights = enablePublishOnCatalogue(currentPortletUrl);
}catch (UserManagementSystemException e) {
workspaceLogger.error("UserManagementSystemException for username: "+username);
}
@ -2652,7 +2638,7 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT
}
UserBean us = new UserBean(username, firstName, lastName, email, publishRights);
UserBean us = new UserBean(username, firstName, lastName, email);
workspaceLogger.info("Returning myLogin: "+us);
return us;
@ -3398,130 +3384,6 @@ public class GWTWorkspaceServiceImpl extends RemoteServiceServlet implements GWT
}
}
/**
* Retrieve an instance of the library for the scope.
*
* @param scope if it is null it is evaluated from the session
* @return the ckan utils obj
*/
public DataCatalogue getCatalogue(String scope){
PortalContextInfo info = WsUtil.getPortalContext(this.getThreadLocalRequest());
DataCatalogue instance = null;
try{
String scopeInWhichDiscover = scope != null && !scope.isEmpty() ? scope : info.getCurrentScope();
workspaceLogger.debug("Discovering ckan instance into scope " + scopeInWhichDiscover);
instance = DataCatalogueFactory.getFactory().getUtilsPerScope(scopeInWhichDiscover);
}catch(Exception e){
workspaceLogger.error("Unable to retrieve ckan utils", e);
}
return instance;
}
/**
* Check if the current user has publish rights on the data catalogue
* @param currentPortletUrl
* @return
*/
private boolean enablePublishOnCatalogue(String currentPortletUrl) {
PortalContextInfo info = WsUtil.getPortalContext(this.getThreadLocalRequest());
String username = info.getUsername();
HttpSession httpSession = this.getThreadLocalRequest().getSession();
if(!isWithinPortal()){
workspaceLogger.warn("OUT FROM PORTAL DETECTED RETURNING TRUE");
return false;
}
if(username == null){
workspaceLogger.warn("Session expired");
return false;
}
// retrieve scope per current portlet url
String scopePerCurrentUrl = ApplicationProfileScopePerUrlReader.getScopePerUrl(currentPortletUrl);
this.getThreadLocalRequest().getSession().setAttribute(currentPortletUrl, scopePerCurrentUrl);
// 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
Boolean role = (Boolean) httpSession.getAttribute(keyPerScopeRole);
// if the attribute was already set..
if(role != null)
return role;
else{
try{
role = false;
GroupManager gm = new LiferayGroupManager();
String groupName = gm.getGroup(gm.getGroupIdFromInfrastructureScope(scopePerCurrentUrl)).getGroupName();
// we build up also a list that keeps track of the scopes (orgs) in which the user has role ADMIN/EDITOR
List<OrganizationBean> orgsInWhichAtLeastEditorRole = new ArrayList<OrganizationBean>();
role = UserUtil.getHighestRole(scopePerCurrentUrl, username, groupName, this, orgsInWhichAtLeastEditorRole);
// if he is an admin/editor preload:
// 1) organizations in which he can publish (the widget will find these info in session)
if(role){
httpSession.setAttribute(keyPerScopeOrganizations, orgsInWhichAtLeastEditorRole);
httpSession.setAttribute(keyPerScopeGroups, fetchUserGroups(scopePerCurrentUrl, username));
}
}catch(Exception e){
workspaceLogger.error("Unable to retrieve the role information for this user. Returning FALSE", e);
role = false;
}
}
// set role in session for this scope
httpSession.setAttribute(keyPerScopeRole, role);
workspaceLogger.info("Does the user have the right to publish on the catalogue? " + role);
// return false
return role;
}
/**
* Fetch the list of ckan groups for which the user is member
* @param context
* @return
*/
private List<GroupBean> fetchUserGroups(String context, String username) {
List<GroupBean> toReturn = null;
workspaceLogger.info("Preloading user's groups");
try{
DataCatalogue catalogue = getCatalogue(context);
List<CkanGroup> ckanGroups = catalogue.getGroups();
String apiKey = catalogue.getApiKeyFromUsername(username);
toReturn = new ArrayList<GroupBean>();
// 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)
*/

View File

@ -4,26 +4,12 @@ import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import org.gcube.datacatalogue.ckanutillibrary.DataCatalogue;
import org.gcube.datacatalogue.ckanutillibrary.models.RolesCkanGroupOrOrg;
import org.gcube.portlets.user.workspace.client.model.InfoContactModel;
import org.gcube.portlets.user.workspace.server.GWTWorkspaceServiceImpl;
import org.gcube.portlets.widgets.ckandatapublisherwidget.shared.OrganizationBean;
import org.gcube.vomanagement.usermanagement.GroupManager;
import org.gcube.vomanagement.usermanagement.RoleManager;
import org.gcube.vomanagement.usermanagement.UserManager;
import org.gcube.vomanagement.usermanagement.exception.GroupRetrievalFault;
import org.gcube.vomanagement.usermanagement.exception.UserManagementSystemException;
import org.gcube.vomanagement.usermanagement.exception.UserRetrievalFault;
import org.gcube.vomanagement.usermanagement.impl.LiferayGroupManager;
import org.gcube.vomanagement.usermanagement.impl.LiferayRoleManager;
import org.gcube.vomanagement.usermanagement.impl.LiferayUserManager;
import org.gcube.vomanagement.usermanagement.model.GCubeGroup;
import org.gcube.vomanagement.usermanagement.model.GCubeRole;
import org.gcube.vomanagement.usermanagement.model.GCubeUser;
import org.gcube.vomanagement.usermanagement.model.GatewayRolesNames;
import eu.trentorise.opendata.jackan.model.CkanOrganization;
@ -161,169 +147,4 @@ public class UserUtil {
}
/**
* Retrieve the highest ckan role the user has and also retrieve the list of organizations (scopes) in which the user has the ckan-admin or ckan-editor role
* @param currentScope the current scope
* @param username the current username
* @param groupName the current groupName
* @param workspaceInstance the workspace instance
* @param orgsInWhichAtLeastEditorRole the orgs in which admin/editor role
* @return true, if successful
*/
public static boolean getHighestRole(String currentScope, String username, String groupName, GWTWorkspaceServiceImpl workspaceInstance, List<OrganizationBean> orgsInWhichAtLeastEditorRole){
// base role as default value
boolean toReturn = false;
try{
UserManager userManager = new LiferayUserManager();
RoleManager roleManager = new LiferayRoleManager();
GroupManager groupManager = new LiferayGroupManager();
// user id
long userid = userManager.getUserId(username);
// retrieve current group id
long currentGroupId = groupManager.getGroupIdFromInfrastructureScope(currentScope);
logger.debug("Group id is " + currentGroupId + " and scope is " + currentScope);
// retrieve the flat list of organizations for the current user
List<GCubeGroup> groups = groupManager.listGroupsByUser(userid);
// root (so check into the root, the VOs and the VRES)
if(groupManager.isRootVO(currentGroupId)){
logger.info("The current scope is the Root Vo, so the list of organizations of the user " + username + " is " + groups);
for (GCubeGroup gCubeGroup : groups) {
// get the name of this group
String gCubeGroupName = gCubeGroup.getGroupName();
// get the role of the users in this group
List<GCubeRole> roles = roleManager.listRolesByUserAndGroup(userid, groupManager.getGroupId(gCubeGroupName));
// get highest role
RolesCkanGroupOrOrg correspondentRoleToCheck = getLiferayHighestRoleInOrg(roles);
if(correspondentRoleToCheck.equals(RolesCkanGroupOrOrg.MEMBER))
continue;
checkIfRoleIsSetInCkanInstance(username, gCubeGroupName, correspondentRoleToCheck, workspaceInstance,
groupManager, gCubeGroup.getGroupId(), orgsInWhichAtLeastEditorRole);
}
}else if(groupManager.isVO(currentGroupId)){
logger.debug("The list of organizations of the user " + username + " to scan is the one under the VO " + groupName);
for (GCubeGroup gCubeGroup : groups) {
// if the gCubeGroup is not under the VO or it is not the VO continue
if(currentGroupId != gCubeGroup.getParentGroupId() || currentGroupId != gCubeGroup.getGroupId())
continue;
String gCubeGroupName = gCubeGroup.getGroupName();
List<GCubeRole> roles = roleManager.listRolesByUserAndGroup(userid, groupManager.getGroupId(gCubeGroupName));
// get highest role
RolesCkanGroupOrOrg correspondentRoleToCheck = getLiferayHighestRoleInOrg(roles);
if(correspondentRoleToCheck.equals(RolesCkanGroupOrOrg.MEMBER))
continue;
checkIfRoleIsSetInCkanInstance(username, gCubeGroupName, correspondentRoleToCheck, workspaceInstance,
groupManager, gCubeGroup.getGroupId(), orgsInWhichAtLeastEditorRole);
}
}else if(groupManager.isVRE(currentGroupId)){
List<GCubeRole> roles = roleManager.listRolesByUserAndGroup(userManager.getUserId(username), groupManager.getGroupId(groupName));
logger.debug("The current scope is the vre " + groupName);
// get highest role
RolesCkanGroupOrOrg correspondentRoleToCheck = getLiferayHighestRoleInOrg(roles);
checkIfRoleIsSetInCkanInstance(username, groupName, correspondentRoleToCheck, workspaceInstance,
groupManager, currentGroupId, orgsInWhichAtLeastEditorRole);
}
}catch(Exception e){
logger.error("Unable to retrieve the role information for this user. Returning false", e);
return false;
}
//ok, somewhere he is admin/editor
if(orgsInWhichAtLeastEditorRole.size() > 0)
toReturn = true;
// return the role
logger.debug("Returning role " + toReturn + " for user " + username);
return toReturn;
}
/**
* Check if the role admin is set or must be set into the ckan instance at this scope.
*
* @param username the username
* @param gCubeGroupName the g cube group name
* @param correspondentRoleToCheck the correspondent role to check
* @param workspaceInstance the workspace instance
* @param groupManager the group manager
* @param groupId the group id
* @param orgsInWhichAdminRole the orgs in which admin role
* @throws UserManagementSystemException the user management system exception
* @throws GroupRetrievalFault the group retrieval fault
*/
private static void checkIfRoleIsSetInCkanInstance(String username,
String gCubeGroupName,
RolesCkanGroupOrOrg correspondentRoleToCheck,
GWTWorkspaceServiceImpl workspaceInstance,
GroupManager groupManager, long groupId, List<OrganizationBean> orgsInWhichAdminRole) throws UserManagementSystemException, GroupRetrievalFault {
// with this invocation, we check if the role is present in ckan and if it is not it will be added
DataCatalogue catalogue = workspaceInstance.getCatalogue(groupManager.getInfrastructureScope(groupId));
// if there is an instance of ckan in this scope..
if(catalogue != null){
boolean res = catalogue.checkRoleIntoOrganization(username, gCubeGroupName, correspondentRoleToCheck);
if(res && !correspondentRoleToCheck.equals(RolesCkanGroupOrOrg.MEMBER)){
// get the orgs of the user
List<CkanOrganization> ckanOrgs = catalogue.getOrganizationsByUser(username);
for (CkanOrganization ckanOrganization : ckanOrgs) {
if(ckanOrganization.getName().equals(gCubeGroupName.toLowerCase())){//|| ckanOrganization.getName().equals(CKanUtilsImpl.PRODUCTION_CKAN_ORGNAME_ROOT)){
orgsInWhichAdminRole.add(new OrganizationBean(ckanOrganization.getTitle(), ckanOrganization.getName()));
break;
}
}
}
}else
logger.error("It seems there is no ckan instance into scope " + groupManager.getInfrastructureScope(groupId));
}
/**
* Retrieve the ckan role among a list of liferay roles
* @param roles
* @return MEMBER/EDITOR/ADMIN role
*/
private static RolesCkanGroupOrOrg getLiferayHighestRoleInOrg(
List<GCubeRole> roles) {
// NOTE: it is supposed that there is just one role for this person correspondent to the one in the catalog
for (GCubeRole gCubeRole : roles) {
if(gCubeRole.getRoleName().equalsIgnoreCase(GatewayRolesNames.CATALOGUE_ADMIN.getRoleName())){
return RolesCkanGroupOrOrg.ADMIN;
}
if(gCubeRole.getRoleName().equalsIgnoreCase(GatewayRolesNames.CATALOGUE_EDITOR.getRoleName())){
return RolesCkanGroupOrOrg.EDITOR;
}
}
return RolesCkanGroupOrOrg.MEMBER;
}
}

View File

@ -13,17 +13,15 @@ public class UserBean implements Serializable {
private String firstName;
private String lastName;
private String email;
private Boolean cataloguePermission;
public UserBean() {
}
public UserBean(String username, String firstName, String lastName, String email, Boolean cataloguePermission) {
public UserBean(String username, String firstName, String lastName, String email) {
this.username = username;
this.firstName = firstName;
this.lastName = lastName;
this.email = email;
this.cataloguePermission = cataloguePermission;
}
@ -63,15 +61,6 @@ public class UserBean implements Serializable {
}
/**
* @return the cataloguePermission
*/
public Boolean getCataloguePermission() {
return cataloguePermission;
}
/**
* @param username the username to set
*/
@ -108,19 +97,6 @@ public class UserBean implements Serializable {
}
/**
* @param cataloguePermission the cataloguePermission to set
*/
public void setCataloguePermission(Boolean cataloguePermission) {
this.cataloguePermission = cataloguePermission;
}
public Boolean hasCataloguePermission() {
return cataloguePermission;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@ -136,8 +112,6 @@ public class UserBean implements Serializable {
builder.append(lastName);
builder.append(", email=");
builder.append(email);
builder.append(", cataloguePermission=");
builder.append(cataloguePermission);
builder.append("]");
return builder.toString();
}