Questionnaire : conception d’une base de données NoSql pour Android

Nous allons montrer pas à pas comment nous construisons Questionnaire : Une base de données NoSql pour les applications Android.

La gestion des données dans le terminal Android doit être synchronisée avec une base centrale sur le cloud. Cela suppose de définir un modèle de données souple, pour éviter d’aller chercher dans le cloud les données en permanence, tout en garantissant une conformité des données entre le terminal Android et le Cloud.

Nous souhaitons gérer les donnée dans le terminal et archiver celles-ci dans le cloud. Une façon simple de définir le modèle de données est de regrouper sous la forme d’un document toutes les informations dont nous avons besoin.

Si nous prenons l’exemple d’une facture, nous pouvons avoir un modèle de document facture qui contiendra des informations habituellement rangées dans plusieurs tables selon le modèle SQL. Notre document Facture contient les informations du client, du fournisseur, la date de facture, les produits facturées et un total de facture.

Avec Questionnaire, nous proposons un modèle de base de données NoSQL fonctionnant sur Android. Notre objectif est de proposer un moyen de simplifier la création des pages applicatives qui contiennent des données à sauvegarder sur fichier.

Le modèle de base de données NoSql structuré et distribué Questionnaire pour les applications Android

Le modèle de données va regrouper dans le même fichier les informations de différentes tables. Nous créons une ligne par type de données et nous indiquons en tête de ligne le nom de l’enregistrement correspondant au nom de la table. Nous appelons Questionnaire notre modèle de données.

Pour gérer de façon répartie les données, nous indiquons dans notre document les références du propriétaire, c’est à dire le créateur du document. Chaque questionnaire a un identifiant unique. Un questionnaire peut avoir des versions successives. Nous ne modifions pas le questionnaire, nous créons une nouvelle version à chaque modification.

La structure de données des documents est défini par un modèle : Questionnaire. Le Questionnaire regroupe les informations usuelles des schéma de base de données en SQL. Nous définissons dans ce modèle le dictionnaire de données, mais aussi les vues sur les données. L’objectif du Questionnaire est aussi de simplifier la créations des pages web en regroupant tout ce qui permet une génération de page dynamique.

Principe pour créer les modèles

Dans notre article présentant la création des page web pour Android WebView, nous avons initié l’architecture de notre méthode pour créer des langages de description dédiés.

Nous avions créé pour la gestion des écrans Screen :

  • ScreenLibrary
  • ScreenWord
  • ScreenModel

Nous allons de même créer pour Questionnaire :

  • QuestionnaireLibrary
  • QuestionnaireWord
  • QuestionnaireModel

Création du modèle Questionnaire : Une base de données NoSql pour les applications Android

QuestionnaireLibrary regroupe les informations de description du schéma du document. Nous avons un dictionnaire de données, puis un regroupement de ces données dans des Thèmes.

La classe QuestionnaireLibrary à compléter :

class QuestionnaireLibrary {
  private Model model;

  public QuestionnaireLibrary(Model model) {
    this.model=model;
  }

  public Repository get(){
    return model.getRepository();
  }

  public void newPage(String name) {
    model.setRepository(new Repository(name));
    model.setModelMemory(new SquareMap<String, Integer, Object>());
    XmlTagItem<QuestionnaireWord> tag = new XmlTagItem<QuestionnaireWord>();
    tag.setTagStart();
    tag.setModel(QuestionnaireWord.QUESTIONNAIRE);
    tag.addProperty(KeyWord.NAME, name);
    get().addTag(tag);
  }
  public void endPage() {
    XmlTagItem<QuestionnaireWord> tag = new XmlTagItem<QuestionnaireWord>();
    tag.setTagEnd();
    tag.setModel(QuestionnaireWord.QUESTIONNAIRE);
    get().addTag(tag);
  }

}

