Category: Java J2EE

Primefaces : releases non-officielles

By , 24/06/2013

Primefaces n’est pas sous github. Malgré tout, un projet du même nom existe sur cet hébergement. C’est à partir de ce projet, copie du SVN officiel de Primefaces qu’il est possible de récupérer des releases non officielles, c’est à dire intermédiaires, de la librairie JSF. Ces versions sont, en effet, accessibles en version compilées uniquement pour les personne ayant un compte ELITE auprès de l’entreprise éditrice de Primefaces.

Pour en profiter, il faut ajouter le repository suivant dans maven :

<repository>
  <id>prime-github-repo</id>
  <name>Unofficial PrimeFaces Maven Repository</name>
  <url>http://primefaces.github.io/repository</url>
  <layout>default</layout>
</repository>

JBoss 7 : Plusieurs instances standalone sur un même serveur

By , 13/06/2013

Pour démarrer une instance JBoss en mode standalone avec les configurations par défaut, il faut exécuter la commande suivante : $JBOSS_HOME/bin/standalone.sh

Pour créer sa propre instance, il est uniquement nécessaire de copier les fichiers de configuration originaux du serveur standalone dans un répertoire quelconque du système de fichier puis d’exécuter la commande précédente avec l’option -Djboss.server.base.dir=XX. Par exemple :

xxxx@xxxx:~/tmp/testsJboss1$ tree
.
├── configuration
│   ├── application-roles.properties
│   ├── application-users.properties
│   ├── logging.properties
│   ├── mgmt-users.properties
│   └── standalone.xml
└── deployments
xxxx@xxxx:~/$ $JBOSS_HOME/bin/standalone.sh -Djboss.server.base.dir=~/tmp/testsJboss1/

Remarque : L’option jboss.socket.binding.port-offset associée à un entier (-Djboss.socket.binding.port-offset=1), vous permet de démarrer une instance en décalant tous les ports du serveur et ainsi éviter toute interférence avec un autre serveur.

Tomcat + weld + JSF : java.lang.OutOfMemoryError: PermGen space

By , 01/06/2013

Après avoir démarré une application utilisant tomcat, weld-servet et JSF2, je me suis rendu compte que j’obtenais rapidement des erreurs de mémoire sur la PermGen space. En gros mon application, aussi petite soit elle, utilisait beaucoup plus de classes que ce que je pensais et surtout que ce que la JVM de Sun pouvait contenir par défaut.

Pour rappel, cette partie de la mémoire est utilisée dans les JVM de Sun pour stocker les classes chargées par le classloader, elle ne se vide jamais sauf si l’on fait des actions directement sur le classloader. La valeur par défaut de cette mémoire est de 64Mo.

A priori, cette valeur n’est pas assez grande pour contenir l’ensemble des classes chargées par weld-servlet et JSF2 dans un tomcat. Pour éviter de retrouver ces erreurs de mémoire, il faut donc l’augmenter avec le paramètre dans la JVM :

-XX:MaxPermSize=256m

Il est possible de voir l’évolution de cette mémoire avec le programme VisualVM qui est fourni par défaut dans une JDK.

CSS3 : gradients

By , 11/03/2013

Il me semblait que faire un fond en dégradé avec CSS3 était à la portée de tous. En effet ce n’est pas très compliqué, mais, selon ce que l’ont souhaite obtenir, il peut y avoir beaucoup de paramètres à prendre en compte. Par hasard, j’ai découverts un site internet qui propose une interface pour générer ses propres dégradés compatibles avec tous les navigateurs : http://gradients.glrzad.com/.

Le principe est simple, il faut choisir

  • le nombre de couleurs du dégradé,
  • l’orientation et la position de la ou les ruptures de couleur
  • la rapidité de passage d’une couleur à l’autre

Ensuite, il suffit de copier le code CSS généré dans sa propre feuille de style.

PrimeFaces 3.5 incompatible avec RichFaces 4

By , 10/02/2013

Aujourd’hui, je décide de mettre à jour ma version de PrimeFaces. Je passe de la 3.4.2 à la 3.5. Résultat, mes composants RichFaces ne s’affichent plus correctement. Après recherche dans le code HTML généré, je remarque que les inclusions CSS et Javascript de Richfaces ne sont plus là. Je ne suis pas le seul à avoir le problème : http://forum.primefaces.org/viewtopic.php?f=3&t=28398.

