Código de Amostra para Estender o Esquema no Repositório de Arquivo

Use o código de amostra de ponta a ponta e os gráficos de dados para estender o esquema incluindo uma nova propriedade em um tipo de entidade existente no repositório de arquivo.

As etapas a seguir são cobertas neste cenário de amostra:

  1. Inclua uma nova propriedade estendida em um tipo de entidade interno no repositório de arquivo.
  2. Crie uma entidade com valor para propriedade estendida.
  3. Procure uma entidade com o valor da propriedade estendida.

Pré-requisito

Assegure-se de ter lido as informações e concluído as etapas descritas no tópico, Pré-requisitos de Programação, incluindo a seção, Estendendo o Esquema de Propriedade, que tem informações sobre os objetos de dados propertySchema e extensionPropertySchema e lista a sintaxe válida para os tipos de dados de propriedade.

Código de Amostra

Inclua o seguinte código de amostra de ponta a ponta no código do aplicativo e substitua as variáveis pelos valores reais que você deseja usar.

/**
 *  Esta classe é usada para demonstrar o uso da API do VMM para estender o esquema.
 *  Este exemplo inclui uma nova propriedade em um tipo de entidade existente, no repositório de arquivo.
 */
public class ExtendSchemaSample extends BaseApp
{
    /**
     *  Uma constante de sequência para o novo nome de propriedade a ser incluído
     */
    private static final String newPropName = "postOfficeBox";
    
    /**
     *  Ponto de entrada do aplicativo
     *  @param args
     *  @throws WIMException 
     */
    public static void main(String[] args) throws WIMException
    {
        System.out.println("Iniciando .. ");
        // localizar serviço
        service = locateService(null);
        System.out.println("Located service. Iniciando extensão de esquema ... ");
        // Incluir uma nova propriedade (tempo de execução)
        runTimeAddNewProperty();
    }

    /**
     *  Este método mostra o uso da API de extensão de esquema
     *  Este exemplo faz o seguinte:
     *  Inclui uma nova propriedade, postOfficeBox, em um tipo de entidade existente
     *  Cria uma entidade com o valor 4-23, para a propriedade estendida postOfficeBox
     *  Procura uma entidade com o valor da propriedade estendida
     */
    private static void runTimeAddNewProperty()
    {
        // Incluir a propriedade "postOfficeBox" em "PersonAccount"
        addNewProperty();
        System.out.println("A propriedade 'postOfficeBox' é incluída em 'PersonAccount'.");
        // Criar uma pessoa com uma propriedade "postOfficeBox"
        System.out.println("\nCLIENT: Criando Pessoa B com uma propriedade definida chamada 'postOfficeBox'.");
        createPerson();
        // Procurar na propriedade "postOfficeBox = 4-23" 
        searchPerson();
    }
	
