Example usage for io.vertx.core.json JsonArray add

List of usage examples for io.vertx.core.json JsonArray add

Introduction

In this page you can find the example usage for io.vertx.core.json JsonArray add.

Prototype

public JsonArray add(Object value) 

Source Link

Document

Add an Object to the JSON array.

Usage

From source file:org.entcore.feeder.csv.MappingFinder.java

License:Open Source License

private void findChildExternalIds(final String structureId, final String path, final String charset,
        final List<String> columns, final JsonArray errors, final Handler<JsonArray> handler) {
    final List<String[]> lines = new ArrayList<>();

    final JsonArray childLastNameIndex = new fr.wseduc.webutils.collections.JsonArray();
    final JsonArray childUsernameIndex = new fr.wseduc.webutils.collections.JsonArray();
    int idx = 0;/* w w w .j  a v a2s.  c  om*/
    for (String c : columns) {
        if ("childLastName".equals(c)) {
            childLastNameIndex.add(idx);
        } else if ("childUsername".equals(c)) {
            childUsernameIndex.add(idx);
        }
        idx++;
    }
    if (childLastNameIndex.size() == 0) {
        addError(errors, "missing.childLastName");
        handler.handle(errors);
        return;
    } else if (childUsernameIndex.size() != 0 && childLastNameIndex.size() != childUsernameIndex.size()) {
        addError(errors, "mismatch.childLastName.childUsername");
        handler.handle(errors);
        return;
    }

    final int maxNbChild = childLastNameIndex.size();
    final int appendIdx;
    if (childUsernameIndex.size() > 0) {
        appendIdx = childLastNameIndex.getInteger(0) > childUsernameIndex.getInteger(0)
                ? childUsernameIndex.getInteger(0)
                : childLastNameIndex.getInteger(0);
    } else {
        appendIdx = childLastNameIndex.getInteger(0);
    }
    final String query = "MATCH (s:Structure {externalId : {id}})<-[:DEPENDS]-(:ProfileGroup)<-[:IN]-(u:User) "
            + "WHERE u.firstNameSearchField = {firstName} AND u.lastNameSearchField = {lastName} AND head(u.profiles) = 'Student' "
            + "RETURN DISTINCT u.externalId as externalId, {rowIdx} as line, {itemIdx} as item ";
    final TransactionHelper tx;
    try {
        tx = TransactionManager.getTransaction();
    } catch (TransactionException e) {
        addError(errors, "transaction.error");
        handler.handle(errors);
        return;
    }
    try {
        CSVReader csvReader = getCsvReader(path, charset);
        String[] values;
        int rowIdx = 0;
        while ((values = csvReader.readNext()) != null) {
            if (emptyLine(values)) {
                continue;
            }

            final List<String> line = new LinkedList<>(Arrays.asList(values));
            for (int i = 0; i < maxNbChild; i++) {
                if (rowIdx == 0) {
                    line.add(appendIdx, "childExternalId");
                } else {
                    line.add(appendIdx, "");
                }
            }
            lines.add(line.toArray(new String[line.size()]));
            if (rowIdx == 0) {
                rowIdx++;
                continue;
            }

            final JsonArray firstNames = new fr.wseduc.webutils.collections.JsonArray();
            final JsonArray lastNames = new fr.wseduc.webutils.collections.JsonArray();
            try {
                int i = 0;
                for (String c : columns) {
                    if (i >= values.length)
                        break;
                    switch (c) {
                    case "childLastName":
                        lastNames.add(sanitize(values[i]));
                        break;
                    case "childFirstName":
                        firstNames.add(sanitize(values[i]));
                        break;
                    }
                    i++;
                }
            } catch (Exception e) {
                errors.add(new JsonObject().put("key", "parse.line.error").put("params",
                        new fr.wseduc.webutils.collections.JsonArray().add(Integer.toString(rowIdx))));
            }
            final int fns = firstNames.size();
            if (fns != lastNames.size()) {
                errors.add(new JsonObject().put("key", "child.lastName.firstName.mismatch").put("params",
                        new fr.wseduc.webutils.collections.JsonArray().add(Integer.toString(rowIdx))));
            } else if (fns > 0) {
                //               if (fns > maxNbChild) {
                //                  maxNbChild = fns;
                //               }
                for (int i = 0; i < fns; i++) {
                    JsonObject params = new JsonObject().put("id", structureId)
                            .put("firstName", firstNames.getString(i)).put("lastName", lastNames.getString(i))
                            .put("rowIdx", rowIdx).put("itemIdx", i);
                    tx.add(query, params);
                }
            }
            rowIdx++;
        }
    } catch (Exception e) {
        addError(errors, "error.read.file", path);
        handler.handle(errors);
    }
    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) {
                for (int i = 0; i < results.size(); i++) {
                    JsonArray item = results.getJsonArray(i);
                    if (item.size() == 1) { // Si 0 ou plusieurs utilisateurs, on laisse la ligne d'origine
                        String eId = item.getJsonObject(0).getString("externalId", "");
                        int lineIdx = item.getJsonObject(0).getInteger("line", -1);
                        int itemIdx = item.getJsonObject(0).getInteger("item", -1);
                        if (lineIdx > 0 && itemIdx >= 0) {
                            String[] line = lines.get(lineIdx);
                            line[itemIdx + appendIdx] = eId;
                            line[childLastNameIndex.getInteger(itemIdx) + maxNbChild] = "";
                            if (childUsernameIndex.size() > 0) {
                                line[childUsernameIndex.getInteger(itemIdx) + maxNbChild] = "";
                            }
                        }
                    }
                }
                vertx.fileSystem().deleteBlocking(path);

                try {
                    CSVWriter writer = getCsvWriter(path, charset);
                    writer.writeAll(lines);
                    writer.close();
                } catch (IOException e) {
                    log.error("Error writing file.", e);
                    addError(errors, "error.write.file", path);
                }
                handler.handle(errors);
            } else {
                addError(errors, "error.find.ids");
                handler.handle(errors);
            }
        }
    });
}

