Mustercode für die Suche nach geänderten Entitäten

Mit dem umfassenden Mustercode und den Datengraphen können Sie Suchoperationen nach geänderten Entitäten ausführen.

Dieses Beispielszenario deckt die folgenden Schritte ab:

  1. Es werden zwei Entitäten erstellt.
  2. Der aktuelle Prüfpunkt für das Repository wird unter Verwendung des Datenobjekts "ChangeResponseControl" abgerufen. Dieser Prüfpunkt ist erforderlich, weil Sie diesen Prüfpunkt bei der Suche nach geänderten Entitäten mit dem Datenobjekt "ChangeControl" übergeben müssen (Schritt 5), damit nur solche Entitäten zurückgegeben werden, die nach diesem Prüfpunkt geändert wurden.
    Wichtig: Für die Verwendung der Datenobjekte "ChangeControl" und "ChangeResponseControl" gelten zwei Voraussetzungen: Sie müssen den Wert des Merkmals "supportChangeLog" für das Repository auf "native" setzen und die Funktion für die Änderungsverfolgung im zugrunde liegenden Repository aktivieren. Weitere Informationen hierzu enthält das Thema Nach geänderten Entitäten suchen.
  3. Eine der Entitäten wird aktualisiert.
  4. Die Merkmale der aktualisierten Entität werden abgerufen.
  5. Mit dem Datenobjekt "ChangeControl" und "ChangeResponseControl" wird nach geänderten Entitäten gesucht.

Voraussetzungen

Stellen Sie sicher, dass Sie die Informationen gelesen und die Schritte ausgeführt haben, die im Thema Voraussetzungen für die Programmierung beschrieben sind.

Mustercode

Fügen Sie den folgenden umfassenden Mustercode zu Ihrem Anwendungscode hinzu und ersetzen Sie die Variablen durch die tatsächlichen Werte, die Sie verwenden wollen.

public class SearchSample extends BaseApp
{
    private static String ejbJndiName = "ejb/com/ibm/websphere/wim/ejb/WIMServiceHome";

    /**
     *  testScenario 
     *  This test scenario does the following:
     *  Creates two entities
     *  Gets the current checkpoint for the repository
     *  Updates one of the entities
     *  Gets the properties of the updated entity
     *  Searches for changed entities
     */
    public static void main(String[] args) throws Exception
    {
        // Locate the service
        service = locateService(ejbJndiName);
        // Create two users with uid user1 and user2 respectively
        DataObject root1 = addPersonAccount("user1","Admin","AdminSn");
        DataObject root2 = addPersonAccount("user2","Operator","OperatorSn");
        // Get the current checkpoint for the repository
        // This is required before we do any updates on the entities
        // so that it can be passed back when we do a search
        // to retrieve entities changed since this checkpoint
        DataObject prevRoot = getCurrentCheckPoint();
        // Update entity user1
        DataObject updatedRoot = updatePersonAccount(root1, "Manager");
        // Get the properties of the updated entity
        DataObject getRoot = getPersonAccount(updatedRoot);
        // Search for the changed entity
        DataObject searchRoot = searchChangedEntities(prevRoot);
    }
    
    /**
     *  addPersonAccount 
     *  Adds an entity of PersonAccount entity type
     *  @param uid value to be set
     *  @param cn value to be set
     *  @param sn value to be set
     *  @return DataObject
     *  @throws Exception
     */
    public static DataObject addPersonAccount(String uid, String cn, String sn) throws Exception
    {
        DataObject root = SDOHelper.createRootDataObject();
        DataObject entity = SDOHelper.createEntityDataObject(root, null, 
                SchemaConstants.DO_PERSON_ACCOUNT);
        // Set the properties that the newly created entity will have
        entity.set("uid", uid);
        entity.set("cn", cn);
        entity.set("sn", sn);
        System.out.println("Input datagraph before creating user"+ printDO(root));
        root = service.create(root);
        System.out.println("Output datagraph after creating user"+ printDO(root));
        return root;
    }
    
    /**
     * getCurrentCheckPoint Retrieves the current checkpoint from the repository
     * @return DataObject
     * @throws Exception
     */
    public static DataObject getCurrentCheckPoint() throws Exception 
    { 
        DataObject root = SDOHelper.createRootDataObject();
        DataObject ctrl = SDOHelper.createControlDataObject(root, SchemaConstants.WIM_NS_URI, 
                SchemaConstants.DO_CHANGE_CONTROL);          
        DataObject result = service.search(root);
        System.out.println("Checkpoint: "+ printDO(result));
        return result;
    }
    