Le problème vient de la façon dont PrimeFaces inclue les dépendances CSS et Javascript.

La solution : retour en version 3.4.2 en attendant une version intégrant une correction.

JRebel m2e connector

By , 08/02/2013

Le connecteur m2e de JRebel ne s’installe plus à partir du marketplace eclipse. Pour l’installer il faut passer par la mise à jour manuelle. Dans les menus de l’IDE : Help -> Install New software…

Le site d’update est : http://update.zeroturnaround.com/update-site. Le plugin à installer : JRebel m2eclipse.

JSF Charts : graphiques avec JSF

By , 31/01/2013

Cela fait longtemps que je souhaite consacrer un article sur les graphiques en JSF. Après avoir essayé plusieurs solutions je n’ai été convaincu par aucune librairie. Il me semble que la plus intéressante est la solution proposée par PrimeFaces. Ce que je n’aime pas dans cette approche c’est d’utiliser les classes spécifiques de la librairie JSF pour décrire les séries et non des collections simples. De plus, je ne trouve pas les graphiques très dynamiques. En tout cas pas à la hauteur des librairies Javascripts ou Flex qui existent actuellement.

Deux librairies Javascipts me semblent très performantes d’un point de vue utilisateur et développeur :

  • amCharts :
    • graphiques dynamiques, diversifiés, professionnels
    • licence gratuite
  • Highchart :
    • graphiques dynamiques, diversifiés, professionnels
    • approche déclarative des graphiques
    • licence nécessaire selon le type d’utilisation

C’est l’approche déclarative des graphiques qui m’a convaincue de la fiabilité d’une librairie JSF basée sur Hightchart. On retrouve le même principe déclaratif dans les interfaces xhtml proposées par JSF. Je me suis donc lancé dans la création de cette librairie qui est un wrapper JSF de Highchart : jsfcharts. La demo ce trouve hébergée ici : http://showcase-jsfcharts.rhcloud.com/home.jsf.

Mon objectif : proposer une solution efficace à développer, agréable à utiliser et compatible avec plusieurs systèmes (PC, mobile, multi-navigateurs). C’est à dire :

  • Rapide : peu de lignes à coder
  • Simple :
    • objets simples sans préparation
    • Utilisation transparente de la librairie

Au final, créer un graphique dynamique en JSF est presque aussi simple que créer un tableau (h:dataTable). Par exemple, pour le graphique ci-dessous, il faut écrire ce fichier xhtml et cette classe java :

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
   xmlns:ui="http://java.sun.com/jsf/facelets"
   xmlns:f="http://java.sun.com/jsf/core"
   xmlns:h="http://java.sun.com/jsf/html"
   xmlns:jsfcharts="http://everythingiswrong.org/jsfcharts"
   template="/WEB-INF/templates/default.xhtml">
   <ui:define name="content">
       <jsfcharts:chart id="test" marginRight="130" marginBottom="25">
          <jsfcharts:title text="Monthly Average Temperature" />
          <jsfcharts:subtitle text="Source: WorldClimate.com" />
          <jsfcharts:xAxis categories="#{chartBean.abscisse}" />
          <jsfcharts:yAxis>
          <jsfcharts:title text="Temperature (˚C)" />
          </jsfcharts:yAxis>
          <jsfcharts:legend layout="vertical" align="right" verticalAlign="top" x="-10" y="100" borderWidth="0"/>
          <jsfcharts:tooltip valueSuffix="˚C" />
          <jsfcharts:series>
              <jsfcharts:serie label="Tokyo" value="#{chartBean.tokyo}" />
              <jsfcharts:serie label="New York" value="#{chartBean.newYork}" />
              <jsfcharts:serie label="Berlin" value="#{chartBean.berlin}" />
              <jsfcharts:serie label="London" value="#{chartBean.london}" />
          </jsfcharts:series>
       </jsfcharts:chart>
...
</ui:composition>
package org.everythingiswrong.jsf.jsfchartsdemo;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.enterprise.inject.Model;

@Model
public class ChartBean {

   private Double[] tokyo;
   private Double[] newYork;
   private Double[] berlin;
   private Double[] london;
   private List<String> abscisse;

