ACS-5506 Description handling rework

This commit is contained in:
MichalKinas
2024-01-31 00:08:26 +01:00
parent ecfeb77fb0
commit d3c7342f05
11 changed files with 202 additions and 133 deletions

View File

@@ -45,7 +45,7 @@ public class GroupsTests extends RestTest
restClient.authenticateUser(userModel).withCoreAPI().usingGroups().createGroup(groupBodyCreate); restClient.authenticateUser(userModel).withCoreAPI().usingGroups().createGroup(groupBodyCreate);
restClient.assertStatusCodeIs(HttpStatus.FORBIDDEN); restClient.assertStatusCodeIs(HttpStatus.FORBIDDEN);
//+ve //+ve
restClient.authenticateUser(adminUser).withCoreAPI().usingParams("include=zones").usingGroups().createGroup(groupBodyCreate) restClient.authenticateUser(adminUser).withCoreAPI().usingParams("include=zones,hasSubgroups,description").usingGroups().createGroup(groupBodyCreate)
.assertThat().field("zones").contains("APP.DEFAULT") .assertThat().field("zones").contains("APP.DEFAULT")
.and().field("isRoot").is(true) .and().field("isRoot").is(true)
.and().field("displayName").is(groupName) .and().field("displayName").is(groupName)
@@ -82,7 +82,7 @@ public class GroupsTests extends RestTest
restClient.assertStatusCodeIs(HttpStatus.OK); restClient.assertStatusCodeIs(HttpStatus.OK);
//GetGroupDetails: //GetGroupDetails:
restClient.withCoreAPI().usingParams("include=zones").usingGroups().getGroupDetail("GROUP_"+groupName) restClient.withCoreAPI().usingParams("include=zones,hasSubgroups,description").usingGroups().getGroupDetail("GROUP_"+groupName)
.assertThat().field("id").is("GROUP_"+groupName) .assertThat().field("id").is("GROUP_"+groupName)
.and().field("zones").contains("APP.DEFAULT") .and().field("zones").contains("APP.DEFAULT")
.and().field("isRoot").is(true) .and().field("isRoot").is(true)
@@ -94,7 +94,7 @@ public class GroupsTests extends RestTest
restClient.assertStatusCodeIs(HttpStatus.NO_CONTENT); restClient.assertStatusCodeIs(HttpStatus.NO_CONTENT);
//VerifyIfParentHasNoSubgroups: //VerifyIfParentHasNoSubgroups:
restClient.withCoreAPI().usingParams("include=zones").usingGroups().getGroupDetail("GROUP_"+groupName) restClient.withCoreAPI().usingParams("include=zones,hasSubgroups").usingGroups().getGroupDetail("GROUP_"+groupName)
.assertThat().field("id").is("GROUP_"+groupName) .assertThat().field("id").is("GROUP_"+groupName)
.and().field("hasSubgroups").is(false); .and().field("hasSubgroups").is(false);
restClient.assertStatusCodeIs(HttpStatus.OK); restClient.assertStatusCodeIs(HttpStatus.OK);

View File