    /**
     *  updatePersonAccount 
     *  Updates an already existing entity of PersonAccount entity type
     *  @param entity Input DataObject that needs to be modified
     *  @param newCn value of property that needs to be updated
     *  @return Updated DataObject
     *  @throws Exception
     */
    public static DataObject updatePersonAccount(DataObject entity, String newCn) throws Exception
    {
        DataObject user = (DataObject) entity.getList(SchemaConstants.DO_ENTITIES).get(0);
        // Set the new value for cn to update the entity
        user.set("cn", newCn);
        System.out.println("Input datagraph before updating user"+ printDO(entity));
        DataObject root = service.update(entity);
        System.out.println("Output datagraph after updating user"+ printDO(root));   
        return root;
    }
    
    /**
     *  getPersonAccount 
     *  Gets the properties of an existing entity of PersonAccount entity type
     *  @param entity Input DataObject that needs to be retrieved with the properties
     *  @return DataObject with the properties
     *  @throws Exception
     */
    public static DataObject getPersonAccount(DataObject entity) throws Exception
    {   
        DataObject propCtrl = SDOHelper.createControlDataObject(entity, null, 
                SchemaConstants.DO_PROPERTY_CONTROL);           
        // Set the properties that have to be retrieved for the entity
        propCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("sn");
        propCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("uid");
        propCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("cn");
        System.out.println("Input datagraph before getting user properties"+ printDO(entity));
        // Perform get operation
        DataObject root = service.get(entity);
        System.out.println("Output datagraph after getting user properties"+ printDO(root));
        return root;
    }
    
    /**
     * searchChangedEntities Searches for the entities that have changed 
     * @param prevRoot DataObject the represents the previous checkpoint
     * @return DataObject with search results
     * @throws Exception
     */
    public static DataObject searchChangedEntities(DataObject prevRoot) throws Exception
    {
        DataObject root = SDOHelper.createRootDataObject();
        DataObject ctrl = SDOHelper.createControlDataObject(root, null, 
                SchemaConstants.DO_CHANGE_CONTROL);
        // Set the search expression
        ctrl.setString(SchemaConstants.PROP_SEARCH_EXPRESSION, "@xsi:type='PersonAccount'");                
        ctrl.getList(SchemaConstants.PROP_PROPERTIES).add("uid");
        ctrl.getList(SchemaConstants.PROP_PROPERTIES).add("cn");
        ctrl.getList(SchemaConstants.PROP_PROPERTIES).add("sn");
        // Set the CHANGETYPE_ALL to search changed entities
        ctrl.getList(SchemaConstants.PROP_CHANGETYPES).add(SchemaConstants.CHANGETYPE_ALL);
        SDOHelper.createChangeCtrlFromChangeRespCtrl(root, prevRoot);
        System.out.println("Input datagraph before searching for changed entities"+ printDO(root));
        DataObject results = service.search(root);
        System.out.println("output datagraph after searching changed entities"+ printDO(results));
        return results;
    }
}

Eingabe- und Ausgabedatengraphen

Die Eingabedatengraphen und die resultierenden Ausgabedatengraphen für die einzelnen Schritte dieses Beispiels sind nachfolgend aufgeführt.

Eingabedatengraph für die Erstellung eines Benutzers (user1):
<?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:uid>user1</wim:uid>
      <wim:cn>Admin</wim:cn>
      <wim:sn>AdminSn</wim:sn>
    </wim:entities>
  </wim:Root>
</sdo:datagraph>
Ausgabedatengraph nach der Erstellung eines Benutzers (user1):
<?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=user1,dc=yourco,dc=com" repositoryId="ldapRepo"
          uniqueId="45258d76-82b4-4a44-9c3a-077f5a82f15e" uniqueName="uid=user1,dc=yourco,dc=com"/>
    </wim:entities>
  </wim:Root>
</sdo:datagraph>
Eingabedatengraph für die Erstellung eines weiteren Benutzers (user2):
<?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:uid>user2</wim:uid>
      <wim:cn>Operator</wim:cn>
      <wim:sn>OperatorSn</wim:sn>
    </wim:entities>
  </wim:Root>