From source file:org.entcore.feeder.csv.MappingFinder.java

License:Open Source License

private void addError(JsonArray errors, String s, String... params) {
    JsonObject o = new JsonObject().put("key", s);
    errors.add(o);
    if (params.length > 0) {
        o.put("params", new fr.wseduc.webutils.collections.JsonArray(Arrays.asList(params)));
    }//w ww .j av a  2  s. c o m
}

From source file:org.entcore.feeder.dictionary.structures.DuplicateUsers.java

License:Open Source License

public void mergeBykeys(final Message<JsonObject> message) {
    final JsonObject error = new JsonObject().put("status", "error");
    final String originalUserId = message.body().getString("originalUserId");
    if (originalUserId == null || originalUserId.isEmpty()) {
        message.reply(error.put("message", "invalid.original.user"));
        return;/*  w ww . j a  va  2  s .  com*/
    }
    final JsonArray mergeKeys = message.body().getJsonArray("mergeKeys");
    if (mergeKeys == null || mergeKeys.size() < 1) {
        message.reply(error.put("message", "invalid.merge.keys"));
        return;
    }
    final JsonObject params = new JsonObject().put("userId", originalUserId);
    TransactionManager.getNeo4jHelper().execute("MATCH (u:User {id: {userId}}) RETURN u.mergeKey as mergeKey",
            params, new Handler<Message<JsonObject>>() {
                @Override
                public void handle(Message<JsonObject> event) {
                    JsonArray result = event.body().getJsonArray("result");
                    if ("ok".equals(event.body().getString("status")) && result.size() == 1) {
                        String mergeKey = result.getJsonObject(0).getString("mergeKey");
                        if (mergeKey != null && mergeKeys.contains(mergeKey)) {
                            final JsonArray tmp = new fr.wseduc.webutils.collections.JsonArray();
                            for (Object o : mergeKeys) {
                                if (!mergeKey.equals(o)) {
                                    tmp.add(o);
                                }
                            }
                            if (tmp.size() > 0) {
                                params.put("mergeKeys", tmp);
                            } else {
                                message.reply(error.put("message", "invalid.merge.keys"));
                                return;
                            }
                        } else {
                            params.put("mergeKeys", mergeKeys);
                        }
                        try {
                            TransactionHelper tx = TransactionManager.getTransaction();

                            tx.add("MATCH (u:User {id: {userId}}), (mu:User)-[rin:IN]->(gin:Group) "
                                    + "WHERE HEAD(u.profiles) = 'Relative' AND HEAD(mu.profiles) = 'Relative' "
                                    + "AND NOT(HAS(u.mergedWith)) AND mu.mergeKey IN {mergeKeys} "
                                    + "MERGE u-[:IN]->gin " + "DELETE rin ", params);
                            tx.add("MATCH (u:User {id: {userId}}), (mu:User)-[rcom:COMMUNIQUE]->(gcom:Group) "
                                    + "WHERE HEAD(u.profiles) = 'Relative' AND HEAD(mu.profiles) = 'Relative' "
                                    + "AND NOT(HAS(u.mergedWith)) AND mu.mergeKey IN {mergeKeys} "
                                    + "MERGE  u-[:COMMUNIQUE]->gcom " + "DELETE rcom ", params);
                            tx.add("MATCH (u:User {id: {userId}}), (mu:User)<-[rcomr:COMMUNIQUE]-(gcomr:Group) "
                                    + "WHERE HEAD(u.profiles) = 'Relative' AND HEAD(mu.profiles) = 'Relative' "
                                    + "AND NOT(HAS(u.mergedWith)) AND mu.mergeKey IN {mergeKeys} "
                                    + "MERGE u<-[:COMMUNIQUE]-gcomr " + "DELETE rcomr ", params);
                            tx.add("MATCH (u:User {id: {userId}}), (mu:User)-[rr:RELATED]->(ur:User) "
                                    + "WHERE HEAD(u.profiles) = 'Relative' AND HEAD(mu.profiles) = 'Relative' "
                                    + "AND NOT(HAS(u.mergedWith)) AND mu.mergeKey IN {mergeKeys} "
                                    + "MERGE u-[:RELATED]->ur " + "DELETE rr ", params);
                            tx.add("MATCH (u:User {id: {userId}}), (mu:User)<-[rrr:RELATED]-(urr:User) "
                                    + "WHERE HEAD(u.profiles) = 'Relative' AND HEAD(mu.profiles) = 'Relative' "
                                    + "AND NOT(HAS(u.mergedWith)) AND mu.mergeKey IN {mergeKeys} "
                                    + "MERGE u<-[:RELATED]-urr " + "DELETE rrr ", params);
                            tx.add("MATCH (u:User {id: {userId}}), (mu:User) "
                                    + "WHERE HEAD(u.profiles) = 'Relative' AND HEAD(mu.profiles) = 'Relative' "
                                    + "AND NOT(HAS(u.mergedWith)) AND mu.mergeKey IN {mergeKeys} " + // AND LENGTH(mu.joinKey) < 2  " +
                            "SET mu.mergedWith = {userId}, mu.mergeKey = null, u.mergedLogins = coalesce(u.mergedLogins, []) + mu.login "
                                    +
                            //               ", u.joinKey =  FILTER(eId IN u.joinKey WHERE eId <> mu.externalId) + mu.externalId " +
                            "MERGE mu-[:MERGED]->u " + "RETURN u.mergedLogins as mergedLogins ", params);
                            tx.commit(new Handler<Message<JsonObject>>() {
                                @Override
                                public void handle(Message<JsonObject> event) {
                                    message.reply(event.body());
                                }
                            });
                        } catch (TransactionException e) {
                            log.error("transaction.error", e);
                            message.reply(error.put("message", "transaction.error"));
                        }
                    } else {
                        message.reply(error.put("message", "user.not.found"));
                    }
                }
            });

}

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 w  w w . j a v a2  s  .  c o  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.Importer.java

