oct 15 2008

Développement web avec MAVEN - SRING 2.5 – HIBERNATE

Tag: Développement, J2EE, Non classé, Springkarl verger @ 8:48


Table des matières

Mise en place de maven. 3

Mise en place SPRING.. 4

Exemple de fichier web.xml 4

Les fichiers de configurations. 6

applicationContext-service.xml 6

formationspring-servlet.xml 7

Mise en place des controllers. 7

Declaration d’un controller. 7

Explication des annotations. 7

Diagramme de séquence simpliste d’appel à un Controller. 8

Spring security. 8

Authentification et autorisation. 8

Mise en place. 11

pom.xml 11

web.xml 11

applicationContext-security.xml 11

La gestion des transactions. 14

Définition d’une Transaction. 14

Overview d’une transaction applicative. 15

Les niveaux d’isolation des transactions. 15

Les modes de propagation des transactions. 17

Mise en place de HIBERNATE. 18

Le fichier applicationContext-hibernate.xml 18

Validation du domaine métier. 20

Contraintes intégrées. 20

Vérification des erreurs. 22

SQL et HQL Injection. 23

Requête paramétrée HQL. 23

Requite paramétrée SQL. 23

AJAX et DWR. 23

Mise en place. 24

pom.xml 24

web.xml 24

dwr.xml 24

Les problèmes d’ENCODING.. 25

DataBase. 25

Hibernate. 25

Spring framework. 25

Velocity et mails. 25

JSP. 26

Géré les paramètres et les exceptions  utilisateurs web inattendues. 26

La gestion des Tests unitaires. 26

Mesurer la couverture de test. 26

Exemple de test d’un controler web : 27

Mesurer les performances. 29

Mise en place “globale” de JAMon. 29

Paramétrer l’application pour définir les éléments dont on souhaite mesurer les temps d’exécution   29

Suivre le temps d’appel aux pages. 30

Suivre le temps d’exécution de certaines méthodes. 30

Suivre le temps d’exécution des requêtes SQL. 31

Le reporting du projet. 31

JDEPEND.. 32

Analyse des métriques de JDEPEND.. 33

PMD.. 33

 

Continue reading “Développement web avec MAVEN - SRING 2.5 – HIBERNATE”


mar 01 2008

Envoyer un mail avec PL/SQL

Tag: Développement, tipskarl verger @ 18:38

Petit exemple vous permettant d’envoyer un email à partir
de votre base ORACLE.

CREATE OR REPLACE PROCEDURE ENVOI_MAIL AS
BEGIN
DECLARE
   l_mailhost    VARCHAR2(64) := ’smtp.monrelais.fr’;
   l_from        VARCHAR2(64) := ‘moi@monrelais.fr’;
   l_subject     VARCHAR2(64) := ‘Un petit sujet’;
   l_to          VARCHAR2(32767) := ‘toi@monrelais.fr’;
   l_mail_conn   UTL_SMTP.connection;
   nbError       NUMBER(10) := 0;
   l_dest_tmp   VARCHAR2(32767);