Nous ajouterons dans QuestionnaireLibrary les méthodes au fur et à mesure des besoins identifiés lors de la création des questionnaires Ouvrage, Annuaire et Prêt.

Questionnaire permet de définir les documents dont nous avons besoin pour notre application :

  • Ouvrage : les œuvres, éditions et livres
  • Annuaire : propriétaire d’une collection partagée ou les relations à qui on emprunte ou prête un livre
  • Prêt : la référence d’un prêt ou emprunt d’un livre à un ami

La classe QuestionnaireWord à compléter :

public enum QuestionnaireWord implements ModelWord {

    QUESTIONNAIRE("Questionnaire");

    private final String value;

    private QuestionnaireWord(String value) {
        this.value = value;
    }

    @Override
    public String getValue() {
        return value;
    }

    @Override
    public String toString() {
        return value;
    }

    public static QuestionnaireWord parse(String value){
        return  ModelWord.parse(QuestionnaireWord.class,  value);
    }
}

La liste des enum se complètera au fur et à mesure de la création des Questionnaires Ouvrage, Annuaire et Pret et ce en fonction des besoins.

Comme pour le modèle Screen, nous définissons un modèle abstrait de Questionnaire :

Création de la classe abstraite QuestionnaireModel :

public abstract class QuestionnaireModel extends Model {
  
  Context context;
  
   public QuestionnaireModel(Context context) {
       	super();
     	this.context=context;
     	
   }
  
  	@JavascriptInterface
   	public PlugsetMessage get(PlugsetMessage message) {
        return build(message);
   	}
  
  	@JavascriptInterface
   	public PlugsetMessage post(PlugsetMessage message) {
        return build(message);
   	}
  
}

Le Questionnaire Ouvrage dans la base de données NoSql pour applications Android

Pour gérer les ouvrages, nous avons une description à trois niveaux :

  • œuvre : une œuvre éditoriale est un contenu éditorial indépendamment de sa mise en forme
  • édition : une œuvre mise en forme par un éditeur
  • livre : un exemplaire physique d’une édition

Nous voyons que nous avons une représentation bien connue en langage objet avec un héritage de propriétés du livre vers son édition qui hérite à son tour de l’œuvre.

Nous définissons un Questionnaire Ouvrage qui va regrouper la description des trois formats : Œuvre, Édition et Livre.

public class Ouvrage extends QuestionnaireModel {
  
  public Ouvrage(Context context) {
    	super(context);
  }
  
