jeudi 8 décembre 2011

Struts2 : Utilisation des attributs dans la méthode prepare()

Lorsque vous souhaitez initialiser certains attributs de votre action Struts 2 en fonction des données saisies par l'utilisateur, telles que des listes déroulantes par exemple, votre action doit implémenter l'interface Preparable. Ainsi, avant chaque appel d'une méthode de votre action, la méthode prepare() est appelée.

public class MonAction extends ActionSupport implements Preparable {
    ...
        public void prepare() {
              // En fonction des attributs recus, initialiser ici les attributs de votre action qui seront transmis à votre vue
        }
}
D'après la documentation officielle de Struts 2, pour utiliser la méthode prepare(), il faut aussi utiliser l'interceptor prepare correspondant dans votre struts.xml.
De plus, pour que les attributs soient disponibles dans prepare(), l'astuce consiste en fait à ré appeler l'interceptor params avant prepare, comme indiqué ci-dessous :

<!-- Calls the params interceptor twice, allowing you to
      pre-load data for the second time parameters are set -->
 <action name="someAction" class="com.examples.SomeAction">
     <interceptor-ref name="params"/>
     <interceptor-ref name="prepare"/>
     <interceptor-ref name="basicStack"/>
     <result name="success">good_result.ftl</result>
 </action>


