org.entcore.feeder.utils.AAFUtil.java Source code

Java tutorial

Introduction

Here is the source code for org.entcore.feeder.utils.AAFUtil.java

Source

/*
 * Copyright  "Open Digital Education", 2014
 *
 * This program is published by "Open Digital Education".
 * You must indicate the name of the software and the company in any production /contribution
 * using the software and indicate on the home page of the software industry in question,
 * "powered by Open Digital Education" with a reference to the website: https://opendigitaleducation.com/.
 *
 * This program is free software, licensed under the terms of the GNU Affero General Public License
 * as published by the Free Software Foundation, version 3 of the License.
 *
 * You can redistribute this application and/or modify it since you respect the terms of the GNU Affero General Public License.
 * If you modify the source code and then use this modified source code in your creation, you must make available the source code of your modifications.
 *
 * You should have received a copy of the GNU Affero General Public License along with the software.
 * If not, please see : <http://www.gnu.org/licenses/>. Full compliance requires reading the terms of this license and following its directives.
    
 */

package org.entcore.feeder.utils;

import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;

import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import static fr.wseduc.webutils.Utils.getOrElse;
import static fr.wseduc.webutils.Utils.isEmpty;
import static fr.wseduc.webutils.Utils.isNotEmpty;

public class AAFUtil {

    private static final Pattern datePatter = Pattern.compile("^([0-9]{4})-([0-9]{2})-([0-9]{2})$");
    private static final JsonObject functionCodes = new JsonObject().put("ADMIN_LOCAL", "AL");
    private static final Pattern frenchDatePatter = Pattern.compile("^([0-9]{2})/([0-9]{2})/([0-9]{4})$");
    private static final List<String> groupImportsList = Arrays.asList("AAF", "EDT", "UDT");

    public static Object convert(Object value, String type) {
        if (value == null && !"groups-source".equals(type)) {
            return "";
        }
        if (type == null) {
            return value;
        }
        Object res;
        try {
            switch (type) {
            case "boolean-ON":
                res = ((boolean) value) ? "O" : "N";
                break;
            case "head-array":
                res = ((JsonArray) value).getValue(0);
                break;
            case "date":
                Matcher m = datePatter.matcher(value.toString());
                if (m.find()) {
                    res = m.group(3) + "/" + m.group(2) + "/" + m.group(1);
                } else {
                    res = value;
                }
                break;
            case "siecle":
                res = siecleConverter((JsonArray) value);
                break;
            case "functions-etab":
                res = functionsEtabConverter((JsonArray) value);
                break;
            case "structure-to-function":
                res = structureToFunction((JsonArray) value);
                break;
            case "groups-source":
                res = groupsSource(value);
                break;
            case "functionalGroup":
                res = functionalGroupConverter(value);
                break;
            default:
                res = value;
            }
        } catch (RuntimeException e) {
            res = value;
        }
        return res;
    }

    private static Object functionalGroupConverter(Object value) {
        final JsonArray res = new JsonArray();
        if (value instanceof JsonArray) {
            for (Object o : ((JsonArray) value)) {
                if (o instanceof JsonObject) {
                    final JsonObject j = (JsonObject) o;
                    final String structureExternalId = j.getString("structureExternalId");
                    if (isNotEmpty(structureExternalId)) {
                        final String idrgpmt = j.getString("idrgpmt");
                        final String name = j.getString("name");
                        if (isNotEmpty(idrgpmt)) {
                            res.add(structureExternalId + "$" + name + "$" + idrgpmt);
                        } else if (isNotEmpty(j.getString("idgpe"))) {
                            if (!getOrElse(j.getBoolean("usedInCourses"), false))
                                continue;
                            final String code = j.getString("code");
                            if (isNotEmpty(code) && isNotEmpty(j.getString("code_gep"))) {
                                res.add(structureExternalId + "$" + j.getString("code_gep") + "_" + code + "$"
                                        + j.getString("idgpe"));
                            } else if (isNotEmpty(code) && isNotEmpty(j.getString("code_div"))) {
                                res.add(structureExternalId + "$" + j.getString("code_div") + "_" + code + "$"
                                        + j.getString("idgpe"));
                            }
                        } else if (isEmpty(j.getString("externalId")) && isNotEmpty(name)) {
                            res.add(structureExternalId + "$" + name + "$" + j.getString("id"));
                        } else if (isNotEmpty(j.getString("externalId"))) {
                            res.add(j.getString("externalId") + "$" + j.getString("id"));
                        }
                    }
                }
            }
        }
        return res;
    }