  public PlugsetMessage build(PlugsetMessage message) {
        QuestionnaireLibrary q = new QuestionnaireLibrary(this);
        q.newPage("Ouvrage");
        q.design("standardBox",QuestionnaireWord.ALPHANUM,30);
        q.design("dateBox",QuestionnaireWord.DATE,8);
        q.design("barcodeBox",QuestionnaireWord.EAN13,13);
        q.design("imageBox",QuestionnaireWord.IMAGE,2560,1600);//pixel
        q.design("currencyBox",QuestionnaireWord.CURRENCY,8);
        q.design("numberBox",QuestionnaireWord.INTEGER,4);
    	q.design("referenceBox",QuestionnaireWord.CARD_ID,25);//10 pour le nom du Questionnaire et 15 pour le CardId
    	q.design("pathBox",QuestionnaireWord.PATH,60);//chemin dans la hierarchie
        q.defineItem("Titre","Titre","standardBox");
        q.defineItem("Auteur","Auteur","standardBox");
        q.defineItem("Editeur","Editeur","standardBox");
        q.defineItem("DateEdition","Paru le","dateBox");
        q.defineItem("CodeBarre","EAN13","barcodeBox");
        q.defineItem("Couverture","Couverture","imageBox");
        q.defineItem("Prix","Prix","currencyBox");
        q.defineItem("NbPages","NbPages","numberBox");
    	q.defineReference("Proprietaire","AnnuaireQuestionnaire","referenceBox");
        q.defineHierarchy("Localisation","LocalisationHierarchy","pathBox");
    	q.defineReference("Emprunteur","AnnuaireQuestionnaire","referenceBox");
    	q.defineReference("EditionPourOuvrage","OuvrageQuestionnaire","referenceBox");
    	q.defineReference("OeuvrePourOuvrage","OuvrageQuestionnaire","referenceBox");
        q.theme("Oeuvre");
        q.askQuestion("Titre","Titre");
        q.askQuestion("Auteur","Auteur");
        q.endTheme();
        q.theme("Edition");
    	q.askReference("Oeuvre","OeuvrePourOuvrage");
        q.askQuestion("Editeur","Editeur");
        q.askQuestion("DateEdition","DateEdition");
        q.askQuestion("CodeBarre","CodeBarre");
        q.askCapture("CouvertureRecto","Couverture");
       	q.askCapture("CouvertureVerso","Couverture","4ème de couverture");
        q.askQuestion("Prix","Prix");
        q.askQuestion("NbPages","NbPages");
        q.endTheme();
        q.theme("Livre");
        q.askReference("Edition","EditionPourOuvrage");
       	q.askReference("Proprietaire","Proprietaire");
        q.askHierarchy("Localisation","Localisation");
        q.askReference("Emprunteur","Emprunteur");
        q.endTheme();
       	q.endPage();
        Repository questionnaireRepository=q.get();
        System.out.println("AppLog.Ouvrage.build : questionnaireRepository="+questionnaireRepository.getXmlString());
        //on doit construire la réponse et la mettre dans message
        message.put("page","xml",getRepository());
        return message;
   }
}

Un livre étant la matérialisation physique d’une édition, il dispose d’un emplacement indiquant où se trouve l’ouvrage. Nous avons aussi la possibilité d’indiquer que le livre est prêté ou emprunté en indiquant l’ami à qui on a prêté ou emprunté le livre. Un livre emprunté peut aussi être rangé dans notre bibliothèque.

La description de l’ouvrage est donc très complète et contient toutes les informations se référant au livre.

Complétude des données, gestion des Références dans le Questionnaire

Dans le Questionnaire Ouvrage, nous voyons que toutes les données ne sont pas forcément présentes dans une fiche Questionnaire. Lorsque nous prenons le Livre, les données de l’Édition et de l’Oeuvre ne sont pas dans le fichier du Livre mais sont à chercher dans la fiche de l’Édition et de l’Oeuvre.

Le Dictionnaire de données dans le modèle Questionnaire

Le Questionnaire défini des types de données prédéfinies dans l’outil :

  • QuestionnaireWord.ALPHANUM
  • QuestionnaireWord.DATE
  • QuestionnaireWord.EAN13
  • QuestionnaireWord.IMAGE
  • QuestionnaireWord.CURRENCY
  • QuestionnaireWord.INTEGER
  • QuestionnaireWord.CARD_ID
  • QuestionnaireWord.PATH

Ces types données sont utilisées pour créer des formats de données :

  • design(Nom-d-un-format-de-donnée, Type-de-données, Longueur-de-la-donnés);
  • design(« standardBox »,QuestionnaireWord.ALPHANUM,30);

Puis la création des définitions des données du dictionnaire :

  • defineItem(Nom-de-la-donnée, Libellé-de-la-donnée, Format-de-donnée);
  • defineItem(« Titre », »Titre », »standardBox »);

La définition des données du dictionnaire prépare le travail de construction des tables de données créées avec les thèmes :

  • askQuestion(Nom-du-Champ-dans-Theme, Definition-du-champ-dans-dictionnaire);
  • askQuestion(« Titre », »Titre »);

Le Questionnaire Annuaire dans la base de données NoSql pour applications Android

L’annuaire permet de gérer les contacts. Nous avons besoin d’un annuaire pour connaitre les personnes à qui on emprunte ou prête un livre.

public class Annuaire extends QuestionnaireModel{