BEGIN
   l_mail_conn := UTL_SMTP.open_connection(l_mailhost, 25);
   UTL_SMTP.helo(l_mail_conn, l_mailhost);
   UTL_SMTP.mail(l_mail_conn, l_from);
   WHILE INSTR(l_to, ‘,’) != 0 LOOP
      l_dest_tmp := SUBSTR(l_to, 1, INSTR(l_to, ‘,’) - 1);
      l_to     := SUBSTR(l_to, INSTR(l_to, ‘,’) + 1);
      UTL_SMTP.rcpt(l_mail_conn, l_dest_tmp);
   END LOOP;
   UTL_SMTP.rcpt(l_mail_conn, l_to);
   UTL_SMTP.open_data(l_mail_conn);
   UTL_SMTP.write_data(l_mail_conn, ‘Date: ‘ || TO_CHAR(SYSDATE, ‘DD-MON-YYYY HH24:MI:SS’) || CHR(13)|| CHR(10));
   UTL_SMTP.write_data(l_mail_conn, ‘From: ‘ || l_from || CHR(13)|| CHR(10));
   UTL_SMTP.write_data(l_mail_conn, ‘Subject: ‘ || l_subject || CHR(13)|| CHR(10));
   UTL_SMTP.write_data(l_mail_conn, ‘To: ‘ || l_to || CHR(13)|| CHR(10));
   UTL_SMTP.write_data(l_mail_conn, ‘le corps du mail contenant de données’ || CHR(13)|| CHR(10));
   UTL_SMTP.write_data(l_mail_conn, || CHR(13)|| CHR(10));
   – on itere sur les resultat et rajoutons les valeurs dans le corp du mail
   FOR fields IN
   (
      SELECT
         FIELD_1
      FROM
         MA_TABLE
   )LOOP
      UTL_SMTP.write_data(l_mail_conn, fields.FIELD_1 || CHR(13)|| CHR(10));
    END LOOP;
    UTL_SMTP.close_data(l_mail_conn);
    UTL_SMTP.quit(l_mail_conn);
 END;
END ENVOI_MAIL;

mar 01 2008

Créer un fichier CSV avec PL/SQL

Tag: Développement, tipskarl verger @ 18:17

déclarer un répertoire sur votre base correspondant a un path du systeme hébergeant ORACLE
cela correspondra a l’endroit ou votre fichier sera enregistré.

CREATE OR REPLACE directory TMP AS ‘/home/db/user1′;

et l’exemple de procédure

CREATE OR REPLACE PROCEDURE QUERY_TO_CSV AS
BEGIN
DECLARE
f_file_id UTL_FILE.FILE_TYPE;
v_file_location VARCHAR2(256) := ‘TMP’;
v_line VARCHAR2(4000);
BEGIN
DBMS_OUTPUT.put_line(v_file_location);
f_file_id := UTL_FILE.FOPEN(v_file_location,‘export.csv’,‘w’);
UTL_FILE.PUT_LINE(f_file_id,‘FIELD_1,FIELD_2,FIELD_3,FIELD_4,FIELD_5′);
FOR fields IN
(
SELECT
   FIELD_1,
   FIELD_2,
   FIELD_3,
   FIELD_4,
   FIELD_5
FROM
   MA_TABLE
)LOOP
UTL_FILE.PUT_LINE(f_file_id,fields.FIELD_1||‘,’||fields.FIELD_2||‘,’||fields.FIELD_3||‘,’||fields.FIELD_4||‘,’||fields.FIELD_5);
UTL_FILE.FCLOSE (f_file_id);
UTL_FILE.FCLOSE_ALL;
END LOOP;
END;
END QUERY_TO_CSV;

fév 07 2008

Workflow et Gestion de flux

Tag: Analyse, Architecture, Développement, Idées, Springkarl verger @ 21:54

L’objectif est d’appréhender les concepts du workflow, pour ce faire nous allons implémenter un petit projet de test permettant de comprendre les principes.

Pour le projet nous nous appuieront sur les outils suivants: spring, hibernate,jdom et groovy et comme d’habitude le projet maven sera téléchargeable à la fin du tutoriel.

wikipedia : Un workflow est un flux d’informations au sein d’une organisation, comme par exemple la transmission automatique de documents entre des personnes.

On appelle « workflow » (traduisez littéralement « flux de travail ») la modélisation et la gestion informatique de l’ensemble des tâches à accomplir et des différents acteurs impliqués dans la réalisation d’un processus métier (aussi appelé processus opérationnel ou bien procédure d’entreprise). Le terme de « workflow » pourrait donc être traduit en français par « gestion électronique des processus métier ».

De façon plus pratique, le workflow décrit le circuit de validation, les tâches à accomplir entre les différents acteurs d’un processus, les délais, les modes de validation, et fournit à chacun des acteurs les informations nécessaires pour la réalisation de sa tâche.

