RSS Feed

Archive de July, 2006

SpamClear – notification par mail

28 July 2006 par SeB 2 commentaires »

J’ai installé SpamClear sur ce weblogue et il me rend de précieux services. Après plus de deux mois d’utilisation, le bilan est positif. Il arrête quasiment tous les SPAMs. Parfois, une poignée de SPAMs passe à travers le filtre[1]. Mais une rapide mise à jour du filtre, en fonction de ces SPAMs, permet d’améliorer le comportement de SpamClear.

Il y a tout de même un point négatif. En effet, SpamClear envoie une notication par mail pour chaque commentaire ou rétrolien considéré comme SPAM. Du coup, l’administrateur du site reçoit énormement de mails de notification[2]. Et c’est alors la boîte mail qui se retrouve spammée ! :-/

J’ai contacté Mahdi BEN HAMIDA, l’auteur de SpamClear, pour lui expliqué mon problème. Il m’a répondu que dans SpamClear v2 la notification par mail sera optionnelle. Et il m’a gentillement proposé d’appliquer une petite modification de SpamClear pour ne plus recevoir ces mails de notification.

Pour celà, il faut modifier deux fichiers qui se trouvent dans le répertoire d’installation de SpamClear.

Dans postcon.php, rechercher la ligne :

if (dc_comment_notification && $news->f('user_email') != '' && $news->f('user_email') != $c_mail)

Et la remplacer par :

if (dc_comment_notification && $news->f('user_email') != '' && $news->f('user_email') != $c_mail && !$spam)

Dans inc/tb.php, rechercher la ligne :

if (dc_comment_notification && $post->f('user_email') != '')

Et la remplacer par :

if (dc_comment_notification && $post->f('user_email') != '' && !$spam)

Après avoir effecté ces modifications, vous serez libéré de tous les mails de notifications de SPAM ! :-)

Encore merci Mahdi !

Notes

[1] Ce qui est très rare.

[2] Tout dépend de l’activité des spammeurs. Mais je vous assure que celà devient très vite handicapant.

 

Eclipse WTP – impossible de déployer des EJBs dans JOnAS

27 July 2006 par SeB 2 commentaires »

En utilisant WTP 1.5 et Eclipse 3.2, lors du déploiement de modules EJBs dans JOnAS, il arrive de rencontrer cette erreur dans la console JOnAS :

 2006-07-26 09:46:10,105 :
Server.start :
Le serveur JOnAS 'jonas' est démarré sur rmi/jrmp 2006-07-26 09:47:03,589 :
EarServiceImpl.unDeployEarMBean :
Error when trying to get the canonical file from C:/JONAS_4_7_5/apps/autoload/myproject-ear.earSyntaxe du nom de fichier, de répertoire ou de volume incorrecte C:/JONAS_4_7_5/apps/autoload/myproject-ear.ear is using DTDs, WsGen needs Schema only : META-INF/jonas-ejb-jar.xml use a DTD. Only XML Schema are accepted for J2EE 1.4 webservices 2006-07-26 09:47:05,261 :
EJBServiceImpl.checkGenIC :
JOnAS version was not found in the '/C:/JONAS_4_7_5/work/apps/jonas/myproject-ear_2006.07.26-09.47.04/myproject-ejb.jar' manifest file. Auto-generating container classes...
GenIC for JOnAS 4.7.5: 'MyService' generation ... No javac command was found at 'C:Program FilesJavajre1.5.0_07..binjavac'. Check that you are using a JDK and not a JRE. 2006-07-26 09:47:06,402 :
Cmd.run :
exception java.io.IOException:
CreateProcess: "C:/Program Files/Java/jre1.5.0_07/../bin/javac" -classpath C:/DOCUME~1/MYUSERLOCALS~1/Temp/genic6738.tmp;/C:/JONAS_4_7_5/work/apps/jonas/myproject-ear_2006.07.26-09.47.04/myproject-ejb.jar;;C:/JONAS_4_7_5/conf;C:/JONAS_4_7_4/conf;C:/JONAS_4_7_5/lib/commons/j2ee/connector-1_5.jar;C:/JONAS_4_7_5/lib/commons/j2eeejb-2_1-api.jar;C:/JONAS_4_7_5/lib/commons/j2ee/emb-jsr86-api.jar;C:/JONAS_4_7_5/lib/commons/j2ee/gnu-jaf.jar;C:/JONAS_4_7_5/lib/commons/j2ee/gnu-mail.jar;C:/JONAS_4_7_5/lib/commons/j2ee/gnu-providers.jar;C:/JONAS_4_7_5/lib/commons/j2ee/jacc-1_0.jar;C:/JONAS_4_7_5/lib/commons/j2ee/javax77.jar;C:/JONAS_4_7_5/lib/commons/j2ee/jaxr-api.jar;C:/JONAS_4_7_5/lib/commons/j2ee/jaxrpc.jar;C:/JONAS_4_7_5/lib/commons/j2eejms.jar;C:/JONAS_4_7_5/lib/commons/j2ee/jsp-2_0.jar;C:/JONAS_4_7_5/lib/commons/j2ee/jsr88-api.jar;C:/JONAS_4_7_5/lib/commons/j2ee/jta-spec1_0_1.jar;C:/JONAS_4_7_5/lib/commons/j2ee/saaj.jar;C:/JONAS_4_7_5/lib/commons/j2ee/servlet-2_4.jar;C:/JONAS_4_7_5/lib/commons/j2ee/wsdl4j.jar;C:/JONA”
	at java.lang.ProcessImpl.create(Native Method)
	at java.lang.ProcessImpl.<init>(Unknown Source)
	at java.lang.ProcessImpl.start(Unknown Source)
	at java.lang.ProcessBuilder.start(Unknown Source)
	at java.lang.Runtime.exec(Unknown Source)
	at java.lang.Runtime.exec(Unknown Source)
	at org.objectweb.common.Cmd.run(Cmd.java:147)
	at org.objectweb.jonas_ejb.genic.GenIC.compilClasses(GenIC.java:887)
	at org.objectweb.jonas_ejb.genic.GenIC.main(GenIC.java:425)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.objectweb.jonas_ejb.genic.wrapper.GenicServiceWrapper.callGenic(GenicServiceWrapper.java:68)
	at org.objectweb.jonas.server.J2EEServerMBean.callGenic(J2EEServerMBean.java:450)
	at org.objectweb.jonas.server.J2EEServerMBean.deployLocalFile(J2EEServerMBean.java:235)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.apache.commons.modeler.BaseModelMBean.invoke(BaseModelMBean.java:454)
	at com.sun.jmx.mbeanserver.DynamicMetaDataImpl.invoke(Unknown Source)
	at com.sun.jmx.mbeanserver.MetaDataImpl.invoke(Unknown Source)
	at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(Unknown Source)
	at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(Unknown Source)
	at org.objectweb.jonas.container.EJBServiceImpl.checkGenIC(EJBServiceImpl.java:1771)
	at org.objectweb.jonas.ear.EarServiceImpl.deployEar(EarServiceImpl.java:803)
	at org.objectweb.jonas.ear.EarServiceImpl.deployEarMBean(EarServiceImpl.java:1219)
	at org.objectweb.jonas.adm.Adm.addEar(Adm.java:288)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
	at org.objectweb.carol.rmi.jrmp.server.JUnicastServerRef.dispatch(JUnicastServerRef.java:143)
	at sun.rmi.transport.Transport$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.rmi.transport.Transport.serviceCall(Unknown Source)
	at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