License:Open Source License

public void createOrUpdateGuest(JsonObject object, String[][] linkClasses) {
    final String error = userValidator.validate(object);
    if (error != null) {
        report.addIgnored("Guest", error, object);
        log.warn(error);//  w  ww.  j  ava 2 s.  co m
    } else {
        object.put("source", currentSource);
        final String externalId = object.getString("externalId");
        userImportedExternalId.add(externalId);
        String query = "MERGE (u:User { externalId : {externalId}}) "
                + "ON CREATE SET u.id = {id}, u.login = {login}, u.activationCode = {activationCode}, "
                + "u.displayName = {displayName}, u.created = {created} " + "WITH u "
                + "WHERE u.checksum IS NULL OR u.checksum <> {checksum} " + "SET "
                + Neo4jUtils.nodeSetPropertiesFromJson("u", object, "id", "externalId", "login",
                        "activationCode", "displayName", "email", "created");
        transactionHelper.add(query, object);
        checkUpdateEmail(object);
        JsonArray structures = getMappingStructures(object.getJsonArray("structures"));
        if (externalId != null && structures != null && structures.size() > 0) {
            JsonObject p = new JsonObject().put("userExternalId", externalId);
            String q1 = "MATCH (s:Structure)<-[:DEPENDS]-(g:ProfileGroup)-[:HAS_PROFILE]->(p:Profile), "
                    + "(:User { externalId : {userExternalId}})-[:MERGED*0..1]->(u:User) "
                    + "USING INDEX s:Structure(externalId) " + "USING INDEX p:Profile(externalId) "
                    + "WHERE s.externalId IN {structuresAdmin} "
                    + "AND p.externalId = {profileExternalId} AND NOT(HAS(u.mergedWith)) " + "MERGE u-[:IN]->g";
            p.put("structuresAdmin", structures).put("profileExternalId",
                    DefaultProfiles.GUEST_PROFILE_EXTERNAL_ID);
            transactionHelper.add(q1, 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", structures);
            transactionHelper.add(qs, ps);
        }
        if (externalId != null && linkClasses != null) {
            JsonArray classes = new fr.wseduc.webutils.collections.JsonArray();
            for (String[] structClass : linkClasses) {
                if (structClass != null && structClass[0] != null && structClass[1] != null) {
                    String q = "MATCH (s:Structure)<-[:BELONGS]-(c:Class)<-[:DEPENDS]-(g:ProfileGroup)"
                            + "-[:DEPENDS]->(pg:ProfileGroup)-[:HAS_PROFILE]->(p:Profile), "
                            + "(:User { externalId : {userExternalId}})-[:MERGED*0..1]->(u:User) "
                            + "USING INDEX s:Structure(externalId) " + "USING INDEX p:Profile(externalId) "
                            + "WHERE s.externalId = {structure} AND c.externalId = {class} "
                            + "AND p.externalId = {profileExternalId} AND NOT(HAS(u.mergedWith)) "
                            + "MERGE u-[:IN]->g";
                    JsonObject p = new JsonObject().put("userExternalId", externalId)
                            .put("profileExternalId", DefaultProfiles.GUEST_PROFILE_EXTERNAL_ID)
                            .put("structure", structClass[0]).put("class", structClass[1]);
                    transactionHelper.add(q, p);
                    classes.add(structClass[1]);
                }
            }
            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);
        }
    }
}

