dimanche 25 avril 2010

SAX vs DOM vs JAXB




   L’approche SAX  consiste à parcourir le fichier xml et passer chaque partie du fichier à l’application. L’application peut alors utiliser les informations reçues par le parseur mais elle ne peut pas les modifier car rien n’est enregistré dans la mémoire.

   L’approche DOM consiste à créer une arborescence  d’objet  qui représente l’organisation des données  dans le document.  Cette arborescence est  enregistrée en mémoire et  l’application peut alors accéder à l’information voulue pour l’utiliser ou même pour la modifier. 

   Un autre outil plus efficace et plus facile est JAXB (Java Architecture for XML Binding). La manipulation d’un fichier xml à partir d’une application java repose sur 2 opérations :
  •   La première consiste à « convertir » le schéma de notre fichier xml en des classes  java.  Ce schéma est une spécification xml qui permet de définir les composants utilisés, la structure des composants, l’hiérarchie du document … Un fichier xml ne doit pas nécessairement avoir son schéma associe mais s’il possède. Il doit le respecter sinon il est considéré comme étant non valide.  JAXB utilise ce schéma et il exige que ce dernier soit écrit en  W3C XML Schema Language.
  •   La deuxième consiste à généré une collection d’objets à partir du fichier xml. Cette collection d’objet  contient des instances de classes. Ces derniers représentent le résultat de la conversion qui a été faite dans l’étape précédente.  On peut alors accéder à cette collection générée facilement pour trouver les informations nécessaires.


    Maintenant, on peut modifier le fichier xml ou même créer un nouveau en utilisant les classes générées. Merci JAXB .



dimanche 28 février 2010

Installation du jboss jbpm 4.3



Ce tutoriel a pour but d'installer Jbpm 4.3 avec le serveur d’application jboss 5.0.1.GA. La base de données utilisée est Mysql 5.


Modification de la configuration 

Dans le fichier JbpmHome/install/build.xml:


<property name="jboss.version" value="5.1.0.GA" >
<property name="jboss.parent.dir" value="${jbpm.home}" >
<property name="jboss.home" value="JbossHome" >


Dans le fichier JbpmHome/install/jdbc/mysql.properties:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/jbpm4
jdbc.username=jboss
jdbc.password=jboss

Création de la base de données :

CREATE DATABASE jbpm4;
GRANT ALL PRIVILEGES ON *.* TO jboss@localhost
-> IDENTIFIED BY 'jboss' WITH GRANT OPTION;

Installation de la base: 

Il suffit d’exécuter la cible create.jbpm.schema dans le dossier JbpmHome/install.

> ant –Ddatabase=mysql create.jbpm.schema

Installation de jbpm dans jboss:

Il suffit d’exécuter la cible

> ant –Ddatabase=mysql install.jbpm.into.jboss

samedi 20 février 2010

Tutoriel Jaas avec jboss

Bonjours,
Avant de commencer il faut préciser que dans ce tutoriel je vais utiliser l’implémentation Jboss de Jaas.
Pour ajouter la sécurité Jaas à un projet Jee, il faut modifier 3 fichiers xml :
- login-config.xml dans JBOSS_HOME/server/default/conf
- jboss-web.xml dans /WebContent/WEB_INF
- web.xml dans /WebContent/WEB_INF

Dans le fichier login-config.xml on doit ajouter les règles de sécurités :
<application-policy name="mysqlLogin">
<authentication>
<login-module
code="org.jboss.security.auth.spi.DatabaseServerLoginModule"
flag="required">
<module-option name="dsJndiName">java:/MySqlDS
</module-option>
<module-option name="principalsQuery">
select passwd from USERS where login=?
</module-option>
<module-option name="rolesQuery">
select role, 'Roles' from USER_ROLES where login=?
</module-option>
</login-module>
</authentication>
</application-policy>

Ce code permet de préciser un nouveau « login-module »
La classe DatabaseServerLoginModule permet de déterminer l’implémentation jboss nécessaire. Il y a plusieurs autres implémentations. Celle la permet de réaliser l’authentification à partir de la base de données.
dsJndiName permet de préciser le nom JNDI du data source qui permet de se connecté à la base de données.
principalsQuery permet de préciser la requête sql à utiliser pour l’authentification
rolesQuery permet de préciser la requête sql à utiliser pour l’autorisation.
Dans le fichier jboss-web.xml, il faut ajouter le nom JNDI du domaine de sécurité.


Dans notre cas c’est java:/jaas/mysqlLogin

<jboss-web>
<security-domain>java:/jaas/mysqlLogin</security-domain>
</jboss-web>
C’est à partir de ce fichier que l’application va pouvoir déterminé les règles de sécurités.
Dans le fichier web.xml il faut mettre les configurations suivantes :

<security-constraint>
<web-resource-collection>
<web-resource-name>webRessourcetest</web-resource-name>
<url-pattern>/faces/hich.jsp</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>

</web-resource-collection>
<auth-constraint>
<role-name>hichem</role-name>
</auth-constraint>

<user-data-constraint>
<description />
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
</security-constraint/>

<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/login.jsp</form-login-page>
<form-error-page>/bad-login.jsp</form-error-page>
</form-login-config>
</login-config>
<security-role>
<role-name>hichem</role-name>
</security-role>

Dans cet exemple j’ai sécurisé la page admin.jsf. Seulement le Principale possédant le rôle « hichem » qui peut y accéder.
Si on fait un appel direct à cet page une redirection sera faite à login.jsf.
Si les paramètres d’authentification sont invalides une redirection sera effectuée vers la page badlogin.jsf.
Il reste alors à créer la page login.jsp suivante:

<form name="loginForm" method="post" action="j_security_check">
<table>
<tr>
<td>User Name:</td>
<td><input type="text" name="j_username"/></td>
</tr>
<tr>
<td>Password:</td>
<td><input type="password" name="j_password"/></td>
</tr>
<tr colspan="2">
<td><input type="submit" value="login"></td>
</tr>
</table>
</form>

Ainsi on a put sécuriser notre application web.
Maintenant pour sécuriser nos EJB sessions on 3 méthodes :
- avec les annotations.
- Avec les fichiers de configuration xml.
- En faisant appel direct au context.

Dans ce tutoriel je vais utiliser la dernière

@Stateless
public class HelloJaasBean implements HelloJaasLocal {
@Resource SessionContext context;
public void sayHelloHichem() {
if (context.isCallerInRole("hichem"))
System.out.println("hello hichem");
}
}
Ainsi Seulement les personnes possédant le rôle « hichem » peuvent accéder à cette méthode