    /**
     *  Este método cria uma pessoa com os seguintes atributos
     *    uid: personb
     *    cn: Pessoa B
     *    sn: PersonBLastName
     *    postOfficeBox: 4-23
     */
    private static void createPerson()
    {
        //Criar Pessoa B ...
        try 
        {
            // Obter um objeto de dados raiz. O restante da árvore de objetos seria integrado nele
            DataObject root = SDOHelper.createRootDataObject();
            // Criar um objeto de dados do tipo de entidade "PersonAccount" sob a raiz
            // O objeto está no namespace WIM padrão
            DataObject person = root.createDataObject(SchemaConstants.DO_ENTITIES, Service.WIM_NS_URI, 
                    SchemaConstants.DO_PERSON_ACCOUNT);
            // Configurar os valores dos atributos obrigatórios, uid, cn, sn
            // Configurar também o valor para o atributo "postOfficeBox" recém-incluído
            person.set("uid", "personb");
            person.set("cn", "Pessoa B");
            person.set("sn", "PersonBLastName");
            person.set(newPropName, "4-23");
            System.out.println("Gráfico de dados de entrada para criar pessoa  -> " + printDO(root));
            // Chamar a API de criação de esquema para criar a entidade de conta da pessoa definida anteriormente
            root = service.create(root);
            System.out.println("Gráfico de dados de saída para criar pessoa  -> " + printDO(root);
            System.out.println("CLIENT: Pessoa B foi criada\n\n");
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
    
    /**
     *  Este método inclui a propriedade "postOfficeBox" no tipo de entidade "PersonAccount".
     */
    @SuppressWarnings("unchecked")
    private static void addNewProperty() 
    {
        try
        {
            System.out.println("\nCLIENT: Criando novo tipo de propriedade postOfficeBox 
                    e incluindo-o no tipo de entidade existente PersonAccount");
            // Obter um objeto de dados raiz. O restante da árvore de objetos seria integrado nele
            DataObject root = SDOHelper.createRootDataObject();
            // Criar um novo objeto "esquema" sob a raiz. 
            // Este objeto conterá os detalhes das modificações de esquema que precisam ser feitas
            DataObject dynaSchemaDO = root.createDataObject(SchemaConstants.DO_SCHEMA);
            /***************************************/
            /** Código para definir a nova propriedade   **/
            /***************************************/
            // Criar um objeto de dados de esquema de propriedade sob o objeto de esquema criado anteriormente
            DataObject propSchemaDO = dynaSchemaDO.createDataObject(SchemaConstants.DO_PROPERTY_SCHEMA);
            // Configurar os valores para a propriedade, por exemplo, URI do namespace, prefixo de namespace, nome da propriedade
            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);
            // Especificar se a propriedade tem diversos valores
            // Se ela tiver diversos valores, seu tipo deverá ser Lista
            propSchemaDO.setBoolean(SchemaConstants.PROP_MULTI_VALUED, false);
            // Especificar o tipo de dado da propriedade
            // Tipos de dados podem ser simples, como booleano, inteiro, flutuante, duplo, Sequência 
            // ou especiais, como Endereço, Pessoa, Grupo etc.
            propSchemaDO.set(SchemaConstants.PROP_DATA_TYPE, SchemaConstants.DATA_TYPE_STRING);
            // Obter a lista de tipos de entidade nos quais essa propriedade precisa ser incluída
            List applicableEntityTypes = propSchemaDO.getList(SchemaConstants.PROP_APPLICABLE_ENTITY_TYPE_NAMES);
            // Incluir os nomes de tipo de entidade aplicáveis na lista buscada anteriormente
            applicableEntityTypes.add(Service.DO_PERSON_ACCOUNT);
            /***************************************************/
            /** A nova definição de propriedade é executada   **/
            /** Agora a API createSchema precisa ser chamada  **/
            /***************************************************/
            System.out.println("Gráfico de dados de entrada para criar propriedade -> " + printDO(root));
            // Chamar a API de criação de esquema para incluir de fato a definição de propriedade no modelo de esquema
            root = service.createSchema(root);
            System.out.println("Gráfico de dados de saída para criar propriedade -> " + printDO(root));
            System.out.println("\nCLIENT: Novo tipo de propriedade é criado.");
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
    
    /**
     *  Procurar pessoa com postOfficeBox = 4-23.
     */
    @SuppressWarnings("unchecked")
    private static void searchPerson()
    {
        try
        {
            //Procurar Pessoa B
            // Criar um objeto de dados de controle de procura
            DataObject root = SDOHelper.createRootDataObject();
            DataObject searchCtrl = SDOHelper.createControlDataObject(root, null, 
                    SchemaConstants.DO_SEARCH_CONTROL);
            // Especificar as propriedades que precisam ser buscadas para todas as entradas correspondentes
            searchCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("uid");
            searchCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("sn");
            searchCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("cn");
            // Especificar os critérios de correspondência como a expressão de procura
            // A expressão aqui especifica o tipo de entidade como "PersonAccount" 
            // e o valor de "postOfficeBox" como '4-23'
            // Executar a procura com essa expressão retornará todos os objetos "PersonAccount" 
                    que tenham um valor de "postOfficeBox" como '4-23'
            // As propriedades 'uid', 'sn' e 'cn' seriam buscadas para todos os objetos
            searchCtrl.setString(SchemaConstants.PROP_SEARCH_EXPRESSION, "@xsi:type='" 
                    + Service.DO_PERSON_ACCOUNT + "' and " + newPropName + "='4-23'");
            System.out.println("Pesquisando " + searchCtrl.getString(SchemaConstants.PROP_SEARCH_EXPRESSION));
            System.out.println("Gráfico de dados de entrada para procura -> " + printDO(root));
            // Chamar a API de procura com o controle de procura
            root = service.search(root);
            System.out.println("Gráfico de dados de saída para procura -> " + printDO(root));
            // Iterar sobre os resultados da procura
            // Os resultados estão contidos como uma Lista na propriedade "entities" 
            // do objeto de dados retornado pela API de Procura
            // Uma constante de conveniência "DO_ENTITIES" é definida em SchemaConstants para referir-se a essa propriedade
            printIdentifiers(root);
        } 
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}

Gráficos de Dados de Entrada e Saída

Os gráficos de dados de entrada e os gráficos de dados de saída resultantes para cada etapa deste exemplo são fornecidos a seguir.

Gráfico de dados de entrada para criar um tipo de propriedade postOfficeBox e incluí-lo no tipo de entidade existente
<?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>
Gráfico de dados de saída depois de criar um tipo de propriedade postOfficeBox e incluí-lo no tipo de entidade existente
<?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>
Gráfico de dados de entrada para criar uma entidade, Pessoa B, com uma propriedade definida, 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>Pessoa B</wim:cn>
      <wim:sn>PersonBLastName</wim:sn>
      <yourprefix:postOfficeBox>4-23</yourprefix:postOfficeBox>
    </wim:entities>
  </wim:Root>
</sdo:datagraph>
Gráfico de dados de saída depois de criar entidade com a propriedade estendida:
<?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>
Gráfico de dados de entrada para procurar entidade com o valor de propriedade estendida, 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>
Gráfico de dados de saída depois de procurar entidade com o valor de propriedade estendida, postOfficeBox='4-23' (a entidade Pessoa B encontrada):
<?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>Pessoa B</wim:cn>
      <wim:sn>PersonBLastName</wim:sn>
    </wim:entities>
  </wim:Root>
</sdo:datagraph>


Termos de uso | Feedback