	public Annuaire(Context context) {
    	super(context);
  	}
  
  	public PlugsetMessage build(PlugsetMessage message) {
        QuestionnaireLibrary q = new QuestionnaireLibrary(this);
        q.newPage("Annuaire");
        q.design("standardBox",QuestionnaireWord.ALPHANUM,30);
        q.design("dateBox",QuestionnaireWord.DATE,8);
        q.design("barcodeBox",QuestionnaireWord.EAN13,13);
        q.design("imageBox",QuestionnaireWord.IMAGE,2560,1600);//pixel
        q.design("currencyBox",QuestionnaireWord.CURRENCY,8);
        q.design("numberBox",QuestionnaireWord.INTEGER,4);
    	q.design("referenceBox",QuestionnaireWord.CARD_ID,25);//10 pour le nom du Questionnaire et 15 pour le CardId
    	q.design("pathBox",QuestionnaireWord.PATH,60);//chemin dans la hierarchie
        q.defineItem("FirstName","Prénom","standardBox");
        q.defineItem("LastName","Nom","standardBox");
        q.defineItem("Company","Société","standardBox");
        q.defineList("SocialNetworkName","Réseau social","standardBox");
        q.listItem("Bibli","Bibli App","Bibli");
        q.endDefineList();
        q.defineItem("UserSocialId","Identifiant","standardBox");
        q.defineItem("PhoneNumber","Téléphone","standardBox");
        q.defineItem("EmailAdress","Courriel","standardBox");
        q.defineItem("Street","Rue","standardBox");
        q.defineItem("PostalCode","Code postal","standardBox");
        q.defineItem("Town","Ville","standardBox");
        q.defineItem("Country","Pays","standardBox");
        q.defineItem("Portrait","Photo","imageBox");
        q.theme("Contact");
        q.askQuestion("Prénom","FirstName");
        q.askQuestion("Nom","LastName");
        q.askQuestion("Entreprise","Company");
        q.endTheme();
        q.theme("ProfilSocial");
    	q.askQuestion("Réseau","SocialNetworkName");
    	q.askReference("Identifiant","UserSocialId");
    	q.endTheme();
        q.theme("Phone");
    	q.askQuestion("Téléphone","PhoneNumber");
    	q.endTheme();
        q.theme("Email");
        q.askQuestion("Courriel","EmailAdress");
    	q.endTheme();
        q.theme("Adress");
        q.askQuestion("Rue","Street");
        q.askQuestion("Complement","Street","Complément");
        q.askQuestion("CodePostal","PostalCode");
       	q.askQuestion("Ville","Town");
        q.askQuestion("Pays","Country");
        q.endTheme();
        q.theme("Photo");
        q.askCapture("Photo","Portrait");
        q.endTheme();
       	q.endPage();
        Repository questionnaireRepository=q.get();
        System.out.println("AppLog.Annuaire.build : questionnaireRepository="+questionnaireRepository.getXmlString());
        //on doit construire la réponse et la mettre dans message
        message.put("page","xml",getRepository());
        return message;
   	}
}

Pour créer un Questionnaire, nous commençons par créer les thèmes, puis nous prenons les définitions des champs que nous ajoutons au dictionnaire. Afin d’éviter la confusion, nous mettons les définitions des champs en anglais. Les format de données sont nommés en anglais avec le suffixe Box.

Certains champs proposent une liste de valeurs, nous enregistrons dans Questionnaire les propositions avec DefineList (ligne 19 à 21).

Le nom des thèmes, des définitions, des formats doivent être unique, puisqu’ils servent de clé dans l’arborescence du Repository.

Le Questionnaire des Prêts dans la base de données NoSql pour applications Android

La gestion des prêts permet d’associer, un prêteur, un emprunteur et un ouvrage. On y ajoute des informations complémentaires comme la date du prêt. La particularité de notre gestion de bibliothèque est de pouvoir transférer une copie de la fiche du livre du prêteur à l’emprunteur. Les informations d’emplacement dans la bibliothèque du prêteur sont effacées car l’emprunteur pourra enregistrer dans la fiche ses propres emplacements.

