jeudi, décembre 31, 2009

Meilleurs voeux pour 2010 ... les perspectives 2010

Je profite de ce dernier billet de 2009 pour vous souhaitez mes meilleurs vœux pour l'année 2010. J'espère que cette nouvelle année sera riche en actualités autour des technologies Java et spécialement Eclipse. N'oublions pas que l'année 2010 devrait voir apparaître la nouvelle version d'Eclipse : e4.

Concernant mes résolutions pour l'année 2010, j'espère de nouveaux supports de cours et de nombreux billets techniques.

Je dresse ci-dessous ma feuille de route de mes prochains travaux.
  • Finaliser les ateliers sur la construction de plug-in avec la plateforme Eclipse
  • Workbench Editor
  • Workbench Forms (pratiquement terminé, il me reste une partie sur les Editors)
  • Introduction à Eclipse RCP
  • Introduction à EMF (indispensable pour e4)
  • Web Service (WSDL, SOAP, UDDI, JAX-WS, RESTful et BPEL)
  • Concernant mon blog, je me fixe au moins autant de billets que l'année 2009.

lundi, décembre 28, 2009

Liens pratiques de la semaine

Vous trouverez ici une sélection de liens pratiques autour des technologies Java qui m'ont particulièrement intéressées pendant ces vacances de noël.

Eclipse
  • Une présentation filmée d'EclipseCon 2009 qui s'intéresse à effectuer une comparaison entre RAP et GWT pour le développement Java côté Web.
  • Les soumissions à EclipseCon 2010 sont très nombreuses, pour preuve regardez ici.
  • Un article qui présente comment définir des breakpoints avec des contraintes.
  • Angelo Zerr profite des fêtes de fin d'année pour publier des billets sur la conception d'un client Eclipse RCP et serveur OSGi avec Spring (billet 12).
Java
  • Un guide qui explique comment utiliser Glassfish 3 en mode embarqué. Ainsi vous apprendrez à utiliser Glassfish comme une librairie.

samedi, décembre 26, 2009

J'ai besoin d'... installer l'outil de gestion de projets Redmine sous Windows

Redmine est un outil de gestion de projets à la Trac ou Mantis. Il fournit une interface graphique Web très agréable. Je l'utilise depuis plus d'un an pour la gestion des projets au travail et j'en suis très satisfait. Depuis peu, j'ai réalisé une installation sur un nouveau serveur et je profite de ce billet pour décrire les étapes de cette installation.

Redmine est développé en Ruby et je présente un manuel d'installation pour Windows et le SGBD PostgreSQL.

Le plan de cette installation est le suivant
  • Téléchargement
  • Pré-requis logiciels
  • Pré-installation
    • Ruby
    • RubyGems
    • Ruby modules
    • Préparation de la base de données

  • Installation
  • Utilisation Apache 2.2 comme Proxy