Le moteur de workflow est le dispositif logiciel permettant d’exécuter une ou plusieurs définitions de workflow. Par abus de langage, on peut appeler ce dispositif logiciel tout simplement “workflow”.

Présentation du Projet

Pour notre projet de test nous allons aborder les concepts suivants : tache,fonction,transition,context d’execution. Je met de côté volontairement la partie gestion des droits et habilitations des utilisateurs pour éviter de complexifier le model.

exemple de flux

flux.jpg

le workflow est composé de tache et de transition, un contexte d’exécution est transporté tout au long du processus, ce dernier peut être modifié par les taches, et les transitions pourront accéder à ce contexte, chaque transition est évalué et permet de définir le chemin a suivre dans le flux.

Continue reading “Workflow et Gestion de flux”


fév 04 2008

Extraire les liens d’une page web, htmlparser lib

Tag: Développement, Idéeskarl verger @ 22:27

exemple d’utilisation de la lib htmlparser pour extraire les liens d’une page web, ca peut servir dans la mise en place d’un petit spider bot ou tout autre chose, à vous de voir.

import java.net.URL;
import java.util.Vector;
import org.htmlparser.beans.StringBean;
import org.htmlparser.tags.LinkTag;
public class ExtractLink {
    static org.htmlparser.beans.LinkBean lb = null;
    static Vector visitedPage = new Vector();

    public static void main(String[] args){
            extractLink("http://www.yahoo.fr");
    }
    public static void extractLink(String url){
        new LinkTag().setMailLink(true);
        System.err.println("extractLink");
        lb = new org.htmlparser.beans.LinkBean();
        lb.setURL (url);

        URL[] urls = lb.getLinks ();
        for (int i = 0; i < urls.length; i++){
            System.out.println (urls[i]);
        }
    }
    public static void extractString(String url){
      StringBean sb = new StringBean ();
      sb.setLinks (false);
      sb.setReplaceNonBreakingSpaces (true);
      sb.setCollapse (true);
      sb.setURL (url); // the HTTP is performed here
      String s = sb.getStrings ();
      System.out.println(s);
    }
}

fév 04 2008

Groovy graph

Tag: Développementkarl verger @ 22:06

Générer un Graph avec groovy

//Permet d'ajouter au path les lib nécessaire a groovy
this.class.classLoader.rootLoader.addURL( new URL("file:////home/ubuntu/Documents/swingxbuilder-0.1.5.jar") )

this.class.classLoader.rootLoader.addURL( new URL("file:////home/ubuntu/Documents/projets java/lib/swingx/dist/swingx-0.9.1.jar"))

this.class.classLoader.rootLoader.addURL( new URL("file:////home/ubuntu/Documents/projets java/lib/batik-1.7/batik.jar"))

import groovy.swing.SwingXBuilder.*

import org.jdesktop.swingx.*

import groovy.swing.*

import java.awt.Color

def swing = new SwingXBuilder()

def frame = swing.frame(size:[300,300]) {
                                            graph(plots:[[Color.GREEN, {value -> Math.sin(value)}],
                                                              [Color.BLUE, { value -> Math.cos(value)}]
                                                        ])
                                        }.show()

jan 23 2008

Cryptographie java, les certificats X509

Tag: Développement, J2EEkarl verger @ 21:41

Bon pour ce soir on vas voir la création de certificats X509 et leur sauvegarde dans un keystore.

wikipedia : Un certificat électronique est une carte d’identité numérique dont l’objet est d’identifier une entité physique ou non-physique. Le certificat numérique ou électronique est un lien entre l’entité physique et l’entité numérique (Virtuel). L’autorité de certification fait foi de tiers de confiance et atteste du lien entre l’identité physique et l’entité numérique. Le standard le plus utilisé pour la création des certificats numérique est le X.509.

Il existe 4 types de certificats en fonction du niveau de sécurité:

  • classe 1: adresse e-mail du demandeur requise;
  • classe 2: preuve de l’identité requise (photocopie de carte d’identité par exemple);
  • classe 3: présentation physique du demandeur obligatoire.
  • classe 3+: identique à la classe 3, mais le certificat est stocké sur un support physique (clé USB à puce, ou carte à puce; exclut donc les certificats logiciels)