Pour enregistrer un prêt, le préteur va sur l’application, fait une photo de la couverture du livre pour identifier le livre, puis choisit dans l’annuaire le correspondant à qui on prête le livre.

public class Pret extends QuestionnaireModel {
  
public Pret(Context context) {
    	super(context);
  }
  
  public PlugsetMessage build(PlugsetMessage message) {
        QuestionnaireLibrary q = new QuestionnaireLibrary(this);
        q.newPage("Pret");
        q.design("standardBox",QuestionnaireWord.ALPHANUM,30);
        q.design("dateBox",QuestionnaireWord.DATE,8);
        q.design("barcodeBox",QuestionnaireWord.EAN13,13);
        q.design("imageBox",QuestionnaireWord.IMAGE,2560,1600);//pixel
        q.design("currencyBox",QuestionnaireWord.CURRENCY,8);
        q.design("numberBox",QuestionnaireWord.INTEGER,4);
    	q.design("referenceBox",QuestionnaireWord.CARD_ID,25);//10 pour le nom du Questionnaire et 15 pour le CardId
    	q.design("pathBox",QuestionnaireWord.PATH,60);//chemin dans la hierarchie
        q.defineItem("Date","Date","dateBox");
    	q.defineReference("LivreEnPret","OuvrageQuestionnaire","referenceBox");
    	q.defineReference("Proprietaire","AnnuaireQuestionnaire","referenceBox");
    	q.defineReference("Emprunteur","AnnuaireQuestionnaire","referenceBox");
        q.theme("Gestion");
        q.askQuestion("DatePret","Date"," Date du prêt");
       	q.askQuestion("DateRetour","Date","Date de retour");
        q.endTheme();
        q.theme("Transaction");
        q.askReference("Livre","LivreEnPret");
       	q.askReference("Proprietaire","Proprietaire");
        q.askReference("Emprunteur","Emprunteur");
        q.endTheme();
       	q.endPage();
        Repository questionnaireRepository=q.get();
        System.out.println("AppLog.Pret.build : questionnaireRepository="+questionnaireRepository.getXmlString());
        //on doit construire la réponse et la mettre dans message
        message.put("page","xml",getRepository());
        return message;
   }
}

Le Questionnaire Prêt fonctionne avec 3 références :

  • référence vers le livre
  • référence vers le propriétaire
  • référence vers l’emprunteur

Pour chacune de ces références, nous avons besoin de rechercher l’identifiant correspondant dans les Questionnaires Ouvrage ou Annuaire.

Nous voyons que pour choisir l’ouvrage, le plus simple est de faire une photo de la couverture.

Pour le propriétaire, nous pouvons imaginer que l’application utilisée pour enregistrer le Prêt est sur le mobile du propriétaire de l’ouvrage. L’application pour fonctionner a besoin du compte utilisateur qui sera le premier contact dans l’Annuaire.

L’emprunteur sera identifier par une recherche sur l’une des informations de la fiche contact, avec une présentation de la liste des contacts correspondant au filtre puis la sélection de la fiche correspondante.

Visualisation des informations du Questionnaire

Le questionnaire regroupe les informations par thèmes. Chaque thème peut apparaitre plusieurs fois dans le Questionnaire si nécéssaire. Un bon exemple de visualisation est la fiche contact sur Android :

Base de données NoSQL, présentation de la fiche contact sur Android
Base de données NoSQL, présentation de la fiche contact sur Android

Sur la fiche contact, chaque thème est présent dans sa zone. Si nous prenons la partie Adresse, nous voyons les différentes informations du thème Adresse. Notez le bouton [+ Ajout d’une adresse] permettant de créer un thème adresse multiple :