Téléchargement
La distribution officielle de Redmine est disponible à cette adresse (http://rubyforge.org/frs/?group_id=1850)

Pré-requis logiciels
Vous devez installer et configurer les outils suivant avant d'installer Redmine
  • Ruby (procédure d'installation est décrite dans ce billet)
  • Apache 2.2 HTTP
  • PostgreSQL 8.2
Pré-installation / Ruby
Ruby est un langage open-source dynamique qui met l'accent sur la simplicité et la productivité. Sa syntaxe élégante en facilite la lecture et l'écriture [Citation : http://www.ruby-lang.org/fr/].

Pour l'installation, la version 1.8.6 a été utilisée.
Pré-installation / RubyGems
RubyGems est l'outil de gestion de package de Ruby.
  • Télécharger le package RubyGems (http://rubyforge.org/frs/?group_id=126)
  • Extraire l'archive dans un répertoire temporaire
  • Ouvrir un invite de commande, se placer dans le répertoire créé précédemment et exécuter l'instruction suivante
ruby setup.rb
Pré-installation / Ruby Modules
Certains modules pour le langage Ruby doivent être installés (prise en compte de PostgreSQL par exemple), exécuter l'instruction suivante
gem install rails mongrel mongrel_cluster postgres-pr mongrel_service
Pré-installation / Préparation de la base de données
Les instructions suivantes concernent le SGBD PostgreSQL.
  • Créer un utilisateur Redmine
createuser redmine --no-superuser --no-createdb --no-createrole --login --pwprompt --encrypted -U postgres
  • Créer un nouveau schéma de base de données
createdb --owner=redmine --encoding=utf-8 redmine -U postgres
Installation
  • Décompresser l'archive de Redmine dans un répertoire d'installation (exemple : d:\tools\redmine)
  • Créer une copie du fichier database.yml.example en le renommant database.yml
  • Modifier le contenu du fichier database.yml file de façon à paramétrer les informations de connexion à la base de données.
production:
adapter: postgresql
database: redmine
host: localhost
username: redmine
password: redmine
encoding: utf8
  • Ouvrir un invite de commande Windows, se placer dans le répertoire de Redmine et suivre les instructions suivantes
  • Pour initialiser la session
rake config/initializers/session_store.rb
  • Pour utiliser la configuration de production
rake db:migrate RAILS_ENV="production"
  • Pour paramétrer la configuration de production
rake redmine:load_default_data RAILS_ENV="production"
  • A la question relative au langage, choisir l'option fr
  • Créer une copie du fichier email.yml.example en le renommant email.yml
  • Modifier le contenu du fichier email.yml file de façon à paramétrer les informations d'envoi d'emails.
production:
delivery_method: :smtp
smtp_settings:
address: "monserveur.email.fr"
port: 25
domain: "monserveur.email.fr"
authentication: :plain

development:
delivery_method: :smtp
smtp_settings:
address: "monserveur.email.fr"
port: 25
domain: "monserveur.email.fr"
authentication: :plain
  • Démarrer le serveur Ruby via la commande suivante :
mongrel_rails start --environment=production
  • Pour tester l'application Redmine, ouvrir un navigateur et saisir l'URL suivante :
http://localhost:3000
Utiliser Apache 2.2 comme Proxy
  • Créer ou mettre à jour le fichier http-proxy.conf situé dans le répertoire apache/conf
  • Saisir le contenu suivant en l'adaptant à votre configuration
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
ProxyRequests Off
<proxy>
Order deny,allow
Allow from all
</proxy>

Alias /redmine "D:/tools/redmine/public"
<directory>
Options Indexes FollowSymLinks
AllowOverride none
Order allow,deny
Allow from all
</directory>

ProxyPass /redmine/images !
ProxyPass /redmine/stylesheets !
ProxyPass /redmine/javascripts !
ProxyPass /redmine/ http://127.0.0.1:4000/
ProxyPass /redmine http://127.0.0.1:4000/
ProxyPassReverse /redmine/ http://127.0.0.1:4000/
  • Ajouter à la fin du fichier httpd.conf d'Apache 2.2, l'instruction suivante
Include conf/http-proxy.conf
  • S'assurer que l'instruction suivante est dé-commentée dans le fichier httpd.conf
LoadModule alias_module modules/mod_alias.so
  • Démarrer le serveur Ruby via l'instruction suivante
mongrel_rails start --environment=production -p 4000
  • Vérifier que l'URL http://localhost/redmine fonctionne. Seule la première page s'affiche. Par ailleurs, les images ne s'affichent pas correctement.
  • Arrêter le serveur Ruby
  • Se déplacer à la racine du répertoire Redmine et exécuter la ligne de commande suivante.
ruby script/plugin install http://svn.napcsweb.com/public/reverse_proxy_fix
  • A la question de l'URL, saisir l'URL complète (exemple : http://monserveur/redmine)
  • A la question de la version de Rails, sélectionner la valeur 2.0, 2.1, 2.2
  • Pour installer Redmine comme un service Windows, exécuter l'instruction suivante à partir du répertoire Redmine
mongrel_rails service::install -N Redmine -p 4000 -e production
  • A partir du panneau d'administration de Windows, activer le démarrage automatique du service Redmine de telle sorte que l'application Redmine se lance au démarrage de Windows.

lundi, décembre 21, 2009

Liens pratiques de la semaine

Vous trouverez ici une sélection de liens pratiques autour des technologies Java qui m'ont particulièrement intéressées ces dernières semaines.

Eclipse
Java
  • Une présentation filmée au JUG Paris sur le sujet des Servlet 3.

dimanche, décembre 06, 2009

J'ai besoin d' ... ajouter dynamiquement des éléments à un menu Eclipse

Lars Vogel propose sur son blog un billet qui explique comment créer et afficher une commande à l'exécution d'une application Eclipse.

Sur le support de cours des commandes que je propose depuis peu, je vais un peu plus loin dans la démonstration. Je montre comment créer et afficher une commande dans un menu en ajoutant une restriction visibleWhen. Je vous propose dans ce billet une explication de cet exemple.

Une vue est utilisée pour ajouter la commande dans le menu principal. Il est ensuite possible d'afficher ou de cacher la commande du menu. Pour cela la vue fournit trois boutons (Create, Hide et Show). Vous trouverez ci-dessous des captures d'écran de l'exemple.




Au niveau des pré-requis, je suppose qu'une commande et un handler sont définis. L'identifiant de la commande est ...helloworldcommandid

Au niveau du code de l'action du bouton Create, présenté ci-dessous, il est codé que la commande doit s'afficher dans la barre de menu principal (menu:org.eclipse.ui.main.menu), que l'identifiant de la commande est ...helloworldcommandid et enfin que la restriction visibleWhen est contrainte par l'expression définie par currentExpression.
public void createParControl(Composite parent) {
...
final Button myButton = new Button(parent, SWT.NONE);
myButton.setText("Create");
myButton.setLayoutData(myData);
myButton.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
IMenuService service = (IMenuService)PlatformUI.getWorkbench().getService(IMenuService.class);
AbstractContributionFactory ref = new AbstractContributionFactory("menu:org.eclipse.ui.main.menu", null) {
public void createContributionItems(IServiceLocator serviceLocator, IContributionRoot additions) {
CommandContributionItemParameter commandParameter = new CommandContributionItemParameter(serviceLocator, "contributionitem",
"eclipse.workbench.commandsprogrammaticvisiblewhenexamples.helloworldcommandid" CommandContributionItem.STYLE_PUSH);
currentExpression = new Expression() {
public EvaluationResult evaluate(IEvaluationContext context) throws CoreException {
if (isVisible) {
return EvaluationResult.TRUE;
} else {
return EvaluationResult.FALSE;
}
}
};
item = new CommandContributionItem(commandParameter);
additions.addContributionItem(item, currentExpression);
}
};
service.addContributionFactory(ref);
myButton.setEnabled(false);
}
});
...
}
Dans la méthode evaluate, vous noterez que l'attribut isVisible est utilisé pour aiguiller si la commande doit être affichée ou pas. Toute la difficulté est de notifier l'expression lorsque l'attribut isVisible est modifié. Pour cela, j'ai examiné le code source de la plateforme Eclipse (merci l'Open Source) et j'ai remarqué que les expressions utilisées pour les restrictions visibleWhen étaient notifiées lorsque la Shell de la WorkbenchWindow recevait un événement Activate.

Ci-dessous est présenté le code utilisé pour mettre à jour l'expression définie par currentExpression.
private void updateExpression() {
WorkbenchWindow current = (WorkbenchWindow)PlatformUI.getWorkbench().getActiveWorkbenchWindow();
final Set<evaluationreference> menuRestrictions = current.getMenuRestrictions();
if (menuRestrictions == null) {
return;
}
IEvaluationService es = (IEvaluationService)PlatformUI.getWorkbench().getService(IEvaluationService.class);
IEvaluationContext currentState = es.getCurrentState();
EvaluationReference[] refs = (EvaluationReference[]) menuRestrictions.toArray(new EvaluationReference[menuRestrictions.size()]);
boolean changeDetected = false;
for (EvaluationReference evalRef : refs) {
final Expression expression =evalRef.getExpression();

if (expression == currentExpression) {
evalRef.setPostingChanges(true);
boolean os = evalRef.evaluate(currentState);
evalRef.clearResult();
boolean ns = evalRef.evaluate(currentState);
if (os != ns) {
changeDetected = true;
evalRef.getListener().propertyChange(new PropertyChangeEvent(evalRef, evalRef.getProperty(), valueOf(os), valueOf(ns)));
}
}
}

if (changeDetected) {
IMenuService ms = (IMenuService) PlatformUI.getWorkbench().getService(IMenuService.class);
if (ms instanceof WorkbenchMenuService) {
((WorkbenchMenuService) ms).updateManagers();
}
}
}
Si vous examinez la méthode liftRestrictions de la classe WorkbenchWindow, vous noterez que cela est très similaire. De manière à éviter de rafraichir l'intégralité des expressions des restrictions visibleWhen, j'ai placé un filtre sur l'expression définie précédemment.

Enfin, sur le code des actions des boutons hide et show, l'attribut isVisible est modifié et la méthode updateExpression est appelée. Ci-dessous est présenté le code de l'action show.
public void createPartControl(Composite parent) {
...
Button hideMenuContribution = new Button(parent, SWT.NONE);
hideMenuContribution.setText("Hide");
hideMenuContribution.setLayoutData(myData);
hideMenuContribution.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
isVisible = false;
updateExpression();
}
});
}
Les codes sources de l'exemple sont disponibles à cette adresse.