GenIC fatal error: Failed when compiling the generated classes via java compiler 2006-07-26 09:47:06,418 :
J2EEServerMBean.deployLocalFile :
Cannot generate classes for this application : '/C:/JONAS_4_7_5/work/apps/jonas/myproject-ear_2006.07.26-09.47.04/myproject-ejb.jar. Problems when invoking main method from GenIC:
java.lang.RuntimeException:
Failed when compiling the generated classes via java compiler'. 2006-07-26 09:47:06,496 :
JFactory.checkJonasVersion : failed to find class org.objectweb.jonas_gen.com.mycompany.myproject.JOnASMyService_491313683Home java.lang.ClassNotFoundException: org.objectweb.jonas_gen.com.mycompany.myproject.JOnASMyService_491313683Home
	at java.net.URLClassLoader$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at org.objectweb.jonas_ejb.container.JFactory.checkJonasVersion(JFactory.java:981)
	at org.objectweb.jonas_ejb.container.JFactory.init(JFactory.java:191)
	at org.objectweb.jonas_ejb.container.JFactory.<init>(JFactory.java:168)
	at org.objectweb.jonas_ejb.container.JSessionFactory.<init>(JSessionFactory.java:83)
	at org.objectweb.jonas_ejb.container.JStatelessFactory.<init>(JStatelessFactory.java:83)
	at org.objectweb.jonas_ejb.container.JContainer.addBean(JContainer.java:237)
	at org.objectweb.jonas.container.EJBServiceImpl.createContainer(EJBServiceImpl.java:815)
	at org.objectweb.jonas.container.EJBServiceImpl.deployJars(EJBServiceImpl.java:1477)
	at org.objectweb.jonas.ear.EarServiceImpl.deployEar(EarServiceImpl.java:929)
	at org.objectweb.jonas.ear.EarServiceImpl.deployEarMBean(EarServiceImpl.java:1219)
	at org.objectweb.jonas.adm.Adm.addEar(Adm.java:288)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
	at org.objectweb.carol.rmi.jrmp.server.JUnicastServerRef.dispatch(JUnicastServerRef.java:143)
	at sun.rmi.transport.Transport$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.rmi.transport.Transport.serviceCall(Unknown Source)
	at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