Tel qu’on l’utilise en cryptographie et en sécurité informatique, un certificat électronique est un bloc de données contenant, dans un format spécifié, les parties suivantes :

  • un numéro de série;
  • l’identification de l’algorithme de signature;
  • la désignation de l’autorité de certification émettrice du certificat;
  • la période de validité au-delà de laquelle il sera suspendu ou révoqué;
  • le nom du titulaire de la clé publique;
  • l’identification de l’algorithme de chiffrement et la valeur de la clé publique constitué d’une paire de clés asymétriques (comme par exemple RSA);
  • des informations complémentaires optionnelles;
  • l’identification de l’algorithme de signature et la valeur de la signature numérique.

Voila pour la définition, il faut savoir qu’au sein du kesytore nous pouvons stocker un certificat avec sa clef publique et y associer sa clef privé afin de pouvoir l’exploiter dans le cadre de la signature électronique ou de l’encryption de documents.

Il est important de noter aussi qu’en fonction de l’usage prévu pour un certificat (horodatage, signature de code, authentification server, email etc…) il est nécessaire de le spécifier, voir exemple 4 de cet article -> création d’un certificat permettant la création de jeton d’horodatage.

Nous allons donc créer notre paire de clefs public / privé, notre certificat et l’ajouter à notre keystore

1 Création de la paire de clefs

    public static KeyPair generateKeyPair() throws CryptoException
    {
        try {
            KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
            SecureRandom rand = SecureRandom.getInstance("SHA1PRNG");
            keyPairGen.initialize(2048, rand);
            KeyPair keyPair = keyPairGen.generateKeyPair();

            return keyPair;
        }
        catch (NoSuchAlgorithmException ex) {
            throw new CryptoException("Probleme lors de la création de la pair de clef : "+ex.getMessage());
        }
        catch (InvalidParameterException ex) {
            throw new CryptoException("Probleme lors de la création de la pair de clef : "+ex.getMessage());
        }
    }

2 Creation du certificat de type X509 V1

Continue reading “Cryptographie java, les certificats X509″


jan 22 2008

Cryptographie java, les keystores

Tag: Développement, J2EEkarl verger @ 21:37

Bien hier nous avons vu comment générer des clef symétrique AES et des clefs asymétriques RSA et comment les utiliser pour réaliser un cryptage décryptage avec ces clefs.

Ce soir nous allons aborder la gestion des keystores (création, sauvegarde, chargement, ajout de certificat), les keystore servent à stocker vos certificats et clefs, pour l’exemple on ne traite que les keystores PKCS#12

wikipedia : Les PKCS (Public Key Cryptographic Standards), ou standards de cryptographie à clé publique, sont un ensemble de spécifications conçues par les laboratoires RSA en Californie. La société RSA Security est spécialisée dans les solutions de sécurité cryptographiques. Elle est également propriétaire de licences d’exploitations de plusieurs algorithmes (dont RSA avant l’expiration de son brevet le 21 septembre 2000). C’est pour ces raisons que la société a développé et promu les PKCS, permettant l’implantation des techniques de cryptographie à clé publique.

La société RSA Security n’est pas un organisme de normalisation et contrôle complètement l’élaboration et l’évolution des PKCS. L’appellation des PKCS comme standards au sens strict est donc abusive. Répondant à un réel besoin technique, les PKCS ont néanmoins été très largement adoptés par le milieu informatique. Le groupe de travail PKIX de l’IETF a depuis reformulé certains des PKCS dans des RFC, les standards Internet. L’abus de langage confondant le PKCS au lieu de la RFC correspondante est très répandu.

CS#12 1.0 Standard de syntaxe d’information personnelle Définit un format de fichier généralement utilisé pour stocker la clé privée et le certificat de clé publique correspondant en les protégeant par un mot de passe.

