XML model component

Ce tutorial permet de créer un XML component avec un modèle XML. Il permettra de générer une classe Java UserBean à partir d'un mapping hibernate XML. Le template utilisé dans ce tutorial attend un paramètre doc de type XML (le mapping hibernate).

Vous pouvez trouver l'exemple ci dessous dans le catalogue usecases-catalog/Components/Model/XMLToJavaClass.akgncpt.xml.

A partir du mapping hibernate XML :

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
    
<hibernate-mapping>

<class 
    name="net.sourceforge.akrogen.bean.UserBean" 
    table="T_USER"
>

    <id
        name="id"
        type="java.lang.Integer"
        column="USR_ID_N"
    >
        <generator class="identity" />
    </id>

    <property
        name="name"
        type="java.lang.String"
        column="USR_NAME_C"
        not-null="true"
        length="100"
    />
    <property
        name="lastName"
        type="java.lang.String"
        column="USR_LASTNAME_C"
        not-null="true"
        length="100"
    />
    <property
        name="birthday"
        type="java.util.Date"
        column="USR_BIRTHDAY_D"
        length="23"
    />
       
</class>
</hibernate-mapping>

On souhaite générer la classe Java :

package net.sourceforge.akrogen.bean;

public class UserBean {

  private java.lang.Integer id; 
  private java.lang.String name;        
  private java.lang.String lastName;    
  private java.util.Date birthday;      

  public java.lang.Integer getId() {
          return this.id;
  }
  public void setId (java.lang.Integer id) {
          this.id = id;
  }
  public java.lang.String getName() {
          return this.name;
  }
  public void setName (java.lang.String name) {
          this.name = name;
  }
  public java.lang.String getLastName() {
          return this.lastName;
  }
  public void setLastName (java.lang.String lastName) {
          this.lastName = lastName;
  }
  public java.util.Date getBirthday() {
          return this.birthday;
  }
  public void setBirthday (java.util.Date birthday) {
          this.birthday = birthday;
  }
}  

A partir du Wizard page :

Les étapes de ce tutorial sont :

Template

Voici le template freemarker qui permet de générer la classe java UserBean :

<#assign classElement = doc["hibernate-mapping"].class />
package ${packageName};

public class ${className} {

<#list classElement.id as item>
    private ${item.@type} ${item.@name};        
</#list>        
<#list classElement.property as item>
    private ${item.@type} ${item.@name};        
</#list>        

<#list classElement.id as item>
    public ${item.@type} get${item.@name?cap_first}() {
            return this.${item.@name};
    }
    public void set${item.@name?cap_first} (${item.@type} ${item.@name}) {
            this.${item.@name} = ${item.@name};
    }
</#list>        
<#list classElement.property as item>
    public ${item.@type} get${item.@name?cap_first}() {
            return this.${item.@name};
    }
    public void set${item.@name?cap_first} (${item.@type} ${item.@name}) {
            this.${item.@name} = ${item.@name};
    }
</#list>        

}

Le template attend trois paramètres :

  • doc un paramètre de type document XML qui est le mapping Hibernate.
  • packageName un paramètre de type String correspondant au package.
  • className un paramètre de type String correspondant au nom de la classe.

XML component

Voici le XML component que nous allons utiliser :

<?xml version="1.0" encoding="UTF-8"?>
<component>
  <models>
    <!-- This component requires selection of XML File which is used into 
         Template context (Output) -->
    <model type="xml" key="doc" useIntoOutput="true" omitDocumentType="true" />
  </models>
  <input>
    <page title="XML context/Freemarker" >
      <description>Transform XML context to Java Class.</description>
      <box flex="1" id="" orient="vertical"
          xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">                                
        <hbox>
          <label value="Package :" />
          <textbox id="packageName" flex="1" />
          <button type="package" target="packageName" label="Browse..." />
        </hbox>                         
        <hbox>
          <label value="Class name :" />
          <textbox id="className" flex="1" />
        </hbox>                         
        <hbox>
          <label value="Output Base dir :" />
          <textbox id="outputBaseDir" flex="1" />
          <button type="folder" target="outputBaseDir" label="Browse..." />
        </hbox>
        <hbox>
          <label value="Output File name :" />
          <textbox id="outputFileName" flex="1" />
        </hbox> 
        <hbox>
            <button type="preview" label="Preview..." />
        </hbox>                 
      </box>                    
    </page>
  </input>
  <output>
    <file>
      <template uri="/ftl/Xml/XMLToJavaClass.ftl" />
    </file>
  </output>
</component>

Créer le fichier XML component XMLToJavaClass.akgncpt.xml dans le répertoire Components/Model/ du catalogue MyAkrogenCatalog.

Voici les explications de ce XML component :

model element

L'élement model d'un component permet de définir les modèles à utiliser dans le template (useIntoOutput="true"). (il peut est aussi utilisé pour gérér les Wizard page dynamiques XUL.

Dans notre cas, le modèle est un fichier de type XML type="xml" (mapping hibernate) qui doit etre passé au template sous la clé key="doc".

omitDocumentType="true" permet d'ommettre le type de document (DTD, Schéma) lié au fichier XML lors du chargement du document XML. Ceci permet d'utiliser un fichier XML dans Akrogen sans avoir la DTD,... et sans charger celle-ci sur Internet (ce qui optimise le temps de la génération de code).

Input/page element

Lélement input/page permet de décrire le Wizard page eclipse :

  • la textbox XUL d'id packageName est le paramètre package du template.
  • le button XUL de type package permet d'afficher un bouton qui permettent d'ouvrir une fenêtre dialogue qui permettent de sélectionner un package et mettre le résultat de la sélection dans la texbox d'id packageName (indiqué par l'élement target).
  • la textbox XUL d'id className est le paramètre className du template.

XML component use

Rafraichissez la vue catalogue. XMLToJavaClass doit apparaître dans le catalogue.

Double cliquer sur le component XMLToJavaClass pour ouvrir le Wizard page. Le Wizard page suivant s'ouvre avant celui du XML component, car il requiert un fichier XML (mapping Hibernate) :

Sélectionner le fichier XML mapping hibernate et cliquer sur le bouton Next pour ouvrir le Wizard page XML component.

Remplissez les champs du Wizard page :

  • packageName: net.sourceforge.akrogen.bean
  • Class name: UserBean
  • Output base dir: src/net/sourceforge/akrogen/bean
  • Output file name: UserBean.java

Cliquez sur le bouton Finish. La classe Userbean se génère dans le répertoire src.

La saisie des champs Output base dir et Output file name peut devenir pénible dans le cas d'utilisation de la génération d'une classe JAVA. En effet dans ce tutorial, il faut saisir :

  • à la fois le package et le répertoire de sortie.
  • à la fois le nom de la classe et le nom du fichier.

Le tutorial suivant vous explique comment remédier à ce problème à l'aide de scripts.