    private static Object groupsSource(Object value) {
        if (value instanceof String) {
            return groupImportsList.contains(value.toString()) ? value : "";
        }
        return "AAF";
    }

    private static Object structureToFunction(JsonArray value) {
        JsonArray res = new fr.wseduc.webutils.collections.JsonArray();
        if (value != null) {
            for (Object o : value) {
                if (o != null && !o.toString().isEmpty()) {
                    res.add("EtabEducNat$" + o.toString() + "$UI");
                }
            }
        }
        return res;
    }

    private static JsonArray functionsEtabConverter(JsonArray value) {
        JsonArray res = new fr.wseduc.webutils.collections.JsonArray();
        for (Object o : value) {
            if (!(o instanceof JsonArray))
                continue;
            JsonArray a = (JsonArray) o;
            final String c = a.getString(0);
            if (c != null) {
                final String code = functionCodes.getString(c, c);
                for (Object s : a.getJsonArray(1)) {
                    res.add("EtabEducNat$" + s + "$" + code);
                }
            }
        }
        return res;
    }

    private static JsonObject siecleConverter(JsonArray value) {
        JsonObject res = new JsonObject();
        JsonArray ENTEleveParents = new fr.wseduc.webutils.collections.JsonArray();
        Set<String> ENTEleveAutoriteParentale = new HashSet<>();
        String ENTEleveAutoriteParentale1 = "";
        String ENTEleveAutoriteParentale2 = "";
        String ENTElevePersRelEleve1 = "";
        String ENTEleveQualitePersRelEleve1 = "";
        String ENTElevePersRelEleve2 = "";
        String ENTEleveQualitePersRelEleve2 = "";

        // prevent missing "ENTEleveAutoriteParentale" if item is duplicate
        if (value.size() > 2) {
            final Map<String, String> tmp = new HashMap<>();
            for (Object o : value) {
                final String[] s = ((String) o).split("\\$", 2);
                final String v = tmp.get(s[0]);
                if (v == null || "1$1$1$1$0".equals(v)) {
                    tmp.put(s[0], s[1]);
                }
            }
            JsonArray tmpArray = new fr.wseduc.webutils.collections.JsonArray();
            for (Map.Entry<String, String> e : tmp.entrySet()) {
                tmpArray.add(e.getKey() + "$" + e.getValue());
            }
            value = tmpArray;
        }

        for (Object o : value) {
            String[] s = ((String) o).split("\\$");
            if ("1".equals(s[1]) || "2".equals(s[1]) || "10".equals(s[1]) || "20".equals(s[1])) {
                if (!ENTEleveParents.contains(s[0])) {
                    ENTEleveParents.add(s[0]);
                }
            } else if ("1".equals(s[2]) || "1".equals(s[4]) || "1".equals(s[5])) {
                if ("1".equals(s[2])) {
                    if (ENTElevePersRelEleve1 == null || ENTElevePersRelEleve1.isEmpty()) {
                        ENTElevePersRelEleve1 = s[0];
                        ENTEleveQualitePersRelEleve1 = "FINANCIER";
                    } else if (ENTElevePersRelEleve2 == null || ENTElevePersRelEleve2.isEmpty()) {
                        ENTElevePersRelEleve2 = s[0];
                        ENTEleveQualitePersRelEleve2 = "FINANCIER";
                    } else if ("PAIEMENT".equals(ENTEleveQualitePersRelEleve1)) {
                        ENTElevePersRelEleve1 = s[0];
                        ENTEleveQualitePersRelEleve1 = "FINANCIER";
                    } else if ("PAIEMENT".equals(ENTEleveQualitePersRelEleve2)) {
                        ENTElevePersRelEleve2 = s[0];
                        ENTEleveQualitePersRelEleve2 = "FINANCIER";
                    }
                } else if ("1".equals(s[4])) {
                    if (ENTElevePersRelEleve1 == null || ENTElevePersRelEleve1.isEmpty()) {
                        ENTElevePersRelEleve1 = s[0];
                        ENTEleveQualitePersRelEleve1 = "CONTACT";
                    } else if (ENTElevePersRelEleve2 == null || ENTElevePersRelEleve2.isEmpty()) {
                        ENTElevePersRelEleve2 = s[0];
                        ENTEleveQualitePersRelEleve2 = "CONTACT";
                    } else if ("PAIEMENT".equals(ENTEleveQualitePersRelEleve1)) {
                        ENTElevePersRelEleve1 = s[0];
                        ENTEleveQualitePersRelEleve1 = "CONTACT";
                    } else if ("PAIEMENT".equals(ENTEleveQualitePersRelEleve2)) {
                        ENTElevePersRelEleve2 = s[0];
                        ENTEleveQualitePersRelEleve2 = "CONTACT";
                    }
                } else if ("1".equals(s[5])) {
                    if (ENTElevePersRelEleve1 == null || ENTElevePersRelEleve1.isEmpty()) {
                        ENTElevePersRelEleve1 = s[0];
                        ENTEleveQualitePersRelEleve1 = "PAIEMENT";
                    } else if (ENTElevePersRelEleve2 == null || ENTElevePersRelEleve2.isEmpty()) {
                        ENTElevePersRelEleve2 = s[0];
                        ENTEleveQualitePersRelEleve2 = "PAIEMENT";
                    }
                }
            }
            if ("1".equals(s[3])) {
                if (isEmpty(ENTEleveAutoriteParentale1)) {
                    ENTEleveAutoriteParentale1 = s[0];
                }
                ENTEleveAutoriteParentale.add(s[0]);
            }
            if (isEmpty(ENTEleveAutoriteParentale2) && "2".equals(s[3])) {
                ENTEleveAutoriteParentale2 = s[0];
            }
        }

        if (!ENTEleveAutoriteParentale1.isEmpty()
                && !ENTEleveAutoriteParentale.contains(ENTEleveAutoriteParentale1)) {
            ENTEleveAutoriteParentale.add(ENTEleveAutoriteParentale1);
        }
        if (!ENTEleveAutoriteParentale2.isEmpty()
                && !ENTEleveAutoriteParentale.contains(ENTEleveAutoriteParentale2)) {
            ENTEleveAutoriteParentale.add(ENTEleveAutoriteParentale2);
        }
        res.put("ENTEleveParents", ENTEleveParents);
        res.put("ENTEleveAutoriteParentale",
                new fr.wseduc.webutils.collections.JsonArray(new ArrayList<>(ENTEleveAutoriteParentale)));
        res.put("ENTElevePersRelEleve1", ENTElevePersRelEleve1);
        res.put("ENTEleveQualitePersRelEleve1", ENTEleveQualitePersRelEleve1);
        res.put("ENTElevePersRelEleve2", ENTElevePersRelEleve2);
        res.put("ENTEleveQualitePersRelEleve2", ENTEleveQualitePersRelEleve2);
        res.put("ENTElevePersRelEleve", value);
        return res;
    }

    public static String convertDate(String s) {
        Matcher m = frenchDatePatter.matcher(s);
        if (m.find()) {
            return m.group(3) + "-" + m.group(2) + "-" + m.group(1);
        }
        return s;
    }

}