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

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

Introduction

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

Prototype

public int size() 

Source Link

Document

Get the number of values in this JSON array

Usage

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;/*from   ww  w  . j a va2s  .co  m*/
    }
    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 searchDuplicatesByProfile(String last, final String profile, final Handler<Void> handler) {
    String query = "MATCH (u:User) WHERE u.modified > {lastSearchDuplicate} AND HEAD(u.profiles) = {profile} 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";
    JsonObject params = new JsonObject().put("profile", profile).put("lastSearchDuplicate", last);
    TransactionManager.getNeo4jHelper().execute(query, params, new Handler<Message<JsonObject>>() {
        @Override/*from  w w w.j av a2  s  .c om*/
        public void handle(Message<JsonObject> event) {
            JsonArray result = event.body().getJsonArray("result");
            if ("ok".equals(event.body().getString("status")) && result != null && result.size() > 0) {
                scoreDuplicates(profile, result, handler);
            } else {
                if ("ok".equals(event.body().getString("status"))) {
                    log.info("No users findings for search duplicates");
                } 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 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;/*  w  ww  .  j av  a 2 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.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));
        }/*  w  w w  .j a v  a2s  .  com*/
    }
}

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

License:Open Source License

public void autoMergeDuplicatesInStructure(final Handler<AsyncResult<JsonArray>> handler) {
    final Handler<JsonObject> duplicatesHandler = new Handler<JsonObject>() {
        @Override/*  w  w  w.j a  v a 2s.c o m*/
        public void handle(JsonObject duplicatesRes) {
            JsonArray res = duplicatesRes.getJsonArray("result");
            if ("ok".equals(duplicatesRes.getString("status")) && res != null && res.size() > 0) {
                try {
                    final TransactionHelper tx = TransactionManager.getTransaction();
                    final AtomicInteger count = new AtomicInteger(res.size());
                    final Handler<JsonObject> mergeHandler = new Handler<JsonObject>() {
                        @Override
                        public void handle(JsonObject event) {
                            decrementCount(count, tx);
                        }
                    };
                    for (Object o : res) {
                        if (!(o instanceof JsonObject)) {
                            decrementCount(count, tx);
                            continue;
                        }
                        JsonObject j = (JsonObject) o;
                        JsonObject u1 = j.getJsonObject("user1");
                        JsonObject u2 = j.getJsonObject("user2");
                        if (u1 != null && u2 != null) {
                            mergeDuplicate(new ResultMessage(mergeHandler).put("userId1", u1.getString("id"))
                                    .put("userId2", u2.getString("id")), tx);
                            log.info("AutoMerge duplicates - u1 : " + u1.encode() + ", u2 : " + u2.encode());
                        } else {
                            decrementCount(count, tx);
                        }
                    }
                } catch (TransactionException e) {
                    log.error("Error in automerge transaction", e);
                    handler.handle(new DefaultAsyncResult<JsonArray>(e));
                }
            } else {
                log.info("No duplicates automatically mergeable.");
                handler.handle(new DefaultAsyncResult<>(new fr.wseduc.webutils.collections.JsonArray()));
            }
        }

        private void decrementCount(AtomicInteger count, TransactionHelper tx) {
            if (count.decrementAndGet() == 0) {
                tx.commit(new Handler<Message<JsonObject>>() {
                    @Override
                    public void handle(Message<JsonObject> event) {
                        if ("ok".equals(event.body().getString("status"))) {
                            if (updateCourses) {
                                AbstractTimetableImporter
                                        .updateMergedUsers(event.body().getJsonArray("results"));
                            }
                            handler.handle(new DefaultAsyncResult<>(event.body().getJsonArray("results")));
                        } else {
                            log.error("Error in automerge duplicates transaction : "
                                    + event.body().getString("message"));
                            handler.handle(new DefaultAsyncResult<JsonArray>(
                                    new TransactionException(event.body().getString("message"))));
                        }
                    }
                });
            }
        }
    };
    listDuplicates(new ResultMessage(duplicatesHandler).put("minScore", 5)
            .put("inSameStructure", autoMergeOnlyInSameStructure).put("inherit", false));
}

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

License:Open Source License

static void loadData(final Neo4j neo4j, final Handler<Message<JsonObject>> handler) {
    String query = "MATCH (s:Structure) " + "OPTIONAL MATCH s<-[:DEPENDS]-(g:Group) "
            + "OPTIONAL MATCH s<-[:BELONGS]-(c:Class) "
            + "return s, collect(distinct g.externalId) as groups, collect(distinct c.externalId) as classes ";
    neo4j.execute(query, new JsonObject(), new Handler<Message<JsonObject>>() {
        @Override//from   ww w .j a v a 2  s. c  om
        public void handle(Message<JsonObject> message) {
            String query = "MATCH (p:Profile) " + "OPTIONAL MATCH p<-[:COMPOSE]-(f:Function) "
                    + "return p, collect(distinct f.externalId) as functions ";
            final AtomicInteger count = new AtomicInteger(2);
            neo4j.execute(query, new JsonObject(), 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) {
                        for (Object o : res) {
                            if (!(o instanceof JsonObject))
                                continue;
                            JsonObject r = (JsonObject) o;
                            JsonObject p = r.getJsonObject("p", new JsonObject()).getJsonObject("data");
                            profiles.putIfAbsent(p.getString("externalId"),
                                    new Profile(p, r.getJsonArray("functions")));
                        }
                    }
                    if (handler != null && count.decrementAndGet() == 0) {
                        handler.handle(message);
                    }
                }
            });
            JsonArray res = message.body().getJsonArray("result");
            if ("ok".equals(message.body().getString("status")) && res != null) {
                for (Object o : res) {
                    if (!(o instanceof JsonObject))
                        continue;
                    JsonObject r = (JsonObject) o;
                    JsonObject s = r.getJsonObject("s", new JsonObject()).getJsonObject("data");
                    Structure structure = new Structure(s, r.getJsonArray("groups"), r.getJsonArray("classes"));
                    String externalId = s.getString("externalId");
                    structures.putIfAbsent(externalId, structure);
                    String UAI = s.getString("UAI");
                    if (UAI != null && !UAI.trim().isEmpty()) {
                        structuresByUAI.putIfAbsent(UAI, structure);
                    }
                    JsonArray joinKeys = s.getJsonArray("joinKey");
                    if (joinKeys != null && joinKeys.size() > 0) {
                        for (Object key : joinKeys) {
                            externalIdMapping.putIfAbsent(key.toString(), externalId);
                        }
                    }
                }
            }
            if (handler != null && count.decrementAndGet() == 0) {
                handler.handle(message);
            }
        }
    });
}

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