Base de données NoSQL, présentation de l'adresse pour la fiche contact sur Android
Base de données NoSQL, présentation de l’adresse pour la fiche contact sur Android

Ce que nous attendons de notre modèle Questionaire, c’est une utilisation facile pour créer des pages de visualisation des fiches enregistrées.

L’utilisation des Questionnaires

Le modèle Questionnaire que nous venons de définir doit permettre de générer :

  • les pages écrans css/html/javascript
  • la sauvegarde des données dans des fichiers

Nous avons 3 types de pages concernant les questionnaires :

  • la page Recherche
  • la page Liste
  • la page Détail

L’objectif est de générer directement l’ensemble du code à partir de la description du Questionnaire

Code des classes java complétées avec cet article

Le code est complété au fur et à mesure que nous créons l’application. Nous mettons ici le code finalisé en fin d’article.

Code de QuestionnaireLibrary :

public class QuestionnaireLibrary {
    private Model model;

    public QuestionnaireLibrary(Model model) {
        this.model=model;
    }

    public Repository get(){
        return model.getRepository();
    }

    public void newPage(String name) {
        model.setRepository(new Repository(name));
        model.setModelMemory(new SquareMap<String, Integer, Object>());
        XmlTagItem<QuestionnaireWord> tag = new XmlTagItem<QuestionnaireWord>();
        tag.setTagStart();
        tag.setModel(QuestionnaireWord.QUESTIONNAIRE);
        tag.addProperty(KeyWord.NAME, name);
        get().addTag(tag);
    }
    public void endPage() {
        XmlTagItem<QuestionnaireWord> tag = new XmlTagItem<QuestionnaireWord>();
        tag.setTagEnd();
        tag.setModel(QuestionnaireWord.QUESTIONNAIRE);
        get().addTag(tag);
    }

    public void design(String boxName, QuestionnaireWord boxType, int boxLength) {
        XmlTagItem<QuestionnaireWord> tag = new XmlTagItem<QuestionnaireWord>();
        tag.setTagSingle();
        tag.setModel(QuestionnaireWord.DESIGN);
        tag.addProperty(KeyWord.NAME,boxName);
        tag.addProperty(KeyWord.TYPE,boxType);
        tag.addProperty(KeyWord.LENGTH,boxLength);
        get().addTag(tag);
    }

    public void design(String boxName, QuestionnaireWord boxType, int boxHeight, int boxWidth) {
        XmlTagItem<QuestionnaireWord> tag = new XmlTagItem<QuestionnaireWord>();
        tag.setTagSingle();
        tag.setModel(QuestionnaireWord.DESIGN);
        tag.addProperty(KeyWord.NAME,boxName);
        tag.addProperty(KeyWord.TYPE,boxType);
        tag.addProperty(KeyWord.HEIGHT,boxHeight);
        tag.addProperty(KeyWord.WIDTH,boxWidth);
        get().addTag(tag);
    }

    public void defineItem(String itemName, String itemCaption, String itemDesign) {
        XmlTagItem<QuestionnaireWord> tag = new XmlTagItem<QuestionnaireWord>();
        tag.setTagSingle();
        tag.setModel(QuestionnaireWord.DEFINE_ITEM);
        tag.addProperty(KeyWord.NAME,itemName);
        tag.addProperty(KeyWord.CAPTION,itemCaption);
        tag.addProperty(KeyWord.DESIGN,itemDesign);
        get().addTag(tag);
    }

    public void defineReference(String referenceName, String referenceQuestionnaire, String referenceDesign) {
        XmlTagItem<QuestionnaireWord> tag = new XmlTagItem<QuestionnaireWord>();
        tag.setTagSingle();
        tag.setModel(QuestionnaireWord.DEFINE_REFERENCE);
        tag.addProperty(KeyWord.NAME,referenceName);
        tag.addProperty(KeyWord.QUESTIONNAIRE_NAME,referenceQuestionnaire);
        tag.addProperty(KeyWord.DESIGN,referenceDesign);
        get().addTag(tag);
    }

