List of usage examples for io.vertx.core.json JsonArray size
public int size()
From source file:org.entcore.workspace.service.impl.DefaultFolderService.java
License:Open Source License
@Override public void copy(final String id, final String n, final String p, final UserInfos owner, final long emptySize, final Handler<Either<String, JsonArray>> result) { if (owner == null) { result.handle(new Either.Left<String, JsonArray>("workspace.invalid.user")); return;/*from w w w . ja v a 2 s . c o m*/ } if (id == null || id.trim().isEmpty()) { result.handle(new Either.Left<String, JsonArray>("workspace.folder.not.found")); return; } final String path = getOrElse(p, ""); //If the folder has a parent folder, replicate sharing rights String[] splittedPath = path.split("_"); String parentName = splittedPath[splittedPath.length - 1]; String parentFolder = path; 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(); QueryBuilder query = QueryBuilder.start("_id").is(id).put("owner").is(owner.getUserId()); JsonObject keys = new JsonObject().put("folder", 1).put("name", 1); mongo.findOne(DOCUMENTS_COLLECTION, MongoQueryBuilder.build(query), keys, new Handler<Message<JsonObject>>() { @Override public void handle(Message<JsonObject> event) { final String folder = event.body().getJsonObject("result", new JsonObject()) .getString("folder"); final String n1 = event.body().getJsonObject("result", new JsonObject()) .getString("name"); if ("ok".equals(event.body().getString("status")) && folder != null && !folder.trim().isEmpty() && n1 != null && !n1.trim().isEmpty()) { final String folderAttr = "folder"; QueryBuilder q = QueryBuilder.start("owner").is(owner.getUserId()) .put(folderAttr) .regex(Pattern.compile("^" + Pattern.quote(folder) + "($|_)")); mongo.find(DOCUMENTS_COLLECTION, MongoQueryBuilder.build(q), new Handler<Message<JsonObject>>() { @Override public void handle(Message<JsonObject> src) { final JsonArray origs = src.body().getJsonArray("results", new fr.wseduc.webutils.collections.JsonArray()); if ("ok".equals(src.body().getString("status")) && origs.size() > 0) { 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) { result.handle(new Either.Left<String, JsonArray>( "files.too.large")); return; } final AtomicInteger number = new AtomicInteger( origs.size()); final JsonArray insert = new fr.wseduc.webutils.collections.JsonArray(); String name = (n != null && !n.trim().isEmpty()) ? n : n1; final String destFolderName = (path != null && !path.trim().isEmpty()) ? path + "_" + name : name; QueryBuilder alreadyExist = QueryBuilder.start("owner") .is(owner.getUserId()).put("folder") .is(destFolderName); mongo.count(DOCUMENTS_COLLECTION, MongoQueryBuilder.build(alreadyExist), new Handler<Message<JsonObject>>() { @Override public void handle(Message<JsonObject> event) { String destFolder; if ("ok".equals( event.body().getString("status")) && event.body() .getInteger("count") == 0) { destFolder = destFolderName; } else { destFolder = destFolderName + "-" + format.format(new Date()); } for (Object o : origs) { if (!(o instanceof JsonObject)) continue; JsonObject orig = (JsonObject) o; final JsonObject dest = orig.copy(); String now = MongoDb .formatDate(new Date()); dest.remove("_id"); dest.put("created", now); dest.put("modified", now); dest.put("folder", dest .getString("folder", "") .replaceFirst( "^" + Pattern .quote(folder), Matcher.quoteReplacement( destFolder))); dest.put("shared", parentSharedRights); insert.add(dest); String filePath = orig .getString("file"); 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 { result.handle(new Either.Left<String, JsonArray>( "workspace.folder.not.found")); } } private void persist(final JsonArray insert, int remains) { if (remains == 0) { mongo.insert(DOCUMENTS_COLLECTION, insert, new Handler<Message<JsonObject>>() { @Override public void handle( Message<JsonObject> inserted) { if ("ok".equals(inserted.body() .getString("status"))) { result.handle( new Either.Right<String, JsonArray>( insert)); } else { result.handle( new Either.Left<String, JsonArray>( inserted.body() .getString( "message"))); } } }); } } }); } else { result.handle(new Either.Left<String, JsonArray>("workspace.folder.not.found")); } } }); } }); }
From source file:org.entcore.workspace.service.impl.DefaultFolderService.java
License:Open Source License
@Override public void delete(String id, final UserInfos owner, final Handler<Either<String, JsonArray>> result) { if (owner == null) { result.handle(new Either.Left<String, JsonArray>("workspace.invalid.user")); return;//from ww w.jav a2 s .co m } if (id == null || id.trim().isEmpty()) { result.handle(new Either.Left<String, JsonArray>("workspace.folder.not.found")); return; } QueryBuilder query = QueryBuilder.start("_id").is(id).put("owner").is(owner.getUserId()); JsonObject keys = new JsonObject().put("folder", 1); mongo.findOne(DOCUMENTS_COLLECTION, MongoQueryBuilder.build(query), keys, new Handler<Message<JsonObject>>() { @Override public void handle(Message<JsonObject> event) { String folder = event.body().getJsonObject("result", new JsonObject()).getString("folder"); if ("ok".equals(event.body().getString("status")) && folder != null && !folder.trim().isEmpty()) { QueryBuilder q = QueryBuilder.start("owner").is(owner.getUserId()).put("folder") .regex(Pattern.compile("^" + Pattern.quote(folder) + "($|_)")); JsonObject keys = new JsonObject().put("metadata", 1).put("owner", 1).put("name", 1) .put("file", 1); final JsonObject query = MongoQueryBuilder.build(q); mongo.find(DOCUMENTS_COLLECTION, query, null, keys, new Handler<Message<JsonObject>>() { @Override public void handle(Message<JsonObject> message) { final JsonArray results = message.body().getJsonArray("results"); if ("ok".equals(message.body().getString("status")) && results != null) { mongo.delete(DOCUMENTS_COLLECTION, query, new Handler<Message<JsonObject>>() { @Override public void handle(Message<JsonObject> res) { if ("ok".equals(res.body().getString("status"))) { result.handle( new Either.Right<String, JsonArray>(results)); final JsonArray filesIds = new fr.wseduc.webutils.collections.JsonArray(); for (Object o : results) { if (!(o instanceof JsonObject)) continue; String file = ((JsonObject) o).getString("file"); if (file != null && !file.trim().isEmpty()) { filesIds.add(file); } } if (filesIds.size() > 0) { storage.removeFiles(filesIds, new Handler<JsonObject>() { @Override public void handle( JsonObject jsonObject) { if (!"ok".equals(jsonObject .getString("status"))) { log.error( "Error deleting gridfs files : " + filesIds .encode()); log.error(jsonObject .getString("message")); } } }); } } else { result.handle(new Either.Left<String, JsonArray>( res.body().getString("message"))); } } }); } else { result.handle(new Either.Left<String, JsonArray>( message.body().getString("message"))); } } }); } else { result.handle(new Either.Left<String, JsonArray>("workspace.folder.not.found")); } } }); }
From source file:org.entcore.workspace.service.impl.DefaultFolderService.java
License:Open Source License
private void shareFolderAction(final String id, final UserInfos owner, final List<String> actions, final String groupId, final String userId, final ShareService shareService, final boolean remove, final JsonObject share, final Handler<Either<String, JsonObject>> result) { if (owner == null) { result.handle(new Either.Left<String, JsonObject>("workspace.invalid.user")); return;// w w w. ja v a2 s . c o m } if (id == null || id.trim().isEmpty()) { result.handle(new Either.Left<String, JsonObject>("workspace.folder.not.found")); return; } String sharedMethod = "org-entcore-workspace-service-WorkspaceService|shareJsonSubmit"; List<DBObject> groups = new ArrayList<>(); groups.add(QueryBuilder.start("userId").is(owner.getUserId()).put(sharedMethod).is(true).get()); for (String gpId : owner.getGroupsIds()) { groups.add(QueryBuilder.start("groupId").is(gpId).put(sharedMethod).is(true).get()); } final DBObject managerCheck = QueryBuilder.start("shared") .elemMatch(new QueryBuilder().or(groups.toArray(new DBObject[groups.size()])).get()).get(); QueryBuilder query = QueryBuilder.start("_id").is(id).put("file").exists(false) .or(QueryBuilder.start("owner").is(owner.getUserId()).get(), managerCheck); JsonObject keys = new JsonObject().put("folder", 1).put("name", 1); Handler<Message<JsonObject>> folderHandler = new Handler<Message<JsonObject>>() { @Override public void handle(Message<JsonObject> event) { final String folder = event.body().getJsonObject("result", new JsonObject()).getString("folder"); QueryBuilder q = QueryBuilder.start() .or(QueryBuilder.start("owner").is(owner.getUserId()).get(), managerCheck).put("folder") .regex(Pattern.compile("^" + Pattern.quote(folder) + "($|_)")).put("_id").notEquals(id); mongo.find(DOCUMENTS_COLLECTION, MongoQueryBuilder.build(q), new Handler<Message<JsonObject>>() { public void handle(Message<JsonObject> d) { JsonArray files = d.body().getJsonArray("results", new fr.wseduc.webutils.collections.JsonArray()); if ("ok".equals(d.body().getString("status"))) { if (files.size() == 0) { result.handle(new Either.Right<String, JsonObject>( new JsonObject("{ \"number\": 0, \"number-errors\": 0 }"))); return; } final AtomicInteger remaining = new AtomicInteger(files.size()); final AtomicInteger count = new AtomicInteger(0); final AtomicInteger errorcount = new AtomicInteger(0); Handler<Either<String, JsonObject>> recursiveHandler = new Handler<Either<String, JsonObject>>() { @Override public void handle(Either<String, JsonObject> event) { if (event.isRight()) count.getAndAdd(1); else errorcount.getAndAdd(1); if (remaining.decrementAndGet() == 0) { JsonObject response = new JsonObject(); response.put("number", count); response.put("number-errors", errorcount); result.handle(new Either.Right<String, JsonObject>(response)); } } }; for (Object o : files) { if (!(o instanceof JsonObject)) continue; JsonObject file = (JsonObject) o; if (share != null) { shareService.share(owner.getUserId(), file.getString("_id"), share, recursiveHandler); } else { if (groupId != null) { if (remove) shareService.removeGroupShare(groupId, file.getString("_id"), actions, recursiveHandler); else shareService.groupShare(owner.getUserId(), groupId, file.getString("_id"), actions, recursiveHandler); } else if (userId != null) { if (remove) shareService.removeUserShare(userId, file.getString("_id"), actions, recursiveHandler); else shareService.userShare(owner.getUserId(), userId, file.getString("_id"), actions, recursiveHandler); } } } } else { result.handle(new Either.Left<String, JsonObject>("workspace.folder.not.found")); } } }); } }; mongo.findOne(DOCUMENTS_COLLECTION, MongoQueryBuilder.build(query), keys, folderHandler); }
From source file:org.entcore.workspace.service.impl.DefaultFolderService.java
License:Open Source License
public void rename(String id, final String newName, final UserInfos owner, final Handler<Either<String, JsonObject>> result) { if (owner == null) { result.handle(new Either.Left<String, JsonObject>("workspace.invalid.user")); return;//from www. j av a2 s .c om } if (id == null || id.trim().isEmpty()) { result.handle(new Either.Left<String, JsonObject>("workspace.folder.not.found")); return; } final QueryBuilder query = QueryBuilder.start("_id").is(id).put("owner").is(owner.getUserId()).and("file") .exists(false); final JsonObject keys = new JsonObject().put("folder", 1).put("name", 1); Handler<Message<JsonObject>> folderHandler = new Handler<Message<JsonObject>>() { @Override public void handle(Message<JsonObject> event) { final String folder = event.body().getJsonObject("result", new JsonObject()).getString("folder"); final String newFolderPath = folder.lastIndexOf("_") < 0 ? newName : folder.substring(0, folder.lastIndexOf("_") + 1) + newName; //3 - Find & rename children final Handler<Message<JsonObject>> renameChildren = new Handler<Message<JsonObject>>() { public void handle(Message<JsonObject> event) { if (!"ok".equals(event.body().getString("status"))) { result.handle(Utils.validResult(event)); return; } QueryBuilder targetQuery = QueryBuilder.start("owner").is(owner.getUserId()); targetQuery.or( QueryBuilder.start("folder") .regex(Pattern.compile("^" + Pattern.quote(folder) + "($|_)")).get(), QueryBuilder.start("old-folder") .regex(Pattern.compile("^" + Pattern.quote(folder) + "($|_)")).get()); mongo.find(DOCUMENTS_COLLECTION, MongoQueryBuilder.build(targetQuery), new Handler<Message<JsonObject>>() { @Override public void handle(Message<JsonObject> d) { JsonArray children = d.body().getJsonArray("results", new fr.wseduc.webutils.collections.JsonArray()); if ("ok".equals(d.body().getString("status")) && children.size() > 0) { final AtomicInteger remaining = new AtomicInteger(children.size()); final AtomicInteger count = new AtomicInteger(0); Handler<Message<JsonObject>> recursiveHandler = new Handler<Message<JsonObject>>() { @Override public void handle(Message<JsonObject> res) { count.getAndAdd(res.body().getInteger("number", 0)); if (remaining.decrementAndGet() == 0) { res.body().put("number", count.get()); result.handle(Utils.validResult(res)); } } }; for (Object o : children) { if (!(o instanceof JsonObject)) { remaining.decrementAndGet(); continue; } JsonObject child = (JsonObject) o; String childFolder = child.getString("folder"); String childOldFolder = child.getString("old-folder"); String id = child.getString("_id"); JsonObject updateMatcher = MongoQueryBuilder .build(QueryBuilder.start("_id").is(id)); MongoUpdateBuilder updateModifier = new MongoUpdateBuilder(); if (childOldFolder != null || childFolder.equals("Trash")) { String newPath = childOldFolder.lastIndexOf("_") < 0 ? newName : childOldFolder.replaceFirst(Pattern.quote(folder), Matcher.quoteReplacement(newFolderPath)); updateModifier.set("old-folder", newPath); } else { String newPath = childFolder.lastIndexOf("_") < 0 ? newName : childFolder.replaceFirst(Pattern.quote(folder), Matcher.quoteReplacement(newFolderPath)); updateModifier.set("folder", newPath); } mongo.update(DOCUMENTS_COLLECTION, updateMatcher, updateModifier.build(), recursiveHandler); } } else { result.handle(Utils.validResult(d)); } } }); } }; //2 - Rename target folder mongo.update(DOCUMENTS_COLLECTION, MongoQueryBuilder.build(query), new JsonObject( "{ \"$set\": { \"folder\": \"" + newFolderPath + "\", \"name\": \"" + newName + "\" }}"), renameChildren); } }; //1 - Find the folder mongo.findOne(DOCUMENTS_COLLECTION, MongoQueryBuilder.build(query), keys, folderHandler); }
From source file:org.entcore.workspace.service.impl.WorkspaceRepositoryEvents.java
License:Open Source License
@Override public void exportResources(final String exportId, final String userId, JsonArray g, final String exportPath, final String locale, String host, final Handler<Boolean> handler) { log.debug("Workspace export resources."); List<DBObject> groups = new ArrayList<>(); groups.add(QueryBuilder.start("userId").is(userId).get()); for (Object o : g) { if (!(o instanceof String)) continue; String gpId = (String) o; groups.add(QueryBuilder.start("groupId").is(gpId).get()); }/* ww w . j a v a 2 s . com*/ QueryBuilder b = new QueryBuilder().or(QueryBuilder.start("owner").is(userId).get(), QueryBuilder.start("shared") .elemMatch(new QueryBuilder().or(groups.toArray(new DBObject[groups.size()])).get()).get(), QueryBuilder.start("old_shared") .elemMatch(new QueryBuilder().or(groups.toArray(new DBObject[groups.size()])).get()).get()) .put("file").exists(true); final JsonObject keys = new JsonObject().put("file", 1).put("name", 1); final JsonObject query = MongoQueryBuilder.build(b); mongo.find(DocumentDao.DOCUMENTS_COLLECTION, query, null, keys, new Handler<Message<JsonObject>>() { @Override public void handle(Message<JsonObject> event) { final AtomicBoolean exported = new AtomicBoolean(false); final JsonArray documents = event.body().getJsonArray("results"); if ("ok".equals(event.body().getString("status")) && documents != null) { QueryBuilder b = QueryBuilder.start("to").is(userId).put("file").exists(true); final JsonObject q = MongoQueryBuilder.build(b); mongo.find(RackDao.RACKS_COLLECTION, q, null, keys, new Handler<Message<JsonObject>>() { @Override public void handle(Message<JsonObject> event) { JsonArray racks = event.body().getJsonArray("results"); if ("ok".equals(event.body().getString("status")) && racks != null) { final Set<String> usedFileName = new HashSet<>(); final JsonObject alias = new JsonObject(); final String[] ids = new String[racks.size() + documents.size()]; for (int i = 0; i < documents.size(); i++) { JsonObject j = documents.getJsonObject(i); ids[i] = j.getString("file"); String fileName = j.getString("name"); if (fileName != null && fileName.contains("/")) { fileName = fileName.replaceAll("/", "-"); } if (usedFileName.add(fileName)) { alias.put(ids[i], fileName); } else { alias.put(ids[i], ids[i] + "_" + fileName); } } for (int i = 0; i < racks.size(); i++) { JsonObject j = racks.getJsonObject(i); ids[i] = j.getString("file"); String fileName = j.getString("name"); if (fileName != null && fileName.contains("/")) { fileName = fileName.replaceAll("/", "-"); } if (usedFileName.add(fileName)) { alias.put(ids[i], fileName); } else { alias.put(ids[i], ids[i] + "_" + fileName); } } exportFiles(alias, ids, exportPath, locale, exported, handler); } else { log.error("Rack " + q.encode() + " - " + event.body().getString("message")); handler.handle(exported.get()); } } }); } else { log.error("Documents " + query.encode() + " - " + event.body().getString("message")); handler.handle(exported.get()); } } }); }
From source file:org.entcore.workspace.service.impl.WorkspaceRepositoryEvents.java
License:Open Source License
private void exportFiles(final JsonObject alias, final String[] ids, String exportPath, String locale, final AtomicBoolean exported, final Handler<Boolean> handler) { createExportDirectory(exportPath, locale, new Handler<String>() { @Override//from w ww . j a va 2 s.com public void handle(String path) { if (path != null) { if (ids.length == 0) { handler.handle(true); return; } storage.writeToFileSystem(ids, path, alias, new Handler<JsonObject>() { @Override public void handle(JsonObject event) { if ("ok".equals(event.getString("status"))) { exported.set(true); handler.handle(exported.get()); } else { JsonArray errors = event.getJsonArray("errors", new fr.wseduc.webutils.collections.JsonArray()); boolean ignoreErrors = errors.size() > 0; for (Object o : errors) { if (!(o instanceof JsonObject)) continue; if (((JsonObject) o).getString("message") == null || (!((JsonObject) o) .getString("message").contains("NoSuchFileException") && !((JsonObject) o).getString("message") .contains("FileAlreadyExistsException"))) { ignoreErrors = false; break; } } if (ignoreErrors) { exported.set(true); handler.handle(exported.get()); } else { log.error("Write to fs : " + new fr.wseduc.webutils.collections.JsonArray(Arrays.asList(ids)) .encode() + " - " + event.encode()); handler.handle(exported.get()); } } } }); } else { log.error("Create export directory error."); handler.handle(exported.get()); } } }); }
From source file:org.entcore.workspace.service.impl.WorkspaceRepositoryEvents.java
License:Open Source License
@Override public void deleteUsers(JsonArray users) { String[] userIds = new String[users.size()]; for (int i = 0; i < users.size(); i++) { JsonObject j = users.getJsonObject(i); String id = j.getString("id"); userIds[i] = id;// w ww . j a va 2s . co m } final JsonObject queryDocuments = MongoQueryBuilder.build(QueryBuilder.start("owner").in(userIds)); deleteFiles(queryDocuments, DocumentDao.DOCUMENTS_COLLECTION); final JsonObject queryRacks = MongoQueryBuilder.build(QueryBuilder.start("to").in(userIds)); deleteFiles(queryRacks, RackDao.RACKS_COLLECTION); deleteFiles(queryDocuments, Workspace.REVISIONS_COLLECTION); final JsonObject query = MongoQueryBuilder.build(QueryBuilder.start("shared.userId").in(userIds)); JsonObject update = new JsonObject().put("$pull", new JsonObject().put("shared", MongoQueryBuilder.build(QueryBuilder.start("userId").in(userIds)))); mongo.update(DocumentDao.DOCUMENTS_COLLECTION, query, update, false, true, new Handler<Message<JsonObject>>() { @Override public void handle(Message<JsonObject> event) { if (!"ok".equals(event.body().getString("status"))) { log.error(event.body().getString("message")); } } }); }
From source file:org.entcore.workspace.service.impl.WorkspaceRepositoryEvents.java
License:Open Source License
private void deleteFiles(final JsonObject query, final String collection) { mongo.find(collection, query, null, new JsonObject().put("file", 1), new Handler<Message<JsonObject>>() { @Override/*from w w w. ja v a2 s. co m*/ public void handle(Message<JsonObject> res) { String status = res.body().getString("status"); JsonArray results = res.body().getJsonArray("results"); if ("ok".equals(status) && results != null && results.size() > 0) { JsonArray fileIds = new fr.wseduc.webutils.collections.JsonArray(); for (Object o : results) { if (o instanceof JsonObject) { fileIds.add(((JsonObject) o).getString("file")); } } storage.removeFiles(fileIds, new Handler<JsonObject>() { @Override public void handle(JsonObject event) { if (event == null) { log.error("Error deleting files "); } else if (!"ok".equals(event.getString("status"))) { log.error("Error deleting files : " + event.encode()); } } }); mongo.delete(collection, query, new Handler<Message<JsonObject>>() { @Override public void handle(Message<JsonObject> event) { if (!"ok".equals(event.body().getString("status"))) { log.error("Error deleting documents : " + event.body().encode()); } else { log.info("Documents deleted : " + event.body().getInteger("number")); } } }); } } }); }
From source file:org.entcore.workspace.service.impl.WorkspaceSearchingEvents.java
License:Open Source License
@Override @SuppressWarnings("unchecked") public void searchResource(List<String> appFilters, final String userId, JsonArray groupIds, JsonArray searchWords, Integer page, Integer limit, final JsonArray columnsHeader, final String locale, final Handler<Either<String, JsonArray>> handler) { if (appFilters.contains(WorkspaceSearchingEvents.class.getSimpleName())) { final List<String> searchWordsLst = searchWords.getList(); final List<String> groupIdsLst = groupIds.getList(); final List<DBObject> groups = new ArrayList<>(); groups.add(QueryBuilder.start("userId").is(userId).get()); for (String gpId : groupIdsLst) { groups.add(QueryBuilder.start("groupId").is(gpId).get()); }/* www. ja v a2 s . c om*/ final QueryBuilder rightsQuery = new QueryBuilder().or( QueryBuilder.start("visibility").is(VisibilityFilter.PUBLIC.name()).get(), QueryBuilder.start("visibility").is(VisibilityFilter.PROTECTED.name()).get(), QueryBuilder.start("visibility").is(VisibilityFilter.PROTECTED.name()).get(), QueryBuilder.start("owner").is(userId).get(), QueryBuilder.start("shared") .elemMatch(new QueryBuilder().or(groups.toArray(new DBObject[groups.size()])).get()) .get()); final QueryBuilder worldsQuery = new QueryBuilder(); worldsQuery.text(MongoDbSearchService.textSearchedComposition(searchWordsLst)); //searching only the file entry (not folder), if folder match and is returned, the paginate system is impacted final QueryBuilder fileQuery = QueryBuilder.start("file").exists(true); final QueryBuilder query = new QueryBuilder().and(fileQuery.get(), rightsQuery.get(), worldsQuery.get()); JsonObject sort = new JsonObject().put("modified", -1); final JsonObject projection = new JsonObject(); projection.put("name", 1); projection.put("modified", 1); projection.put("folder", 1); projection.put("owner", 1); projection.put("ownerName", 1); projection.put("comments", 1); final int skip = (0 == page) ? -1 : page * limit; //main search on file mongo.find(this.collection, MongoQueryBuilder.build(query), sort, projection, skip, limit, Integer.MAX_VALUE, validResultsHandler(new Handler<Either<String, JsonArray>>() { @Override public void handle(Either<String, JsonArray> event) { if (event.isRight()) { final JsonArray globalJa = event.right().getValue(); //different owner can have the same folder name //if the folder exists, we must find id of folder according to the directory name and the owner, //it's necessary to use the front route for the resource link final QueryBuilder foldersOwnersOrQuery = new QueryBuilder(); Boolean isFolderProcessing = false; for (int i = 0; i < globalJa.size(); i++) { final JsonObject j = globalJa.getJsonObject(i); // processing only files that have a folder if (j != null && !StringUtils.isEmpty(j.getString("folder"))) { isFolderProcessing = true; final QueryBuilder folderOwnerQuery = new QueryBuilder(); folderOwnerQuery.and( QueryBuilder.start("folder").is(j.getString("folder")).get(), QueryBuilder.start("owner").is(j.getString("owner")).get()); foldersOwnersOrQuery.or(folderOwnerQuery.get()); } } final Map<String, Map<String, String>> mapOwnerMapNameFolderId = new HashMap<>(); //finding ids of folder found. if (isFolderProcessing) { //find only authorized folder entry and not file final QueryBuilder queryFindFolderIds = new QueryBuilder().and( QueryBuilder.start("file").exists(false).get(), rightsQuery.get(), foldersOwnersOrQuery.get()); //search all folder of main result set and format the search result findFoldersIdAndFormatResult(globalJa, queryFindFolderIds, columnsHeader, searchWordsLst, locale, userId, handler); } else { //all files without folder final JsonArray res = formatSearchResult(globalJa, columnsHeader, searchWordsLst, locale, userId, mapOwnerMapNameFolderId); handler.handle(new Either.Right<String, JsonArray>(res)); } } else { handler.handle(new Either.Left<String, JsonArray>(event.left().getValue())); } if (log.isDebugEnabled()) { log.debug( "[WorkspaceSearchingEvents][searchResource] The resources searched by user are finded"); } } })); } else { handler.handle(new Either.Right<String, JsonArray>(new fr.wseduc.webutils.collections.JsonArray())); } }
From source file:org.entcore.workspace.service.impl.WorkspaceSearchingEvents.java
License:Open Source License
private void findFoldersIdAndFormatResult(final JsonArray globalJa, QueryBuilder queryFindFolderIds, final JsonArray columnsHeader, final List<String> searchWordsLst, final String locale, final String userId, final Handler<Either<String, JsonArray>> handler) { final JsonObject projection = new JsonObject(); projection.put("folder", 1); projection.put("owner", 1); mongo.find(collection, MongoQueryBuilder.build(queryFindFolderIds), null, projection, new Handler<Message<JsonObject>>() { @Override//from w w w. j av a 2 s .c om public void handle(Message<JsonObject> event) { final Either<String, JsonArray> ei = validResults(event); if (ei.isRight()) { final JsonArray folderJa = ei.right().getValue(); final Map<String, Map<String, String>> mapOwnerMapNameFolderId = new HashMap<>(); // fill the map owner key with map folder name key, folder id value for (int i = 0; i < folderJa.size(); i++) { final JsonObject j = folderJa.getJsonObject(i); if (j != null) { final String owner = j.getString("owner", ""); if (mapOwnerMapNameFolderId.containsKey(owner)) { mapOwnerMapNameFolderId.get(owner).put(j.getString("folder"), j.getString("_id")); } else { final Map<String, String> mapFolderId = new HashMap<>(); mapFolderId.put(j.getString("folder"), j.getString("_id")); mapOwnerMapNameFolderId.put(owner, mapFolderId); } } } final JsonArray res = formatSearchResult(globalJa, columnsHeader, searchWordsLst, locale, userId, mapOwnerMapNameFolderId); handler.handle(new Either.Right<String, JsonArray>(res)); } else { handler.handle(new Either.Left<String, JsonArray>(ei.left().getValue())); } } }); }