Voici d’abord comment lancer une application à l’aide de la partie serveur d’applications du réacteur :
1 2 3 4 5 6 7 8 9 10 11 12 |
@DependsOnModel({ Car.class, Power.class, UsedCar.class, Color.class, CarColor.class }) @RunScript(CarColorScript.class) @Children({ Table.class, Table.class }) @FlexDirectionStyle(FlexDirection.ROW) @Style(path = Table.class, pos = 0, name = "flex", value = "1") @Style(path = Table.class, pos = 1, name = "flex", value = "3") @DirectSelect(path = Table.class, value = { Color.class, Car.class }) public class Exemple extends RootTagImpl { public static void main(String[] mainArgs) { ApplicationServer.startSimpleGenericApp(mainArgs, Exemple.class, "/example"); } } |
Le lancement de cette application produit la page suivante :
Lancement de l’application
La méthode main(String[] mainArgs) lance l’application. La classe passée en paramètre indique la classe de l’application à lancer et doit étendre RootTagImpl. Dans notre exemple, cette classe est la même que celle où se trouve la méthode main, mais ce n’est pas une obligation. Le troisième paramètre "/example" indique le chemin vers le répertoire où Generic System stockera ses archives. Le chemin est relatif au répertoire HOME de l’utilisateur lançant l’application.
Configuration de l’application : les annotations
Plusieurs annotations sont utilisées pour configurer notre application :
- @DependsOnModel indique les classes du modèle de persistance à utiliser (paramétrage statique) ;
- @RunScript permet de préciser une classe implémentant l’interface Script, et qui contient une méthode run(Root engine). Le script permet de créer de nouveaux génériques (types, attributs, relations, instances, holders et liens).
L’annotation @DependsOnModel vous permet de déclarer votre modèle de façon statique. Si vous n’avez rien d’autre à paramétrer au démarrage de l’application, vous pouvez tout à fait vous passer de l’annotation @RunScript. Inversement, si vous préférez déclarer votre modèle de façon dynamique, vous pouvez vous contenter de déclarer un script de démarrage de l’application et vous passer de l’annotation @DependsOnModel.
Les autres annotations placées sur la classe Exemple sont définies par le framework gs-reactor et définissent le contenu de l’application :
- @Children({ Table.class, Table.class }) indique que la page contient deux composants identiques, définis par la classe Table. Ce composant affiche les instances d’un type donné, avec leurs holders et leurs liens ;
- @FlexDirectionStyle(FlexDirection.ROW) indique que les deux composants doivent être affichés côte à côte dans une flexbox. Cette annotation définit l’attribut flex-direction de la table. Beaucoup de composants définis dans gs-reactor utilisent des flexbox ;
- @Style(path = Table.class, pos = 0, name = "flex", value = "1") et @Style(path = Table.class, pos = 1, name = "flex", value = "3") définissent la valeur de la propriété CSS « flex » pour chacun des composants. Le paramètre path de l’annotation indique la classe de l’enfant concerné. Ici les deux enfants ont la même classe, donc on utilise le paramètre pos pour les distinguer : la première annotation concerne le premier composant alors que la deuxième concerne le deuxième composant. Nous verrons plus en détails le fonctionnement des paramètres path et pos dans un prochain article ;
- @DirectSelect(path = Table.class, value = { Color.class, Car.class }) indique les types dont on veut afficher les instances pour chacune des tables. La même annotation concerne les deux composants puisque le chemin indiqué, sans paramètre pos, s’applique aux deux enfants. La valeur est un tableau dont la première valeur est utilisée pour définir le contexte d’affichage du premier composant alors que la seconde est utilisée pour le deuxième composant.
Nous allons voir en détail dans la section suivante comment le composant Table est défini.