Example usage for io.vertx.core.eventbus Message body

List of usage examples for io.vertx.core.eventbus Message body

Introduction

In this page you can find the example usage for io.vertx.core.eventbus Message body.

Prototype

@CacheReturn
T body();

Source Link

Document

The body of the message.

Usage

From source file:org.entcore.workspace.service.WorkspaceService.java

License:Open Source License

private void sendNotify(final HttpServerRequest request, final String resource, final UserInfos user,
        final List<String> recipients, final boolean isFolder) {
    final JsonObject params = new JsonObject()
            .put("uri", "/userbook/annuaire#" + user.getUserId() + "#" + user.getType())
            .put("username", user.getUsername()).put("appPrefix", pathPrefix + "/workspace")
            .put("doc", "share");

    final JsonObject pushNotif = new JsonObject();
    final String i18nPushNotifBody;

    if (isFolder) {
        params.put("resourceUri", pathPrefix + "/workspace#/shared/folder/" + resource);
        pushNotif.put("title", "push.notif.folder.share");
        i18nPushNotifBody = user.getUsername() + " " + I18n.getInstance().translate("workspace.shared.folder",
                getHost(request), I18n.acceptLanguage(request)) + " : ";
    } else {/*from   www . j av a  2 s.  co m*/
        params.put("resourceUri", pathPrefix + "/document/" + resource);
        pushNotif.put("title", "push.notif.file.share");
        i18nPushNotifBody = user.getUsername() + " " + I18n.getInstance().translate("workspace.shared.document",
                getHost(request), I18n.acceptLanguage(request)) + " : ";
    }

    final String notificationName = WORKSPACE_NAME.toLowerCase() + "." + (isFolder ? "share-folder" : "share");

    mongo.findOne(DocumentDao.DOCUMENTS_COLLECTION, new JsonObject().put("_id", resource),
            new JsonObject().put("name", 1), new Handler<Message<JsonObject>>() {
                @Override
                public void handle(Message<JsonObject> event) {
                    if ("ok".equals(event.body().getString("status"))
                            && event.body().getJsonObject("result") != null) {
                        String resourceName = event.body().getJsonObject("result").getString("name", "");
                        params.put("resourceName", resourceName);
                        params.put("pushNotif", pushNotif.put("body", i18nPushNotifBody + resourceName));
                        notification.notifyTimeline(request, notificationName, user, recipients, resource,
                                params);
                    } else {
                        log.error(
                                "Unable to send timeline notification : missing name on resource " + resource);
                    }
                }
            });
}

From source file:org.entcore.workspace.service.WorkspaceService.java

License:Open Source License

private void add(final HttpServerRequest request, final String mongoCollection, final JsonObject doc,
        long allowedSize) {
    storage.writeUploadFile(request, allowedSize, new Handler<JsonObject>() {
        @Override//from   w  ww  . j  av  a  2s.co m
        public void handle(final JsonObject uploaded) {
            if ("ok".equals(uploaded.getString("status"))) {
                compressImage(uploaded, request.params().get("quality"), new Handler<Integer>() {
                    @Override
                    public void handle(Integer size) {
                        JsonObject meta = uploaded.getJsonObject("metadata");
                        if (size != null && meta != null) {
                            meta.put("size", size);
                        }
                        addAfterUpload(uploaded, doc, request.params().get("name"),
                                request.params().get("application"), request.params().getAll("thumbnail"),
                                mongoCollection, new Handler<Message<JsonObject>>() {
                                    @Override
                                    public void handle(Message<JsonObject> res) {
                                        if ("ok".equals(res.body().getString("status"))) {
                                            renderJson(request, res.body(), 201);
                                        } else {
                                            renderError(request, res.body());
                                        }
                                    }
                                });
                    }
                });
            } else {
                badRequest(request, uploaded.getString("message"));
            }
        }
    });
}

From source file:org.entcore.workspace.service.WorkspaceService.java

