AclRole for Commenter

时间:2012-07-11 14:26:04

标签: google-docs-api google-drive-api

我在更新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中提取它。

我错过了什么?

1 个答案:

答案 0 :(得分:1)

这里缺少的是检查ACL条目的additionalRole字段。用户是读者评论者。从Documents List API中查看此原始XML响应:

<entry gd:etag='W/&quot;D0UFQH4_eCt7ImAe9WhJREEk.&quot;'>
  <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提供了部分答案!