@@ -40,8 +40,10 @@ public interface Groups
{ {
String PARAM_ID = "id"; String PARAM_ID = "id";
String PARAM_DISPLAY_NAME = "displayName"; String PARAM_DISPLAY_NAME = "displayName";
String PARAM_INCLUDE_DESCRIPTION = "description";
String PARAM_INCLUDE_PARENT_IDS = "parentIds"; String PARAM_INCLUDE_PARENT_IDS = "parentIds";
String PARAM_INCLUDE_ZONES = "zones"; String PARAM_INCLUDE_ZONES = "zones";
String PARAM_INCLUDE_HAS_SUBGROUPS = "hasSubgroups";
String PARAM_IS_ROOT = "isRoot"; String PARAM_IS_ROOT = "isRoot";
String PARAM_CASCADE = "cascade"; String PARAM_CASCADE = "cascade";
String PARAM_MEMBER_TYPE = "memberType"; String PARAM_MEMBER_TYPE = "memberType";

View File

@@ -53,7 +53,6 @@ import org.alfresco.repo.security.authority.AuthorityInfo;
import org.alfresco.repo.security.authority.UnknownAuthorityException; import org.alfresco.repo.security.authority.UnknownAuthorityException;
import org.alfresco.rest.antlr.WhereClauseParser; import org.alfresco.rest.antlr.WhereClauseParser;
import org.alfresco.rest.api.Groups; import org.alfresco.rest.api.Groups;
import org.alfresco.rest.api.Nodes;
import org.alfresco.rest.api.People; import org.alfresco.rest.api.People;
import org.alfresco.rest.api.model.Group; import org.alfresco.rest.api.model.Group;
import org.alfresco.rest.api.model.GroupMember; import org.alfresco.rest.api.model.GroupMember;
@@ -71,9 +70,6 @@ import org.alfresco.rest.framework.resource.parameters.where.Query;
import org.alfresco.rest.framework.resource.parameters.where.QueryHelper; import org.alfresco.rest.framework.resource.parameters.where.QueryHelper;
import org.alfresco.rest.workflow.api.impl.MapBasedQueryWalker; import org.alfresco.rest.workflow.api.impl.MapBasedQueryWalker;
import org.alfresco.rest.workflow.api.impl.MapBasedQueryWalkerOrSupported; import org.alfresco.rest.workflow.api.impl.MapBasedQueryWalkerOrSupported;
import org.alfresco.service.cmr.repository.InvalidNodeRefException;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.security.AuthorityService; import org.alfresco.service.cmr.security.AuthorityService;
import org.alfresco.service.cmr.security.AuthorityType; import org.alfresco.service.cmr.security.AuthorityType;
import org.alfresco.service.cmr.security.PermissionService; import org.alfresco.service.cmr.security.PermissionService;
@@ -114,11 +110,9 @@ public class GroupsImpl implements Groups
private final static Set<String> LIST_GROUP_MEMBERS_QUERY_PROPERTIES = new HashSet<>(List.of(PARAM_MEMBER_TYPE)); private final static Set<String> LIST_GROUP_MEMBERS_QUERY_PROPERTIES = new HashSet<>(List.of(PARAM_MEMBER_TYPE));
protected AuthorityService authorityService; protected AuthorityService authorityService;
protected NodeService nodeService;
private AuthorityDAO authorityDAO; private AuthorityDAO authorityDAO;
protected People people; protected People people;
protected Nodes nodes;
public AuthorityService getAuthorityService() public AuthorityService getAuthorityService()
{ {
@@ -130,10 +124,6 @@ public class GroupsImpl implements Groups
this.authorityService = authorityService; this.authorityService = authorityService;
} }
public void setNodeService(NodeService nodeService) {
this.nodeService = nodeService;
}
public void setAuthorityDAO(AuthorityDAO authorityDAO) public void setAuthorityDAO(AuthorityDAO authorityDAO)
{ {
this.authorityDAO = authorityDAO; this.authorityDAO = authorityDAO;
@@ -144,10 +134,6 @@ public class GroupsImpl implements Groups
this.people = people; this.people = people;
} }
public void setNodes(Nodes nodes) {
this.nodes = nodes;
}
public Group create(Group group, Parameters parameters) public Group create(Group group, Parameters parameters)
{ {
validateGroup(group, false); validateGroup(group, false);
@@ -184,30 +170,30 @@ public class GroupsImpl implements Groups
validateGroup(group, true); validateGroup(group, true);
try try
{
if (StringUtils.isNotEmpty(group.getDescription()))
{
authorityService.setAuthorityDisplayNameAndDescription(groupId, group.getDisplayName(), group.getDescription());
}
else
{ {
authorityService.setAuthorityDisplayName(groupId, group.getDisplayName()); authorityService.setAuthorityDisplayName(groupId, group.getDisplayName());
} }
}
catch (AuthorityException ae) catch (AuthorityException ae)
{ {
handleAuthorityException(ae); handleAuthorityException(ae);
} }
if (StringUtils.isNotEmpty(group.getDescription()))
{
Map<QName, Serializable> props = new HashMap<>();
props.put(ContentModel.PROP_DESCRIPTION, group.getDescription());
authorityDAO.setAuthorityProperties(authorityService.getName(AuthorityType.GROUP, groupId), props);
}
return getGroup(groupId, parameters); return getGroup(groupId, parameters);
} }
public Group getGroup(String groupId, Parameters parameters) throws EntityNotFoundException public Group getGroup(String groupId, Parameters parameters) throws EntityNotFoundException
{ {
AuthorityInfo authorityInfo = getAuthorityInfo(groupId); final List<String> includeParam = parameters.getInclude();
AuthorityInfo authorityInfo = getAuthorityInfo(groupId, includeParam.contains(PARAM_INCLUDE_DESCRIPTION));
final Set<String> rootAuthorities = getAllRootAuthorities(AuthorityType.GROUP); final Set<String> rootAuthorities = getAllRootAuthorities(AuthorityType.GROUP);
final List<String> includeParam = parameters.getInclude();
return getGroup(authorityInfo, includeParam, rootAuthorities); return getGroup(authorityInfo, includeParam, rootAuthorities);
} }
@@ -227,7 +213,7 @@ public class GroupsImpl implements Groups
PagingResults<AuthorityInfo> pagingResult; PagingResults<AuthorityInfo> pagingResult;
try try
{ {
pagingResult = getAuthoritiesInfo(authorityType, groupsFilters, rootAuthorities, sortProp, paging); pagingResult = getAuthoritiesInfo(authorityType, groupsFilters, rootAuthorities, sortProp, paging, parameters.getInclude().contains(PARAM_INCLUDE_DESCRIPTION));
} }
catch (UnknownAuthorityException e) catch (UnknownAuthorityException e)
{ {
@@ -367,7 +353,7 @@ public class GroupsImpl implements Groups
filter(a -> a.startsWith(AuthorityType.GROUP.getPrefixString())). filter(a -> a.startsWith(AuthorityType.GROUP.getPrefixString())).
filter(a -> isRootPredicate(finalIsRootParam, rootAuthorities, a)). filter(a -> isRootPredicate(finalIsRootParam, rootAuthorities, a)).
filter(a -> zonePredicate(a, finalZoneFilter)). filter(a -> zonePredicate(a, finalZoneFilter)).
map(this::getAuthorityInfo). map(a -> getAuthorityInfo(a, includeParam.contains(PARAM_INCLUDE_DESCRIPTION))).
sorted(new AuthorityInfoComparator(sortProp.getFirst(), sortProp.getSecond())). sorted(new AuthorityInfoComparator(sortProp.getFirst(), sortProp.getSecond())).
collect(Collectors.toList()); collect(Collectors.toList());
@@ -386,7 +372,7 @@ public class GroupsImpl implements Groups
} }
private PagingResults<AuthorityInfo> getAuthoritiesInfo(AuthorityType authorityType, GroupsFilter groupsFilter, Set<String> rootAuthorities, private PagingResults<AuthorityInfo> getAuthoritiesInfo(AuthorityType authorityType, GroupsFilter groupsFilter, Set<String> rootAuthorities,
Pair<String, Boolean> sortProp, Paging paging) Pair<String, Boolean> sortProp, Paging paging, boolean includeDescription)
{ {
Boolean isRootParam = groupsFilter.getIsRoot(); Boolean isRootParam = groupsFilter.getIsRoot();
String zoneFilter = groupsFilter.getZoneFilter(); String zoneFilter = groupsFilter.getZoneFilter();
@@ -402,7 +388,7 @@ public class GroupsImpl implements Groups
// Limit the post processing work by using the already loaded // Limit the post processing work by using the already loaded
// list of root authorities. // list of root authorities.
List<AuthorityInfo> authorities = rootAuthorities.stream(). List<AuthorityInfo> authorities = rootAuthorities.stream().
map(this::getAuthorityInfo). map(auth -> getAuthorityInfo(auth, includeDescription)).
filter(auth -> zonePredicate(auth.getAuthorityName(), zoneFilter)). filter(auth -> zonePredicate(auth.getAuthorityName(), zoneFilter)).
filter(auth -> displayNamePredicate(auth.getAuthorityDisplayName(), displayNameFilter)). filter(auth -> displayNamePredicate(auth.getAuthorityDisplayName(), displayNameFilter)).
collect(Collectors.toList()); collect(Collectors.toList());
@@ -557,9 +543,9 @@ public class GroupsImpl implements Groups
* The authority name. * The authority name.
* @return The authority info. * @return The authority info.
*/ */
private AuthorityInfo getAuthorityInfo(String id) private AuthorityInfo getAuthorityInfo(String id, boolean includeDescription)
{ {
return getAuthorityInfo(id, false); return getAuthorityInfo(id, includeDescription, false);
} }
/** /**
@@ -568,11 +554,13 @@ public class GroupsImpl implements Groups
* *
* @param id * @param id
* The authority name. * The authority name.
* @param includeDescription
* True if description should be loaded
* @param defaultDisplayNameIfNull * @param defaultDisplayNameIfNull
* True if we would like to get a default value (e.g. shortName of the authority) if the authority display name is null. * True if we would like to get a default value (e.g. shortName of the authority) if the authority display name is null.
* @return The authority info. * @return The authority info.
*/ */
private AuthorityInfo getAuthorityInfo(String id, boolean defaultDisplayNameIfNull) private AuthorityInfo getAuthorityInfo(String id, boolean includeDescription, boolean defaultDisplayNameIfNull)
{ {
if (id == null || id.isEmpty()) if (id == null || id.isEmpty())
{ {
@@ -585,9 +573,20 @@ public class GroupsImpl implements Groups
throw new EntityNotFoundException(id); throw new EntityNotFoundException(id);
} }
String authorityDisplayName = getAuthorityDisplayName(id, defaultDisplayNameIfNull); String authorityDisplayName;
String description = null;
return new AuthorityInfo(null, authorityDisplayName, id); if (includeDescription)
{
Pair<String, String> displayNameAndDescription = getAuthorityDisplayNameAndDescription(id, defaultDisplayNameIfNull);
authorityDisplayName = displayNameAndDescription.getFirst();
description = displayNameAndDescription.getSecond();
}
else
{
authorityDisplayName = getAuthorityDisplayName(id, defaultDisplayNameIfNull);
}
return new AuthorityInfo(null, authorityDisplayName, id, description);
} }
private String getAuthorityDisplayName(String id, boolean defaultDisplayNameIfNull) private String getAuthorityDisplayName(String id, boolean defaultDisplayNameIfNull)
@@ -595,6 +594,11 @@ public class GroupsImpl implements Groups
return defaultDisplayNameIfNull ? authorityService.getAuthorityDisplayName(id) : authorityDAO.getAuthorityDisplayName(id); return defaultDisplayNameIfNull ? authorityService.getAuthorityDisplayName(id) : authorityDAO.getAuthorityDisplayName(id);
} }
private Pair<String, String> getAuthorityDisplayNameAndDescription(String id, boolean defaultDisplayNameIfNull)
{
return defaultDisplayNameIfNull ? authorityService.getAuthorityDisplayNameAndDescription(id) : authorityDAO.getAuthorityDisplayNameAndDescription(id);
}
private Group getGroup(AuthorityInfo authorityInfo, List<String> includeParam, Set<String> rootAuthorities) private Group getGroup(AuthorityInfo authorityInfo, List<String> includeParam, Set<String> rootAuthorities)
{ {
if (authorityInfo == null) if (authorityInfo == null)
@@ -607,37 +611,24 @@ public class GroupsImpl implements Groups
// REPO-1743 // REPO-1743
String authorityDisplayName = authorityInfo.getAuthorityDisplayName(); String authorityDisplayName = authorityInfo.getAuthorityDisplayName();
String description = authorityInfo.getDescription();
if (authorityDisplayName == null || authorityDisplayName.isEmpty()) if (authorityDisplayName == null || authorityDisplayName.isEmpty())
{
if (includeParam != null && includeParam.contains(PARAM_INCLUDE_DESCRIPTION))
{
Pair<String, String> displayNameAndDescription = authorityService.getAuthorityDisplayNameAndDescription(authorityInfo.getAuthorityName());
authorityDisplayName = displayNameAndDescription.getFirst();
description = displayNameAndDescription.getSecond();
}
else
{ {
authorityDisplayName = authorityService.getAuthorityDisplayName(authorityInfo.getAuthorityName()); authorityDisplayName = authorityService.getAuthorityDisplayName(authorityInfo.getAuthorityName());
} }
}
group.setDisplayName(authorityDisplayName); group.setDisplayName(authorityDisplayName);
group.setIsRoot(isRootAuthority(rootAuthorities, authorityInfo.getAuthorityName()));
Set<String> containedAuthorities;
try
{
containedAuthorities = authorityService.getContainedAuthorities(AuthorityType.GROUP, authorityInfo.getAuthorityName(), true);
} catch (UnknownAuthorityException e)
{
containedAuthorities = Collections.emptySet();
}
group.setHasSubgroups(CollectionUtils.isNotEmpty(containedAuthorities));
NodeRef groupNodeRef = authorityService.getAuthorityNodeRef(authorityInfo.getAuthorityName());
String description;
try
{
description = groupNodeRef != null && nodeService.getProperty(groupNodeRef, ContentModel.PROP_DESCRIPTION) != null ?
nodeService.getProperty(groupNodeRef, ContentModel.PROP_DESCRIPTION).toString() :
null;
} catch (InvalidNodeRefException e)
{
description = null;
}
group.setDescription(description); group.setDescription(description);
group.setIsRoot(isRootAuthority(rootAuthorities, authorityInfo.getAuthorityName()));
// Optionally include // Optionally include
if (includeParam != null) if (includeParam != null)
@@ -660,6 +651,19 @@ public class GroupsImpl implements Groups
Set<String> authorityZones = authorityService.getAuthorityZones(authorityInfo.getAuthorityName()); Set<String> authorityZones = authorityService.getAuthorityZones(authorityInfo.getAuthorityName());
group.setZones(authorityZones); group.setZones(authorityZones);
} }
if (includeParam.contains(PARAM_INCLUDE_HAS_SUBGROUPS))
{
Set<String> containedAuthorities;
try
{
containedAuthorities = authorityService.getContainedAuthorities(AuthorityType.GROUP, authorityInfo.getAuthorityName(), true);
} catch (UnknownAuthorityException e)
{
containedAuthorities = Collections.emptySet();
}
group.setHasSubgroups(CollectionUtils.isNotEmpty(containedAuthorities));
}
} }
return group; return group;
@@ -947,7 +951,7 @@ public class GroupsImpl implements Groups
} }
List<AuthorityInfo> authorityInfoList = new ArrayList<>(authorities.size()); List<AuthorityInfo> authorityInfoList = new ArrayList<>(authorities.size());
authorityInfoList.addAll(authorities.stream().map(this::getAuthorityInfo).collect(Collectors.toList())); authorityInfoList.addAll(authorities.stream().map(auth -> getAuthorityInfo(auth, false)).collect(Collectors.toList()));
// Post process sorting - this should be moved to service // Post process sorting - this should be moved to service
// layer. It is done here because sorting is not supported at // layer. It is done here because sorting is not supported at
@@ -996,7 +1000,7 @@ public class GroupsImpl implements Groups
private GroupMember getGroupMember(String authorityId) private GroupMember getGroupMember(String authorityId)
{ {
AuthorityInfo authorityInfo = getAuthorityInfo(authorityId); AuthorityInfo authorityInfo = getAuthorityInfo(authorityId, false);
return getGroupMember(authorityInfo); return getGroupMember(authorityInfo);
} }