samedi, décembre 05, 2009

Liens pratiques de la semaine

Vous trouverez ici une sélection de liens pratiques autour des technologies Java qui m'ont particulièrement intéressées ces dernières semaines.

Eclipse
  • Un billet de Lars Vogel qui propose une liste gratuite d'icônes pour vos applications Eclipse RCP (ou autre).
  • Le nouveau projet Gemini hébergé par la fondation Eclipse se veut être un conteneur de différentes spécifications Entreprise Java EE pour le monde OSGi (JPA, JMX, ...). Pour information, la fondation Apache se lance également dans ce créneau via le projet Apache Aries.
  • Lars Vogel propose un nouveau tutoriel sur le sujet du Drag & Drop.
  • Si vous souhaitez comprendre ce qu'est un nature dans la plateforme Eclipse, lisez ce tutoriel proposé par Lars.
  • Le projet OpenSocial Gadgets regroupe un ensemble de composants comme ceux que l'on peut trouver sur la page iGoogle (billet de l'annonce).
  • Un article qui présente les techniques de refactoring avec l'environnement de développement Java (JDT) d'Eclipse.
Java
  • Un billet qui explique comment rediriger le port 8080 de Tomcat vers le port 80 d'Apache 2
  • Java 7 se prépare voici la milestone 5. Sur cette page vous trouverez les exécutables à télécharger.
  • Simple est une bibliothèque qui permet de sérialiser et de-sérialiser en XML. L'aspect intéressant de cette bibliothèque est la définition de la structure du schema XML par annotation de classe Java (tutoriel).
  • Un article qui présente les closures qui seront disponibles dans la prochaine version de Java.
Divers
  • Pour le fun, un site qui permet de générer des nuages de mots clés.