mercredi 29 août 2012

Design Pattern Composite : exemple Java

Voila un exemple simple en Java pour illustrer le pattern composite.

Diagramme UML


Les sources

La classe Forme
import java.awt.geom.Point2D;

abstract class Forme {

   Point2D position;

   void ajouterForme(Forme forme) throws Exception {
      throw new Exception("Non impémenté");
    }
   void retirerForme(Forme forme) throws Exception {
      throw new Exception("Non impémenté");
   }

   abstract void dessiner();

   abstract float calculerVolume();
}

La classe Carre
import java.awt.geom.Point2D;

class Carre extends Forme {

int hauteur;

   int largeur;

   public Carre(Point2D position, int hauteur, int largeur) {
      this.position = position;
      this.hauteur = hauteur;
      this.largeur = largeur;
   }

   @Override
   public void dessiner() {
      ...
   }

   @Override
   public float calculerVolume() {
      return hauteur * largeur;
   }
}

La classe Cercle
class Cercle extends Forme {

   int rayon;

   public Cercle(int rayon) {
      this.rayon = rayon;
   }

   @Override
   public void dessiner() {
      ...
   }
   @Override
   public float calculerVolume() {
      return (float)Math.PI * rayon * rayon;
   }
}

La classe Groupe
import java.util.HashSet;
import java.util.Set;

class Groupe extends Forme {

   private Set<forme> formes;

   public Groupe() {
      this.formes = new HashSet<forme>();
   }

   @Override
   public void ajouterForme(Forme forme) {
      formes.add(forme);
   }

   @Override
   public void retirerForme(Forme forme) {
      formes.remove(forme);
   }

   @Override
   public void dessiner() {
      for (Forme forme : formes) {
         forme.dessiner();
      }
   }
   @Override
   public float calculerVolume() {
      float volume = 0;
      for (Forme forme : formes) {
         volume += forme.calculerVolume();
      }
      return volume;
   }
}

mardi 28 août 2012

Domotique : commande groupée

Le site "Toute la Domotique" effectue du 27/08/2012 au 16/09/2012 une commande groupée en partenariat avec le site "Domadoo".
Attention : il faut être membre du forum TLD pour pouvoir en profiter.

Pour les intéressé, c'est par la.

vendredi 15 avril 2011

Maven - Structure du projet

Un projet Maven est structuré de la façon suivante :

src/main/javaSource de l'application/Librairie Java
src/main/resourcesRessources de l'application/librairie
src/main/filtersFichiers ressources pour les filtres (seront inclus par défaut dans le Jar)
src/main/assemblyDescription pour l'Assembly
src/main/configFichier de configuration (Ne seront pas inclus par défaut dans le jar)
src/main/webappSources de la partie web de l'application
src/test/javaSources des tests
src/test/resourcesRessources pour les tests
src/test/filtersFichiers ressources pour les filtres
src/siteSite
LICENSE.txtLicense du Projet
NOTICE.txtNotices
README.txtFichiers readme du projet
POM.xmlFichier Maven décrivant le projet

Maven crée un répertoire "target" au même niveau que le "src". Il contiendra tous les fichiers générés par maven. On y trouvera en autre le Jar de l'application/librairie, les .class, les résultats des tests,...

jeudi 16 septembre 2010

CMMI : Méthode GQM

J'ai découvert récemmet la méthode GQM (Goal/Question/Metric) grace au site http://afoucal.free.fr/.

Cette methode propose un guide pour mettre en place des metriques dans le cadre de qualité logiciel. Elle est une réponse aux exigences CMMI (processus Mesure et Analyse).