View File

@@ -1693,8 +1693,6 @@
<property name="authorityService" ref="AuthorityService" /> <property name="authorityService" ref="AuthorityService" />
<property name="authorityDAO" ref="authorityDAO" /> <property name="authorityDAO" ref="authorityDAO" />
<property name="people" ref="people"/> <property name="people" ref="people"/>
<property name="nodes" ref="Nodes"/>
<property name="nodeService" ref="NodeService" />
</bean> </bean>
<bean id="Groups" class="org.springframework.aop.framework.ProxyFactoryBean"> <bean id="Groups" class="org.springframework.aop.framework.ProxyFactoryBean">

View File

@@ -68,6 +68,7 @@ public class GroupsTest extends AbstractSingleNetworkSiteTest
private static final String MEMBER_TYPE_GROUP = "GROUP"; private static final String MEMBER_TYPE_GROUP = "GROUP";
private static final String MEMBER_TYPE_PERSON = "PERSON"; private static final String MEMBER_TYPE_PERSON = "PERSON";
private static final String GROUP_EVERYONE = "GROUP_EVERYONE"; private static final String GROUP_EVERYONE = "GROUP_EVERYONE";
private static final String INCLUDE_DESCRIPTION_HAS_SUBGROUPS = "description,hasSubgroups";
protected AuthorityService authorityService; protected AuthorityService authorityService;
@@ -666,13 +667,13 @@ public class GroupsTest extends AbstractSingleNetworkSiteTest
assertNotNull(group.getId()); assertNotNull(group.getId());
assertNotNull(group.getDisplayName()); assertNotNull(group.getDisplayName());
assertNotNull(group.getIsRoot()); assertNotNull(group.getIsRoot());
assertNotNull(group.getHasSubgroups());
if (!ignoreOptionallyIncluded) if (!ignoreOptionallyIncluded)
{ {
// Optionally included. // Optionally included.
assertNull(group.getParentIds()); assertNull(group.getParentIds());
assertNull(group.getZones()); assertNull(group.getZones());
assertNotNull(group.getHasSubgroups());
} }
} }
@@ -1420,12 +1421,12 @@ public class GroupsTest extends AbstractSingleNetworkSiteTest
setRequestContext(networkOne.getId(), networkAdmin, DEFAULT_ADMIN_PWD); setRequestContext(networkOne.getId(), networkAdmin, DEFAULT_ADMIN_PWD);
Map<String, String> otherParams = new HashMap<>(); Map<String, String> otherParams = new HashMap<>();
otherParams.put("include", org.alfresco.rest.api.Groups.PARAM_INCLUDE_PARENT_IDS); otherParams.put("include", INCLUDE_DESCRIPTION_HAS_SUBGROUPS);
Group group = generateGroup(); Group group = generateGroup();
group.setDescription("testDesc"); group.setDescription("testDesc");
Group createdGroup01 = groupsProxy.createGroup(group, null, HttpServletResponse.SC_CREATED); Group createdGroup01 = groupsProxy.createGroup(group, otherParams, HttpServletResponse.SC_CREATED);
assertNotNull(createdGroup01); assertNotNull(createdGroup01);
assertNotNull(createdGroup01.getId()); assertNotNull(createdGroup01.getId());
@@ -1440,6 +1441,7 @@ public class GroupsTest extends AbstractSingleNetworkSiteTest
Group subGroup01 = generateGroup(); Group subGroup01 = generateGroup();
subGroup01.setParentIds(subGroup01Parents); subGroup01.setParentIds(subGroup01Parents);
otherParams.put("include", org.alfresco.rest.api.Groups.PARAM_INCLUDE_PARENT_IDS + "," + INCLUDE_DESCRIPTION_HAS_SUBGROUPS);
Group createdSubGroup01 = groupsProxy.createGroup(subGroup01, otherParams, HttpServletResponse.SC_CREATED); Group createdSubGroup01 = groupsProxy.createGroup(subGroup01, otherParams, HttpServletResponse.SC_CREATED);
assertNotNull(createdSubGroup01); assertNotNull(createdSubGroup01);
assertNotNull(createdSubGroup01.getId()); assertNotNull(createdSubGroup01.getId());
@@ -1449,7 +1451,7 @@ public class GroupsTest extends AbstractSingleNetworkSiteTest
assertFalse(createdSubGroup01.getHasSubgroups()); assertFalse(createdSubGroup01.getHasSubgroups());
//validate if parent group now has any subgroup //validate if parent group now has any subgroup
Group group01 = groupsProxy.getGroup(createdGroup01.getId(), null, HttpServletResponse.SC_OK); Group group01 = groupsProxy.getGroup(createdGroup01.getId(), otherParams, HttpServletResponse.SC_OK);
assertTrue(group01.getHasSubgroups()); assertTrue(group01.getHasSubgroups());
} }
@@ -1623,7 +1625,7 @@ public class GroupsTest extends AbstractSingleNetworkSiteTest
final Groups groupsProxy = publicApiClient.groups(); final Groups groupsProxy = publicApiClient.groups();
Map<String, String> otherParams = new HashMap<>(); Map<String, String> otherParams = new HashMap<>();
otherParams.put("include", org.alfresco.rest.api.Groups.PARAM_INCLUDE_PARENT_IDS); otherParams.put("include", org.alfresco.rest.api.Groups.PARAM_INCLUDE_PARENT_IDS + "," + org.alfresco.rest.api.Groups.PARAM_INCLUDE_DESCRIPTION);
setRequestContext(networkOne.getId(), networkAdmin, DEFAULT_ADMIN_PWD); setRequestContext(networkOne.getId(), networkAdmin, DEFAULT_ADMIN_PWD);

