Chapitre 12. Traitements spécifiques aux instances

12.1. Création d'instances

Les instances sont les seules entités AROM qui ne sont pas créées depuis l'entité représentant leur espace de nommage, c'est à dire la base de connaissances. En effet, les instances sont créées à partir des structures auxquelles elles sont rattachées, voir section Les instances AROM. L'exemple qui suit illustre cette création d'instances, objets et tuples.

Exemple 12-1. Création d'instances, objet et tuple


/**
 * CreateInstance.java
 *
 * Cet exemple montre comment creer des objets AROM (des instances de
 * classes AROM) et des tuples (des instances d'associations AROM).
 *
 * @author Veronique DUPIERRIS
 * $Id: CreateInstance.java,v 1.7 2001/12/06 11:55:05 fauchera Exp $
 */
import arom.kr.model.AMClass;
import arom.kr.model.AMAssociation;
import arom.kr.model.AMObject;
import arom.kr.model.EntityCreationException;
import arom.kr.model.Link;
import arom.kr.model.AMTuple;
import arom.kr.model.KnowledgeBase;
import java.util.Iterator;
import arom.kr.factory.AromSystem;
import arom.AromSetUp;
import arom.kr.model.modifiers.FacetModifier;
import arom.kr.model.InvalidNameException;

public class CreateInstance {

  /**
   * Cette methode cree une nouvelle base de connaissances nommee "BaseTest" et
   * cree un ensemble de classes dans cette base. Cet ensemble comprend : la
   * classe racine 'Personne' specialisee par les classes 'Homme'et 'Femme'.
   * Une association 'Couple' relie les objets de ces deux classes.
   *
   * @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);	
      AMAssociation couple = kb.createAssociation("couple", null);
      // --- cree les roles pour l'association
      // Aucun modifier n'est precise, la classe typant le role etant explicite. 
      FacetModifier[] modifiers = new FacetModifier[0];
      couple.createRole("mari", homme, modifiers);
      couple.createRole("femme", femme,  modifiers);    
    } 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);
    } catch(InvalidNameException ine) {
      System.out.println("Une erreur est survenue lors de la creation de la base: ");
      System.out.println(ine.getMessage());
      System.exit(1);
    }
    return kb;
  }
    
    /**
     * Cree une instance pour chacune des classes 'Homme' et 'Femme'.
     *
     * @param la base de connaissances contenant les classes 'Homme', 'Femme'
     * et l'association 'Couple'.
     */
  public static void createInstances(KnowledgeBase kb){
	
	AMClass homme = kb.lookupClass("Homme");
	AMClass femme = kb.lookupClass("Femme");
	AMAssociation couple = kb.lookupAssociation("couple");
	
	//creer un objet pour chacune des classes
	AMObject leon = null;
	AMObject ginette = null;
	try{
	  leon = homme.createObject("Leon");
	  ginette  =femme.createObject("Ginette");
	} catch( EntityCreationException ece) {
	    System.out.println("Une erreur s'est produite lors de la creation des objets: ");
	    System.out.println(ece.getMessage());
	    System.exit(1);
	}
	// creer un lien utilise pour la creation d'un tuple 
	// de l'association couple et identifiant pour chaque
	// role de cette association les objets.
	String[] roleNames = new String[2];
	roleNames[0] = "mari";
	roleNames[1] = "femme";
	AMObject[] roleValues = new AMObject[2];
	roleValues[0] = leon;
	roleValues[1] = ginette;
	Link lienDuCouple = new Link(roleNames,roleValues);
	// creer un tuple
	try{
	  AMTuple nouveauCouple = couple.createTuple(lienDuCouple);
	} catch( EntityCreationException ece) {
	  System.out.println("Une erreur s'est produite lors de la creation du tuple: ");
	  System.out.println(ece.getMessage());
	  System.exit(1);
	}
    }
   
 
    public static void main(String[] args){
	KnowledgeBase kb = createKb();
	createInstances(kb);
	Iterator allClasses = kb.rootClasses();
	while(allClasses.hasNext()){
	  AMClass nextClass = (AMClass) allClasses.next();
	  System.out.print("La classes "+ nextClass.getName());  
	  System.out.println(" a pour instance(s) :"  );
	  Iterator allInsts = nextClass.instances();
	  while(allInsts.hasNext())
	    System.out.println("- "+ ((AMObject) allInsts.next()).getName());
	}
	Iterator allAssocs = kb.rootAssociations();
	while(allAssocs.hasNext()){
	  AMAssociation nextAssoc = (AMAssociation) allAssocs.next();
	  System.out.print("L'assoc "+ nextAssoc.getName());  
	  System.out.println(" a pour instance(s) :" );
	  Iterator allInsts = nextAssoc.instances();
	  while(allInsts.hasNext())
	    System.out.println("- "+ (AMTuple) allInsts.next());
	}

	AromSetUp.getAromSystem().cleanup();

    }
  
}// CreateSlot