2006-07-26 09:47:06,496 :
EJBServiceImpl.deployJars : Error when deploying '/C:/JONAS_4_7_5/work/apps/jonas/myproject-ear_2006.07.26-09.47.04/myproject-ejb.jar' javax.ejb.EJBException: MyService Cannot load org.objectweb.jonas_gen.com.mycompany.myproject.JOnASMyService_491313683Home
	at org.objectweb.jonas_ejb.container.JSessionFactory.<init>(JSessionFactory.java:98)
	at org.objectweb.jonas_ejb.container.JStatelessFactory.<init>(JStatelessFactory.java:83)
	at org.objectweb.jonas_ejb.container.JContainer.addBean(JContainer.java:237)
	at org.objectweb.jonas.container.EJBServiceImpl.createContainer(EJBServiceImpl.java:815)
	at org.objectweb.jonas.container.EJBServiceImpl.deployJars(EJBServiceImpl.java:1477)
	at org.objectweb.jonas.ear.EarServiceImpl.deployEar(EarServiceImpl.java:929)
	at org.objectweb.jonas.ear.EarServiceImpl.deployEarMBean(EarServiceImpl.java:1219)
	at org.objectweb.jonas.adm.Adm.addEar(Adm.java:288)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
	at org.objectweb.carol.rmi.jrmp.server.JUnicastServerRef.dispatch(JUnicastServerRef.java:143)
	at sun.rmi.transport.Transport$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.rmi.transport.Transport.serviceCall(Unknown Source)
	at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source) Caused by:
java.lang.ClassNotFoundException: org.objectweb.jonas_gen.com.mycompany.myproject.JOnASMyService_491313683Home
	at java.net.URLClassLoader$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at org.objectweb.jonas_ejb.container.JSessionFactory.<init>(JSessionFactory.java:96)
	... 19 more 2006-07-26 09:47:06,496 :
EJBServiceImpl.deployJars : Undeploy ejb-jar of the ear application 2006-07-26 09:47:06,496 : EJBServiceImpl.deployJars : Cannot remove the non-existant container '/C:/JONAS_4_7_5/work/apps/jonas/myproject-ear_2006.07.26-09.47.04/myproject-ejb.jar' 2006-07-26 09:47:06,496 : EarServiceImpl.deployEar :
Error during the deployment of the jars files of the Ear file C:/JONAS_4_7_5/apps/autoload/myproject-ear.ear':
Error during the deployment: javax.ejb.EJBException: MyService Cannot load org.objectweb.jonas_gen.com.mycompany.myproject.JOnASMyService_491313683Home 2006-07-26 09:47:06,496 : EarServiceImpl.deployEarMBean : Cannot deploy file 'C:/JONAS_4_7_5/apps/autoload/myproject-ear.ear'

Comme l’explique à juste titre le message d’erreur, la tâche Ant qui génère les EJBs est lancée par le JRE au lieu du JDK[1]. Et c’est pourquoi l’outil GenIC ne trouve pas le programme javac.

Le problème peut être résolu en lancant votre serveur d’applications[2] avec le JDK au lieu du JRE Pour celà, il faut procéder ainsi :

  • Vérifier la configuration du JDK dans Eclipse
    • Aller dans Windows -> Preferences… -> Java -> Installed JREs
    • S’il n’y a aucun JDK dans la liste des Installed JRE, en ajouter un soit avec Add… soit avec Search…
  • Configurer le serveur d’applications JOnAS avec WTP
    • Aller dans Windows -> Preferences… -> Server -> Installed Runtimes
    • Sélectionner le serveur d’applications utilisé[3] et cliquer sur Edit…
    • Modifier le JRE en sélectionnant un JDK, puis cliquer sur Finish et enfin sur OK

Pour que la modification soit effective, il faut redémarrer le serveur d’application bien entendu. Maintenant vos petits EJBs peuvent être déployés ! :-)

Notes

[1] Il semble que ce soit un bug de Ant !?

[2] Ici JOnAS.

[3] Dans mon cas, c’est JOnAS v4.

lire la suite…

 

Hibernate Tools – Hibernate pour Eclipse & Ant

26 July 2006 par SeB Pas de commentaire »

L’écriture des fichiers de mapping et des Java beans pour Hibernate représente souvent une tâche longue et répétitive. Quelques outils sont sortis pour faciliter cette tâche sans réel succès. Pourtant, Hibernate Tools[1] semble être l’outil qui permet d’augmenter la productivité des développeurs qui s’attelle au travail du mapping entre la base de données et les objets Java avec Hibernate.

Cet outil s’intègre dans Eclipse et est également disponible pour JBoss IDE. Cette solution propose pas moins[2] :

  • d’un éditeur de fichier de mapping
  • d’une console de configuration (connexion aux bases de données, visualisation des relations entre les Java beans, exécution du HQL[3], etc…)
  • ingénierie inverse : génération automatique à partir d’une base de données (fichiers de configuration et de mapping, Java beans, DAO, etc…)
  • des assistants de création
  • des tâches Ant

En résumé, Hibernate Tools permet de gagner énormément de temps lorsqu’il faut générer toute la couche d’accès aux données avec Hibernate. Cependant, il faut lui reconnaître quelques limitations. En effet, lorsque le modèle de la base de données est très proche du modèle objet, il se révèle extrêmement efficace. Malheureusement, le modèle objet n’est pas toujours calqué sur le modèle relationnel. Et dans ce cas Hibernate Tools pêche quelque peu[4].

