Exemple de code pour l'extension du schéma dans le référentiel de fichiers

Utilisez l'exemple de code de bout en bout et les graphiques de données pour étendre le schéma en ajoutant une nouvelle propriété à un type d'entité existant dans le référentiel de fichiers.

Les étapes suivantes sont abordées dans cet exemple de scénario :

  1. Ajoutez une nouvelle propriété étendue à un type d'entité intégré dans le référentiel de fichiers.
  2. Créez une entité avec une valeur pour la propriété étendue.
  3. Recherchez une entité avec la valeur de la propriété étendue.

Conditions prérequises

Assurez-vous d'avoir bien lu les informations et effectué les étapes décrites dans la rubrique Prérequis pour la programmation et notamment dans la section Schéma de propriété étendu, qui contient des informations sur les objets de données propertySchema et extensionPropertySchema et indique la syntaxe valide pour les types de données de propriété.

Exemple de code

Ajoutez l'exemple de code de bout en bout ci-après à votre code d'application, puis remplacez les variables par les valeurs réelles à utiliser.

/**
 *  Cette classe est utilisée pour illustrer l'utilisation de l'API VMM pour étendre le schéma.
 *  Cet exemple ajoute une nouvelle propriété à un type d'entité existant, dans le référentiel de fichiers.
 */
public class ExtendSchemaSample extends BaseApp
{
    /**
     *  Constante de type chaîne pour le nouveau nom de propriété à ajouter
     */
    private static final String newPropName = "postOfficeBox";
    
    /**
     *  Application point d'entrée
     *  @param args
     *  @throws WIMException 
     */
    public static void main(String[] args) throws WIMException
    {
        System.out.println("Starting .. ");
        // Recherche du service
        service = locateService(null);
        System.out.println("Located service. Starting schema extension ... ");
        // Ajout d'une nouvelle propriété (runtime)
        runTimeAddNewProperty();
    }

    /**
     *  Cette méthode présente l'utilisation de l'API d'extension du schéma
     *  Cet exemple effectue les opérations suivantes :
     *  Ajoute une nouvelle propriété, postOfficeBox, à un type d'entité existant
     *  Crée une entité avec la valeur 4-23 pour la propriété étendue postOfficeBox
     *  Recherche une entité avec la valeur de la propriété étendue
     */
    private static void runTimeAddNewProperty()
    {
        // Ajout de la propriété "postOfficeBox" à "PersonAccount"
        addNewProperty();
        System.out.println("The property 'postOfficeBox' is added to 'PersonAccount'.");
        // Création d'une personne avec une propriété "postOfficeBox"
        System.out.println("\nCLIENT: Creating Person B with a defined property called 'postOfficeBox'.");
        createPerson();
        // Recherche de la propriété "postOfficeBox = 4-23" 
        searchPerson();
    }
	