License:Open Source License

private void addAfterUpload(final JsonObject uploaded, final JsonObject doc, String name, String application,
        final List<String> thumbs, final String mongoCollection, final Handler<Message<JsonObject>> handler) {
    doc.put("name", getOrElse(name, uploaded.getJsonObject("metadata").getString("filename"), false));
    doc.put("metadata", uploaded.getJsonObject("metadata"));
    doc.put("file", uploaded.getString("_id"));
    doc.put("application", getOrElse(application, WORKSPACE_NAME)); // TODO check if application name is valid
    log.debug(doc.encodePrettily());//  w w w .  j ava 2  s  .co m
    mongo.save(mongoCollection, doc, new Handler<Message<JsonObject>>() {
        @Override
        public void handle(final Message<JsonObject> res) {
            if ("ok".equals(res.body().getString("status"))) {
                incrementStorage(doc);
                createRevision(res.body().getString("_id"), uploaded.getString("_id"), doc.getString("name"),
                        doc.getString("owner"), doc.getString("owner"), doc.getString("ownerName"),
                        doc.getJsonObject("metadata"));
                createThumbnailIfNeeded(mongoCollection, uploaded, res.body().getString("_id"), null, thumbs,
                        new Handler<Message<JsonObject>>() {
                            @Override
                            public void handle(Message<JsonObject> event) {
                                if (handler != null) {
                                    handler.handle(res);
                                }
                            }
                        });
            } else if (handler != null) {
                handler.handle(res);
            }
        }
    });
}

From source file:org.entcore.workspace.service.WorkspaceService.java

License:Open Source License

private void createThumbnails(List<String> thumbs, JsonObject srcFile, final String collection,
        final String documentId, final Handler<Message<JsonObject>> callback) {
    Pattern size = Pattern.compile("([0-9]+)x([0-9]+)");
    JsonArray outputs = new fr.wseduc.webutils.collections.JsonArray();
    for (String thumb : thumbs) {
        Matcher m = size.matcher(thumb);
        if (m.matches()) {
            try {
                int width = Integer.parseInt(m.group(1));
                int height = Integer.parseInt(m.group(2));
                if (width == 0 && height == 0)
                    continue;
                JsonObject j = new JsonObject().put("dest",
                        storage.getProtocol() + "://" + storage.getBucket());
                if (width != 0) {
                    j.put("width", width);
                }/*from  w  w w .  ja va  2  s  .  c o  m*/
                if (height != 0) {
                    j.put("height", height);
                }
                outputs.add(j);
            } catch (NumberFormatException e) {
                log.error("Invalid thumbnail size.", e);
            }
        }
    }
    if (outputs.size() > 0) {
        JsonObject json = new JsonObject().put("action", "resizeMultiple")
                .put("src",
                        storage.getProtocol() + "://" + storage.getBucket() + ":" + srcFile.getString("_id"))
                .put("destinations", outputs);
        eb.send(imageResizerAddress, json, handlerToAsyncHandler(new Handler<Message<JsonObject>>() {
            @Override
            public void handle(Message<JsonObject> event) {
                JsonObject thumbnails = event.body().getJsonObject("outputs");
                if ("ok".equals(event.body().getString("status")) && thumbnails != null) {
                    mongo.update(collection, new JsonObject().put("_id", documentId),
                            new JsonObject().put("$set", new JsonObject().put("thumbnails", thumbnails)),
                            callback);
                }
            }
        }));
    } else if (callback != null) {
        callback.handle(null);
    }
}

From source file:org.entcore.workspace.service.WorkspaceService.java

License:Open Source License