View File

@@ -37,6 +37,7 @@ import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.security.AuthorityType; import org.alfresco.service.cmr.security.AuthorityType;
import org.alfresco.service.cmr.security.AuthorityService.AuthorityFilter; import org.alfresco.service.cmr.security.AuthorityService.AuthorityFilter;
import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.QName;
import org.alfresco.util.Pair;
public interface AuthorityDAO public interface AuthorityDAO
{ {
@@ -152,9 +153,16 @@ public interface AuthorityDAO
void setAuthorityDisplayName(String authorityName, String authorityDisplayName); void setAuthorityDisplayName(String authorityName, String authorityDisplayName);
/** /**
* Set the properties for an authority * Get the display name and description for an authority
*
* @return the display name and description
*/ */
void setAuthorityProperties(String authorityName, Map<QName, Serializable> properties); Pair<String, String> getAuthorityDisplayNameAndDescription(String authorityName);
/**
* Set the display name and description for an authority
*/
void setAuthorityDisplayNameAndDescription(String authorityName, String authorityDisplayName, String description);
/** /**
* Get root authorities * Get root authorities

View File

@@ -1442,18 +1442,29 @@ public class AuthorityDAOImpl implements AuthorityDAO, NodeServicePolicies.Befor
return; return;
} }
nodeService.setProperty(ref, ContentModel.PROP_AUTHORITY_DISPLAY_NAME, authorityDisplayName); nodeService.setProperty(ref, ContentModel.PROP_AUTHORITY_DISPLAY_NAME, authorityDisplayName);
} }
@Override public Pair<String, String> getAuthorityDisplayNameAndDescription(String authorityName)
public void setAuthorityProperties(String authorityName, Map<QName, Serializable> properties) {
NodeRef ref = getAuthorityOrNull(authorityName);
if (ref == null)
{
return Pair.nullPair();
}
Serializable displayName = nodeService.getProperty(ref, ContentModel.PROP_AUTHORITY_DISPLAY_NAME);
Serializable description = nodeService.getProperty(ref, ContentModel.PROP_DESCRIPTION);
return new Pair<>(DefaultTypeConverter.INSTANCE.convert(String.class, displayName), DefaultTypeConverter.INSTANCE.convert(String.class, description));
}
public void setAuthorityDisplayNameAndDescription(String authorityName, String authorityDisplayName, String description)
{ {
NodeRef ref = getAuthorityOrNull(authorityName); NodeRef ref = getAuthorityOrNull(authorityName);
if (ref == null) if (ref == null)
{ {
return; return;
} }
properties.forEach((key, value) -> nodeService.setProperty(ref, key, value)); nodeService.setProperty(ref, ContentModel.PROP_AUTHORITY_DISPLAY_NAME, authorityDisplayName);
nodeService.setProperty(ref, ContentModel.PROP_DESCRIPTION, description);
} }
public NodeRef getOrCreateZone(String zoneName) public NodeRef getOrCreateZone(String zoneName)

View File

@@ -39,15 +39,24 @@ import org.alfresco.service.cmr.security.AuthorityType;
public class AuthorityInfo public class AuthorityInfo
{ {
private Long nodeId; private Long nodeId;
private String authorityDisplayName; // eg. My Group, My Role private String authorityDisplayName; // eg. My Group, My Role
private String authorityName; // eg. GROUP_my1, ROLE_myA private String authorityName; // eg. GROUP_my1, ROLE_myA
private String description;
public AuthorityInfo(Long nodeId, String authorityDisplayName, String authorityName, String description)
{
this.nodeId = nodeId;
this.authorityDisplayName = authorityDisplayName;
this.authorityName = authorityName;
this.description = description;
}
public AuthorityInfo(Long nodeId, String authorityDisplayName, String authorityName) public AuthorityInfo(Long nodeId, String authorityDisplayName, String authorityName)
{ {
this.nodeId = nodeId; this.nodeId = nodeId;
this.authorityDisplayName = authorityDisplayName; this.authorityDisplayName = authorityDisplayName;
this.authorityName = authorityName; this.authorityName = authorityName;
this.description = null;
} }
public Long getNodeId() public Long getNodeId()
@@ -65,6 +74,10 @@ public class AuthorityInfo
return authorityName; return authorityName;
} }
public String getDescription() {
return description;
}
public String getShortName() public String getShortName()
{ {
AuthorityType type = AuthorityType.getAuthorityType(authorityName); AuthorityType type = AuthorityType.getAuthorityType(authorityName);

View File

@@ -697,6 +697,29 @@ public class AuthorityServiceImpl implements AuthorityService, InitializingBean
authorityDAO.setAuthorityDisplayName(authorityName, authorityDisplayName); authorityDAO.setAuthorityDisplayName(authorityName, authorityDisplayName);
} }
/**
* {@inheritDoc}
*/
public Pair<String, String> getAuthorityDisplayNameAndDescription(String name)
{
Pair<String, String> displayNameAndDescription = authorityDAO.getAuthorityDisplayNameAndDescription(name);
if(displayNameAndDescription.getFirst() == null)
{
displayNameAndDescription.setFirst(getShortName(name));
}
return displayNameAndDescription;
}
/**
* {@inheritDoc}
*/
public void setAuthorityDisplayNameAndDescription(String authorityName, String authorityDisplayName, String description)
{
AuthorityType type = AuthorityType.getAuthorityType(authorityName);
checkTypeIsMutable(type);
authorityDAO.setAuthorityDisplayNameAndDescription(authorityName, authorityDisplayName, description);
}
/** /**
* {@inheritDoc} * {@inheritDoc}
*/ */

View File

@@ -38,6 +38,7 @@ import org.alfresco.service.Auditable;
import org.alfresco.service.NotAuditable; import org.alfresco.service.NotAuditable;
import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.QName;
import org.alfresco.util.Pair;
/** /**
* The service that encapsulates authorities granted to users. * The service that encapsulates authorities granted to users.
@@ -441,7 +442,16 @@ public interface AuthorityService
* @return - the display name * @return - the display name
*/ */
@Auditable(parameters = {"name"}) @Auditable(parameters = {"name"})
public String getAuthorityDisplayName(String name); String getAuthorityDisplayName(String name);
/**
* Get the display name and description for the given authority.
*
* @param name - the full authority string including any prefix (e.g. GROUP_woof)
* @return - pair containing display name and description
*/
@Auditable(parameters = {"name"})
Pair<String, String> getAuthorityDisplayNameAndDescription(String name);
/** /**
* Set the display name for the given authority. * Set the display name for the given authority.
@@ -451,7 +461,18 @@ public interface AuthorityService
* @param authorityDisplayName String * @param authorityDisplayName String
*/ */
@Auditable(parameters = {"authorityName", "authorityDisplayName"}) @Auditable(parameters = {"authorityName", "authorityDisplayName"})
public void setAuthorityDisplayName(String authorityName, String authorityDisplayName); void setAuthorityDisplayName(String authorityName, String authorityDisplayName);
/**
* Set the display name and description for the given authority.
* Setting the display name is only supported for authorities of type group
*
* @param authorityName String
* @param authorityDisplayName String
* @param description String
*/
@Auditable(parameters = {"authorityName", "authorityDisplayName", "description"})
void setAuthorityDisplayNameAndDescription(String authorityName, String authorityDisplayName, String description);
/** /**
* Gets the authority node for the specified name * Gets the authority node for the specified name

View File

@@ -83,6 +83,7 @@ import org.alfresco.service.namespace.RegexQNamePattern;
import org.alfresco.service.transaction.TransactionService; import org.alfresco.service.transaction.TransactionService;
import org.alfresco.test_category.OwnJVMTestsCategory; import org.alfresco.test_category.OwnJVMTestsCategory;
import org.alfresco.util.ApplicationContextHelper; import org.alfresco.util.ApplicationContextHelper;
import org.alfresco.util.Pair;
import org.alfresco.util.testing.category.LuceneTests; import org.alfresco.util.testing.category.LuceneTests;
import org.alfresco.util.testing.category.RedundantTests; import org.alfresco.util.testing.category.RedundantTests;
import org.junit.FixMethodOrder; import org.junit.FixMethodOrder;
@@ -616,34 +617,6 @@ public class AuthorityServiceTest extends TestCase
pubAuthorityService.deleteAuthority(auth); pubAuthorityService.deleteAuthority(auth);
} }
@Test
public void testUpdateAuthorityProperties()
{
String auth;
String groupName = "TESTGROUP";
String prefixedGroupName = "GROUP_TESTGROUP";
String description = "testDesc";
String title = "testTitle";
Map<QName, Serializable> props = new HashMap<>();
props.put(ContentModel.PROP_DESCRIPTION, description);
props.put(ContentModel.PROP_TITLE, title);
// create authority with properties
auth = pubAuthorityService.createAuthority(AuthorityType.GROUP, groupName, props);
assertTrue(pubAuthorityService.authorityExists(prefixedGroupName));
// update authority properties
String newDescription = "newTestDesc";
String newTitle = "newTestTitle";
props.put(ContentModel.PROP_DESCRIPTION, newDescription);
props.put(ContentModel.PROP_TITLE, newTitle);
authorityDAO.setAuthorityProperties(auth, props);
NodeRef nodeRef = pubAuthorityService.getAuthorityNodeRef(auth);
assertEquals(nodeService.getProperty(nodeRef, ContentModel.PROP_DESCRIPTION), newDescription);
assertEquals(nodeService.getProperty(nodeRef, ContentModel.PROP_TITLE), newTitle);
pubAuthorityService.deleteAuthority(auth);
}
public void testCreateOwnerAuth() public void testCreateOwnerAuth()
{ {
try try
@@ -1460,6 +1433,20 @@ public class AuthorityServiceTest extends TestCase
assertEquals(pubAuthorityService.getAuthorityDisplayName("Monkey"), "Monkey"); assertEquals(pubAuthorityService.getAuthorityDisplayName("Monkey"), "Monkey");
} }
public void testAuthorityDisplayNameAndDescription()
{
Map<QName, Serializable> props = new HashMap<>();
props.put(ContentModel.PROP_DESCRIPTION, "Test auth description");
String testAuth = pubAuthorityService.createAuthority(AuthorityType.GROUP, "Test auth", props);
Pair<String, String> displayNameAndDescription = pubAuthorityService.getAuthorityDisplayNameAndDescription(testAuth);
assertEquals(displayNameAndDescription.getFirst(), "Test auth");
assertEquals(displayNameAndDescription.getSecond(), "Test auth description");
pubAuthorityService.setAuthorityDisplayNameAndDescription(testAuth, "Modified auth", "Modified description");
displayNameAndDescription = pubAuthorityService.getAuthorityDisplayNameAndDescription(testAuth);
assertEquals(displayNameAndDescription.getFirst(), "Modified auth");
assertEquals(displayNameAndDescription.getSecond(), "Modified description");
}
public void testGetAuthoritiesFilteringSorting() public void testGetAuthoritiesFilteringSorting()
{ {
String TEST_RUN = System.currentTimeMillis()+"-"; String TEST_RUN = System.currentTimeMillis()+"-";