List of usage examples for io.vertx.core.json JsonArray JsonArray
public JsonArray()
From source file:org.entcore.directory.controllers.StructureController.java
License:Open Source License
private void massMailTypeMail(final HttpServerRequest request, final String templatePath, final JsonArray users) { vertx.fileSystem().readFile(templatePath + "massmail.mail.txt", new Handler<AsyncResult<Buffer>>() { @Override// ww w. j av a 2 s . c o m public void handle(AsyncResult<Buffer> result) { if (!result.succeeded()) { badRequest(request); return; } StringReader reader = new StringReader(result.result().toString("UTF-8")); final JsonArray mailHeaders = new JsonArray().add( new JsonObject().put("name", "Content-Type").put("value", "text/html; charset=\"UTF-8\"")); for (Object userObj : users) { final JsonObject user = (JsonObject) userObj; final String userMail = user.getString("email"); if (userMail == null || userMail.trim().isEmpty()) { continue; } final String mailTitle = !user.containsKey("activationCode") || user.getString("activationCode") == null || user.getString("activationCode").trim().isEmpty() ? "directory.massmail.mail.subject.activated" : "directory.massmail.mail.subject.not.activated"; try { reader.reset(); } catch (IOException exc) { log.error("[MassMail] Error on StringReader (" + exc.toString() + ")"); } processTemplate(request, user, "massmail.mail.txt", reader, new Handler<Writer>() { public void handle(Writer writer) { String processedTemplate = ((StringWriter) writer).getBuffer().toString(); if (processedTemplate == null) { badRequest(request); return; } notifHelper.sendEmail(request, userMail, null, null, mailTitle, processedTemplate, null, true, mailHeaders, handlerToAsyncHandler(new Handler<Message<JsonObject>>() { public void handle(Message<JsonObject> event) { if ("error".equals(event.body().getString("status"))) { log.error("[MassMail] Error while sending mail (" + event.body().getString("message", "") + ")"); } } })); } }); } ok(request); } }); }
From source file:org.entcore.directory.controllers.TimetableController.java
License:Open Source License
@BusAddress("timetable") @SuppressWarnings("unchecked") public void getTimetable(final Message<JsonObject> message) { final String action = message.body().getString("action"); if (action == null) { log.warn("[@BusAddress](timetable) Invalid action."); message.reply(new JsonObject().put("status", "error").put("message", "Invalid action.")); return;/*from w ww . j a va 2 s .c o m*/ } final String structureId = message.body().getString("structureId"); switch (action) { case "get.course": final String teacherId = message.body().getString("teacherId"); final List<String> groupNames = message.body().getJsonArray("group", new JsonArray()).getList(); final String beginDate = message.body().getString("begin"); final String endDate = message.body().getString("end"); if (beginDate != null && endDate != null && beginDate.matches("\\d{4}-\\d{2}-\\d{2}") && endDate.matches("\\d{4}-\\d{2}-\\d{2}")) { timetableService.listCoursesBetweenTwoDates(structureId, teacherId, groupNames, beginDate, endDate, getBusResultHandler(message)); } else { message.reply(new JsonObject().put("status", "error").put("message", "timetable.invalid.dates")); } break; case "get.subjects": final List<String> teachers = message.body() .getJsonArray("teacherIds", new fr.wseduc.webutils.collections.JsonArray()).getList(); final String externalGroupId = message.body().getString("externalGroupId"); final boolean classes = message.body().getBoolean("classes", false); final boolean groups = message.body().getBoolean("groups", false); if (StringUtils.isEmpty(externalGroupId)) { timetableService.listSubjects(structureId, teachers, classes, groups, getBusResultHandler(message)); } else { timetableService.listSubjectsByGroup(structureId, externalGroupId, getBusResultHandler(message)); } break; default: message.reply(new JsonObject().put("status", "error").put("message", "Invalid action.")); break; } }
From source file:org.entcore.directory.controllers.UserController.java
License:Open Source License
@Get("/user/:userId") @ResourceFilter(UserAccessOrVisible.class) @SecuredAction(value = "", type = ActionType.RESOURCE) public void get(final HttpServerRequest request) { String userId = request.params().get("userId"); boolean getManualGroups = Boolean.parseBoolean(request.params().get("manual-groups")); if ("true".equals(((SecureHttpServerRequest) request).getAttribute("visibleCheck"))) { final JsonArray filter = new JsonArray().add("activationCode").add("firstName").add("lastName") .add("mobile").add("mobilePhone").add("lastLogin").add("created").add("modified").add("ine") .add("email").add("emailAcademy").add("workPhone").add("homePhone").add("country") .add("zipCode").add("address").add("postbox").add("city").add("otherNames").add("title"); userService.get(userId, getManualGroups, filter, notEmptyResponseHandler(request)); } else {/*from www . ja va2 s . c o m*/ userService.get(userId, getManualGroups, notEmptyResponseHandler(request)); } }
From source file:org.entcore.directory.services.impl.DefaultShareBookmarkService.java
License:Open Source License
@Override public void update(String userId, String id, JsonObject bookmark, Handler<Either<String, JsonObject>> handler) { final String query = "MATCH (u:User {id:{userId}}) " + "MERGE u-[:HAS_SB]->(sb:ShareBookmark) " + "SET sb." + cleanId(id) + " = {bookmark} "; JsonObject params = new JsonObject(); params.put("userId", userId); params.put("bookmark", new JsonArray().add(bookmark.getString("name")) .addAll(getOrElse(bookmark.getJsonArray("members"), new JsonArray()))); neo4j.execute(query, params, validEmptyHandler(handler)); }
From source file:org.entcore.directory.services.impl.DefaultShareBookmarkService.java
License:Open Source License
@Override public void list(String userId, Handler<Either<String, JsonArray>> handler) { final String query = "MATCH (:User {id:{userId}})-[:HAS_SB]->(sb:ShareBookmark) return sb"; JsonObject params = new JsonObject(); params.put("userId", userId); neo4j.execute(query, params, fullNodeMergeHandler("sb", node -> { if (node.isRight()) { final JsonObject j = node.right().getValue(); final JsonArray result = new JsonArray(); for (String id : j.fieldNames()) { final JsonArray value = j.getJsonArray(id); if (value == null || value.size() < 2) { delete(userId, id, dres -> { if (dres.isLeft()) { log.error("Error deleting sharebookmark " + id + " : " + dres.left().getValue()); }// ww w .ja va2 s . c o m }); continue; } final JsonObject r = new fr.wseduc.webutils.collections.JsonObject(); r.put("id", id); r.put("name", value.remove(0)); //r.put("membersIds", value); result.add(r); } handler.handle(new Either.Right<>(result)); } else { handler.handle(new Either.Left<>(node.left().getValue())); } })); }
From source file:org.entcore.directory.services.impl.DefaultTimetableService.java
License:Open Source License
@Override public void listCoursesBetweenTwoDates(String structureId, String teacherId, List<String> groupNames, String begin, String end, Handler<Either<String, JsonArray>> handler) { if (Utils.validationParamsNull(handler, structureId, begin, end)) return;//from w w w.j ava 2 s .com final JsonObject query = new JsonObject(); query.put("structureId", structureId); if (teacherId != null) { query.put("teacherIds", teacherId); } final String startDate = begin + START_DATE_PATTERN; final String endDate = end + END_DATE_PATTERN; JsonObject betweenStart = new JsonObject(); betweenStart.put("$lte", endDate); JsonObject betweenEnd = new JsonObject(); betweenEnd.put("$gte", startDate); if (groupNames != null) { JsonObject dateOperand = new JsonObject().put("$and", new fr.wseduc.webutils.collections.JsonArray() .add(new JsonObject().put("startDate", betweenStart)) .add(new JsonObject().put("endDate", betweenEnd))); JsonObject groupOperand = new JsonObject(); JsonArray groupsNameArray = new JsonArray(); for (int i = 0; i < groupNames.size(); i++) { String groupName = groupNames.get(i); groupsNameArray.add(new JsonObject().put("classes", groupName)); groupsNameArray.add(new JsonObject().put("groups", groupName)); } groupOperand.put("$or", groupsNameArray); query.put("$and", new JsonArray().add(dateOperand).add(groupOperand)); } else { query.put("$and", new fr.wseduc.webutils.collections.JsonArray() .add(new JsonObject().put("startDate", betweenStart)) .add(new JsonObject().put("endDate", betweenEnd))); } final JsonObject sort = new JsonObject().put("startDate", 1); MongoDb.getInstance().find(COURSES, query, sort, KEYS, validResultsHandler(handler)); }
From source file:org.entcore.directory.services.impl.DefaultUserBookService.java
License:Open Source License
@Override public void update(String userId, JsonObject userBook, final Handler<Either<String, JsonObject>> result) { JsonObject u = Utils.validAndGet(userBook, UPDATE_USERBOOK_FIELDS, Collections.<String>emptyList()); if (Utils.defaultValidationError(u, result, userId)) return;//from w w w .ja v a 2 s .c o m // OVERRIDE AVATAR URL Optional<String> pictureId = getPictureIdForUserbook(userBook); if (pictureId.isPresent()) { String fileId = avatarFileNameFromUserId(userId, Optional.empty()); u.put("picture", "/userbook/avatar/" + fileId); } StatementsBuilder b = new StatementsBuilder(); String query = "MATCH (u:`User` { id : {id}})-[:USERBOOK]->(ub:UserBook) WITH ub.picture as oldpic,ub,u SET " + nodeSetPropertiesFromJson("ub", u); query += " RETURN oldpic,ub.picture as picture"; boolean updateUserBook = u.size() > 0; if (updateUserBook) { b.add(query, u.put("id", userId)); } String q2 = "MATCH (u:`User` { id : {id}})-[:USERBOOK]->(ub:UserBook)" + "-[:PUBLIC|PRIVE]->(h:`Hobby` { category : {category}}) " + "SET h.values = {values} "; JsonArray hobbies = userBook.getJsonArray("hobbies"); if (hobbies != null) { for (Object o : hobbies) { if (!(o instanceof JsonObject)) continue; JsonObject j = (JsonObject) o; b.add(q2, j.put("id", userId)); } } neo.executeTransaction(b.build(), null, true, new Handler<Message<JsonObject>>() { @Override public void handle(Message<JsonObject> r) { if ("ok".equals(r.body().getString("status"))) { if (updateUserBook) { JsonArray results = r.body().getJsonArray("results", new JsonArray()); JsonArray firstStatement = results.getJsonArray(0); if (firstStatement != null && firstStatement.size() > 0) { JsonObject object = firstStatement.getJsonObject(0); String picture = object.getString("picture", ""); cacheAvatarFromUserBook(userId, pictureId, StringUtils.isEmpty(picture)) .setHandler(e -> { if (e.succeeded()) { result.handle(new Either.Right<String, JsonObject>(new JsonObject())); } else { result.handle(new Either.Left<String, JsonObject>( r.body().getString("message", "update.error"))); } }); } } else { result.handle(new Either.Right<String, JsonObject>(new JsonObject())); } } else { result.handle( new Either.Left<String, JsonObject>(r.body().getString("message", "update.error"))); } } }); }
From source file:org.entcore.directory.services.impl.DefaultUserService.java
License:Open Source License
@Override public void get(String id, boolean getManualGroups, Handler<Either<String, JsonObject>> result) { get(id, getManualGroups, new JsonArray(), result); }
From source file:org.entcore.feeder.csv.CsvValidator.java
License:Open Source License
private void validateFile(final String path, final String profile, final List<String> columns, final JsonArray existExternalId, final String charset, final Handler<JsonObject> handler) { addProfile(profile);/*from w ww . j a v a2s .c o m*/ final Validator validator = profiles.get(profile); getStructure(path.substring(0, path.lastIndexOf(File.separator)), new Handler<Structure>() { @Override public void handle(final Structure structure) { if (structure == null) { addError(profile, "invalid.structure"); handler.handle(result); return; } final JsonObject checkChildExists = new JsonObject(); try { CSVReader csvParser = getCsvReader(path, charset, 1); final int nbColumns = columns.size(); String[] strings; int i = 1; csvParserWhile: while ((strings = csvParser.readNext()) != null) { if (emptyLine(strings)) { i++; continue; } if (strings.length > nbColumns) { strings = Arrays.asList(strings).subList(0, nbColumns).toArray(new String[nbColumns]); } // if (strings.length != nbColumns) { // addErrorByFile(profile, "bad.columns.number", "" + ++i); // continue; // } final JsonArray classesNames = new fr.wseduc.webutils.collections.JsonArray(); JsonObject user = new JsonObject(); user.put("structures", new fr.wseduc.webutils.collections.JsonArray().add(structure.getExternalId())); user.put("profiles", new fr.wseduc.webutils.collections.JsonArray().add(profile)); List<String[]> classes = new ArrayList<>(); for (int j = 0; j < strings.length; j++) { if (j >= columns.size()) { addErrorByFile(profile, "out.columns", "" + i); return; } final String c = columns.get(j); final String v = strings[j].trim(); if (v.isEmpty() && !c.startsWith("child")) continue; switch (validator.getType(c)) { case "string": if ("birthDate".equals(c)) { Matcher m = frenchDatePatter.matcher(v); if (m.find()) { user.put(c, m.group(3) + "-" + m.group(2) + "-" + m.group(1)); } else { user.put(c, v); } } else { user.put(c, v); } break; case "array-string": JsonArray a = user.getJsonArray(c); if (a == null) { a = new fr.wseduc.webutils.collections.JsonArray(); user.put(c, a); } if (("classes".equals(c) || "subjectTaught".equals(c) || "functions".equals(c)) && !v.startsWith(structure.getExternalId() + "$")) { a.add(structure.getExternalId() + "$" + v); } else { a.add(v); } break; case "boolean": user.put(c, "true".equals(v.toLowerCase())); break; default: Object o = user.getValue(c); final String v2; if ("childClasses".equals(c) && !v.startsWith(structure.getExternalId() + "$")) { v2 = structure.getExternalId() + "$" + v; } else { v2 = v; } if (o != null) { if (o instanceof JsonArray) { ((JsonArray) o).add(v2); } else { JsonArray array = new fr.wseduc.webutils.collections.JsonArray(); array.add(o).add(v2); user.put(c, array); } } else { user.put(c, v2); } } if ("classes".equals(c)) { String eId = structure.getExternalId() + '$' + v; String[] classId = new String[2]; classId[0] = structure.getExternalId(); classId[1] = eId; classes.add(classId); classesNames.add(v); } } String ca; long seed; JsonArray classesA; Object co = user.getValue("classes"); if (co != null && co instanceof JsonArray) { classesA = (JsonArray) co; } else if (co instanceof String) { classesA = new fr.wseduc.webutils.collections.JsonArray().add(co); } else { classesA = null; } if ("Student".equals(profile) && classesA != null && classesA.size() == 1) { seed = defaultStudentSeed; ca = classesA.getString(0); } else { ca = String.valueOf(i); seed = System.currentTimeMillis(); } final State state; final String externalId = user.getString("externalId"); if (externalId == null || externalId.trim().isEmpty()) { generateUserExternalId(user, ca, structure, seed); state = State.NEW; } else { if (existExternalId.contains(externalId)) { state = State.UPDATED; studentExternalIdMapping.put(getHashMapping(user, ca, structure, seed), externalId); } else { state = State.NEW; } } switch (profile) { case "Relative": boolean checkChildMapping = true; JsonArray linkStudents = new fr.wseduc.webutils.collections.JsonArray(); if ("Intitul".equals(strings[0]) && "Adresse Organisme".equals(strings[1])) { break csvParserWhile; } user.put("linkStudents", linkStudents); for (String attr : user.fieldNames()) { if ("childExternalId".equals(attr)) { if (checkChildMapping) { checkChildMapping = false; } Object o = user.getValue(attr); if (o instanceof JsonArray) { for (Object c : (JsonArray) o) { linkStudents.add(c); } } else { linkStudents.add(o); } } else if ("childUsername".equals(attr)) { Object childUsername = user.getValue(attr); Object childLastName = user.getValue("childLastName"); Object childFirstName = user.getValue("childFirstName"); Object childClasses; if (isNotEmpty(structure.getOverrideClass())) { childClasses = structure.getOverrideClass(); } else { childClasses = user.getValue("childClasses"); } if (childUsername instanceof JsonArray && childLastName instanceof JsonArray && childFirstName instanceof JsonArray && childClasses instanceof JsonArray && ((JsonArray) childClasses).size() == ((JsonArray) childLastName) .size() && ((JsonArray) childFirstName).size() == ((JsonArray) childLastName) .size()) { for (int j = 0; j < ((JsonArray) childUsername).size(); j++) { String mapping = structure.getExternalId() + ((JsonArray) childUsername).getString(j).trim() + ((JsonArray) childLastName).getString(j).trim() + ((JsonArray) childFirstName).getString(j).trim() + ((JsonArray) childClasses).getString(j).trim() + defaultStudentSeed; relativeStudentMapping(linkStudents, mapping); } } else if (childUsername instanceof String && childLastName instanceof String && childFirstName instanceof String && childClasses instanceof String) { String mapping = structure.getExternalId() + childLastName.toString().trim() + childFirstName.toString().trim() + childClasses.toString().trim() + defaultStudentSeed; relativeStudentMapping(linkStudents, mapping); } else { addErrorByFile(profile, "invalid.child.mapping", "" + (i + 1), "childLUsername"); handler.handle(result); return; } } else if ("childLastName".equals(attr) && !user.fieldNames().contains("childUsername")) { Object childLastName = user.getValue(attr); Object childFirstName = user.getValue("childFirstName"); Object childClasses; if (isNotEmpty(structure.getOverrideClass())) { childClasses = structure.getOverrideClass(); } else { childClasses = user.getValue("childClasses"); } if (childLastName instanceof JsonArray && childFirstName instanceof JsonArray && childClasses instanceof JsonArray && ((JsonArray) childClasses).size() == ((JsonArray) childLastName) .size() && ((JsonArray) childFirstName).size() == ((JsonArray) childLastName) .size()) { for (int j = 0; j < ((JsonArray) childLastName).size(); j++) { String mapping = structure.getExternalId() + ((JsonArray) childLastName).getString(j) + ((JsonArray) childFirstName).getString(j) + ((JsonArray) childClasses).getString(j) + defaultStudentSeed; relativeStudentMapping(linkStudents, mapping); } } else if (childLastName instanceof String && childFirstName instanceof String && childClasses instanceof String) { String mapping = structure.getExternalId() + childLastName.toString().trim() + childFirstName.toString().trim() + childClasses.toString().trim() + defaultStudentSeed; relativeStudentMapping(linkStudents, mapping); } else { addErrorByFile(profile, "invalid.child.mapping", "" + (i + 1), "childLastName & childFirstName"); handler.handle(result); return; } } } if (checkChildMapping || classesNamesMapping.size() > 0) { for (Object o : linkStudents) { if (!(o instanceof String)) continue; if (classesNamesMapping.get(o) != null) { classesNames.add(classesNamesMapping.get(o)); } } if (classesNames.size() == 0) { addSoftErrorByFile(profile, "missing.student.soft", "" + (i + 1), user.getString("firstName"), user.getString("lastName")); } } else { Object c = user.getValue("childExternalId"); JsonObject u = new JsonObject().put("lastName", user.getString("lastName")) .put("firstName", user.getString("firstName")).put("line", i); if (c instanceof String) { c = new JsonArray().add(c); } if (c instanceof JsonArray) { for (Object ceId : ((JsonArray) c)) { if (isEmpty((String) ceId)) continue; JsonArray jr = checkChildExists.getJsonArray((String) ceId); if (jr == null) { jr = new JsonArray(); checkChildExists.put((String) ceId, jr); } jr.add(u); } } } break; } String error = validator.validate(user, acceptLanguage); if (error != null) { log.warn(error); addErrorByFile(profile, "validator.errorWithLine", "" + (i + 1), error); // Note that 'error' is already translated } else { final String classesStr = Joiner.on(", ").join(classesNames); if (!"Relative".equals(profile)) { classesNamesMapping.put(user.getString("externalId"), classesStr); } addUser(profile, user.put("state", translate(state.name())) .put("translatedProfile", translate(profile)).put("classesStr", classesStr)); } i++; } } catch (Exception e) { addError(profile, "csv.exception"); log.error("csv.exception", e); } if (!checkChildExists.isEmpty()) { final String query = "MATCH (u:User) " + "WHERE u.externalId IN {childExternalIds} " + "RETURN COLLECT(u.externalId) as childExternalIds "; final JsonObject params = new JsonObject().put("childExternalIds", new JsonArray(new ArrayList<>(checkChildExists.fieldNames()))); Neo4j.getInstance().execute(query, params, new Handler<Message<JsonObject>>() { @Override public void handle(Message<JsonObject> event) { if ("ok".equals(event.body().getString("status"))) { JsonArray existsChilds = getOrElse( getOrElse(getOrElse(event.body().getJsonArray("result"), new JsonArray()) .getJsonObject(0), new JsonObject()) .getJsonArray("childExternalIds"), new JsonArray()); for (String cexternalId : checkChildExists.fieldNames()) { if (!existsChilds.contains(cexternalId)) { for (Object o : checkChildExists.getJsonArray(cexternalId)) { if (!(o instanceof JsonObject)) continue; JsonObject user = (JsonObject) o; addSoftErrorByFile(profile, "missing.student.soft", "" + (user.getInteger("line") + 1), user.getString("firstName"), user.getString("lastName")); } } } } handler.handle(result); } }); } else { handler.handle(result); } } }); }
From source file:org.entcore.feeder.dictionary.users.PersEducNat.java
License:Open Source License
public void createOrUpdatePersonnel(JsonObject object, String profileExternalId, JsonArray structuresByFunctions, String[][] linkClasses, String[][] linkGroups, boolean nodeQueries, boolean relationshipQueries) { final String error = personnelValidator.validate(object); if (error != null) { if (object.getJsonArray("profiles") != null && object.getJsonArray("profiles").size() == 1) { report.addIgnored(object.getJsonArray("profiles").getString(0), error, object); } else {/*from w w w. j a v a 2s. c o m*/ report.addIgnored("Personnel", error, object); } log.warn(error); } else { if (nodeQueries) { object.put("source", currentSource); if (userImportedExternalId != null) { userImportedExternalId.add(object.getString("externalId")); } StringBuilder sb = new StringBuilder(); JsonObject params; sb.append("MERGE (u:`User` { externalId : {externalId}}) "); sb.append("ON CREATE SET u.id = {id}, u.login = {login}, u.activationCode = {activationCode}, "); sb.append("u.displayName = {displayName}, u.created = {created} "); sb.append("WITH u "); if (!EDTImporter.EDT.equals(currentSource)) { sb.append("WHERE u.checksum IS NULL OR u.checksum <> {checksum} "); } sb.append("SET ").append(Neo4jUtils.nodeSetPropertiesFromJson("u", object, "id", "externalId", "login", "activationCode", "displayName", "email", "created")); if (EDTImporter.EDT.equals(currentSource)) { sb.append("RETURN u.id as id, u.IDPN as IDPN, head(u.profiles) as profile"); } params = object; transactionHelper.add(sb.toString(), params); checkUpdateEmail(object); } if (relationshipQueries) { final String externalId = object.getString("externalId"); JsonArray structures = getMappingStructures(object.getJsonArray("structures")); if (externalId != null && structures != null && structures.size() > 0) { String query; JsonObject p = new JsonObject().put("userExternalId", externalId); if (structures.size() == 1) { query = "MATCH (s:Structure {externalId : {structureAdmin}}), (u:User {externalId : {userExternalId}}) " + "MERGE u-[:ADMINISTRATIVE_ATTACHMENT]->s "; p.put("structureAdmin", structures.getString(0)); } else { query = "MATCH (s:Structure), (u:User {externalId : {userExternalId}}) " + "WHERE s.externalId IN {structuresAdmin} " + "MERGE u-[:ADMINISTRATIVE_ATTACHMENT]->s "; p.put("structuresAdmin", structures); } transactionHelper.add(query, p); } if (externalId != null && structuresByFunctions != null && structuresByFunctions.size() > 0) { String query; structuresByFunctions = getMappingStructures(structuresByFunctions); JsonObject p = new JsonObject().put("userExternalId", externalId); if (structuresByFunctions.size() == 1) { query = "MATCH (s:Structure {externalId : {structureAdmin}})<-[:DEPENDS]-(g:ProfileGroup)-[:HAS_PROFILE]->(p:Profile {externalId : {profileExternalId}}), " + "(u:User { externalId : {userExternalId}}) " + "WHERE NOT(HAS(u.mergedWith)) " + "MERGE u-[:IN]->g"; p.put("structureAdmin", structuresByFunctions.getString(0)).put("profileExternalId", profileExternalId); } else { query = "MATCH (s:Structure)<-[:DEPENDS]-(g:ProfileGroup)-[:HAS_PROFILE]->(p:Profile), " + "(u:User { externalId : {userExternalId}}) " + "WHERE s.externalId IN {structuresAdmin} AND NOT(HAS(u.mergedWith)) " + "AND p.externalId = {profileExternalId} " + "MERGE u-[:IN]->g "; p.put("structuresAdmin", structuresByFunctions).put("profileExternalId", profileExternalId); } transactionHelper.add(query, p); String qs = "MATCH (:User {externalId : {userExternalId}})-[r:IN|COMMUNIQUE]-(:Group)-[:DEPENDS]->(s:Structure) " + "WHERE NOT(s.externalId IN {structures}) AND (NOT(HAS(r.source)) OR r.source = {source}) " + "DELETE r"; JsonObject ps = new JsonObject().put("userExternalId", externalId).put("source", currentSource) .put("structures", structuresByFunctions); transactionHelper.add(qs, ps); final String daa = "MATCH (u:User {externalId : {userExternalId}})-[r:ADMINISTRATIVE_ATTACHMENT]->(s:Structure) " + "WHERE NOT(s.externalId IN {structures}) AND (NOT(HAS(r.source)) OR r.source = {source}) " + "DELETE r"; transactionHelper.add(daa, ps.copy().put("structures", getOrElse(structures, new JsonArray()))); } final JsonObject fosm = new JsonObject(); final JsonArray classes = new fr.wseduc.webutils.collections.JsonArray(); if (externalId != null && linkClasses != null) { final JsonObject fcm = new JsonObject(); for (String[] structClass : linkClasses) { if (structClass != null && structClass[0] != null && structClass[1] != null) { classes.add(structClass[1]); if (structClass.length > 2 && isNotEmpty(structClass[2])) { JsonArray fClasses = fcm.getJsonArray(structClass[2]); if (fClasses == null) { fClasses = new fr.wseduc.webutils.collections.JsonArray(); fcm.put(structClass[2], fClasses); } fClasses.add(structClass[1]); } } } String query = "MATCH (c:Class)<-[:DEPENDS]-(g:ProfileGroup)" + "-[:DEPENDS]->(pg:ProfileGroup)-[:HAS_PROFILE]->(p:Profile {externalId : {profileExternalId}}), " + "(u:User { externalId : {userExternalId}}) " + "WHERE c.externalId IN {classes} AND NOT(HAS(u.mergedWith)) " + "MERGE u-[:IN]->g"; JsonObject p0 = new JsonObject().put("userExternalId", externalId) .put("profileExternalId", profileExternalId).put("classes", classes); transactionHelper.add(query, p0); JsonObject p = new JsonObject().put("userExternalId", externalId).put("source", currentSource) .put("classes", classes); fosm.mergeIn(fcm); for (String fos : fcm.fieldNames()) { String q2 = "MATCH (u:User {externalId : {userExternalId}}), (f:FieldOfStudy {externalId:{feId}}) " + "MERGE u-[r:TEACHES_FOS]->f " + "SET r.classes = {classes} "; transactionHelper.add(q2, p.copy().put("classes", fcm.getJsonArray(fos)).put("feId", fos)); } } if (externalId != null) { String q = "MATCH (:User {externalId : {userExternalId}})-[r:IN|COMMUNIQUE]-(:Group)-[:DEPENDS]->(c:Class) " + "WHERE NOT(c.externalId IN {classes}) AND (NOT(HAS(r.source)) OR r.source = {source}) " + "DELETE r"; JsonObject p = new JsonObject().put("userExternalId", externalId).put("source", currentSource) .put("classes", classes); transactionHelper.add(q, p); } final JsonArray groups = new fr.wseduc.webutils.collections.JsonArray(); final JsonObject fgm = new JsonObject(); if (externalId != null && linkGroups != null) { for (String[] structGroup : linkGroups) { if (structGroup != null && structGroup[0] != null && structGroup[1] != null) { groups.add(structGroup[1]); if (structGroup.length > 2 && isNotEmpty(structGroup[2])) { JsonArray fGroups = fgm.getJsonArray(structGroup[2]); if (fGroups == null) { fGroups = new fr.wseduc.webutils.collections.JsonArray(); fgm.put(structGroup[2], fGroups); } fGroups.add(structGroup[1]); } } } String query = "MATCH (g:Group), (u:User {externalId : {userExternalId}}) " + "WHERE (g:FunctionalGroup OR g:FunctionGroup OR g:HTGroup) AND g.externalId IN {groups} " + "MERGE u-[:IN]->g"; JsonObject p = new JsonObject().put("userExternalId", externalId).put("groups", groups); transactionHelper.add(query, p); } if (externalId != null) { final String qdfg = "MATCH (:User {externalId : {userExternalId}})-[r:IN|COMMUNIQUE]-(g:Group) " + "WHERE (g:FunctionalGroup OR g:FunctionGroup OR g:HTGroup) AND " + "NOT(g.externalId IN {groups}) AND (NOT(HAS(r.source)) OR r.source = {source}) " + "DELETE r"; final JsonObject pdfg = new JsonObject().put("userExternalId", externalId) .put("source", currentSource).put("groups", groups); transactionHelper.add(qdfg, pdfg); fosm.mergeIn(fgm); final String deleteOldFoslg = "MATCH (u:User {externalId : {userExternalId}})-[r:TEACHES_FOS]->(f:FieldOfStudy) " + "WHERE NOT(f.externalId IN {fos}) AND (NOT(HAS(r.source)) OR r.source = {source}) " + "DELETE r"; transactionHelper.add(deleteOldFoslg, pdfg.copy().put("fos", new fr.wseduc.webutils.collections.JsonArray(new ArrayList<>(fosm.fieldNames())))); for (String fos : fgm.fieldNames()) { String q2 = "MATCH (u:User {externalId : {userExternalId}}), (f:FieldOfStudy {externalId:{feId}}) " + "MERGE u-[r:TEACHES_FOS]->f " + "SET r.groups = {groups} "; transactionHelper.add(q2, pdfg.copy().put("groups", fgm.getJsonArray(fos)).put("feId", fos)); } } } } }