    public void defineHierarchy(String hierarchyName, String hierarchyQuestionnaire, String hierarchyDesign) {
        XmlTagItem<QuestionnaireWord> tag = new XmlTagItem<QuestionnaireWord>();
        tag.setTagSingle();
        tag.setModel(QuestionnaireWord.DEFINE_HIERARCHY);
        tag.addProperty(KeyWord.NAME,hierarchyName);
        tag.addProperty(KeyWord.QUESTIONNAIRE_NAME,hierarchyQuestionnaire);
        tag.addProperty(KeyWord.DESIGN,hierarchyDesign);
        get().addTag(tag);
    }

    public void theme(String themeName) {
        XmlTagItem<QuestionnaireWord> tag = new XmlTagItem<QuestionnaireWord>();
        tag.setTagStart();
        tag.setModel(QuestionnaireWord.THEME);
        tag.addProperty(KeyWord.NAME,themeName);
        get().addTag(tag);
    }

    public void endTheme() {
        XmlTagItem<QuestionnaireWord> tag = new XmlTagItem<QuestionnaireWord>();
        tag.setTagEnd();
        tag.setModel(QuestionnaireWord.THEME);
        get().addTag(tag);
    }

    public void askQuestion(String fieldName, String itemName) {
        XmlTagItem<QuestionnaireWord> tag = new XmlTagItem<QuestionnaireWord>();
        tag.setTagSingle();
        tag.setModel(QuestionnaireWord.ASK_QUESTION);
        tag.addProperty(KeyWord.NAME,fieldName);
        tag.addProperty(KeyWord.TYPE,itemName);
        get().addTag(tag);
    }

    public void askQuestion(String fieldName, String itemName, String fieldCaption) {
        XmlTagItem<QuestionnaireWord> tag = new XmlTagItem<QuestionnaireWord>();
        tag.setTagSingle();
        tag.setModel(QuestionnaireWord.ASK_QUESTION);
        tag.addProperty(KeyWord.NAME,fieldName);
        tag.addProperty(KeyWord.TYPE,itemName);
        tag.addProperty(KeyWord.CAPTION,fieldCaption);
        get().addTag(tag);
    }

    public void askReference(String fieldName, String referenceName) {
        XmlTagItem<QuestionnaireWord> tag = new XmlTagItem<QuestionnaireWord>();
        tag.setTagSingle();
        tag.setModel(QuestionnaireWord.ASK_REFERENCE);
        tag.addProperty(KeyWord.NAME,fieldName);
        tag.addProperty(KeyWord.TYPE,referenceName);
        get().addTag(tag);
    }

    public void askHierarchy(String fieldName, String hierarchyName) {
        XmlTagItem<QuestionnaireWord> tag = new XmlTagItem<QuestionnaireWord>();
        tag.setTagSingle();
        tag.setModel(QuestionnaireWord.ASK_HIERARCHY);
        tag.addProperty(KeyWord.NAME,fieldName);
        tag.addProperty(KeyWord.TYPE,hierarchyName);
        get().addTag(tag);
    }

    public void askCapture(String fieldName, String itemName) {
        XmlTagItem<QuestionnaireWord> tag = new XmlTagItem<QuestionnaireWord>();
        tag.setTagSingle();
        tag.setModel(QuestionnaireWord.ASK_CAPTURE);
        tag.addProperty(KeyWord.NAME,fieldName);
        tag.addProperty(KeyWord.TYPE,itemName);
        get().addTag(tag);
    }

    public void askCapture(String fieldName, String itemName, String fieldCaption) {
        XmlTagItem<QuestionnaireWord> tag = new XmlTagItem<QuestionnaireWord>();
        tag.setTagSingle();
        tag.setModel(QuestionnaireWord.ASK_CAPTURE);
        tag.addProperty(KeyWord.NAME,fieldName);
        tag.addProperty(KeyWord.TYPE,itemName);
        tag.addProperty(KeyWord.CAPTION,fieldCaption);
        get().addTag(tag);
    }

