Fabienne Boyer Laboratoire LIG (INRIA-UJF-INPG) Projet SARDES, INRIA Rhône-Alpes APACHE/VELOCITY : un outil libre de génération de code Détails pour le projet Javanaise
2© 2008, F. Boyer, UJF Projet JAVANAISE, UE Etude et Projet dintergiciels, M2PGI Principes Apache / Jakarta project Utilisé pour générer du code Java, des documents HTML ou texte, etc Séparation claire entre patron de génération (template) et code Java Un langage (Velocity Template Language - VTL) permet de décrire les patrons de génération
3© 2008, F. Boyer, UJF Projet JAVANAISE, UE Etude et Projet dintergiciels, M2PGI Contextes dutilisation Web applications A la place ou en conjonction avec les JSP Le template est du code HTML contenant des directives Velocity Java Code generation XML processing & transformation Text processing
4© 2008, F. Boyer, UJF Projet JAVANAISE, UE Etude et Projet dintergiciels, M2PGI Principe dutilisation de Velocity dans Javanaise Velocity est utilisé pour générer des classes dinterception spécifiques aux objets métiers Ces classes implantent les mêmes méthodes / Interfaces que les objets métier
5© 2008, F. Boyer, UJF Projet JAVANAISE, UE Etude et Projet dintergiciels, M2PGI Principe dutilisation de Velocity template contexte Nom ref. Objet Java Hello $name, Welcome to Velocity name "World" Result (Writer) Hello World, Welcome to Velocity Velocity Engine
6© 2008, F. Boyer, UJF Projet JAVANAISE, UE Etude et Projet dintergiciels, M2PGI HelloWorld avec Velocity (exemple tiré de Hello $name, Welcome to Velocity import …; public class Helloworld { public static void main (String args[]) { // get & initialize the velocity engine VelocityEngine ve = new VelocityEngine().init(); // get the template Template t = ve.getTemplate("helloworld.vm"); // create a context & add data VelocityContext context = new VelocityContext(); context.put("name", "World"); // perform generation StringWriter writer = new StringWriter(); t.merge(context, writer); System.out.println(writer.toString()); HelloWorld.java HelloWorld.vm
7© 2008, F. Boyer, UJF Projet JAVANAISE, UE Etude et Projet dintergiciels, M2PGI Utilisation de Velocity dans Javanaise Template Contexte Nom ref. Objet Java package jvnGenerated; public class Jvn$className { … #foreach ($meth in $methods) #if ($util.isNotNull($ret))... #set ($needWriteLock = ($methodName.indexOf("W_") == 0)) #if ($needWriteLock) obj.jvnLockWrite(); #elseif ($needReadLock) obj.jvnLockRead(); #end … #end } util … Result (Writer) … public class JvnSentence extends JvnObjectImpl implements Serializable { … public SentenceJvn() {…} public void write(String text) {…} public String read() {…} } Velocity Engine className Sentence methods arrayList of Method objects (see java.lang.reflect)
8© 2008, F. Boyer, UJF Projet JAVANAISE, UE Etude et Projet dintergiciels, M2PGI Principes d'implémentation dune classe dinterception // Remarque : différents principes d'implémentation peuvent être adoptés public class JvnSentence { … // appel d'une méthode applicative public void write(String s) { jvnLockWrite(); // appelle la méthode write sur l'objet métier... jvnUnLock(); }
9© 2008, F. Boyer, UJF Projet JAVANAISE, UE Etude et Projet dintergiciels, M2PGI Principes d'implémentation de JVN2 Comment savoir si une méthode accède un objet en écriture ou en lecture ? u Le nom de la méthode suit une convention particulière (préfixe ou suffixe particulier) u La méthode lève des exceptions prédéfinies par Jvn (JvnReadException, JvnWriteException) u On utilise des annotations Java
10© 2008, F. Boyer, UJF Projet JAVANAISE, UE Etude et Projet dintergiciels, M2PGI Suppléments dinformation : extrait de la Javadoc / java.lang.Method ClassClass[] getExceptionTypes() Returns an array of Class objects that represent the types of the exceptions declared to be thrown by the underlying method represented by this Method object.getExceptionTypes Int getModifiers() Returns the Java language modifiers for the method represented by this Method object, as an integer. getModifiers StringString getName() Returns the name of the method represented by this Method object, as a String. getName Class[] getParameterTypes() Returns an array of Class objects that represent the formal parameter types, in declaration order, of the method represented by this Method object. ClassgetParameterTypes ClassClass getReturnType() Returns a Class object that represents the formal return type of the method represented by this Method object. getReturnType
11© 2008, F. Boyer, UJF Projet JAVANAISE, UE Etude et Projet dintergiciels, M2PGI Suppléments dinformation : VTL - Affecter une valeur (chaîne) à une variable: #set ($a = "Velocity") - Commentaire ## Ceci est un commentaire - Notation formelle Class $className $foo $foo.getBar() ## est équivalent à $foo.Bar $data.setUser("jon") ## est équivalent à #set( $data.User = "jon" ) $data.getRequest().getServerName() ## est équivalent à $data.Request.ServerName ## est équivalent à ${data.Request.ServerName}
12© 2008, F. Boyer, UJF Projet JAVANAISE, UE Etude et Projet dintergiciels, M2PGI Références