1 Créer un keystore de manière programmatique

    public static KeyStore createKeyStorePKCS12() throws CryptoException{
        try {
            KeyStore keyStore = null;
            keyStore = KeyStore.getInstance("PKCS12", "BC");
            keyStore.load(null, null);
            return keyStore;
        } catch (IOException ex) {
            Logger.getLogger(KeyStoreUtil.class.getName()).log(Level.SEVERE, null, ex);
            throw new CryptoException("Problème IO : "+ex.getMessage());
        } catch (NoSuchAlgorithmException ex) {
            Logger.getLogger(KeyStoreUtil.class.getName()).log(Level.SEVERE, null, ex);
            throw new CryptoException("Problème d'algo : "+ex.getMessage());
        } catch (CertificateException ex) {
            Logger.getLogger(KeyStoreUtil.class.getName()).log(Level.SEVERE, null, ex);
            throw new CryptoException("Problème de certificat : "+ex.getMessage());
        } catch (KeyStoreException ex) {
            Logger.getLogger(KeyStoreUtil.class.getName()).log(Level.SEVERE, null, ex);
            throw new CryptoException("Problème sur le keystore : "+ex.getMessage());
        } catch (NoSuchProviderException ex) {
            Logger.getLogger(KeyStoreUtil.class.getName()).log(Level.SEVERE, null, ex);
            throw new CryptoException("Problème de provider : "+ex.getMessage());
        }
    }

Continue reading “Cryptographie java, les keystores”


jan 21 2008

Cryptographie java, clef AES et RSA

Tag: Développement, J2EEkarl verger @ 21:29

Bon allez, une petite série dans la continuité des articles sur la signature électronique, on vas faire un petit tours rapide de la crypto symétrique et asymétrique avec java.

1 Encryption avec une clef symétrique AES

wikipédia : Le standard de chiffrement avancé (Advanced Encryption Standard ou AES) est un algorithme de chiffrement symétrique, choisi en octobre 2000 par le NIST pour être le nouveau standard de chiffrement pour les organisations du gouvernement des États-Unis.

générer une clef symétrique AES

    public static SecretKey generateKeyAES128() throws NoSuchAlgorithmException {
        KeyGenerator keyGen = KeyGenerator.getInstance("AES");
        keyGen.init(128);
        return keyGen.generateKey();
    }

puis crypter avec cette clef secrète AES

    public static byte[] cryptWithAES(byte[] plaintext, byte[] bytesKey) throws CryptoException {
        try {
            Cipher cipher = Cipher.getInstance("AES");
            cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(bytesKey, "AES"));
            byte[] encrypted = cipher.doFinal(plaintext);
            return encrypted;
        } catch (NoSuchAlgorithmException ex) {
            throw new CryptoException(ex.getMessage());
        } catch (NoSuchPaddingException ex) {
            throw new CryptoException(ex.getMessage());
        } catch (InvalidKeyException ex) {
            throw new CryptoException(ex.getMessage());
        } catch (IllegalBlockSizeException ex) {
            throw new CryptoException(ex.getMessage());
        } catch (BadPaddingException ex) {
            throw new CryptoException(ex.getMessage());
        }
    }

Continue reading “Cryptographie java, clef AES et RSA”


jan 16 2008

Signature électronique Horodatage BouncyCastle 2

Tag: Architecture, Développementkarl verger @ 23:36

Bon voila la suite du 1er article , nous allons donc

  1. Créer un keystore contenant les clefs privés et public

  2. Création d’un jeton d’horodatage

  3. Signature électronique d’un document (PKCS#7)

  4. Vérification d’une signature

1 Créer un keystore contenant les clefs privés et public

dans un premier temps vous devez télécharger un petit utilitaire qui vous simplifiera la vie pour vos test KeyTool IUI Plus.

Une fois cela fait vous lancer l’outil en executant run.sh.

signature-electronique-horodatage-bouncycastle_html_m6ed7e5e1.jpg

 

Continue reading “Signature électronique Horodatage BouncyCastle 2″


Page suivante »