    /**
     *  Cette méthode crée une personne avec les attributs suivants
     *    uid: personb
     *    cn: Person B
     *    sn: PersonBLastName
     *    postOfficeBox: 4-23
     */
    private static void createPerson()
    {
        //Création de Person B ...
        try 
        {
            // Extraction d'un objet données racine. Le reste de l'arborescence des objets sera créé sous cet objet
            DataObject root = SDOHelper.createRootDataObject();
            // Création d'un objet de données de type "PersonAccount" sous la racine
            // L'objet se trouve dans l'espace de nom WIM par défaut
            DataObject person = root.createDataObject(SchemaConstants.DO_ENTITIES, Service.WIM_NS_URI, 
                    SchemaConstants.DO_PERSON_ACCOUNT);
            // Définition des valeurs des attributs requis, uid, cn, sn
            // Définition également de la valeur de l'attribut "postOfficeBox" nouvellement ajouté
            person.set("uid", "personb");
            person.set("cn", "Person B");
            person.set("sn", "PersonBLastName");
            person.set(newPropName, "4-23");
            System.out.println("Input datagraph for create person  -> " + printDO(root));
            // Appel de l'API de création pour créer l'entité de compte de personne définie précédemment
            root = service.create(root);
            System.out.println("Output datagraph for create person  -> " + printDO(root);
            System.out.println("CLIENT: Person B has been created\n\n");
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
    
    /**
     *  Cette méthode ajoute la propriété "postOfficeBox" au type d'entité "PersonAccount".
     */
    @SuppressWarnings("unchecked")
    private static void addNewProperty() 
    {
        try
        {
            System.out.println("\nCLIENT: Creating new property type postOfficeBox 
                    and adding it to existing entity type PersonAccount");
            // Extraction d'un objet données racine. Le reste de l'arborescence des objets sera créé sous cet objet
            DataObject root = SDOHelper.createRootDataObject();
            // Création d'un objet "schema" sous la racine. 
            // Cet objet contiendra les détails des modifications de schéma qui doivent être apportées
            DataObject dynaSchemaDO = root.createDataObject(SchemaConstants.DO_SCHEMA);
            /***************************************/
            /** Code permettant de définir la nouvelle propriété   **/
            /***************************************/
            // Création d'un objet de données de schéma de propriété sous l'objet de schéma créé précédemment
            DataObject propSchemaDO = dynaSchemaDO.createDataObject(SchemaConstants.DO_PROPERTY_SCHEMA);
            // Définition des valeurs de la propriété (par exemple, URI d'espace de nom, préfixe d'espace de nom, nom de la propriété)
            propSchemaDO.set(SchemaConstants.PROP_NS_URI, "http://www.yourco.com/wim/yourext");
            propSchemaDO.set(SchemaConstants.PROP_NS_PREFIX, "yourprefix");
            propSchemaDO.set(SchemaConstants.PROP_PROPERTY_NAME, newPropName);
            // Spécification de la propriété comme propriété à une ou plusieurs valeurs
            // Si la valeur accepte plusieurs valeurs, son type doit être Liste
            propSchemaDO.setBoolean(SchemaConstants.PROP_MULTI_VALUED, false);
            // Spécification du type de données de la propriété
            // Les types de données peuvent être simples, comme boolean, int, float, double, String 
            // ou spéciaux comme Address, Person, Group, etc.
            propSchemaDO.set(SchemaConstants.PROP_DATA_TYPE, SchemaConstants.DATA_TYPE_STRING);
            // Extrayez la liste des types d'entité auxquels cette propriété doit être ajoutée
            List applicableEntityTypes = propSchemaDO.getList(SchemaConstants.PROP_APPLICABLE_ENTITY_TYPE_NAMES);
            // Ajoutez les noms de type d'entité applicables à la liste extraite précédemment
            applicableEntityTypes.add(Service.DO_PERSON_ACCOUNT);
            /***************************************************/
            /** La nouvelle définition de propriété est terminée  **/
            /** L'API createSchema doit maintenant être appelée   **/
            /***************************************************/
            System.out.println("Input datagraph for create property -> " + printDO(root));
            // Appelez l'API de création de schéma pour ajouter la définition de propriété au modèle de schéma
            root = service.createSchema(root);
            System.out.println("Output datagraph for create property -> " + printDO(root));
            System.out.println("\nCLIENT: New property type is created.");
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
    
    /**
     *  Recherche d'une personne avec postOfficeBox = 4-23.
     */
    @SuppressWarnings("unchecked")
    private static void searchPerson()
    {
        try
        {
            //Recherche de Person B
            // Création d'un objet de données de contrôle de recherche
            DataObject root = SDOHelper.createRootDataObject();
            DataObject searchCtrl = SDOHelper.createControlDataObject(root, null, 
                    SchemaConstants.DO_SEARCH_CONTROL);
            // Spécification des propriétés à extraire pour toutes les entrées correspondantes
            searchCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("uid");
            searchCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("sn");
            searchCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("cn");
            // Spécification des critères correspondants comme expression de recherche
            // Cette expression spécifie "PersonAccount" comme type d'entité 
            // et '4-23' comme valeur de "postOfficeBox"
            // L'exécution de la recherche avec cette expression renvoie tous les objets "PersonAccount" 
                    possédant '4-23' comme valeur pour "postOfficeBox"
            // Les propriétés 'uid', 'sn' et 'cn' sont extraites pour tous les objets
            searchCtrl.setString(SchemaConstants.PROP_SEARCH_EXPRESSION, "@xsi:type='" 
                    + Service.DO_PERSON_ACCOUNT + "' and " + newPropName + "='4-23'");
            System.out.println("Searching for " + searchCtrl.getString(SchemaConstants.PROP_SEARCH_EXPRESSION));
            System.out.println("Input datagraph for search -> " + printDO(root));
            // Appel de l'API de recherche avec le contrôle de recherche
            root = service.search(root);
            System.out.println("Output datagraph for search -> " + printDO(root));
            // Itération sur les résultats de la recherche
            // Les résultats sont contenus dans une liste dans la propriété "entities" 
            // de l'objet données renvoyé par l'API de recherche
            // Une constante pratique "DO_ENTITIES" est définie dans SchemaConstants pour faire référence à cette propriété
            printIdentifiers(root);
        } 
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}

Graphiques de données d'entrée et de sortie

Les graphiques de données d'entrée et les graphiques de données de sortie résultants pour chaque étape de cet exemple sont fournis ci-après.

Graphique de données d'entrée pour la création d'un type de propriété postOfficeBox et sont ajout à un type d'entité existant
<?xml version="1.0" encoding="UTF-8"?>
<sdo:datagraph xmlns:sdo="commonj.sdo"
    xmlns:wim="http://www.ibm.com/websphere/wim">
  <wim:Root>
    <wim:schema>
      <wim:propertySchema nsPrefix="yourprefix" nsURI="http://www.yourco.com/wim/yourext"
          dataType="String" multiValued="false" propertyName="postOfficeBox">
        <wim:applicableEntityTypeNames>PersonAccount</wim:applicableEntityTypeNames>
      </wim:propertySchema>
    </wim:schema>
  </wim:Root>
</sdo:datagraph>
Graphique de données de sortie après la création d'un type de propriété postOfficeBox et sont ajout à un type d'entité existant :
<?xml version="1.0" encoding="UTF-8"?>
<sdo:datagraph xmlns:sdo="commonj.sdo"
    xmlns:wim="http://www.ibm.com/websphere/wim">
  <wim:Root>
    <wim:schema>
      <wim:propertySchema nsPrefix="yourprefix" nsURI="http://www.yourco.com/wim/yourext"
          dataType="String" multiValued="false" propertyName="postOfficeBox">
        <wim:applicableEntityTypeNames>PersonAccount</wim:applicableEntityTypeNames>
      </wim:propertySchema>
    </wim:schema>
  </wim:Root>
</sdo:datagraph>
Graphique de données d'entrée pour la création d'une entité, Person B, avec une propriété définie, postOfficeBox:
<?xml version="1.0" encoding="UTF-8"?>
<sdo:datagraph xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:sdo="commonj.sdo" xmlns:wim="http://www.ibm.com/websphere/wim" 
    xmlns:yourprefix="http://www.yourco.com/wim/yourext">
  <wim:Root>
    <wim:entities xsi:type="wim:PersonAccount">
      <wim:uid>personb</wim:uid>
      <wim:cn>Person B</wim:cn>
      <wim:sn>PersonBLastName</wim:sn>
      <yourprefix:postOfficeBox>4-23</yourprefix:postOfficeBox>
    </wim:entities>
  </wim:Root>
</sdo:datagraph>
Graphique de données de sortie après la création d'une entité avec la propriété étendue :
<?xml version="1.0" encoding="UTF-8"?>
<sdo:datagraph xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:sdo="commonj.sdo" xmlns:wim="http://www.ibm.com/websphere/wim">
  <wim:Root>
    <wim:entities xsi:type="wim:PersonAccount">
      <wim:identifier externalName="uid=personb,o=defaultWIMFileBasedRealm" 
          repositoryId="InternalFileRepository"
          uniqueId="fc050249-d245-498f-a3f3-1a3d7566f971" 
          uniqueName="uid=personb,o=defaultWIMFileBasedRealm"/>
    </wim:entities>
  </wim:Root>
</sdo:datagraph>
Graphique de données d'entrée pour la recherche d'entité avec la valeur de propriété étendue, postOfficeBox='4-23' :
<?xml version="1.0" encoding="UTF-8"?>
<sdo:datagraph xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:sdo="commonj.sdo" xmlns:wim="http://www.ibm.com/websphere/wim">
  <wim:Root>
    <wim:controls xsi:type="wim:SearchControl" 
          expression="@xsi:type='PersonAccount' and postOfficeBox='4-23'">
      <wim:properties>uid</wim:properties>
      <wim:properties>sn</wim:properties>
      <wim:properties>cn</wim:properties>
    </wim:controls>
  </wim:Root>
</sdo:datagraph>
Graphique de données de sortie après la recherche d'entité avec la valeur de propriété étendue, postOfficeBox='4-23' (l'entité Person B trouvée) :
<?xml version="1.0" encoding="UTF-8"?>
<sdo:datagraph xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:sdo="commonj.sdo" xmlns:wim="http://www.ibm.com/websphere/wim">
  <wim:Root>
    <wim:entities xsi:type="wim:PersonAccount">
      <wim:identifier externalName="uid=personb,o=defaultWIMFileBasedRealm" 
          repositoryId="InternalFileRepository"
          uniqueId="fc050249-d245-498f-a3f3-1a3d7566f971" 
          uniqueName="uid=personb,o=defaultWIMFileBasedRealm"/>
      <wim:uid>personb</wim:uid>
      <wim:cn>Person B</wim:cn>
      <wim:sn>PersonBLastName</wim:sn>
    </wim:entities>
  </wim:Root>
</sdo:datagraph>


Conditions d'utilisation | Commentaires