Même si Hibernate Tools ne répond pas à tous les cas de figures, il a le mérite de bien déblayer le terrain. Puisqu’il est possible de générer une première version d’un mapping simple avec ce dernier, puis de modifier le mapping à la main pour résoudre les cas particuliers.

Un outil à surveiller de très près et surtout à utiliser !

Notes

[1] Il est considéré par certain comme le digne successeur de Middlegen.

[2] Le carnet de route d’Hibernate Tools permet de savoir exactement ce qu’il est possible de faire aujourd’hui et ce qu’il sera possible de faire demain.

[3] Avec une traduction à la volée en SQL !

[4] Même s’il propose de personnaliser l’ingénierie inverse et laisse la possibilité d’implémenter des stratégies d’ingénierie inverse.

 

XDoclet – support des generics pour les EJBs

25 July 2006 par SeB 3 commentaires »

Vous utilisez XDoclet pour générer vos EJBs ? Vous avez essayé d’utiliser les generics dans le prototype des méthodes des EJBs ? Dans ce cas, vous avez sûrement rencontré l’erreur suivante :

Buildfile: C:/projects/workspace-mycompany/.metadata/.plugins/org.eclipse.jst.j2ee.ejb.annotations.xdoclet/tempAnt.xml
init:
ejbdoclet:
[ejbdoclet] (XDocletMain.start                   47  ) Running <deploymentdescriptor/>
[ejbdoclet] Generating EJB deployment descriptor (ejb-jar.xml).
[ejbdoclet] Error parsing File C:/projects/workspace-mycompany/myproject-ejb/ejbModule/com/mycompany/myproject/ejb/MyServiceBean.java:Encountered "<" at line 288, column 56.
[ejbdoclet] Was expecting one of: [ejbdoclet] <IDENTIFIER> ...
[ejbdoclet] "[" ... [ejbdoclet] "." ...
[ejbdoclet] (XDocletMain.start                   47  ) Running <remoteinterface/>
[ejbdoclet] Generating Remote interface for 'com.mycompany.myproject.ejb.MyServiceBean'.
[ejbdoclet] (TemplateEngine.invokeMethod         547 ) Invoking method failed: xdoclet.modules.ejb.intf.InterfaceTagsHandler.extendsFrom, line=10 of template file: jar:file:/C:/JONAS_4_7_5/addons/xdoclet-1.2.3/lib/xdoclet-ejb-module-1.2.3.jar!/xdoclet/modules/ejb/intf/resources/remote.xdt
[ejbdoclet] java.lang.reflect.InvocationTargetException
[ejbdoclet] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[ejbdoclet] at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
[ejbdoclet] at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
[ejbdoclet] at java.lang.reflect.Method.invoke(Unknown Source)
[ejbdoclet] at xdoclet.template.TemplateEngine.invoke(TemplateEngine.java:641)
[ejbdoclet] at xdoclet.template.TemplateEngine.invokeMethod(TemplateEngine.java:540)
[ejbdoclet] at xdoclet.template.TemplateEngine.invokeContentMethod(TemplateEngine.java:620)
[ejbdoclet] at xdoclet.template.TemplateEngine.handleTag(TemplateEngine.java:475)
[ejbdoclet] at xdoclet.template.TemplateEngine.generate(TemplateEngine.java:348)
[ejbdoclet] at xdoclet.template.TemplateEngine.start(TemplateEngine.java:415)
[ejbdoclet] at xdoclet.TemplateSubTask.startEngine(TemplateSubTask.java:562)
[ejbdoclet] at xdoclet.TemplateSubTask.generateForClass(TemplateSubTask.java:779)
[ejbdoclet] at xdoclet.TemplateSubTask.startProcessPerClass(TemplateSubTask.java:679)
[ejbdoclet] at xdoclet.TemplateSubTask.startProcess(TemplateSubTask.java:596)
[ejbdoclet] at xdoclet.TemplateSubTask.execute(TemplateSubTask.java:487)
[ejbdoclet] at xdoclet.XDocletMain.start(XDocletMain.java:48)
[ejbdoclet] at xdoclet.DocletTask.start(DocletTask.java:468)
[ejbdoclet] at xjavadoc.ant.XJavadocTask.execute(XJavadocTask.java:105)
[ejbdoclet] at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:275)
[ejbdoclet] at org.apache.tools.ant.Task.perform(Task.java:364)
[ejbdoclet] at org.apache.tools.ant.Target.execute(Target.java:341)
[ejbdoclet] at org.apache.tools.ant.Target.performTasks(Target.java:369)
[ejbdoclet] at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1216)
[ejbdoclet] at org.apache.tools.ant.Project.executeTarget(Project.java:1185)
[ejbdoclet] at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:40)
[ejbdoclet] at org.eclipse.ant.internal.ui.antsupport.EclipseDefaultExecutor.executeTargets(EclipseDefaultExecutor.java:32)
[ejbdoclet] at org.apache.tools.ant.Project.executeTargets(Project.java:1068)
[ejbdoclet] at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.run(InternalAntRunner.java:423)
[ejbdoclet] at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.main(InternalAntRunner.java:137)
[ejbdoclet] Caused by: java.lang.NullPointerException
[ejbdoclet] at xdoclet.modules.ejb.EjbTagsHandler.extendsFromFor(EjbTagsHandler.java:895)
[ejbdoclet] at xdoclet.modules.ejb.intf.InterfaceTagsHandler.extendsFrom(InterfaceTagsHandler.java:698)
[ejbdoclet] ... 29 more
[ejbdoclet] xdoclet.template.TemplateException: Invoking method in class xdoclet.modules.ejb.intf.InterfaceTagsHandler failed: extendsFrom, line=10 of template file: jar:file:/C:/JONAS_4_7_5/addons/xdoclet-1.2.3/lib/xdoclet-ejb-module-1.2.3.jar!/xdoclet/modules/ejb/intf/resources/remote.xdt, exception: null
[ejbdoclet] at xdoclet.template.TemplateEngine.invokeMethod(TemplateEngine.java:548)
[ejbdoclet] at xdoclet.template.TemplateEngine.invokeContentMethod(TemplateEngine.java:620)
[ejbdoclet] at xdoclet.template.TemplateEngine.handleTag(TemplateEngine.java:475)
[ejbdoclet] at xdoclet.template.TemplateEngine.generate(TemplateEngine.java:348)
[ejbdoclet] at xdoclet.template.TemplateEngine.start(TemplateEngine.java:415)
[ejbdoclet] at xdoclet.TemplateSubTask.startEngine(TemplateSubTask.java:562)
[ejbdoclet] at xdoclet.TemplateSubTask.generateForClass(TemplateSubTask.java:779)
[ejbdoclet] at xdoclet.TemplateSubTask.startProcessPerClass(TemplateSubTask.java:679)
[ejbdoclet] at xdoclet.TemplateSubTask.startProcess(TemplateSubTask.java:596)
[ejbdoclet] at xdoclet.TemplateSubTask.execute(TemplateSubTask.java:487)
[ejbdoclet] at xdoclet.XDocletMain.start(XDocletMain.java:48)
[ejbdoclet] at xdoclet.DocletTask.start(DocletTask.java:468)
[ejbdoclet] at xjavadoc.ant.XJavadocTask.execute(XJavadocTask.java:105)
[ejbdoclet] at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:275)
[ejbdoclet] at org.apache.tools.ant.Task.perform(Task.java:364)
[ejbdoclet] at org.apache.tools.ant.Target.execute(Target.java:341)
[ejbdoclet] at org.apache.tools.ant.Target.performTasks(Target.java:369)
[ejbdoclet] at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1216)
[ejbdoclet] at org.apache.tools.ant.Project.executeTarget(Project.java:1185)
[ejbdoclet] at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:40)
[ejbdoclet] at org.eclipse.ant.internal.ui.antsupport.EclipseDefaultExecutor.executeTargets(EclipseDefaultExecutor.java:32)
[ejbdoclet] at org.apache.tools.ant.Project.executeTargets(Project.java:1068)
[ejbdoclet] at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.run(InternalAntRunner.java:423)
[ejbdoclet] at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.main(InternalAntRunner.java:137)
[ejbdoclet] (XDocletMain.start                   53  ) Running XDoclet failed.
[ejbdoclet] (XDocletMain.start                   54  ) <<Running XDoclet failed.>>
[ejbdoclet] xdoclet.template.TemplateException: Invoking method in class xdoclet.modules.ejb.intf.InterfaceTagsHandler failed: extendsFrom, line=10 of template file: jar:file:/C:/JONAS_4_7_5/addons/xdoclet-1.2.3/lib/xdoclet-ejb-module-1.2.3.jar!/xdoclet/modules/ejb/intf/resources/remote.xdt, exception: null
[ejbdoclet] at xdoclet.template.TemplateEngine.invokeMethod(TemplateEngine.java:548)
[ejbdoclet] at xdoclet.template.TemplateEngine.invokeContentMethod(TemplateEngine.java:620)
[ejbdoclet] at xdoclet.template.TemplateEngine.handleTag(TemplateEngine.java:475)
[ejbdoclet] at xdoclet.template.TemplateEngine.generate(TemplateEngine.java:348)
[ejbdoclet] at xdoclet.template.TemplateEngine.start(TemplateEngine.java:415)
[ejbdoclet] at xdoclet.TemplateSubTask.startEngine(TemplateSubTask.java:562)
[ejbdoclet] at xdoclet.TemplateSubTask.generateForClass(TemplateSubTask.java:779)
[ejbdoclet] at xdoclet.TemplateSubTask.startProcessPerClass(TemplateSubTask.java:679)
[ejbdoclet] at xdoclet.TemplateSubTask.startProcess(TemplateSubTask.java:596)
[ejbdoclet] at xdoclet.TemplateSubTask.execute(TemplateSubTask.java:487)
[ejbdoclet] at xdoclet.XDocletMain.start(XDocletMain.java:48)
[ejbdoclet] at xdoclet.DocletTask.start(DocletTask.java:468)
[ejbdoclet] at xjavadoc.ant.XJavadocTask.execute(XJavadocTask.java:105)
[ejbdoclet] at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:275)
[ejbdoclet] at org.apache.tools.ant.Task.perform(Task.java:364)
[ejbdoclet] at org.apache.tools.ant.Target.execute(Target.java:341)
[ejbdoclet] at org.apache.tools.ant.Target.performTasks(Target.java:369)
[ejbdoclet] at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1216)
[ejbdoclet] at org.apache.tools.ant.Project.executeTarget(Project.java:1185)
[ejbdoclet] at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:40)
[ejbdoclet] at org.eclipse.ant.internal.ui.antsupport.EclipseDefaultExecutor.executeTargets(EclipseDefaultExecutor.java:32)
[ejbdoclet] at org.apache.tools.ant.Project.executeTargets(Project.java:1068)
[ejbdoclet] at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.run(InternalAntRunner.java:423)
[ejbdoclet] at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.main(InternalAntRunner.java:137)
[ejbdoclet] C:projectsworkspace-mycompany.metadata.pluginsorg.eclipse.jst.j2ee.ejb.annotations.xdoclettempAnt.xml:69: XDoclet failed.
[ejbdoclet] at xdoclet.DocletTask.start(DocletTask.java:471)
[ejbdoclet] at xjavadoc.ant.XJavadocTask.execute(XJavadocTask.java:105)
[ejbdoclet] at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:275)
[ejbdoclet] at org.apache.tools.ant.Task.perform(Task.java:364)
[ejbdoclet] at org.apache.tools.ant.Target.execute(Target.java:341)
[ejbdoclet] at org.apache.tools.ant.Target.performTasks(Target.java:369)
[ejbdoclet] at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1216)
[ejbdoclet] at org.apache.tools.ant.Project.executeTarget(Project.java:1185)
[ejbdoclet] at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:40)
[ejbdoclet] at org.eclipse.ant.internal.ui.antsupport.EclipseDefaultExecutor.executeTargets(EclipseDefaultExecutor.java:32)
[ejbdoclet] at org.apache.tools.ant.Project.executeTargets(Project.java:1068)
[ejbdoclet] at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.run(InternalAntRunner.java:423)
[ejbdoclet] at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.main(InternalAntRunner.java:137)
[ejbdoclet] Caused by: xdoclet.XDocletException: Running XDoclet failed.
[ejbdoclet] at xdoclet.TemplateSubTask.generateForClass(TemplateSubTask.java:788)
[ejbdoclet] at xdoclet.TemplateSubTask.startProcessPerClass(TemplateSubTask.java:679)
[ejbdoclet] at xdoclet.TemplateSubTask.startProcess(TemplateSubTask.java:596)
[ejbdoclet] at xdoclet.TemplateSubTask.execute(TemplateSubTask.java:487)
[ejbdoclet] at xdoclet.XDocletMain.start(XDocletMain.java:48)
[ejbdoclet] at xdoclet.DocletTask.start(DocletTask.java:468)
[ejbdoclet] ... 12 more
[ejbdoclet] - - - Nested Exception - - -
[ejbdoclet] xdoclet.XDocletException: Running XDoclet failed.
[ejbdoclet] at xdoclet.TemplateSubTask.generateForClass(TemplateSubTask.java:788)
[ejbdoclet] at xdoclet.TemplateSubTask.startProcessPerClass(TemplateSubTask.java:679)
[ejbdoclet] at xdoclet.TemplateSubTask.startProcess(TemplateSubTask.java:596)
[ejbdoclet] at xdoclet.TemplateSubTask.execute(TemplateSubTask.java:487)
[ejbdoclet] at xdoclet.XDocletMain.start(XDocletMain.java:48)
[ejbdoclet] at xdoclet.DocletTask.start(DocletTask.java:468)
ejbdoclet] at xjavadoc.ant.XJavadocTask.execute(XJavadocTask.java:105)
[ejbdoclet] at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:275)
[ejbdoclet] at org.apache.tools.ant.Task.perform(Task.java:364)
[ejbdoclet] at org.apache.tools.ant.Target.execute(Target.java:341)
[ejbdoclet] at org.apache.tools.ant.Target.performTasks(Target.java:369)
[ejbdoclet] at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1216)
[ejbdoclet] at org.apache.tools.ant.Project.executeTarget(Project.java:1185)
[ejbdoclet] at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:40)
[ejbdoclet] at org.eclipse.ant.internal.ui.antsupport.EclipseDefaultExecutor.executeTargets(EclipseDefaultExecutor.java:32)
[ejbdoclet] at org.apache.tools.ant.Project.executeTargets(Project.java:1068)
[ejbdoclet] at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.run(InternalAntRunner.java:423)
[ejbdoclet] at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.main(InternalAntRunner.java:137)
BUILD FAILED C:projectsworkspace-mycompany.metadata.pluginsorg.eclipse.jst.j2ee.ejb.annotations.xdoclettempAnt.xml:69: Unexpected error Total time: 6 seconds

