I. Introduction

À chaque fois que l'on utilise un produit Borland, on se demande ce qu'ils vont bien pouvoir imaginer dans la version suivante. JBuilder 8 était déjà un produit très abouti, arrivé à maturité.

Et pourtant, vous allez voir que cette nouvelle version va vite vous devenir indispensable tant l'ajout fonctionnel est important. Il faut dire que le marché de l'IDE java est fortement concurrentiel. Après la disparition de Visual J++, Visual Café, Visual age (c'est peut-être à cause du préfix "Visual" ;o) ), JBuilder est vite devenu l'IDE java N° 1. C'était sans compter des petits nouveaux : IntelliJ, Eclipse et d'autres qui offrent maintenant des IDE de qualité à bas prix ou même gratuit.

Face à cette compétition, Borland est toujours obligé d'en faire plus et d'innover pour rester leader sur ce secteur.
Le résultat de cette évolution : un environnement très élaboré. À ma connaissance, jamais un IDE ne sera allé aussi loin pour le confort des développeurs (je ne connais pas non plus tous les autres IDE du marché). Voici peut-être l'occasion d'un nouvel article.

II. L'IDE

La première chose qui choque à l'utilisation de cette nouvelle version, c'est la fluidité de l'IDE en général. C'était souvent un reproche que l'on pouvait faire à cet outil, le choix du 100 % Java (Swing) a rendu l'IDE un peu lourd à l'utilisation. Peut-être est-ce dû à un changement du jdk1.4.1, en tout cas l'ensemble est bien plus agréable à l'usage.

II-A. Nouveau look & feel

Borland a ajouté un nouveau look & feel : le Borland Look&Feel. Il vient s'ajouter aux traditionnels : Metal, Windows et CDE/Motif.
Loin d'être un gadget, l'interface devient tout de suite plus agréable, les fontes sont réduites, l'ensemble prend moins de place.
Cela ressemble à visual studio .NET !

Image non disponible

II-B. Gestion de projet/Ajout des drag & drop

On peut maintenant faire du drag & drop avec les fichiers d'une branche à une autre, d'un projet à un autre et de l'explorateur Windows à un projet (pratique pour ajouter des nouveaux fichiers à un projet)

Image non disponible

II-C. Gestion de projet/Gestion fichiers & répertoires contextuels

La gestion d'ajout de fichiers et de répertoires peut maintenant se faire aussi contextuellement sur la vue projet.

Image non disponible

III. Construction

III-A. ANT

La grande nouveauté sur ANT vient de la possibilité d'exporter son projet JBuilder vers ANT. Très pratique pour automatiser des tâches en lignes de commande. Sur les tests que j'ai pu faire, l'assistant configure les chemins, la compilation, le nettoyage, la javadoc, la fabrication des jars...
Les tests sur les EJB semblent concluants, compilation, stubs et déploiements... (utilisation de iastool pour BES)

Image non disponible

Voici le résultat de l'export d'un projet contenant des classes à compiler plus la création d'un jar applicatif :

 
Sélectionnez
<?xml version="1.0" encoding="UTF-8"?>
<!-- Exported by JBuilder on 6 juin 2003 17:04:47 -->
<!-- It is RECOMMENDED that JBuilder builds and Ant builds done with
this exported Ant file be kept separate and be written to different
directories. For example, the JBuilder output directory might be "classes"
and the Ant output directory might be "classes.ant". -->
<project basedir="." default="rebuild" name="untitled3.jpx"> 
<property name="jbuilder.home" value="C:/java/JBuilder9"/>
<property name="jdk.home" value="${jbuilder.home}/jdk1.4"/>
<property name="dest" value="classes.ant"/>
<property name="Generated.Source" value="${dest}/Temporary_Files"/>
<property name="src" value="src"/>
<path id="project.class.path"> 
<pathelement location="${dest}"/>
<pathelement location="${jdk.home}/lib/dt.jar"/>
<pathelement location="${jdk.home}/lib/tools.jar"/> 
</path>
<!-- Patternset to exclude files from the output directory: --> 
<patternset id="dest.exclude"> 
<exclude name="Temporary_Files/"/>
<exclude name="Generated Source/"/>
<exclude name="package cache/"/>
<exclude name="dependency cache/"/>
<exclude name="jsp cache/"/> 
</patternset>
<target depends="init" name="javacompile"> 
<javac bootclasspathref="project.class.path" debug="true" deprecation="true" destdir="${dest}" nowarn="false" target="1.2"> 
<src path="${src}"/>
<src path="${Generated.Source}"/> 
</javac> 
</target>
<target depends="resource" name="archive"> 
<jar compress="false" destfile="untitled3.jar"> 
<fileset dir="${dest}"> 
<patternset refid="dest.exclude"/>
<include name="**/*.*"/> 
</fileset> 
</jar> 
</target>
<target name="cleanup"> 
<delete file="untitled3.jar"/>
<delete failonerror="false" includeemptydirs="true"> 
<fileset dir="${dest}"/> 
</delete> 
</target>
<target name="resource"> 
<copy todir="${dest}"> 
<fileset dir="${src}"> 
<include name="**/*.jpe"/>
<include name="**/*.jpeg"/>
<include name="**/*.rmf"/>
<include name="**/*.wav"/>
<include name="**/*.mid"/>
<include name="**/*.midi"/>
<include name="**/*.au"/>
<include name="**/*.gif"/>
<include name="**/*.png"/>
<include name="**/*.jpg"/>
<include name="**/*.aiff"/>
<include name="**/*.properties"/> 
</fileset> 
</copy> 
</target>
<target name="javadoc"/>
<target depends="cleanup" name="clean"/>
<target name="precompile"/>
<target depends="javacompile" name="compile"/>
<target name="postcompile"/>
<target depends="archive,javadoc,resource" name="package"/>
<target name="deploy"/>
<target depends="precompile,compile,postcompile,package,deploy" name="make"/>
<target depends="clean,make" name="rebuild"/>
<target name="init"> 
<mkdir dir="${dest}"/>
<mkdir dir="${Generated.Source}"/> 
</target> 
</project> 

III-B. Build/jar

On peut maintenant utiliser la gestion de filtre avec des critères de filtre, d'inclusion/exclusion et de récursivité en plus des paramètres traditionnels.

Image non disponible

IV. Gestion de source en équipe

En natif, maintenant JBuilder supporte : CVS, ClearCase, Visual Source Safe et StarTeam (racheté récemment par Borland).

IV-A. CVS

L'intégration CVS a été encore améliorée, dans les nouveautés, la possibilité à partir de JBuilder de faire les tâches d'administration (création de versions labellisées, suppression d'un label, déplacement d'un label, Merge et création de branches.

Image non disponible

IV-B. StarTeam

StartTeam bénéficie de l'intégration complète de son interface dans l'IDE, l'ensemble des opérations est accessible via cette interface tout en ayant les raccourcis standards des fichiers... À noter que les commandes administratives (création de projets, branchage...) ne sont pas accessibles dans JBuilder.

Image non disponible

V. JavaDoc

V-A. Ajout de tag

On peut maintenant paramétrer les tags JavaDoc. JBuilder laisse la possibilité d'ajouter de nouveaux tags. On peut également préciser où on peut les placer et comment ils sont représentés.

Image non disponible

V-B. Audit de code

L'éditeur offre maintenant l'audit de code sur la JavaDoc en prenant en compte les tags ajoutés. Le tout est vérifié par l'IDE qui affiche des erreurs en cas de problème. (comme avec le code Java)

Image non disponible

V-C. Rendu

Après compilation ou sur l'onglet JavaDoc, voici le résultat :

Image non disponible

VI. Refactoring/Edition

De nombreux ajouts ont été faits sur le refactoring.

VI-A. Recherche de la méthode surchargée

Le refactoring se voit ajouter la fonctionnalité suivante : dans l'arborescence, sur une méthode, on peut maintenant trouver directement l'implémentation de la méthode surchargée.

Image non disponible

VI-B. ErrorInsight

Error Insight permet en cours de frappe de proposer des solutions aux problèmes courants :

  • Classe ou fichier avec un mauvais nom => Renommer
  • Classe introuvable => Rechercher/Création de classe/Création d'interface
  • Classe devrait être abstraite => Rendre abstrait/Implémenter les méthodes
  • Constructeur introuvable => Création du constructeur/Surcharge du constructeur
  • Exception non attrapée => Englober avec un try...catch/ajouter un throws
  • Méthode non trouvée => Création de la méthode/Proposer une autre méthode
  • Package incorrect => Modifier la déclaration/déplacer le fichier
  • Package introuvable dans l'import => Supprimer l'import/Création du package
  • Types incompatibles => Ajout d'un cast
  • Type introuvable => Trouver avec classInsight/ Création de la classe/ Création de l'interface/ Proposer des classes similaires
  • Variable introuvable => Créer une variable/Création d'un champ/Proposer une correction
Image non disponible

VI-C. Templates

Le système des templates (ctrl+j) a été modifié. Nous avons maintenant la possibilité d'ajouter les imports nécessaires à la macro et de différencier les macros pour Java, HTML ou autres.

Image non disponible

VI-D. L'édition synchronisée

C'est le petit gadget qui devient vite indispensable.
Cette fonctionnalité intéressante est utilisable sur les templates et toute autre partie de code java. En sélectionnant un morceau de code et en activant l'édition synchronisée (dans la marge), on peut changer en une seule fois tous les éléments communs.

Image non disponible

VII. J2EE

JBuilder supporte maintenant les serveurs suivants :

  • BES 5.x
  • Generic App Server (spec seule)
  • IPlanet Application Server 6.x
  • Sybase Enterprise Application Server 4.x
  • Tomcat 3.3
  • Tomcat 4.0
  • Tomcat 4.1
  • WebLogic Application Server 6.x
  • WebLogic Application Server 7.x
  • WebSphere Application Server 5.X
  • WebSphere Application Advanced Edition 4.x
  • WebSphere Application Single Server 4.x
  • Oracle 9ias (Développé par Oracle, install sur le CD)

Ces OpenTools sont livrés avec JBuilder, d'autres comme Jonas ou JBoss sont disponibles en téléchargement sur Internet.
JBuilder est devenu l'environnement proposé en standard pour BES, Weblogic et Sybase.
Borland distribue une version de JBuilder spéciale Weblogic, je pense que l'intégration est identique. Cette version est distribuée par BEA.

Le designer a été revu pour être plus rapide.

VII-A. Intégration de la console BES

JBuilder intègre maintenant la console de BES directement dans l'IDE, ce qui permet de suivre les logs ou de faire les tâches d'administration sur les serveurs. Il n'y a donc plus qu'une JVM en mémoire pour ces deux outils.

Image non disponible

VII-B. Design Patern EJB/DTO

JBuilder intègre maintenant le design patern DTO. À partir d'un Entity, JBuilder génère toutes les classes nécessaires à l'élaboration du Design Patern DTO : le Value Object, la Façade, le Business Delegate, le service locator...
L'ensemble semble supporter le "Two Way". Les relations CMR sont prises en compte lors de la génération.
La génération prend en compte également la génération des écrans Struts.

VII-B-1. Diagramme de départ

Image non disponible

VII-B-2. Choix des options : Façade, Business Delegate, Client Struts

Image non disponible

VII-B-3. Choix des relations CMR

Image non disponible

VII-B-4. Nom des "Value Object"

On peut remarquer les options de gestion des conflits pour le "Two Way".

Image non disponible

VII-B-5. Choix des attributs à générer

Image non disponible

VII-B-6. Options de l'"Assembler"

Image non disponible

VII-B-7. Options de la "Façade"

Image non disponible

Options du "Service Locator"

Image non disponible

Diagramme final

Image non disponible

L'ensemble est bien fait, très pratique. Il semblerait que le wizard soit capable de gérer des cycles itératifs avec modification de code.
À vérifier en situation réelle. Je critiquerais le choix des implémentations (locator...) je n'ai pas trouvé la possibilité de modifier les Templates (c'est en dur dans l'openTool ?). J'hésite aujourd'hui entre l'outil fabuleux ou le gadget inutile pour faire de la génération à la "Rational Rose"...

Voici le résultat d'un DTO :

 
Sélectionnez
package com.test;

import java.io.Serializable;

public class EnterpriseDto implements Serializable {
private Integer idEntreprise;
private String raison;

public Integer getIdEntreprise() {
return idEntreprise; 
} 

public void setIdEntreprise(Integer idEntreprise) {
this .idEntreprise = idEntreprise; 
} 

public String getRaison() {
return raison; 
} 

public void setRaison(String raison) {
this .raison = raison; 
} 

public boolean equals(Object obj) {
if (obj != null ) {
if (this .getClass().equals(obj.getClass())) {
EnterpriseDto that = (EnterpriseDto) obj;
return ( ( (this .getIdEntreprise() == null ) && (that.getIdEntreprise() == null )) ||
(this .getIdEntreprise() != null &&
this .getIdEntreprise().equals(that.getIdEntreprise()))) &&
( ( (this .getRaison() == null ) && (that.getRaison() == null )) ||
(this .getRaison() != null &&
this .getRaison().equals(that.getRaison()))); 
} 
} 
return false; 
} 

public int hashCode() {
return (idEntreprise + "" + raison).hashCode(); 
} 

public String toString() {
return idEntreprise + ", " + raison; 
} 

} 

VIII. J2ME

Le développement J2ME est maintenant intégré en standard dans JBuilder, du peu que j'ai vu, c'est très simple à utiliser.
Voici un exemple d'application en action :

Image non disponible

Voici le code nécessaire :

 
Sélectionnez
package com.borland.jbuilder.samples.micro.helloworld;

import javax.microedition.lcdui.*;

/**
* A simple displayable containing a simple string label.
*/
public class HelloWorldForm extends Form {

String message = new String ("JBuilder rocks!");

/**
* Create a new HelloWorldForm displayable object
*/
public HelloWorldForm() {
// create a new form with "Hello World" as the title
super ("Hello World");
// listen for command events
this .setCommandListener(new CommandListener() {
public void commandAction(Command c, Displayable d) {
if (c.getCommandType() == Command.EXIT) {
// exit the midlet
HelloWorldMidlet.quit(); 
} 
} 
} );
// initialize the ui elements
try {
jbInit(); 
} catch (Exception e) {
e.printStackTrace(); 
} 
} 

/**
* UI initialization.
*/
private void jbInit() throws Exception {
// add the display string
this .append(message);

// register to receive notification for quit commands
this .addCommand(new Command("Exit", Command.EXIT, 1)); 
} 
} 

IX. OptimizeIt

OptimizeIt est la grande nouveauté du produit.
L'intégration du produit est complète, OptimizeIt se lance depuis JBuilder, s'exécute dans JBuilder, et plus intéressant : il s'exécute directement dans la JVM de JBuilder, donc on évite le chargement de deux JVM en mémoire, plus de communication en mode socket, le résultat est bien plus rapide que la version stand alone.
L'intégration dans JBuilder se fait via une troisième icône (après l'exécute & le debug).

Image non disponible

La configuration se fait comme d'habitude, un nouvel onglet permet de choisir le type d'exécution : Profiler, Thread Debugger, Code coverage.

Image non disponible

Cette fenêtre permet aussi de définir des groupes de classes pour ne pas "polluer" les stats.

Image non disponible

IX-A. Profiler

Le Profiler permet de suivre l'état de la mémoire, le garbage collector, les Threads, les classes chargées.

Image non disponible

Il permet aussi de voir les "Hot spots" du programme ainsi que le parcours d'exécution. On peut voir le détail pour chaque Thread ou globalement.

Image non disponible

Autre type de vue : le graphe d'exécution qui permet de voir où est perdu le temps:

Image non disponible

Autre outil du Profiler : le suivi des instances du programme :

Image non disponible

On peut voir exactement la taille occupée, le nombre d'instances et dans quel élément ils sont conservés :

Image non disponible

Un autre outil permet de voir les fuites de mémoire (eh oui, c'est possible en Java ;o) )

Image non disponible

IX-B. Thread Debugger

Le Thread Debugger permet de résoudre les problèmes de blocage liés aux Threads :

Image non disponible
Image non disponible

IX-C. Code Coverage

Le "Code coverage" est un outil qui permet de voir la couverture de code lors d'une exécution. Cet outil est particulièrement pratique pour vérifier si les tests couvrent tous les cas.

Image non disponible
Image non disponible

Il est à noter que la version Server Trace (pour les serveurs J2EE) n'est pas livrée avec JB9. On ne peut pas tout avoir !
Voici un nouvel outil dont on aurait tort de se passer pour améliorer nos programmes.
Dans le test que j'ai utilisé pour ces captures, j'ai d'ailleurs remarqué de gros problèmes de performances avec le SimpleDateFormat.

Très instructif !

X. Conclusion

Voici un aperçu des nouveautés de JBuilder 9. Ce document n'est pas exhaustif, la documentation signale d'autres nouveautés que je n'ai pas pu étudier.

XI. Remerciements

Merci à l'équipe de Developpez.com pour son accueil. Special thanks : DeveloppezAdm, Sébastien Meric et Knotty, pour leur soutien, Alacazam pour sa relecture active.