Use o método search(DataObject) e o Objeto de Dados ChangeControl para consultar o repositório associado em busca de entidades alteradas de um determinado ponto de verificação em diante.
O Objeto de Dados ChangeControl diferencia uma procura de entidades alteradas a partir de uma operação normal de procura. Cada entidade retornada como resultado da procura é associada à propriedade changeType.
A propriedade changeType do Objeto de Dados Entity é uma propriedade opcional definida somente em resposta a uma procura de entidades alteradas. A propriedade changeType descreve o tipo de mudança que ocorreu, que pode ser a inclusão de uma nova entidade, a modificação de uma entidade existente, bem como a exclusão ou renomeação de uma entidade.
Os valores válidos e constantes de sequência válidos da propriedade changeType são add (para CHANGETYPE_ADD), delete (para CHANGETYPE_DELETE), modify (para CHANGETYPE_MODIFY) e rename (para CHANGETYPE_RENAME).
Para entidades incluídas, modificadas e renomeadas, a entidade atual no repositório é retornada. Para entidades excluídas, somente o identificador de entidade, que consiste no nome externo e no nome exclusivo, é retornado. (No IBM® Tivoli Directory Server versão 6.1 e anterior, o UUID específico do repositório não é retornado como parte do identificador de entidade, enquanto no IBM Tivoli Directory Server versão 6.2 e superior, o identificador de entidade inclui o UUID específico do repositório, com o nome externo e o nome exclusivo.) O ponto de verificação de repositório é agnóstico de tipos de mudança e da base de procura. O ponto de verificação se aplica ao repositório todo.
Para IBM Tivoli Directory Server, assegure-se também de que a correção para Authorized Program Analysis Report (APAR) 1IO10107 esteja instalada.
Considere um cenário em que um aplicativo do gerenciador de membro virtual esteja configurado com três repositórios: IBM Tivoli Directory Server, Active Directory e um repositório de arquivo. Quando o aplicativo é sincronizado com o gerenciador de membro virtual, o ponto de verificação é recuperado e salvo. Esse ponto de verificação salvo é usado no ChangeControl durante o próximo intervalo de sincronização. O código de amostra a seguir recupera o ponto de verificação atual:
DataObject root = com.ibm.websphere.wim.util.SDOHelper.createRootDataObject();
com.ibm.websphere.wim.util.SDOHelper.createControlDataObject(root, WIM_NS_URI, DO_CHANGE_CONTROL);
return service.search(root);
Neste exemplo específico, as etapas no processo de manipulação de uma procura de entidades alteradas são explicadas aqui.
O aplicativo cliente do gerenciador de membro virtual envia um ChangeControl sem qualquer ponto de verificação durante a primeira procura de entidades alteradas. O gráfico de dados de entrada é mostrado aqui.
<?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" changeTypes="*"/>
</wim:Root>
</sdo:datagraph><?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"/>
</wim:Root>
</sdo:datagraph>
<?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>TDS_LDAP</wim:repositoryId>
<wim:repositoryCheckPoint>21</wim:repositoryCheckPoint>
</wim:checkPoint>
<wim:checkPoint>
<wim:repositoryId>AD_LDAP</wim:repositoryId>
<wim:repositoryCheckPoint>41</wim:repositoryCheckPoint>
</wim:checkPoint>
</wim:controls>
</wim:Root>
</sdo:datagraph>
Durante uma procura subsequente de entidades alteradas, esse ponto de verificação consolidado é novamente transmitido ao gerenciador de membro virtual e a interface do gerenciador de perfil é responsável por transmitir o ponto de verificação apropriado ao adaptador correspondente.
Para copiar o ponto de verificação do ChangeResponseControl anterior para o ChangeControl de entrada, inclua o seguinte código de amostra no código do aplicativo e substitua as variáveis pelos valores reais que você deseja usar:
/**
* Obter o ponto de verificação atual para os repositórios
* @return DataObject: DataObject com ChangeResponseControl contendo os pontos de verificação
* para os repositórios que suportam rastreamento de mudanças
*/
public DataObject searchGetCurrentCheckpoint() throws WIMException
{
DataObject root = com.ibm.websphere.wim.util.SDOHelper.createRootDataObject();
com.ibm.websphere.wim.util.SDOHelper.createControlDataObject(root, WIM_NS_URI, DO_CHANGE_CONTROL);
return service.search(root);
}
/**
* Procurar as entidades alteradas desde o ponto de verificação retornado por searchGetCurrentCheckpoint
* @param prevRoot: DataObject retornado de searchGetCurrentCheckpoint
* @return DataObject: DataObject com entidades alteradas e ChangeResponseControl
*/
public DataObject searchGetChangedEntities(final DataObject prevRoot) throws WIMException
{
DataObject root = com.ibm.websphere.wim.util.SDOHelper.createRootDataObject();
DataObject changeCtrl = com.ibm.websphere.wim.util.SDOHelper.createControlDataObject(root, null, DO_CHANGE_CONTROL);
changeCtrl.setString(SchemaConstants.PROP_SEARCH_EXPRESSION, "@xsi:type='PersonAccount'");
changeCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("uid");
changeCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("cn");
changeCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("sn");
changeCtrl.getList(PROP_CHANGETYPES).add(SchemaConstants.CHANGETYPE_ALL);
com.ibm.websphere.wim.util.SDOHelper.createChangeCtrlFromChangeRespCtrl(root, prevRoot);
return service.search(root);
}
/**
* Método para chamar searchGetCurrentCheckpoint e searchChangedEntities
*/
public void search() throws WIMException
{
/* Obter o ponto de verificação atual */
DataObject result = searchGetCurrentCheckpoint();
/* Incluir, modificar, renomear, excluir algumas entidades aqui */
/* Procurar as entidades alteradas desde o ponto de verificação retornado por searchGetCurrentCheckpoint */
result = searchGetChangedEntities(result);
}
No código anterior, o método search() chama primeiro o método searchGetCurrentChekpoint() para recuperar os pontos de verificação atuais. O resultado retornado pelo searchGetCurrentCheckpoint() é transmitido ao segundo método, searchGetChangedEntities(). Ele usa o método do utilitário SDOHelper.createChangeCtrlFromChangeRespCtrl() para obter um ChangeControl atualizado contendo o ponto de verificação salvo do ChangeResponseControl retornado pelo searchGetCurrentCheckpoint.
O gráfico de dados de entrada para uma procura subsequente contendo o ponto de verificação salvo é mostrado aqui:
<?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' and cn='tuser*'">
<wim:checkPoint>
<wim:repositoryId>TDS_LDAP</wim:repositoryId>
<wim:repositoryCheckPoint>21</wim:repositoryCheckPoint>
</wim:checkPoint>
<wim:checkPoint>
<wim:repositoryId>AD_LDAP</wim:repositoryId>
<wim:repositoryCheckPoint>41</wim:repositoryCheckPoint>
</wim:checkPoint>
<wim:changeTypes>add</wim:changeTypes>
</wim:controls>
</wim:Root>
</sdo:datagraph>
Se três novas entidades forem incluídas no IBM Tivoli Directory Server e duas novas entidades forem incluídas no Active Directory, o gráfico de dados de saída resultante será mostrado aqui:
<?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="cn=tuser1,o=tds" repositoryId="TDS_LDAP" uniqueId="13f1c1c8-ff43-433c-b0ca-02fb5a56b522"
uniqueName="cn=tuser1,o=tds"/>
<wim:changeType>add</wim:changeType>
</wim:entities>
<wim:entities xsi:type="wim:PersonAccount">
<wim:identifier externalName="cn=tuser3,o=tds" repositoryId="TDS_LDAP" uniqueId="25641e84-b17b-48ee-b9cb-d7eea2496005"
uniqueName="cn=tuser3,o=tds"/>
<wim:changeType>add</wim:changeType>
</wim:entities>
<wim:entities xsi:type="wim:PersonAccount">
<wim:identifier externalName="cn=tuser5,o=tds" repositoryId="TDS_LDAP" uniqueId="a3316b8d-f496-4a5b-93eb-ba59f47aa2ab"
uniqueName="cn=tuser5,o=tds"/>
<wim:changeType>add</wim:changeType>
</wim:entities>
<wim:entities xsi:type="wim:PersonAccount">
<wim:identifier externalName="CN=tuser4,DC=vmm-server11,DC=in,DC=ibm,DC=com"
repositoryId="AD_LDAP" uniqueId="855c13b14a2e5e448af0699d4b2aaf47" uniqueName="CN=tuser4,o=ad"/>
<wim:changeType>add</wim:changeType>
</wim:entities>
<wim:entities xsi:type="wim:PersonAccount">
<wim:identifier externalName="CN=tuser2,DC=vmm-server11,DC=in,DC=ibm,DC=com"
repositoryId="AD_LDAP" uniqueId="725199db56ac8342b7c6a08ae3cb93e3" uniqueName="CN=tuser2,o=ad"/>
<wim:changeType>add</wim:changeType>
</wim:entities>
<wim:controls xsi:type="wim:ChangeResponseControl">
<wim:checkPoint>
<wim:repositoryId>TDS_LDAP</wim:repositoryId>
<wim:repositoryCheckPoint>24</wim:repositoryCheckPoint>
</wim:checkPoint>
<wim:checkPoint>
<wim:repositoryId>AD_LDAP</wim:repositoryId>
<wim:repositoryCheckPoint>43</wim:repositoryCheckPoint>
</wim:checkPoint>
</wim:controls>
</wim:Root>
</sdo:datagraph
Os resultados de uma procura de entidades alteradas diferem entre o IBM Tivoli Directory Server e o Active Directory. Duas diferenças importantes são explicadas aqui.
A entidade renomeada é retornada com o changeType rename. Para identificar a entidade original, o aplicativo cliente do gerenciador de membro virtual deve ser associado entre o uniqueID (conforme obtido do atributo ibm-entryUUID) da entidade antiga e da nova.
A entidade renomeada é retornada com o changeType modify. O aplicativo cliente do gerenciador de membro virtual pode identificar uma operação renomear quando ele encontra uma operação modificar para um nome distinto (DN) que não existe em sua cópia. Entretanto, uma operação modificar é relatada mesmo para um novo DN que ainda não está na cópia do aplicativo. Uma operação modificar é relatada mesmo que uma entidade seja incluída e modificada no mesmo ciclo de sincronização. Portanto, o aplicativo cliente do gerenciador de membro virtual deve ser associado entre o ID exclusivo (conforme obtido do atributo objectGUID do Active Directory) da entidade antiga e da nova. Se nenhum uniqueID for encontrado, ele será uma inclusão, além de uma operação renomear em uma entidade existente.
A versão final da entidade alterada é relatada quantas vezes houver alterações na entidade no ciclo de sincronização, com o changeType modify. Por exemplo, se houver quatro modificações em uma entidade dentro do mesmo ciclo de sincronização, a versão final da entidade modificada será retornada quatro vezes como a entidade alterada com changeType modify. Uma exceção a esse caso é quando a entidade é excluída mais tarde dentro do mesmo ciclo de sincronização. Nesse caso, qualquer outra operação na entidade antes de sua exclusão é ignorada e não retornada para o aplicativo do gerenciador de membro virtual.
O cache de atributo mantido pelo gerenciador de membro virtual é atualizado cada vez que você procura entidades alteradas, mesmo que uma entidade seja modificada e depois excluída no mesmo ciclo de sincronização.
Somente a atualização final na entidade é retornada. Por exemplo, se uma entidade for incluída e excluída no mesmo ciclo de sincronização, o cliente do gerenciador de membro virtual receberá um changeType delete para uma entidade que não está presente em sua cópia. Nesse caso, o aplicativo do gerenciador de membro virtual deverá incluir a lógica para ignorar as notificações de mudanças.
O cache de atributo mantido pelo gerenciador de membro virtual é atualizado cada vez que você procura entidades alteradas. Entretanto, o cache de atributo não será atualizado se uma entidade for alterada e, em seguida, excluída do repositório no mesmo ciclo de sincronização.
Para obter o código de amostra de ponta a ponta, consulte os tópicos Código de amostra para procurar entidades alteradas e Código de amostra para procurar entidades alteradas e excluídas.