Comme l’équipe de XDoclet ne semble pas travailler sur le sujet[1], Nicolas Leroux s’est penché sur le problème et propose une version modifiée de XDoclet 1.2 et 1.3 supportant les generics.

D’après l’auteur, cette version fonctionne sous JBoss IDE 3.1. Personnellement, je l’ai intégré dans Eclipse 3.2 avec WTP 1.5. Pour celà, il faut remplacer[2] les fichiers présents dans le répertoire lib de XDoclet xdoclet-1.2.3.jar, xdoclet-ejb-module-1.2.3.jar et xjavadoc-1.1.jar par xdoclet-1.3-08012006-lunatech.jar et xdoclet-ejb-module-1.3-08012006-lunatech.jar et xjavadoc-1.5-29012006-lunatech.jar. Il faut également ajouter le JAR de Dom4j 1.6.1 dans le répertoire lib de XDoclet.

Attention, Eclipse n’indique plus qu’il trouve les bibliothèques de XDoclet comme ci-dessous :

Configuration de XDoclet dans Eclipse

Configuration de XDoclet dans Eclipse

De plus, le build automatique de XDoclet ne semble plus fonctionner. Cependant, en lancant le build XDoclet manuellement, les EJBs sont correctement générés.Mise à jour du 27/07/06 : en renommant les JAR modifiés avec leur nom original dans XDoclet, tout fonctionne correctement dans Eclipse avec WTP.

