我在更新Google文档的Acl时遇到问题。 我想与某些用户共享该文档,但只允许COMMENTER权限。 这是代码: AclEntry newAclEntry = getDservice()。insert(new URL(aclFeedUrl),new AclScope(AclScope.Type.USER,“user1@domain.com”),AclRole.COMMENTER);
现在Eclipse告诉我AclRole.COMMENTER是一个有效的类型,但是当我运行代码时,我得到以下异常: 服务异常:已过帐条目的字段值无效:角色
如果我将其更改为AclRole.READER,它可以正常工作。
所以我想我会做一些调查。您可以通过“分享”从Google文档设置COMMENTER访问权限。所以我这样做,然后通过以下方式读取文档的ACL:
AclFeed feed = getDservice().getFeed(new URL(doc.getAclFeedLink().getHref()),AclFeed.class);
if (feed == null)
System.out.println("Feed is null");
else {
for (AclEntry a: feed.getEntries()) {
System.out.println("acl role:" + a.getRole().getValue());
System.out.println("acl scope:" + a.getScope().getValue());
}
}
if (feed == null)
System.out.println("Feed is null");
else {
for (AclEntry a: feed.getEntries()) {
System.out.println("acl role:" + a.getRole().getValue());
System.out.println("acl scope:" + a.getScope().getValue());
}
}
具有COMMENTER访问权限的user1和具有READER访问权限的user2的输出为:
acl角色:读者 acl范围:user1@domain.com
acl角色:读者 acl范围:user2@domain.com
因此,即使user1明确是一个COMMENTER,它也会被报告为“读者”
如果我访问AclRole的在线文档,则没有COMMENTER枚举(https://developers.google.com/gdata/javadoc/com/google/gdata/data/acl/AclRole)。
那么,如何为仅注释权限设置ACL?显然,Google Docs支持它,Eclipse正在从我正在使用的GData jar中提取它。
我错过了什么?
答案 0 :(得分:1)
这里缺少的是检查ACL条目的additionalRole
字段。用户是读者和评论者。从Documents List API中查看此原始XML响应:
<entry gd:etag='W/"D0UFQH4_eCt7ImAe9WhJREEk."'>
<id>https://docs.google.com/feeds/id/user%3Aa%40b.com</id>
<updated>2012-07-11T22:20:11.040Z</updated>
<app:edited xmlns:app='http://www.w3.org/2007/app'>2012-07-11T22:20:11.040Z</app:edited>
<category scheme='http://schemas.google.com/g/2005#kind' term='http://schemas.google.com/acl/2007#accessRule'/>
<title>Document Permission - a@b.com</title>
<link rel='self' type='application/atom+xml' href='https://docs.google.com/feeds/default/private/expandAcl/document%3A1lD_aQPqe33JI4mObm2zc7FADUH-ypXcGekwAovPY2OpMw/acl/user%3Aa%40b.com'/>
<link rel='edit' type='application/atom+xml' href='https://docs.google.com/feeds/default/private/expandAcl/document%3A1lD_aQPqe33JI4mObm2zc7FADUH-ypXcGekwAovPY2OpMw/acl/user%3Aa%40b.com'/>
<gAcl:role xmlns:gAcl='http://schemas.google.com/acl/2007' value='reader'/>
<gAcl:scope xmlns:gAcl='http://schemas.google.com/acl/2007' type='user' value='a@b.com' name='Anderson Jones'/>
<gAcl:additionalRole xmlns:gAcl='http://schemas.google.com/acl/2007' value='commenter'/>
</entry>
请注意gAcl:additionalRole
的值为commenter
。
尝试使用此代码创建一个评论者条目:
AclEntry aclEntry = new AclEntry();
aclEntry.setScope(new AclScope("user", "user1@domain.com"));
aclEntry.setRole(AclRole.READER);
aclEntry.addAdditionalRole(AdditionalRole.COMMENTER);
要确定某个条目是否包含commenter
additionalRole
,请执行以下操作:
if (aclEntry.getAdditionalRoles().contains(AdditionalRole.COMMENTER)) {
// Do something knowing this user is a commenter
}
但是,您确实应该升级到Drive API v2,这样可以更轻松。以下代码示例适用于Drive API:
Permission permission = new Permission();
permission.setType("user");
permission.setValue("user1@domain.com");
permission.setRole("reader");
permission.setAdditionalRoles(Arrays.asList("commenter"));
感谢Alain Vongsouvanh提供了部分答案!