   // Getter, Setter  ...

   @PostConstruct
   public void initialize() {
      tokyo = new Double[] {7.0, 6.9, 9.5, 14.5, 18.2, 21.5, 25.2, 26.5, 23.3, 18.3, 13.9, 9.6};
      newYork = new Double[] {-0.2, 0.8, 5.7, 11.3, 17.0, 22.0, 24.8, 24.1, 20.1, 14.1, 8.6, 2.5};
      berlin = new Double[] {-0.9, 0.6, 3.5, 8.4, 13.5, 17.0, 18.6, 17.9, 14.3, 9.0, 3.9, 1.0};
      london = new Double[] {3.9, 4.2, 5.7, 8.5, 11.9, 15.2, 17.0, 16.6, 14.2, 10.3, 6.6, 4.8};
      abscisse = Arrays.asList(new String[] {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"});
   }
}

Pour aller plus loin, je vous invite à visiter le projet github de JSFCharts : https://github.com/yanLanglois/jsfcharts.

JBoss 7 : Datasources dans un WAR

By , 28/09/2012

Avec JBoss 7, il est possible de déclarer une datasource JNDI dans une archive WAR. Pour cela, il faut déposer un fichier ma-datasource-ds.xml dans le répertoire WEB-INF avec la déclaration de la source de données. Par exemple :

<?xml version="1.0" encoding="UTF-8"?>

<datasources xmlns="http://www.jboss.org/ironjacamar/schema"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.jboss.org/ironjacamar/schema http://docs.jboss.org/ironjacamar/schema/datasources_1_0.xsd">
   <!-- The datasource is bound into JNDI at this location. We reference
      this in META-INF/persistence.xml -->
   <datasource jndi-name="java:jboss/datasources/maDS"
          pool-name="mysqlds"
          enabled="true"
          use-java-context="true">
      <connection-url>jdbc:mysql://localhost:3306/activiti?useUnicode=true&characterEncoding=UTF-8</connection-url>
      <driver>mysql</driver>
      <security>
         <user-name>root</user-name>
         <password>123456</password>
      </security>
   </datasource>
</datasources>

La valeur de l’élément driver, est le nom du driver installé sur le serveur. Pour l’installer, il est possible de copier le jar dans le répertoire de déploiement du serveur (cp mysql.jar <as7>/standalone/deployments).

Sources : https://community.jboss.org/thread/204245, https://community.jboss.org/wiki/DataSourceConfigurationInAS7, https://github.com/abstractj/as-quickstarts/blob/40f8cae2ce9388151e1a07f743df74e59c7848bc/kitchensink-html5-mobile/src/test/resources/arquillian-ds.xml

JRebel gratuit !

By , 24/04/2012

Cette information date déjà de quelques mois, mais je viens de la découvrir : il existe une version gratuite de JRebel (https://social.jrebel.com). Ce logiciel permet aux développeurs Java d’éviter les redéploiements à répétition de leurs applications grâce à un système de synchronisation du code développé et du code déployé.

Bien entendu, il existe des contraintes :

  • Disponible uniquement pour les développements non commerciaux (impossible à utiliser en entreprise par exemple)
  • Publication mensuelle de statistiques sur Tweeter ou/et facebook

Bean Spring et java.util.List

By , 25/01/2012

Voici deux façons de déclarer une liste d’objet en tant que propriété d’un bean Spring :

  • A partir d’une liste de valeur
<bean name="name" class="Class">
      <property name="myList">
            <value>a</value>
            <value>b</value>
            <value>c</value>
      </property>
</bean>
  • A partir d’une valeur unique à décomposer en plusieurs valeurs (sorte de CSV)
<bean id="name" class="Class">
    <property name="myList">
        <bean class="org.springframework.util.CollectionUtils" factory-method="arrayToList">
            <constructor-arg type="java.lang.Object">
                <bean class="org.springframework.util.StringUtils" factory-method="tokenizeToStringArray">
                    <constructor-arg type="java.lang.String" value="a b c"/>
                    <constructor-arg type="java.lang.String" value=" "/>
                </bean>
            </constructor-arg>
        </bean>
    </property>
</bean>

OfficeFolders theme by Themocracy