Avec cette personnalisation, vous pouvez maintenant bénéficier des avantages des generics lorsque vous développerez vos EJBs.

Notes

[1] Elle est peut-être trop occupée par XDoclet 2.

[2] Pour celà, il faut renommer la version modifiée avec les noms de la version originale.

lire la suite…

 

Krugle – récidive de Google coding

22 July 2006 par SeB Pas de commentaire »

Je vous avait parlé, il y a bien longtemps, de Koders. Il semble bien qu’un nouvel acteur arrive sur le marché des moteurs de recherche de code source. Et il se nomme Krugle. L’outil semble tout de même moins complet que Koders pusqu’il ne propose pas de filtrer les résultats des recherches par type de licence sous laquelle est publié le code source. Néanmoins, la licence utilisée est généralement précisée dans les résultats. D’après le site, le code retourné et un code libre…

Plus d’information sur la société sont disponibles sur le site officiel.

 

Le mouse-tracking sur votre site

21 July 2006 par SeB Pas de commentaire »

Il y a déja quelques temps, je vous ai présenté le concept du mouse-tracking.

J’avais commencé a écrire un service en ligne externalisé de mise en place du mouse-tracking sur des sites web tiers. Mais sa réalisation n’était pas assez avancée pour publier une quelconque version. Maurice Svay nous apprend qu’un service similaire vient d’ouvrir.