Pour plus d'information, vous pouvez allez voir sur le cite officiel (en Anglais) : http://www.gqm.nl/

    mercredi 1 septembre 2010

    Hudson - Ant : Liste des parametres utilisables dans un script Ant

    Voila la liste des parametres utilisables dans un script Ant lancé par Hudson :

    BUILD_NUMBER Le numero du build, exemple "153"
    BUILD_ID L'id du build, exemple "2005-08-22_23-59-59" (YYYY-MM-DD_hh-mm-ss)
    JOB_NAME Nom du projet du build. C'est le nom du job configuré. C'est le nom que l'on retrouve dans la 3ème colonne du dashboard de la page principale.
    BUILD_TAG Concaténation de : hudson-${JOBNAME}-${BUILD_NUMBER}. Pratique pour mettre dans un fichier de ressource, un jar,... pour faciliter l'identification.
    EXECUTOR_NUMBER Le numéro unique de l'éxecution. (Commence à 0 et non 1)
    JAVA_HOME Le JAVA_HOME de la JDK utilisée.
    WORKSPACE Le chemin absolu du workspace.
    SVN_REVISION Pour les projets Subversion, cette variable contient le numéro de revision SVN. Si plusieurs modules SVN configurés, la variable ne sera pas positionnée.
    CVS_BRANCH Pour les projets CVS, cette variable contient le numéro de revision CVS. Si plusieurs modules CVS configurés, la variable ne sera pas positionnée.

    jeudi 15 juillet 2010

    Java - Ivy : création d'un repository local

    Voila une façon simple de créer un repository local :
    • Créer un repertoire partagé sur une machine en réseau. Exemple :  \\ma-machine\repository
    • Créer un fichier de configuration Ivy :
      <ivysettings>
          <properties file="${ivy.settings.dir}/ivysettings.properties">
          <property name="myrepository" overrite="true" value="//ma-machine/repository">
          <settings defaultresolver="chain-local">
          <resolvers>
              <chain name="chain-local">
                  <filesystem checkmodified="true" name="local">
                      <ivy pattern="${myrepository}/[module]/[revision]/ivy-[revision].xml">
                      <artifact pattern="${myrepository}/[module]/[revision]/[artifact]-[revision].[ext]">
                  </filesystem>
                  <ibiblio m2compatible="true" name="maven2">
                  <ibiblio m2compatible="true" name="jboss" root="http://repository.jboss.org/nexus/content/groups/public/">
              </ibiblio>
          </resolvers>
      </ivysettings>
    • Il suffit ensuite d'importer le fichier de configuration dans ant :
      <ivy:settings file="${basedir}/ivysettings.xml" />
    Bien sur il reste à remplir se repository...

    vendredi 11 juin 2010

    Java - Ivy : découverte

    Depuis longtemps, je gérais mes dépendances en utilisant SVN. En gros j'importais toutes mes librairies et leurs dépendances dans SVN en les taggants avec leur version. L'export se faisait via un script batch mais cela demandait la gestion des dépendances des dépendances... (Pas très pratique quand on changeait de version de lib). Le pire était pour la gestion des modules car il fallait les importer dans SVN dès qu'une modification était réalisée. De plus, SVN n'étant pas vraiment fait pour l'import de binaire, la base avait tendance à grossir.

    Dernièrement, je me suis mis à l'intégration continue (Hudson pour tout vous dire). Tout fonctionne bien avec l'utilisation de mes lib chargées dans SVN. Mais en voulant utiliser des plugins de type "tag automatique" j'ai rencontré un problème vu qu'Hudson essaye de tagger tout ce qui a été extrait de SVN donc mes Jar, ce qui pour le coup pose vraiment problème.

    En fouillant un peu, je suis tombé sur 2 solutions pour gérer mes dépendances : Maven et Ivy. Etant sous Ant, mon choix c'est porté sur Ivy.

    Les premier pas ne sont pas forcément évident. Les tutoriaux proposés se limitent aux premiers pas et la documentation, bien que complète, est plutôt faite pour des connaisseurs. Mais en persévèrent un peu et en posant quelques questions sur mon forum favori (developpez.com). On passe cette étape et là, on se rend vraiment compte de la puissance de cette outil.

    Plus besoin de se soucier des dependances, Ivy s'en occupe. Il suffit juste de lui donner quelle librairie on veut utiliser et il va chercher toutes les dépendances utiles. Par défaut, Ivy va chercher dans le repository de Maven qui est bien complet. Et pour les modules que l'on développe et que l'on partage, il suffit de se créer un repository local (dans mon cas un simple répertoire partagé, mais on peut faire beaucoup plus complet si on le souhaite) où l'on publirea nos modules. Et là encore Ivy s'occupe de ses dépendances.