private void compressImage(JsonObject srcFile, String quality, final Handler<Integer> handler) {
    if (!isImage(srcFile)) {
        handler.handle(null);//from   w w  w  .  j ava  2s.c  o  m
        return;
    }
    float q;
    if (quality != null) {
        try {
            q = Float.parseFloat(quality);
        } catch (NumberFormatException e) {
            log.warn(e.getMessage(), e);
            q = 0.8f;
        }
    } else {
        q = 0.8f;
    }
    JsonObject json = new JsonObject().put("action", "compress").put("quality", q)
            .put("src", storage.getProtocol() + "://" + storage.getBucket() + ":" + srcFile.getString("_id"))
            .put("dest", storage.getProtocol() + "://" + storage.getBucket() + ":" + srcFile.getString("_id"));
    eb.send(imageResizerAddress, json, handlerToAsyncHandler(new Handler<Message<JsonObject>>() {
        @Override
        public void handle(Message<JsonObject> event) {
            Integer size = event.body().getInteger("size");
            handler.handle(size);
        }
    }));
}

From source file:org.entcore.workspace.service.WorkspaceService.java

License:Open Source License

@Put("/document/:id")
@SecuredAction(value = "workspace.contrib", type = ActionType.RESOURCE)
public void updateDocument(final HttpServerRequest request) {
    final String documentId = request.params().get("id");

    UserUtils.getUserInfos(eb, request, new Handler<UserInfos>() {
        @Override//w w  w .j av  a  2s.  c o m
        public void handle(final UserInfos user) {
            if (user != null) {
                request.pause();
                documentDao.findById(documentId, new Handler<JsonObject>() {
                    public void handle(JsonObject event) {
                        if (!"ok".equals(event.getString("status"))) {
                            notFound(request);
                            return;
                        }

                        final String userId = event.getJsonObject("result").getString("owner");

                        emptySize(userId, new Handler<Long>() {
                            @Override
                            public void handle(Long emptySize) {
                                request.resume();
                                storage.writeUploadFile(request, emptySize, new Handler<JsonObject>() {
                                    @Override
                                    public void handle(final JsonObject uploaded) {
                                        if ("ok".equals(uploaded.getString("status"))) {
                                            compressImage(uploaded, request.params().get("quality"),
                                                    new Handler<Integer>() {
                                                        @Override
                                                        public void handle(Integer size) {
                                                            JsonObject meta = uploaded
                                                                    .getJsonObject("metadata");
                                                            if (size != null && meta != null) {
                                                                meta.put("size", size);
                                                            }
                                                            updateAfterUpload(documentId,
                                                                    request.params().get("name"), uploaded,
                                                                    request.params().getAll("thumbnail"), user,
                                                                    new Handler<Message<JsonObject>>() {
                                                                        @Override
                                                                        public void handle(
                                                                                Message<JsonObject> res) {
                                                                            if (res == null) {
                                                                                request.response()
                                                                                        .setStatusCode(404)
                                                                                        .end();
                                                                            } else if ("ok".equals(res.body()
                                                                                    .getString("status"))) {
                                                                                renderJson(request, res.body());
                                                                            } else {
                                                                                renderError(request,
                                                                                        res.body());
                                                                            }
                                                                        }
                                                                    });
                                                        }
                                                    });
                                        } else {
                                            badRequest(request, uploaded.getString("message"));
                                        }
                                    }
                                });
                            }
                        });
                    }
                });
            }
        }
    });
}

From source file:org.entcore.workspace.service.WorkspaceService.java

License:Open Source License