From source file:org.entcore.feeder.dictionary.structures.Importer.java

License:Open Source License

public void createOrUpdateStudent(JsonObject object, String profileExternalId, String module,
        JsonArray fieldOfStudy, String[][] linkClasses, String[][] linkGroups, JsonArray relative,
        boolean nodeQueries, boolean relationshipQueries) {
    final String error = studentValidator.validate(object);
    if (error != null) {
        report.addIgnored("Student", error, object);
        log.warn(error);/*from w  w  w .j  av a 2 s.c  om*/
    } else {
        if (nodeQueries) {
            object.put("source", currentSource);
            userImportedExternalId.add(object.getString("externalId"));
            String query = "MERGE (u:`User` { externalId : {externalId}}) "
                    + "ON CREATE SET u.id = {id}, u.login = {login}, u.activationCode = {activationCode}, "
                    + "u.displayName = {displayName}, u.created = {created} " + "WITH u "
                    + "WHERE u.checksum IS NULL OR u.checksum <> {checksum} " + "SET "
                    + Neo4jUtils.nodeSetPropertiesFromJson("u", object, "id", "externalId", "login",
                            "activationCode", "displayName", "email", "created");
            transactionHelper.add(query, object);
            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}})<-[:DEPENDS]-(g:ProfileGroup)-[:HAS_PROFILE]->(p:Profile {externalId : {profileExternalId}}), "
                            + "(u:User { externalId : {userExternalId}}) " + "WHERE NOT(HAS(u.mergedWith)) "
                            + "MERGE u-[:ADMINISTRATIVE_ATTACHMENT]->s " + "WITH u, g " + "MERGE u-[:IN]->g";
                    p.put("structureAdmin", structures.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-[:ADMINISTRATIVE_ATTACHMENT]->s " + "WITH u, g " + "MERGE u-[:IN]->g";
                    p.put("structuresAdmin", structures).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", structures);
                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);
            }
            JsonArray classes = new fr.wseduc.webutils.collections.JsonArray();
            if (externalId != null && linkClasses != null) {
                for (String[] structClass : linkClasses) {
                    if (structClass != null && structClass[0] != null && structClass[1] != null) {
                        classes.add(structClass[1]);
                    }
                }
                String query = "MATCH (c:Class)<-[:DEPENDS]-(g:ProfileGroup)"
                        + "-[:DEPENDS]->(:ProfileGroup)-[:HAS_PROFILE]->(: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);
            }
            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();
            if (externalId != null && linkGroups != null) {
                for (String[] structGroup : linkGroups) {
                    if (structGroup != null && structGroup[0] != null && structGroup[1] != null) {
                        groups.add(structGroup[1]);
                    }
                }
                String query = "MATCH (g:FunctionalGroup), (u:User { externalId : {userExternalId}}) "
                        + "WHERE g.externalId IN {groups} AND NOT(HAS(u.mergedWith)) " + "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:FunctionalGroup) "
                        + "WHERE 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);
            }

            if (externalId != null && module != null) {
                String query = "MATCH (u:User {externalId:{userExternalId}}), "
                        + "(m:Module {externalId:{moduleStudent}}) " + "MERGE u-[:FOLLOW]->m";
                JsonObject p = new JsonObject().put("userExternalId", externalId).put("moduleStudent", module);
                transactionHelper.add(query, p);
            }
            if (externalId != null && fieldOfStudy != null && fieldOfStudy.size() > 0) {
                String query = "MATCH (u:User {externalId:{userExternalId}}), (f:FieldOfStudy) "
                        + "WHERE f.externalId IN {fieldOfStudyStudent} " + "MERGE u-[:COURSE]->f";
                JsonObject p = new JsonObject().put("userExternalId", externalId).put("fieldOfStudyStudent",
                        fieldOfStudy);
                transactionHelper.add(query, p);
            }
            if (externalId != null && relative != null && relative.size() > 0) {
                String query2 = "MATCH (:User {externalId:{userExternalId}})-[r:RELATED]->(p:User) "
                        + "WHERE NOT(p.externalId IN {relatives}) " + "DELETE r ";
                JsonObject p2 = new JsonObject().put("userExternalId", externalId).put("relatives", relative);
                transactionHelper.add(query2, p2);
                for (Object o : relative) {
                    if (!(o instanceof String))
                        continue;
                    String query = "MATCH (u:User {externalId:{userExternalId}}), "
                            + "(:User {externalId:{user}})-[:MERGED*0..1]->(r:User) "
                            + "WHERE NOT(HAS(r.mergedWith)) " + "MERGE u-[:RELATED]->r " + "WITH r, u "
                            + "WHERE {user} <> r.externalId AND LENGTH(FILTER(eId IN u.relative WHERE eId STARTS WITH r.externalId)) = 0 "
                            + "SET u.relative = coalesce(u.relative, []) + (r.externalId + '$10$1$1$0$0') ";
                    JsonObject p = new JsonObject().put("userExternalId", externalId).put("user", (String) o);
                    transactionHelper.add(query, p);
                }
            }
        }
    }
}

