Applications Web : Manipuler les relations
Les relations entre entités font partie intégrante du développement d’applications Enterprise Objects. Dans ce chapitre, vous explorez comment implémenter les relations décrites dans “Relations” en ajoutant une entité Book et en créant une relation un-pour-un et une relation un-pour-n entre Author et Book.
Dans ce chapitre, vous allez :
- utiliser EOModeler pour ajouter l’entité Book au modèle de données Authors,
- utiliser EOModeler pour ajouter la table BOOK à la base de données Authors,
- utiliser EOModeler pour créer des relations entre les entités Author et Book,
- suivre ces relations en utilisant la technologie Enterprise Object,
- construire une spécification de recherche,
- effectuer un tri en mémoire.
Compléter le Modèle Authors
Pour compléter le modèle Authors, ajoutez y l’entité Book. Après avoir défini les attributs de l’entité, ajoutez la table BOOK à la base de données Authors. Puis ajoutez les relations entre Author et Book.
Définition de l’Entité Book
Ce paragraphe vous montre comment créer l’entité Book et comment définir ses attributs, y compris ses clés primaires et secondaires.
- Ouvrez le modèle Authors dans EOModeler en double-cliquant sur Authors.eomodeld dans le groupe Resources de la liste Files de Project Builder.
- Créez l’entité Book :
- Choisissez Property > Add Entity.
- Choisissez Tools > Inspector.
- Saisissez Book dans les champs Name et Class.
- Saisissez BOOK dans le champ Table Name.
- Ajoutez et configurez les attributs de Book.L’entité Book comporte un attribut majeur, title, qui stocke le titre du livre. Elle a aussi besoin d’une clé primaire, bookID, pour vérifier que les lignes de la table BOOK sont uniques. Enfin, elle requiert un attribut supplémentaire, une clé secondaire, qui est utilisée pour relier un livre à son auteur. Ce dernier attribut est nommé authorID.
Ajoutez l’attribut title en suivant ces étapes :
- Vérifiez que l’entité Book est sélectionnée dans la liste des entités.
- Ajoutez un attribut et nommez le title.
- Saisissez TITLE comme nom de colonne.
- Saisissez char comme type de donnée externe.
- Choisissez String comme type de donnée interne.
- Saisissez 50 dans le champ External Width.
- Sélectionnez l’option “Allow Null Value” dans le Advanced Attribute Inspector.
Ajoutez l’attribut bookID :
- Ajoutez un attribut et nommez le bookID.
- Saisissez BOOK_ID comme nom de colonne.
- Saisissez int comme type de donnée externe.
- Choisissez Integer comme type de donnée interne.
- Vérifiez que l’option “Allow Null Value” n’est pas sélectionnée.
Ajoutez l’attribut authorID (ce sera la clé secondaire qui mettra en relation un livre à son auteur) :
- Ajoutez un attribut et nommez le authorID.
- Saisissez Author_ID comme nom de colonne.
- Saisissez int comme type de donnée externe.
- Choisissez Integer comme type de donnée interne.
- Vérifiez que l’option “Allow Null Value” n’est pas sélectionnée.
- Sélectionnez l’attribut clé primaire de l’entité Book :
- Dans la ligne bookID de la liste des Attributs de Book, cliquez sur la colonne comportant une icône de clé dans son en-tête de façon à ce qu’une clé apparaisse dans la ligne.
- Cliquez sur la colonne diamant de la ligne bookID de façon à ce que le diamant disparaisse (la valeur de l’attribut bookID n’est pas significative pour l’application).
- Faites en sorte que authorID soit un attribut non significatif.Comme pour bookID, la valeur de authorID n’a pas d’intérêt pour l’application.
Cliquez sur la colonne diamant de la ligne authorID dans la liste des attributs de façon à ce que le diamant disparaisse.
Création de la Table BOOK
Maintenant, créez la table BOOK comme vous l’avez fait dans “Création de la Table Author”.
- Sélectionnez l’entité Book dans la liste des entités.
- Choisissez Property > Generate SQL.
- Vérifiez que seule l’option “Create Tables” est sélectionnée.
![[image: webobjects_images/modbooksql.gif]](/globals/images/webobjects_images/modbooksql.gif)
- Cliquez sur Execute SQL.
Définition des Relations du Modèle
Maintenant que l’entité Book est définie, mettez la en relation avec l’entité Author.
La relation entre Author et Book est bidirectionnelle. Chaque auteur peut avoir plusieurs livres, tandis que chaque livre n’a qu’un auteur.
Créez les relations en suivant ces étapes :
- Choisissez Tools > Diagram View.
- Faites un glisser-déposer en maintenant la touche Contrôle enfoncée de Author.authorID vers Book.authorID.Cela crée deux relations : une relation un-pour-n entre entre Author et Book utilisant authorID comme attribut de liaison ; et une relation un-pour-un entre Book et Author, toujours avec authorID comme attribut de liaison.
La Figure 13-1 décrit les deux relations. Book est lié à Author par une flèche à simple tête, signifiant qu’un livre peut avoir qu’un auteur. Alors que Author est lié à Book par une flèche à deux têtes, signifiant qu’un autheur peut avoir plus d’un livre.
Figure 13-1 Relations dans le modèle de donnée Authors
![[image: webobjects_images/modrelationships.gif]](/globals/images/webobjects_images/modrelationships.gif)
Les suppressions peuvent devenir plus complexes à cause des relations entre entités. Par exemple, si vous supprimez un objet Author, que va t’il advenir des objets Book associés ? Vous pouvez déterminer le comportement à adopter en utilisant des règles de suppression dans votre modèle.
Qu’est ce qu’une Règle de Suppression ?
Toute relation est dotée d’une règle de suppression qui indique à Enterprise Objects ce qui doit être fait lorsque vous supprimez un objet source. Voici les comportements possibles :
- Annuler Supprime l’objet et annule toute relation des autres entités vers cet objet. (La valeur de la propriété de la clé secondaire des objets cibles est positionnée à null).
- Pas d’action Supprime l’objet et n’effectue rien d’autre.
- Cascade Supprime l’objet et tous les objets qui sont des cibles de cette relation (objets parentés).
- Refus Ne supprime pas l’objet s’il existe des objets parentés. Cette règle est en générale utilisée lorsque la suppression des objets parentés doit être accompagnée d’un traitement spécial avant que l’objet prarent ne soit supprimé.
Les règles de suppression font partie des vérifications d’intégrité référentiel que Enterprise Objects peut effectuer pour vous. L’Intégrité Référentiel fait référence aux règles chargées d’assurer la cohérence des relations entre vos données. Pour en savoir plus sur l’intégrité référentiel et les règles de suppression, reportez-vous à Inside WebObjects: Enterprise Objects.
Règles de Suppression dans le Modèle Authors
Dans le cas de la suppression d’un livre, il va de soit de supprimer le livre et de le retirer de la relation books de l’entité Authors. Cela est un exemple de la règle Annuler. Si vous examinez la relation author de l’entité Book dans le Advanced Relationship Inspector, vous verrez qu’elle est déjà configurée avec la règle de suppression Annuler. Par conséquent, vous n’avez pas à la modifier. Cependant, cette configuration par défaut n’est pas appropriée lorsque vous supprimez un auteur.
Suivez ces étapes pour configurer la relation books de l’entité Authors de façon à ce que les livres d’un auteur soient supprimés quand un auteur est retiré du stock d’objets :
- Sélectionnez la relation books de l’entité Author.
- Ouvrez l’Inspector.
- Affichez le Advanced Relationship Inspector.
- Sélectionnez Cascade comme règle de suppression.
- Sélectionnez l’option Owns Destination.
![[image: webobjects_images/modbooksrel.gif]](/globals/images/webobjects_images/modbooksrel.gif)
- Sauvegardez Authors.eomodeld.
Utilisation des Relations
Dans cette section, vous allez ajouter à l’application Authors la faculté de préserver les livres d’un auteur.
Avant de pouvoir commencer, vous devez ajouter les fichiers source de Author et de Book à votre projet. Ayant personnalisé Author.java, vous devez rassembler le nouveau code généré par EOModeler avec le vôtre.
Mise à jour de la Classe Enterprise-Object Author du Projet
D’abord, générez le fichier Author.java qui contient la relation books.
- Dans EOModeler, sélectionnez l’entité Author dans la liste des entités.
- Choisissez Property > Generate Java Files.EOModeler vous indique que Author.java existe déjà et vous demande comment vous souhaitez procéder.
![[image: webobjects_images/modauthorjava.gif]](/globals/images/webobjects_images/modauthorjava.gif)
Cliquez sur Merge. L’application FileMerge est alors lancée.
Maintenant, mixez le fichier Author.java généré par EOModeler avec le fichier Author.java du projet Authors.
FileMerge met en évidence et sépare les différences entre les deux fichiers. Le fichier généré par EOModeler est sur la gauche et celui du projet, que vous avez personnalisé, est sur la droite. Vous devriez voir trois différences entre les deux fichiers :
- La ligne de commentaire qui indique la date et l’heure de création du fichier. Vous pouvez ignorer cela.
- L’appel de setNom dans le constructeur du fichier que vous avez personnalisé.Pour garder ce changement dans la nouvelle version de Author.java, cliquez sur la flèche pointant vers la gauche et choisissez “Choose right” dans le menu pop-up Actions.
![[image: webobjects_images/fmsetlastname.gif]](/globals/images/webobjects_images/fmsetlastname.gif)
La flèche doit maintenant pointer vers la droite, indiquant que les tois lignes mises en surbrillance dans le fichier Author.java de la droite de la fenêtre vont être ajoutées au fichier.
- Ces méthodes qui implémentent la relation books sur la gauche et la méthode fullName sur la droite sont des changements qui doivent être présents dans le fichier Author.java final.Pour gardez ces deux changements, cliquez sur la flèche pointant vers la gauche et choisissez “Choose both (left first)” dans le menu Action.
![[image: webobjects_images/fmfullname.gif]](/globals/images/webobjects_images/fmfullname.gif)
La fenêtre de FileMerge comporte deux panneaux. Vous pouvez faire apparaître le second panneau en faisant glisser la ligne de séparation. Ce panneau montre quel apparence aura le fichier final lorsque vous le sauvegarderez. Vous pouvez modifier le fichier dans ce panneau si le résultat de la fusion ne vous satisfait pas. Par exemple, FileMerge n’aura peut-être pas ajouté une accolade droite à la méthode removeFromBook.
Après avoir effectué les corrections appropriées, choisissez File > Save Merge.
Ajoutez la Classe Enterprise-Object Book au Projet
Suivez les étapes suivantes pour ajouter Book.java au projet Authors :
- Dans EOModeler, sélectionnez l’entité Book dans la liste des entités.
- Choisissez Property > Generate Java Files.
- Sauvegardez Book.java dans le répertoire de votre projet.
- Ajoutez Book.java au projet.(Pour plus de détails sur l’ajout de fichiers Java personnalisé, reportez-vous à “Ajout d’un Fichier Source Java au Projet”.)
Relations un-pour-un en Java
La méthode author du Listing 13-1 implémente la relation author, une relation un-pour-un de Book vers Author.
Listing 13-1 Les méthodes qui implémentent la relation author dans la classe enterprise-object Book
public Author author() { return (Author)storedValueForKey("author"); } public void setAuthor(Author value) { takeStoredValueForKey(value, "author"); } }
Enterprise Objects suit la procédure décrite dans “Relations un-pour-un” lorsque vous accédez aux propriétés author des objets Book.
Relations un-pour-n en Java
Le code du Listing 13-2 implémente la relation un-pour-n entre Author et Book, books.
Listing 13-2 Les méthodes qui implémentent la relation books dans la classe enterprise-object Author
public NSArray books() { return (NSArray)storedValueForKey("books"); } public void setBooks(NSMutableArray value) { takeStoredValueForKey(value, "books"); } public void addToBooks(Book object) { includeObjectIntoPropertyWithKey(object, "books"); } public void removeFromBooks(Book object) { excludeObjectFromPropertyWithKey(object, "books"); } }
Remarquez que les livres associés à un auteur particulier peuvent être récupérés sous forme de NSArray en appelant la méthode books. Le NSArray retourné est un tableau des instances enterprise-object de Book. Les changements qui leur sont apportés sont automatiquement suivis par le contexte d’édition et sont sauvegardés lorsque saveChanges est appelés. Par la suite, un livre peut petre ajouté ou retiré de la liste d’un auteur en utilisant les deux méthodes fournies, addToBooks et removeFromBooks. Dans ce cas, cependant, le contexte d’édition doit être notifié des changements.
Au niveau de la base de données, la colonne Author_ID de la table BOOK correspond au Author_ID de la ligne de l’auteur propriétaire. L’ajout d’un livre au tableau de l’auteur revient en fait à donner à la colonne Author_ID de la nouvelle ligne de BOOK la même valeur que la colonne Author_ID de l’auteur. Lorsque vous utilisez la méthode addToBooks, Enterprise Objects prend soin de metre à jour la valeur de l’attribut authorID de l’instance enterprise-object de Book à votre place.
Créer le Composant AuthorBookEdit
Dans cette section, vous allez créer le composant qui permettra aux utilisateurs de votre application de gérer les livres d’un auteur spécifiques.
Le Composant AuthorBookEdit dans WebObjects Builder
Après avoir effectué les étapes suivantes, AuthorBookEdit.wo devrait ressembler à la Figure 13-2.
- Ajoutez le composant AuthorBookEdit au projet.Ce composant permet d’éditer la liste des livres qu’un auteur a écrits :
- Sélectionnez Web Components dans la liste Files.
- Choisissez File > New File.
- Sous WebObjects, sélectionnez Component et cliquez sur Next.
- Nommez le composant AuthorBookEdit et cliquez sur Finish.
- Définissez l’organisation du composant AuthorBookEdit :
- Ouvrez AuthorBookEdit.wo dans WebObjects Builder.
- Ajoutez la clé author au composant, choisissez Author comme type et incluez les méthodes accesseurs.
- Ajoutez la clé bookItem au composant, choisissez Book comme type et n’incluez pas de méthodes accesseurs.
- Ajoutez une action appelée deleteBook qui renvoie null.
- Ajoutez une action appelée addBook qui renvoie null.
- Ajoutez une action appelée returnToMain qui renvoie un object de type Main.
- Saisissez l’intitulé “Books by “, ajoutez un WOString juste après et pressez Majuscule-Retour.
- Sélectionnez la ligne contenant l’intitulé et le WOString et choisissez Elements > Heading > H3.
- Reliez le WOString à author.fullName.
- Ajoutez un élément WORepetition.Reliez l’attribut list à author.books.
Reliez l’attribut item à bookItem.
- Ajoutez le contenu du WORepetition :Ajoutez un WOHyperlink, un espace et un WOTextField à l’intérieur du WORepetition et pressez Majuscule-Retour.
Saisissez Delete comme titre du WOHyperlink et reliez son attribut action à deleteBook.
Reliez l’attribut value du WOTextField à bookItem.title.
- Ajoutez deux WOSubmitButtons sous le WORepetition.Saisissez “Done” dans l’attribut value du premier WOSubmitButton, et reliez son attribut action à returnToMain.
Saisissez “Add” dans l’attribut value du second WOSubmitButton, et reliez son attribut action à addBook.
- Ajoutez un élément WOForm qui enveloppe tous les éléments que vous venez d’ajouter :Sélectionnez tous les éléments en choisissant Edit > Select All.
Choisissez Forms > WOForm.
Cliquez n’importe où dans le WOForm là où il n’y a pas d’élément.
Choisissez true pour l’attribut multipleSubmit du WOForm dans le WOForm Binding Inspector (Inspecteur de Liaison).
- Sauvegardez AuthorBookEdit.wo.
Figure 13-2 Le composant AuthorBookEdit dans WebObjects Builder
![[image: webobjects_images/wobauthorbookedit.gif]](/globals/images/webobjects_images/wobauthorbookedit.gif)
La Classe AuthorBookEdit dans Project Builder
Le code Java du composant AuthorBookEdit doit implémenter les procédures requises pour ajouter et supprimer des livres de la relation books des instances enterprise-object d’Author. Cependant, tout ce que vous avez à faire consiste à maintenir un tableau de livres, de la même manière que vous manipuleriez un NSArray (ajoutez des objets au tableau pour ajouter des livres, et retirer des objets du tableau pour supprimer des livres). Le seul code supplémentaire que vous devez inclure consiste à notifier le contexte d’édition des changements apportés au tableau.
- Modifier la méthode deleteBook de façon à ce qu’elle ressemble au Listing 13-3.
Listing 13-3 La méthode deleteBook de la classe AuthorBookEdit
public WOComponent deleteBook() { // Récupère le contexte d'édition à partir de book. EOEditingContext ec = bookItem.editingContext(); // Supprime le livre de son contexte d'édition. ec.deleteObject(bookItem); // Retire le livre de la relation. author.removeObjectFromBothSidesOfRelationshipWithKey(bookItem, "books"); return null; }La méthode deleteBook retire d’abord le livre du tableau books de author. Il notifie ensuite le contexte d’édition que l’objet entreprise en question doit être supprimé la prochaine fois que les changements seront sauvegardés.
Lorsque la page web est raffraîchie, le livre en question n’est plus affiché dans la liste parce qu’il a été retiré du tableau books par la méthode removeObjectFromBothSidesOfRelationshipWithKey.
- Modifiez la méthode addBook de façon à ce qu’elle ressemble au Listing 13-4.
Listing 13-4 La méthode addBook de la classe AuthorBookEdit
public WOComponent addBook() { // Récupère le contexte d'édition par défaut. EOEditingContext ec = session().defaultEditingContext(); // Crée un objet Book. Book newBook = new Book(); newBook.setTitle("New Book"); // Insère le nouveau livre dans le contexte d'édition. ec.insertObject(newBook); // Ajoute le livre à la relation Author.books et règle son auteur. author.addObjectToBothSidesOfRelationshipWithKey(newBook, "books"); return null; }La méthode addObjectToBothSidesOfRelationshipWithKey prend soin d’ajouter le nouveau livre au tableau books de author, tout comme régler l’attribut author du nouveau livre. Autrement, vous auriez pu régler chaque relation manuellement, comme montré ci-dessous :
author.addToBooks(newBook); newBook.setAuthor(author);
Modifier la Classe Session
Le changement majeur que vous devez apporter à la classe Session consiste à ajouter la variable d’instance authorList. Tout objet Session doit aussi ramener la liste des auteurs durant sa création.
- Ajoutez la variable d’instance fetchSpec à Session.java:
private EOFetchSpecification fetchSpec; - Editez la constructeur de façon à ce qu’il corresponde au Listing 13-5.
Listing 13-5 Le constructeur de la classe Session
public Session() { super(); // Elaboration des spécifications de recherche. fetchSpec = new EOFetchSpecification("Author", null, null); // Ramnère les auteurs. fetchAuthorList(); } - Ajoutez la méthode fetchAuthorList du Listing 13-6.
Listing 13-6 La méthode fetchAuthorList de la classe Session/** * Ramène les auteurs à partir du stock d'objets. */ public void fetchAuthorList() { // Get default editing context. EOEditingContext ec = defaultEditingContext(); // Ramène. authorList = new NSMutableArray(ec.objectsWithFetchSpecification(fetchSpec)); } - Ajoutez la méthode addAuthor du Listing 13-7.
Listing 13-7 La méthode addAuthor de la classe Session/** * Add un auteur à authorList et au contexte d'édition par défaut. */ public boolean addAuthor(Author author) { boolean authorAdd = false; // Ajoute l'auteur seulement s'il n'est pas dans la liste. if (!authorList.containsObject(author)) { // Ajoute l'author à la liste. authorList.addObject(author); // Insère l'auteur au contexte d'édition. defaultEditingContext().insertObject(author); authorAdd = true; } return authorAdd; } - Ajoutez la méthode deleteAuthor du Listing 13-8.
Listing 13-8 La méthode deleteAuthor de la classe Session/** * Retire un auteur de authorList et * du contexte d'édition par défaut. */ public void deleteAuthor(Author author) { // Retire un auteur de authorList. authorList.removeObject(author); // Récupère le contexte d'édition de l'auteur. EOEditingContext ec = author.editingContext(); // Retire l'auteur du contexte d'édition. ec.deleteObject(author); } - Sauvegardez Session.java.
- Ajoutez la variable d’instance authorList :
- Dans WebObjects Builder, sélectionnez session à partir du browser AuthorBookEdit.
- Contrôle-cliquez dans le browser Session et choisissez “Add Key to Session”.
- Intitulez la clé authorList, règlez son type “mutable array of Author” et générez les méthodes accesseurs.
Modifiez le Composant Main
Le composant Main doit afficher la page AuthorBookEdit, ainsi les utilisateurs de l’application pourront modifier un auteur de livres. Pour accomplir cela, un WOHyperlink et son action doivent être ajoutés au composant Main.
Composant Main dans WebObjects Builder
Vous devez ajouter une action, editBooks, au composant. Il nécessite aussi d’avoir un WOHyperlink, qui invoquera la nouvelle action. Après avoir effectué les changements requis, Main.wo devrait ressembler à la Figure 13-3.
- Ouvrez Main.wo dans WebObjects Builder.
- Ajoutez une nouvelle action intitulée editBooks qui renvoie un AuthorBookEdit.
- Ajoutez un WOHyperlink entre le WOHyperlink Delete et le WOString situés à l’intérieur de WORepetition.Mettez comme titre Books et reliez son attribut action à editBooks.
- Reliez l’attribut list du WORepetition à session.authorList.
- Supprimez la clé authorList :
- Sélectionnez authorList dans le brower de Main.
- Choisissez “Delete authorList“ dans le menu pop-up Edit Source.
- Sauvegardez Main.wo.
Figure 13-3 Le composant Main dans WebObjects Builder avec l’action editBooks et le WOHyperlink Books
![[image: webobjects_images/wobmainsession.gif]](/globals/images/webobjects_images/wobmainsession.gif)
Classe Main dans Project Builder
Maintenant apportez les changements appropriés à Main.java:
- Supprimez la définition de la variable d’instance fetchSpec.
- Ajoutez une variable d’instance de session.
/** * Stocke l'objet Session. */ private Session session; - Modifiez le constructeur de façon à ce qu’il ressemble au Listing 13-9.
Listing 13-9 Le constructeur dans la classe Main
public Main(WOContext context) { super(context); // Obtient l'objet session. session = (Session)session(); // Obtient le contexte d'édition par défaut. editingContext = session.defaultEditingContext(); // Crée un objet Author (où les données formulaires sont stockées). author = new Author(); } - Editez la méthode addAuthor de façon à ce qu’elle ressemble au Listing 13-10.
Listing 13-10 La méthode addAuthor de la classe Main—utilise la méthode addAuthor de la classe Session
public WOComponent addAuthor() { if (session.addAuthor(author)) { // Crée un objet Author. author = new Author(); } return null; } - Editez la méthode deleteAuthor de façon à ce qu’elle ressemble au Listing 13-11.
Listing 13-11 La méthode deleteAuthor de la classe Main—utilise la méthode deleteAuthor de la classe Sessionpublic WOComponent deleteAuthor() { session.deleteAuthor(authorItem); return null; } - Editez la méthode editBooks de façon à ce qu’elle ressemble au Listing 13-12.
Listing 13-12 La méthode editBooks de la classe Main—envoie un objet Author au composant AuthorBookEdit
public AuthorBookEdit editBooks() { AuthorBookEdit nextPage = (AuthorBookEdit)pageWithName("AuthorBookEdit"); nextPage.setAuthor(authorItem); return nextPage; }La méthode editBooks envoie l’auteur dont les livres sont à modifier au composant AuthorBookEdit (la prochaine page à afficher).
- Modifier la méthode revertChanges de façon à ce qu’elle ressemble au Listing 13-13.
Listing 13-13 La méthode revertChanges de la classe Main—utilise le contexte d’édition par défaut et la méthode fetchAuthorList de la classe Session
public WOComponent revertChanges() { // Annule les changements apportés au contexte d'édition. editingContext.revert(); // Ramène de nouveau les auteurs. session.fetchAuthorList(); return null; }Cette méthode utilise maintenant la méthode fetchAuthorList de la classe session parce que la liste de l’auteur est stockée dans la session, pas dans le composant Main.
- Sauvegardez Main.java.
Lancez l’Application
Construisez et lancez l’application. Lorsque l’utilisateur clique sur un lien Book de l’auteur, la méthode editBook de Main crée un objet AuthorBookEdit et lui indique quel auteur il doit traiter en invoquant sa méthode setAuthor.
Le composant AuthorBookEdit affiche les livres associés à l’auteur en utilisant la relation books de author (un NSMutableArray) dans le WORepetition. Lorsque l’utilisateur clique sur Add, la méthode addBook crée un objet Book et l’ajoute à la relation books de author et au contexte d’édition. De manière similaire, lorsque l’utilisateur clique sur Delete pour supprimer un livre de la liste, le livre est retiré de la relation books et supprimé du contexte d’édition. Lorsque l’utilisateur a fini d’éditer les livres d’un auteur, il clique sur Done pour revenir à la page Main.
Supprimer des Auteurs
Quand l’utilisateur supprimé un auteur, il n’est pas averti que tous les livres en relation avec cet auteur vont aussi être supprimés. Dans cette section, vous allez un composant qui affiche un tel avertissement.
Bien que conceptuellement plus complexe, la construction et l’implémentation de la logique de suppression des auteurs est aussi simple que celle se rapportant aux livres. La seule différence significative tient dans le fait que l’utilisateur demande une confirmation avant de supprimer l’auteur, compte tenu du fait que cette action entraîne la suppression d’objets supplémentaires sans que l’utilisateur ne soit au courant.
Vous allez ajouter un composant qui affiche l’auteur que l’utilisateur souhaite supprimer accompagné des livres qui lui sont associés et qui demande une confirmation. Si l’utilisateur change d’avis, il est renvoyé à la page Main. Si l’utilisateur clique sur Delete, l’auteur et les livres associés sont supprimés du contexte d’édition (la transaction réelle de suppression prend place lorsque l’utilisateur clique sur Save sur la page Main).
Créez le Composant ConfirmAuthorDelete
Après avoir suivi ces étapes, le composant devrait ressembler à la Figure 13-4.
- Ajoutez un composant et nommez le ConfirmAuthorDelete.(Voir “Définir un Nouveau Composant” pour plus de détails.)
- Ouvrez ConfirmAuthorDelete.wo dans WebObjects Builder.
- Ajoutez les variables d’instance suivantes :
- author (Author), avec des méthodes accesseurs
- bookItem (Book), sans méthodes accesseurs
- Ajoutez les actions suivantes :
- cancel (Main)
- deleteAuthor (Main)
- Ajoutez une entête d’avertissement :
- Saisissez Warning dans le panneau de contenu et pressez Retour.
- Sélectionnez le mot “Warning” et choisissez Elements > Heading > H1.
- Choisissez Format > Alignment > Align Center.
- Ajoutez la ligne d’avertissement :
- Saisissez Etes vous sûr de vouloir supprimer.
- Ajoutez un espace, un WOString et un autre espace.
- Ajoutez de la base de données.
- Ajoutez un WOConditional.
- Saisissez “, ainsi que les livres listés ci-dessous” dans le WOConditional.
- Ajoutez un point d’interrogation après le WOConditional et deux sauts de ligne (appuyez sur Retour ou faites deux fois Majuscule-Retour).
- Reliez author.fullName au WOString.
- Reliez author.books.count à l’attribut condition du WOConditional.
- Ajoutez le WORepetition qui liste les livres d’un auteur :
- Ajoutez un WORepetition après le second saut de ligne.
- Ajoutez un WOString et un saut de ligne dans le WORepetition.
- Ajoutez un saut de ligne après le WORepetition.
- Reliez author.books à l’attribut list du WORepetition.
- Reliez bookItem à l’attribut item du WORepetition.
- Reliez bookItem.title à l’attribut value du WORepetition.
- Ajoutez les WOSubmitButtons Cancel et Delete dans le WORepetition :
- Ajoutez un WOForm après le dernier saut de ligne.
- Positionnez l’attribut multipleSubmit du WOForm à true.
- Ajoutez deux WOSubmitButtons séparés par un espace dans le WOForm.
- Positionnez l’attribut value du premier WOSubmitButton à “Cancel”.
- Positionnez l’attribut value du deuxième WOSubmitButton à “Delete”.
- Reliez l’action de cancel au bouton Cancel.
- Reliez l’action de deleteAuthor au bouton Delete.
Figure 13-4 Le composant ConfirmAuthorDelete dans WebObjects Builder
![[image: webobjects_images/wobconfirmauthordelete.gif]](/globals/images/webobjects_images/wobconfirmauthordelete.gif)
Sauvegardez ConfirmAuthorDelete.wo.
Modifier la Classe ConfirmAuthorDelete
Editez la méthode deleteAuthor de façon à ce qu’elle ressemble au listing 13-14.
Listing 13-14 La méthode deleteAuthor de la classe ConfirmAuthorDelete
public Main deleteAuthor() { Main nextPage = (Main)pageWithName("Main"); // On récupère la session. Session session = (Session)session(); // On supprime l'auteur de la liste des auteurs de la session. session.deleteAuthor(author); return nextPage; }
Modifier la Classe Main
Le composant Main doit afficher le composant ConfirmAuthorDelete lorsque son action deleteAuthor est invoquée. Vous accomplissez cela en modifiant la méthode deleteAuthor dans Main.java de façon à ce qu’elle ressemble au Listing 13-15.
Listing 13-15 La méthode deleteAuthor de la classe Main — renvoie le composant ConfirmAuthorDelete
public ConfirmAuthorDelete deleteAuthor() { // On crée une instance du composant ConfirmAuthorDelete. ConfirmAuthorDelete nextPage = (ConfirmAuthorDelete)pageWithName("ConfirmAuthorDelete"); // On positionne l'auteur du composant. nextPage.setAuthor(authorItem); return nextPage; }
Lancez l’ Application
Construisez et lancez l’application. Créez un nouvel auteur, ajoutez plusieurs livres et sauvegardez vos changements. (Vous pouvez utiliser EOModeler pour consulter le contenu des tables et ainsi confirmer que les nouvelles données ont bien été enregistrées dans la base de données). Cliquez sur Delete pour effacer le dernier auteur ajouté. Vous devriez voir apparaître une page de confirmation similaire à celle de la Figure 13-5.
Figure 13-5 La page ConfirmAuthorDelete
![[image: webobjects_images/webconfirmauthordelete.gif]](/globals/images/webobjects_images/webconfirmauthordelete.gif)
Si vous cliquez sur Cancel, vous revenez simplement à la page Main. Le fait de cliquer sur Delete provoque l’activation de la méthode deleteAuthor du composant ConfirmAuthorDelete. A son tour, elle invoque la méthode deleteAuthor de la session, qui retire l’auteur du tableau authorList et l’ajoute à la liste des objets entreprise à supprimer du contexte d’édition.
Trier le Résultat d’une Requête
Les spécifications du résultat d’une requête peuvent être soit traitées programmatiquement dans une application soit avec EOModeler et stockées dans le fichier modèle. Jusqu’à présent, vous avez utilisé une simple spécification de requête, retournant une liste non triée d’instances d’objets entreprise. Maintenant, vous allez créer une spécification de requête plus élaborée. (Pour apprendre comment créer des spécifications de requête dans EOModeler, reportez-vous à Inside WebObjects: Using EOModeler.)
D’abord, définissez la nouvelle spécification de requête sur l’entité Author. Puis, modifiez le code de Session.java pour utiliser cette spécification. Enfin, utilisez un tri en mémoire pour garder la liste triée même après que des auteurs aient été ajoutés.
“Allez plus loin” explique comment trier la liste des auteurs pendant la récupération. Si vous avez fait ainsi, vous avez probablement remarqué qu’après avoir ajouté des auteurs à la liste, la liste ne restait pas triée. Vous pouvez utiliser le mécanisme de tri des Enterprise Objects sur un tableau d’objets précédemment récupérés tout comme lors d’une récupération.
Cette section montre comment ajouter une méthode à Session.java, sortAuthorList, qui trie le tableau authorList et comment modifier la méthode addAuthor de Main.java pour invoquer la méthode sortAuthorList pour re-trier le tableau authorList à chaque fois qu’un auteur est ajouté.
- Ajoutez la méthode sortAuthorList, illustrée dans le Listing 13-16, à Session.java.
Listing 13-16 La méthode sortAuthorList de la classe Session
/** * Trie authorList sur le nom, de manière croissante. */ public void sortAuthorList() { // On crée un tableau pour stocker les ordonnancements de tri. NSMutableArray sortOrderings = new NSMutableArray(); // On crée l'ordonnancement de tri. EOSortOrdering sortOrdering = new EOSortOrdering("Nom", EOSortOrdering.CompareAscending); // On ajoute l'ordonnancement au tableau. sortOrderings.addObject(sortOrdering); // On trie authorList en utilisant les ordonnancements. EOSortOrdering.sortArrayUsingKeyOrderArray(authorList, sortOrderings); } - Editez la méthode addAuthor de Session.java en ajoutant les lignes numérotées du Listing 13-17.
Listing 13-17 La méthode addAuthor de la classe Session
/** * On ajoute un auteur à authorList et au contexte d'édition par défaut. */ public boolean addAuthor(Author author) { boolean authorAjoute = false; // Ajoute l'Author seulement s'il n'est pas dans la liste. if (!authorList.containsObject(author)) { // Ajoute l'author à la liste. authorList.addObject(author); // Trie authorList. sortAuthorList(); // Insère l'author dans le contexte d'édition. defaultEditingContext().insertObject(author); authorAjoute = true; } return authorAjoute; }
Le tri est effectué seulement lorsqu’un élément est ajouté à la liste des auteurs.
Construisez et lancez l’application. La liste des auteurs est triée chaque fois que vous ajoutez un auteur. Remarquez cependant que lorsque la liste est créée la première fois, elle n’est pas triée. Vous pouvez ajouter les deux lignes que vous aviez ajoutées à la méthode addAuthor à fetchAuthorList, après la section de récupération. De cette façon, la liste des auteurs est triée après chaque récupération.

Textes originaux en anglais sur developer.apple.com : WebObjects Web Application - Working With Relationships
Chargement
Commentaires récents