Je crois que mon projet risque de rester dans le placard dans à l’état de prototype pour longtemps…[1] :-/

Notes

[1] Si ce n’est pas à tout jamais. :-(

 

Debian Addict arrondit les angles

20 July 2006 par SeB Pas de commentaire »

Non, non ! L’équipe de la rédaction ne va pas changer de ton ! ;-)

Le site fait seulement peau neuve. L’aspect des boîtes de l’interface graphique du site ont été revues, en s’inspirant de la présentation des Krazy Korners[1]. Ainsi, elles ont des angles arrondis. Le code des squelettes SPIP a été nettoyé[2] de même que les feuilles de style.

Quelques petites modifications mineures suivront, mais le principal est déja en place.

Notes

[1] Notez que le code HTML et CSS a été modifié pour obtenir un rendu plus élaboré.

[2] Factorisation des éléments communs, suppression du code inutile, etc…

 

Des angles arrondis sans image ni Javascript

19 July 2006 par SeB Pas de commentaire »

Beaucoup de site web utilisent des boîtes avec des angles arrondis dans leur interface graphique. En général, les utilisateurs trouvent cela plus sympathique. Pourtant, ils sont loin de penser aux problèmes techniques auxquels sont confrontés les développeurs en terme d’implémentation.

En effet, les angles arrondis ne font pas partie, pour le moment, des langages HTML et CSS. Il faut donc ruser au moyen d’image ou de Javascript pour afficher de tels angles. Or, je ne suis pas fan des images et autre Javascript[1].

Heureusement, CSS Play s’est collé au problème et propose une solution utilisant uniquement du HTML et du CSS avec Krazy Korners. J’avoue que cette méthode est quelque peu brutale. Puisqu’elle demande de placer quatre sections <div /> avant et quatre autres après chaque boîte à afficher. Pourtant, cet exploit ne convient pleinement car il est compatible avec la plupart des butineurs actuels.

Pour ceux qui souhaitent avoir plus de détails sur cette implémentation, il existe une explication techniques sur les Krazy Korners.

Notes

[1] Au grand regret d’Olivier. ;-)

 