    public void defineList(String fieldName, String fieldCaption, String itemDesign) {
        XmlTagItem<QuestionnaireWord> tag = new XmlTagItem<QuestionnaireWord>();
        tag.setTagStart();
        tag.setModel(QuestionnaireWord.DEFINE_LIST);
        tag.addProperty(KeyWord.NAME,fieldName);
        tag.addProperty(KeyWord.DESIGN,itemDesign);
        tag.addProperty(KeyWord.CAPTION,fieldCaption);
        get().addTag(tag);
    }

    public void endDefineList() {
        XmlTagItem<QuestionnaireWord> tag = new XmlTagItem<QuestionnaireWord>();
        tag.setTagEnd();
        tag.setModel(QuestionnaireWord.DEFINE_LIST);
        get().addTag(tag);
    }

    public void listItem(String itemName, String itemCaption, String itemValue) {
        XmlTagItem<QuestionnaireWord> tag = new XmlTagItem<QuestionnaireWord>();
        tag.setTagSingle();
        tag.setModel(QuestionnaireWord.LIST_ITEM);
        tag.addProperty(KeyWord.NAME,itemName);
        tag.addProperty(KeyWord.CAPTION,itemCaption);
        tag.addProperty(KeyWord.VALUE,itemValue);
        get().addTag(tag);
    }
}

Code de QuestionnaireWord :

public enum QuestionnaireWord implements ModelWord {

    ALPHANUM("Alphanum"),
    ASK_CAPTURE("AskCapture"),
    ASK_QUESTION("AskQuestion"),
    ASK_HIERARCHY("AskHierarchy"),
    ASK_REFERENCE("AskReference"),
    CARD_ID("CardId"),
    CURRENCY("Currency"),
    DATE("Date"),
    DEFINE_HIERARCHY("DefineHierarchy"),
    DEFINE_ITEM("DefineItem"),
    DEFINE_LIST("DefineList"),
    DEFINE_REFERENCE("DefineReference"),
    DESIGN("Design"),
    EAN13("Ean13"),
    IMAGE("Image"),
    INTEGER("Integer"),
    LIST_ITEM("ListItem"),
    PATH("Path"),
    QUESTIONNAIRE("Questionnaire"),
    THEME("Theme");

    private final String value;

    private QuestionnaireWord(String value) {
        this.value = value;
    }

    @Override
    public String getValue() {
        return value;
    }

    @Override
    public String toString() {
        return value;
    }

    public static QuestionnaireWord parse(String value){
        return  ModelWord.parse(QuestionnaireWord.class,  value);
    }
}

Code de KeyWord :

public enum KeyWord {

    ACTION_NAME("actionName"),
    ACTION_PARAM("actionParam"),
    AREA_START("areaStart"),
    AREA_END("areaEnd"),
    CAPTION("caption"),
    DESIGN("design"),
    EDITABLE("editable"),
    LABEL_FOR("labelFor"),
    HEIGHT("height"),
    LENGTH("length"),
    LENGTH_MIN("lengthMin"),
    LENGTH_MAX("lengthMax"),
    NAME("name"),
    QUESTIONNAIRE_NAME("questionnaireName"),
    TYPE("type"),
    VALUE("value"),
    WIDTH("width");


    private String value;

    private static final Map<String, KeyWord> BY_LABEL = new HashMap();

    static{
        for(KeyWord word:values()){
            BY_LABEL.put(word.value,word);
        }
    }

    private KeyWord(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }

    @Override
    public String toString() {
        return getValue();
    }

    public static KeyWord parse(String value)  {
        return BY_LABEL.get(value);
    }
}
Si vous avez aimé l'article vous êtes libre de le partager :-)

Laisser un commentaire