private void updateAfterUpload(final String id, final String name, final JsonObject uploaded,
        final List<String> t, final UserInfos user, final Handler<Message<JsonObject>> handler) {
    documentDao.findById(id, new Handler<JsonObject>() {
        @Override//from   w w w.  j  ava 2s .c  om
        public void handle(final JsonObject old) {
            if ("ok".equals(old.getString("status"))) {
                final JsonObject metadata = uploaded.getJsonObject("metadata");
                JsonObject set = new JsonObject();
                final JsonObject doc = new JsonObject();
                doc.put("name", getOrElse(name, metadata.getString("filename")));
                final String now = MongoDb.formatDate(new Date());
                doc.put("modified", now);
                doc.put("metadata", metadata);
                doc.put("file", uploaded.getString("_id"));
                final JsonObject thumbs = old.getJsonObject("result", new JsonObject())
                        .getJsonObject("thumbnails");

                String query = "{ \"_id\": \"" + id + "\"}";
                set.put("$set", doc).put("$unset", new JsonObject().put("thumbnails", ""));
                mongo.update(DocumentDao.DOCUMENTS_COLLECTION, new JsonObject(query), set,
                        new Handler<Message<JsonObject>>() {
                            @Override
                            public void handle(final Message<JsonObject> res) {
                                String status = res.body().getString("status");
                                JsonObject result = old.getJsonObject("result");
                                if ("ok".equals(status) && result != null) {
                                    String userId = user != null ? user.getUserId() : result.getString("owner");
                                    String userName = user != null ? user.getUsername()
                                            : result.getString("ownerName");
                                    doc.put("owner", result.getString("owner"));
                                    incrementStorage(doc);
                                    createRevision(id, doc.getString("file"), doc.getString("name"),
                                            result.getString("owner"), userId, userName, metadata);
                                    createThumbnailIfNeeded(DocumentDao.DOCUMENTS_COLLECTION, uploaded, id,
                                            thumbs, t, new Handler<Message<JsonObject>>() {
                                                @Override
                                                public void handle(Message<JsonObject> event) {
                                                    if (handler != null) {
                                                        handler.handle(res);
                                                    }
                                                }
                                            });

                                } else if (handler != null) {
                                    handler.handle(res);
                                }
                            }
                        });
            } else if (handler != null) {
                handler.handle(null);
            }
        }
    });
}

From source file:org.entcore.workspace.service.WorkspaceService.java

License:Open Source License

