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); } }