List of usage examples for io.vertx.core.json JsonObject copy
@Override
public JsonObject copy()
From source file:org.entcore.feeder.dictionary.structures.DuplicateUsers.java
License:Open Source License
private void scoreDuplicates(final String profile, final JsonArray search, final Handler<Void> handler) { final String query = "START u=node:node_auto_index({luceneQuery}) " + "WHERE HEAD(u.profiles) = {profile} AND u.id <> {id} AND NOT(HAS(u.deleteDate)) " + "RETURN u.id as id, u.firstName as firstName, u.lastName as lastName, " + "u.birthDate as birthDate, u.email as email, u.source as source, u.disappearanceDate as disappearanceDate"; final JsonObject params = new JsonObject().put("profile", profile); TransactionHelper tx;/*from www . j a v a 2s. co m*/ try { tx = TransactionManager.getTransaction(false); } catch (TransactionException e) { log.error("Error when find duplicate users.", e); return; } final JsonArray result = new fr.wseduc.webutils.collections.JsonArray(); for (int i = 0; i < search.size(); i++) { final JsonObject json = search.getJsonObject(i); final String firstNameAttr = luceneAttribute("firstName", json.getString("firstName"), 0.6); final String lastNameAttr = luceneAttribute("lastName", json.getString("lastName"), 0.6); String luceneQuery; if (firstNameAttr != null && lastNameAttr != null && !firstNameAttr.trim().isEmpty() && !lastNameAttr.trim().isEmpty()) { luceneQuery = firstNameAttr + " AND " + lastNameAttr; result.add(json); tx.add(query, params.copy().put("luceneQuery", luceneQuery).put("id", json.getString("id"))); } } tx.commit(new Handler<Message<JsonObject>>() { @Override public void handle(Message<JsonObject> event) { JsonArray results = event.body().getJsonArray("results"); if ("ok".equals(event.body().getString("status")) && results != null && results.size() > 0) { TransactionHelper tx; try { tx = TransactionManager.getTransaction(); tx.setAutoSend(false); } catch (TransactionException e) { log.error("Error when score duplicate users.", e); return; } for (int i = 0; i < results.size(); i++) { JsonArray findUsers = results.getJsonArray(i); if (findUsers == null || findUsers.size() == 0) continue; JsonObject searchUser = result.getJsonObject(i); calculateAndStoreScore(searchUser, findUsers, tx); } if (!tx.isEmpty()) { tx.commit(new Handler<Message<JsonObject>>() { @Override public void handle(Message<JsonObject> event) { if ("ok".equals(event.body().getString("status"))) { log.info("Mark duplicates " + profile + " finished."); } else { log.error("Error marking duplicates : " + event.body().getString("message")); } handler.handle(null); } }); } else { log.info("No duplicate user with score > 3 found in profile " + profile); handler.handle(null); } } else { if ("ok".equals(event.body().getString("status"))) { log.info("No duplicate user found in profile " + profile); } else { log.error( "Error finding users for search duplicates : " + event.body().getString("message")); } handler.handle(null); } } }); }
From source file:org.entcore.feeder.dictionary.structures.DuplicateUsers.java
License:Open Source License
private void calculateAndStoreScore(JsonObject searchUser, JsonArray findUsers, TransactionHelper tx) { String query = "MATCH (u:User {id : {sId}}), (d:User {id : {dId}}) " + "WHERE NOT({dId} IN coalesce(u.ignoreDuplicates, [])) AND NOT({sId} IN coalesce(d.ignoreDuplicates, [])) " + "AND (has(u.activationCode) OR has(d.activationCode)) " + "MERGE u-[:DUPLICATE {score:{score}}]-d "; JsonObject params = new JsonObject().put("sId", searchUser.getString("id")); final String lastName = cleanAttribute(searchUser.getString("lastName")); final String firstName = cleanAttribute(searchUser.getString("firstName")); final String birthDate = cleanAttribute(searchUser.getString("birthDate")); final String email = cleanAttribute(searchUser.getString("email")); final String source = searchUser.getString("source"); final Long disappearanceDate = searchUser.getLong("disappearanceDate"); for (int i = 0; i < findUsers.size(); i++) { int score = 2; JsonObject fu = findUsers.getJsonObject(i); score += exactMatch(lastName, cleanAttribute(fu.getString("lastName"))); score += exactMatch(firstName, cleanAttribute(fu.getString("firstName"))); score += exactMatch(birthDate, cleanAttribute(fu.getString("birthDate"))); score += exactMatch(email, cleanAttribute(fu.getString("email"))); if (score > 3 && ((!source.equals(fu.getString("source")) && (notDeduplicateSource.contains(source) ^ notDeduplicateSource.contains(fu.getString("source")))) || disappearanceDate != null || fu.getLong("disappearanceDate") != null)) { tx.add(query, params.copy().put("dId", fu.getString("id")).put("score", score)); }//from w w w .j ava 2 s .c om } }
From source file:org.entcore.feeder.dictionary.structures.Importer.java
License:Open Source License
public static void markMissingUsers(String structureExternalId, String currentSource, final Set<String> userImportedExternalId, final TransactionHelper transactionHelper, String prefix, final Handler<Void> handler) { String query;//from w ww.java2 s.c o m JsonObject params = new JsonObject().put("currentSource", currentSource); String filter = ""; if (isNotEmpty(prefix)) { filter = "AND u.externalId STARTS WITH {prefix} "; params.put("prefix", prefix); } if (structureExternalId != null) { query = "MATCH (:Structure {externalId : {externalId}})<-[:DEPENDS]-(:ProfileGroup)<-[:IN]-(u:User) " + "WHERE u.source = {currentSource} " + filter + "RETURN u.externalId as externalId"; params.put("externalId", structureExternalId); } else { query = "MATCH (u:User) WHERE u.source = {currentSource} " + filter + "RETURN u.externalId as externalId"; } TransactionManager.getNeo4jHelper().execute(query, params, new Handler<Message<JsonObject>>() { @Override public void handle(Message<JsonObject> message) { JsonArray res = message.body().getJsonArray("result"); if ("ok".equals(message.body().getString("status")) && res != null) { Set<String> existingUser = new TreeSet<>(); for (Object o : res) { if (!(o instanceof JsonObject)) continue; String externalId = ((JsonObject) o).getString("externalId"); if (externalId != null) { existingUser.add(externalId); } } existingUser.removeAll(userImportedExternalId); // set difference String q = // mark missing users "START u=node:node_auto_index(externalId={externalId}) " + "WHERE NOT(HAS(u.disappearanceDate)) " + "SET u.disappearanceDate = {date} "; JsonObject p = new JsonObject().put("date", System.currentTimeMillis()); for (String eId : existingUser) { transactionHelper.add(q, p.copy().put("externalId", eId)); } String q2 = // remove mark of imported users "START u=node:node_auto_index(externalId={externalId}) " + "WHERE HAS(u.disappearanceDate) " + "REMOVE u.disappearanceDate "; for (String eId : userImportedExternalId) { transactionHelper.add(q2, new JsonObject().put("externalId", eId)); } } handler.handle(null); } }); }
From source file:org.entcore.feeder.dictionary.structures.Structure.java
License:Open Source License
public void update(JsonObject struct) { if (this.struct.equals(struct)) { return;// w w w . j ava 2s. c o m } String query = "MATCH (s:Structure { externalId : {externalId}}) " + "WITH s " + "WHERE s.checksum IS NULL OR s.checksum <> {checksum} " + "SET " + Neo4jUtils.nodeSetPropertiesFromJson("s", struct, "id", "externalId", "created"); getTransaction().add(query, struct); if (this.struct.getString("name") != null && !this.struct.getString("name").equals(struct.getString("name"))) { String updateGroupsStructureName = "MATCH (s:Structure { externalId : {externalId}})<-[:DEPENDS]-(g:Group) " + "WHERE s.checksum = {checksum} and has(g.structureName) " + "SET g.structureName = {name} "; getTransaction().add(updateGroupsStructureName, struct); String updateGroupsName = "MATCH (s:Structure { externalId : {externalId}})<-[:DEPENDS]-(g:Group) " + "WHERE s.checksum = {checksum} and last(split(g.name, '-')) IN " + "['Student','Teacher','Personnel','Relative','Guest','AdminLocal','HeadTeacher', 'SCOLARITE'] " + "SET g.name = {name} + '-' + last(split(g.name, '-')), g.displayNameSearchField = {sanitizeName} "; getTransaction().add(updateGroupsName, struct.copy().put("sanitizeName", Validator.sanitize(struct.getString("name")))); } this.struct = struct; }
From source file:org.entcore.feeder.dictionary.structures.Transition.java
License:Open Source License
private void publishTransition(JsonObject struct, JsonArray classes) { if (struct == null) return;// w w w . j a v a2 s. c om final JsonObject structure = struct.copy(); structure.put("classes", classes); structure.remove("created"); structure.remove("modified"); structure.remove("checksum"); log.info("Publish transition : " + structure.encode()); vertx.eventBus().publish(Feeder.USER_REPOSITORY, new JsonObject().put("action", "transition").put("structure", structure)); }
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 a2 s .com*/ 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)); } } } } }
From source file:org.entcore.feeder.ManualFeeder.java
License:Open Source License
public void updateStructure(final Message<JsonObject> message) { JsonObject s = getMandatoryObject("data", message); if (s == null) return;/*w w w . j a v a2s . com*/ String structureId = getMandatoryString("structureId", message); if (structureId == null) return; final String error = structureValidator.modifiableValidate(s); if (error != null) { logger.error(error); sendError(message, error); } else { String query; JsonObject params = s.copy().put("structureId", structureId); if (s.getString("name") != null) { query = "MATCH (s:`Structure` { id : {structureId}})<-[:DEPENDS]-(g:Group) " + "WHERE last(split(g.name, '-')) IN ['Student','Teacher','Personnel','Relative','Guest','AdminLocal','HeadTeacher', 'SCOLARITE'] " + "SET g.name = {name} + '-' + last(split(g.name, '-')), g.displayNameSearchField = {sanitizeName}, "; params.put("sanitizeName", Validator.sanitize(s.getString("name"))); } else { query = "MATCH (s:`Structure` { id : {structureId}}) SET"; } query = query + Neo4jUtils.nodeSetPropertiesFromJson("s", s) + "RETURN DISTINCT s.id as id "; neo4j.execute(query, params, new Handler<Message<JsonObject>>() { @Override public void handle(Message<JsonObject> m) { message.reply(m.body()); } }); } }
From source file:org.entcore.feeder.timetable.AbstractTimetableImporter.java
License:Open Source License
private void persEducNatToClasses(JsonObject object) { final JsonArray classes = object.getJsonArray("classes"); if (classes != null) { final JsonObject params = new JsonObject().put("structureExternalId", structureExternalId) .put("classes", classes).put("source", getSource()) .put("outDate", DateTime.now().plusDays(1).getMillis()).put("now", importTimestamp); final JsonArray teacherIds = object.getJsonArray("teacherIds"); if (teacherIds != null && teacherIds.size() > 0) { params.put("profile", "Teacher"); for (Object id : teacherIds) { if (id != null) { txXDT.add(PERSEDUCNAT_TO_CLASSES, params.copy().put("id", id.toString())); }/*from w ww.j a v a 2 s . c o m*/ } } final JsonArray personnelIds = object.getJsonArray("personnelIds"); if (personnelIds != null && personnelIds.size() > 0) { params.put("profile", "Personnel"); for (Object id : personnelIds) { if (id != null) { txXDT.add(PERSEDUCNAT_TO_CLASSES, params.copy().put("id", id.toString())); } } } } }
From source file:org.entcore.feeder.timetable.AbstractTimetableImporter.java
License:Open Source License
private void end() { if (endHandler != null && countMongoQueries.get() == 0) { final JsonObject baseQuery = new JsonObject().put("structureId", structureId); if (txSuccess) { mongoDb.update(COURSES, baseQuery.copy().put("pending", importTimestamp), new JsonObject().put("$rename", new JsonObject().put("pending", "modified")), false, true, new Handler<Message<JsonObject>>() { @Override public void handle(Message<JsonObject> event) { if ("ok".equals(event.body().getString("status"))) { mongoDb.update(COURSES, baseQuery.copy().put("deleted", new JsonObject().put("$exists", false)) .put("modified", new JsonObject().put("$ne", importTimestamp)), new JsonObject().put("$set", new JsonObject().put("deleted", importTimestamp)), false, true, new Handler<Message<JsonObject>>() { @Override public void handle(Message<JsonObject> event) { if (!"ok".equals(event.body().getString("status"))) { report.addError("error.set.deleted.courses"); } endHandler.handle(new DefaultAsyncResult<>(report)); } }); } else { report.addError("error.renaming.pending"); endHandler.handle(new DefaultAsyncResult<>(report)); }/* ww w.j a v a2 s . co m*/ } }); } else { mongoDb.delete(COURSES, baseQuery.copy().put("pending", importTimestamp).put("modified", new JsonObject().put("$exists", false)), new Handler<Message<JsonObject>>() { @Override public void handle(Message<JsonObject> event) { if ("ok".equals(event.body().getString("status"))) { mongoDb.update(COURSES, baseQuery.copy().put("pending", importTimestamp), new JsonObject().put("$unset", new JsonObject().put("pending", "")), false, true, new Handler<Message<JsonObject>>() { @Override public void handle(Message<JsonObject> event) { if (!"ok".equals(event.body().getString("status"))) { report.addError("error.unset.pending"); } endHandler.handle(new DefaultAsyncResult<>(report)); } }); } else { report.addError("error.removing.inconsistencies.courses"); endHandler.handle(new DefaultAsyncResult<>(report)); } } }); } } }
From source file:org.entcore.feeder.timetable.AbstractTimetableImporter.java
License:Open Source License
protected void commit(final Handler<AsyncResult<Report>> handler) { final JsonObject params = new JsonObject().put("structureExternalId", structureExternalId) .put("source", getSource()).put("now", importTimestamp); persistBulKCourses();/*www . j a v a 2 s .com*/ txXDT.add(DELETE_SUBJECT, params.copy().put("subjects", new fr.wseduc.webutils.collections.JsonArray(new ArrayList<>(subjects.values())))); txXDT.add(UNLINK_SUBJECT, params); txXDT.add(UNLINK_GROUP, params); txXDT.add(DELETE_GROUPS, params); txXDT.add(UNSET_OLD_GROUPS, params); txXDT.add(SET_GROUPS, params); Importer.markMissingUsers(structureExternalId, getSource(), userImportedExternalId, txXDT, new Handler<Void>() { @Override public void handle(Void event) { Importer.restorePreDeletedUsers(getSource(), txXDT); txXDT.commit(new Handler<Message<JsonObject>>() { @Override public void handle(Message<JsonObject> event) { if (!"ok".equals(event.body().getString("status"))) { report.addError("error.commit.timetable.transaction"); } else { txSuccess = true; } endHandler = handler; end(); } }); } }); }