private void copyFiles(final HttpServerRequest request, final String collection, final String owner,
        final UserInfos user) {
    String ids = request.params().get("ids"); // TODO refactor with json in request body
    String folder2 = getOrElse(request.params().get("folder"), "");
    try {/*w  w w  .ja v  a 2 s . c  o m*/
        folder2 = URLDecoder.decode(folder2, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        log.warn(e.getMessage(), e);
    }
    final String folder = folder2;
    if (ids != null && !ids.trim().isEmpty()) {
        JsonArray idsArray = new fr.wseduc.webutils.collections.JsonArray(Arrays.asList(ids.split(",")));
        String criteria = "{ \"_id\" : { \"$in\" : " + idsArray.encode() + "}";
        if (owner != null) {
            criteria += ", \"to\" : \"" + owner + "\"";
        }
        criteria += "}";
        mongo.find(collection, new JsonObject(criteria), new Handler<Message<JsonObject>>() {
            @Override
            public void handle(Message<JsonObject> r) {
                JsonObject src = r.body();
                if ("ok".equals(src.getString("status")) && src.getJsonArray("results") != null) {
                    final JsonArray origs = src.getJsonArray("results");
                    final JsonArray insert = new fr.wseduc.webutils.collections.JsonArray();
                    final AtomicInteger number = new AtomicInteger(origs.size());
                    emptySize(user, new Handler<Long>() {
                        @Override
                        public void handle(Long emptySize) {
                            long size = 0;
                            for (Object o : origs) {
                                if (!(o instanceof JsonObject))
                                    continue;
                                JsonObject metadata = ((JsonObject) o).getJsonObject("metadata");
                                if (metadata != null) {
                                    size += metadata.getLong("size", 0l);
                                }
                            }
                            if (size > emptySize) {
                                badRequest(request, "files.too.large");
                                return;
                            }
                            for (Object o : origs) {
                                JsonObject orig = (JsonObject) o;
                                final JsonObject dest = orig.copy();
                                String now = MongoDb.formatDate(new Date());
                                dest.remove("_id");
                                dest.remove("protected");
                                dest.remove("comments");
                                dest.put("application", WORKSPACE_NAME);
                                if (owner != null) {
                                    dest.put("owner", owner);
                                    dest.put("ownerName", dest.getString("toName"));
                                    dest.remove("to");
                                    dest.remove("from");
                                    dest.remove("toName");
                                    dest.remove("fromName");
                                } else if (user != null) {
                                    dest.put("owner", user.getUserId());
                                    dest.put("ownerName", user.getUsername());
                                    dest.put("shared", new fr.wseduc.webutils.collections.JsonArray());
                                }
                                dest.put("_id", UUID.randomUUID().toString());
                                dest.put("created", now);
                                dest.put("modified", now);
                                if (folder != null && !folder.trim().isEmpty()) {
                                    dest.put("folder", folder);
                                } else {
                                    dest.remove("folder");
                                }
                                insert.add(dest);
                                final String filePath = orig.getString("file");

                                if ((owner != null || user != null) && folder != null
                                        && !folder.trim().isEmpty()) {

                                    //If the document has a new parent folder, replicate sharing rights
                                    String parentName, parentFolder;
                                    if (folder.lastIndexOf('_') < 0) {
                                        parentName = folder;
                                        parentFolder = folder;
                                    } else if (filePath != null) {
                                        String[] splittedPath = folder.split("_");
                                        parentName = splittedPath[splittedPath.length - 1];
                                        parentFolder = folder;
                                    } else {
                                        String[] splittedPath = folder.split("_");
                                        parentName = splittedPath[splittedPath.length - 2];
                                        parentFolder = folder.substring(0, folder.lastIndexOf("_"));
                                    }

                                    folderService.getParentRights(parentName, parentFolder, owner,
                                            new Handler<Either<String, JsonArray>>() {
                                                public void handle(Either<String, JsonArray> event) {
                                                    final JsonArray parentSharedRights = event.right() == null
                                                            || event.isLeft() ? null : event.right().getValue();

                                                    if (parentSharedRights != null
                                                            && parentSharedRights.size() > 0)
                                                        dest.put("shared", parentSharedRights);
                                                    if (filePath != null) {
                                                        storage.copyFile(filePath, new Handler<JsonObject>() {
                                                            @Override
                                                            public void handle(JsonObject event) {
                                                                if (event != null && "ok"
                                                                        .equals(event.getString("status"))) {
                                                                    dest.put("file", event.getString("_id"));
                                                                    persist(insert, number.decrementAndGet());
                                                                }
                                                            }
                                                        });
                                                    } else {
                                                        persist(insert, number.decrementAndGet());
                                                    }
                                                }
                                            });
                                } else if (filePath != null) {
                                    storage.copyFile(filePath, new Handler<JsonObject>() {

                                        @Override
                                        public void handle(JsonObject event) {
                                            if (event != null && "ok".equals(event.getString("status"))) {
                                                dest.put("file", event.getString("_id"));
                                                persist(insert, number.decrementAndGet());
                                            }
                                        }
                                    });
                                } else {
                                    persist(insert, number.decrementAndGet());
                                }
                            }
                        }
                    });
                } else {
                    renderJson(request, src, 404);
                }
            }

            private void persist(final JsonArray insert, int remains) {
                if (remains == 0) {
                    mongo.insert(DocumentDao.DOCUMENTS_COLLECTION, insert, new Handler<Message<JsonObject>>() {
                        @Override
                        public void handle(Message<JsonObject> inserted) {
                            if ("ok".equals(inserted.body().getString("status"))) {
                                incrementStorage(insert);
                                for (Object obj : insert) {
                                    JsonObject json = (JsonObject) obj;
                                    createRevision(json.getString("_id"), json.getString("file"),
                                            json.getString("name"), json.getString("owner"),
                                            json.getString("owner"), json.getString("ownerName"),
                                            json.getJsonObject("metadata"));
                                }
                                renderJson(request, inserted.body());
                            } else {
                                renderError(request, inserted.body());
                            }
                        }
                    });
                }
            }

        });
    } else {
        badRequest(request);
    }
}

From source file:org.entcore.workspace.service.WorkspaceService.java

License:Open Source License

@Get("/folders")
@SecuredAction("workspace.document.list.folders")
public void listFolders(final HttpServerRequest request) {
    UserUtils.getUserInfos(eb, request, new Handler<UserInfos>() {

        @Override/*from   ww  w .  j a va 2 s . c o  m*/
        public void handle(UserInfos user) {
            if (user != null && user.getUserId() != null) {
                final String hierarchical = request.params().get("hierarchical");
                String relativePath2;
                try {
                    relativePath2 = URLDecoder.decode(request.params().get("folder"), "UTF-8");
                } catch (UnsupportedEncodingException | NullPointerException e) {
                    relativePath2 = request.params().get("folder");
                }
                final String relativePath = relativePath2;
                String filter = request.params().get("filter");
                String query = "{ ";
                if ("owner".equals(filter)) {
                    query += "\"owner\": \"" + user.getUserId() + "\"";
                } else if ("shared".equals(filter)) {
                    query += "\"shared\" : { \"$elemMatch\" : " + orSharedElementMatch(user) + "}";
                } else {
                    query += "\"$or\" : [{ \"owner\": \"" + user.getUserId()
                            + "\"}, {\"shared\" : { \"$elemMatch\" : " + orSharedElementMatch(user) + "}}]";
                }
                if (relativePath != null) {
                    query += ", \"folder\" : { \"$regex\" : \"^" + relativePath + "(_|$)\" }}";
                } else {
                    query += "}";
                }
                mongo.distinct(DocumentDao.DOCUMENTS_COLLECTION, "folder", new JsonObject(query),
                        new Handler<Message<JsonObject>>() {
                            @Override
                            public void handle(Message<JsonObject> res) {
                                if ("ok".equals(res.body().getString("status"))) {
                                    JsonArray values = res.body().getJsonArray("values",
                                            new fr.wseduc.webutils.collections.JsonArray("[]"));
                                    JsonArray out = values;
                                    if (hierarchical != null) {
                                        Set<String> folders = new HashSet<String>();
                                        for (Object value : values) {
                                            String v = (String) value;
                                            if (relativePath != null) {
                                                if (v != null && v.contains("_")
                                                        && v.indexOf("_", relativePath.length() + 1) != -1
                                                        && v.substring(
                                                                v.indexOf("_", relativePath.length() + 1))
                                                                .contains("_")) {
                                                    folders.add(v.substring(0,
                                                            v.indexOf("_", relativePath.length() + 1)));
                                                } else {
                                                    folders.add(v);
                                                }
                                            } else {
                                                if (v != null && v.contains("_")) {
                                                    folders.add(v.substring(0, v.indexOf("_")));
                                                } else {
                                                    folders.add(v);
                                                }
                                            }
                                        }
                                        out = new fr.wseduc.webutils.collections.JsonArray(
                                                new ArrayList<>(folders));
                                    }
                                    renderJson(request, out);
                                } else {
                                    renderJson(request, new fr.wseduc.webutils.collections.JsonArray());
                                }
                            }
                        });
            } else {
                unauthorized(request);
            }
        }
    });
}

From source file:org.entcore.workspace.service.WorkspaceService.java

License:Open Source License

private void notifyComment(final HttpServerRequest request, final String id, final UserInfos user,
        final boolean isFolder) {
    final JsonObject params = new JsonObject()
            .put("userUri", "/userbook/annuaire#" + user.getUserId() + "#" + user.getType())
            .put("userName", user.getUsername()).put("appPrefix", pathPrefix + "/workspace");

    final String notifyName = WORKSPACE_NAME.toLowerCase() + "." + (isFolder ? "comment-folder" : "comment");

    //Retrieve the document from DB
    mongo.findOne(DocumentDao.DOCUMENTS_COLLECTION, new JsonObject().put("_id", id),
            new Handler<Message<JsonObject>>() {
                @Override//from  w  w w . j  av a  2  s .  com
                public void handle(Message<JsonObject> event) {
                    if ("ok".equals(event.body().getString("status"))
                            && event.body().getJsonObject("result") != null) {
                        final JsonObject document = event.body().getJsonObject("result");
                        params.put("resourceName", document.getString("name", ""));

                        //Handle the parent folder id (null if document is at root level)
                        final Handler<String> folderIdHandler = new Handler<String>() {
                            public void handle(final String folderId) {

                                //Send the notification to the shared network
                                Handler<List<String>> shareNotificationHandler = new Handler<List<String>>() {
                                    public void handle(List<String> recipients) {
                                        JsonObject sharedNotifParams = params.copy();

                                        if (folderId != null) {
                                            sharedNotifParams.put("resourceUri",
                                                    pathPrefix + "/workspace#/shared/folder/" + folderId);
                                        } else {
                                            sharedNotifParams.put("resourceUri",
                                                    pathPrefix + "/workspace#/shared");
                                        }

                                        // don't send comment with share uri at owner
                                        final String o = document.getString("owner");
                                        if (o != null && recipients.contains(o)) {
                                            recipients.remove(o);
                                        }
                                        notification.notifyTimeline(request, notifyName, user, recipients, id,
                                                sharedNotifParams);
                                    }
                                };

                                //'Flatten' the share users & group into a user id list (excluding the current user)
                                flattenShareIds(
                                        document.getJsonArray("shared",
                                                new fr.wseduc.webutils.collections.JsonArray()),
                                        user, shareNotificationHandler);

                                //If the user commenting is not the owner, send a notification to the owner
                                if (!document.getString("owner").equals(user.getUserId())) {
                                    JsonObject ownerNotif = params.copy();
                                    ArrayList<String> ownerList = new ArrayList<>();
                                    ownerList.add(document.getString("owner"));

                                    if (folderId != null) {
                                        ownerNotif.put("resourceUri",
                                                pathPrefix + "/workspace#/folder/" + folderId);
                                    } else {
                                        ownerNotif.put("resourceUri", pathPrefix + "/workspace");
                                    }
                                    notification.notifyTimeline(request, notifyName, user, ownerList, id, null,
                                            ownerNotif, true);
                                }

                            }
                        };

                        //Handle the parent folder result from DB
                        Handler<Message<JsonObject>> folderHandler = new Handler<Message<JsonObject>>() {
                            public void handle(Message<JsonObject> event) {
                                if (!"ok".equals(event.body().getString("status"))
                                        || event.body().getJsonObject("result") == null) {
                                    log.error(
                                            "Unable to send timeline notification : invalid parent folder on resource "
                                                    + id);
                                    return;
                                }

                                final JsonObject folder = event.body().getJsonObject("result");
                                final String folderId = folder.getString("_id");

                                folderIdHandler.handle(folderId);
                            }
                        };

                        //If the document does not have a parent folder
                        if (!isFolder && !document.containsKey("folder") || isFolder
                                && document.getString("folder").equals(document.getString("name"))) {
                            folderIdHandler.handle(null);
                        } else {
                            //If the document has a parent folder
                            String parentFolderPath = document.getString("folder");
                            if (isFolder) {
                                parentFolderPath = parentFolderPath.substring(0,
                                        parentFolderPath.lastIndexOf("_"));
                            }

                            QueryBuilder query = QueryBuilder.start("folder").is(parentFolderPath).and("file")
                                    .exists(false).and("owner").is(document.getString("owner"));

                            //Retrieve the parent folder from DB
                            mongo.findOne(DocumentDao.DOCUMENTS_COLLECTION, MongoQueryBuilder.build(query),
                                    folderHandler);
                        }

                    } else {
                        log.error("Unable to send timeline notification : missing name on resource " + id);
                    }
                }
            });
}