Mais si vos vues contiennent des checkbox,  cela n'est pas suffisant. Cela provoque en effet une erreur du genre :
OgnlValueStac W com.opensymphony.xwork2.util.logging.commons.CommonsLogger warn Error setting expression '__checkbox_xxxx' with value '[Ljava.lang.String;@1f7c9ad'
ognl.OgnlException: target is null for setProperty(null, "xxxx", [Ljava.lang.String;@1f7c9ad)

Pour résoudre ce problème, il faut en fait aussi utiliser l'interceptor checkbox en double

<action name="someAction" class="com.examples.SomeAction">
     <interceptor-ref name="checbox"/>
     <interceptor-ref name="params"/>
     <interceptor-ref name="prepare"/>
     <interceptor-ref name="basicStack"/>
     <result name="success">good_result.ftl</result>
 </action>

vendredi 2 décembre 2011

Jasig CAS : Récupérer les attributs LDAP


Voici une précision pour configurer son serveur SSO CAS avec une athentification LDAP et récupérer des attributs LDAP dans son application caséifiée.

La doc officielle CAS n'est pas assez précise sur le sujet ni très à jour vis à vis de la dernière version  3.4.11


Configuration du serveur CAS pour une authentification LDAP

Modifier le fichier deployerConfigContext.xml comme suit.

Au niveau du handler qui gére le login/password, préciser que l'on veut s'identifier via ldap :

<property name="authenticationHandlers">
            <list>
               <bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
                    p:httpClient-ref="httpClient" />
              
                <bean class="org.jasig.cas.adaptors.ldap.BindLdapAuthenticationHandler"
                  p:filter="mail=%u"
                  p:searchBase="dc=example,dc=com"
                  p:contextSource-ref="contextSource"
                  />

                
            </list>
</property>

Ici, la vérification du login/password s'effectuera via ldap avec BindLdapAuthenticationHandler.
p:filter="mail=%u" : précise que le mail est utilisé en login
p:searchBase="dc=example,dc=com" : précise la chaine de recherche dans l'annuaire ldap
p:contextSource-ref="contextSource" : précise de rechercher les infos du ldap dans le bean contextSource

La configuration du ldap est effectué comme ceci :

<bean id="contextSource" class="org.springframework.ldap.core.support.LdapContextSource">
      <property name="pooled" value="false"/>
   
      <property name="url" value="ldap://localhost" />
   
      <property name="userDn" value="cn=Directory Manager"/>
      <property name="password" value="xxxx"/>
   
      <!-- Place JNDI environment properties here. -->
      <property name="baseEnvironmentProperties">
        <map>
          <!-- Three seconds is an eternity to users. -->
          <entry key="com.sun.jndi.ldap.connect.timeout" value="3000" />
          <entry key="com.sun.jndi.ldap.read.timeout" value="3000" />
   
          <!-- Explained at http://download.oracle.com/javase/1.3/docs/api/javax/naming/Context.html#SECURITY_AUTHENTICATION -->
          <entry key="java.naming.security.authentication" value="simple" />
        </map>
      </property>
 </bean>
Avec :
url : url du ldap ((ici localhost)
userDn : login administrateur du ldap
password : mot de passe de l'administrateur du ldap


Ensuite au niveau de l'authentification, pour préciser comment récupérer les attributs, il faut ajouter :

<bean class="org.jasig.cas.authentication.principal.UsernamePasswordCredentialsToPrincipalResolver" >
       <property name="attributeRepository" ref="attributeRepository" />
</bean>
 Et l'on définit le repository où trouver les attributs :

<bean id="attributeRepository"  class="org.jasig.services.persondir.support.ldap.LdapPersonAttributeDao">
      <property name="contextSource" ref="contextSource" />
      <property name="baseDN" value="dc=example,dc=com" />
      <property name="requireAllQueryAttributes" value="true" />
   
      <!--
      Attribute mapping beetween principal (key) and LDAP (value) names
      used to perform the LDAP search.  By default, multiple search criteria
      are ANDed together.  Set the queryType property to change to OR.
      -->
      <property name="queryAttributeMapping">
        <map>
          <entry key="username" value="mail" />
        </map>
      </property>
   
      <property name="resultAttributeMapping">
        <map>
        <!-- Mapping beetween LDAP entry attributes (key) and Principal's (value) -->
        <entry key="cn" value="Name"/>
        <entry value="Telephone" key="telephoneNumber" />
        <entry value="Fax" key="facsimileTelephoneNumber" />
        </map>
      </property>
    </bean>
Ici le repository où CAS va aller chercher les attributs complémentaires et l'annuaire ldap lui-même. Mais il est aussi possible de lui dire d'aller chercher des attributs autre part, dans une base de données, etc...

queryAttributeMapping : permet de préciser que le mail sert de clé à la recherche dans le ldap
resultAttributeMapping : liste des attributs à récupérer du ldap (telephoneNumber et facsimileTelephoneNumber sont renommés en Telephone et Fax)


Voici la partie qui a été le plus difficile à trouver... En effet, il faut explicitement préciser pour chaque service quels attributs sont autorisés à remonter au niveau de l'application cliente...
 <bean class="org.jasig.cas.services.RegisteredServiceImpl">
                        <property name="id" value="0" />
                        <property name="name" value="HTTP" />
                        <property name="description" value="Only Allows HTTP Urls" />
                        <property name="serviceId" value="http://**" />
                        <property name="evaluationOrder" value="10000001" />
                        <property name="allowedAttributes" >
                            <list>
                                <value>Telephone</value>
                                <value>Fax</value>                                                      
                            </list>
                        </property>
</bean>

Ici allowedAttributes liste les attributs qui seront renvoyés à l'application cliente via HTTP



Configuration de l'application web java cliente

Il faut configurer la webapp afin d'utiliser le protocole SAML Pour cela modifier le fichier web.xml comme indiqué dans la documentation CAS
 
Ensuite on récupère les attributs comme ceci :

        AttributePrincipal principal = (AttributePrincipal)request.getUserPrincipal();
       
        Map attributes = principal.getAttributes();
       
        Iterator attributeNames = attributes.keySet().iterator();
       
        out.println("Attributs<table>");
       
        for (; attributeNames.hasNext();) {
        out.println("<tr><th>");
        String attributeName = (String) attributeNames.next();
              out.println(attributeName);
              out.println("</th><td>");
              Object attributeValue = attributes.get(attributeName);
              out.println(attributeValue);
              out.println("</td></tr>");
        }
       
        out.println("</table>");
        


vendredi 25 novembre 2011

Tomcat : Configurer le serveur en https

Voici la procédure pour configurer son Tomcat en https 

Etape 1 - Création du certificat Tomcat

C:\Program Files (x86)\Java\jdk1.6.0_13\bin>keytool -delete -alias tomcat

C:\Program Files (x86)\Java\jdk1.6.0_13\bin>keytool -list -alias tomcat
Tapez le mot de passe du Keystore : test1234

--- !!! D'apres la doc : mettre le même mot de passe pour la clé tomcat que pour le keystore !!!

C:\Program Files (x86)\Java\jdk1.6.0_13\bin>keytool -genkey -alias tomcat -keyalg RSA
Tapez le mot de passe du Keystore :
Quels sont vos prénom et nom ?
  [Unknown] :  Moi
Quel est le nom de votre unité organisationnelle ?
  [Unknown] : 
Quelle est le nom de votre organisation ?
  [Unknown] :
Quel est le nom de votre ville de résidence ?
  [Unknown] :
Quel est le nom de votre état ou province ?
  [Unknown] :
Quel est le code de pays à deux lettres pour cette unité ?
  [Unknown] :  fr
Est-ce CN=Moi, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=fr ?
  [non] :  oui

Spécifiez le mot de passe de la clé pour <tomcat>
        (appuyez sur Entrée s'il s'agit du mot de passe du Keystore) :


Etape 2 - Exporter le Certificat
C:\Program Files (x86)\Java\jdk1.6.0_13\bin>keytool -export -alias tomcat -file server-tomcat.crt

       
Etape 3 - Importer le certificat dans la jvm du Tomcat

-- Import dans la jvm du Tomcat concernée
C:\Program Files (x86)\Java\jdk1.6.0_13\bin>keytool -import -trustcacerts -keystore ..\jre\lib\security\cacerts -alias tomcat -file server-tomcat.crt

-- Note : Si d'autres jvm clientes veulent se connecter en https à ce serveur, il faudra répeter l'étape pour chaque jvm cliente

-- Lister les certificats de la jvm
C:\Program Files (x86)\Java\jdk1.6.0_13\bin>keytool -list -keystore ..\jre\lib\security\cacerts
       
       
Etape 4 - Activation du ssl dans tomcat

-- Dans le fichier server.xml, décommenter et modifier le bloc comme suit

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"  
               maxThreads="150" scheme="https" secure="true"
               keystorePass="test1234" keyalias="tomcat"
               clientAuth="false" sslProtocol="TLS" />
   
-- pour tester : https://localhost:8443/



Liens : http://tomcat.apache.org/tomcat-6.0-doc/ssl-howto.html#Configuration

vendredi 4 novembre 2011

Flash Builder : Quelques bons tutoriaux pour démarrer

Voici quelques bons tutoriaux, blogs et références sur Flash Builder et le développement ActionScript :

Adobe - Formation vidéo sur Flash Builder - 1 semaine

http://www.adobe.com/devnet/flex/videotraining.html

Adobe - Construire sa première application Flex pour mobile – Twitter Trends

http://www.adobe.com/devnet/flex/articles/twitter-trends.html

Adobe - Developing Mobile Applications with ADOBE® FLEX® and ADOBE® FLASH® BUILDER
http://help.adobe.com/en_US/flex/mobileapps/developing_mobile_apps_flex.pdf

Adobe - Examples and case studies
http://www.adobe.com/devnet/flex/samples.html

Adobe Flex Tutorial : Tutoriaux Adobe Flex & Air en français

http://www.flex-tutorial.fr

Flex-info.fr en français
http://www.flex-info.fr

Adobe - Tour de Flex - Tour de Flex est une application AIR permettant de d'apprendre Flex et AIR
http://flex.org/tour/


dimanche 30 octobre 2011

Flash Builder 4.5 : Personnaliser son application mobile

Après avoir implémenté toutes les fonctionnalités de mon application mobile, la seconde étape avant sa publication en ligne, a été de la personnaliser afin de lui donner un look & feel propre (couleur de fond, couleur du texte, icône, image en background, etc...)

Flash Builder 4.5 met à notre disposition plusieurs techniques pour personnaliser son application :
  • Les attributs des composants
  • L'utilisation d'une feuille de style comme pour le web
  • L'écriture d'un skin pour overriter le skin par défaut du composant que l'on souhaite personnaliser
 
 
La modification des attributs directement dans le composant est la technique la plus rapide et la plus accessible car nous pouvons le faire directement dans l'IDE. Attention toutefois, tous les attributs disponibles dans l'IDE ne s'appliquent pas au composant...

 
 
L'utilisation d'une feuille de style est basée sur la même technique que la personnalisation d'une application web. Il faut pour cela utiliser la balise <fx:Style>...</fx;Style>. Vous pouvez aussi utiliser les class et les id. A noter toutefois, comme pour la modification directe via l'IDE des attributs du composant, il est aussi difficile de savoir quels attributs s'appliquent au composant et quels autres ne s'appliquent pas...


Enfin, la dernière solution est l'écriture d'un skin propre au composant. C'est la seule solution permettant la personnalisation totale du composant mais c'est aussi la solution la plus complexe. Elle permet de redéfinir le graphisme du composant mais aussi son comportement. La grande difficulté que j'ai rencontré en mettant en œuvre cette solution a été de savoir de quoi partir pour personnaliser le composant. Sur ce point j'ai été un peu déçu par Flash Builder. Car la fonctionnalité, même si elle est un peu documentée par Adobe par des exemples assez classiques, ne permet pas une prise en main aisée. En effet, pour personnaliser totalement un composant de base Spark, il faut savoir comment il est construit et comment il fonctionne et cela n'est pas trivial si cela n'est pas assez documenté.
Finalement je me suis aperçu qu'on pouvait retrouver les skins par défaut d'Adbobe dans le package spark.skins.spark et ainsi partir de la source pour personnaliser son composant. 

Pour utiliser dans un composant le skin que l'on vient de créer, il suffit d'utiliser son attribut skinClass="..."


vendredi 21 octobre 2011

Créer votre première application mobile Flex avec Flash Builder 4.5

Ca y est je m'y suis mis...à Flex

J'avais juré de ne jamais touché "aux langages propriétaires" genre ActionScript
Et aussi mais surtout aux applications Mobiles...

Il faut bien un début à tout vous me direz mais là finalement je trouve qu'avec Flash Builder 4.5 je m'en sort bien. J'ai été agréablement surpris par ce produit. Il faut dire que je ne connaissais pas donc c'est pas dur...

Plusieurs points positifs pour Flash Builder :
  • Finalement l'ActionScript 3 c'est très très proche du Java (si si je vous assure). Le seul truc mortel c'est la déclaration des variables inversée. Exemple : var nom:String;
  • Flash Builder 4.5 est basé sur Eclipse, mon IDE préféré
  • Le produit est plutôt bien fini : Possibilité de construire ses écrans visuellement, de débugger, rapidité d'exécution du device et wizard pour exporter et packager son application (pas essayé encore...)
  • Il y a plein de tutoriaux sur le net
  • Et surtout Flash Builder 4.5 permet de construire une application à la fois pour iOS/iPhone/iPad, Android et BlackBerry Tablet OS. Donc pour les 3 systèmes mobiles majeurs et ce en écrivant une seule fois le source
Les points négatifs : un seul pour l'instant mais je découvre...
  • Flash Builder 4.5 est un produit payant (500 euros environ)

J'ai également trouvé un bon tutorial
http://www.adobe.com/devnet/flex/articles/twitter-trends.html


Prochaine étape : Publier mon application

mercredi 19 octobre 2011

42ème étage : Parodie des SSII ou simple réalité ?

42ème étage est une web série dont le thème est la vie dans une Société de Services en Ingénierie Informatique (SSII). Cette série humoristique française, à la Caméra Café, se passe dans un ascenseur. Elle met en scène les personnages principaux qui sont un commercial et un ingénieur.

Pour tous ceux qui ne connaissent pas les SSII, cette série reste humoristique

Les personnes qui connaissent un peu ce milieu diront que le principe même d'une SSII est de proposer des services, et donc d'embaucher des ingénieurs pour les placer chez des clients. Cette série est alors une parodie.

Mais si on baigne vraiment bien le monde des SSII, on pourrait aussi dire, en exagérant un peu bien sûr...que les SSII embauchent des troupeaux d'ingénieurs que les commerciaux doivent vendre...En effet, qui n'a pas reconnu dans les personnages de cette série, Clara, Gérard ou Stéphane le commercial de sa propre société...Charles ou Jean-François, son collègue de bureau ;-) Qui n'a jamais été vendu en tant qu'expert dans une techno au motif que dans sa précédente mission il a travaillé quelques jours sur cette techno...Qui n'a jamais été envoyé à St-Denis ou à St Quentin-en-Yvelines, avec en excuse " Oui, c'est un peu loin...Mais la mission est super intéressante ! ". Qui ne s'est jamais entendu dire "La société compte sur toi. Tu ne veux pas mettre en péril la société...".  Qui n'a jamais rajouté sur son cv un projet réalisé en interne et super valorisant...


Alors simple parodie ou cruelle réalité ?

Vous pouvez donc regarder cette série sous plusieurs angles...Mais dans tous les cas, amusez-vous et regardez la série, elle en vaut le coup :  http://www.42eme.com/http://www.42eme.com/

vendredi 14 octobre 2011

Présentation de la Taglib Displaytag

Un article intéressant sur la librairie j2ee Displaytag

En J2EE, la librairie Displaytag offre une solution rapide, pratique et efficace à ce problème. Cette Taglib offre un mécanisme très simple d'itération sur une collection, celui-ci s'exécutant directement depuis le code d'une jsp. Le résultat donne l'affichage d'un tableau html avec une quantité d'options telles que les tris sur les colonnes, la pagination, le regroupement de données ou encore l'export du tableau aux formats csv, excel, xml, pdf ou rtf.


Cet article date un peu...Mais on n'a pas encore fait mieux pour gérer les TABLE en HTML ;-))

Lien : http://ewawszczyk.developpez.com/tutoriel/java/taglib-displaytag/