Canalblog
Suivre ce blog Administration + Créer mon blog

Un peu de tout sur tout

Archives
12 janvier 2011

JAVA : connexion dynamique à une base de données

Pour changer dynamiquement de persistance unit ou pour utiliser l'Api JPA (Persistence) hors J2EE il faut créer l'EntityManagerFactory et à partir de celui-ci l'EntityManager.

Prérequis :

  • JAVA 5 ou +
  • fichier persistence.xml renseigné et dans le répertoire /META-INF

la connexion :


  protected EntityManagerFactory EMF = null;
  protected EntityManager EM = null;
 
  EMF = Persistence.createEntityManagerFactory(NOM_DU_PERSISTANCE_UNIT);
  EM = EMF.createEntityManager();


et la fermeture :


    if( EM != null)
    {
      EM.close();
    }
     if( EMF != null)
     {
       EMF.close();
     }


Publicité
7 janvier 2011

JAVA : interception du cycle de vie des EJB

Encore une astuce pour principalement faire du log, mais qui pourrait servir à établir des filtre de sécurité., ou l'envoi de mail automatique, ou encore des tests de performances,...

L'interception des appels des méthodes des EJB grâce à la Programmation Orientée Aspect !!

EJB3 permet d'agir lors des évènements du cycle de vie d'un EJB grâce aux annotations suivantes :

  • @PostConstruct --> intercepte l'instanciation de l'EJB.
  • @AroundInvoke --> intercepte l'appel d'une fonction de l'EJB.
  • @PreDestroy --> intercepte la destruction de l'EJB.
  • pour les Entity Beans il existe d'autres annotations s'appuyant sur le même mécanisme.

Ces annotations permettent de définir des méthodes "CallBack Interceptors".


exemple d'utilisation :


@PostConstruct
  public void interceptConstruct(InvocationContext ctx) throws Exception //InvocationContext permet d'accéder aux infos
  {
    //traitement avant l'instanciation
     if(isDebugPostConstruct)
     { 
        log.debug(">> Construction de l'EJB " + ctx.getTarget().getClass().getSimpleName());
     }
      try
      {
        ctx.proceed();// On valide l'instanciation
      }
      finally //le finally nous permet d'agir apres l'événement géré par la fonction
      {
        if(isDebugPostConstruct)
          log.debug(">> Construction de l'EJB " + ctx.getTarget().getClass().getSimpleName() + " finie.");
      }
  }



On peut définir ces fonction à l'intérieur du Bean, mais aussi dans une class externe grace à l'annotation @Interceptors.
Deplus  @Interceptors accepte en paramètre une liste de classes qui seront appelées itérativement (de gauche à droite) si ctx.proceed() est appelé, ce qui sera très avantageux pour établir des filtres en cascade. ^^


Voici une gestion des logs pour la création et l'appel d'EJBs sessions.

cf. fichier interceptEJB.java :

interceptEJB


5 janvier 2011

JAVA : obtenir le nom de la fonction courrante

Pour ne pas à avoir à écrire en dur pour chaque fonction de test (JUnit) le nom de chaque fonction de test pour l'écriture de logs, j'ai voulu obtenir le nom de la fonction en cours d'exécution. L'opération est assez simple mais peut être couteuse, il faudra donc l'utiliser à bon escient et sur des parties de code non critiques.

Le principe, c'est de récupérer le stack d'exécution et de remoter dedans  pour trouver le nom de la fonction.

Voila 2 fonctions qui retrouve  dynamiquement le nom de la fonction au cours de l'exécution :


  /**
   *
   * @return Renvoie le nom de la fonction que l'on est en trai d'executer
   * précédé par le package de la class de la fonction
   */
  public static String getMethodeFullName()
  {
          Throwable t = new Throwable();
          t.fillInStackTrace();

          StackTraceElement e = t.getStackTrace()[1];
          String className = e.getClassName();
          String functionName = e.getMethodName();
          return className + "." + functionName;
  }
  /**
   *
   * @return Renvoie le nom de la fonction que l'on est en trai d'executer
   */
  public static String getMethodeName()
  {
          Throwable t = new Throwable();
          t.fillInStackTrace();
          StackTraceElement e = t.getStackTrace()[1];
          String functionName = e.getMethodName();
          return functionName ;
  }


Exemple d'utilisation :


Assert.assertFalse(FncUtil.getMethodeName()+" : contact deja present, test impossible a realiser", c);


>> ce qui donne  à l'exécution :

java.lang.AssertionError: testAssocierContactRapport : contact deja present, test impossible a realiser

Publicité
Un peu de tout sur tout
Publicité
Un peu de tout sur tout
Publicité