Hibernate – SQL natif, HQL ou API Criteria ?

17 July 2006 par SeB 9 commentaires »

Introduction

Hibernate propose plusieurs solutions pour réaliser des requêtes en base de données. Lorsque que le développeur doit écrire une requête avec Hibernate, il a trois possibilités :

  • le SQL natif
  • le HQL
  • l’API Criteria (et Example)

Quelle est la meilleure solution pour écrire une requête avec Hibernate ?

Solutions

SQL natif

L’un des objectifs d’Hibernate est de s’éloigner de la base de données[1]. Or, l’utilisation du SQL natif va à l’encontre de cet objectif. De ce point de vue, le SQL natif est à éviter. Néanmoins, l’équipe du projet le conseille seulement de façon exceptionnelle pour des points qui ont besoin d’utiliser une optimisation liée spécifique à la base de données.

HQL

C’est un langage propre à Hibernate qui s’inspire du SQL mais orienté objet. Il est très souple et donne accès à toutes les possibilités d’Hibernate.

API Criteria

C’est une API en Java qui permet de faire la même chose qu’avec le langage HQL. Le code source à écrire est très simple.

Conclusion

Si l’on élimine le SQL natif, il reste le HQL et l’API Criteria qui font la même chose. La différence concerne le développeur :

  • l’écriture de requête sous forme de chaîne de caractères
  • l’appel à une API de requête

Laquelle choisir ?

  • pour obtenir une meilleure souplesse en terme de développement et de maintenance
  • pour atteindre les meilleures performances

Jusqu’à présent j’avais utilisé naïvement simplement Hibernate avec l’API Criteria.

Pourquoi ce choix ? Cette API est très bien faite et la syntaxe des requêtes est validée à la compilation Java. De plus, je suppose que c’est plus rapide puisque qu’il n’y a pas besoin d’analyser de chaîne de caractères pour exécuter la requête. L’analyse du choix de l’implémentation des requêtes mérite d’être poursuivie.

Valère Viandier conseille de mélanger l’utilisation du HQL et de l’API Criteria. Selon lui, toute requête statique doit être implémentée avec le HQL[2]. Et toute requête dynamique doit être codée avec l’API Criteria. Cette dernière permet d’éviter la concaténation de String lors de la construction de la requête.

John Ferguson Smart rejoint le point de vue de V. Viandier dans son article sur l’utilisation de l’API Criteria vis-à-vis de HQL. Puisque selon ce dernier, l’API doit être utilisée pour des requêtes dynamiques. Et inversement HQL doit être utilisé pour des requêtes statiques. Cela permet d’externaliser les requêtes qui pourront être mises en cache, analysées par un administrateur de base de données, etc…

L’utilisation de deux langages de requête peut troubler[3] beaucoup de personnes[4]. Pourtant, pour tirer parti des points forts de chaque langage, il est tout à fait raisonnable d’utiliser à la fois le HQL et l’API Criteria.

Quelqu’un a-t-il un avis sur le sujet ? Ou des retours d’expériences ?

Notes

[1] En terme d’implémentation.

[2] Idéalement dans les fichiers de configuration de mapping hbm.xml.

[3] La maintenance applicative semble moins évidente.

[4] Moi le premier dans un premier temps.

 

Les bonnes pratiques avec Struts – proteger l’accès des pages JSP

7 July 2006 par SeB Pas de commentaire »

Voici un premier billet dans la série sur Les bonnes pratiques avec Struts.

Introduction

La sécurité des applications web est un point sensible. En effet, il y a toujours un utilisateur qui essaie de casser la sécurité du système. Ce type d’utilisateur cherche dans le code source des pages HTML des informations sur le chemin des pages JSP. Ensuite, il tente de les exécuter manuellement et de modifier les données du contexte.

Solutions

Pour se prémunir de ce genre d’attaque, il faut interdire l’accès aux pages JSP par les utilisateurs. Deux méthodes sont possibles :

  • la configuration de l’application web
  • l’organisation des pages

Configuration de l’application web

Il faut simplement ajouter les lignes suivantes dans le fichier web.xml :

<security-constraint>
   <web-resource-collection>
     <web-resource-name>no_access</web-resource-name>
     <url-pattern>*.jsp</url-pattern>
   </web-resource-collection>
   <auth-constraint/>
 </security-constraint>

Organisation des pages

Le répertoire WEB-INF n’est pas accessible par les utilisateurs d’une application web. Il suffit donc de placer toutes les pages JSP dans ce répertoire[1]. Ensuite les redirections dans Struts doivent pointer vers /WEB-INF/... au lieu de /....

Conclusion

Je préfère la seconde solution[2] qui autorise plus de souplesse. Vous remarquez que les deux méthodes sont très simples et ne demande que très peu d’effort. Pourtant elles améliorent la sécurité[3] de vos applications web. Alors, n’hésitez pas à sécuriser l’accès de vos pages JSP.

Notes

[1] Par exemple, dans WEB-INF/pages ou WEB-INF/jsp.

[2] C’est également la solution que l’on rencontre le plus.

[3] Également la stabilité.