Création d'une entité à l'aide d'un adaptateur asynchrone

Associée à un adaptateur asynchrone, la méthode create(DataObject) permet de créer une entité.

Pourquoi et quand exécuter cette tâche

Ce type d'appel est identique à l'appel create person, excepté qu'il est transféré vers un adaptateur qui effectue une opération create de façon asynchrone. Cet exemple particulier montre comment créer une entité PersonAccount, Person X, sous le conteneur cn=users,dc=yourco,dc=com.

Pour créer une personne X sous le conteneur cn=users,dc=yourco,dc=com de manière asynchrone, ajoutez ce code exemple à votre code application, puis remplacez les variables par les valeurs réelles à utiliser pour cette entité :
try { 
    // Crée l'objet de données racine à partir du service virtual member manager. 
    DataObject root = service.createRootDataObject(); 
    DataObject personAccount = SDOHelper.createEntityDataObject(root, null, DO_PERSON_ACCOUNT); 
    personAccount.set("uid", "personx"); 
    personAccount.set("cn", "Person X"); 
    personAccount.set("sn", "PersonXLastName"); 
    
    DataObject contexts = root.createDataObject(DO_CONTEXTS); 
    contexts.set(PROP_KEY, VALUE_CONTEXT_REALM_KEY);
    contexts.set(PROP_VALUE, "realmA"); 
    root = service.create(root); 

    // Vérifie la réponse de l'objet données ResponseControl
    // en cas d'opération asynchrone incomplète. Un ticket doit être reçu. 
    String ticket = checkResponse(root); 
    
    if (ticket != null) { 
        // Génère l'entrée DataGraph avec RequestControl pour vérifier l'état 
        root = service.createRootDataObject(); 
        DataObject reqCtrl = SDOHelper.createControlDataObject(root, null, DO_REQUEST_CONTROL);
        reqCtrl.setString(PROP_TICKET, ticket); 
        // Attend la fin de l'opération asynchrone 
        DataObject retRoot = service.get(root); 
        while (checkResponse(retRoot) != null) { 
            Thread.sleep(200); 
            retRoot = service.get(root); 
        }
    }
} 
catch(WIMException e) {
    e.printStackTrace(); 
}
 
// Renvoie un ticket si l'opération est incomplète
private static String checkResponse(DataObject root) {
    DataObject rspCtrl = null;
    String ticket = null; 
    List controls = root.getList(Service.DO_CONTROLS); 
    if (controls != null) { 
        for (int i = 0; i < controls.size(); i++) { 
            DataObject control = (DataObject)controls.get(i); 
            String type = control.getType().getName(); 
            if (DO_RESPONSE_CONTROL.equals(type)) { 
                rspCtrl = control; 
                break; 
            }
        }
    }
    if (rspCtrl != null) { 
        boolean complete = rspCtrl.getBoolean(Service.PROP_COMPLETE); 
        if (!complete) { 
            ticket = rspCtrl.getString(Service.PROP_TICKET); 
        }
    } 
    return ticket;
}

Modèles de graphiques de données d'entrée et de sortie

Pour cet exemple particulier, le graphique de données d'entrée est le suivant :
<?xml version="1.0" encoding="UTF-8"?>
<sdo:datagraph xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:="http://www.w3.org/XML/1998/namespace" 
               xmlns:sdo="commonj.sdo" 
               xmlns:wim="http://www.ibm.com/websphere/wim">
  <wim:Root>
    <wim:contexts>
      <wim:key>realm</wim:key>
      <wim:value>realmA</wim:value>
    </contexts>
    <wim:entities xsi:type="wim:PersonAccount">
      <wim:uid>personx</wim:uid>
      <wim:cn>Person X</wim:cn>
      <wim:sn>PersonXLastName</wim:sn>
    </wim:entities>
  </Root>
</sdo:datagraph>
Le graphique de données de sortie qui en résulte est le suivant :
<?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:ResponseControl" complete="false" 
                  ticket="AsyncLDAP1:1113940307424:-1278154994"/>
  </wim:Root>
</sdo:datagraph>
Pour vérifier l'état de l'opération create, le graphique de données d'entrée de la méthode get() est le suivant :
<?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:RequestControl" 
                               ticket="AsyncLDAP1:1113940307424:-1278154994"/>
  </wim:Root>
</sdo:datagraph>
Si l'opération create est inachevée, le graphique des données de sortie obtenu de la méthode get() est identique à celui des données d'entrée avec en plus une instruction complete="false" :
<?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:ResponseControl" complete="false" 
                                      ticket="AsyncLDAP1:1113940307424:-1278154994"/>
  </wim:Root>
</sdo:datagraph>
Dès que l'opération create est terminée, le graphique de données qui résulte de cet exemple est le suivant :
<?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 repositoryId="AsyncLDAP1" 
                      uniqueName="uid=personx,cn=users,dc=yourco,dc=com"/>
    </wim:entities>
    <wim:controls xsi:type="wim:ResponseControl" complete="true"/>
  </wim:Root>
</sdo:datagraph>


Conditions d'utilisation | Commentaires