| Guide Utilisateur AROM v2.0 | ||||
|---|---|---|---|---|
| Précédent | Arrière rapide | Chapitre 11. Traitements spécifiques aux slots | Avance rapide | Suivant |
L'espace de nommage des slots est défini par une structure donc la création de slots est réalisée depuis ces structures. L'exemple qui suit illustre la création de la variable sexe définie pour la classe Personne. Quelque soit le slot créé, il est nécessaire de spécifier son type, par l'intermédaire d'une facette CTypeModifier, comme paramètre d'entrée de la méthode de création. D'autre facettes, telles que la facette de domaine, de documentation ou de valeur par défaut, peuvent également être spécifiées lors de la création d'un slot. Dans l'exemple qui suit, seule une facette de domaine est précisée, en plus du type, pour la nouvelle variable sexe.
Exemple 11-1. Création d'un slot
/**
* Cet exemple montre comment creer une nouvelle variable dans une classe
* AROM avec l'API.
*
* @author Veronique DUPIERRIS
*/
import arom.kr.model.KnowledgeBase;
import arom.kr.factory.AromSystem;
import arom.AromSetUp;
import arom.kr.model.AMClass;
import arom.kr.model.EntityCreationException;
import arom.kr.factory.ModifierFactory;
import arom.kr.model.type.TypeSystem;
import arom.kr.model.type.CType;
import arom.kr.model.modifiers.CTypeModifier;
import arom.kr.model.modifiers.DomainModifier;
import arom.kr.model.modifiers.FacetModifier;
import arom.kr.model.Variable;
import arom.kr.model.InvalidNameException;
import java.util.Collection;
import java.util.ArrayList;
public class CreateSlot {
/**
* Cette methode cree une nouvelle base de connaissances nommee "BaseTest" et
* cree un ensemble de classes dans cette base.
*
* @return l'object KnowledgeBase representant la nouvelle base de
* connaissances.
*/
public static KnowledgeBase createKb(){
String kbName = "BaseTest";
AromSystem kbFactory = AromSetUp.getAromSystem();
KnowledgeBase kb = null;
try{
kb = kbFactory.createKB(kbName, new Object[0]);
AMClass personne = kb.createClass("Personne", null);
AMClass femme = kb.createClass("Femme", personne);
AMClass homme = kb.createClass("Homme", personne);
} catch(EntityCreationException ece){
System.out.println("Une erreur est survenue lors de la creation de la base : ");
System.out.println(ece.getMessage());
System.exit(1);
}
return kb;
}
/**
* Cette methode recupere une base de connaissances definissant
* une classe racine 'Personne' et deux autre classes, 'Homme'
* et 'Femme' qui la specialisent.
* La variable 'sexe' est ensuite associee a la classe Personne.
* La base de connaissances ainsi configuree est alors retournee
* a l'appelant.
*
* @param personne la classe AROM 'Personne' dans laquelle le slot
* va etre ajoute.
*/
public static void createSlot(AMClass personne){
// Cree le slot 'sexe' avec son domaine dans la classe personne
// Cree les differentes facettes de la variable :
//Recupere le module de type afin d'obtenir le type String associe.
TypeSystem kbTypeSystem = AromSetUp.getAromSystem().getTypeSystem();
CType sexeType = kbTypeSystem.getStringCType();
//Cree la facette de type pour le slot "sexe".
ModifierFactory modifierFact =
AromSetUp.getAromSystem().getModifierFactory();
CTypeModifier cType = modifierFact.createCTypeModifier(sexeType);
// Cree le domaine associe au slot "sexe". Ce domaine est l'ensemble de valeurs:
Object[] values = { new ArrayList() };
((Collection)values[0]).add(new String("f"));
((Collection)values[0]).add(new String("m"));
// Cree la facette correspondant au domaine
DomainModifier domain = modifierFact.createDomainModifier(
ModifierFactory.SET_MODIFIER,
values);
// Construit le tableau des facettes necessaire a la creation du slot
FacetModifier[] facettes = new FacetModifier[2];
facettes[0] = cType;
facettes[1] = domain;
//Cree la variable
try {
Variable sexe = personne.createVariable("sexe", facettes);
} catch(InvalidNameException ine){
System.out.println("Le nom de la nouvelle variable est invalide: ");
System.out.println(ine.getMessage());
} catch(EntityCreationException ece){
System.out.println("Une erreur est survenue lors de la creation de la variable: ");
System.out.println(ece.getMessage());
}
}
public static void main(String[] args){
KnowledgeBase kb = createKb();
AMClass personne = kb.lookupClass("Personne");
createSlot(personne);
System.out.println("Nouvelle classes : "+ personne.getFQName());
System.out.println("Slots : "+personne.lookupSlot("sexe").getFQName());
AromSetUp.getAromSystem().cleanup();
}
}// CreateSlot