diff --git a/src/main/java/org/gcube/portlets/user/workspace/server/util/UserUtil.java b/src/main/java/org/gcube/portlets/user/workspace/server/util/UserUtil.java index 95d5f36..44ecb32 100644 --- a/src/main/java/org/gcube/portlets/user/workspace/server/util/UserUtil.java +++ b/src/main/java/org/gcube/portlets/user/workspace/server/util/UserUtil.java @@ -12,6 +12,7 @@ import org.gcube.portlets.widgets.ckandatapublisherwidget.shared.OrganizationBea 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; @@ -21,6 +22,7 @@ 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; @@ -209,41 +211,15 @@ public class UserUtil { // get the role of the users in this group List roles = roleManager.listRolesByUserAndGroup(userid, groupManager.getGroupId(gCubeGroupName)); - // the default one - RolesIntoOrganization correspondentRoleToCheck = RolesIntoOrganization.MEMBER; - - // 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())){ - logger.debug("User " + username + " has role " + gCubeRole.getRoleName() + " in " + gCubeGroupName); - correspondentRoleToCheck = RolesIntoOrganization.ADMIN; - break; - } - } + // get highest role + RolesIntoOrganization correspondentRoleToCheck = getLiferayHighestRoleInOrg(roles); // if the role is member, continue if(correspondentRoleToCheck.equals(RolesIntoOrganization.MEMBER)) continue; - // with this invocation, we check if the role is present in ckan and if it is not it will be added - CKanUtils ckanUtils = workspaceInstance.getCkanUtilsObj(groupManager.getInfrastructureScope(gCubeGroup.getGroupId())); - - // if there is an instance of ckan in this scope.. - if(ckanUtils != null){ - boolean res = ckanUtils.checkRole(username, gCubeGroupName, correspondentRoleToCheck); - if(res){ - - // get the orgs of the user - List ckanOrgs = ckanUtils.getOrganizationsByUser(username); - for (CkanOrganization ckanOrganization : ckanOrgs) { - if(ckanOrganization.getName().equals(gCubeGroupName.toLowerCase())){ - orgsInWhichAdminRole.add(new OrganizationBean(ckanOrganization.getTitle(), ckanOrganization.getName())); - break; - } - } - } - }else - logger.error("It seems there is no ckan instance into scope " + groupManager.getInfrastructureScope(gCubeGroup.getGroupId())); + checkIfRoleIsSetInCkanInstance(username, gCubeGroupName, correspondentRoleToCheck, workspaceInstance, + groupManager, gCubeGroup.getGroupId(), orgsInWhichAdminRole); } }else if(groupManager.isVO(currentGroupId)){ @@ -260,41 +236,15 @@ public class UserUtil { List roles = roleManager.listRolesByUserAndGroup(userid, groupManager.getGroupId(gCubeGroupName)); - // the default one - RolesIntoOrganization correspondentRoleToCheck = RolesIntoOrganization.MEMBER; - - // NOTE: it is supposed that there is just one role for this person correspondent to the one in the catalog - for (GCubeRole gCubeRole : roles) { - - logger.debug("User " + username + " has role " + gCubeRole.getRoleName() + " in " + gCubeGroupName); - if(gCubeRole.getRoleName().equalsIgnoreCase(GatewayRolesNames.CATALOGUE_ADMIN.getRoleName())){ - correspondentRoleToCheck = RolesIntoOrganization.ADMIN; - break; - } - } + // get highest role + RolesIntoOrganization correspondentRoleToCheck = getLiferayHighestRoleInOrg(roles); // if the role is member, continue if(correspondentRoleToCheck.equals(RolesIntoOrganization.MEMBER)) continue; - // with this invocation, we check if the role is present in ckan and if it is not it will be added - CKanUtils ckanUtils = workspaceInstance.getCkanUtilsObj(groupManager.getInfrastructureScope(gCubeGroup.getGroupId())); - - // if there is an instance of ckan in this scope.. - if(ckanUtils != null){ - boolean res = ckanUtils.checkRole(username, gCubeGroupName, correspondentRoleToCheck); - if(res){ - // get the orgs of the user - List ckanOrgs = ckanUtils.getOrganizationsByUser(username); - for (CkanOrganization ckanOrganization : ckanOrgs) { - if(ckanOrganization.getName().equals(gCubeGroupName.toLowerCase())){ - orgsInWhichAdminRole.add(new OrganizationBean(ckanOrganization.getTitle(), ckanOrganization.getName())); - break; - } - } - } - }else - logger.error("It seems there is no ckan instance into scope " + groupManager.getInfrastructureScope(gCubeGroup.getGroupId())); + checkIfRoleIsSetInCkanInstance(username, gCubeGroupName, correspondentRoleToCheck, workspaceInstance, + groupManager, gCubeGroup.getGroupId(), orgsInWhichAdminRole); } }else if(groupManager.isVRE(currentGroupId)){ @@ -302,38 +252,14 @@ public class UserUtil { logger.debug("The current scope is the vre " + groupName); - // the default one - String mainRole = "Catalogue-Member"; - RolesIntoOrganization correspondentRoleToCheck = RolesIntoOrganization.MEMBER; - - // NOTE: it is supposed that there is just one role for this person correspondent to the one in the catalog - for (GCubeRole role : roles) { - - logger.debug("User " + username + " has role " + role.getRoleName() + " in " + currentScope); - if(role.getRoleName().equalsIgnoreCase(GatewayRolesNames.CATALOGUE_ADMIN.getRoleName())){ - mainRole = GatewayRolesNames.CATALOGUE_ADMIN.getRoleName(); - correspondentRoleToCheck = RolesIntoOrganization.ADMIN; - break; - } - } + // get highest role + RolesIntoOrganization correspondentRoleToCheck = getLiferayHighestRoleInOrg(roles); // if it the role is ADMIN we have to be sure to set it if(correspondentRoleToCheck.equals(RolesIntoOrganization.ADMIN)){ - // with this invocation, we check if the role is present in ckan and if it is not it will be added - CKanUtils ckanUtils = workspaceInstance.getCkanUtilsObj(groupManager.getInfrastructureScope(currentGroupId)); - boolean res = ckanUtils.checkRole(username, groupName, correspondentRoleToCheck); - - if(res){ - // get the orgs of the user - List ckanOrgs = ckanUtils.getOrganizationsByUser(username); - for (CkanOrganization ckanOrganization : ckanOrgs) { - if(ckanOrganization.getName().equals(groupName.toLowerCase())){ - orgsInWhichAdminRole.add(new OrganizationBean(ckanOrganization.getTitle(), ckanOrganization.getName())); - break; - } - } - } + checkIfRoleIsSetInCkanInstance(username, groupName, correspondentRoleToCheck, workspaceInstance, + groupManager, currentGroupId, orgsInWhichAdminRole); } } }catch(Exception e){ @@ -349,4 +275,60 @@ public class UserUtil { 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 + * @param gCubeGroupName + * @param correspondentRoleToCheck + * @param workspaceInstance + * @param groupManager + * @param groupId + * @param orgsInWhichAdminRole + * @throws UserManagementSystemException + * @throws GroupRetrievalFault + */ + private static void checkIfRoleIsSetInCkanInstance(String username, + String gCubeGroupName, + RolesIntoOrganization correspondentRoleToCheck, + GWTWorkspaceServiceImpl workspaceInstance, + GroupManager groupManager, long groupId, List 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 + CKanUtils ckanUtils = workspaceInstance.getCkanUtilsObj(groupManager.getInfrastructureScope(groupId)); + + // if there is an instance of ckan in this scope.. + if(ckanUtils != null){ + boolean res = ckanUtils.checkRole(username, gCubeGroupName, correspondentRoleToCheck); + if(res){ + + // get the orgs of the user + List ckanOrgs = ckanUtils.getOrganizationsByUser(username); + for (CkanOrganization ckanOrganization : ckanOrgs) { + if(ckanOrganization.getName().equals(gCubeGroupName.toLowerCase())){ + 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 roles among a list of liferay roles + * @param roles + * @return + */ + private static RolesIntoOrganization getLiferayHighestRoleInOrg( + List 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 RolesIntoOrganization.ADMIN; + } + } + return RolesIntoOrganization.MEMBER; + } }