@Override
  public void chown(final Account u, final String group) throws XMLDBException {
    final XmldbURI collUri = collection.getPathURI();

    try {
      executeWithBroker(
          new BrokerOperation<Void>() {
            @Override
            public Void withBroker(final DBBroker broker)
                throws XMLDBException, LockException, PermissionDeniedException, IOException,
                    EXistException, TriggerException, SyntaxException {
              return modifyCollection(
                  broker,
                  collUri,
                  new DatabaseItemModifier<org.exist.collections.Collection, Void>() {
                    @Override
                    public Void modify(org.exist.collections.Collection collection)
                        throws PermissionDeniedException, SyntaxException, LockException {
                      final Permission permission = collection.getPermissions();
                      permission.setOwner(u);
                      permission.setGroup(group);
                      return null;
                    }
                  });
            }
          });
    } catch (final Exception e) {
      throw new XMLDBException(
          ErrorCodes.VENDOR_ERROR,
          "Failed to modify permission on Collection '" + collUri.toString() + "'",
          e);
    }
  }
  @Override
  public Permission[] listCollectionPermissions() throws XMLDBException {

    final XmldbURI collectionUri = collection.getPathURI();
    try {
      return executeWithBroker(
          new BrokerOperation<Permission[]>() {
            @Override
            public Permission[] withBroker(final DBBroker broker)
                throws XMLDBException, LockException, PermissionDeniedException, IOException,
                    EXistException, TriggerException, SyntaxException {
              return readCollection(
                  broker,
                  collectionUri,
                  new DatabaseItemReader<org.exist.collections.Collection, Permission[]>() {
                    @Override
                    public Permission[] read(org.exist.collections.Collection collection)
                        throws XMLDBException, PermissionDeniedException {
                      if (!collection.getPermissions().validate(user, Permission.READ)) {
                        return new Permission[0];
                      }

                      final Permission perms[] =
                          new Permission[collection.getChildCollectionCount(broker)];
                      final Iterator<XmldbURI> itChildCollectionUri =
                          collection.collectionIterator(broker);
                      int i = 0;
                      while (itChildCollectionUri.hasNext()) {
                        final XmldbURI childCollectionUri =
                            collectionUri.append(itChildCollectionUri.next());
                        Permission childPermission =
                            readCollection(
                                broker,
                                childCollectionUri,
                                new DatabaseItemReader<
                                    org.exist.collections.Collection, Permission>() {
                                  @Override
                                  public Permission read(
                                      org.exist.collections.Collection childCollection) {
                                    return childCollection.getPermissions();
                                  }
                                });
                        perms[i++] = childPermission;
                      }

                      return perms;
                    }
                  });
            }
          });
    } catch (final Exception e) {
      throw new XMLDBException(ErrorCodes.VENDOR_ERROR, e.getMessage(), e);
    }
  }