From source file:org.entcore.feeder.dictionary.structures.Structure.java

License:Open Source License

public synchronized Object[] addJointure(String externalId) {
    if (struct != null) {
        JsonArray joinKey = struct.getJsonArray("joinKey");
        if (joinKey == null) {
            joinKey = new fr.wseduc.webutils.collections.JsonArray();
            struct.put("joinKey", joinKey);
        }//from  w  w w.ja  v a2  s .  co  m
        joinKey.add(externalId);
        String query = "MATCH (s:Structure {externalId: {externalId}}) " + "SET s.joinKey = {joinKey} ";
        JsonObject params = new JsonObject().put("joinKey", joinKey).put("externalId", getExternalId());
        getTransaction().add(query, params);
        return joinKey.getList().toArray();
    }
    return null;
}

From source file:org.entcore.feeder.dictionary.users.AbstractUser.java

License:Open Source License

public static JsonArray getUserMappingStructures(JsonArray structures, Map<String, String> externalIdMapping) {
    if (structures != null) {
        JsonArray ms = new fr.wseduc.webutils.collections.JsonArray();
        for (Object s : structures) {
            String externalId = externalIdMapping.get(s.toString());
            ms.add(((externalId != null && !externalId.trim().isEmpty()) ? externalId : s));
        }//  www.  j  a v a 2s .c  om
        return ms;
    }
    return null;
}

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 {//  ww  w.ja v  a  2  s  .co  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));
                }
            }
        }
    }
}

From source file:org.entcore.feeder.timetable.AbstractTimetableImporter.java

License:Open Source License

private void persEducNatToGroups(JsonObject object) {
    final JsonArray groups = object.getJsonArray("groups");
    if (groups != null) {
        final JsonArray teacherIds = object.getJsonArray("teacherIds");
        final List<String> ids = new ArrayList<>();
        if (teacherIds != null) {
            ids.addAll(teacherIds.getList());
        }/*from   ww w. j a  v a  2 s  .  co m*/
        final JsonArray personnelIds = object.getJsonArray("personnelIds");
        if (personnelIds != null) {
            ids.addAll(personnelIds.getList());
        }
        if (!ids.isEmpty()) {
            final JsonArray g = new fr.wseduc.webutils.collections.JsonArray();
            for (Object o : groups) {
                g.add(structureExternalId + "$" + o.toString());
            }
            for (String id : ids) {
                txXDT.add(PERSEDUCNAT_TO_GROUPS,
                        new JsonObject().put("groups", g).put("id", id).put("source", getSource())
                                .put("outDate", DateTime.now().plusDays(1).getMillis())
                                .put("now", importTimestamp));
            }
        }
    }
}