License:Open Source License

public void createOrUpdateUser(JsonObject object, JsonArray linkStudent, boolean linkRelativeWithoutChild) {
    final String error = userValidator.validate(object);
    if (error != null) {
        report.addIgnored("Relative", error, object);
        log.warn(error);/*from   w w w  .  j  a  v a2s .c o m*/
    } else {
        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 (linkStudent != null && linkStudent.size() > 0) {
            String query2 = "START u0=node:node_auto_index(externalId={externalId}), "
                    + "s=node:node_auto_index({studentExternalIds}) " + "MATCH u0-[:MERGED*0..1]->u "
                    + "WHERE NOT(HAS(u.mergedWith)) " + "MERGE u<-[:RELATED]-s ";
            JsonObject p = new JsonObject().put("externalId", object.getString("externalId"))
                    .put("studentExternalIds", "externalId:" + Joiner.on(" OR externalId:").join(linkStudent));
            transactionHelper.add(query2, p);
        } else if (linkRelativeWithoutChild) {
            final String externalId = object.getString("externalId");
            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.RELATIVE_PROFILE_EXTERNAL_ID);
                transactionHelper.add(q1, p);
            }
        }
    }
}

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);//from   w ww.ja v  a  2 s.c  om
    } 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  ww .  j ava2s . c o m*/
    } 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.PostImport.java

License:Open Source License

private void wsCall(JsonObject object) {
    for (String url : object.fieldNames()) {
        final JsonArray endpoints = object.getJsonArray(url);
        if (endpoints == null || endpoints.size() < 1)
            continue;
        try {/*www . j  ava2 s . c  om*/
            final URI uri = new URI(url);
            HttpClientOptions options = new HttpClientOptions().setDefaultHost(uri.getHost())
                    .setDefaultPort(uri.getPort()).setMaxPoolSize(16).setSsl("https".equals(uri.getScheme()))
                    .setConnectTimeout(10000).setKeepAlive(false);
            final HttpClient client = vertx.createHttpClient(options);

            final Handler[] handlers = new Handler[endpoints.size() + 1];
            handlers[handlers.length - 1] = new Handler<Void>() {
                @Override
                public void handle(Void v) {
                    client.close();
                }
            };
            for (int i = endpoints.size() - 1; i >= 0; i--) {
                final int ji = i;
                handlers[i] = new Handler<Void>() {
                    @Override
                    public void handle(Void v) {
                        final JsonObject j = endpoints.getJsonObject(ji);
                        logger.info("endpoint : " + j.encode());
                        final HttpClientRequest req = client.request(HttpMethod.valueOf(j.getString("method")),
                                j.getString("uri"), new Handler<HttpClientResponse>() {
                                    @Override
                                    public void handle(HttpClientResponse resp) {
                                        if (resp.statusCode() >= 300) {
                                            logger.warn("Endpoint " + j.encode() + " error : "
                                                    + resp.statusCode() + " " + resp.statusMessage());
                                        }
                                        handlers[ji + 1].handle(null);
                                    }
                                });
                        JsonObject headers = j.getJsonObject("headers");
                        if (headers != null && headers.size() > 0) {
                            for (String h : headers.fieldNames()) {
                                req.putHeader(h, headers.getString(h));
                            }
                        }
                        req.exceptionHandler(
                                e -> logger.error("Error in ws call post import : " + j.encode(), e));
                        if (j.getString("body") != null) {
                            req.end(j.getString("body"));
                        } else {
                            req.end();
                        }
                    }
                };
            }
            handlers[0].handle(null);
        } catch (URISyntaxException e) {
            logger.error("Invalid uri in ws call after import : " + url, e);
        }
    }
}