1 / 49

DSL et DSL Tools

DSL et DSL Tools. Jean-Marc Prieur (ANPROS) j-m.prieur@wanadoo.fr. Plan de la présentation. Manipuler des « concepts et d’ intentions » dans Visual Studio 2005 Custom Tools pour les settings et ressources Editeurs de Windows Forms Class Diagram Formaliser nos solutions … jusqu’aux DSL

iren
Download Presentation

DSL et DSL Tools

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. DSL et DSL Tools Jean-Marc Prieur (ANPROS)j-m.prieur@wanadoo.fr

  2. Plan de la présentation • Manipuler des « concepts et d’intentions » dans Visual Studio 2005 • Custom Tools pour les settings et ressources • Editeurs de Windows Forms • Class Diagram • Formaliser nos solutions … jusqu’aux DSL • Retour d’expérience dans le domaine de la simulation • Personnaliser Visual Studio 2005 • Le Visual Studio SDK • Les DSL Tools • Discussion • UML et DSL • Limites techniques actuelles des DSL Tools • L’avenir à court terme Jeudis de l'objet - 30 mars 2006

  3. Plan de la présentation • Manipuler des « concepts et d’intentions » dans Visual Studio 2005 • Custom Tools pour les settings et ressources • Editeurs de Windows Forms • Class Diagram • Formaliser nos solutions … jusqu’aux DSL • Retour d’expérience dans le domaine de la simulation • Personnaliser Visual Studio 2005 • Le Visual Studio SDK • Les DSL Tools • Discussion • UML et DSL • Limites techniques actuelles des DSL Tools • L’avenir à court terme Jeudis de l'objet - 30 mars 2006

  4. Manipulations de concepts dans Visual Studio 2005 • L’exemple des fichiers de settings et ressources Persistance dans des fichiers XML (.settings, .resources) Resources.Designer.cs namespace WindowsApplication1.Properties { internal class Resources { internal static string Gagné { get {return ResourceManager.GetString("Gagné", resourceCulture);}} internal static string Perdu { get {return ResourceManager.GetString("Perdu", resourceCulture);}} } private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; internal static global::System.Globalization.CultureInfo Culture { get {return resourceCulture;} set {resourceCulture = value;} } internal static global::System.Resources.ResourceManager ResourceManager { get {if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("WindowsApplication1.Properties.Resources", typeof(Resources).Assembly); resourceMan = temp; } return resourceMan; } } } ResXFileCodeGenerator Jeudis de l'objet - 30 mars 2006

  5. Le mécanisme … • Nous manipulons des ressources ou des paramètres de configuration de manière naturelle. • Des Custom Tools génèrent du code basé sur un Framework (.NET 2.0) pour y accéder en runtime (masquant l’utilisation du Framework) • System.Resources et System.Globalization • System.Configuration • Ce mécanisme est unidirectionnel. Jeudis de l'objet - 30 mars 2006

  6. demo Custom Tools de Visual Studio 2005

  7. De la Manipulation bi-directionnelle de concepts • Pour les Windows.Forms c’est comme pour les ressources ou settings mais • L’éditeur est graphique • la sérialisation s’effectue dans le code • c’est built-in (pas de Custom Tool) • Même chose pour le Class diagram • La notion de classe partial est très intéressante pour les générateurs de code Jeudis de l'objet - 30 mars 2006

  8. Et si nous ... • ... nous pouvions • prendre un modèle (par exemple un automate d’états finis) et en déduire du code source? • « Ajouter StateMachine » à un projet Visual Studio. • C’est possible • car Visual Studio 2005 est extensible • Mais il nous faut d’abord formaliser nos solutions à nos problèmes répétitifs Jeudis de l'objet - 30 mars 2006

  9. Plan de la présentation • Manipuler des « concepts et d’intentions » dans Visual Studio 2005 • Custom Tools pour les settings et ressources • Editeurs de Windows Forms • Class Diagram • Formaliser nos solutions … jusqu’aux DSL • Retour d’expérience dans le domaine de la simulation • Personnaliser Visual Studio 2005 • Le Visual Studio SDK • Les DSL Tools • Discussion • UML et DSL • Limites techniques actuelles des DSL Tools • L’avenir à court terme Jeudis de l'objet - 30 mars 2006

  10. solutions Patterns Templates Frameworks Designers Evolution du processus Fourniture d’outils pour aider les utilisateurs du framework Fourniture d’éléments stables sous forme compilée DSL SM Automatisation de l’application de patterns Designs.StateMachine Formalisées issues de l’experience Exemple de code State-Pattern Clignottant Eteint éteint Allumé Automates d’états-finis Jeudis de l'objet - 30 mars 2006

  11. Les Roles et les Artefacts • Les « architectes » sélectionnent des procédures et conseils et créent deux types d’artefacts : • un Framework • Une codification des conseils (assistant, designer graphique ou non...) • Les « développeurs » utilisent un modèle pour implémenter une solution Jeudis de l'objet - 30 mars 2006

  12. Shape Corona property members label Base Group Corona Corona +v 0.1R R R 0.1R C C 0.7CR 0v playing waiting pause begin running stop Les langages visuels • Permettent d’échanger des informations dans un domaine spécifique Jeudis de l'objet - 30 mars 2006

  13. Plan de la présentation • Manipuler des « concepts et d’intentions » dans Visual Studio 2005 • Custom Tools pour les settings et ressources • Editeurs de Windows Forms • Class Diagram • Formaliser nos solutions … jusqu’aux DSL • Retour d’expérience dans le domaine de la simulation • Personnaliser Visual Studio 2005 • Le Visual Studio SDK • Les DSL Tools • Discussion • UML et DSL • Limites techniques actuelles des DSL Tools • L’avenir à court terme Jeudis de l'objet - 30 mars 2006

  14. Retour d’expérience dans le domaine de la simulation • Contexte d’application • Des études de recherche opérationnelle aux applications de simulation • Un processus outillé. Jeudis de l'objet - 30 mars 2006

  15. Le besoin initial : répondre plus efficacement auxdemandes d’études de recherche opérationnelle Expert opérationnel, pilote de l’étude : « Je suis pressé. J’ai besoin d’une réponse rapidement. » Jeudis de l'objet - 30 mars 2006

  16. Rêve du chef … CDT : « Je voudrais que les études de RO soient réalisées plus rapidement en maîtrisant toute la verticalité » Jeudis de l'objet - 30 mars 2006

  17. Rêve du directeur d’étude … Directeur d’études : « Je comprends son problème. Il faut maintenant que je le modélise. - Traduire en termes de critères à évaluer sur des scénarii, - Construire un plan d’expérience i.e. développer une application de simulation dans laquelle je vais mesurer des variables qui seront transformées en critères Jeudis de l'objet - 30 mars 2006

  18. Problématique - Reformulation de la problématique -Utilisation de méthodes pour analyser le problème : analyse fonctionnelle, UML non formel,… Analyse de l’étude définit un besoin technique Approche Mathématique - théorie des graphes, - probabilités, - programmation linéaire … Approche par la simulation - Création d’un scénario traduisant la problématique - Utilisation de modèles - Création d’une application à partir d’un environnement de simulation • Etapes de réalisation d’une application d’étude • Spécification • de l’appli de simulation • Conception • -Développement • Implémentation • - Tests Produit Mathématique Produit logiciel Exploitation (Variation des paramètres du modèle et de son environnement) Validation Ou Modification Validation Ou Modification Résultats Analyse des résultats Rédaction d’un rapport La Démarche « Etude RO » Une réponse : Un environnement générique de - développement,- exécution- et exploitation de simulations. L’outil DirectSim Jeudis de l'objet - 30 mars 2006

  19. Rêve du directeur d’étude… … qui est le maillon entre la demande et la réponse Directeur d’études : « Je comprends son problème. Il faut maintenant que je le modélise. Si la traduction du modèle en programme informatique pouvait aller plus vite ...» Jeudis de l'objet - 30 mars 2006

  20. Rêve des développeurs • Développeur : « Je souhaiterais : • - Développer avec des langages et outils modernes, efficaces et adaptés au problème. • Réutiliser ce que j’ai déjà fait  • Que les tâches de développement répétitives soient faites par l’ordinateur » Jeudis de l'objet - 30 mars 2006

  21. De quoi avons-nous besoin concrètement? • Besoin de capitaliser des expertises métiers • Besoin d’usines de développements d’applications de simulation • Assembler des applications de simulation avec des outils, en s’exprimant dans un langage proche de l’opérationnel, et s’appuyant sur des briques de connaissances métier (moyens + concepts d’emploi) • Cette usine de développement doit être intégrée à un environnement de développement moderne • Besoin d’un langage pour le binôme opérationnel / ingénieur pour les applications • La situation passée : notation UML … Jeudis de l'objet - 30 mars 2006

  22. L’environnement de développement, exécution, et exploitation de simulations DirectSim Jeudis de l'objet - 30 mars 2006

  23. Contexte d’application Jeudis de l'objet - 30 mars 2006

  24. Créer des applications de simulation • A l’ANPROS, nous créons des applications de simulation pour les études de recherche opérationnelle • Processus de développement basé sur une analyse de haut niveau en privilégiant UML – notation « general purpose » (depuis 1999) • Mais • C’est une affaire de spécialiste génie logiciel • Or ceux qui ont besoin des simulations d’étude peuvent être des opérationnels (qui ne peuvent/veulent pas forcément parler UML) et ne peuvent / veulent pas aller trop loin dans le code. Or il faut pouvoir collaborer. • Et • Nos applications de simulation sont basées sur un « framework de simulation » générique et complexe qui capture et factorise ce qui est commun aux applications de simulation d’étude. • Les modèles représentent visuellement les variations (points d’insertion) que permettent le framework • Or le modeleur UML ne connaît pas ce framework, et ce n’est pas forcément facile de le lui apprendre. Jeudis de l'objet - 30 mars 2006

  25. Créer, maintenir des applications de simulation à partir de modèles • Nous avons identifié 4 types de modèles • pour spécifier, concevoir et développer des applications de simulation • Parmi ceux-ci, la notion de « Comportement ». • Ex : le comportement du chien ou de l’hélicoptère de la vidéo. • Il est complexe en soi. • Mais les choses sont encore plus compliquées par le manqued’interaction entre le modèle et le framework de simulation sous-jacent ou les composants de simulation réutilisés qui contraignent la modélisation IntelliSense au niveau du modèle, débugging idem . Jeudis de l'objet - 30 mars 2006

  26. Développement d’applications de simulation par les modèles • Nous cherchons à rendre la modélisation d’applications de simulation possible par des non spécialistes (un plus grand nombre) • S’attacher aux concepts • Masquer le plus possible les détails du framework et aider à l’apprendre • Avoir des éditeurs graphiques attractifs et ergonomiques qui parlent dans le langage de l’opérationnel. • Les DSL … une solution possible • Assembling Applications with Patterns, Models, Frameworks and Tools • Microsoft nous fournit des outils « les DSL Tools »pour créer des éditeurs graphiques permettant de manipuler nos modèles spécifiques / métier Jeudis de l'objet - 30 mars 2006

  27. Ce qui est commun aux applications de simulation est factorisé dans des framework DirectSim : pourquoi ça va plus vite ! • Des framework génériques • Génie logiciel, métiers techniques. • Framework de simulation • Des modèles d’expertise métier « Marine » • Capitalisés au fur et à mesure des études • Un environnement de développement d’applications de simulation • Dans Visual Studio.NET 2005 • La modélisation y tient une place importante • Un environnement d’exploitation Ce qui est spécifique à une application de simulation est capturé dans des modèles Jeudis de l'objet - 30 mars 2006

  28. Plan de la présentation • Manipuler des « concepts et d’intentions » dans Visual Studio 2005 • Custom Tools pour les settings et ressources • Editeurs de Windows Forms • Class Diagram • Formaliser nos solutions … jusqu’aux DSL • Retour d’expérience dans le domaine de la simulation • Personnaliser Visual Studio 2005 • Le Visual Studio SDK • Les DSL Tools • Discussion • UML et DSL • Potentiel et limites techniques actuelles des DSL Tools • L’avenir à court terme Jeudis de l'objet - 30 mars 2006

  29. Packages Niveau d’intégration Cout d’intégration Add-Ins Macros Options de personnalisation, Snippets L’extensibilité Visual StudioLes possibilités Nécessite le VS SDK Cas des Language Packageset en particulier des DSL Accessibilité aux développeurs Jeudis de l'objet - 30 mars 2006

  30. Les DSL Tools Auteur de DSL (Architecte) Utilisateur de DSL (Développeur) Utilisateurfinal crée Package DSL génère Framework VS 2005 SDK Code, Doc Fichiers deconfig DSL Tools produit Framework Application Framework Visual Studio 2005 Jeudis de l'objet - 30 mars 2006

  31. Avec des DSL bien faits : • Nous sommes guidés au fur et à mesure • Le modèle est validé à tous moments • Un Custom Toolgénère du code • Le code généré compile forcément ! • Il y a des possibilités illimitées d’interactions avec Visual Studio : • Editeurs spécialisés pour les propriétés • Drag & Drop • Debugger • Etc … Jeudis de l'objet - 30 mars 2006

  32. Comment créer un DSL ? • Un type de projet dans VS 2005 (choix d’un template) • Modification du Domain Model (méta-modèle) • Mise à jour de la Designer Definition (notation graphique) • Ecriture de code personnalisé pour la validation … et les aspects graphiques avancés, l’interaction avec VS • Code T4 pour les générateurs de code • Les détails de tout cela dépassent la portée de cette conférence … Jeudis de l'objet - 30 mars 2006

  33. Le processus de création d’un DSL avec les DSLTools Assistant Crée et configure une solution Visual Studio.NET pour un éditeur de DSL (à partir d’un patron) Définition du DSL Création d’un installeur pour le déploiement du DSL Partie « Package VS.NET » Édition du « Domain Model » Méta modèle (DMD) Sérialisation du modèle Contraintes Génération de code de l’éditeur graphique Ajout de code Corps des contraintes Import / Export personnalisé Autres enrichissements Édition de la définition de l’éditeur graphique Notation graphique(DD) Lien entre méta modèle et Notation graphique Explorateur Fenêtre des propriétés Comportement de validation Sérialisation de l’état de l’éditeur Build (F5) Test Debugging Utilisation du designer Génération d’artefacts Modification de patrons Exécution Lancement d’une instance expérimentale de VS.NET sur la solution de debugging Jeudis de l'objet - 30 mars 2006

  34. Génération Code/ Artefact Définition du méta- Modèle (Dm) Sérialisation XML spécifique Mapping Dm <-> Dd Validation/ Contraintes Notation Graphique (Dd) Comportement spécifique Code généré par les DSL Tools Code personnalisé (Utiliser le VS SDK) Création d’un Designer avec les DSL Tools Jeudis de l'objet - 30 mars 2006

  35. Anatomie d’un DSL 2. Designer Definition 1. Domain Model 4. Code sur mesure (validation) (effets élaborés) 3. Correspondance entre les deux. Jeudis de l'objet - 30 mars 2006

  36. Code sur mesure ///<summary> /// When the event / condition / action changes the label is recomputed and /// vice versa ///</summary> [RuleOn(typeof(Transition), FireTime = TimeToFire.TopLevelCommit)] publicsealedclassTransitionAttributesChanged : ChangeRule { ///<summary> /// This method is called whenever any attribute of a Transition changes. /// It processes the coherence Label = Event + "["+Condition+"] / "+Action ///</summary> ///<param name="e"></param> publicoverridevoid ElementAttributeChanged(ElementAttributeChangedEventArgs e) { Transition t = e.ModelElement asTransition; // Compute Label when Event changes if (e.MetaAttribute.Id == Transition.EventMetaAttributeGuid) t.Label = ComputeSummary(e.NewValue asstring, t.Condition, t.Action); // Compute Label when Condition changes elseif (e.MetaAttribute.Id == Transition.ConditionMetaAttributeGuid) t.Label = ComputeSummary(t.Event, e.NewValue asstring, t.Action); // Compute Label when Action changes elseif (e.MetaAttribute.Id == Transition.ActionMetaAttributeGuid) t.Label = ComputeSummary(t.Event, t.Condition, e.NewValue asstring); // Compute Event, Condition, Action when Label changes elseif (e.MetaAttribute.Id == Transition.LabelMetaAttributeGuid) { System.Text.RegularExpressions.Match match = eventLabelRegEx.Match(e.NewValue asstring); if (match.Success) { t.Event = match.Groups["EventGroup"].Value.Trim(); t.Condition = match.Groups["Condition"].Value.Trim(); string actionWithSlash = match.Groups["ActionGroup"].Value.Trim(); if (actionWithSlash.StartsWith("/")) t.Action = actionWithSlash.Substring(1).TrimStart(); else t.Action = actionWithSlash; } } • Règles de cohérence du modèle • Règles de validation du modèle [ValidationState(ValidationState.Enabled)] publicpartialclassState { ///<summary> /// A final state should not have outgoing transitions ///</summary> ///<param name="context"></param> [ValidationMethod(ValidationCategory.Open | ValidationCategory.Save | ValidationCategory.Menu)] privatevoid ValidateFinalStateHasNoOutgoingTransitions(ValidationContext context) { Transition[] transitions = GetOutgoingTransitions(); if ((Kind == StateKind.Final) && (transitions.Length > 0)) { string error = string.Format(System.Globalization.CultureInfo.CurrentUICulture,DomainModel_Resource.FinalCannotHaveOutgoingTransitions, Name); context.LogError(error, "StateMachines 42", transitions); } } … } Jeudis de l'objet - 30 mars 2006

  37. Générateur de code • écrit en T4 (Text Templating Transformation) • On peut en faire un Custom Tool ! /// <summary> /// Method to clean up the resources(such as timers for example) allocated by the state. /// </summary> /// <param name="disposing">Is the state disposing</param> /// <param name="stateMachine">State machine owning this state</param> /// <param name="driven">Driven interface</param> public virtual void Dispose(bool disposing, <#=stateMachineName#> stateMachine, <#=drivenInterface#> driven) { } } <# foreach(State state in StateMachine.AllStates) { // Find base class (class implementing ParentState) string baseName; if (state.ParentState == StateMachine) baseName = baseStateName; else baseName = state.ParentState.GetFullName(); // List of events Dictionary<string, List<Transition>> transitionsFromStateByEventSignature = state.GetOutgoingTransitionsGroupedByEventSignature(true); #> /// <summary> /// <#=state.Comment#> /// </summary> class <#=state.GetFullName()#> : <#=baseName#> { <# foreach(string transitionEventSignature in transitionsFromStateByEventSignature.Keys) { Transition t = transitionsByEventSignature[transitionEventSignature][0]; ///<summary> /// Declaration of the package providing the Simulation code generator ///</summary> [ProvideCodeGenerator(typeof(StateMachinesGenerator), "StateMachinesGenerator","Custom tool that generates C# files based on .StateMachine files", true)] publicsealedpartialclassStateMachinesPackage {} [Guid("9DA6F053-E5B9-4955-A6AE-89FB5505E8E6")] publicclassStateMachinesGenerator : TemplatedCodeGenerator { protectedoverridebyte[] GenerateCode(string inputFileName, string inputFileContent) { // Replace the supplied file contents with the template we want to run inputFileContent = ASCIIEncoding.UTF8.GetString(Properties.Resources.StateMachinesReport); // Substitute the name of the current model file into the template. FileInfo fi = newFileInfo(inputFileName); inputFileContent = inputFileContent.Replace(@"%MODELFILENAME%", fi.Name); inputFileContent = inputFileContent.Replace(@"FileNameSpace", this.FileNameSpace); // Now just delegate the rest of the work to the base class byte[] data = base.GenerateCode(inputFileName, inputFileContent); byte[] ascii = newbyte[data.Length - 3]; Array.Copy(data, 3, ascii, 0, data.Length - 3); return ascii; } } Jeudis de l'objet - 30 mars 2006

  38. demo Anatomie du DSL de comportement dynamique

  39. Exemple d’utilisation des DSL Simulation

  40. Vie d’une application de simulation Modèle d’analyse d’une application de simulation Bibliothèque de modèles capitalisés Conception de nouveaux composants de simulation Mise au point Structure dynamique Exécution Structure statique Code utilisation expertise Jeudis de l'objet - 30 mars 2006

  41. Le sujet • Travail d’un hélicoptère en « sentinelle » • Un sous-marin s’approche. • L’hélicoptère arrête sa patrouille pour aller voir. Lorsqu’il détecte quelque-chose il va pour l’identifier L’hélicoptère suit un hippodrome et regarde (au radar) Jeudis de l'objet - 30 mars 2006

  42. L’Environnement de développement Simulations Jeudis de l'objet - 30 mars 2006

  43. Ce que nous avons vu dans la démo • Des designers qui présentent des concepts spécialisés dans des modèles spécifiques • Des générateurs de code qui savent prendre ces modèles et générer du code ciblant un framework. • Une excellente intégration à VS 2005 • Une autre façon d’architecturerses projets Jeudis de l'objet - 30 mars 2006

  44. Plan de la présentation • Manipuler des « concepts et d’intentions » dans Visual Studio 2005 • Custom Tools pour les settings et ressources • Editeurs de Windows Forms • Class Diagram • Formaliser nos solutions … jusqu’aux DSL • Personnaliser Visual Studio 2005 • Le Visual Studio SDK • Les DSL Tools • Discussion • UML et DSL • Potentiel et limites techniques actuelles des DSL Tools • L’avenir à court terme Jeudis de l'objet - 30 mars 2006

  45. Discussion • L’UML est-il mort ? • à l’ANPROS nous utilisons UML et des DSL • Les potentialités et les limites actuelles des DSL Tools ? • Peut-on refaire ‘Rose’ avec des DSL ? • Ce qu’on peut faire avec et qu’on ne peut pas faire sans • L’avenir à court terme • La V1 est pour mai. • Beaucoup de changements en perspective • Et ce n’est qu’un début ! Jeudis de l'objet - 30 mars 2006

  46. FAQ • Combien couteront les DSLTools ? • Ils seront gratuits, dans le VS SDK. • Est-ce qu’on est obligé d’héberger nos DSL dans VS 2005 ? • Oui, pour le moment (sauf version Express) • A terme, on pourra se procurer un VS « vide » • Puis, on pourra héberger les designers hors de VS (V2 des DSLTools) • Est-ce qu’on ne pourrait pas faire la même chose en UML ? • C’était ce que nous faisions avant, mais : • on a des compartiments spécifiques du métier pour le DSL « Simulation Architecture » et le DSL « State Machine » comporte la notion de « Délégation à une entité de simulation » • Les deux connaissent le Framework et interagissent avec les assemblages de modèles. • Tout est intégré et synchronisé dans le processus de production de code. Jeudis de l'objet - 30 mars 2006

  47. Conclusion • Utiliser un DSL ne nécessite pas d’être architecte. Le créer : si ! • Les langages visuels y ont une place importante dans la Vision « Software Factory » de Microsoft. Un autre « pilier » est GAT (Guidage assisté), non présenté ici • A Vous d’imaginer votre problème factorisé dans un Framework et ses variations capturées dans un DSL Jeudis de l'objet - 30 mars 2006

  48. Liens utiles • Informations sur les DSL Tools http://msdn.microsoft.com/vstudio/dsltools/default.aspx(Home page) http://forums.microsoft.com/msdn/showforum.aspx?forumid=61&siteid=1 • Présentation ‘DSL Tools’ au symposium DNG 2005 http://www.dotnetguru.org/modules.php?op=modload&name=News&file=article&sid=681(compte-rendus) http://dotnetguru.cledunet.com/SymposiumDNG-2005.zip : (13 Mo, planches 122-180) http://www.brainsonic.net/DesktopDefault.aspx?tabid=24&parentid=164&site=353(Webcast) • Lab virtuel en ligne http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032285310&EventCategory=3&culture=en-US&CountryCode=US • VS 2005 SDK (Février 2006) http://affiliate.vsipmembers.com/affiliate/downloadfiles.aspx • Compléments Indispensables jusqu’à la V1 ! http://www.modelisoft.com/Dmd2Dd.aspx(Synchro Dm <-> Dd) http://www.modelisoft.com/T4LangPackage.aspx(Coloration syntaxique T4) Jeudis de l'objet - 30 mars 2006

More Related