protected GridFSDirectoryResource newChildDir(GridFSResourcePath path, GridFSDBObject item) {
   return new GridFSDirectoryResource(
       requestContext(),
       getChildParent(),
       item.getId().toString(),
       path.append(item.getString("filename")),
       item);
 }
  @Override
  public Resource member(RequestContext ctx, String id) {

    GridFSResourcePath childPath = path().append(id);

    if (childPath.equals(ctx.resourcePath())) {

      // there are no more intermediary segments - this is the last parent,
      // here we lookup / generate the target GridFS file

      LinkedList<ResourcePath.Segment> segments = new LinkedList(ctx.resourcePath().segments());
      // skip app
      segments.removeFirst();
      // skip gridfsroot
      segments.removeFirst();
      // init meta
      boolean meta = segments.getLast().matrixParameters().containsKey("meta");

      DBCollection col = getUserspace().getFilesCollection();

      DBObject result = null;
      GridFSDBObject last = null;
      int count = 0;
      for (ResourcePath.Segment segment : segments) {
        count++;

        // first segment represents root - root file has empty string for a name, and null parent
        String name = count == 1 ? "" : segment.name();
        ObjectId parentId = count == 1 ? null : last.getId();

        result = col.findOne(new BasicDBObject("filename", name).append("parent", parentId));
        if (result == null) {
          if (ctx.requestType() == RequestType.UPDATE) {
            // create fileInfo for current segment
            BasicDBObject fileInfo =
                new BasicDBObject("filename", name)
                    .append("owner", ctx.securityContext().getSubject());
            if (last != null) {
              fileInfo.append("parent", last.getId());
            }

            // insert for directories but not for files
            // files get inserted via GridFS API in GridFSBlobResource
            if (count < segments.size()) {
              fileInfo.append("dir", true);
              // autocreate missing parent directories when putting a blob
              col.insert(fileInfo);
            }
            result = fileInfo;
          } else {
            return null;
          }
        }
        last = new GridFSDBObject(result);
      }

      // finally we got to the fileInfo representing the target resource
      if (last.isTrue("dir")) {
        // if target resource represents a directory
        return newChildDir(path(), last);
      } else {
        // if file
        if (meta) {
          // if last segment has matrix parameter 'meta' return meta info instead of blob content
          return newChildItem(last);
        } else {
          // if no ;meta, then return a blob
          return new GridFSBlobResource(ctx, this, id, last, childPath);
        }
      }
    } else if (childPath.segments().size() == ctx.resourcePath().segments().size()) {
      return null;
    } else {
      // pass-through segment
      return new GridFSDirectoryResource(ctx, this, id, childPath);
    }
  }