package com.megatim.fdxconsultation.service.impl.startup; import com.bekosoftware.genericdaolayer.dao.tools.RestrictionsContainer; import com.megatim.fdxcommons.core.ifaces.helper.DataInMemoryHandler; import com.megatim.fdxcommons.model.enumeration.TypeOperation; import com.megatim.fdxcommons.tools.context.AppContext; import com.megatim.fdxconsultation.tools.CommonTools; import com.megatim.fdxconsultation.core.ifaces.administration.ActionManager; import com.megatim.fdxconsultation.core.ifaces.administration.RoleManager; import com.megatim.fdxconsultation.core.ifaces.administration.UserManager; import com.megatim.fdxconsultation.core.ifaces.configuration.CodeStatutHttpManager; import com.megatim.fdxconsultation.model.administration.Action; import com.megatim.fdxconsultation.model.administration.Role; import com.megatim.fdxconsultation.model.administration.User; import com.megatim.fdxconsultation.model.configuration.CodeStatutHttp; import com.megatim.file.model.enumeration.TypeSauvegarde; import com.megatim.file.tools.entites.context.FileModuleAppContextEntity; import com.mgt.rs.security.core.common.Secured; import com.mgt.rs.security.core.common.SecuredClass; import java.lang.annotation.Annotation; import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import javax.annotation.PostConstruct; import javax.ejb.Singleton; import javax.ejb.Startup; import javax.inject.Inject; import com.megatim.fdxconsultation.core.ifaces.integration.AppColumnDeleter; import com.megatim.fdxconsultation.core.impl.dataproductionworker.DataProductionWorkerGroup; /** * * @author lenovo */ @Singleton @Startup public class StartupBean { @Inject protected ActionManager actionManager; @Inject protected RoleManager roleManager; @Inject protected UserManager userManager; @Inject protected CodeStatutHttpManager codeStatutHttpManager; @Inject private DataInMemoryHandler dataInMemoryHandler; @Inject private AppColumnDeleter appColumnDeleter; @Inject private DataProductionWorkerGroup dataProductionWorkerGroup; @PostConstruct public void init() { dataInMemoryHandler.initializeDataInMemory(); addNewActions(); addAdmins(); ajouterCodeStatusHttp(); initializeFileModule(); appColumnDeleter.delete(); dataProductionWorkerGroup.start(); } private void initializeFileModule() { /* Variabless */ List extensionsAutorises = Arrays.asList("pdf", "docx", "rar"); /* Précise le mode de sauvegarde */ FileModuleAppContextEntity.configuration.setModeSauvegarde(TypeSauvegarde.DISQUE); /* Précise la taille max des fichiers */ FileModuleAppContextEntity.configuration.setTailleUploadMax(10); /* Précise la liste des extentations autoriséess */ FileModuleAppContextEntity.configuration.setExtensionsAutorisees(extensionsAutorises); } /** * Methode permettant de charger les codes statuts http */ private void ajouterCodeStatusHttp() { /* Variables */ List liste = codeStatutHttpManager.findAll(); /* On vide le registre */ AppContext.registre_codes_http.clear(); /* Si liste non vide */ if (liste == null || liste.isEmpty()) { /* On initialise la liste */ liste = new ArrayList(); /* 1xx - Informations */ liste.add(new CodeStatutHttp("100", "Le serveur a reçu les en-têtes et attend le corps de la requête")); liste.add(new CodeStatutHttp("101", "Le client a demandé un changement de protocole, accepté par le serveur")); liste.add(new CodeStatutHttp("102", "La requête est en cours de traitement")); /* 2xx - Succès */ liste.add(new CodeStatutHttp("200", "La requête a réussi")); liste.add(new CodeStatutHttp("201", "La requête a abouti à la création d'une ressource")); liste.add(new CodeStatutHttp("202", "La requête a été acceptée, mais le traitement est en cours")); liste.add(new CodeStatutHttp("203", "La réponse contient des informations provenant d'une source tierce")); liste.add(new CodeStatutHttp("204", "La requête a réussi, mais il n'y a pas de contenu à retourner")); liste.add(new CodeStatutHttp("205", "La requête a réussi, le client doit réinitialiser l'interface utilisateur")); liste.add(new CodeStatutHttp("206", "Une partie de la ressource a été envoyée")); /* 3xx - Redirections */ liste.add(new CodeStatutHttp("300", "Plusieurs options sont disponibles pour la ressource")); liste.add(new CodeStatutHttp("301", "La ressource a été déplacée de manière permanente")); liste.add(new CodeStatutHttp("302", "La ressource a été temporairement déplacée")); liste.add(new CodeStatutHttp("303", "La ressource est disponible à une autre URL")); liste.add(new CodeStatutHttp("304", "La ressource n'a pas été modifiée depuis la dernière requête")); liste.add(new CodeStatutHttp("307", "Redirection temporaire avec conservation de la méthode HTTP")); liste.add(new CodeStatutHttp("308", "Redirection permanente avec conservation de la méthode HTTP")); /* 4xx - Erreurs du client */ liste.add(new CodeStatutHttp("400", "La requête est mal formée ou invalide")); liste.add(new CodeStatutHttp("401", "L'authentification est requise pour accéder à la ressource")); liste.add(new CodeStatutHttp("403", "Le client n'a pas les permissions nécessaires pour accéder à la ressource")); liste.add(new CodeStatutHttp("404", "La ressource demandée n'existe pas")); liste.add(new CodeStatutHttp("405", "La méthode HTTP utilisée n'est pas autorisée pour cette ressource")); liste.add(new CodeStatutHttp("406", "La ressource n'est pas disponible dans un format acceptable pour le client")); liste.add(new CodeStatutHttp("408", "Le serveur a expiré en attente de la requête")); liste.add(new CodeStatutHttp("409", "Un conflit a été détecté")); liste.add(new CodeStatutHttp("410", "La ressource n'est plus disponible et n'a pas d'adresse de redirection")); liste.add(new CodeStatutHttp("411", "La requête doit spécifier la longueur de son contenu")); liste.add(new CodeStatutHttp("412", "Une précondition dans les en-têtes de la requête a échoué")); liste.add(new CodeStatutHttp("413", "La taille de la requête est trop grande")); liste.add(new CodeStatutHttp("414", "L'URI fourni est trop long pour être traité")); liste.add(new CodeStatutHttp("415", "Le format de la requête n'est pas supporté")); liste.add(new CodeStatutHttp("422", "La requête est bien formée mais ne peut pas être traitée")); liste.add(new CodeStatutHttp("429", "Trop de requêtes ont été envoyées dans un court laps de temps")); /* 5xx - Erreurs du serveur */ liste.add(new CodeStatutHttp("500", "Une erreur inattendue s'est produite sur le serveur")); liste.add(new CodeStatutHttp("501", "La méthode HTTP demandée n'est pas supportée par le serveur")); liste.add(new CodeStatutHttp("502", "Une réponse invalide a été reçue d'un serveur en amont")); liste.add(new CodeStatutHttp("503", "Le serveur est temporairement indisponible")); liste.add(new CodeStatutHttp("504", "Le serveur en amont a mis trop de temps à répondre")); liste.add(new CodeStatutHttp("505", "La version HTTP utilisée n'est pas supportée")); /* On save en bd */ for (CodeStatutHttp codeStatutHttp : liste) { /* On save */ codeStatutHttpManager.add(codeStatutHttp, null); } } /* On ajoute dans la map */ for (CodeStatutHttp codeStatutHttp : liste) { /* On ajoute à la map */ AppContext.registre_codes_http.put(codeStatutHttp.getCode(), codeStatutHttp.getLibelle()); } } private void addAdmins() { List users = userManager.findAll(); //Pas d'admin if (!users.stream().filter(u -> u.getRole().getAdmin()).findAny().isPresent()) { Role role = new Role(); role.setLibelle("Admin"); role.setDescription("Admin"); role.setAdmin(true); Role newRole = roleManager.save(role); addUser("adminc", "P@ssw0rd", newRole); } //pas de super admin if (!users.stream().filter(u -> u.getRole().getSuperAdmin()).findAny().isPresent()) { Role role = new Role(); role.setLibelle("Super Admin"); role.setDescription("Super Admin"); role.setSuperAdmin(true); Role newRole = roleManager.save(role); addUser("adminv", "P@ssw0rd", newRole); } //Pas de mega admin if (!users.stream().filter(u -> u.getRole().getMegaAdmin()).findAny().isPresent()) { Role role = new Role(); role.setLibelle("Hyper Admin"); role.setDescription("Hyper Admin"); role.setMegaAdmin(true); Role newRole = roleManager.save(role); addUser("admincontrol", "P@ssw0rd", newRole); } } private void addUser(String userName, String password, Role role) { User user = new User(); user.setUserName(userName); user.setDelaiInactivite(10); user.setPwd(CommonTools.encryptPassword(password)); user.setRole(role); //user.getRoles().add(role); userManager.save(user); } private void addNewActions() { List> classes = CommonTools.getAnnotatedClasses("com.megatim.fdxconsultation.service", "com.mgt.rs.security.core.common.SecuredClass"); classes.forEach(clazz -> { SecuredClass securedClass = clazz.getAnnotation(SecuredClass.class); Method[] methods = clazz.getMethods(); for (Method method : methods) { Secured secured = getInheritedAnnotation(Secured.class, method); if (secured != null && secured.action() != null && !secured.action().isEmpty() && !secured.action().equals("*")) { //On crée l'action ici Action action = new Action(); action.setModule(securedClass.module()); action.setPath(securedClass.path()); action.setDescription(securedClass.description()); action.setName(secured.action()); RestrictionsContainer requeteur = RestrictionsContainer.newInstance(); //On ajoute les criteres requeteur.addEq("name", action.getName()); requeteur.addEq("path", action.getPath()); requeteur.addEq("module", action.getModule()); requeteur.addEq("typeOperation", TypeOperation.AJOUTER); List datas = actionManager.filter(requeteur.getPredicats(), null, null, 0, -1); if (datas.isEmpty()) { actionManager.save(action); } } } }); } public static A getInheritedAnnotation(Class annotationClass, AnnotatedElement element) { A annotation = element.getAnnotation(annotationClass); if (annotation == null && element instanceof Method) { annotation = getOverriddenAnnotation(annotationClass, (Method) element); } return annotation; } private static A getOverriddenAnnotation(Class annotationClass, Method method) { final Class methodClass = method.getDeclaringClass(); final String name = method.getName(); final Class[] params = method.getParameterTypes(); // prioritize all superclasses over all interfaces final Class superclass = methodClass.getSuperclass(); if (superclass != null) { final A annotation = getOverriddenAnnotationFrom(annotationClass, superclass, name, params); if (annotation != null) { return annotation; } } // depth-first search over interface hierarchy for (final Class intf : methodClass.getInterfaces()) { final A annotation = getOverriddenAnnotationFrom(annotationClass, intf, name, params); if (annotation != null) { return annotation; } } return null; } private static A getOverriddenAnnotationFrom(Class annotationClass, Class searchClass, String name, Class[] params) { try { final Method method = searchClass.getMethod(name, params); final A annotation = method.getAnnotation(annotationClass); if (annotation != null) { return annotation; } return getOverriddenAnnotation(annotationClass, method); } catch (final NoSuchMethodException e) { return null; } } }