</sdo:datagraph>
Ausgabedatengraph nach der Erstellung eines weiteren Benutzers (user2):
<?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=user2,dc=yourco,dc=com" repositoryId="ldapRepo"
          uniqueId="6ca02580-d6d1-4131-91ed-2329ad6599eb" uniqueName="uid=user2,dc=yourco,dc=com"/>
    </wim:entities>
  </wim:Root>
</sdo:datagraph>
Ausgabedatengraph mit dem aktuellen Prüfpunkt:
<?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:ChangeResponseControl">
      <wim:checkPoint>
        <wim:repositoryId>ldapRepo</wim:repositoryId>
        <wim:repositoryCheckPoint>28</wim:repositoryCheckPoint>
      </wim:checkPoint>
    </wim:controls>
  </wim:Root>
</sdo:datagraph>
Eingabedatengraph für die Aktualisierung von "user1":
<?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=user1,dc=yourco,dc=com" repositoryId="ldapRepo"
          uniqueId="45258d76-82b4-4a44-9c3a-077f5a82f15e" uniqueName="uid=user1,dc=yourco,dc=com"/>
      <wim:cn>Manager</wim:cn>
    </wim:entities>
  </wim:Root>
</sdo:datagraph>
Ausgabedatengraph nach der Aktualisierung von "user1":
<?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=user1,dc=yourco,dc=com" repositoryId="ldapRepo"
          uniqueId="45258d76-82b4-4a44-9c3a-077f5a82f15e" uniqueName="uid=user1,dc=yourco,dc=com"/>
    </wim:entities>
  </wim:Root>
</sdo:datagraph>
Eingabedatengraph für den Abruf der Merkmale von "user1":
<?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=user1,dc=yourco,dc=com" repositoryId="ldapRepo"
          uniqueId="45258d76-82b4-4a44-9c3a-077f5a82f15e" uniqueName="uid=user1,dc=yourco,dc=com"/>
      <wim:cn>Manager</wim:cn>
    </wim:entities>
    <wim:controls xsi:type="wim:PropertyControl">
      <wim:properties>sn</wim:properties>
      <wim:properties>uid</wim:properties>
      <wim:properties>cn</wim:properties>
    </wim:controls>
  </wim:Root>
</sdo:datagraph>
Ausgabedatengraph nach dem Abruf der Merkmale von "user1":
<?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=user1,dc=yourco,dc=com" repositoryId="ldapRepo"
          uniqueId="45258d76-82b4-4a44-9c3a-077f5a82f15e" uniqueName="uid=user1,dc=yourco,dc=com"/>
      <wim:uid>user1</wim:uid>
      <wim:cn>Manager</wim:cn>
      <wim:sn>AdminSn</wim:sn>
    </wim:entities>
  </wim:Root>
</sdo:datagraph>
Eingabedatengraph für die Suche nach geänderten Entitäten:
<?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:ChangeControl" expression="@xsi:type='PersonAccount'">
      <wim:properties>uid</wim:properties>
      <wim:properties>cn</wim:properties>
      <wim:properties>sn</wim:properties>
      <wim:checkPoint>
        <wim:repositoryId>ldapRepo</wim:repositoryId>
        <wim:repositoryCheckPoint>28</wim:repositoryCheckPoint>
      </wim:checkPoint>
      <wim:changeTypes>*</wim:changeTypes>
    </wim:controls>
  </wim:Root>
</sdo:datagraph>
Ausgabedatengraph nach der Suche nach geänderten Entitäten:
<?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=user1,dc=yourco,dc=com" repositoryId="ldapRepo"
          uniqueId="45258d76-82b4-4a44-9c3a-077f5a82f15e" uniqueName="uid=user1,dc=yourco,dc=com"/>
      <wim:changeType>modify</wim:changeType>
      <wim:uid>user1</wim:uid>
      <wim:cn>Manager</wim:cn>
      <wim:sn>AdminSn</wim:sn>
    </wim:entities>
    <wim:controls xsi:type="wim:ChangeResponseControl">
      <wim:checkPoint>
        <wim:repositoryId>ldapRepo</wim:repositoryId>
        <wim:repositoryCheckPoint>29</wim:repositoryCheckPoint>
      </wim:checkPoint>
    </wim:controls>
  </wim:Root>
</sdo:datagraph>


Rechtliche Hinweise | Feedback